NSLocale загруженного языка в приложении - PullRequest
6 голосов
/ 08 января 2012

В моем интерфейсе я показываю отображаемое имя локали с этим:

[[NSLocale currentLocale] displayNameForKey: NSLocaleIdentifier value: identifier]

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

Ответы [ 2 ]

3 голосов
/ 14 июня 2012

Я не уверен, что это именно то, что вам нужно ... Но это отличный способ узнать, на каком языке / локализации работает ваше приложение:

[[NSBundle mainBundle] preferredLocalizations]

Если ваше приложение поддерживает английский и французский языки, оно возвратит массив обоих в предпочтительном порядке. При тестировании, то, что в 0, кажется, XIB, который загружен и работает.

3 голосов
/ 09 января 2012

Вы должны создать файл plist, который вы локализуете, в вашем хранилище plist правильный идентификатор локали для соответствующей локализации, когда вы используете свой фрагмент кода, вы должны загрузить локаль из этого локализованного файла plist и использовать ее для полученияотображаемое имя.

Таким образом, ваша локаль всегда будет соответствовать языку интерфейса на экране.Мне нужно было сделать это для некоторых дат, которые я хотел отформатировать, и не полагаться на систему, так как формат календаря мог быть установлен на другом языке для системы ...

надеюсь, что это поможет ...

enter image description here

- (NSDictionary*)getLocalizedCalendarStrings{
    NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"calendar" ofType:@"plist"]; // will return the path of the plist in the right language-specific .lproj directory)
    NSDictionary* calendar = [NSDictionary dictionaryWithContentsOfFile:plistPath];
    return calendar;    
}

И используйте это так:

NSDictionary * calendar = [self getLocalizedCalendarStrings];
NSString * localeIdentifier = [calendar objectForKey:@"locale_identifier"];
[[NSLocale currentLocale] displayNameForKey: NSLocaleIdentifier value: localeIdentifier]

Чтобы избежать риска того, что эти строки локали будут введены с ошибкой и т. Д., Или если вы хотителучшее решение, ориентированное на код, вы, конечно, могли бы использовать свойство с именем default_language в качестве BOOL в plist и установить его в YES только для английского, в вашем коде просто проверьте это значение и, если оно НЕТ, то получите локаль устройства,если это ДА, тогда вы знаете, что приложение либо на английском, потому что это настройка устройства, либо на английском, потому что оно не поддерживает текущую локаль устройства и поэтому по умолчанию переключилось на английский ...должно быть «default_language» ДА, жестко закодировать локаль в en_US или en_UK, если вы патриотичный британец ...

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

@implementation NSLocale (AppLocale)

+(NSString*)applicationCurrentLocale{
    NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"currentLocale" ofType:@"plist"];
    NSDictionary* currentLocaleData = [NSDictionary dictionaryWithContentsOfFile:plistPath];

    if([[currentLocaleData objectForKey:@"english_default"] boolValue] == YES){
        return @"en_US";
    }else{
        NSString * deviceLocaleIdentifier = [[NSLocale currentLocale] localeIdentifier];
        return [[NSLocale currentLocale] displayNameForKey:NSLocaleIdentifier value:deviceLocaleIdentifier];
    }
}

@end
...