Получение текущего языка устройства в iOS?

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

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

EDIT: для тех, кто едет дальше, здесь есть тонна полезных комментариев, поскольку ответ эволюционировал с новыми выпусками iOS.

28 ответов


предоставленные решения фактически вернут текущую область устройства-не текущий выбранный язык. Часто это одно и то же. Однако, если я нахожусь в Северной Америке, и я установил свой язык на японский, мой регион по-прежнему будет английским (Соединенные Штаты). Для того, чтобы получить текущий выбранный язык, вы можете сделать:

NSString * language = [[NSLocale preferredLanguages] firstObject];

это вернет двухбуквенный код для выбранного языка. "en" для английского, " es "для испанского," de " для немецкого, так далее. Для получения дополнительных примеров см. Эту запись Википедии (в частности, столбец 639-1):

список кодов ISO 639-1

тогда это простой вопрос преобразования двух буквенных кодов в строку, которую вы хотели бы отобразить. Поэтому, если это "en", отобразите "English".

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

редактировать

стоит цитировать информация заголовка из NSLocale.h:

+ (NSArray *)preferredLanguages NS_AVAILABLE(10_5, 2_0); // note that this list does not indicate what language the app is actually running in; the [NSBundle mainBundle] object determines that at launch and knows that information

люди, заинтересованные в языке приложения взглянуть на @mindvision ответ


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

чтобы узнать текущий язык, выбранный в вашей локализации, используйте

[[NSBundle mainBundle] preferredLocalizations];

пример:

NSString *language = [[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0];

Свифт:

let language = NSBundle.mainBundle().preferredLocalizations.first as NSString

решение для iOS 9:

NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];

язык = "en-US"

NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language];

languageDic будет иметь необходимые компоненты

NSString *countryCode = [languageDic objectForKey:@"kCFLocaleCountryCodeKey"];

countryCode = "US"

NSString *languageCode = [languageDic objectForKey:@"kCFLocaleLanguageCodeKey"];

languageCode = "en"


это, вероятно, даст вам то, что вы хотите:

NSLocale *locale = [NSLocale currentLocale];

NSString *language = [locale displayNameForKey:NSLocaleIdentifier 
                                         value:[locale localeIdentifier]];

Он будет показывать название языка в самом языке. Например:

Français (France)
English (United States)

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

на язык устройства - язык, на котором представлены элементы операционной системы и приложения Apple.

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

следующая функция будет проходить через список предпочитаемых языков и проверять, есть ли перевод в рамках Apple. Первый язык для перевода - это язык устройства. Функция вернет свой код языка.

func deviceLanguage() -> String? {
    let systemBundle: NSBundle = NSBundle(forClass: UIView.self)
    let englishLocale: NSLocale = NSLocale(localeIdentifier: "en")

    let preferredLanguages: [String] = NSLocale.preferredLanguages()

    for language: String in preferredLanguages {
        let languageComponents: [String : String] = NSLocale.componentsFromLocaleIdentifier(language)

        guard let languageCode: String = languageComponents[NSLocaleLanguageCode] else {
            continue
        }

        // ex: es_MX.lproj, zh_CN.lproj
        if let countryCode: String = languageComponents[NSLocaleCountryCode] {
            if systemBundle.pathForResource("\(languageCode)_\(countryCode)", ofType: "lproj") != nil {
                // returns language and country code because it appears that the actual language is coded within the country code aswell
                // for example: zh_CN probably mandarin, zh_HK probably cantonese
                return language
            }
        }

        // ex: English.lproj, German.lproj
        if let languageName: String = englishLocale.displayNameForKey(NSLocaleIdentifier, value: languageCode) {
            if systemBundle.pathForResource(languageName, ofType: "lproj") != nil {
                return languageCode
            }
        }

        // ex: pt.lproj, hu.lproj
        if systemBundle.pathForResource(languageCode, ofType: "lproj") != nil {
            return languageCode
        }
    }

    return nil
}

