Internasionalisasi (I18N) dan Lokalisasi (L10N)

Banyak aplikasi web dibangun dengan PHP tidak memikirkan internasionlisasi saat ia pertama kali ditulis. Itu mungkin dikarenakan tidak dimaksudkan untuk digunakan dalam bahasa dan kultur. Internasionalisasi adalah aspek penting karena meningkatkan adopsi Internet dalam banyak negara yang berbicara non-Ingris. Proses internasionalisasi dan lokalisasi akan menghadapi kesulitan. Di bawah adalah beberapa petunjuk umum untuk menginternasionalisasi aplikasi yang sudah ada.

Pisahkan data sensitif kultur/lokal

Identifikasi dan pisahkan data yang beragam dengan kultur. Yang paling jelas adalah teks/string/pesan. Tipe lain dari data juga harus dipertimbangkan. Daftar berikut mengkategorikan beberapa contoh data sensitif kultur

Bila memungkinkan semua ragam teks harus diisolasi dan disimpan dalam format persisten. Teks ini termasuk, pesan kesalahan aplikasi, string ditulis tangan dalam file PHP, email, teks statis HTML, dan teks pada elemen formulir (misalnya tombol).

Konfigurasi

Untuk menghidupkan fitur lokalisasi dalam PRADO, Anda perlu menambahkan beberapa opsi konfigurasi dalam konfigurasi aplikasi Anda. Pertama Anda perlu menyertakan namespace System.I18N.* ke path Anda.

Kemudian, jika Anda ingin menerjemahkan beberapa teks dalam aplikasi Anda, perlu ditambahkan sumber data pesan terjemahan.

Di mana source dalam translation adalah path titik ke direktori di mana Anda akan menyimpan katalog pesan terjemahan. Atribut autosave jika dihidupkan, menyimpan pesan tidak diterjemahkan kembali ke dalam katalog pesasn. Dengan menghidupkan cache, pesan yang diterjemahkan disimpan dalam direktori aplikasi runtime/i18n. Nilai marker dipakai untuk mengelilingi teks yang tidak diterjemahkan.

Dengan konfigurasi lengkap, sekarang kita dapat mulai melokalisasi aplikasi Anda. Jika Anda menghidupkan autosave, setelah menjalankan aplikasi Anda dengan beberapa aktivitas lokalisasi (misalnya menterjemahkan beberapa teks), Anda akan melihat sebuah direktori dan messages.xml dibuat di dalam direktori source.

Apa yang harus dilakukan dengan messages.xml?

File katalog pesan terjemahan, jika menggunakan type="XLIFF", adalah format intechange XML pesan terjemahan distandarisasi. Anda bisa mengedit file XML menggunakan editor yang mampu menangani UTF-8. Format dari XML adalah sesuatu mirip seperti berikut ini.

Hello world. Hi World!!! Setiap pesan terjemahan dilapisi dengan tag trans-unit, di mana source adalah pesan asli, dan target adalah pesan yang diterjemahkan. Editor seperti Heartsome XLIFF Translation Editor dapat membantu mengedit file XML ini.

Menyetel dan Mengubah Kultur

Sekali globalisasi dihidupkan, Anda dapat mengakses setelan globalisasi, seperti Culture, Charset, dll, menggunakan

$globalization = $this->getApplication()->getGlobalization(); echo $globalization->Culture; $globalization->Charset= "GB-2312"; //ubah charset

Anda juga mengubah cara kultur ditentukan dengan mengubah atribut class dalam konfigurasi modul. Sebagai contoh, untuk menyetel kultur yang tergantung pada setelan browser, Anda bisa menggunakan kelas TGlobalizationAutoDetect. ...

Anda juga bisa menyediakan kelas globalisasi sendiri untuk mengubah bagaimana kultur aplikasi ditetapkan. Terakhir, Anda dapat mengubah setelan globalisasi dengan basis halaman demi halaman menggunakan tag kontrol template. Sebagai contoh, mengubah Culture ke "zh".

