Cara Membuat Aplikasi Multibahasa: Demo Dengan PHP dan Gettext
Diterbitkan: 2022-03-11Baik Anda sedang membangun situs web atau aplikasi web lengkap, membuatnya dapat diakses oleh audiens yang lebih luas sering kali mengharuskannya tersedia dalam berbagai bahasa dan lokal.
Perbedaan mendasar antara kebanyakan bahasa manusia membuat hal ini tidak mudah. Perbedaan dalam aturan tata bahasa, nuansa bahasa, format tanggal, dan lainnya bergabung untuk membuat pelokalan menjadi tantangan yang unik dan berat.
Pertimbangkan contoh sederhana ini.
Aturan pluralisasi dalam bahasa Inggris cukup mudah: Anda dapat memiliki bentuk kata tunggal atau bentuk jamak dari sebuah kata.
Namun, dalam bahasa lain – seperti bahasa Slavia – ada dua bentuk jamak selain bentuk tunggal. Anda bahkan dapat menemukan bahasa dengan total empat, lima, atau enam bentuk jamak, seperti dalam bahasa Slovenia, Irlandia, atau Arab.
Cara kode Anda diatur, dan bagaimana komponen serta antarmuka Anda dirancang, memainkan peran penting dalam menentukan seberapa mudah Anda dapat melokalkan aplikasi Anda.
Internasionalisasi (i18n) basis kode Anda, membantu memastikan bahwa basis kode dapat disesuaikan dengan berbagai bahasa atau wilayah dengan relatif mudah. Internasionalisasi biasanya dilakukan sekali, sebaiknya di awal proyek untuk menghindari perubahan besar dalam kode sumber di kemudian hari.
Setelah basis kode Anda diinternasionalkan, pelokalan (l10n) menjadi masalah menerjemahkan konten aplikasi Anda ke bahasa/lokal tertentu.
Lokalisasi perlu dilakukan setiap kali bahasa atau wilayah baru perlu didukung. Juga, setiap kali bagian dari antarmuka (berisi teks) diperbarui, konten baru akan tersedia - yang kemudian perlu dilokalkan (yaitu, diterjemahkan) ke semua lokal yang didukung.
Pada artikel ini, kita akan belajar bagaimana menginternasionalkan dan melokalisasi perangkat lunak yang ditulis dalam PHP. Kami akan membahas berbagai opsi implementasi dan berbagai alat yang tersedia untuk memudahkan proses.
Alat untuk Internasionalisasi
Cara termudah untuk menginternasionalkan perangkat lunak PHP adalah dengan menggunakan file array. Array akan diisi dengan string yang diterjemahkan, yang kemudian dapat dilihat dari dalam template:
<h1><?=$TRANS['title_about_page']?></h1>
Namun, ini bukanlah cara yang direkomendasikan untuk proyek yang serius, karena pasti akan menimbulkan masalah pemeliharaan di kemudian hari. Beberapa masalah bahkan mungkin muncul di awal, seperti kurangnya dukungan untuk interpolasi variabel atau pluralisasi kata benda dan sebagainya.
Salah satu alat paling klasik (sering digunakan sebagai referensi untuk i18n dan l10n) adalah alat Unix yang disebut Gettext.
Meskipun berasal dari tahun 1995, ini masih merupakan alat yang komprehensif untuk menerjemahkan perangkat lunak yang juga mudah digunakan. Meskipun cukup mudah untuk memulai, ia masih memiliki alat pendukung yang kuat.
Gettext adalah apa yang akan kita gunakan dalam posting ini. Kami akan menyajikan aplikasi GUI hebat yang dapat digunakan untuk memperbarui file sumber l10n Anda dengan mudah, sehingga menghindari kebutuhan untuk berurusan dengan baris perintah.
Perpustakaan Untuk Memudahkan
Ada kerangka kerja web dan pustaka PHP utama yang mendukung Gettext dan implementasi i18n lainnya. Beberapa lebih mudah dipasang daripada yang lain, atau mendukung fitur tambahan atau mendukung format file i18n yang berbeda. Meskipun dalam dokumen ini, kami fokus pada alat yang disediakan dengan inti PHP, berikut adalah daftar beberapa lainnya yang layak disebutkan:
oscarotero/Gettext: Dukungan Gettext dengan antarmuka berorientasi objek; termasuk fungsi pembantu yang ditingkatkan, ekstraktor yang kuat untuk beberapa format file (beberapa di antaranya tidak didukung secara asli oleh perintah
gettext
). Juga dapat mengekspor ke format di luar hanya file .mo/.po, yang dapat berguna jika Anda perlu mengintegrasikan file terjemahan Anda ke bagian lain dari sistem, seperti antarmuka JavaScript.symfony/translation: Mendukung banyak format berbeda, tetapi merekomendasikan penggunaan XLIFF verbose. Tidak menyertakan fungsi pembantu atau ekstraktor bawaan, tetapi mendukung placeholder menggunakan
strtr()
secara internal.zend/i18n: Mendukung file array dan INI, atau format Gettext. Menerapkan lapisan caching untuk menghindari keharusan membaca sistem file setiap saat. Juga termasuk view helper, dan filter input lokal dan validator. Namun, ia tidak memiliki ekstraktor pesan.
Kerangka kerja lain juga menyertakan modul i18n, tetapi itu tidak tersedia di luar basis kodenya:
Laravel: Mendukung file array dasar; tidak memiliki ekstraktor otomatis tetapi menyertakan pembantu
@lang
untuk file template.Yii: Mendukung array, Gettext, dan terjemahan berbasis database, dan menyertakan pengekstrak pesan. Didukung oleh ekstensi
Intl
, tersedia sejak PHP 5.3, dan berdasarkan proyek ICU. Ini memungkinkan Yii untuk menjalankan penggantian yang kuat, seperti mengeja angka, memformat tanggal, waktu, interval, mata uang, dan ordinal.
Jika Anda memutuskan untuk menggunakan salah satu pustaka yang tidak menyediakan ekstraktor, Anda mungkin ingin menggunakan format Gettext, sehingga Anda dapat menggunakan rantai alat Gettext asli (termasuk Poedit) seperti yang dijelaskan di sisa bab ini.
Menginstal Gettext
Anda mungkin perlu menginstal Gettext dan pustaka PHP terkait dengan menggunakan manajer paket Anda, seperti apt-get atau yum. Setelah terinstal, aktifkan dengan menambahkan extension=gettext.so
(Linux/Unix) atau extension=php_gettext.dll
(Windows) ke file php.ini
Anda.
Di sini kita juga akan menggunakan Poedit untuk membuat file terjemahan. Anda mungkin akan menemukannya di manajer paket sistem Anda; itu tersedia untuk Unix, Mac, dan Windows dan dapat diunduh secara gratis di situs webnya juga.
Jenis File Gettext
Ada tiga jenis file yang biasanya Anda tangani saat bekerja dengan Gettext.
Yang utama adalah file PO (Portable Object) dan MO (Machine Object), yang pertama adalah daftar "objek yang diterjemahkan" yang dapat dibaca dan yang kedua adalah biner yang sesuai (untuk ditafsirkan oleh Gettext saat melakukan pelokalan). Ada juga file POT (PO Template), yang hanya berisi semua kunci yang ada dari file sumber Anda, dan dapat digunakan sebagai panduan untuk membuat dan memperbarui semua file PO.
File template tidak wajib; tergantung pada alat yang Anda gunakan untuk melakukan l10n, Anda akan baik-baik saja dengan hanya file PO/MO. Anda akan memiliki sepasang file PO/MO per bahasa dan wilayah, tetapi hanya satu POT per domain.
Memisahkan Domain
Ada beberapa kasus, dalam proyek besar, di mana Anda mungkin perlu memisahkan terjemahan ketika kata-kata yang sama menyampaikan arti yang berbeda dalam konteks yang berbeda.
Dalam kasus tersebut, Anda harus membaginya menjadi “domain” yang berbeda, yang pada dasarnya bernama grup file POT/PO/MO, di mana nama file adalah domain terjemahan tersebut .
Proyek kecil dan menengah biasanya, untuk kesederhanaan, hanya menggunakan satu domain; namanya arbitrer, tetapi kami akan menggunakan "utama" untuk contoh kode kami.
Dalam proyek Symfony, misalnya, domain digunakan untuk memisahkan terjemahan untuk pesan validasi.
Kode Lokal
Lokal hanyalah kode yang mengidentifikasi satu versi bahasa. Ini didefinisikan mengikuti spesifikasi ISO 639-1 dan ISO 3166-1 alpha-2: dua huruf kecil untuk bahasa, secara opsional diikuti oleh garis bawah dan dua huruf besar yang mengidentifikasi kode negara atau regional.
Untuk bahasa langka, tiga huruf digunakan.
Untuk beberapa pembicara, bagian negara mungkin tampak berlebihan. Bahkan, beberapa bahasa memiliki dialek di berbagai negara, seperti Jerman Austria (de_AT) atau Portugis Brasil (pt_BR). Bagian kedua digunakan untuk membedakan antara dialek-dialek tersebut - jika tidak ada, itu dianggap sebagai versi bahasa "generik" atau "hibrida".
Struktur Direktori
Untuk menggunakan Gettext, kita perlu mematuhi struktur folder tertentu.
Pertama, Anda harus memilih root sembarang untuk file l10n Anda di repositori sumber Anda. Di dalamnya, Anda akan memiliki folder untuk setiap lokal yang dibutuhkan, dan folder "LC_MESSAGES" tetap yang akan berisi semua pasangan PO/MO Anda.
Bentuk Jamak
Seperti yang kami katakan di pendahuluan, bahasa yang berbeda mungkin memiliki aturan pluralisasi yang berbeda. Namun, Gettext menyelamatkan kita dari masalah ini.
Saat membuat file .po baru, Anda harus mendeklarasikan aturan pluralisasi untuk bahasa tersebut, dan bagian terjemahan yang peka terhadap jamak akan memiliki bentuk yang berbeda untuk setiap aturan tersebut.
Saat memanggil Gettext dalam kode, Anda harus menentukan nomor yang terkait dengan kalimat (misalnya untuk frasa "Anda memiliki n pesan.", Anda harus menentukan nilai n), dan itu akan menghasilkan bentuk yang benar untuk digunakan - bahkan menggunakan substitusi string jika diperlukan.
Aturan jamak terdiri dari jumlah aturan yang diperlukan dengan pengujian boolean untuk setiap aturan (pengujian untuk paling banyak satu aturan dapat dihilangkan). Sebagai contoh:
Jepang:
nplurals=1; plural=0;
nplurals=1; plural=0;
- satu aturan: tidak ada bentuk jamakInggris:
nplurals=2; plural=(n != 1);
nplurals=2; plural=(n != 1);
- dua aturan: gunakan bentuk jamak hanya jika n bukan 1, jika tidak gunakan bentuk tunggal.Portugis Brasil:
nplurals=2; plural=(n > 1);
nplurals=2; plural=(n > 1);
- dua aturan, gunakan bentuk jamak hanya jika n lebih besar dari 1, jika tidak gunakan bentuk tunggal.
Untuk penjelasan yang lebih dalam, ada tutorial LingoHub informatif yang tersedia secara online.
Gettext akan menentukan aturan mana yang akan digunakan berdasarkan nomor yang diberikan dan akan menggunakan versi string yang dilokalkan dengan benar. Untuk string di mana pluralisasi perlu ditangani, Anda perlu memasukkan dalam file .po kalimat yang berbeda untuk setiap aturan jamak yang ditentukan.
Contoh Implementasi
Setelah semua teori itu, mari kita sedikit praktis. Berikut ini kutipan dari file .po (jangan terlalu khawatir tentang sintaksnya, tetapi cukup pahami konten keseluruhannya):
msgid "" msgstr "" "Language: pt_BR\n" "Content-Type: text/plain; charset=UTF-8\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" msgid "We're now translating some strings" msgstr "Nos estamos traduzindo algumas strings agora" msgid "Hello %1$s! Your last visit was on %2$s" msgstr "Ola %1$s! Sua ultima visita foi em %2$s" msgid "Only one unread message" msgid_plural "%d unread messages" msgstr[0] "So uma mensagem nao lida" msgstr[1] "%d mensagens nao lidas"
Bagian pertama berfungsi seperti header, dengan msgid
dan msgstr
kosong.
Ini menjelaskan pengkodean file, bentuk jamak, dan beberapa hal lainnya. Bagian kedua menerjemahkan string sederhana dari bahasa Inggris ke bahasa Portugis Brasil, dan bagian ketiga melakukan hal yang sama, tetapi memanfaatkan penggantian string dari sprintf
, memungkinkan terjemahan berisi nama pengguna dan tanggal kunjungan.
Bagian terakhir adalah contoh bentuk pluralisasi, menampilkan versi tunggal dan jamak sebagai msgid
dalam bahasa Inggris dan terjemahan yang sesuai sebagai msgstr
0 dan 1 (mengikuti nomor yang diberikan oleh aturan jamak).
Di sana juga digunakan penggantian string, sehingga angka dapat dilihat langsung dalam kalimat, dengan menggunakan %d
. Bentuk jamak selalu memiliki dua msgid
(tunggal dan jamak), jadi disarankan untuk tidak menggunakan bahasa yang rumit sebagai sumber terjemahan.
Tombol Lokalisasi
Seperti yang mungkin Anda perhatikan, kami menggunakan kalimat bahasa Inggris yang sebenarnya sebagai ID sumber. msgid
itu sama digunakan di semua file .po Anda, artinya bahasa lain akan memiliki format yang sama dan bidang msgid
yang sama tetapi baris msgstr
yang diterjemahkan.
Berbicara tentang kunci terjemahan, ada dua pendekatan “filosofis” standar di sini:
1. msgstr sebagai kalimat nyata
Keuntungan utama dari pendekatan ini adalah:
Jika ada bagian dari perangkat lunak yang tidak diterjemahkan dalam bahasa tertentu, kunci yang ditampilkan akan tetap memiliki arti tertentu. Misalnya, jika Anda tahu cara menerjemahkan dari bahasa Inggris ke bahasa Spanyol tetapi membutuhkan bantuan untuk menerjemahkan ke bahasa Prancis, Anda dapat memublikasikan halaman baru dengan kalimat bahasa Prancis yang hilang, dan sebagai gantinya, bagian situs web akan ditampilkan dalam bahasa Inggris.
Jauh lebih mudah bagi penerjemah untuk memahami apa yang terjadi dan membuat terjemahan yang tepat berdasarkan
msgid
.Ini memberi Anda l10n "gratis" untuk satu bahasa - bahasa sumber.
Di sisi lain, kelemahan utama adalah, jika Anda perlu mengubah teks yang sebenarnya, Anda perlu mengganti msgid
yang sama di beberapa file bahasa.
2. msgstr sebagai kunci yang unik dan terstruktur
Ini akan menjelaskan peran kalimat dalam aplikasi secara terstruktur, termasuk template atau bagian di mana string berada, bukan kontennya.
Ini adalah cara yang bagus untuk mengatur kode, memisahkan konten teks dari logika template. Namun, itu bisa menimbulkan masalah bagi penerjemah yang akan kehilangan konteksnya.
Sebuah file bahasa sumber akan diperlukan sebagai dasar untuk terjemahan lainnya. Misalnya, pengembang idealnya memiliki file "en.po", yang akan dibaca oleh penerjemah untuk memahami apa yang harus ditulis di "fr.po".
Terjemahan yang hilang akan menampilkan kunci yang tidak berarti di layar ("top_menu.welcome" alih-alih "Halo, Pengguna!" Di halaman bahasa Prancis yang belum diterjemahkan).

