Jak uzyskać aktualny kod języka za pomocą Swift?

131

Chcę uzyskać kod języka urządzenia (en, es ...) w mojej aplikacji napisanej w Swift. Jak to osiągnąć?

Próbuję tego:

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

Ale to zwraca zero.

user3739367
źródło

Odpowiedzi:

185

W Swift 3

let langStr = Locale.current.languageCode
Vadim Motorine
źródło
13
powinno być: Locale.current.identifier, ale Locale.current.languageCode dla języka chińskiego, zawsze zwraca „zh”, ale musi być rozróżnieniem zh-HK itp.
iXcoder
2
@ User9527 Ponieważ najprawdopodobniej nie włączyłeś lokalizacji dla tego języka w ustawieniach projektu.
Kirill Kudaev,
Nie można przypisać wartości typu „String” do typu „Locale”?
Puji Wahono,
1
O ile zauważyłem, zwróci rzeczywisty język ustawiony w Ustawienia -> Ogólne -> Język i region -> Język iPhone TYLKO JEŻELI lokalizacja dla tego języka włączona w twoim projekcie w Projekt -> Lokalizacje. W przeciwnym razie jest to język programowania.
Huralnyk
85

Ważne jest, aby różnica między językiem App i języka locale urządzenie (Poniższy kod jest Swift 3 )

Zwróci Device język:

let locale = NSLocale.current.languageCode

Zwróci App język:

let pre = Locale.preferredLanguages[0]
podniesiony
źródło
4
Nie rozumiem różnicy między językiem urządzenia a językiem aplikacji. Czy masz jakąś dokumentację dotyczącą różnicy?
Jeremiah
1
Ustawienia regionalne @Jeremiah będą zawierać język urządzenia, na przykład język Twojego urządzenia jest ustawiony na francuski. Wstępnie będzie zawierać preferowany język użytkownika (lub aplikacji), na przykład: Twoja aplikacja obsługuje tylko język chiński, więc możesz zainstalować chińską aplikację na urządzeniu francuskim. Mam nadzieję, że wyjaśniłem to 4 u
ra
Kiedy mówisz, że urządzenie jest skonfigurowane do francuskiego, co masz na myśli? Wygląda na to, że jeśli zmienię język w ustawieniach na inny niż angielski, jest on reprezentowany w preferowanych językach, ale nie w languageCode. Jak zmienia się kod języka?
Jeremiah
Jeśli zmienisz ustawienia na coś innego niż angielski, uzyskasz jego wartość w NSLocale.current.languageCode
raed
9
Czy nie jest na odwrót? Gdy język programowania mojej aplikacji to EN i uruchamiam na urządzeniu skonfigurowanym w języku DE, dla którego zlokalizowałem aplikację, rezultat jest następujący: Locale.current.languageCode: de Locale.current.identifier: de_DE Locale.preferredLanguages[0]: de Gdy język programowania mojej aplikacji to EN i uruchamiam na urządzeniu skonfigurowanym w języku FR, dla którego nie zlokalizowałem app wynik: Locale.current.languageCode: en Locale.current.identifier: en_FR Locale.preferredLanguages[0]: fr
Arjen Hiemstra
55

Swift 4 i 5:

Locale.current.languageCode
Bogdan Bystritskiy
źródło
Nie można przypisać wartości typu „String” do typu „Locale”?
Puji Wahono
2
Spróbuj Locale(identifier: Locale.current.identifier);
koen
Locale.autoupdatingCurrent.languageCodejest również dostępny
C. Bess
37

W Swift 3:

NSLocale.current.languageCode
mazorati
źródło
35

Aby uzyskać aktualny język używany w Twojej aplikacji (inny niż preferowany język)

NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode)!
Benknopf
źródło
29

Swift 3 i 4 oraz 4,2 i 5

Locale.current.languageCodenie kompiluje się regularnie. Ponieważ nie zaimplementowałeś lokalizacji dla swojego projektu.

Masz dwa możliwe rozwiązania

1) String(Locale.preferredLanguages[0].prefix(2)) Zwraca poprawnie język telefonu.

Jeśli chcesz uzyskać typ en-En, możesz użyćLocale.preferredLanguages[0]

2) Wybierz Project(MyApp)-> Project (not Target)-> naciśnij przycisk + Localizations, a następnie dodaj żądany język.

Ali Ihsan URAL
źródło
To jest naprawdę interesujące! Gdzie przeczytałeś rozwiązanie pierwsze? Nie mogę znaleźć tej informacji w dokumentacji Apple
kuzdu
16

szybki 3

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

let arr = preferredLanguage.components(separatedBy: "-")
let deviceLanguage = arr.first
print (deviceLanguage) //en
Bassant Ashraf
źródło
1
Oddzielanie kodu języka od kodu kraju znakiem „-” jest błędne. Twój kod zepsuje się w niektórych przypadkach, takich jak „zh-Hans-US”.
Evilisn Jiang
let langStr = Locale.preferredLanguages.first!to właśnie zrobiłem przeglądając ten post. To działa, a ja porównuję z moimi językami langStr.lowercased().contains("es")na przykład dla wszystkich odmian języka hiszpańskiego.
Ian Ortega
8

możesz użyć poniższego kodu, działa dobrze ze swift 3

var preferredLanguage : String = Bundle.main.preferredLocalizations.first!
Amr Angry
źródło
1
To jest ten, który nadal działa ze Swift 4! Dzięki!
Alex Wally
7

Chcę śledzić język wybrany przez użytkownika w aplikacji Ustawienia za każdym razem, gdy użytkownik uruchamia moją aplikację - to nie jest jeszcze zlokalizowane (moja aplikacja jest tylko w języku angielskim). Przyjąłem tę logikę:

  1. utwórz wyliczenie, aby ułatwić obsługę języków w tablicy

    enum Language: String {
    
    case none = ""
    case en = "English"
    case fr = "French"
    case it = "Italian"
    
    } // add as many languages you want
  2. utwórz kilka rozszerzeń do 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. Kiedy potrzebujesz, możesz po prostu użyć rozszerzenia

    if let currentLanguage = Locale.currentLanguage {
        print(currentLanguage.rawValue)
        // Your code here.
    }
Miniapps
źródło
Dzięki @Syscall :)
Miniapps
Uwielbiam rozszerzenie :). Czy nie miałoby sensu zwracać żadnego, jeśli nie jest w stanie w jakiś sposób czytać. ponieważ w ten sposób ta wartość może zostać użyta do stworzenia jakiejś wartości.
Alix
5

W Swift możesz uzyskać lokalizację za pomocą.

let locale = Locale.current.identifier
yo2bh
źródło
2

Locale.current.languageCode zwraca mi zły kod, więc używam tych rozszerzeń:

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
źródło
0

Oto, czego używam w Swift 5 Xcode 11:

Wewnątrz zmiennych klasy:

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

To pojawia się jako ciąg. Zwraca 2 znaki, tj. „En”, „es”, „de” ...

Na tej podstawie mogę łatwo określić, jaki język wyświetlić:

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

Jeśli chcesz uzyskać pełne informacje o języku, usuń? .Prefex (2)

Brian M.
źródło