it-swarm.com.ru

NSLocale currentLocale всегда возвращает "en_US", а не текущий язык пользователя

Я нахожусь в процессе интернационализации приложения для iPhone - мне нужно внести программные изменения в определенные представления в зависимости от текущей локали пользователя. Я схожу с ума, потому что независимо от языкового предпочтения симулятора iPhone или реального оборудования, locale всегда оценивается как «en_US»:

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

Сумасшедшая вещь состоит в том, что остальная часть приложения ведет себя как ожидалось. Правильные строки выбираются из файла Localization.strings и используются в интерфейсе, а правильные файлы .xib для выбранной локали используются.

Я также попробовал следующее, но безрезультатно и с тем же результатом:

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

Есть что-то простое, что мне не хватает? Предпочтение или импорт возможно?

Что я делал раньше:

Как показывает ответ Даррена, предпочтение, которое я ищу, не в NSLocale, а здесь:

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

Ответ Петра кажется лучшим решением:

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

Вместо того, чтобы запрашивать значения по умолчанию напрямую, используя недокументированный ключ, спросите NSLocale class для массива предпочитаемых языков .

35
Peter Hosey

[NSLocale currentLocale] основан на настройках формата региона устройства, а не на языке. Если для региона задано значение United States, вы получите en_US независимо от того, какой язык вы используете.

55
Darren

Чтобы получить текущий язык устройства, используйте вместо этого:

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

Как описано здесь: Получить текущий язык устройства в iOS?

13
sust86

Для нас проблема заключалась в том, что мы переопределяли язык приложения и область приложения в нашей схеме разработки. Убедитесь, что в параметрах схемы для параметра «Язык приложения» задано значение «Язык системы» («Изменить схему» -> «Параметры»).

6
Simon Bengtsson

для меня оба

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

а также

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

дать тот же результат, когда вы находитесь в симуляторе.

4
AlexW

У меня была проблема, когда форматирование названий месяцев выходило на английском языке на устройстве, настроенном на французский язык. 

Моим решением было использовать это:

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

я обнаружил, что если я оставляю «en_US», но имею локализацию «en», которая является копией «en_US», симулятор автоматически начинает соблюдать языковые настройки, но как только «en_US» является опцией, он всегда выбирает его независимо от того, из настроек.

2
Pants

Вопрос слишком старый, но этот код может помочь многим:

Main.m должен выглядеть так:

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

Что это делать? Если текущий язык устройства использует испанский, английский или португальский, приложение использует локализованные строки, с другой стороны, если текущий язык не является одним из них и не поддерживается приложением, устанавливается английский.

1
cdiazmo

Он показывает правильную локаль на реальном iPad . Однако симулятор имеет собственную iOS, которая по умолчанию установлена ​​в en-US . Перейдите в настройки iOS симулятора и переключите язык и регион на тот, который вы хотите.

Это делает трюк.

0
Ronald Hofmann