Получить текущий язык устройства в iOS? - PullRequest
413 голосов
/ 12 октября 2010

Я хотел бы показать текущий язык, который использует пользовательский интерфейс устройства. Какой код я бы использовал?

Я хочу это как NSString в полностью прописанном формате. (Не @ "en_US")

РЕДАКТИРОВАТЬ: Для тех, кто проезжает мимо, здесь есть масса полезных комментариев, поскольку ответ эволюционировал с новыми выпусками iOS.

Ответы [ 29 ]

1 голос
/ 10 апреля 2018

Для Swift 3.0 ниже код может быть использован для ответа на ваш вопрос:

 let language = Bundle.main.preferredLocalizations.first! as NSString
1 голос
/ 26 декабря 2017

Обновленный ответ для Swift 4

let language = Bundle.main.preferredLocalizations.first
0 голосов
/ 31 января 2016

Формат двух букв. Apple использует стандарт ISO ISO-3166 .

NSString *localeCountryCode = [[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleCountryCode];
0 голосов
/ 17 декабря 2017

SWIFT-4

 // To get device default selected language. It will print like short name of zone. For english, en or spain, es.



let language = Bundle.main.preferredLocalizations.first! as NSString
    print("device language",language)
0 голосов
/ 16 июня 2013

Согласно документации Apple

NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
NSArray* languages = [defs objectForKey:@"AppleLanguages"];
NSString* preferredLang = [languages objectAtIndex:0];
0 голосов
/ 18 июля 2016

@ амир ответ в Swift:

// Get language prefered by user
    let langageRegion = NSLocale.preferredLanguages().first!
    let languageDic = NSLocale.componentsFromLocaleIdentifier(langageRegion)
    let language = languageDic[NSLocaleLanguageCode]
0 голосов
/ 07 марта 2017

Очевидно, что решения, основанные, например, на

[[NSLocale preferredLanguages] objectAtIndex:0]

, обычно работают нормально и возвращают текущий язык устройства.

Но в некоторых случаях это может вводить в заблуждение:

Если приложение, в котором вы хотите получить это значение, уже изменило язык, например, с таким кодом:

NSString *lg = @"en"; // or anything like @"en", @"fr", etc.
[[NSUserDefaults standardUserDefaults] 
    setObject:[NSArray arrayWithObjects:lg, nil]  
    forKey:@"AppleLanguages"]

В этом случае [NSLocale предпочитаемый язык] фактически возвращает предпочтительный набор языков (и использованный) в этом конкретном приложении, а не текущий язык устройства!

И ... в этом случае единственный способ правильно получить фактический текущийЯзык устройства (а не тот, который был ранее установлен в приложении) должен сначала очистить ключ @ "appleLanguages" в NSUserDefaults, например так:

[[NSUserDefaults standardUserDefaults]removeObjectForKey:@"AppleLanguages"];

Затем [NSLocale предпочитаемый язык] теперь возвращает правильное значение.

Надеюсь, эта помощь.

0 голосов
/ 24 января 2017

Начиная с iOS 9, если вам нужен код языка без кода страны, вам понадобится такая вспомогательная функция, поскольку язык будет содержать код страны.

// gets the language code without country code in uppercase format, i.e. EN or DE
NSString* GetLanguageCode()
{
    static dispatch_once_t onceToken;
    static NSString* lang;
    dispatch_once(&onceToken, ^
    {
        lang = [[[NSLocale preferredLanguages] objectAtIndex:0] uppercaseString];
        NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"^[A-Za-z]+" options:0 error:nil];
        NSTextCheckingResult* match = [regex firstMatchInString:lang options:0 range:NSMakeRange(0, lang.length)];
        if (match.range.location != NSNotFound)
        {
            lang = [lang substringToIndex:match.range.length];
        }
    });
    return lang;
}
0 голосов
/ 04 ноября 2016

Для Swift 3:

NSLocale.preferredLanguages ​​[0] as String

...