Як отримати поточний код мови за допомогою Swift?


131

Я хочу отримати мовний код пристрою (en, es ...) у своєму додатку, написаному Swift. Як це можна отримати?

Я намагаюся це:

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

Але це повертає нуль.

Відповіді:


185

У Swift 3

let langStr = Locale.current.languageCode

13
має бути: Locale.current.identifier, але Locale.current.languageCode для китайців, він завжди повертає "zh", але його слід відрізняти zh-HK тощо.
iXcoder

2
@ User9527 Через те, що ви, швидше за все, не ввімкнули локалізацію для цієї мови у налаштуваннях вашого проекту.
Кирило Кудаєв

Не можете призначити значення типу "String" типу "Locale?"
Puji Wahono

1
Наскільки я помітив, він поверне фактичну мову, встановлену в Налаштуваннях -> Загальне -> Мова та регіон -> Язик iPhone ТОЛЬКО ЯКЩО локалізація для цієї мови, включена у ваш проект у розділі Проект -> Локалізації. Інакше це мова розвитку.
Гуральник

85

Важливо зробити різницю між мовою програми та мовою локалізації пристрою (код нижче наведено в Swift 3 )

Повернемо пристрої мови:

let locale = NSLocale.current.languageCode

Поверне App мову:

let pre = Locale.preferredLanguages[0]

4
Я не розумію різниці між мовою пристрою або мовою додатків. Чи є у вас документація про різницю?
Єремія

1
@Jeremiah locale буде містити мову пристрою, наприклад, мова вашого пристрою налаштована на французьку. Попередньо буде містити бажану мову користувача (або додаток), наприклад: ваш додаток підтримує лише китайську, тому ви можете встановити китайський додаток на французькому пристрої. Сподіваюсь, я прояснив це 4
тижня

Коли ви говорите, що пристрій налаштовано на французьку мову, що ви маєте на увазі? Здається, що якщо я зміню мову в налаштуваннях на щось інше, ніж англійська, вона буде представлена ​​в кращих мовах, але не в мовному коді. Як змінюється 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
Арджен Хіемстра



35

Щоб використовувати поточну мову у вашій програмі (відрізняється від бажаних мов)

NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode)!

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, а потім додайте потрібну мову.


Це справді цікаво! Де ви читали рішення одне? Неможливо знайти цю інформацію в
яблучній

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

ви можете скористатися наведеним нижче кодом, він працює чудово зі швидким 3

var preferredLanguage : String = Bundle.main.preferredLocalizations.first!

1
Це той, який насправді все ще працює зі Swift 4! Дякую!
Алекс Уоллі

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.
    }

Дякую @Syscall :)
Miniapps

Любіть розширення :). Не хотіли б більше сенсу повертати жоден, якщо він не вміє якось читати. тому що це значення може бути використане для отримання деякої цінності.
Алікс

5

У Swift ви можете отримати локальну мову за допомогою.

let locale = Locale.current.identifier

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

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)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.