0 follower

Internasionalisasi

Internasionalisasi (I18N) merujuk pada proses mendesain aplikasi software agar bisa diadaptasi ke berbagai bahasa dan wilayah tanpa perubahan proses pembuatannya. Untuk aplikasi Web, ini merupakan bagian penting karena potensi pengguna mungkin datang dari seluruh dunia.

Yii menyediakan dukungan I18N dalam beberapa aspek.

  • Menyediakan data lokal untuk setiap bahasa dan varian yang mungkin.
  • Menyediakan layanan pesan dan file terjemahan.
  • Menyediakan pembentukan tanggal dan jam dependen-lokal.
  • Menyediakan pembentukan angka dependen-lokal.

Dalam subseksi berikut, kita akan mengelaborasi setiap aspek di atas.

1. Lokal dan Bahasa

Lokal adalah satu set parameter yang mendefinisikan bahasa pengguna, negara dan setiap preferensi varian khusus yang diinginkan pengguna melihatnya dalam antar muka mereka. Ini biasanya diidentifikasi dengan ID yang terdiri dari ID bahasa dan ID wilayah. Sebagai contoh, ID en_US singkatan dari lokal bahasa Inggris dan Amerika. Untuk konsistensi, semua ID lokal dalam Yii adalah dikanonikal guna membentuk LanguageID atau LanguageID_RegionID dalam huruf kecil (misalnya en, en_us).

Data lokal disajikan sebagai turunan CLocale. Ia menyediakan informasi dependen-lokal, termasuk simbol kurs, simbol angka, format kurs, format angka, format tanggal dan jam, dan nama terkait=tanggal. Karena informasi bahasa sudah disatukan dalam ID lokal, ia tidak disediakan oleh CLocale. Untuk alasan yang sama, kita sering saling bertukar batasan lokal dan bahasa.

Diperoleh ID lokal, Anda bisa mendapatkan turunan CLocale terkait dengan CLocale::getInstance($localeID) atau CApplication::getLocale($localeID).

Info: Yii datang dengan data lokal untuk hampir semua bahasa dan wilayah. Data diperoleh dari Repositori Data Lokal Umum (CLDR). Untuk setiap lokal, hanya subset data CLDR yang disediakan karena data aslinya berisi banyak dan informasinya jarang dipakai.

Untuk aplikasi Yii, kita membedakan target bahasa dari sumber bahasa. Target bahasa adalah bahasa (lokal) pengguna yang aplikasinya ditargetkan baginya, sementara sumber bahasa merujuk ke bahasa (lokal) penulisan file sumber aplikasi. Internasionalisasi terjadi hanya ketika dua bahasa berbeda.

Anda dapat mengkonfigurasi target bahasa dalam konfigurasi aplikasi, atau mengubahnya secara dinamis sebelum internasionalisasi terjadi.

Tip: Adakalanya kita mungkin ingin menyetel target bahasa seperti bahasa yang diinginkan oleh pengguna (ditetapkan dalam preferensi browser pengguna). Untuk melakukannya, kita dapat mengambil ID bahasa yang diinginkan pengguna menggunakan CHttpRequest::preferredLanguage.

2. Terjemahan

Fitur I18N yang paling dibutuhkan barangkali adalah terjemahan, termasuk terjemahan pesan dan terjemahan tampilan. Terjemahan pesan menerjemahkan pesan teks ke bahasa yang diinginkan, sementara terjemahan tampilan menerjemahkan seluruh file ke bahasa yang dinginkan.

Permintaan terjemahan terdiri dari obyek yang diterjemahkan, sumber bahasa di mana obyek itu berada, dan target bahasa ke mana obyek harus diterjemahkan. Dalam Yii, sumber bahasa distandarkan ke sumber bahasa aplikasi sementara target bahasa distandarkan ke bahasa aplikasi. Jika sumber dan target bahasa sama, terjemahan tidak terjadi.

Terjemahan Pesan

Terjemahan pesan dikerjakan dengan memanggil Yii::t(). Metode menerjemahkan pesan yang didapat dari sumber bahasa ke target bahasa.