это работает, если предпочтительный список языков:

  1. африкаанс (iOS не переводится на африкаанс)
  2. испанский (Язык Устройства)

на список предпочитаемых языков может быть редактировать: настройки.app - > общие - > язык и регион - > предпочтительный Языковой Порядок


Вы можете использовать код языка устройства и перевести его на язык. Следующие строки будут печатать язык устройства на языке устройства. Например, "Español", если устройство настроено на испанский язык.

if let deviceLanguageCode: String = deviceLanguage() {
    let printOutputLanguageCode: String = deviceLanguageCode
    let printOutputLocale: NSLocale = NSLocale(localeIdentifier: printOutputLanguageCode)

    if let deviceLanguageName: String = printOutputLocale.displayNameForKey(NSLocaleIdentifier, value: deviceLanguageCode) {
        // keep in mind that for some localizations this will print a language and a country
        // see deviceLanguage() implementation above
        print(deviceLanguageName)
    }
} 

Я использую этот

    NSArray *arr = [NSLocale preferredLanguages];
for (NSString *lan in arr) {
    NSLog(@"%@: %@ %@",lan, [NSLocale canonicalLanguageIdentifierFromString:lan], [[[NSLocale alloc] initWithLocaleIdentifier:lan] displayNameForKey:NSLocaleIdentifier value:lan]);
}

игнорировать утечки памяти..

и в результате

2013-03-02 20:01:57.457 xx[12334:907] zh-Hans: zh-Hans 中文(简体中文)
2013-03-02 20:01:57.460 xx[12334:907] en: en English
2013-03-02 20:01:57.462 xx[12334:907] ja: ja 日本語
2013-03-02 20:01:57.465 xx[12334:907] fr: fr français
2013-03-02 20:01:57.468 xx[12334:907] de: de Deutsch
2013-03-02 20:01:57.472 xx[12334:907] nl: nl Nederlands
2013-03-02 20:01:57.477 xx[12334:907] it: it italiano
2013-03-02 20:01:57.481 xx[12334:907] es: es español

перевод языковых кодов, таких как язык на Английский (США) является встроенной функцией NSLocale и NSLocale не имеет значения, откуда вы получаете коды языка. Таким образом, на самом деле нет причин реализовывать свой собственный перевод, как предполагает принятый ответ.

// Example code - try changing the language codes and see what happens
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en"];
NSString *l1 = [locale displayNameForKey:NSLocaleIdentifier value:@"en"];
NSString *l2 = [locale displayNameForKey:NSLocaleIdentifier value:@"de"];
NSString *l3 = [locale displayNameForKey:NSLocaleIdentifier value:@"sv"];
NSLog(@"%@, %@, %@", l1, l2, l3);

принты: Английский, Немецкий, Шведский


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

NSLog(@"Current Language - %@", [[NSLocale preferredLanguages] firstObject]);

предложил Abizern on здесь


можно использовать displayNameForKey:value: метод NSLocale:

// get a French locale instance
NSLocale *frLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"] autorelease];

// use it to get translated display names of fr_FR and en_US
NSLog(@"%@", [frLocale displayNameForKey:NSLocaleIdentifier value:@"fr_FR"]);
NSLog(@"%@", [frLocale displayNameForKey:NSLocaleIdentifier value:@"en_US"]);

это будет напечатано:

français (France)
anglais (États-Unis)

если вы укажете тот же идентификатор локали для initWithLocaleIdentifier: и displayNameForKey:value: метод, тогда он даст вам родное имя языка. Я обнаружил, что если вы удалите код страны и используете только fr и en, что он также опустит страну из отображаемого имени (по крайней мере, на Mac OS X, не уверен в iOS).


Свифт

чтобы получить текущий язык устройства

NSLocale.preferredLanguages()[0] as String

чтобы получить язык приложения

NSBundle.mainBundle().preferredLocalizations[0] as NSString

Примечание:

он выбирает язык, который вы дали в CFBundleDevelopmentRegion информация.файл plist

