Преведете езиков код с 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, Карти и приложенията за разработчици в iOS 8.1 Simulator. [NSLocale currentLocale] връща en_US и са налични само клавиатурите на английски и Emoji. (18418630, 18512161).

Вижте Бележки по версията на Xcode 6.1 за повече подробности.

person Zorayr    schedule 05.11.2014