Penggunaan fungsi SETLOCALE pada PHP

Arsip mwmag [Files]  [Up] © 2002 PT Masterweb Media

Situs-situs yang memberikan dukungan beberapa bahasa—seperti Indonesia dan Inggris—umumnya membuat dan mengurus situsnya secara terpisah untuk setiap bahasa. Perusahaan yang memiliki cabang di berbagai negara misalnya, harus menyewa webmaster khusus di tiap negara untuk mengurus situsnya dalam bahasa masing-masing. Hal ini sangat tidak efisien apabila isi dari tiap pilihan bahasa adalah sama, baik dari segi layout maupun kontennya. Jadi situs yang satu hanyalah terjemahan situs yang lainnya. Tulisan berikut akan menjelaskan cara membuat situs multilingual yang lebih efisien menggunakan bahasa pemrograman PHP.

Multilingual dalam konteks pengembangan situs web dapat diartikan sebagai bentuk penyesuaian isi sebuah situs untuk pengunjung yang berbeda bahasa/negara. Pada praktiknya ada dua hal yang harus diperhatikan pada situs multilingual ini.

Pertama, internationalization, yaitu operasi yang memungkinkan sebuah situs mengenali dan mendukung berbagai pilihan bahasa pengunjung. Dengan kata lain, usaha membuat sebuah situs dapat dimengerti dalam berbagai bahasa dunia. Operasi di sini hanya melibatkan proses alih bahasa sederhana.

Kedua, localization, yaitu operasi terhadap situs yang sudah diinternasionalisasi agar format masukan dan keluaran dari aplikasi webnya dapat dimengerti [diinterpretasikan secara benar] oleh pengguna bahasa yang bersangkutan. Termasuk dalam hal ini adalah satuan mata uang, format tanggal, waktu dan pecahan uang. Misal, jika seorang pengunjung memasukkan tanggal 02/10/02 ke sebuah form, maka Anda tidak bisa menginterpretasikan apapun sampai kita tahu bahasa apa yang ia pilih. Di Indonesia misalnya, masukan tersebut akan diartikan sebagai 2 Oktober 2002, sementara di Amerika akan diartikan sebagai 10 Februari 2002.

Dengan demikian, fokus pembahasan dalam artikel ini adalah seputar dua hal di atas. Untuk Anda ketahui, banyak programmer lebih suka menyebut internationalization dan localization masing-masing dengan i18n dan l10n, yang diambil dari huruf pertama dan terakhir dari kata tersebut yang diselipkan jumlah huruf di antaranya.

Hal penting pertama dari sebuah situs multilingual adalah mengetahui pilihan bahasa dari pengunjung. Ada dua metode yang bisa Anda lakukan.

Pertama, melalui HTTP_ACCEPT_LANGUAGE. Setiap browser memiliki setting pilihan bahasa yang ikut dikirimkan bersama request ke webserver. Di PHP, kita bisa mengetahui pilihan bahasa ini dalam variabel $HTTP_SERVER_VARS["HTTP_ACCEPT_LANGUAGE"]. Perlu diperhatikan di sini, isi dari variabel ini adalah kode bahasa bukan kode negara. Sebagai contoh, bahasa Denmark memiliki kode bahasa da sementara kode negaranya dk. Daftar lengkap dari kode bahasa untuk tiap negara dapat dilihat pada dokumentasi RFC 1766, www.faqs.org/rfcs/rfc1766.html.

Kedua, melalui menu pilihan. Mengandalkan hanya cara di atas kadang sangat riskan, karena kebanyakan pengguna browser tidak terlalu memperhatikan setting pilihan bahasa ini, sehingga biasanya mereka membiarkan settingnya dalam isian default [biasanya bahasa Inggris]. Oleh karena itu, akan lebih aman jika Anda juga menggunakan menu pilihan bahasa di situs Anda. Contoh dari menu pilihan adalah sebagai berikut:

