Pelokalan di Xamarin.iOS

Dokumen ini mencakup fitur pelokalan iOS SDK dan cara mengaksesnya dengan Xamarin.

Lihat Pengodean Internasionalisasi untuk petunjuk tentang menyertakan set karakter/halaman kode dalam aplikasi yang harus memproses data non-Unicode.

Fitur platform iOS

Bagian ini menjelaskan beberapa fitur pelokalan di iOS. Lewati ke bagian berikutnya untuk melihat kode dan contoh tertentu.

Bahasa

Pengguna memilih bahasa mereka di aplikasi Pengaturan. Pengaturan ini memengaruhi string bahasa dan gambar yang ditampilkan oleh sistem operasi dan di aplikasi.

Untuk menentukan bahasa yang digunakan dalam aplikasi, dapatkan elemen pertama dari NSBundle.MainBundle.PreferredLocalizations:

var lang = NSBundle.MainBundle.PreferredLocalizations[0];

Nilai ini akan menjadi kode bahasa seperti en untuk bahasa Inggris, es untuk Spanyol, ja untuk Bahasa Jepang, dll. Nilai yang dikembalikan dibatasi untuk salah satu pelokalan yang didukung oleh aplikasi (menggunakan aturan fallback untuk menentukan kecocokan terbaik).

Kode aplikasi tidak selalu perlu memeriksa nilai ini - Xamarin dan iOS keduanya menyediakan fitur yang membantu menyediakan string atau sumber daya yang benar secara otomatis untuk bahasa pengguna. Fitur-fitur ini dijelaskan di sisa dokumen ini.

Catatan

Gunakan NSLocale.PreferredLanguages untuk menentukan preferensi bahasa pengguna, terlepas dari pelokalan yang didukung oleh aplikasi. Nilai yang dikembalikan oleh metode ini berubah di iOS 9; lihat Catatan Teknis TN2418 untuk detailnya.

Lokal

Pengguna memilih lokal mereka di aplikasi Pengaturan. Pengaturan ini memengaruhi cara tanggal, waktu, angka, dan mata uang diformat.

Ini memungkinkan pengguna memilih apakah mereka melihat format waktu 12 jam atau 24 jam, apakah pemisah desimal mereka adalah koma atau titik, dan urutan tampilan tanggal, bulan, dan tahun.

Dengan Xamarin, Anda memiliki akses ke kelas iOS Apple (NSNumberFormatter) serta kelas .NET di System.Globalization. Pengembang harus mengevaluasi mana yang lebih cocok dengan kebutuhan mereka, karena ada berbagai fitur yang tersedia di masing-masing. Secara khusus, jika Anda mengambil dan menampilkan harga Pembelian Dalam Aplikasi menggunakan StoreKit, Anda harus menggunakan kelas pemformatan Apple untuk informasi harga yang dikembalikan.

Lokal saat ini dapat dikueri dengan salah satu dari dua cara:

  • NSLocale.CurrentLocale.LocaleIdentifier
  • NSLocale.AutoUpdatingCurrentLocale.LocaleIdentifier

Nilai pertama dapat di-cache oleh sistem operasi dan mungkin tidak selalu mencerminkan lokal yang saat ini dipilih pengguna. Gunakan nilai kedua untuk mendapatkan lokal yang saat ini dipilih.

Catatan

Mono (runtime .NET yang berbasis Xamarin.iOS) dan API iOS Apple tidak mendukung serangkaian kombinasi bahasa/wilayah yang identik. Karena itu, dimungkinkan untuk memilih kombinasi bahasa/wilayah di aplikasi Pengaturan iOS yang tidak memetakan ke nilai yang valid di Mono. Misalnya, mengatur bahasa i Telepon ke bahasa Inggris dan wilayahnya ke Spanyol akan menyebabkan API berikut menghasilkan nilai yang berbeda:

  • CurrentThead.CurrentCulture: en-US (Mono API)
  • CurrentThread.CurrentUICulture: en-US (Mono API)
  • NSLocale.CurrentLocale.LocaleIdentifier: en_ES (Apple API)