если CFBundleAllowMixedLocalizations верно в info.plist тогда первый пункт CFBundleLocalizations in информация.plist-это вернулся


Я попытался найти правильное решение для себя. Когда я использую Locale.preferredLanguages.first был возвращен предпочтительный язык из настроек вашего приложения.

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

Swift 3

let currentDeviceLanguage = Locale.current.languageCode
// Will return the optional String

, чтобы развернуть и использовать посмотрите на строку ниже:

if let currentDeviceLanguage = Locale.current.languageCode {
    print("currentLanguage", currentDeviceLanguage)

    // For example
    if currentDeviceLanguage == "he" {
        UIView.appearance().semanticContentAttribute = .forceRightToLeft
    } else {
        UIView.appearance().semanticContentAttribute = .forceLeftToRight
    }
}

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

NSString * myString = [[NSLocale preferredlanguage]objectAtIndex:0];

для разработчиков MonoTouch C# используйте:

NSLocale.PreferredLanguages.FirstOrDefault() ?? "en"

примечание: Я знаю, что это был вопрос iOS, но поскольку я разработчик MonoTouch, ответ на этой странице привел меня в правильном направлении, и я думал, что поделюсь результатами.


на Swift:

let languageCode = NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode) as? String

простая функция Swift 3:

  @discardableResult
  func getLanguageISO() -> String {
    let locale = Locale.current
    guard let languageCode = locale.languageCode,
          let regionCode = locale.regionCode else {
        return "de_DE"
    }
    return languageCode + "_" + regionCode
  }

-(NSString *)returnPreferredLanguage { //as written text

NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
NSArray *preferredLanguages = [defaults objectForKey:@"AppleLanguages"];
NSString *preferredLanguageCode = [preferredLanguages objectAtIndex:0]; //preferred device language code
NSLocale *enLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en"]; //language name will be in English (or whatever)
NSString *languageName = [enLocale displayNameForKey:NSLocaleIdentifier value:preferredLanguageCode]; //name of language, eg. "French"
return languageName;

}

Swift 3

let locale = Locale.current
let code = (locale as NSLocale).object(forKey: NSLocale.Key.countryCode) as! String?
print(code!)

Если вы ищете предпочтительный код языка ("en"," de"," es"...) и локализованное предпочтительное имя языка (для текущей локали), вот простое расширение в Swift:

extension Locale {
static var preferredLanguageIdentifier: String {
    let id = Locale.preferredLanguages.first!
    let comps = Locale.components(fromIdentifier: id)
    return comps.values.first!
}

static var preferredLanguageLocalizedString: String {
    let id = Locale.preferredLanguages.first!
    return Locale.current.localizedString(forLanguageCode: id)!
}

}


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

NSString *langplusreg = [[NSLocale preferredLanguages] objectAtIndex:0];
NSString * langonly = [[langplusreg componentsSeparatedByString:@"-"] 
objectAtIndex:0];

в моем случае я просто хотел только язык локали, а не регион локали.

выход: Если ваш язык локали-японский, а регион локали-Япония, то:

langplusreg = ja-JP

langonly = ja


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

 let language = Bundle.main.preferredLocalizations.first! as NSString

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

NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
NSArray* languages = [defs objectForKey:@"AppleLanguages"];
NSString* preferredLang = [languages objectAtIndex:0];

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

NSString *localeCountryCode = [[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleCountryCode];

@amir ответ в Swift:

// Get language prefered by user
    let langageRegion = NSLocale.preferredLanguages().first!
    let languageDic = NSLocale.componentsFromLocaleIdentifier(langageRegion)
    let language = languageDic[NSLocaleLanguageCode]

Для Swift 3:

NSLocale.preferredLanguages[0] как строка


начиная с 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;
}

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

[[NSLocale preferredLanguages] objectAtIndex:0]

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

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

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

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

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

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

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

затем [NSLocale preferredLanguages] теперь возвращает правильное значение.

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


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)

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

let language = Bundle.main.preferredLocalizations.first