web-dev-qa-db-fra.com

NSLocale currentLocale renvoie toujours "en_US", pas la langue actuelle de l'utilisateur

Je suis en train d'internationaliser une application iPhone - je dois apporter des modifications programmatiques à certaines vues en fonction des paramètres régionaux actuels de l'utilisateur. Je deviens fou parce que, quelle que soit la préférence de langue sur le simulateur iPhone ou le matériel réel, locale indique toujours "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 les paramètres régionaux sélectionnés sont utilisés.

J'ai également essayé ce qui suit, en vain 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 me manque? Une préférence ou une importation peut-être?

Ce que je faisais auparavant:

Comme le suggère la réponse de Darren, la préférence que je recherche ne figure pas dans NSLocale, mais 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);
77
Prairiedogg

Au lieu d'interroger directement les valeurs par défaut à l'aide d'une clé non documentée, demande à NSLocale class le tableau des langues préférées .

35
Peter Hosey

[NSLocale currentLocale] est basé sur les paramètres de format de région du périphérique, pas sur la langue. Si la région est définie sur États-Unis, vous obtiendrez en_US quelle que soit la langue utilisée.

55
Darren

Pour obtenir la langue actuelle du périphérique, utilisez plutôt ceci:

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

Comme décrit ici: Obtenir la langue actuelle du périphérique sous iOS?

13
sust86

Pour nous, le problème était que nous avions outrepassé la langue et la région d’application dans notre schéma de développement. Assurez-vous que Langue d'application est défini sur Langue système dans les options de la structure (Modifier la structure -> Options).

6
Simon Bengtsson

pour moi les deux

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

et

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

donner le même résultat lorsque vous êtes dans un simulateur.

4
AlexW

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

Ma solution était d'utiliser ceci:

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

j'ai trouvé que si je laisse "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 le sélectionne quand même. des paramètres.

2
Pants

La question est trop ancienne, mais ce code peut aider beaucoup:

Le main.m devrait ressembler à ceci:

    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]));

Qu'est-ce que cela Si la langue actuelle de l'appareil est l'espagnol, l'anglais ou le portugais, l'application utilise les chaînes localisées. Par contre, si la langue actuelle n'est pas l'une de celles-ci et qu'elle n'est pas prise en charge par l'application, elle est définie sur l'anglais.

1
cdiazmo

Il affiche les paramètres régionaux corrects sur un iPad réel . Cependant, le simulateur possède son propre iOS, qui est défini par défaut sur en-US . Accédez aux préférences iOS du simulateur et basculez langue et région sur le celui que vous voulez.

Ça fait l'affaire.

0
Ronald Hofmann