Karena Mono menggunakan CurrentThread.CurrentUICulture untuk memilih sumber daya dan CurrentThread.CurrentCulture untuk memformat tanggal dan mata uang, pelokalan berbasis Mono (misalnya, dengan file .resx) mungkin tidak menghasilkan hasil yang diharapkan untuk kombinasi bahasa/wilayah ini. Dalam situasi ini, bergantung pada API Apple untuk melokalisasi seperlunya.

NSCurrentLocaleDidChangeNotification

iOS menghasilkan NSCurrentLocaleDidChangeNotification saat pengguna memperbarui lokal mereka. Aplikasi dapat mendengarkan pemberitahuan ini saat berjalan dan dapat membuat perubahan yang sesuai pada UI.

Dasar-dasar pelokalan di iOS

Fitur iOS berikut mudah dimanfaatkan di Xamarin untuk menyediakan sumber daya yang dilokalkan untuk ditampilkan kepada pengguna. Lihat sampel TaskyL10n untuk melihat cara mengimplementasikan ide-ide ini.

Menentukan bahasa default dan yang didukung di Info.plist

Di Tanya Jawab Teknis QA1828: Cara iOS Menentukan Bahasa Untuk Aplikasi Anda, Apple menjelaskan cara iOS memilih bahasa yang akan digunakan di app. Faktor-faktor berikut memengaruhi bahasa mana yang ditampilkan:

  • Bahasa pilihan pengguna (ditemukan di aplikasi Pengaturan)
  • Pelokalan dibundel dengan aplikasi (folder.lproj)
  • CFBundleDevelopmentRegion (Nilai Info.plist yang menentukan bahasa default untuk aplikasi)
  • CFBundleLocalizations (Array Info.plist menentukan semua pelokalan yang didukung)

Seperti yang ditunjukkan dalam Tanya Jawab Teknis, CFBundleDevelopmentRegion mewakili wilayah dan bahasa default aplikasi. Jika aplikasi tidak secara eksplisit mendukung salah satu bahasa pilihan pengguna, aplikasi akan menggunakan bahasa yang ditentukan oleh bidang ini.

Penting

iOS 11 menerapkan mekanisme pemilihan bahasa ini lebih ketat daripada versi sistem operasi sebelumnya. Karena itu, aplikasi iOS 11 apa pun yang tidak secara eksplisit menyatakan lokalisasi yang didukung - baik dengan menyertakan folder .lproj atau mengatur nilai untuk CFBundleLocalizations - dapat menampilkan bahasa yang berbeda di iOS 11 daripada yang dilakukan di iOS 10.

Jika CFBundleDevelopmentRegion belum ditentukan dalam file Info.plist , alat build Xamarin.iOS saat ini menggunakan nilai en_USdefault . Meskipun ini dapat berubah dalam rilis mendatang, itu berarti bahwa bahasa defaultnya adalah bahasa Inggris.

Untuk memastikan bahwa aplikasi Anda memilih bahasa yang diharapkan, lakukan langkah-langkah berikut:

  • Tentukan bahasa default. Buka Info.plist dan gunakan tampilan Sumber untuk mengatur nilai untuk CFBundleDevelopmentRegion kunci; di XML, tampilannya akan terlihat mirip dengan yang berikut ini:
<key>CFBundleDevelopmentRegion</key>
<string>es</string>

Contoh ini menggunakan "es" untuk menentukan bahwa ketika tidak ada bahasa pilihan pengguna yang didukung, default ke Bahasa Spanyol.

  • Deklarasikan semua pelokalan yang didukung. Di Info.plist, gunakan tampilan Sumber untuk mengatur array untuk CFBundleLocalizations kunci; di XML, tampilannya akan terlihat mirip dengan yang berikut ini:
<key>CFBundleLocalizations</key>
<array>
    <string>en</string>
    <string>es</string>
    ...
</array>

