it-swarm.com.ru

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

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

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

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

411
Moshe

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

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

783
Dubron

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

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

[[NSBundle mainBundle] preferredLocalizations];

Пример:

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

Swift:

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

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

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

language = "en-US"

NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language];

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

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

countryCode = "США"

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

languageCode = "en"

83
amir

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

NSLocale *locale = [NSLocale currentLocale];

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

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

Français (France)
English (United States)
64
Philippe Leybaert

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)
    }
} 
33
dreamlab

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

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

    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
12
enzoyang

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

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

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

8
Praveenkumar

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

7
dreamlax

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

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

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

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

Swift

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
    }
}
5
Roman Romanenko

Swift

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

NSLocale.preferredLanguages()[0] as String

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

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

Примечание:

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

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

5
Durai Amuthan.H

В Swiftname__:

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

Простая функция 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
  }
3
Sasha Prokhorenko

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

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

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

3
Chuck Savage

Swift

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

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

}

3
Jovan Stankovic
-(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;

}
2
Johnny Rockex

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

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

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

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

langplusreg = ja-JP

langonly = ja

2
Danboz

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

let language = Bundle.main.preferredLocalizations.first
1
Md. Ibrahim Hassan

В Swift 4.2 и Xcode 10.1

let language = NSLocale.preferredLanguages[0]
print(language)//en
1
iOS

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

 let language = Bundle.main.preferredLocalizations.first! as NSString
1
Apurv Soni

Начиная с 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
jjxtra

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

NSString *localeCountryCode = [[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleCountryCode];
0
Jakub Truhlář

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

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

Для Swift 3:

NSLocale.preferredLanguages ​​[0] as String

0
Bill Chan

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

[[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
Chrysotribax

Свифта-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
anshul-systematix

@amir ответ в Swift:

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