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

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

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

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

вопрос задан 11.10.2010
Moshe
34339 репутация

28 ответов


  • 766 рейтинг

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

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

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

    .

    Список кодов ИСО 639-1

    Тогда просто преобразовать двухбуквенные коды в строку, которую вы хотите отобразить. Так что, если это «en», выведите «English».

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

    РЕДАКТИРОВАТЬ

    Стоит процитировать информацию заголовка из NSLocale. ч:

    + (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's answer

    ответ дан Dubron, с репутацией 7976, 19.11.2010
  • 263 рейтинг

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

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

    [[NSBundle mainBundle] preferredLocalizations];
    

    Пример:

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

    Swift:

    let language = NSBundle.mainBundle().preferredLocalizations.first as NSString
    
    ответ дан mindvision, с репутацией 2639, 8.05.2012
  • 75 рейтинг

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

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

    language = "en-US"

    NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language];
    

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

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

    countryCode = "US"

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

    languageCode = "en"

    ответ дан amir, с репутацией 1035, 2.11.2015
  • 64 рейтинг

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

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

    Это покажет название языка, на самом языке. Например:

    Français (France)
    English (United States)
    
    ответ дан Philippe Leybaert, с репутацией 126947, 11.10.2010
  • 29 рейтинг

    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. Испанский (язык устройства)

    Список предпочтительных языков может быть отредактирован в : Настройки. приложение - & gt; Общее - & gt; Язык & amp; Регион - & gt; Предпочтительный языковой порядок


    Вы можете использовать код языка устройства и перевести его на название языка. Следующие строки будут печатать язык устройства на языке устройства. Например, «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)
        }
    } 
    
    ответ дан dreamlab, с репутацией 3026, 18.05.2015
  • 13 рейтинг

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

        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
    
    ответ дан enzoyang, с репутацией 536, 2.03.2013
  • 12 рейтинг

    Перевод языковых кодов, таких как en_US , на Английский (США) - это встроенная функция 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);
    

    Отпечатки: Английский, Немецкий, Шведский

    ответ дан Erik B, с репутацией 21221, 24.07.2013
  • 8 рейтинг

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

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

    , предложенный Abizern на здесь

    ответ дан Praveenkumar, с репутацией 18670, 23.10.2013
  • 7 рейтинг

    Вы можете использовать метод 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).

    ответ дан dreamlax, с репутацией 77034, 11.10.2010
  • 5 рейтинг

    Я попытался найти правильное решение для себя. Когда я использую 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
        }
    }
    
    ответ дан Roman Romanenko, с репутацией 334, 27.12.2016
  • 5 рейтинг

    Swift

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

    NSLocale.preferredLanguages()[0] as String
    

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

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

    Примечание:

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

    , если CFBundleAllowMixedLocalizations истинно в информации. plist тогда первый пункт CFBundleLocalizations в информации. plist возвращается

    ответ дан Durai Amuthan.H, с репутацией 21715, 1.02.2016
  • 4 рейтинг

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

    NSString * myString = [[NSLocale preferredlanguage]objectAtIndex:0];
    
    ответ дан shailendra, с репутацией 49, 27.06.2013
  • 3 рейтинг

    В Swift:

    let languageCode = NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode) as? String
    
    ответ дан lee, с репутацией 3418, 6.10.2016
  • 3 рейтинг

    Простая функция 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
      }
    
    ответ дан Sasha Prokhorenko, с репутацией 96, 24.05.2017
  • 3 рейтинг

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

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

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

    ответ дан Chuck Savage, с репутацией 9390, 10.04.2012
  • 2 рейтинг
    -(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;
    
    }
    
    ответ дан Johnny Rockex, с репутацией 2408, 8.10.2013
  • 2 рейтинг

    Swift 3

    let locale = Locale.current
    let code = (locale as NSLocale).object(forKey: NSLocale.Key.countryCode) as! String?
    print(code!)
    
    ответ дан Tarik, с репутацией 386, 5.01.2017
  • 2 рейтинг

    Если вы ищете код предпочитаемого языка ("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)!
    }
    

    }

    ответ дан Jovan Stankovic, с репутацией 2352, 14.12.2017
  • 1 рейтинг

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

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

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

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

    langplusreg = ja-JP

    langonly = ja

    ответ дан Danboz, с репутацией 332, 8.10.2015
  • 1 рейтинг

    Для Swift 3. 0 Код ниже может быть использован для ответа на ваш вопрос:

     let language = Bundle.main.preferredLocalizations.first! as NSString
    
    ответ дан Apurv Soni, с репутацией 54, 10.04.2018
  • 0 рейтинг

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

    let language = Bundle.main.preferredLocalizations.first
    
    ответ дан Md. Ibrahim Hassan, с репутацией 3044, 26.12.2017
  • 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;
    }
    
    ответ дан jjxtra, с репутацией 11803, 24.01.2017
  • 0 рейтинг

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

    NSString *localeCountryCode = [[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleCountryCode];
    
    ответ дан Jakub Truhlář, с репутацией 6822, 31.01.2016
  • 0 рейтинг

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

    NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
    NSArray* languages = [defs objectForKey:@"AppleLanguages"];
    NSString* preferredLang = [languages objectAtIndex:0];
    
    ответ дан Max Tymchii, с репутацией 534, 16.06.2013
  • 0 рейтинг

    для Swift 3:

    NSLocale. предпочитаемый язык [0] как строка

    ответ дан Bill Chan, с репутацией 1253, 4.11.2016
  • 0 рейтинг

    Очевидно, решения, полагающиеся, например, на

    [[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 предпочитаемый язык] теперь возвращает правильное значение.

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

    ответ дан Chrysotribax, с репутацией 344, 7.03.2017
  • 0 рейтинг

    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)
    
    ответ дан anshul-systematix, с репутацией 316, 17.12.2017
  • 0 рейтинг

    @amir ответ в Swift:

    // Get language prefered by user
        let langageRegion = NSLocale.preferredLanguages().first!
        let languageDic = NSLocale.componentsFromLocaleIdentifier(langageRegion)
        let language = languageDic[NSLocaleLanguageCode]
    
    ответ дан CedricSoubrie, с репутацией 5811, 18.07.2016