Aplikasi Xamarin.iOS yang telah dilokalkan menggunakan mekanisme .NET seperti file .resx juga harus menyediakan nilai Info.plist ini.

Untuk informasi selengkapnya tentang kunci Info.plist ini, lihat Referensi Kunci Daftar Properti Informasi Apple.

Metode GetLocalizedString

Metode NSBundle.MainBundle.GetLocalizedString mencari teks yang dilokalkan yang telah disimpan dalam file .strings dalam proyek. File-file ini diatur berdasarkan bahasa, dalam direktori bernama khusus dengan akhiran .lproj (perhatikan huruf pertama ekstensi adalah huruf kecil "L").

Lokasi file .strings

  • Base.lproj adalah direktori yang berisi sumber daya untuk bahasa default. Ini sering terletak di akar proyek (tetapi juga dapat ditempatkan di folder Sumber Daya ).
  • <direktori language.lproj> dibuat untuk setiap bahasa yang didukung, biasanya di folder Sumber Daya.

Mungkin ada sejumlah file .strings yang berbeda di setiap direktori bahasa:

  • Localizable.strings – daftar utama teks yang dilokalkan.
  • InfoPlist.strings – kunci tertentu diizinkan dalam file ini untuk menerjemahkan hal-hal seperti nama aplikasi.
  • <storyboard-name.strings> – file opsional yang berisi terjemahan untuk elemen antarmuka pengguna dalam papan cerita.

Tindakan Build untuk file-file ini harus Berupa Sumber Daya Bundel.

Format file .strings

Sintaks untuk nilai string yang dilokalkan adalah:

/* comment */
"key"="localized-value";

Anda harus keluar dari karakter berikut dalam string:

  • \" Kutipan
  • \\ Backslash
  • \n baris baru

Ini adalah contoh es/Localizable.strings (yaitu. Spanyol) dari sampel:

"<new task>" = "<new task>";
"Task Details" = "Detalles de la tarea";
"Name" = "Nombre";
"task name" = "nombre de la tarea";
"Notes" = "Notas";
"other task info"= "otra información de tarea";
"Done" = "Completo";
"Save" = "Guardar";
"Delete" = "Eliminar";

Gambar

Untuk melokalisasi gambar di iOS:

  1. Lihat gambar dalam kode, misalnya:

    UIImage.FromBundle("flag");
    
  2. Tempatkan file gambar default flag.png di Base.lproj (direktori bahasa pengembangan asli).

  3. Secara opsional tempatkan versi gambar yang dilokalkan di folder .lproj untuk setiap bahasa (misalnya. es.lproj, ja.lproj). Gunakan flag.png nama file yang sama di setiap direktori bahasa.

Jika gambar tidak ada untuk bahasa tertentu, iOS akan kembali ke folder bahasa asli default dan memuat gambar dari sana.

Luncurkan gambar

Gunakan konvensi penamaan standar untuk gambar peluncuran (dan XIB atau Storyboard untuk model i Telepon 6) saat menempatkannya di direktori .lproj untuk setiap bahasa.

Default.png
Default@2x.png
Default-568h@2x.png
LaunchScreen.xib

Nama aplikasi

Menempatkan file InfoPlist.strings di direktori .lproj memungkinkan Anda mengambil alih beberapa nilai dari Info.plist aplikasi, termasuk nama aplikasi:

"CFBundleDisplayName" = "LeónTodo";

Kunci lain yang dapat Anda gunakan untuk melokalisasi string khusus aplikasi adalah:

  • CFBundleName
  • CFBundleShortVersionString
  • NSHumanReadableCopyright

Tanggal dan waktu

Meskipun dimungkinkan untuk menggunakan fungsi tanggal dan waktu .NET bawaan (bersama dengan saat ini CultureInfo) untuk memformat tanggal dan waktu untuk lokal, ini akan mengabaikan pengaturan pengguna khusus lokal (yang dapat diatur secara terpisah dari bahasa).