Jika Anda mengembangkan situs komunitas seperti yahoo.com, Anda bisa saja menambahkan language preference dalam biodata anggota, sehingga tiap kali login mereka langsung diberikan halaman sesuai pilihan bahasa masing-masing.

Karena internasionalisasi hanya berupa proses alih bahasa sederhana, maka internasionalisasi ini mirip seperti kita menerjemahkan sebuah artikel berbahasa Inggris ke dalam bahasa Indonesia, yang biasanya melibatkan tiga langkah. Pertama adalah mencari kata-kata berbahasa Inggris pada artikel tersebut yang perlu diterjemahkan, lalu mencari padanan kata bahasa Indonesianya pada sebuah acuan—misalnya, menggunakan kamus Inggris-Indonesia. Dan terakhir adalah mengganti kata tersebut dengan padanannya sesuai kamus.

PHP dapat melakukan ketiga hal di atas sekaligus dengan menggunakan fungsi gettext[]. Fungsi ini secara otomatis akan mengganti kata atau kalimat yang menjadi masukannya dengan padanan katanya—terjemahannya—dengan merujuk pada sebuah file yang berisi tabel translasi. Tabel translasi ini mirip dengan sebuah kamus, hanya saja isinya tidak harus kata per kata tetapi dapat berbentuk kalimat beserta padanannya dalam bahasa lain [per pesan]. Contoh tabel translasi adalah sebagai berikut:

Kalimat setelah msgid adalah kalimat yang akan diterjemahkan, sementara kalimat setelah msgstr adalah padanannya. Dengan mengacu pada tabel translasi seperti ini, baris gettext["Sharing knowledge is a good thing"]; pada skrip PHP, ketika dijalankan akan diganti dengan "Berbagi pengetahuan itu baik". Sehingga dengan tambahan print atau echo, Anda dapat mencetak keluarannya dalam berbagai bahasa dengan mengubah-ubah isi dari msgstr.

“Ah, semudah itukah?” Anda mungkin bertanya. Jawaban singkatnya, “Ya.” Jawaban panjangnya, “Ya, kalau PHP Anda mendukung fungsi gettext[]ini, kemudian Anda mengacu dengan benar ke file yang berisi tabel translasi yang juga benar.”

Pertama, agar PHP Anda mendukung fungsi gettext[], pastikan ketika instalasi Anda menyertakan --with-gettext pada opsi configure, dan pustaka gettext telah tersedia di direktori /usr/local sebagai lokasi default. Sehingga konfigurasinya menjadi seperti berikut:

Jika Anda meletakkan pustaka ini di direktori lain, pastikan letak direktori ini disertakan setelah --with-gettext sehingga opsinya menjadi --with-gettext=/path/ke/gettext.

Adapun cara membuat tabel translasi adalah menggunakan program xgettext. Di Linux Anda dapat mengetikkan perintah berikut:

yang akan mencari funngsi gettext[] dari tiap baris pada file index.php, lalu menjadikan masukan fungsi tersebut sebagai msgid bersamaan dengan msgstr yang masih kosong, kemudian hasilnya disimpan dalam file bernama messages.po. Sebagai contoh, jika file index.php berisi:

Berikutnya, Anda tinggal mengisi isian msgstr sesuai terjemahan yang Anda inginkan dari masing-masing msgid di atas. Hanya saja, file messages.po ini belum dapat dimengerti oleh fungsi gettext[], karenanya terlebih dahulu Anda harus mengubahnya ke bentuk file biner dengan program msgfmt. Di Linux perintahnya seperti berikut:

yang akan menghasilkan file dengan nama messages.mo, file inilah yang dapat dimengerti gettext[]. Hanya saja—lagi-lagi—Anda harus meletakkan file ini dengan tepat lalu menyatakan lokasinya di skrip PHP sebelum gettext[]. Untuk itu digunakan fungsi bindtextdomain[] dan textdomain[] yang masing-masing menyatakan lokasi dari tabel translasi—disebut juga sebagai domain—dan menentukan domain yang aktif. Sebagai contoh, perhatikan skrip PHP berikut:

Keterangan lebih jauh tentang fungsi putenv[], bindtextdomain[], dan textdomain[] dapat dilihat di manual PHP. Yang penting untuk diperhatikan di sini—karena tidak disinggung di manual PHP—adalah bahwa pemanggilan fungsi bindtextdomain["messages", "./locale"] di atas akan mengasosiasikan messages dengan file tabel translasi di direktori locale/id/LC_MESSAGES/messages.mo . Berikutnya textdomain["messages"] akan mengaktifkan file tabel translasi tersebut sehingga fungsi gettext[] setelahnya akan mengacu pada tabel translasi ini. Agak aneh memang, tetapi seperti itulah mekanisme yang telah ditetapkan dan untuk sekarang lebih baik kita mengikuti saja, karena nanti akan terlihat bahwa hal ini amat membantu.

Sebagai ilustrasi, jika variabel environment di atas saya ganti dengan putenv["LANGUAGE=fr"] maka file translasi tabel yang digunakan sebagai acuan adalah locale/fr/LC_MESSAGES/messages.mo. Nah, dengan ini saja Anda dapat mengubah-ubah teks "Sharing knowledge is a good thing" dalam berbagai bahasa, sesuai isi dan letak file tabel translasinya.

Jika Anda kurang nyaman dengan penggunaan nama file messages.mo ini, Anda dapat membuat file lain dengan argument -o, seperti berikut:

Lebih jauh tentang program gettext di Linux dapat dilihat di situs gettext GNU [lihat Rujukan].

Lokalisasi—di sisi lain, karena berkaitan dengan format sebuah besaran—tidak dapat diperlakukan sebagaimana internasionalisasi di atas yang hanya berkaitan dengan alih bahasa saja. Selain format tanggal misalnya, seperti contoh di awal artikel, begitu pula angka pemisah ribuan dan satuan besaran, yang tidak dapat kita perkirakan kecuali telah mengetahui bahasa pengunjung. Pengunjung dapat memasukkan angka 300,762 atau 300.762 yang keduanya adalah benar untuk negara yang berbeda, tetapi akan salah untuk program yang Anda buat.

Dengan demikian, harus ada standardisasi format lokalisasi yang jelas untuk tiap negara, sehingga pada situs multilingual, ketika telah diperoleh informasi tentang bahasa pilihan pengunjung, aplikasi web dapat menginterpretasikan dengan benar untuk tiap masukan.

Anda bisa bayangkan berapa banyak standardisasi yang harus dibuat untuk tiap negara, belum lagi jenis satuan yang harus distandardisasi. Tapi untungnya, semua itu telah dilakukan oleh pengguna Linux yang baik hati dari berbagai negara di seluruh dunia, sehingga kita tinggal menggunakannya saja. Letak informasi lokalisasi ini dapat ditemukan di direktori locale yang biasanya diletakan di /usr/lib/locale/. Untuk Indonesia misalnya, Anda dapat menemukannya di direktori /usr/lib/locale/id_ID.

PHP sendiri memiliki fungsi setlocale[] untuk menentukan format lokalisasi negara mana yang akan digunakan, beserta fungsi-fungsi lain yang berkaitan dengannya. Lebih jelasnya dapat dibaca di manual PHP tentang fungsi setlocale[]. Sebagai contoh, setlocale[LC_TIME,"id_ID"] akan mengaktifkan lokalisasi format waktu mengikuti format waktu yang digunakan di Indonesia dengan mengacu pada format lokalisasi di direktori /usr/lib/locale/id_ID. Sehingga fungsi print strftime["%x"] akan mencetak tanggal hari ini, yaitu 17/03/02. Sementara untuk format Amerika yaitu menggunakan setlocale[LC_TIME,"en_US"] akan mencetak 03/17/2002.