<%@ Application.Globalization.Culture="zh" %>

Melokalisir aplikasi PRADO Anda

Ada dua area dalam aplikasi Anda yang mungkin membutuhkan lokalisasi pesan atau string, dalam kode PHP dan dalam template. Untuk melokalisasi string di dalam PHP, gunakan fungsi localize yang dijelaskan di bawah. Untuk melokalisasi teks dalam template, gunakan komponen TTranslate.

Menggunakan fungsi localize untuk mennerjemahkan teks dalam PHP

Fungsi localize mencari string yang diterjemahkan yang sama dengan aslinya dari sumber terjemahan Anda. Pertama, Anda perlu mencari semua teks dikode langsung dalam PHP yang ditampilkan atau dikirimkan ke pengguna akhir. Contoh berikut melokalisasi teks $sender (menganggap, katakanlah, sender adalah sebuah tombol). Kode asli sebelum lokalisasi adalah sebagai berikut. function clickMe($sender,$param) { $sender->Text="Hello, world!"; }

Pesan dikodekan langsung "Hello, world!" dilokalisasi menggunakan fungsi localize.

function clickMe($sender,$param) { $sender->Text=Prado::localize("Hello, world!"); }

Pesan Gabungan

Pesan gabungan dapat berisi data variabel. Sebagai contoh, dalam pesan "There are 12 users online.", integer 12 dapat berubah tergantung pada beberapa data dalam aplikasi Anda. Ini sulit diterjemahkan karena posisi dari data variabel mungkin berbeda untuk bahasa yang berbeda. Seabgai tambahan, bahasa yang berbeda memiliki aturannya sendiri untuk bentuk jamak (jika ada) dan/atau pembilang. Contoh berikut tidak mudah untuk diterjemahkan, karena struktur kalimat sudah tetap dengan dikodekan langsung data variabel dengan pesan.

$num_users = 12; $message = "There are " . $num_users . " users online."; Masalah ini bisa dipecahkan menggunakan fungsi localize dengan penempatan string. Sebagai contoh, string $message di atas dapat dibentuk seperti berikut. $num_users = 12; $message = Prado::localize("There are {num_users} users online.", array('num_users'=>$num_users));

Di mana parameter kedua dalam localize mengambil array asosiatif dengan kunci sebagai penempatan yang dicari dalam teks dan menggantinya dengan nilai terkait. Fungsi localize tidak memecahkan masalah lokalisasi bahasa yang memiliki bentuk jamak, solusinya adalah menggunakan TChoiceFormat.

The following sample demonstrates the basics of localization in PRADO.

Komponen I18N

TTranslate

Pesan dan string bisa dilokalisasi dalam PHP atau dalam template. Untuk menerjemahkan pesan atau string dalam template, gunakan TTranslate.

<com:TTranslate>Hello World</com:TTranslate> <com:TTranslate Text="Goodbye" />

TTranslate juga dapat melakukan penempatan string. Properti Parameters bisa digunakan untuk menambah pasangan nama nilai untuk penempatan. Substring dalam terjemahan dikurung dengan "{" dan "}" yang dianggap sebagai nama parameter selama pencarian penempatan. Contoh berikut akan menempatkan substring "{time}" dengan nilai atribut parameter "Parameters.time=<%= time() %>". <com:TTranslate Parameters.time=<%= time() %> > The time is {time}. </com:TTranslate>

Kependekan dari TTranslate juga disediakan menggunakan sintaks berikut.

<%[string]%>

di mana string akan diterjemahkan ke bahasa berbeda berdasarkan preferensi bahasa pengguna akhir. Sintaks ini bisa dipakai dengan nilai atribut juga.

<com:TLabel Text="<%[ Hello World! ]%>" />

TDateFormat

Memformat tanggal dan jam dilokalisasi adalah pekerjaan langsung.

<com:TDateFormat Value="12/01/2005" />

Properti Pattern menerima 4 predefininisi pola tanggal dilokalisasi dan 4 predefininisi pola jam dilokalisasi.

