Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

Стоит процитировать информацию о заголовке от 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 Ответ

Другие советы

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

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

[[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];

Интигический будет иметь необходимые компоненты

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

То Предпочтительный список языков может быть Отредактировано в: Stens.App -> general -> язык и регион -> предпочитаемый язык языка


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

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

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

Печать: Английский, немецкий, шведский

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

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

Предложено Абизерн на здесь

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

Я попытался выяснить правильное решение для себя. Когда я использую 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
    }
}

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

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

Быстрый

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

NSLocale.preferredLanguages()[0] as String

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

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

Примечание:

Он получает язык, который вы дали CFBundledEvelopmentregion. info.plist

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

Для Monotouch C# разработчики используют:

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

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

В Swift:

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

Swift 3

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

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

Если вы ищете предпочтительный языковой код («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 *)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;

}

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

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

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

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

langplusreg = ja-jp

langonly = ja

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

let language = Bundle.main.preferredLocalizations.first

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

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

В Swift 4.2 и Xcode 10.1

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

По словам 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]

Для Свифта 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 PRESTEDLANGUAGEGAGES] теперь возвращает правильное значение.

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

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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top