Adakah yang setara dengan Swift NSLocalizedString(...)
? Dalam Objective-C
, kami biasanya menggunakan:
NSString *string = NSLocalizedString(@"key", @"comment");
Bagaimana saya bisa mencapai hal yang sama di Swift? Saya menemukan fungsi:
func NSLocalizedString(
key: String,
tableName: String? = default,
bundle: NSBundle = default,
value: String = default,
#comment: String) -> String
Namun, ini sangat panjang dan tidak nyaman sama sekali.
ios
swift
localization
nslocalizedstring
RaffAl
sumber
sumber
NSLocalizedString("Cancel", comment: "Cancel button title")
memanfaatkan nilai-nilai default. Nyaman menurut saya.Jawaban:
Saya menggunakan solusi berikutnya:
1) buat ekstensi:
2) dalam file Localizable.strings :
3) contoh penggunaan:
Nikmati! ;)
--upd: -
untuk kasus dengan komentar Anda dapat menggunakan solusi ini:
1) Perpanjangan:
2) dalam file .strings:
3) menggunakan:
sumber
genstrings
utilitas untuk menghasilkan file .strings Anda.func localized(comment: String = "") -> String
sehingga menjadi lebih kecil dan dengan komentar opsional :)genstrings
?genstrings
hanya bekerja pada string literal yang diteruskan ke NSLocalizedString. Dengan solusi cerdas ini, Anda kehilangan kemampuan untuk memperbarui file .strings Anda menggunakangenstrings
alat ini, dan setidaknya bagi saya itu berarti saya tidak akan dapat menggunakan pendekatan yang disederhanakan ini.Yang
NSLocalizedString
ada juga di dunia Swift.The
tableName
,bundle
danvalue
parameter ditandai dengandefault
kata kunci yang berarti kita dapat menghilangkan parameter ini sementara memanggil fungsi. Dalam hal ini, nilai standarnya akan digunakan.Ini mengarah pada kesimpulan bahwa pemanggilan metode dapat disederhanakan menjadi:
Swift 5 - tidak ada perubahan, masih berfungsi seperti itu.
sumber
Wrap in NSLocalizedString
opsi yang membuat semuanya sangat mudah dengan hanya menyorot teks, mengklik kanan, dan memilih item menu.Variasi dari jawaban yang ada:
Swift 5.1:
Anda kemudian dapat menggunakannya dengan atau tanpa komentar:
Harap dicatat bahwa
genstrings
tidak akan berfungsi dengan solusi ini.sumber
Dengan menggunakan cara ini, dimungkinkan untuk membuat implementasi yang berbeda untuk tipe yang berbeda (yaitu kelas Int atau khusus seperti CurrencyUnit, ...). Anda juga dapat memindai metode ini dengan menggunakan utilitas genstrings. Cukup tambahkan bendera rutin ke perintah
perpanjangan:
pemakaian:
sumber
Versi Swift 3:) ...
sumber
Sebenarnya, Anda dapat menggunakan dua fase untuk menerjemahkan teks Anda di proyek Swift:
1) Fase pertama menggunakan cara lama untuk membuat semua string Anda yang dapat diterjemahkan:
1.1) Maka Anda harus menggunakan genstring untuk menghasilkan Localizable.strings:
2) Setelah itu, Anda harus menggunakan jawaban ini .
2.1) Gunakan opsi "Temukan dan Ganti" XCode Anda berdasarkan ekspresi reguler. Adapun contoh yang diberikan (jika Anda tidak memiliki komentar) ekspresi regulernya adalah:
dan ganti dengan
atau (jika Anda memiliki komentar)
dan ganti dengan
Anda bebas bermain dengan regex dan kombinasi ekstensi yang berbeda sesuai keinginan. Cara umumnya adalah memecah seluruh proses menjadi dua fase. Semoga itu bisa membantu.
sumber
NSLocalizedString("Cancel", comment: "Cancel button title")
?NSLocalizedString
terlihat kurang Swiftier, daripada seharusnya.String.localized
di sisi lain terlihat lebih Swifty tetapi Anda tidak dapat menggunakangesntrings
utilitas dengan yang biasa digunakan untuk memudahkan pekerjaan Anda dengan internasionalisasi. Maksud saya adalah cukup mudah untuk menggabungkan kedua pendekatan. Jadi terutama itu adalah masalah keterbacaan.genstrings
? Apakah Anda mengganti kembali semua.localized
olehNSLocalizedString
?Dibuat metode pembantu kecil untuk kasus, di mana "komentar" selalu diabaikan. Lebih sedikit kode lebih mudah dibaca:
Letakkan di mana saja (di luar kelas) dan Xcode akan menemukan metode global ini.
sumber
Mungkin cara terbaik adalah satu ini di sini .
dan
Anda dapat menggunakannya seperti ini
bagi saya ini adalah yang terbaik karena
sumber
static var Hello: String = { return NSLocalizedString("Hello") }
Ketika Anda sedang mengembangkan SDK. Anda perlu beberapa operasi tambahan.
1) buat Localizable.strings seperti biasa di YourLocalizeDemoSDK.
2) buat Localizable.strings yang sama di YourLocalizeDemo.
3) temukan Bundle Path Anda dari YourLocalizeDemoSDK.
Swift4 :
Bundle(for: type(of: self))
membantu Anda menemukan bundel di YourLocalizeDemoSDK. Jika Anda menggunakanBundle.main
sebagai gantinya, Anda akan mendapatkan nilai yang salah (sebenarnya string itu akan sama dengan kunci).Tetapi jika Anda ingin menggunakan ekstensi String yang disebutkan oleh dr OX . Anda perlu melakukan lebih banyak lagi. Ekstensi asal terlihat seperti ini.
Seperti yang kita ketahui, kami sedang mengembangkan SDK,
Bundle.main
akan mendapatkan bundel bundel YourLocalizeDemo. Bukan itu yang kita inginkan. Kami membutuhkan bundel di YourLocalizeDemoSDK. Ini adalah trik untuk menemukannya dengan cepat.Jalankan kode di bawah ini dalam instance NSObject di YourLocalizeDemoSDK. Dan Anda akan mendapatkan URL YourLocalizeDemoSDK.
Cetak kedua url, Anda akan menemukan bahwa kita dapat membangun bundleURLofSDK berdasarkan mainBundleURL. Dalam hal ini, itu akan menjadi:
Dan ekstensi String akan menjadi:
Semoga ini bisa membantu.
sumber
Saya telah membuat semacam alat alat pstring untuk mengekstraksi string menggunakan fungsi terjemahan khusus
https://gist.github.com/Maxdw/e9e89af731ae6c6b8d85f5fa60ba848c
Ini akan mem-parsing semua file cepat Anda dan mengekspor string dan komentar dalam kode Anda ke file .strings
Mungkin bukan cara termudah untuk melakukannya, tetapi itu mungkin.
sumber
Meskipun ini tidak menjawab masalah pemendekan, tetapi ini membantu saya untuk mengatur pesan, saya membuat struktur untuk pesan kesalahan seperti di bawah ini
Dengan cara ini Anda dapat mengatur pesan dan membuat genstring berfungsi.
Dan ini adalah perintah genstring yang digunakan
sumber
Bermanfaat untuk penggunaan dalam unit test:
Ini adalah versi sederhana yang dapat diperluas ke berbagai kasus penggunaan (misalnya dengan penggunaan tableNames).
Gunakan seperti ini:
Atau suka ini dengan komentar:
sumber
Ini merupakan peningkatan pada pendekatan ".localized". Mulailah dengan menambahkan ekstensi kelas karena ini akan membantu dengan string apa pun yang Anda atur secara terprogram:
Contoh penggunaan untuk string yang Anda atur secara pemrograman:
Sekarang file terjemahan storyboard Xcode membuat pengelola file berantakan dan juga tidak menangani pembaruan storyboard dengan baik. Pendekatan yang lebih baik adalah membuat kelas label dasar baru dan menetapkannya untuk semua label papan cerita Anda:
Sekarang setiap label yang Anda tambahkan dan berikan default default untuk di storyboard akan secara otomatis diterjemahkan, dengan asumsi Anda telah menyediakan terjemahan untuk itu.
Anda dapat melakukan hal yang sama untuk UIButton:
sumber
Ketika Anda menerjemahkan, katakanlah dari bahasa Inggris, di mana frasa sama, ke bahasa lain di mana berbeda (karena jenis kelamin, konjugasi kata kerja atau kemerosotan) bentuk NSString paling sederhana di Swift yang berfungsi dalam semua kasus adalah tiga argumen satu . Misalnya, frasa bahasa Inggris "sebelumnya adalah", diterjemahkan secara berbeda ke bahasa Rusia untuk kasus "berat" ("предыдущ ий был") dan untuk "pinggang" ("предыдущ ая был а ").
Dalam hal ini Anda memerlukan dua terjemahan berbeda untuk satu Sumber (dalam hal alat XLIFF direkomendasikan dalam WWDC 2018). Anda tidak dapat mencapainya dengan dua argumen NSLocalizedString, di mana "sebelumnya" akan sama untuk "kunci" dan terjemahan bahasa Inggris (yaitu untuk nilainya). Satu-satunya cara adalah menggunakan bentuk argumen tiga
di mana kunci ("beforeWasFeminine" dan "priorWasMasculine") berbeda.
Saya tahu bahwa saran umum adalah menerjemahkan frasa sebagai keseluruhan, namun terkadang terlalu memakan waktu dan merepotkan.
sumber
Lokalisasi dengan bahasa default:
sumber