NSLocale currentLocale всегда возвращает "en_US", а не текущий язык пользователя - PullRequest
78 голосов
/ 06 октября 2009

Я нахожусь в процессе интернационализации приложения для 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);

Ответы [ 9 ]

55 голосов
/ 06 октября 2009

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

35 голосов
/ 29 марта 2010

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

15 голосов
/ 07 марта 2013

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

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

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

6 голосов
/ 22 мая 2017

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

4 голосов
/ 18 ноября 2014

для меня оба

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

и

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

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

3 голосов
/ 13 марта 2014

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

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

    NSLocale *locale = [NSLocale localeWithLocaleIdentifier:[[NSLocale preferredLanguages] objectAtIndex:0] ];
    [self.monthNameFormatter setLocale:locale];
    [self.monthNameFormatter setDateFormat:@"MMMM"];
    [self.monthNameFormatter stringFromDate:myDate];
2 голосов
/ 11 января 2011

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

1 голос
/ 05 мая 2014

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

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

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

0 голосов
/ 03 марта 2015

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...