NSLocale currentLocale sempre retorna “en_US” não o idioma atual do usuário

Estou nos processos de internacionalização de um aplicativo para iPhone – preciso fazer alterações programáticas em determinadas visualizações com base na localidade atual do usuário. Estou enlouquecendo porque não importa qual seja a preferência de idioma no simulador do iPhone ou no hardware real, o locale sempre é avaliado como “en_US”:

 NSString *locale = [[NSLocale currentLocale] localeIdentifier]; NSLog(@"current locale: %@", locale); 

O mais louco é que o restante do aplicativo se comporta como esperado. As cadeias corretas são selecionadas do arquivo Localization.strings e usadas na interface, e os arquivos .xib corretos para a localidade selecionada são usados.

Eu também tentei o seguinte, sem sucesso e com o mesmo resultado:

 NSString *locale = [[NSLocale autoupdatingCurrentLocale] localeIdentifier]; NSLog(@"current locale: %@", locale); 

Há algo simples que estou perdendo? Uma preferência ou uma importação talvez?

O que eu costumava fazer:

Como a resposta de Darren sugere, a preferência que estou procurando não está no NSLocale , mas sim aqui:

 NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; NSArray* languages = [userDefaults objectForKey:@"AppleLanguages"]; NSString* preferredLanguage = [languages objectAtIndex:0]; NSLog(@"preferredLanguage: %@", preferredLang); 

A resposta de Peter parece ser uma solução melhor:

 NSArray* preferredLanguages = [NSLocale preferredLanguages]; NSLog(@"preferredLanguages: %@", preferredLanguages); 

Em vez de consultar os padrões diretamente usando uma chave não documentada, peça à class NSLocale a matriz de idiomas preferidos .

[NSLocale currentLocale] é baseado nas configurações de formato de região do dispositivo, não no idioma. Se a região estiver definida como Estados Unidos, você receberá en_US, independentemente do idioma que estiver usando.

Para obter o idioma atual do dispositivo, use isto:

 NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0]; 

Como descrito aqui: Como obter a linguagem atual do dispositivo no iOS?

para mim, ambos

 NSString *localeString = [[NSLocale currentLocale] localeIdentifier]; 

e

 NSArray *array = [NSLocale preferredLanguages]; self.label.text = array[0]; 

rende o mesmo resultado quando você está em um simulador.

Para nós, o problema foi que nós substituímos o idioma do aplicativo e a região do aplicativo em nosso esquema de desenvolvimento. Certifique-se de que o Idioma do Aplicativo esteja definido como Idioma do Sistema nas opções de esquema (Editar Esquema -> Opções).

Descobri que se eu deixar “en_US” fora, mas tiver uma localização “en” que seja uma cópia de “en_US”, o simulador inicia automaticamente respeitando as configurações de idioma, mas assim que “en_US” é uma opção, ele sempre escolhe independentemente das configurações.

Ocorreu um problema em que os nomes de mês de formatação foram lançados em inglês em um dispositivo definido para o idioma francês.

Minha solução foi usar isso:

  NSLocale *locale = [NSLocale localeWithLocaleIdentifier:[[NSLocale preferredLanguages] objectAtIndex:0] ]; [self.monthNameFormatter setLocale:locale]; [self.monthNameFormatter setDateFormat:@"MMMM"]; [self.monthNameFormatter stringFromDate:myDate]; 

A pergunta é muito antiga, mas esse código pode ajudar muitos:

O main.m deve ficar assim:

  NSString *localecode=[[NSLocale currentLocale] localeIdentifier]; localecode=[localecode substringToIndex:2]; //en_GB -> en NSArray *arr = [NSLocale preferredLanguages]; NSMutableArray * mutable = [arr mutableCopy]; NSString *prefered = [mutable firstObject]; if(![localecode isEqualToString:prefered]){ if(![prefered isEqualToString:@"es"] && ![prefered isEqualToString:@"en"] && ![prefered isEqualToString:@"pt"]){ int index = [mutable indexOfObject:@"en"]; [mutable replaceObjectAtIndex:0 withObject:@"en"]; [mutable replaceObjectAtIndex:index withObject:prefered]; [[NSUserDefaults standardUserDefaults] setObject:mutable forKey:@"AppleLanguages"]; } else{ int index = [mutable indexOfObject:localecode]; [mutable replaceObjectAtIndex:0 withObject:localecode]; [mutable replaceObjectAtIndex:index withObject:prefered]; [[NSUserDefaults standardUserDefaults] setObject:mutable forKey:@"AppleLanguages"]; } } return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 

O que fazer isso? Se o idioma atual do dispositivo for espanhol, inglês ou português, use o aplicativo que usa as strings localizadas, por outro lado, se o idioma atual não for um desses e não for suportado pelo aplicativo, configure-o como inglês.

Ele mostra o local correto quando em um iPad real. No entanto, o simulador tem seu próprio iOS, que por padrão está definido como en-US. Vá para as preferências do iOS do simulador e mude o idioma e a região para o que você deseja.

Isso faz o truque.