84 votes

NSLocale currentLocale renvoie toujours "en_US" et non la langue actuelle de l'utilisateur.

Je suis en train d'internationaliser une application iPhone - je dois modifier par programme certaines vues en fonction de la locale actuelle de l'utilisateur. Je deviens fou parce que peu importe la préférence linguistique du simulateur iPhone ou du matériel réel, locale donne toujours la valeur "en_US" :

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

Ce qui est fou, c'est que le reste de l'application se comporte comme prévu. Les chaînes correctes sont sélectionnées dans le fichier Localization.strings et utilisées dans l'interface, et les fichiers .xib corrects pour la locale sélectionnée sont utilisés.

J'ai également essayé ce qui suit, sans succès et avec le même résultat :

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

Y a-t-il quelque chose de simple qui m'échappe ? Une préférence ou une importation peut-être ?

Ce que je faisais avant :

Comme le suggère la réponse de Darren, la préférence que je recherche n'est pas dans la section NSLocale mais c'est plutôt ici :

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

La réponse de Peter semble être une meilleure solution :

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

59voto

Darren Points 13973

[NSLocale currentLocale] est basé sur les paramètres du format régional de l'appareil, et non sur la langue. Si la région est définie sur les États-Unis, vous obtiendrez en_US, quelle que soit la langue utilisée.

0 votes

Merci Darren, cela m'a permis de démarrer, j'ai également trouvé comment obtenir le paramètre de la langue actuelle, ce que j'essayais vraiment de faire.

2 votes

Bonjour Prairiedogg, comment avez-vous obtenu le paramètre de la langue actuelle ? J'ai le même problème aussi tous les retours renvoient la valeur EN pour la langue.

0 votes

@ZaldzBugz : quelque chose comme : NSLocale* locale = [NSLocale currentLocale] ; NSString* lang = [locale displayNameForKey:NSLocaleIdentifier value :[[NSLocale preferredLanguages] objectAtIndex:0]] ;

36voto

Peter Hosey Points 66275

Au lieu d'interroger directement les valeurs par défaut en utilisant une clé non documentée, demander le NSLocale classe pour le tableau des langues préférées .

0 votes

@PeterHosey J'ai également un problème similaire concernant la langue actuelle et j'ai tout essayé, mais rien ne fonctionne. C'est triste... Pourriez-vous jeter un coup d'oeil à ceci, stackoverflow.com/questions/26572115/ ? Merci !

0 votes

@s1u Il y a un bug dans Xcode 6.1. Vérifiez cette réponse : stackoverflow.com/a/26641497/1085556

0 votes

@s1u : Deux choses : (1) Il peut y avoir plusieurs langues préférées ; il n'y a pas une seule "langue courante", et (2) en ce qui concerne votre réponse (supprimée), elle renvoie la langue dominante de la localité courante (c'est-à-dire de la région), no les langues préférées de l'utilisateur.

18voto

sust86 Points 807

Pour obtenir la langue actuelle de l'appareil, utilisez plutôt ceci :

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

Comme décrit ici : Obtenir la langue actuelle de l'appareil dans iOS ?

3voto

Ben Clayton Points 16793

J'ai eu un problème où le formatage des noms de mois apparaissait en anglais sur un appareil réglé sur la langue française.

Ma solution a été d'utiliser ceci :

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

0 votes

J'ai constaté que [NSLocale currentLocale] traduisait correctement les noms de mois en français dans iOS10 mais ne le faisait pas dans iOS11. En utilisant : NSLocale *locale = [NSLocale localeWithLocaleIdentifier :[[NSLocale preferredLanguages] objectAtIndex:0] ] ; fixe le problème. Merci Ben +1

2voto

Pants Points 21

J'ai découvert que si je ne laisse pas "en_US", mais que j'ai une localisation "en" qui est une copie de "en_US", le simulateur commence automatiquement à respecter les paramètres de langue, mais dès que "en_US" est une option, il la choisit toujours, quels que soient les paramètres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X