Saat menerjemahkan pesan, kategorinya harus ditetapkan karena pesan mungkin diterjemahkan secara berbeda di bawah kategori (konteks) berbeda. Kategori yii terpakai untuk pesan yang digunakan oleh kode inti Yii framework.

Pesan bisa berisi penampung parameter yang akan diganti dengan nilai parameter sebenarnya saat memanggil Yii::t(). Sebagai contoh, permintaan terjemahan pesan berikut akan mengganti penampung {alias} dalam pesan asli dengan nilai alias sebenarnya.

Yii::t('yii', 'Path alias "{alias}" is redefined.',
    array('{alias}'=>$alias))

Catatan: Pesan yang diterjemahkan harus berupa konstan string. Tidak boleh berisi variabel yang akan mengubah konten pesan (misalnya "Invalid {$message} content."). Gunakan penampung parameter jika pesan harus bervariasi berdasarkan pada beberapa parameter.

Pesan yang diterjemahkan disimpan dalam sebuah repositori yang disebut sumber pesan. Sumber pesan disajikan sebagai turunan CMessageSource atau anak kelasnya. Ketika Yii::t() dipanggil, ia akan mencari pesan dalam sumber pesan dan mengembalikan versi terjemahan jika ditemukan.

Yii datang dengan jenis sumber pesan berikut. Anda juga boleh memperluas CMessageSource untuk mengubah jenis sumber pesan Anda sendiri.

  • CPhpMessageSource: terjemahan pesan disimpan sebagai pasangan kunci-nilai dalam array PHP. Pesan asli adalah kunci dan terjemahan pesan adalah nilai. Setiap array mewakili terjemahan untuk kategori pesan tertentu dan disimpan dalam file naskah PHP terpisah yang namanya adalah nama kategori. File terjemahan PHP untuk bahasa yang sama disimpan di bawah direktori yang sama dinamai sebagai ID lokal. Dan semua direktori ini ditempatkan di bawah direktori yang ditetapkan dalam basePath.

  • CGettextMessageSource: terjemahan pesan disimpan sebagai file GNU Gettext.

  • CDbMessageSource: terjemahan pesan disimpan dalam tabel database. Untuk lebih jelasnya, lihat dokumentasi API untuk CDbMessageSource.

Sumber pesan diambil sebagai komponen aplikasi. Pra-deklarasi komponen aplikasi Yii bernama messages untuk menyimpan pesan yang dipakai dalam aplikasi pengguna. Distandarkan, jenis sumber pesan ini adalah CPhpMessageSource dan path basis untuk penyimpanan file terjemahan PHP adalah protected/messages.

Ringkasnya, untuk menggunakan terjemahan pesan, diperlukan langkah-langkah berikut:

  1. Panggil Yii::t() di tempat yang sesuai;

  2. Buat file terjemahan PHP sebagai protected/messages/LocaleID/CategoryName.php. Setiap file mengembalikan sebuah array terjemahan pesan. Catatan, ini anggapan bahwa Anda menggunakan CPhpMessageSource standar untuk menyimpan pesan yang diterjemahkan.

  3. Konfigurasi CApplication::sourceLanguage dan CApplication::language.

Tip: Piranti yiic dalam Yii bisa dipakai untuk mengatur terjemahan pesan ketika CPhpMessageSource dipakai sebagai sumber pesan. Perintah message dapat secara otomatis mengurai pesan yang akan diterjemahkan dari file sumber yang dipilih dan menggabungnya dengan terjemahan yang sudah ada bila diperlukan.

Sejak versi 1.0.2, Yii menambahkan dukungan untuk choice format. Pilihan format merujuk ke pemilihan terjemahan berdasarkan nilai angka yang diberikan. Sebagai contoh, dalam bahasa Inggris, kata 'book' mungkin berupa bentuk tunggal atau bentuk plural tergantung pada jumlah buku, sementara dalam bahasa lain, kata mungkin tidak memiliki bentuk berbeda (misalnya Cina) atau memiliki aturan bentuk lebih kompleks (misalnya Rusia). Pilihan format memecahkan masalah ini dengan cara sederhana namun efektif.

Untuk menggunakan pilihan format, pesan yang diterjemahkan harus terdiri dari pasangan urutan ekspresi-pesan dipisahkan dengan |, seperti terlihat di bawah ini:

