Как получить текущий языковой код с помощью Swift?

131

Я хочу получить код языка устройства (en, es ...) в моем приложении, написанном на Swift. Как это получить?

Я пробую это:

var preferredLanguages : NSLocale!
let pre = preferredLanguages.displayNameForKey(NSLocaleIdentifier, value: preferredLanguages)

Но это возвращает ноль.

user3739367
источник

Ответы:

185

В Swift 3

let langStr = Locale.current.languageCode
Вадим Моторин
источник
13
должно быть: Locale.current.identifier, но Locale.current.languageCode для китайского языка, он всегда возвращает 'zh', но должен отличаться zh-HK и т. д.
iXcoder
2
@ User9527 Из-за того, что вы, скорее всего, не включили локализацию для этого языка в настройках вашего проекта.
Кирилл Кудаев
Невозможно присвоить значение типа String для типа Locale?
Пуджи Вахоно
1
Насколько я заметил, он вернет фактический язык, установленный в Настройках -> Общие -> Язык и регион -> Язык iPhone, ТОЛЬКО ЕСЛИ локализация для этого языка включена в вашем проекте в разделе Проект -> Локализации. В противном случае это язык разработки.
Huralnyk
86

Важно различать язык приложения и язык локали устройства (код ниже в Swift 3 ).

Возвратим устройства языка:

let locale = NSLocale.current.languageCode

Возвратит App язык:

let pre = Locale.preferredLanguages[0]
Raed
источник
4
Я не понимаю разницы между языком устройства и языком приложения. У вас есть документация о различиях?
Иеремия
1
Локаль @Jeremiah будет содержать язык устройства, например, язык вашего устройства настроен на французский. Pre будет содержать предпочтительный язык пользователя (или приложения), например: ваше приложение поддерживает только китайский язык, поэтому вы можете установить китайское приложение на французском устройстве. Надеюсь, я прояснил это 4 u
raed
Когда вы говорите, что устройство настроено на французский, что вы имеете в виду? Кажется, что если я изменю язык в настройках на какой-то другой, кроме английского, он будет представлен в предпочтительных языках, но не в languageCode. Как меняется languageCode?
Иеремия
Если вы измените настройки на что-то другое, кроме английского, вы получите его значение в NSLocale.current.languageCode
raed
9
А разве не наоборот? Когда мой язык разработки приложений - EN, и я работаю на устройстве с конфигурацией DE, для которого я локализовал приложение, результат будет следующим: Locale.current.languageCode: de Locale.current.identifier: de_DE Locale.preferredLanguages[0]: de Когда язык разработки моего приложения - EN, и я работаю на устройстве с настройкой FR, для которого я не локализовал приложение результат: Locale.current.languageCode: en Locale.current.identifier: en_FR Locale.preferredLanguages[0]: fr
Арьен Хиемстра
55

Swift 4 и 5:

Locale.current.languageCode
Богдан Быстрицкий
источник
Невозможно присвоить значение типа String для типа Locale?
Пуджи Вахоно
2
Попробуйте Locale(identifier: Locale.current.identifier);
коэн
Locale.autoupdatingCurrent.languageCodeтакже доступно
К. Бесс
35

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

NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode)!
Benknopf
источник
29

Swift 3 и 4, 4.2 и 5

Locale.current.languageCodeне компилируется регулярно. Потому что вы не реализовали локализацию своего проекта.

У вас есть два возможных решения

1) String(Locale.preferredLanguages[0].prefix(2)) Он правильно возвращает язык телефона.

Если вы хотите получить тип en-En, вы можете использоватьLocale.preferredLanguages[0]

2) Выберите Project(MyApp)-> Project (not Target)-> нажмите кнопку + Localizations, затем добавьте нужный язык.

Али Ихсан УРАЛ
источник
Это действительно интересно! Где вы читали решение первое? Не могу найти эту информацию в документации Apple
kuzdu
16

быстрый 3

let preferredLanguage = Locale.preferredLanguages[0] as String
print (preferredLanguage) //en-US

let arr = preferredLanguage.components(separatedBy: "-")
let deviceLanguage = arr.first
print (deviceLanguage) //en
Бассан Ашраф
источник
1
Разделить код языка и код страны знаком «-» - это ошибка. Ваш код не работает в некоторых случаях, например "zh-Hans-US".
Evilisn Jiang
let langStr = Locale.preferredLanguages.first!это то, что я сделал, просматривая этот пост. Это работает, и я сравниваю со своими языками, например, langStr.lowercased().contains("es")все варианты испанского языка.
Ян Ортега,
8

вы можете использовать приведенный ниже код, он отлично работает с Swift 3

var preferredLanguage : String = Bundle.main.preferredLocalizations.first!
Амр Злой
источник
1
Это тот, который действительно работает со Swift 4! Спасибо!
Alex Wally
7

Я хочу отслеживать язык, выбранный пользователем в приложении «Настройки», каждый раз, когда пользователь запускает мое приложение - оно еще не локализовано (мое приложение только на английском языке). Я принял такую ​​логику:

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

    enum Language: String {
    
    case none = ""
    case en = "English"
    case fr = "French"
    case it = "Italian"
    
    } // add as many languages you want
  2. создать пару расширений для Locale

    extension Locale {
    
        static var enLocale: Locale {
    
            return Locale(identifier: "en-EN")
        } // to use in **currentLanguage** to get the localizedString in English
    
        static var currentLanguage: Language? {
    
            guard let code = preferredLanguages.first?.components(separatedBy: "-").last else {
    
                print("could not detect language code")
    
                return nil
            }
    
            guard let rawValue = enLocale.localizedString(forLanguageCode: code) else {
    
                print("could not localize language code")
    
                return nil
            }
    
            guard let language = Language(rawValue: rawValue) else {
    
                print("could not init language from raw value")
    
                return nil
            }
            print("language: \(code)-\(rawValue)")
    
            return language
        }
    }
  3. При необходимости вы можете просто использовать расширение

    if let currentLanguage = Locale.currentLanguage {
        print(currentLanguage.rawValue)
        // Your code here.
    }
Miniapps
источник
Спасибо @Syscall :)
Miniapps 05
Очень нравится расширение :). Разве не имеет смысла возвращать none, если он как-то не может читать. потому что таким образом это значение может быть использовано для получения некоторой ценности.
Аликс
5

В Swift вы можете получить локаль, используя.

let locale = Locale.current.identifier
yo2bh
источник
2

Locale.current.languageCode возвращает мне неправильный код, поэтому я использую эти расширения:

extension Locale {
    static var preferredLanguageCode: String {
        let defaultLanguage = "en"
        let preferredLanguage = preferredLanguages.first ?? defaultLanguage
        return Locale(identifier: preferredLanguage).languageCode ?? defaultLanguage
    }

    static var preferredLanguageCodes: [String] {
        return Locale.preferredLanguages.compactMap({Locale(identifier: $0).languageCode})
    }
}
ChikabuZ
источник
0

Вот что я использую в Swift 5 Xcode 11:

Внутри переменных класса:

let languagePrefix = Bundle.main.preferredLocalizations.first?.prefix(2)

Это идет в виде строки. Он возвращает 2 символа, то есть «en», «es», «de» ...

Отсюда я могу легко определить, на каком языке отображать:

 if languagePrefix == "es" { self.flipCard.setTitle("última carta", for: .normal) }
 if languagePrefix == "en" { self.flipCard.setTitle("Last Card", for: .normal) }

Если вам нужна полная информация о языке, удалите? .Prefex (2)

Брайан М
источник