Saya ingin menunjukkan bahasa saat ini yang menggunakan perangkat UI. Kode apa yang akan saya gunakan?
Saya ingin ini sebagai NSString
format yang sepenuhnya dijabarkan. (Bukan @ "en_US")
EDIT: Bagi mereka yang mengemudi, ada satu ton komentar yang berguna di sini, karena jawabannya telah berevolusi dengan rilis iOS baru.
ios
objective-c
cocoa-touch
nslocale
Moshe
sumber
sumber
NSLocale
. Lihat jawaban saya.[NSLocale preferredLanguages]
. dulu dipisahkan oleh garis bawah (misalnyaen_US
), tapi sekarang diubah menjadi tanda hubung:en-US
NSLocale
memiliki metodecomponentsFromLocaleIdentifier:
danlocaleIdentifierFromComponents:
yang mungkin merupakan cara yang tepat untuk menangani format (berpotensi dapat diubah).Jawaban:
Solusi yang diberikan sebenarnya akan mengembalikan wilayah perangkat saat ini - bukan bahasa yang saat ini dipilih. Ini sering satu dan sama. Namun, jika saya berada di Amerika Utara dan saya mengatur bahasa saya ke Jepang, wilayah saya masih akan bahasa Inggris (Amerika Serikat). Untuk mengambil bahasa yang saat ini dipilih, Anda dapat melakukan:
Ini akan mengembalikan kode dua huruf untuk bahasa yang saat ini dipilih. "id" untuk bahasa Inggris, "es" untuk bahasa Spanyol, "de" untuk bahasa Jerman, dll. Untuk lebih banyak contoh, silakan lihat entri Wikipedia ini (khususnya, kolom 639-1):
Daftar kode ISO 639-1
Maka itu adalah masalah sederhana mengkonversi dua kode huruf ke string yang ingin Anda tampilkan. Jadi jika "en", tampilkan "Bahasa Inggris".
Semoga ini bisa membantu seseorang yang ingin membedakan antara wilayah dan bahasa yang saat ini dipilih.
EDIT
Layak untuk mengutip informasi header dari NSLocale.h:
Orang-orang yang tertarik dengan bahasa aplikasi melihat jawaban @ mindvision
sumber
NSLocale preferredLanguages
berubah. Jika sebelum Anda hanya mendapatkan "en", di iOS 9 Anda akan mendapatkan "en-US" atau "en-JP", dll. Referensi: happyteamlabs.com/blog/…Jawaban yang dipilih mengembalikan bahasa perangkat saat ini, tetapi bukan bahasa sebenarnya yang digunakan dalam aplikasi. Jika Anda tidak memberikan pelokalan dalam aplikasi Anda untuk bahasa pilihan pengguna, pelokalan pertama yang tersedia, dipesan berdasarkan pesanan yang disukai pengguna, digunakan.
Untuk menemukan bahasa saat ini yang dipilih dalam pelokalan Anda, gunakan
Contoh:
Cepat:
sumber
Solusi untuk iOS 9:
language = "en-US"
languageDic akan memiliki komponen yang dibutuhkan
countryCode = "AS"
languageCode = "en"
sumber
Ini mungkin akan memberi Anda apa yang Anda inginkan:
Ini akan menampilkan nama bahasa, dalam bahasa itu sendiri. Sebagai contoh:
sumber
Jawaban yang diterima, dan jawaban lainnya tidak memperhitungkan bahwa bahasa yang dipilih dapat berupa bahasa lain dari bahasa perangkat .
Bahasa perangkat adalah bahasa tempat elemen sistem operasi dan aplikasi Apple disajikan.
Bahasa yang disukai adalah bahasa yang ingin dilokalisasi oleh pengguna. Apple hanya menyediakan serangkaian terjemahan terbatas. Jika bahasa yang disukai adalah satu bahasa yang diterjemahkan Apple ke aplikasi mereka, itu juga akan menjadi bahasa perangkat. Namun jika pengguna lebih memilih bahasa yang Apple tidak menyediakan terjemahan, perangkat dan bahasa pilihan tidak akan cocok . Bahasa perangkat tidak akan berada di posisi pertama dalam daftar bahasa yang disukai.
Fungsi berikut akan melalui daftar bahasa yang disukai dan memeriksa apakah ada terjemahan dalam kerangka kerja Apple. Bahasa pertama yang memiliki terjemahan adalah bahasa perangkat. Fungsi akan mengembalikan kode bahasanya.
Ini berfungsi jika daftar bahasa yang disukai adalah:
Daftar bahasa yang disukai dapat diedit di : Settings.app -> Umum -> Bahasa & Wilayah -> Urutan Bahasa Pilihan
Anda dapat menggunakan kode bahasa perangkat dan menerjemahkannya ke nama bahasa. Baris berikut akan mencetak bahasa perangkat dalam bahasa perangkat. Misalnya "Español" jika perangkat diatur ke bahasa Spanyol.
sumber
NSBundle(forClass: UIView.self)
Anda dengan Anda mencoba memberikan bahasa yang paling spesifik untuk tampilan yang diberikan. Namun, menggunakan ini saya mengalami masalah di mana untuk kelas yang diberikan bahasa tidak dikembalikan. Saya mengubah inisialisasi keNSBundle.mainBundle()
dan mengembalikan kode bahasa yang diharapkan.mainBundle()
muncul menjadi salah satu yang direkomendasikan oleh Apple seperti yang disarankan di header untukNSLocale
,// note that this list does not indicate what language the app is actually running in; the [NSBundle mainBundle] object determines that at launch and knows that information
.NSBundle.mainBundle()
mengembalikan bundel aplikasi Anda, sedangkanNSBundle(forClass: UIView.self)
mengembalikan bundel sistem UIKit. metode yang dijelaskan mencari direktori dalam bundel. bundel aplikasi Anda hanya akan berisi yang untuk bahasa yang ingin Anda pelokalkan. untuk menentukan bahasa perangkat Anda perlu memeriksa bundel sistem.NSLocale.preferredLanguages()
. saya memperbarui jawaban untuk mendukung iOS 9 .saya menggunakan ini
abaikan kebocoran memori ..
dan hasilnya
sumber
Menerjemahkan kode bahasa seperti en_US ke bahasa Inggris (Amerika Serikat) adalah fitur bawaan
NSLocale
danNSLocale
tidak peduli dari mana Anda mendapatkan kode bahasa tersebut. Jadi tidak ada alasan untuk menerapkan terjemahan Anda sendiri seperti yang disarankan oleh jawaban yang diterima.Cetakan: Bahasa Inggris, Jerman, Swedia
sumber
Bahkan ada cara yang lebih baik untuk mendapatkan bahasa perangkat saat ini. Mari kita coba dengan kode di bawah ini -
Disarankan oleh Abizern di sini
sumber
Anda dapat menggunakan
displayNameForKey:value:
metodeNSLocale
:Ini akan mencetak:
Jika Anda menentukan pengidentifikasi lokal yang sama untuk
initWithLocaleIdentifier:
dan jugadisplayNameForKey:value:
metode, maka itu akan memberi Anda nama asli bahasa tersebut. Saya telah menemukan bahwa jika Anda menghapus kode negara dan menggunakan hanyafr
danen
, itu juga akan menghilangkan negara dari nama tampilan (setidaknya pada Mac OS X, tidak yakin tentang iOS).sumber
Cepat
Untuk mendapatkan bahasa perangkat saat ini
Untuk mendapatkan bahasa aplikasi
catatan:
Itu mengambil bahasa yang Anda berikan di CFBundleDevelopmentRegion of info.plist
jika CFBundleAllowMixedLocalizations benar di info.plist maka item pertama CFBundleLocalizations di info.plist dikembalikan
sumber
Saya mencoba mencari solusi yang tepat untuk diri saya sendiri. Ketika saya menggunakan
Locale.preferredLanguages.first
dikembalikan bahasa yang disukai dari pengaturan aplikasi Anda.Jika Anda ingin mengenal bahasa dari pengaturan perangkat pengguna, Anda harus menggunakan string di bawah ini:
Cepat 3
Untuk membuka dan menggunakan, lihat baris di bawah ini:
sumber
Untuk mendapatkan bahasa pengguna perangkat saat ini, gunakan kode berikut yang berfungsi untuk saya.
sumber
iOS13, Swift 5+, WWDC2019 https://developer.apple.com/videos/play/wwdc2019/403/
Pengguna dapat memilih bahasa aplikasi yang dipilih secara independen dari bahasa OS.
Anda dapat menggunakan ini:
sumber
Untuk pengembang MonoTouch C # gunakan:
Catatan: Saya tahu ini adalah pertanyaan iOS, tetapi karena saya adalah pengembang MonoTouch, jawaban pada halaman ini mengarahkan saya ke arah yang benar dan saya pikir saya akan membagikan hasilnya.
sumber
Dalam
Swift
:sumber
Cepat 3
sumber
Fungsi Swift 3 sederhana:
sumber
Jika Anda mencari kode bahasa pilihan ("en", "de", "es" ...), dan nama bahasa pilihan lokal (untuk lokal saat ini), berikut ini adalah ekstensi sederhana di Swift:
}
sumber
sumber
Jika Anda hanya ingin mendapatkan bahasa di sini adalah jawaban yang disarankan:
Dalam kasus saya, saya hanya ingin hanya bahasa Lokal bukan wilayah lokal.
Output: Jika bahasa Lokal Anda adalah bahasa Jepang dan wilayah lokal adalah Jepang maka:
langplusreg = ja-JP
langonly = ja
sumber
@amir respons di Swift:
sumber
Jelas, solusinya mengandalkan, misalnya, pada
biasanya berfungsi dengan baik dan mengembalikan bahasa perangkat saat ini.
Tetapi dalam beberapa kasus bisa menyesatkan:
Jika aplikasi tempat Anda ingin mendapatkan nilai ini telah mengubah bahasa, misalnya dengan kode jenis ini:
Dalam hal ini, [NSLocale preferLanguages] sebenarnya mengembalikan set bahasa yang disukai (dan digunakan) dalam aplikasi khusus ini, bukan bahasa perangkat saat ini!
Dan ... dalam hal ini satu-satunya cara untuk mendapatkan bahasa perangkat saat ini dengan benar (dan bukan yang sebelumnya diatur dalam aplikasi), adalah dengan terlebih dahulu menghapus kunci @ "appleLanguages" di NSUserDefaults, seperti ini:
Kemudian, [NSLocale preferLanguages] sekarang mengembalikan nilai yang benar.
Semoga bantuan ini.
sumber
Jawaban yang diperbarui untuk Swift 4
sumber
NSLocale.preferredLanguages
harus mengembalikan yang disukai pengguna tanpa memperhatikan apa yang didukung oleh bundel.Untuk Swift 3.0 kode di bawah ini dapat digunakan untuk menjawab pertanyaan Anda:
sumber
Di Swift 4.2 dan Xcode 10.1
sumber
Menurut dokumentasi Apple
sumber
Format dua huruf. Apple menggunakan standar ISO ISO-3166 .
sumber
Untuk Swift 3:
NSLocale.preferredLanguages [0] sebagai String
sumber
Pada iOS 9, jika Anda hanya ingin kode bahasa tanpa kode negara, Anda akan menginginkan fungsi pembantu semacam ini - karena bahasa tersebut akan berisi kode negara.
sumber
SWIFT-4
sumber
NSLocale.preferredLanguages
harus mengembalikan yang disukai pengguna tanpa memperhatikan apa yang didukung oleh bundel.