Перевести языковой код с помощью Xcode 6.1 с помощью NSLocale

С момента последнего обновления я не могу перевести языковой код (en, fr и т. Д.) В их соответствующие имена (английский, французский и т. Д.).

Он работает на реальном устройстве, но не в эмуляторе. Он работал с использованием предыдущих версий Xcode. Я знаю, что в примечаниях к выпуску написано, что [NSLocale currentLocale] может возвращать en_US в некоторых ситуациях, но это не объясняет, почему они больше не "переведены". Я использую этот код:

NSString* lang = @"en";
NSLog(@"%@",
    [[NSLocale currentLocale]
        displayNameForKey:NSLocaleIdentifier
        value:lang]
);

который отображает (null) вместо English.

Проблема в том, что мое приложение в некоторых местах вылетает из-за этого, поэтому я хотел бы знать, есть ли обходной путь.

Странно то, что следующий пример, приведенный Apple, действительно хорошо работает.

NSLocale *frLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"];
NSString *displayNameString = [frLocale displayNameForKey:NSLocaleIdentifier value:@"fr_FR"];
NSLog(@"displayNameString fr_FR: %@", displayNameString);
displayNameString = [frLocale displayNameForKey:NSLocaleIdentifier value:@"en_US"];
NSLog(@"displayNameString en_US: %@", displayNameString);

person Julien Fouilhé    schedule 26.10.2014    source источник
comment
возможный дубликат NSLocale currentLocale всегда возвращает en_US, а не текущий язык пользователя   -  person Zorayr    schedule 06.11.2014


Ответы (2)


Из примечания к выпуску Xcode

В некоторых ситуациях [NSLocale currentLocale] может возвращать en_US вместо выбранной локали в симуляторе iOS 8.1. (18512161)

+ (NSLocale *)autoupdatingCurrentLocale NS_AVAILABLE(10_5, 2_0); // generally you should use this method

+ (NSLocale *)currentLocale;    // an object representing the user's current locale

Обходной путь - использовать первый. Использование objectForKey в экземпляре currentLocal работает.

NSString* lang = @"en_US";
NSLocale *currentLocal = [NSLocale autoupdatingCurrentLocale];
//get the localeIdentifier and create a new NSLocale.
id localIdentifier = [currentLocal objectForKey:NSLocaleIdentifier];
NSLocale *theLocal = [NSLocale localeWithLocaleIdentifier:localIdentifier];
NSLog(@"%@",[theLocal displayNameForKey:NSLocaleIdentifier
                                                  value:lang]
      );
person gabbler    schedule 29.10.2014
comment
Хм, мне кажется, что то, что вы делаете, похоже на код в конце моего вопроса, но я принимаю его, потому что он решает мою проблему. Спасибо! - person Julien Fouilhé; 31.10.2014

Это известная проблема Apple только для симулятора iOS 8.1, которая не воспроизводится на устройствах 8.1. См. Ниже описание проблемы из примечаний к выпуску Xcode 6.1:

Настройки локализации и клавиатуры (включая сторонние клавиатуры) неправильно соблюдаются Safari, Maps и приложениями для разработчиков в симуляторе iOS 8.1. [NSLocale currentLocale] возвращает en_US, и доступны только английская клавиатура и клавиатура Emoji. (18418630, 18512161).

См. Примечания к выпуску Xcode 6.1 для получения дополнительных сведений.

person Zorayr    schedule 05.11.2014