Di iPhone NSLocalizedString
mengembalikan string dalam bahasa iPhone. Apakah mungkin untuk memaksa NSLocalizedString
menggunakan bahasa tertentu agar aplikasi dalam bahasa yang berbeda dari perangkat?
263
Di iPhone NSLocalizedString
mengembalikan string dalam bahasa iPhone. Apakah mungkin untuk memaksa NSLocalizedString
menggunakan bahasa tertentu agar aplikasi dalam bahasa yang berbeda dari perangkat?
Jawaban:
NSLocalizedString()
(dan variasinya) mengakses kunci "AppleLanguages"NSUserDefaults
untuk menentukan pengaturan pengguna untuk bahasa yang diinginkan. Ini mengembalikan array kode bahasa, dengan yang pertama ditetapkan oleh pengguna untuk telepon mereka, dan yang berikutnya digunakan sebagai cadangan jika sumber daya tidak tersedia dalam bahasa yang disukai. (pada desktop, pengguna dapat menentukan beberapa bahasa dengan pemesanan khusus di System Preferences)Anda dapat mengganti pengaturan global untuk aplikasi Anda sendiri jika ingin menggunakan metode setObject: forKey: untuk mengatur daftar bahasa Anda sendiri. Ini akan diutamakan daripada nilai yang ditetapkan secara global dan dikembalikan ke kode apa pun dalam aplikasi Anda yang melakukan pelokalan. Kode untuk ini akan terlihat seperti:
Ini akan menjadikan Jerman bahasa pilihan untuk aplikasi Anda, dengan bahasa Inggris dan Prancis sebagai mundur. Anda ingin memanggil ini di awal startup aplikasi Anda. Anda dapat membaca lebih lanjut tentang preferensi bahasa / lokal di sini: Topik Pemrograman Internasionalisasi: Mendapatkan Bahasa dan Lokal Saat Ini
sumber
Saya memiliki masalah yang sama baru-baru ini dan saya tidak ingin memulai dan menambal seluruh NSLocalizedString atau memaksa aplikasi untuk memulai kembali agar bahasa baru berfungsi. Saya ingin semuanya berjalan apa adanya.
Solusi saya adalah mengubah kelas bundel utama secara dinamis dan memuat bundel yang sesuai di sana:
File tajuk
Penerapan
Jadi pada dasarnya, ketika aplikasi Anda mulai dan sebelum Anda memuat controller pertama Anda, cukup hubungi:
Ketika pengguna Anda mengubah bahasa pilihannya di layar pengaturan Anda, cukup panggil lagi:
Untuk mengatur ulang ke default sistem, cukup lewati nol:
Nikmati...
Bagi mereka yang membutuhkan versi Swift:
sumber
Saya biasanya melakukan ini dengan cara ini, tetapi Anda HARUS memiliki semua file pelokalan dalam proyek Anda.
sumber
Jangan gunakan di iOS 9. Ini mengembalikan nol untuk semua string melewatinya.
Saya telah menemukan solusi lain yang memungkinkan Anda untuk memperbarui string bahasa, tanpa memulai ulang aplikasi dan kompatibel dengan genstrings:
Letakkan makro ini di Prefix.pch:
dan di mana pun Anda membutuhkan penggunaan string lokal:
Untuk mengatur penggunaan bahasa:
Bekerja bahkan dengan hopping bahasa berurutan seperti:
sumber
Seperti yang dikatakan sebelumnya, lakukan saja:
Tetapi untuk menghindari keharusan me-restart aplikasi, letakkan baris pada metode utama
main.m
, sesaat sebelumUIApplicationMain
(...).sumber
NSAutoreleasePool * pool ..
atau beberapa objek autoreleased akan bocor.[[NSBundle mainBundle] URLForResource:withExtension:]
sebelumnya.Trik untuk menggunakan bahasa tertentu dengan memilihnya dari aplikasi adalah memaksa
NSLocalizedString
untuk menggunakan bundel tertentu tergantung pada bahasa yang dipilih,di sini adalah posting yang telah saya tulis untuk lokalisasi muka pembelajaran ini di aplikasi ios
dan di sini adalah kode satu contoh lokalisasi muka aplikasi di aplikasi ios
sumber
Apa pendapat Anda tentang solusi ini untuk Swift 3?
Penggunaan sederhana:
sumber
Seperti yang disebutkan Brian Webster, bahasa perlu diatur "kapan saja lebih awal dalam startup aplikasi Anda". Saya pikir
applicationDidFinishLaunching:
dariAppDelegate
seharusnya menjadi tempat yang cocok untuk melakukannya, karena itu di mana aku melakukan semua inisialisasi lainnya.Tetapi seperti yang disebutkan oleh William Denniss, itu tampaknya memiliki efek hanya setelah aplikasi di-restart, yang agak tidak berguna.
Tampaknya berfungsi dengan baik jika saya meletakkan kode di fungsi utama, meskipun:
Saya menghargai komentar ini.
sumber
[[NSUserDefaults standardUserDefaults] synchronize];
setelah meneleponsetObject:forKey:
Saya suka metode terbaik Mauro Delrio. Saya juga telah menambahkan yang berikut ini di Project_Prefix.pch saya
Jadi jika Anda ingin menggunakan metode standar (yang menggunakan NSLocalizedString), Anda dapat membuat substitusi sintaksis cepat di semua file.
sumber
NSLocalizedString()
membaca nilai untuk kunciAppleLanguages
dari standar pengguna standar ([NSUserDefaults standardUserDefaults]
). Ini menggunakan nilai itu untuk memilih lokalisasi yang tepat di antara semua lokalisasi yang ada saat runtime. Ketika Apple membuat kamus default pengguna saat peluncuran aplikasi, mereka mencari kunci bahasa yang disukai dalam preferensi sistem dan menyalin nilainya dari sana. Ini juga menjelaskan misalnya mengapa mengubah pengaturan bahasa di OS X tidak berpengaruh pada menjalankan aplikasi, hanya pada aplikasi yang dimulai setelahnya. Setelah disalin, nilainya tidak diperbarui hanya karena pengaturannya berubah. Itu sebabnya iOS memulai ulang semua aplikasi jika Anda mengubah bahasa.Namun, semua nilai kamus default pengguna dapat ditimpa oleh argumen baris perintah. Lihat
NSUserDefaults
dokumentasi diNSArgumentDomain
. Ini bahkan termasuk nilai-nilai yang diambil dari file preferensi aplikasi (.plist). Ini sangat bagus untuk diketahui jika Anda ingin mengubah nilai hanya sekali untuk pengujian .Jadi jika Anda ingin mengubah bahasa hanya untuk pengujian, Anda mungkin tidak ingin mengubah kode Anda (jika Anda lupa untuk menghapus kode ini nanti ...), alih-alih minta Xcode untuk memulai aplikasi Anda dengan parameter baris perintah ( mis. gunakan lokalisasi bahasa Spanyol):
Tidak perlu menyentuh kode Anda sama sekali. Cukup buat skema yang berbeda untuk bahasa yang berbeda dan Anda dapat dengan cepat memulai aplikasi sekali dalam satu bahasa dan sekali dalam yang lain hanya dengan mengganti skema.
sumber
Options
seperti halnya dengan versi Xcode yang lebih baru yang ditawarkan Apple yang demikian juga.Saya datang dengan solusi yang memungkinkan Anda untuk menggunakannya
NSLocalizedString
. Saya membuat kategoriNSBundle
panggilanNSBundle+RunTimeLanguage
. Antarmuka seperti ini.Implementasinya seperti ini.
Daripada hanya menambahkan impor
NSBundle+RunTimeLanguage.h
ke file yang digunakanNSLocalizedString
.Seperti yang Anda lihat, saya menyimpan kode bahasa saya di properti
AppDelegate
. Ini dapat disimpan di mana saja yang Anda inginkan.Satu-satunya hal yang saya tidak suka tentang ini adalah Peringatan yang
NSLocalizedString
didefinisikan ulang marco. Mungkin seseorang dapat membantu saya memperbaiki bagian ini.sumber
#undef NSLocalizedString
sesaat sebelum#define
menonaktifkan peringatanVersi Swift:
sumber
Singkatnya:
Lokalkan aplikasi Anda
Ini hal pertama yang harus Anda lakukan adalah melokalkan aplikasi Anda dengan setidaknya dua bahasa (Inggris dan Perancis dalam contoh ini).
Ganti NSLocalizedString
Dalam kode Anda, alih-alih menggunakan
NSLocalizedString(key, comment)
, gunakan makro yangMYLocalizedString(key, comment)
ditentukan seperti ini:#define MYLocalizedString(key, comment) [[MYLocalizationSystem sharedInstance] localizedStringForKey:(key) value:(comment)];
MYLocalizationSystem
Singleton ini akan:Tetapkan bahasa pengguna
Saat pengguna mengubah bahasa aplikasi dalam bahasa Prancis, hubungi
[[MYLocalizationSystem sharedInstance] setLanguage:@"fr"];
Dalam contoh ini metode ini mengatur bundel lokal ke fr.lproj
Kembalikan string yang dilokalkan
Setelah Anda menyetel bundel yang dilokalkan, Anda akan bisa mendapatkan string yang dilokalisasikan darinya dengan metode ini:
Semoga ini bisa membantu Anda.
Anda akan menemukan rincian lebih lanjut dalam artikel ini dari NSWinery.io
sumber
Ekstensi Swift 3:
Pemakaian:
sumber
Dalam file .pch untuk mendefinisikan:
sumber
Mungkin Anda harus melengkapi ini (pada file .pch setelah #import):
sumber
Solusi Swift 3:
Memberi beberapa contoh kode bahasa yang dapat digunakan. Semoga ini membantu
sumber
Anda bisa membangun sub-bundel dengan set string terlokalisasi yang ingin Anda lakukan dengan ini, dan kemudian gunakan
NSLocalizedStringFromTableInBundle()
untuk memuatnya. (Saya berasumsi bahwa ini adalah konten yang terpisah dari lokalisasi UI normal yang mungkin Anda lakukan di aplikasi.)sumber
untuk kasus saya, saya punya dua file terlokalisasi, ja dan en
dan saya ingin memaksanya untuk en jika bahasa pilihan dalam sistem tidak en atau ja
saya akan mengedit file main.m
Saya akan memeriksa apakah pilihan pertama adalah en atau ja, jika tidak maka saya akan mengubah bahasa pilihan kedua menjadi en.
sumber
Anda dapat melakukan sesuatu seperti ini:
sumber
Berdasarkan jawaban Tudorizer untuk mengubah bahasa tanpa meninggalkan atau memulai ulang aplikasi.
Alih-alih makro, gunakan kelas untuk mengakses bahasa pilihan untuk memeriksa apakah ada kode bahasa tertentu.
Di bawah ini adalah kelas yang digunakan untuk mendapatkan bundel bahasa saat ini yang berfungsi untuk iOS 9:
Gunakan kelas di atas untuk referensi file string / gambar / video / dll:
Ubah bahasa in-line seperti di bawah ini atau perbarui metode "changeCurrentLanguage" di kelas di atas untuk mengambil parameter string yang mereferensikan bahasa baru.
sumber
Di swift 4, saya telah menyelesaikannya tanpa perlu me-restart atau menggunakan perpustakaan.
Setelah mencoba banyak opsi, saya menemukan fungsi ini, tempat Anda meneruskan stringToLocalize (dari Localizable.String, file string) yang ingin Anda terjemahkan, dan bahasa tempat Anda ingin menerjemahkannya, dan apa yang dikembalikan adalah nilai untuk String yang Anda miliki di file Strings:
Dengan mempertimbangkan fungsi ini, saya membuat fungsi ini dalam file Swift:
Untuk mengakses dari seluruh aplikasi, dan di setiap string dari ViewControllers lainnya, alih-alih menempatkan:
Saya telah menggantinya dengan
Saya tidak tahu apakah itu cara terbaik, tetapi saya menemukannya sangat sederhana, dan itu bekerja untuk saya, saya harap ini membantu Anda!
sumber
Fungsi ini akan mencoba untuk mendapatkan string terlokalisasi untuk bahasa saat ini dan jika tidak ditemukan itu akan mendapatkannya menggunakan bahasa inggris.
sumber
Saya ingin menambahkan dukungan untuk bahasa yang tidak secara resmi didukung oleh iOS (tidak tercantum di bagian Bahasa di bawah pengaturan sistem). Dengan mengikuti Tutorial Internasionalisasi Apple dan beberapa petunjuk di sini oleh Brian Webster dan geon, saya membuat potongan kode ini (letakkan di main.m):
Ini berfungsi baik untuk Storyboard dan kode NSLocalizedString. Kode ini mengasumsikan bahwa pengguna akan memiliki opsi untuk mengubah bahasa di dalam aplikasi secara manual nanti.
Tentu saja, jangan lupa menambahkan terjemahan Storyboard yang tepat dan terjemahan Localizable.strings (lihat tautan ke halaman Apple di atas untuk mengetahui cara melakukannya).
sumber
Berikut ini adalah solusi yang layak untuk masalah ini, dan tidak memerlukan restart aplikasi.
https://github.com/cmaftuleac/BundleLocalization
Implementasi ini bekerja dengan mengubah di dalam NSBundle. Idenya adalah bahwa Anda menimpa metode localizedStringForKey pada instance objek NSBundle, dan kemudian memanggil metode ini pada bundel berbeda dengan bahasa yang berbeda. Sederhana dan elegan sepenuhnya kompatibel dengan semua jenis sumber daya.
sumber
NSString *path = [[NSBundle mainBundle] pathForResource:lang ofType:@"lproj" ];
apa pun yang Anda semua lakukan, cara terbaik adalah mengambil nama_pendek untuk bahasa yang ditentukan, yaitu: fr, en, nl, de, it, dll ... dan tetapkan hal yang sama ke nilai global.
membuat tampilan pemilih untuk muncul seperti menu drop down (kombinasi tombol pada klik yang mana tampilan pemilih muncul dari bawah dengan daftar bahasa) dan pilih bahasa yang Anda inginkan. biarkan nama pendek disimpan secara internal. buat file .h + .m bernama LocalisedString.
Tetapkan nilai global short_name menjadi sama dengan nilai yang diperoleh di LocalisedString.m. Ketika bahasa yang diperlukan dipilih menetapkan NSBundlePath untuk membuat sub-direktori proyek untuk bahasa yang dibutuhkan. untuk misalnya, nl.proj, en.proj.
Ketika folder proj tertentu dipilih, panggil string yang dilokalisasi untuk bahasa masing-masing dan ubah bahasa secara dinamis.
tidak ada aturan yang dilanggar.
sumber
Untuk Swift Anda dapat mengganti
main.swift
file dan mengatur string UserDefaults di sana sebelum aplikasi Anda berjalan. Dengan cara ini Anda tidak perlu memulai ulang Aplikasi untuk melihat efek yang diinginkan.dipasangkan bersama dengan penghapusan
@UIApplicationMain
diAppDelegate.swift
file Anda .sumber