Saya (seperti yang lainnya) gunakan NSLocalizedString
untuk melokalkan aplikasi saya.
Sayangnya, ada beberapa "kelemahan" (belum tentu kesalahan NSLocalizedString itu sendiri), termasuk
- Tidak ada pelengkapan otomatis untuk string di Xcode. Ini membuat pekerjaan tidak hanya rawan kesalahan tetapi juga melelahkan.
- Anda mungkin akhirnya mendefinisikan ulang string hanya karena Anda tidak tahu string yang setara sudah ada (yaitu "Silakan masukkan kata sandi" vs. "Masukkan kata sandi terlebih dahulu")
- Mirip dengan masalah pelengkapan otomatis, Anda harus "mengingat" / menyalin string komentar, atau
genstring
akan berakhir dengan beberapa komentar untuk satu string - Jika Anda ingin menggunakan
genstring
setelah Anda telah melokalisasi beberapa string, Anda harus berhati-hati untuk tidak kehilangan pelokalan lama Anda. - String yang sama tersebar di seluruh proyek Anda. Misalnya, Anda menggunakan di
NSLocalizedString(@"Abort", @"Cancel action")
mana-mana, dan kemudian Peninjauan Kode meminta Anda untuk mengganti nama stringNSLocalizedString(@"Cancel", @"Cancel action")
agar kode lebih konsisten.
Apa yang saya lakukan (dan setelah beberapa pencarian di SO saya pikir banyak orang melakukan ini) adalah memiliki strings.h
file terpisah di mana saya #define
semua kode-localize. Sebagai contoh
// In strings.h
#define NSLS_COMMON_CANCEL NSLocalizedString(@"Cancel", nil)
// Somewhere else
NSLog(@"%@", NSLS_COMMON_CANCEL);
Ini pada dasarnya menyediakan penyelesaian kode, satu tempat untuk mengubah nama variabel (jadi tidak perlu lagi membuat genstring), dan kata kunci unik untuk auto-refactor. Namun, ini datang dengan biaya berakhir dengan sejumlah #define
pernyataan yang tidak terstruktur secara inheren (yaitu seperti LocString.Common.Cancel atau sesuatu seperti itu).
Jadi, sementara ini bekerja agak baik, saya bertanya-tanya bagaimana kalian melakukannya dalam proyek Anda. Apakah ada pendekatan lain untuk menyederhanakan penggunaan NSLocalizedString? Apakah mungkin ada kerangka kerja yang merangkumnya?
Jawaban:
NSLocalizedString
memiliki beberapa batasan, tetapi sangat penting bagi Cocoa sehingga tidak masuk akal untuk menulis kode khusus untuk menangani pelokalan, yang berarti Anda harus menggunakannya. Yang mengatakan, sedikit perkakas dapat membantu, inilah cara saya melanjutkan:Memperbarui file string
genstrings
menimpa file string Anda, membuang semua terjemahan Anda sebelumnya. Saya menulis update_strings.py untuk mem-parsing file string lama, jalankangenstrings
dan isi yang kosong sehingga Anda tidak harus secara manual mengembalikan terjemahan yang ada. Script mencoba untuk mencocokkan file string yang ada sedekat mungkin untuk menghindari perbedaan yang terlalu besar saat memperbaruinya.Memberi nama string Anda
Jika Anda menggunakan
NSLocalizedString
seperti yang diiklankan:Anda mungkin akhirnya mendefinisikan string yang sama di bagian lain dari kode Anda, yang mungkin bertentangan dengan istilah bahasa Inggris yang sama mungkin memiliki arti yang berbeda dalam konteks yang berbeda (
OK
danCancel
terlintas dalam pikiran). Itulah sebabnya saya selalu menggunakan string all-caps yang tidak berarti dengan awalan khusus modul, dan deskripsi yang sangat tepat:Menggunakan string yang sama di tempat yang berbeda
Jika Anda menggunakan string yang sama beberapa kali, Anda bisa menggunakan makro seperti yang Anda lakukan, atau cache itu sebagai variabel instan di pengontrol tampilan Anda atau sumber data Anda. Dengan cara ini Anda tidak perlu mengulang deskripsi yang mungkin menjadi basi dan menjadi tidak konsisten di antara contoh lokalisasi yang sama, yang selalu membingungkan. Karena variabel instan adalah simbol, Anda akan dapat menggunakan pelengkapan otomatis pada terjemahan yang paling umum ini, dan menggunakan string "manual" untuk yang spesifik, yang hanya akan terjadi sekali saja.
Saya harap Anda akan lebih produktif dengan lokalisasi Kakao dengan tips ini!
sumber
genstrings
tidakgestring
.Sedangkan untuk pelengkapan otomatis untuk string di Xcode, Anda dapat mencoba https://github.com/questbeat/Lin .
sumber
Setuju dengan ndfred, tetapi saya ingin menambahkan ini:
Parameter kedua dapat digunakan sebagai ... nilai default !!
(NSLocalizedStringWithDefaultValue tidak bekerja dengan benar dengan genstring, itu sebabnya saya mengusulkan solusi ini)
Berikut ini adalah implementasi Kustom saya yang menggunakan NSLocalizedString yang menggunakan komentar sebagai nilai default:
1. Di tajuk yang dikompilasi sebelumnya (file .pch), tentukan ulang makro 'NSLocalizedString':
2. membuat kelas untuk mengimplementasikan penangan lokalisasi
3. Gunakan itu!
Pastikan Anda menambahkan skrip Run di App Build Phases Anda sehingga file Localizable.strings Anda akan diperbarui di setiap build, yaitu, string terlokalisasi baru akan ditambahkan dalam file Localized.strings Anda:
Skrip fase pembuatan saya adalah skrip shell:
Jadi, ketika Anda menambahkan baris baru ini dalam kode Anda:
Kemudian lakukan build, file ./Localizable.scripts Anda akan berisi baris baru ini:
Dan karena kunci == nilai untuk 'view_settings_title', custom LocalizedStringHandler akan mengembalikan komentar, yaitu 'Pengaturan "
Voa :-)
sumber
Di Swift saya menggunakan yang berikut ini, misalnya untuk tombol "Ya" dalam hal ini:
Perhatikan penggunaan
value:
untuk nilai teks default. Parameter pertama berfungsi sebagai ID terjemahan. Keuntungan menggunakanvalue:
parameter adalah teks default dapat diubah kemudian tetapi ID terjemahannya tetap sama. File Localizable.strings akan berisi"btn_yes" = "Yes";
Jika
value:
parameter tidak digunakan maka parameter pertama akan digunakan untuk keduanya: untuk ID terjemahan dan juga untuk nilai teks default. File Localizable.strings akan berisi"Yes" = "Yes";
. Jenis pengelolaan file pelokalan ini tampaknya aneh. Apalagi jika teks yang diterjemahkan panjang maka ID juga panjang. Kapan pun karakter nilai teks standar diubah, maka ID terjemahan juga akan berubah. Ini mengarah ke masalah ketika sistem terjemahan eksternal digunakan. Mengubah ID terjemahan dipahami sebagai menambahkan teks terjemahan baru, yang mungkin tidak selalu diinginkan.sumber
Saya menulis sebuah skrip untuk membantu menjaga Localizable.strings dalam berbagai bahasa. Meskipun tidak membantu dalam pelengkapan otomatis, membantu menggabungkan file .strings menggunakan perintah:
Untuk info lebih lanjut, lihat: https://github.com/hiroshi/merge_strings
Beberapa dari Anda merasa bermanfaat, saya harap.
sumber
Jika ada yang mencari solusi Swift. Anda mungkin ingin memeriksa solusi yang saya buat di sini: SwiftyLocalization
Dengan beberapa langkah untuk menyiapkan, Anda akan memiliki pelokalan yang sangat fleksibel di Google Spreadsheet (komentar, warna kustom, sorot, font, beberapa lembar, dan banyak lagi).
Singkatnya, langkah-langkahnya adalah: Google Spreadsheet -> file CSV -> Localizable.strings
Selain itu, itu juga menghasilkan Localizables.swift, sebuah struct yang bertindak seperti antarmuka untuk pengambilan kunci & decoding untuk Anda (Anda harus secara manual menentukan cara untuk memecahkan kode String dari kunci sekalipun).
Kenapa ini bagus?
Meskipun ada alat yang dapat melengkapi secara otomatis kunci Anda yang dapat dilokalkan. Referensi ke variabel nyata akan memastikan bahwa itu selalu merupakan kunci yang valid, kalau tidak itu tidak akan dikompilasi.
Proyek ini menggunakan Google App Script untuk mengonversi Sheets -> CSV, dan script Python untuk mengonversi file CSV -> Localizable.strings Anda dapat melihat sekilas lembar contoh ini untuk mengetahui apa yang mungkin.
sumber
dengan iOS 7 & Xcode 5, Anda harus menghindari menggunakan metode 'Localization.strings', dan menggunakan metode 'lokalisasi basis' baru. Ada beberapa tutorial di sekitar Anda jika Anda mencari 'basis lokalisasi'
Apple doc: Pelokalan basis
sumber
sumber
Saya sendiri, saya sering terbawa dengan pengkodean, lupa untuk memasukkan entri ke dalam file .strings. Jadi saya punya skrip pembantu untuk menemukan apa yang harus saya kembalikan ke file .strings dan terjemahkan.
Ketika saya menggunakan makro saya sendiri di atas NSLocalizedString, tinjau dan perbarui skrip sebelum menggunakan seperti yang saya asumsikan untuk kesederhanaan bahwa nil digunakan sebagai param kedua untuk NSLocalizedString. Bagian yang ingin Anda ubah adalah
Ganti saja dengan sesuatu yang cocok dengan penggunaan makro dan NSLocalizedString Anda.
Inilah skripnya, Anda hanya perlu Bagian 3 saja. Sisanya adalah untuk melihat lebih mudah dari mana semua itu berasal:
File output berisi kunci yang ditemukan dalam kode, tetapi tidak di file Localizable.strings. Berikut ini contohnya:
Tentu saja bisa dipoles lebih banyak, tetapi saya pikir saya akan berbagi.
sumber