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.