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

Ответ 2

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

Ответ 4

для меня, оба

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

и

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

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

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

Это трюк.