NSLocale currentLocale завжди повертає “en_US”, а не поточну мову користувача


82

Я перебуваю в процесі інтернаціоналізації програми для 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);

Відповіді:


36

Замість того, щоб запитувати за замовчуванням безпосередньо, використовуючи недокументований ключ, попросіть клас NSLocale масив бажаних мов .


@PeterHosey Я також маю подібну проблему щодо поточної мови і пробував все, але жодна з них не працювала. Так сумно ... Чи не могли б ви поглянути на це, stackoverflow.com/questions/26572115/… ? Дякую!
S1U

@ s1u У Xcode 6.1 є помилка. Перевірте цей відповідь: stackoverflow.com/a/26641497/1085556
Барт ван Куїк

@ s1u: Кілька речей: (1) Можливі декілька бажаних мов; немає єдиної “поточної мови” та (2) щодо вашої (видаленої) відповіді, яка повертає домінуючу мову поточної мови (вона ж регіон), а не бажані мови користувача.
Пітер Хоузі,

2
AppleLanguagesКлюч не задокументовані, це єдиний документований спосіб отримати бажані мови користувача на системах до OS X 10.5 (який, в ці дні дуже рідко, але все ж, це буде документально ).
dreamlax

58

[NSLocale currentLocale]базується на налаштуваннях регіонального формату пристрою, а не на мові. Якщо для регіону встановлено значення США, ви отримаєте en_US незалежно від того, якою мовою ви користуєтесь.


Дякую, Даррен, що мене почало, я також придумав, як отримати поточні налаштування мови, що я справді намагався зробити.
prairiedogg

2
Привіт, Prairiedogg, як ти отримав поточну настройку мови? у мене така ж проблема ... все повертає значення EN для мови.
Zaldy

@ZaldzBugz: щось на зразок: NSLocale * locale = [NSLocale currentLocale]; NSString * lang = [локаль displayNameForKey: Значення NSLocaleIdentifier: [[NSLocale preferLanguages] objectAtIndex: 0]];
powerj1984

3
це не так у iOS 8. iOS 8 поверне "de_US", якщо ваша мова - німецька, а регіон - США. що і має робити.
одіт

Чи автоматично оновлюється регіон, коли, скажімо, користувач їде до Австралії?
Нагендра Рао,


9

Для нас проблема полягала в тому, що ми замінювали мову програми та область застосування в нашій схемі розробників. Переконайтеся, що для Мова програми встановлено значення Мова системи в параметрах схеми (Редагувати схему -> Параметри).


Дякуємо Саймону, що вказав на цей аспект ... Для тестування я встановив його на місцеву мову, а потім забув змінити.
Ameer

Це все! Не можу повірити, що це заплутало налаштування Xcode.
Педро,

Це врятувало мій бекон! Дякую.
Кірбі Тодд

4

для мене обох

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

і

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

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


2
Справді, у моєму випадку на iOS 8 / Xcode 6 завжди en_US
Адріан

3

У мене виникла проблема з форматуванням назв місяців англійською мовою на пристрої, встановленому на французьку мову.

Моє рішення було використовувати це:

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

Я виявив, що [NSLocale currentLocale] правильно перекладав назви місяців французькою мовою в iOS10, але не в iOS11. Використовуючи: NSLocale * locale = [NSLocale localeWithLocaleIdentifier: [[NSLocale предпочтительные языки] objectAtIndex: 0]]; вирішено проблему. Спасибі Бен +1
пташиний

2

я виявив, що якщо я залишаю "en_US", але маю локалізацію "en", яка є копією "en_US", симулятор автоматично починає дотримуватися мовних налаштувань, але як тільки "en_US" є опцією, він завжди вибирає її незалежно налаштувань.


1

Запитання застаріле, але цей код може допомогти багатьом:

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

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

Це робить фокус.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.