Kurang lengkap nampaknya, kalau artikel ini tidak disertai contoh kasus. Oleh karena itu, untuk Anda, saya telah membuat sebuah situs dummy multilingual dot com untuk dibuat multilingual. Sengaja saya pilih komponen-komponen yang sederhana dan minimal, sekedar untuk menjelaskan apa yang baru dipaparkan sebelumnya. Tampilan awal dari situs multilingual dot com ini dapat Anda lihat pada Gambar 1. Untuk Anda ketahui, situs ini benar-benar dummy dan tidak ada hubungannya sama sekali dengan situs multilingual.com yang ada. Source code situs ini ddapat Anda peroleh di CD atau di mwmag.com dengan nama multilingual.zip.


Gb 1. Tampilan awal multilingual.com

Satu hal lagi yang perlu Anda perhatikan dalam membangun situs multilingual adalah desain terlebih dahulu satu halaman web dengan bahasa tertentu, baru setelah itu dimultilingualkan. Kemudian gunakan sistem template untuk memisahkan layer presentasi [HTML, image, Javascript, dan lain-lain] dan layer logika [skrip PHP]. Kedua hal ini akan mempermudah kerja Anda sebagai programer dan rekan Anda sebagai desainer.

Pada contoh kasus ini akan ditunjukan bagaimana membuat versi bahasa Indonesia dari situs multilingual dot com menggunakan sistim template InTemplate. Penjelasan dari InTemplate ini dapat dilihat misalnya di artikel mwmag edisi 2 terdahulu.

Langkah pertama multilingualisasi adalah internasionalisasi. Berikut langkah-langkah yang dapat Anda lakukan:

Karena peletakan beberapa file sangat penting untuk fungsi gettext[] dan juga InTemplate, maka alokasi direktori adalah hal pertama yang harus didesain. Alokasi direktori yang saya gunakan adalah sebagai berikut [Gambar 2]:


Gb 2. Alokasi direktori proyek multilingual.com

class adalah direktori tempat seluruh file berisi kelas yang digunakan, untuk kasus ini adalah file class.InTemplate.php, images adalah tempat seluruh gambar, templates untuk file template dan locale untuk penempatan file tabel translasinya.

Ubah teks yang akan diinternasionalisasi pada Gambar 1 menjadi variabel-variabel InTemplate seperti terlihat pada Gambar 3. Lalu simpan dengan nama template.htm dan tempatkan dalam direktori templates.


Gb 3. Setelah teks dijadikan variabel

Buat file dengan nama home.php yang isinya seperti terlihat pada Listing 1. File ini bertugas untuk melakukan parsing terhadap template, yaitu mengganti variabel InTemplate pada Gambar 2 dengan teks tertentu. Sengaja saya buat teks tersebut sama dengan isi semula pada Gambar 1. Maka, jika home.php diakses lewat browser akan tampak seperti Gambar 4 yang mirip dengan Gambar 1.


Gb 4. Tampilan home.php

Berikut adalah beberapa hal yang harus Anda lakukan. Pertama, ubah seluruh teks pada file home.php yang akan diinternasionalisasi menjadi masukan fungsi gettext[] seperti terlihat pada Listing 2. Lalu, buat tabel translasi dengan program xgettext:

Perintah ini akan menghasilkan file messages.po seperti terlihat pada Listing 3. Isi msgstr pada file tersebut dengan padanan kalimat dalam bahasa Indonesia unntuk msgid bersangkutan, misalnya seperti Listing 4. Bangkitkan file biner dengan nama home.mo menggunakan program msgfmt:

lalu letakkan file ini di direktori locale/id/LC_MESSAGES.

Dengan fungsi putenv[], bindtextdomain[], dan textdomain[] tentukan letak file tabel translasi dan domain yang aktif, seperti berikut:

Dengan demikian, file home.php menjadi seperti Listing 5, dan yang akan tampak di browser seperti terlihat pada Gambar 5. Jreng! Sekarang Anda punya versi bahasa Indonesia dari situs multilingual dot com. Mudah bukan? Ya, tentu saja. Tapi masih ada dua hal yang mengganggu di sini, yaitu teks tanggal hari ini dan panel gambar sisi kiri yang masih dalam bahasa Inggris. Berikutnya akan dijelaskan cara mengatasi dua hal ini.


