Bagaimana cara mendapatkan kode bahasa saat ini dengan Swift?


131

Saya ingin mendapatkan kode bahasa perangkat (id, es ...) di aplikasi saya yang ditulis dengan Swift. Bagaimana bisa mendapatkan ini?

Saya mencoba ini:

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

Tapi ini mengembalikan nol.

Jawaban:


185

Dalam Swift 3

let langStr = Locale.current.languageCode

13
seharusnya: Locale.current.identifier tetapi Locale.current.languageCode untuk bahasa Cina, selalu mengembalikan 'zh', tetapi harus dibedakan zh-HK, dll
iXcoder

2
@ User9527 Karena Anda kemungkinan besar tidak mengaktifkan pelokalan untuk bahasa itu di pengaturan proyek Anda.
Kirill Kudaev

Tidak dapat menetapkan nilai tipe 'String' untuk mengetik 'Lokal'?
Puji Wahono

1
Sejauh yang saya perhatikan, itu akan mengembalikan bahasa aktual yang diatur dalam Pengaturan -> Umum -> Bahasa & Wilayah -> Bahasa iPhone SAJA JIKA lokalisasi untuk bahasa ini diaktifkan di proyek Anda di bawah Proyek -> Pelokalan. Kalau tidak, itu bahasa pengembangan.
Huralnyk

85

Sangat penting untuk membuat perbedaan antara bahasa App dan bahasa lokal perangkat (Kode di bawah ini dalam Swift 3 )

Akan mengembalikan bahasa Perangkat :

let locale = NSLocale.current.languageCode

Akan mengembalikan bahasa Aplikasi :

let pre = Locale.preferredLanguages[0]

4
Saya tidak mengerti perbedaan antara Bahasa Perangkat atau Bahasa Aplikasi. Apakah Anda memiliki dokumentasi tentang perbedaannya?
Yeremia

1
@Jeremia lokal akan berisi bahasa perangkat, misalnya bahasa perangkat Anda dikonfigurasikan ke Prancis. Pra akan berisi bahasa yang disukai pengguna (Atau Aplikasi), misalnya: Aplikasi Anda hanya mendukung bahasa Cina, sehingga Anda dapat menginstal aplikasi Cina di perangkat Prancis. Harapan saya mengklarifikasi 4 ini u
Raed

Ketika Anda mengatakan perangkat ini dikonfigurasi ke bahasa Perancis, apa maksud Anda? Tampaknya jika saya mengubah bahasa di pengaturan ke sesuatu selain bahasa Inggris itu diwakili dalam preferLanguages ​​tetapi tidak di languageCode. Bagaimana languageCode diubah?
Jeremiah

Jika Anda mengubah pengaturan dalam ke sesuatu yang lain dalam bahasa Inggris, Anda akan mendapatkan nilainya dalam NSLocale.current.languageCode
raed

9
Bukankah sebaliknya? Ketika bahasa pengembangan aplikasi saya adalah EN dan saya menjalankan perangkat DE yang dikonfigurasikan, yang untuknya saya telah melokalkan aplikasi, hasilnya adalah: Locale.current.languageCode: de Locale.current.identifier: de_DE Locale.preferredLanguages[0]: de Ketika bahasa pengembangan aplikasi saya adalah EN dan saya menjalankan perangkat yang dikonfigurasikan FR, di mana saya belum melokalkan aplikasi hasilnya adalah: Locale.current.languageCode: en Locale.current.identifier: en_FR Locale.preferredLanguages[0]: fr
Arjen Hiemstra

55

Swift 4 & 5:

Locale.current.languageCode

Tidak dapat menetapkan nilai tipe 'String' untuk mengetik 'Lokal'?
Puji Wahono

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

Locale.autoupdatingCurrent.languageCodejuga tersedia
C. Bess


35

Untuk menggunakan bahasa saat ini di aplikasi Anda (berbeda dari bahasa pilihan)

NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode)!

29

Swift 3 & 4 & 4.2 & 5

Locale.current.languageCodetidak mengkompilasi secara teratur. Karena Anda tidak menerapkan pelokalan untuk proyek Anda.

Anda memiliki dua solusi yang memungkinkan

1) String(Locale.preferredLanguages[0].prefix(2)) Ini mengembalikan lang telepon dengan benar.

Jika Anda ingin mendapatkan tipenya en-En, Anda bisa menggunakannyaLocale.preferredLanguages[0]

2) Pilih Project(MyApp)-> Project (not Target)-> tekan tombol + ke Localizations, lalu tambahkan bahasa yang Anda inginkan.


Ini sangat menarik! Di mana Anda membaca solusi satu? Tidak dapat menemukan informasi ini dalam dokumentasi apel
kuzdu

16

cepat 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
Kode bahasa dan kode negara yang terpisah dengan "-" buggy. Kode Anda akan rusak pada beberapa kasus seperti 'zh-Hans-US'.
Evilisn Jiang

let langStr = Locale.preferredLanguages.first!inilah yang saya lakukan meninjau posting ini. Ini berfungsi, dan saya membandingkan dengan bahasa saya dengan langStr.lowercased().contains("es")untuk semua variasi bahasa Spanyol misalnya.
Ian Ortega

8

Anda dapat menggunakan kode di bawah ini berfungsi dengan baik dengan cepat 3

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

1
Ini adalah yang benar-benar masih berfungsi dengan Swift 4! Terima kasih!
Alex Wally

7

Saya ingin melacak bahasa yang dipilih oleh pengguna di aplikasi Pengaturan setiap kali pengguna meluncurkan aplikasi saya - yang belum dilokalkan (aplikasi saya hanya dalam bahasa Inggris). Saya mengadopsi logika ini:

  1. buat enum untuk membuatnya lebih mudah untuk menangani bahasa dalam array

    enum Language: String {
    
    case none = ""
    case en = "English"
    case fr = "French"
    case it = "Italian"
    
    } // add as many languages you want
  2. buat beberapa ekstensi ke Lokal

    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. Bila perlu, Anda cukup menggunakan ekstensi

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

Terima kasih @Syscall :)
Miniapps

Suka ekstensi :). Tidakkah lebih masuk akal jika tidak dapat membaca dengan cara apa pun. karena dengan cara itu nilai itu dapat digunakan untuk membuat nilai.
Alix

5

Di Swift, Anda bisa menggunakan lokal.

let locale = Locale.current.identifier

2

Locale.current.languageCode mengembalikan saya kode yang salah, jadi saya menggunakan ekstensi ini:

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

Inilah yang saya gunakan di Swift 5 Xcode 11:

Di dalam variabel kelas:

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

Ini muncul sebagai string. Ia mengembalikan 2 karakter, yaitu "en", "es", "de" ...

Dari sini saya dapat dengan mudah menentukan bahasa apa yang akan ditampilkan:

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

Jika Anda ingin informasi lengkap bahasa, maka hapus? .Prefex (2)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.