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

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

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

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

Ответы [ 29 ]

785 голосов
/ 19 ноября 2010

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

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

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

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

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

Надеюсь, что это поможет кому-то, кто ищет разницу между регионом и выбранным в данный момент языком.1017 * Стоит процитировать информацию заголовка из 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's answer

272 голосов
/ 08 мая 2012

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

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

[[NSBundle mainBundle] preferredLocalizations];

Пример:

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

Swift:

let language = NSBundle.mainBundle().preferredLocalizations.first as NSString
83 голосов
/ 02 ноября 2015

Решение для 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"

64 голосов
/ 12 октября 2010

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

NSLocale *locale = [NSLocale currentLocale];

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

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

Français (France)
English (United States)
33 голосов
/ 18 мая 2015

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

Список предпочтительных языков может быть отредактирован в : Settings.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)
    }
} 
12 голосов
/ 24 июля 2013

Перевод языковых кодов, таких как 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);

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

12 голосов
/ 02 марта 2013

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

    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
8 голосов
/ 23 октября 2013

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

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

Предложено Abizern на здесь

7 голосов
/ 12 октября 2010

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

5 голосов
/ 01 февраля 2016

Swift

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

NSLocale.preferredLanguages()[0] as String

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

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

Примечание:

Извлекает язык, который вы указали в CFBundleDevelopmentRegion из info.plist

, если CFBundleAllowMixedLocalizations имеет значение true в info.plist, затем возвращается первый элемент CFBundleLocalizations в info.plist

...