Predefinisi bisa dipakai dalam setiap kombinasi. Jika menggunakan pola predefinisi gabungan, pola pertama harus tanggal, diikuti oleh spasi, dan terakhir pola jam. Sebagai contoh, pola tanggal lengkap dengan pola jam pendek. Aktual uruta dari tanggal-jam dan pola aktual akan ditentukan secara otomatis dari data lokal yang ditetapkan oleh properti Culture.

<com:TDateFormat Pattern="fulldate shorttime" />

Anda dapat menetapkan pola kustom menggunakan sub-pola berikut. Format tanggal/jam ditetapkan dalam arti pola waktu string. Dalam pola ini, semua huruf ASCII disimpan sebagai huruf pola, yang ditetapkan sebagai berikut: Simbol Arti Penyajian Contoh ------ ---- --------- ------ G tanda abad (Teks) AD y tahun (Angka) 1996 M bulan dalam tahun (Teks & Angka) July & 07 d hari dalam bulan (Angka) 10 h jam dalam am/pm (1~12) (Angka) 12 H jam dalam hari (0~23) (Angka) 0 m menit dalam jam (Angka) 30 s detik dalam menit (Angka) 55 E hari dalam minggu (Teks) Tuesday D hari dalam tahun (Angka) 189 F hari minggu dalam bulan (Angka) 2 (2nd Wed in July) w minggu dalam tahun (Angka) 27 W minggu dalam bulan (Angka) 2 a tanda am/pm (Teks) PM k jam dalam hari (1~24) (Angka) 24 K jam dalam am/pm (0~11) (Angka) 0 z zona waktu (Jam) Pacific Standard Time ' tanda kutip teks (Delimiter) 'Date=' '' tanda kutip tunggal (Literal) 'o''clock'

Jumlah pola huruf menentukan format.

(Teks): 4 huruf menggunakan bentuk lengkap, kurang dari 4 menggunakan bentuk pendek atau singkatan jika ada. (misalnya "EEEE" menghasilkan "Monday", "EEE" menghasilkan "Mon")

(Angka): jumlah digit minimum. Angka lebih pendek adalah diisi-nol ke jumlah ini (misalnya jika "m" menghasilkan "6", "mm" menghasilkan "06"). Tahun ditangani secara khusus; yakni jika jumlah 'y' adalah 2, Tahun akan dipotong 2 digit. (misalnya jika "yyyy" menghasilkan "1997", "yy" menghasilkan "97".) Tidak seperti field lain, pecahan detik dipadatkan pada sisi kanan dengan nol.

(Teks dan Angka): 3 atau lebih, pakai teks, sebaliknya pakai angka. (misalnya "M" menghasilkan "1", "MM" menghasilkan "01", "MMM" menghasilkan "Jan", and "MMMM" menghasilkan "January".)

Setiap karakter dalam pola yang tidak dalam jangkauan ['a'..'z'] dan ['A'..'Z'] akan diperlakukan sebagai teks bertanda kutip. Contohnya, karakter seperti ':', '.', ' ', dan '@' akan muncul dalam hasil teks waktu meskipun tidak dikurung dalam tanda kutip tunggal.

Contoh menggunakan lokal US: Pola Formasi Hasil ------------ ----- "yyyy.MM.dd G 'at' HH:mm:ss" ->> 1996.07.10 AD at 15:08:56 "EEE, MMM d, ''yy" ->> Wed, Jul 10, '96 "h:mm a" ->> 12:08 PM "hh 'o''clock' a, z" ->> 12 o'clock PM, Pacific Daylight Time "K:mm a" ->> 0:00 PM "yyyy.MMMM.dd G hh:mm a" ->> 1996.July.10 AD 12:08 PM

Jika properti Value tidak ditetapkan, tanggal dan jam saat ini yang dipakai.

TNumberFormat

Kerangka kerja Internasionalisasi PRADO menyediakan pembentukan kurs lokal dan pembentukan angka. Harap dicatat bahwa komponen TNumberFormat hanya menyediakan pembentukan, saat ini ia tidak melakukan konversi atau pertukaran.