Gb 5. Versi Indonesia multilingual.com

Anda mungkin berpikir, “Ah, apa susahnya sih? Dengan gettext[] kita tinggal membuat tabel translasi untuk mengubah ‘thursday' menjadi ‘kamis’, dan ‘march’ menjadi ‘maret’? Beres.” Ya, tentu saja, jika tiap hari selama setahun adalah hari Kamis, 7 Maret 2002. Konyol bukan? penempatan tanggal di sebuah situs tentu dengan maksud tertentu yaitu agar dapat menginformasikan tanggal hari ini kepada pengunjung, jadi tampilan tanggal ini harus berubah setiap hari. Tabel translasi tentu bisa saja digunakan, namun itu akan sangat tidak efektif, karena Anda harus membuat program tambahan lagi untuk mendeteksi tanggal hari ini berikut padanannya dalam berbagai bahasa.

Trik yang bisa digunakan untuk ini adalah dengan menggunakan lokalisasi yang sudah ada. Seperti telah diterangkan sebelumnya, yang perlu Anda lakukan adalah dengan menambahkan potongan kode berikut:


Gb 6. multilingual.com setelah lokalisasi

Berikutnya adalah panel navigasi di sisi kiri dalam bentuk image bertuliskan “clients”, “solutions” dan “about us.” Ini adalah hal yang baru yang mau tidak mau harus kita multilingualkan juga, karena akan sangat mengganggu jika dibiarkan dalam bahasa Inggris. Tapi kalau Anda berpikir untuk membuat image tersebut secara terprogram dengan PHP maka lupakanlah, karena biarpun PHP mampu melakukannya, ini jelas akan memasung kreativitas rekan designer Anda yang belum tentu mengerti PHP.

Trik yang biasa saya lakukan adalah justru mengajak kerja sama rekan designer saya untuk membuat image-image tersebut dalam berbagai bahasa yang dibutuhkan, lalu meletakkannya dalam direktori yang berbeda dengan nama yang menunjukan bahasa tersebut, misalnya images_id untuk Indonesia, images_fr untuk Perancis dan seterusnya. Lalu dengan tambahan sedikit skrip yang mengganti-ganti letak file image ini pada HTML, maka kita dapat mengatur image yang tampil sesuai bahasa pilihan pengunjung.

Sebagai contoh, untuk kasus multilingual dot com, saya memilih nama direktori images_id untuk menunjukkan image dalam bahasa indonesia. Kemudian, dengan sedikit skrip tambahan di home.php saya mengubah setiap teks HTML pada file template yang bertuliskan images/ menjadi images_id/, sehingga semua image yang tampil di browser bukan lagi berasal dari direktori images melainkan dari direktori images_id.

Hal ini saya lakukan dengan menggunakan salah satu metode dari class InTemplate yaitu UserDefinedReplace[] dengan cara seperti berikut:

yang akan mengubah semua images/ dalam template menjadi images_id/ sebelum kemudian dicetak ke browser. Sehingga tampilannya sekarang seperti terlihat pada Gambar 7.


Gb 7. multilingual.com setelah lokalisasi dan penyesuaian image

Seharusnya saat ini banyak ide-ide baru memenuhi kepala Anda. Sebagaimana aplikasi web lain yang menggunakan PHP, kreativitas tetap menjadi faktor keberhasilan dalam membangun situs multilingual, selain tentu saja rajin membaca artikel, tutorial, dan source code yang sudah ada. Dan PHP sebagai produk open source memiliki dokumentasi yang sangat banyak di Internet, hanya sayangnya kebanyakan dari dokumentasi tersebut ditulis dalam bahasa Inggris. Jadi Anda memang harus terus ber-“endeswey… endeswey.” [ers]

Bài mới nhất

Chủ Đề