Swift ile güncel dil kodu nasıl alınır?


131

Swift ile yazılan uygulamamda cihazın dil kodunu (en, es ...) almak istiyorum. Bunu nasıl elde edebilirim?

Bunu deniyorum:

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

Ancak bu sıfır döndürür.

Yanıtlar:


185

Swift 3'te

let langStr = Locale.current.languageCode

13
şu olmalıdır: Locale.current.identifier ancak Çince için Locale.current.languageCode, her zaman 'zh' döndürür, ancak zh-HK vb. ayırt edilmelidir
iXcoder

2
@ User9527 Çünkü büyük olasılıkla proje ayarlarınızda o dil için yerelleştirmeyi etkinleştirmediniz.
Kirill Kudaev

'Yerel Ayar?' Türüne 'Dize' türünün değeri atanamıyor
Puji Wahono

1
Fark ettiğim kadarıyla, Proje -> Yerelleştirmeler altında projenizde bu dil için yerelleştirme etkinleştirilmişse, Ayarlar -> Genel -> Dil ve Bölge -> iPhone Dili'nde ayarlanan gerçek dili döndürecektir. Aksi takdirde geliştirme dili.
Huralnyk

86

Uygulama dili ile cihazın yerel dili arasında fark yaratmak önemlidir (Aşağıdaki kod Swift 3'tedir )

Cihaz dilini döndürür :

let locale = NSLocale.current.languageCode

Uygulama dilini döndürür :

let pre = Locale.preferredLanguages[0]

4
Cihaz Dili ile Uygulama Dili arasındaki farkı anlamıyorum. Fark hakkında herhangi bir belgeniz var mı?
Jeremiah

1
@Jeremiah locale cihaz dilini içerecektir, örneğin cihaz diliniz Fransızca olarak yapılandırılmıştır. Pre, kullanıcının (veya Uygulama) tercih ettiği dili içerecektir, örneğin: Uygulamanız yalnızca Çince'yi destekler, böylece bir Fransız cihazına Çince bir uygulama yükleyebilirsiniz. Umut ı açıklık bu 4 u
Raed

Cihaz Fransızca olarak yapılandırıldı derken ne demek istiyorsun? Görünüşe göre ayarlarda dili İngilizce dışında bir değere değiştirirsem, tercih edilen dillerde gösteriliyor ancak dilKodu'nda gösterilmiyor. LanguageCode nasıl değiştirilir?
Jeremiah

Eğer NSLocale.current.languageCode onun değerini alacak İngilizce diger şeye ayarlarında değiştirirseniz
Raed

9
Tersi değil mi? Benim uygulama geliştirme dili TR ve ben sonucudur app lokalize ettiğim bir DE yapılandırılmış cihaz çalıştırıldığında: Locale.current.languageCode: de Locale.current.identifier: de_DE Locale.preferredLanguages[0]: de my uygulama geliştirme dili TR olduğunda ve ben ettiğim bir FR yapılandırılan aygıtta çalıştırmak değil lokalize uygulaması sonuç: Locale.current.languageCode: en Locale.current.identifier: en_FR Locale.preferredLanguages[0]: fr
Arjen Hiemstra

55

Swift 4 ve 5:

Locale.current.languageCode

'Yerel Ayar?' Türüne 'Dize' türünün değeri atanamıyor
Puji Wahono

2
Deneyin Locale(identifier: Locale.current.identifier);
koen

Locale.autoupdatingCurrent.languageCodeayrıca mevcuttur
C. Bess


35

Uygulamanızda kullanılan mevcut dili almak için (tercih edilen dillerden farklı)

NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode)!

29

Swift 3 & 4 & 4.2 & 5

Locale.current.languageCodedüzenli olarak derlemez. Çünkü projeniz için yerelleştirme uygulamadınız.

İki olası çözümünüz var

1) String(Locale.preferredLanguages[0].prefix(2)) Telefon dilini düzgün bir şekilde döndürür.

Tipi almak en-Enistiyorsanız, kullanabilirsinizLocale.preferredLanguages[0]

2) Project(MyApp)-> Project (not Target)-> öğesini seçin ve + düğmesine basın Localizations, ardından istediğiniz dili ekleyin.


Bu gerçekten ilginç! Birinci çözümü nerede okudunuz? Bu bilgi elma belgelerinde
bulunamıyor

16

hızlı 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
Dil kodunu ve ülke kodunu "-" ile ayırın buggy'dir. Kodunuz 'zh-Hans-US' gibi bazı durumlarda kırılacaktır.
Evilisn Jiang

let langStr = Locale.preferredLanguages.first!bu yazıyı gözden geçirirken yaptığım şey bu. Çalışıyor ve langStr.lowercased().contains("es")örneğin tüm İspanyolca dil varyasyonları için dillerimle karşılaştırıyorum .
Ian Ortega

8

aşağıdaki kodu kullanabilirsiniz, swift 3 ile sorunsuz çalışıyor

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

1
Aslında Swift 4 ile hala çalışan budur! Teşekkürler!
Alex Wally

7

Kullanıcı uygulamamı her başlattığında Ayarlar uygulamasında kullanıcı tarafından seçilen dili izlemek istiyorum - bu henüz yerelleştirilmedi (uygulamam yalnızca İngilizcedir). Bu mantığı benimsedim:

  1. dizideki dilleri işlemeyi kolaylaştırmak için bir enum oluşturun

    enum Language: String {
    
    case none = ""
    case en = "English"
    case fr = "French"
    case it = "Italian"
    
    } // add as many languages you want
  2. Birkaç oluşturmak uzantısı için Yerel

    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. İhtiyaç duyduğunuzda, uzantıyı kullanabilirsiniz.

    if let currentLanguage = Locale.currentLanguage {
        print(currentLanguage.rawValue)
        // Your code here.
    }

Teşekkürler @Syscall :)
Miniapps

Uzantıyı seviyorum :). Bir şekilde okuyamıyorsa, hiçbirini döndürmemesi daha mantıklı olmaz mıydı? çünkü bu şekilde bu değer, bir değer yaratmak için kullanılabilir.
Alix

5

Swift'de yerel ayarı kullanarak alabilirsiniz.

let locale = Locale.current.identifier

2

Locale.current.languageCode bana yanlış kod döndürüyor, bu yüzden şu uzantıları kullanıyorum:

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'de kullandığım şey bu:

Sınıf değişkenlerinin içinde:

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

Bu bir dizi olarak gelir. 2 karakter döndürür, yani "en", "es", "de" ...

Buradan hangi dilin görüntüleneceğini kolayca belirleyebilirim:

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

Dilin tüm bilgilerini istiyorsanız, o zaman? .Prefex (2) öğesini kaldırın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.