'expr1#message1|expr2#message2|expr3#message3'

di mana exprN merujuk ke ekspresi valid PHP yang mengevaluasi ke nilai boolean menunjukan apakah pesan terkait harus dikembalikan atau tidak. Hanya pesan terkait ke ekspresi pertama yang hasil evaluasinya true akan dikembalikan. Ekspresi bisa berisi variabel spesial bernama n (catatan, ini bukan $n) yang akan mengambil jumlah nilai yang dioper sebagai parameter pesan pertama. Sebagai contoh, menganggap pesan yang diterjemahkan adalah:

'n==1#one book|n>1#many books'

dan kita mengoper nilai angka 2 dalam array parameter pesan saat memanggil Yii::t(), kita akan memperoleh many books sebagai pesan yang diterjemahkan.

Notasi jalan pintas, jika ekspresi adalah angka, ia akan diperlakukan sebagai n==Number. Oleh karena itu pesan yang diterjemahkan juga bisa ditulis seperti:

'1#one book|n>1#many books'

Terjemahan File

Terjemahan file dilakukan dengan memanggil CApplication::findLocalizedFile(). Path file yang akan diterjemahkan, metode akan mencari file dengan nama yang sama di bawah subdirektori LocaleID. Jika ditemukan, path file yang akan dikembalikan; jika tidak, path file asli yang akan dikembalikan.

Terjemahan file dipakai terutama saat membuat tampilan. Ketika memanggil salah satu metode render dalam kontroler atau widget, file tampilan akan diterjemahkan secara otomatis. Sebagai contoh, jika target bahasa adalah zh_cn sementara sumber bahasa adalah en_us, pembuatan tampilan bernama edit akan mencari file tampilan protected/views/ControllerID/zh_cn/edit.php. Jika file ditemukan, versi terjemahan ini yang dipakai untuk pembuatan; jika tidak, file protected/views/ControllerID/edit.php yang akan dibuat.

Terjemahan file juga dapat dipakai untuk keperluan lain, misalnya menampilkan gambar terjemahan atau pengambilan file data dependen-lokal.

3. Pembentukan Tanggal dan Jam

Tanggal dan jam sering berbeda bentuk di negara atau wilayah berbeda. Tugas pembentukan tanggal dan jam menghasilkan string tanggal dan jam yang sesuai dengan lokal yang ditetapkan. Yii menyediakan CDateFormatter untuk keperluan ini.

Setiap turunan CDateFormatter dikaitkan dengan target lokal. Untuk mendapatkan pembentuk yang dikaitkan dengan target lokal pada seluruh aplikasi, kita cukup mengakses properti dateFormatter pada aplikasi.

Kelas CDateFormatter menyediakan dua metode untuk membentuk UNIX timestamp.

  • format: metode ini membentuk UNIX timestamp ke dalam string berdasarkan pola yang dikustomisasi (misalnya $dateFormatter->format('yyyy-MM-dd',$timestamp)).

  • formatDateTime: metode ini membentuk UNIX timestamp ke dalam string berdasarkan pola pradefinisi dalam data target lokal (misalnya format tanggal short, format waktu long).

4. Pembentukan Angka

Seperti tanggal dan jam, angka juga bisa dibentuk secara berbeda di negara atau wilayah yang berbeda. Pembentukan angka termasuk pembentukan desimal, pembentukan kurs dan pembentukan prosentase. Yii menyediakan CNumberFormatter untuk tugas-tugas ini.

Untuk mendapatkan pembentuk angka terkait dengan target lokal pada seluruh aplikasi, kita dapat mengakses properti numberFormatter pada aplikasi.

Metode berikut disediakan oleh CNumberFormatter untuk membentuk nilai integer atau double.

  • format: metode ini membentuk angka ke dalam string berdasarkan pada pola kustomisasi (misalnya $numberFormatter->format('#,##0.00',$number)).

  • formatDecimal: metode ini membentuk angka menggunakan pola desimal pradefinisi dalam data lokal target.

  • formatCurrency: metode ini membentuk angka dan kode kurs menggunakan pola kurs pradefinisi dalam data lokal target.

  • formatPercentage: metode ini membentuk angka menggunakan pola prosentase pradefinisi dalam data lokal target.