Itu bagus karena akan memaksa terjemahan untuk diselesaikan sebelum diterbitkan - tetapi buruk karena masalah terjemahan akan sangat buruk di antarmuka. Namun, beberapa perpustakaan menyertakan opsi untuk menentukan bahasa tertentu sebagai "fallback", yang memiliki perilaku serupa dengan pendekatan lainnya.
Manual Gettext menyukai pendekatan pertama karena, secara umum, lebih mudah bagi penerjemah dan pengguna jika terjadi masalah. Itulah pendekatan yang akan kita gunakan di sini juga.
Perlu dicatat, bahwa dokumentasi Symfony mendukung terjemahan berbasis kata kunci, untuk memungkinkan perubahan independen dari semua terjemahan tanpa mempengaruhi template juga.
Penggunaan Sehari-hari
Dalam aplikasi umum, Anda akan menggunakan beberapa fungsi Gettext saat menulis teks statis di halaman Anda.
Kalimat-kalimat itu kemudian akan muncul di file .po, diterjemahkan, dikompilasi ke dalam file .mo, dan kemudian digunakan oleh Gettext saat merender antarmuka yang sebenarnya. Mengingat itu, mari kita ikat bersama apa yang telah kita bahas sejauh ini dalam contoh langkah demi langkah:
1. Contoh file template, termasuk beberapa panggilan gettext yang berbeda
<?php include 'i18n_setup.php' ?> <div> <h1><?=sprintf(gettext('Welcome, %s!'), $name)?></h1> <!-- code indented this way only for legibility → <?php if ($unread): ?> <h2> <?=sprintf( ngettext('Only one unread message', '%d unread messages', $unread), $unread )?> </h2> <?php endif ?> </div> <h1><?=gettext('Introduction')?></h1> <p><?=gettext('We\'re now translating some strings')?></p>
gettext()
hanya menerjemahkanmsgid
ke dalammsgstr
yang sesuai untuk bahasa tertentu. Ada juga fungsi singkatan_()
yang bekerja dengan cara yang samangettext()
melakukan hal yang sama tetapi dengan aturan jamakAda juga
dgettext()
dandngettext()
, yang memungkinkan Anda mengganti domain untuk satu panggilan (lebih lanjut tentang konfigurasi domain di contoh berikutnya)
2. Contoh file setup (i18n_setup.php seperti yang digunakan di atas), memilih lokal yang benar dan mengkonfigurasi Gettext
Menggunakan Gettext melibatkan sedikit kode boilerplate, tetapi sebagian besar tentang mengkonfigurasi direktori lokal dan memilih parameter yang sesuai (lokal dan domain).
<?php /** * Verifies if the given $locale is supported in the project * @param string $locale * @return bool */ function valid($locale) { return in_array($locale, ['en_US', 'en', 'pt_BR', 'pt', 'es_ES', 'es'); } //setting the source/default locale, for informational purposes $lang = 'en_US'; if (isset($_GET['lang']) && valid($_GET['lang'])) { // the locale can be changed through the query-string $lang = $_GET['lang']; //you should sanitize this! setcookie('lang', $lang); //it's stored in a cookie so it can be reused } elseif (isset($_COOKIE['lang']) && valid($_COOKIE['lang'])) { // if the cookie is present instead, let's just keep it $lang = $_COOKIE['lang']; //you should sanitize this! } elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { // default: look for the languages the browser says the user accepts $langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); array_walk($langs, function (&$lang) { $lang = strtr(strtok($lang, ';'), ['-' => '_']); }); foreach ($langs as $browser_lang) { if (valid($browser_lang)) { $lang = $browser_lang; break; } } } // here we define the global system locale given the found language putenv("LANG=$lang"); // this might be useful for date functions (LC_TIME) or money formatting (LC_MONETARY), for instance setlocale(LC_ALL, $lang); // this will make Gettext look for ../locales/<lang>/LC_MESSAGES/main.mo bindtextdomain('main', '../locales'); // indicates in what encoding the file should be read bind_textdomain_codeset('main', 'UTF-8'); // if your application has additional domains, as cited before, you should bind them here as well bindtextdomain('forum', '../locales'); bind_textdomain_codeset('forum', 'UTF-8'); // here we indicate the default domain the gettext() calls will respond to textdomain('main'); // this would look for the string in forum.mo instead of main.mo // echo dgettext('forum', 'Welcome back!'); ?>
3. Mempersiapkan terjemahan untuk penayangan pertama
Salah satu keuntungan besar yang dimiliki Gettext dibandingkan paket kerangka kerja khusus i18n adalah format filenya yang luas dan kuat.
Mungkin Anda berpikir “Ya ampun, itu cukup sulit untuk dipahami dan diedit dengan tangan, array sederhana akan lebih mudah!” Jangan salah, aplikasi seperti Poedit ada di sini untuk membantu - banyak. Anda bisa mendapatkan program dari situs web mereka, gratis dan tersedia untuk semua platform. Ini adalah alat yang cukup mudah untuk digunakan, dan alat yang sangat kuat pada saat yang sama - menggunakan semua fitur yang tersedia Gettext. Kami akan bekerja di sini dengan versi terbaru, Poedit 1.8.
Pada proses pertama, Anda harus memilih “File > New…” dari menu. Anda akan dimintai bahasa; pilih/filter bahasa yang ingin Anda terjemahkan, atau gunakan format yang kami sebutkan sebelumnya, seperti en_US
atau pt_BR
.
Sekarang, simpan file - menggunakan struktur direktori yang kami sebutkan juga. Kemudian Anda harus mengklik "Ekstrak dari sumber", dan di sini Anda akan mengonfigurasi berbagai pengaturan untuk tugas ekstraksi dan terjemahan. Anda akan dapat menemukan semua itu nanti melalui “Katalog > Properti”:
Jalur sumber: Sertakan semua folder dari proyek tempat
gettext()
(dan saudara kandung) dipanggil - ini biasanya folder template/tampilan Anda. Ini adalah satu-satunya pengaturan wajib.Properti terjemahan:
- Nama dan versi proyek, Tim dan alamat email Tim: Informasi berguna yang ada di header file .po.
- Bentuk jamak: Ini adalah aturan yang kami sebutkan sebelumnya. Anda dapat membiarkannya dengan opsi default sebagian besar waktu, karena Poedit sudah menyertakan database aturan jamak yang berguna untuk banyak bahasa.
- Charsets: UTF-8, lebih disukai.
- Rangkaian kode sumber: Rangkaian karakter yang digunakan oleh basis kode Anda - mungkin juga UTF-8, bukan?
Kata kunci sumber: Perangkat lunak yang mendasari mengetahui bagaimana
gettext()
dan panggilan fungsi serupa terlihat dalam beberapa bahasa pemrograman, tetapi Anda juga dapat membuat fungsi terjemahan sendiri. Ini akan di sini Anda akan menambahkan metode-metode lain. Ini akan dibahas nanti di bagian "Tips".
Setelah mengatur properti tersebut, Poedit akan menjalankan pemindaian melalui file sumber Anda untuk menemukan semua panggilan pelokalan. Setelah setiap pemindaian, Poedit akan menampilkan ringkasan dari apa yang ditemukan dan apa yang telah dihapus dari file sumber. Entri baru akan dikosongkan ke dalam tabel terjemahan, memungkinkan Anda untuk memasukkan versi lokal dari string tersebut. Simpan dan file .mo akan (kembali) dikompilasi ke dalam folder yang sama dan, presto!, proyek Anda diinternasionalkan!
Poedit juga dapat menyarankan terjemahan umum dari web dan dari file sebelumnya. Ini berguna sehingga Anda hanya perlu memeriksa apakah itu masuk akal, dan menerimanya. Jika Anda tidak yakin tentang terjemahan, Anda dapat menandainya sebagai Fuzzy, dan itu akan ditampilkan dengan warna kuning. Entri biru adalah entri yang tidak memiliki terjemahan.
4. Menerjemahkan string
Seperti yang mungkin Anda perhatikan, ada dua jenis utama string terlokalisasi: string sederhana dan string dengan bentuk jamak.
Yang sederhana hanya memiliki dua kotak: sumber dan string lokal. String sumber tidak dapat dimodifikasi, karena Gettext/Poedit tidak menyertakan kemampuan untuk mengubah file sumber Anda; alih-alih, Anda perlu mengubah sumber itu sendiri dan memindai ulang file. ( Tip: Jika Anda mengklik kanan baris terjemahan, itu akan menampilkan petunjuk dengan file sumber dan baris di mana string itu digunakan.)
String bentuk jamak menyertakan dua kotak untuk menampilkan dua string sumber, dan tab sehingga Anda dapat mengonfigurasi bentuk akhir yang berbeda.
Contoh string dengan bentuk jamak di Poedit, menunjukkan tab terjemahan untuk masing-masing string.
Setiap kali Anda mengubah file kode sumber dan perlu memperbarui terjemahan, tekan saja Refresh dan Poedit akan memindai ulang kode, menghapus entri yang tidak ada, menggabungkan entri yang diubah dan menambahkan entri baru.
Poedit mungkin juga mencoba menebak beberapa terjemahan, berdasarkan terjemahan lain yang Anda buat. Tebakan tersebut dan entri yang diubah akan menerima penanda "Fuzzy", yang menunjukkan bahwa mereka perlu ditinjau, ditampilkan dengan warna kuning dalam daftar.
Ini juga berguna jika Anda memiliki tim penerjemah dan seseorang mencoba menulis sesuatu yang tidak mereka yakini: cukup tandai dengan Fuzzy dan orang lain akan meninjaunya nanti.
Terakhir, disarankan untuk membiarkan tanda “Lihat > Entri yang belum diterjemahkan terlebih dahulu”, karena ini akan membantu Anda menghindari kelupaan entri apa pun. Dari menu itu, Anda juga dapat membuka bagian UI yang memungkinkan Anda meninggalkan informasi kontekstual untuk penerjemah jika diperlukan.
Tips dan Trik
Server web mungkin akan menyimpan file .mo Anda dalam cache.
Jika Anda menjalankan PHP sebagai modul di Apache (mod_php), Anda mungkin menghadapi masalah dengan file .mo yang sedang di-cache. Itu terjadi saat pertama kali dibaca, dan kemudian, untuk memperbaruinya, Anda mungkin perlu memulai ulang server.
Pada Nginx dan PHP5 biasanya hanya diperlukan beberapa halaman untuk menyegarkan cache terjemahan, dan pada PHP7 jarang diperlukan.
Pustaka menyediakan fungsi pembantu untuk menjaga agar kode pelokalan tetap pendek.
Seperti yang disukai oleh banyak orang, lebih mudah menggunakan _()
daripada gettext()
. Banyak pustaka i18n khusus dari kerangka kerja menggunakan sesuatu yang mirip dengan t()
juga, untuk membuat kode yang diterjemahkan lebih pendek. Namun, itulah satu-satunya fungsi yang menggunakan jalan pintas.
Anda mungkin ingin menambahkan proyek Anda yang lain, seperti __()
atau _n()
untuk ngettext()
, atau mungkin _r()
mewah yang akan bergabung dengan panggilan gettext()
dan sprintf()
. Pustaka lain, seperti Gettext oscarotero juga menyediakan fungsi pembantu seperti ini.
Dalam kasus tersebut, Anda harus menginstruksikan utilitas Gettext tentang cara mengekstrak string dari fungsi baru tersebut. Jangan takut, itu sangat mudah. Itu hanya sebuah bidang di file .po atau layar Pengaturan di Poedit (di editor, opsi itu ada di dalam “Katalog > Properti > Kata kunci sumber”).
Ingat: Gettext sudah mengetahui fungsi default untuk banyak bahasa, jadi jangan khawatir jika daftar itu tampak kosong. Anda perlu memasukkan dalam daftar itu spesifikasi fungsi baru, mengikuti format khusus ini:
Jika Anda membuat sesuatu seperti
t()
, yang hanya mengembalikan terjemahan untuk sebuah string, Anda dapat menentukannya sebagait
. Gettext akan mengetahui bahwa satu-satunya argumen fungsi adalah string yang akan diterjemahkan;Jika fungsi memiliki lebih dari satu argumen, Anda dapat menentukan di mana string pertama berada dan, jika perlu, bentuk jamaknya juga. Misalnya, jika tanda tangan fungsi kita adalah
__('one user', '%d users', $number)
, spesifikasinya adalah__:1,2
, artinya bentuk pertama adalah argumen pertama, dan bentuk kedua adalah argumen argumen kedua. Jika nomor Anda muncul sebagai argumen pertama, spesifikasinya adalah__:2,3
, yang menunjukkan bahwa bentuk pertama adalah argumen kedua, dan seterusnya.
Setelah memasukkan aturan baru tersebut ke dalam file .po, pemindaian baru akan memasukkan string baru Anda semudah sebelumnya.
Jadikan Aplikasi PHP Anda Multibahasa Dengan Gettext
Gettext adalah alat yang sangat kuat untuk menginternasionalkan proyek PHP Anda. Di luar fleksibilitasnya yang memungkinkan dukungan untuk sejumlah besar bahasa manusia, dukungannya untuk lebih dari 20 bahasa pemrograman memungkinkan Anda untuk dengan mudah mentransfer pengetahuan Anda tentang menggunakannya dengan PHP ke bahasa lain seperti Python, Java, atau C#.
Lebih jauh lagi, Poedit dapat membantu memperlancar jalur antara kode dan string yang diterjemahkan, membuat prosesnya lebih mudah dan lebih mudah diikuti. Itu juga dapat merampingkan upaya terjemahan bersama dengan integrasi Crowdin-nya.
Jika memungkinkan, pertimbangkan bahasa lain yang mungkin digunakan pengguna Anda. Ini sangat penting untuk proyek non-Inggris: Anda dapat meningkatkan akses pengguna jika merilisnya dalam bahasa Inggris dan juga bahasa ibu Anda.
Tentu saja, tidak semua proyek membutuhkan internasionalisasi, tetapi jauh lebih mudah untuk memulai proyek selama masa awal proyek, bahkan jika pada awalnya tidak diperlukan, daripada melakukannya nanti di kemudian hari jika kemudian menjadi persyaratan. Dan, dengan alat seperti Gettext dan Poedit, semuanya menjadi lebih mudah dari sebelumnya.