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.

pengguna3739367
sumber

Jawaban:

185

Dalam Swift 3

let langStr = Locale.current.languageCode
Vadim Motorine
sumber
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]
raed
sumber
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
Bogdan Bystritskiy
sumber
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
37

Dalam Swift 3:

NSLocale.current.languageCode
Mazorati
sumber
35

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

NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode)!
Benknopf
sumber
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.

Ali Ihsan URAL
sumber
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
Bassant Ashraf
sumber
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!
Amr Angry
sumber
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.
    }
Miniapps
sumber
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
yo2bh
sumber
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})
    }
}
ChikabuZ
sumber
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)

Brian M
sumber