Numbers can be formatted as currency, percentage, decimal or scientific numbers by specifying the Type attribute. The valid types are:

<com:TNumberFormat Type="currency" Value="100" />

Properti Culture dan Currency dapat ditetapkan untuk membentuk angka spesifik lokal.

Jika seseorang dari US ingin melihat gambar penjualan dari sebuah toko dalam bahasa Jerman (katakanlah menggunakan kurs EURO), diformat menggunakan kurs jerman, Anda perlu untuk menggunakan atribut Culture="de_DE" guna memperoleh kurs yang benar, misalnya 100,00$. Pemisah desimal dan pengelompokan kemudian juga dari lokal de_DE. Ini dapat menimbulkan beberapa kebingungan karena orang dari US memakai "," (koma) sebagai pemisah ribuan. Oleh karena itu, atribut Currency tersedia agar output dari hasil contoh berikut menghasilkan $100.00 <com:TNumberFormat Type="currency" Culture="en_US" Currency="EUR" Value="100" />

Properti Pattern menetapkan jumlah digit, posisi pengelompokan ribuan, jumlah titik desimal dan posisi desimal. Karakter aktual yang dipakai untuk menyajikan titik desimal dan titik ribuan adalah spesifik kultur dan akan berubah secara otomatis berdasarkan properti Culture. Karakter Pattern yang benar adalah:

Sebagai contoh, anggap Value="1234567.12345" dan dengan Culture="en_US" (yang menggunakan "," untuk titik pemisah ribuan dan "." untuk pemisah desimal).

Pola Output ---- ------ ##,###.00 ->> 1,234,567.12 ##,###.## ->> 1,234,567.12345 ##,##.0000 ->> 1,23,45,67.1235 ##,###,##.0 ->> 12,345,67.1 000,000,000.0 ->> 001,234,567.1

TTranslateParameter

Pesan gabungan, misalnya penempatan string, bisa dilakukan dengan TTranslateParameter. Dalam contoh berikut, string "{greeting}" dan "{name}" masing-masing akan diganti dengan nilai "Hello" dan "World". Penempatan string harus dikurung dengan "{" dan "}". Parameter selanjutnya diterjemahkan dengan menggunakans TTranslate. <com:TTranslate> {greeting} {name}! <com:TTranslateParameter Key="name">World</com:TTranslateParameter> <com:TTranslateParameter Key="greeting">Hello</com:TTranslateParameter> </com:TTranslate>

TChoiceFormat

Menggunakan fungsi localize atau komponen TTranslate untuk menerjemahkan pesan tidak memberitahu penerjemah kardinalitas dari data yang diminta untuk menentukan struktur jamak yang benar yang dipakai. Ia hanya memberitahunya bahwa ada data tersedia, data dapat berupa apa saja. Selanjutnya, penerjemah tidak akan bisa menentukan dengan memperhatikan penempatan data plural yang benar, struktur bahasa atau prasa yang dipakai. Misalnya dalam bahasa Inggris, untuk menerjemahkan kalimat, "There are {number} of apples.", hasil terjemahan akan berbeda tergantung pada jumlah apel.

Komponen TChoiceFormat melakukan pilihan terjemahan pesan/string. Contoh berikut mendemonstrasikan terjemahan pesan 2 pilihan sederhana.

<com:TChoiceFormat Value="1"/>[1] One Apple. |[2] Two Apples</com:TChoiceFormat>

Dalam contoh di atas, Value "1" (satu), kemudian string yang diterjemahkan adalah "One Apple". Jika Value adalah "2", maka ia akan menampilkan "Two Apples".

Pilihan pesan/string dipisashkan oleh pipa "|" diikuti oleh set notasi dari formulir.

Setiap kombinasi tidak-kosong dari kurung kotak dan bulat dapat diterima. String yang dipilih untuk tampilan tergantung pada properti Value. Value dievaluiasi untuk setiap set-nya sampai Value ditemukan milik set tertentu.