Gunakan iOS NSDateFormatter untuk menghasilkan output yang cocok dengan preferensi lokal pengguna. Contoh kode berikut menunjukkan opsi pemformatan tanggal dan waktu dasar:

var date = NSDate.Now;
var df = new NSDateFormatter ();
df.DateStyle = NSDateFormatterStyle.Full;
df.TimeStyle = NSDateFormatterStyle.Long;
Debug.WriteLine ("Full,Long: " + df.StringFor(date));
df.DateStyle = NSDateFormatterStyle.Short;
df.TimeStyle = NSDateFormatterStyle.Short;
Debug.WriteLine ("Short,Short: " + df.StringFor(date));
df.DateStyle = NSDateFormatterStyle.Medium;
df.TimeStyle = NSDateFormatterStyle.None;
Debug.WriteLine ("Medium,None: " + df.StringFor(date));

Hasil untuk bahasa Inggris dalam Amerika Serikat:

Full,Long: Friday, August 7, 2015 at 10:29:32 AM PDT
Short,Short: 8/7/15, 10:29 AM
Medium,None: Aug 7, 2015

Hasil untuk Spanyol di Spanyol:

Full,Long: viernes, 7 de agosto de 2015, 10:26:58 GMT-7
Short,Short: 7/8/15 10:26
Medium,None: 7/8/2015

Lihat dokumentasi Apple Date Formatters untuk informasi selengkapnya. Saat menguji pemformatan tanggal dan waktu yang sensitif terhadap lokal, periksa pengaturan i Telepon Bahasa dan Wilayah.

Tata letak Kanan-ke-Kiri (RTL)

iOS menyediakan sejumlah fitur untuk membantu membangun aplikasi sadar RTL:

  • Gunakan atribut dan trailing tata letak leading otomatis untuk perataan kontrol (yang sesuai dengan kiri dan kanan untuk bahasa Inggris, tetapi dibalik untuk bahasa RTL). Kontrol UIStackView ini sangat berguna untuk meletakkan kontrol agar sadar RTL.
  • Gunakan TextAlignment = UITextAlignment.Natural untuk perataan teks (yang akan dibiarkan untuk sebagian besar bahasa tetapi kanan untuk RTL).
  • UINavigationController secara otomatis membalik tombol kembali dan membalik arah gesek.

Cuplikan layar berikut menunjukkan sampel Tugas yang dilokalkan dalam bahasa Arab dan Ibrani (meskipun bahasa Inggris telah dimasukkan di bidang):

Localization in Arabic

Localization in Hebrew

iOS secara otomatis membalikkan UINavigationController, dan kontrol lainnya ditempatkan di dalam UIStackView atau diselaraskan dengan Tata Letak Otomatis. Teks RTL dilokalkan menggunakan file .strings dengan cara yang sama seperti teks LTR.

Melokalisasi UI dalam kode

Sampel Tasky (dilokalkan dalam kode) menunjukkan cara melokalisasi aplikasi tempat antarmuka pengguna dibangun dalam kode (bukan XIB atau papan cerita).

Struktur Proyek

Screenshot shows the resources tree for a sample including the location of localizable strings.

File localizable.strings

Seperti yang dijelaskan di atas, format file Localizable.strings terdiri dari pasangan kunci-nilai. Kunci menjelaskan niat string dan nilainya adalah teks terjemahan yang akan digunakan dalam aplikasi.

Pelokalan Spanyol (es) untuk sampel ditunjukkan di bawah ini:

"<new task>" = "<new task>";
"Task Details" = "Detalles de la tarea";
"Name" = "Nombre";
"task name" = "nombre de la tarea";
"Notes" = "Notas";
"other task info"= "otra información de tarea";
"Done" = "Completo";
"Save" = "Guardar";
"Delete" = "Eliminar";

Melakukan pelokalan

Dalam kode aplikasi, di mana pun teks tampilan antarmuka pengguna diatur (apakah itu teks label, atau tempat penampung input, dll) kode menggunakan fungsi iOS GetLocalizedString untuk mengambil terjemahan yang benar untuk ditampilkan:

var localizedString = NSBundle.MainBundle.GetLocalizedString ("key", "optional");
someControl.Text = localizedString;

Melokalisasi UI papan cerita

Contoh Tasky (papan cerita yang dilokalkan) menunjukkan cara melokalisasi teks pada kontrol di papan cerita.

Struktur proyek

Direktori Base.lproj berisi papan cerita, dan juga harus berisi gambar apa pun yang digunakan dalam aplikasi.

Direktori bahasa lainnya berisi file Localizable.strings untuk sumber daya string apa pun yang direferensikan dalam kode, serta file MainStoryboard.strings yang berisi terjemahan untuk teks di papan cerita.

Screenshot shows the resources tree for a sample including the location of MainStoryboard strings.

Direktori bahasa harus berisi salinan gambar apa pun yang telah dilokalkan, untuk mengambil alih yang ada di Base.lproj.

ID Objek/ID Pelokalan

Saat membuat dan mengedit kontrol di papan cerita, pilih setiap kontrol dan periksa ID yang akan digunakan untuk pelokalan:

  • Di Visual Studio untuk Mac, itu terletak di Properties Pad dan disebut ID Pelokalan.
  • Di Xcode, itu disebut ID Objek.

Nilai string ini sering memiliki formulir seperti "NF3-h8-xmR", seperti yang ditunjukkan pada cuplikan layar berikut:

Xcode view of Storyboard localization

Nilai ini digunakan dalam file .strings untuk menetapkan teks yang diterjemahkan secara otomatis ke setiap kontrol.

MainStoryboard.strings

Format file terjemahan papan cerita mirip dengan file Localizable.strings , kecuali bahwa kunci (nilai di sebelah kiri) tidak dapat ditentukan pengguna tetapi sebaliknya harus memiliki format yang sangat spesifik: ObjectID.property.

Dalam contoh Mainstoryboard.strings di bawah ini Anda dapat melihat UITextFieldmemiliki placeholder properti teks yang dapat dilokalkan; UILabels memiliki text properti; dan UIButtonteks default diatur menggunakan normalTitle:

"SXg-TT-IwM.placeholder" = "nombre de la tarea";
"Pqa-aa-ury.placeholder"= "otra información de tarea";
"zwR-D9-hM1.text" = "Detalles de la tarea";
"bAM-2j-Rzw.text" = "Notas";           /* Notes */
"NF3-h8-xmR.text" = "Completo";        /* Done */
"MWt-Ya-pMf.normalTitle" = "Guardar";  /* Save */
"IGr-pR-05L.normalTitle" = "Eliminar"; /* Delete */

Penting

Menggunakan papan cerita dengan kelas ukuran dapat mengakibatkan terjemahan yang tidak muncul di aplikasi. Catatan Rilis Xcode Apple menunjukkan bahwa papan cerita atau XIB tidak akan dilokalkan dengan benar jika tiga hal benar: ia menggunakan kelas ukuran, pelokalan dasar dan target build diatur ke Universal, dan build menargetkan iOS 7.0. Perbaikannya adalah menduplikasi file string papan cerita Anda menjadi dua file yang identik: MainStoryboard~iphone.strings dan MainStoryboard~ipad.strings, seperti yang ditunjukkan pada cuplikan layar berikut:

Strings files

Daftar App Store

Mengikuti FAQ Apple di Pelokalan App Store untuk memasukkan terjemahan untuk setiap negara yang dijual aplikasi Anda. Perhatikan peringatan mereka bahwa terjemahan hanya akan muncul jika aplikasi Anda juga berisi direktori .lproj yang dilokalkan untuk bahasa tersebut.

Ringkasan

Artikel ini membahas dasar-dasar melokalisasi aplikasi iOS menggunakan fitur penanganan sumber daya dan papan cerita bawaan.

Anda dapat mempelajari lebih lanjut tentang i18n dan L10n untuk aplikasi iOS, Android, dan lintas platform (termasuk Xamarin.Forms) dalam panduan lintas platform ini.