Advertisement
by
Difficulty:IntermediateLength:LongLanguages:

Indonesian (Bahasa Indonesia) translation by Ilham Saputra (you can also view the original English article)

Dalam artikel saya sebelumnya, saya membahas berbagai aspek Elixir - bahasa pemrograman fungsional modern. Hari ini, bagaimanapun, saya ingin menyingkir dari bahasa itu sendiri dan membahas framework MVC yang sangat cepat dan andal yang disebut Phoenix yang tertulis di Elixir.

Framework ini muncul hampir lima tahun yang lalu dan telah menerima beberapa daya tarik sejak saat itu. Tentu saja, ini tidak sepopuler Rails atau Django, tapi memang memiliki potensi besar dan saya sangat menyukainya.

Pada artikel ini kita akan melihat bagaimana mengenalkan I18n di aplikasi Phoenix. Apa itu I18n? kamu penasaran?, Baik, itu adalah numeronym yang berarti 'internationalization', karena ada tepat 18 karakter antara huruf pertama 'i' dan yang terakhir 'n'. Mungkin, Anda juga pernah bertemu dengan numeronym L10n yang berarti 'localization'. Pengembang hari ini begitu malas sehingga mereka bahkan tidak bisa menulis beberapa karakter tambahan, kan?

Internationalization adalah proses yang sangat penting, terutama jika Anda melihat terlebih dahulu aplikasi yang digunakan oleh orang-orang dari seluruh dunia. Bagaimanapun, tidak semua orang mengenal bahasa Inggris dengan baik, dan jika aplikasi diterjemahkan ke bahasa asli pengguna, akan memberi kesan yang bagus.

Tampaknya proses menerjemahkan aplikasi Phoenix agak berbeda dari, katakanlah, menerjemahkan aplikasi Rails (tapi sangat mirip dengan proses yang sama di Django). Untuk menerjemahkan aplikasi Phoenix, kami menggunakan solusi populer yang disebut Gettext, yang telah ada selama lebih dari 25 tahun. Gettext bekerja dengan jenis file khusus, yaitu PO dan POT, dan mendukung fitur seperti pelingkupan, pluralisasi, dan barang lainnya.

Jadi, di postingan ini saya akan menjelaskan kepada Anda apa itu Gettext, bagaimana PO berbeda dari POT, bagaimana melokalkan pesan di Phoenix, dan di mana menyimpan terjemahan. Kita juga akan melihat bagaimana cara mengganti lokasi aplikasi dan bagaimana cara bekerja dengan peraturan pluralisasi dan domain.

Haruskah kita mulai?

Internationalization Dengan Gettext

Gettext adalah alat internasionalisasi open source yang diuji coba yang awalnya diperkenalkan oleh Sun Microsystems pada tahun 1990. Pada tahun 1995, GNU merilis versi Gettext sendiri, yang sekarang dianggap paling populer di luar sana (versi terbaru adalah 0.19.8 pada saat penulisan artikel ini). Gettext dapat digunakan untuk membuat sistem multibahasa dari berbagai ukuran dan jenis, mulai dari aplikasi web hingga sistem operasional. Solusi ini cukup kompleks, dan kita tidak akan membahas semua fiturnya, tentunya. Dokumentasi Gettext lengkap dapat ditemukan di gnu.org.

Gettext memberi Anda semua tool yang diperlukan untuk melakukan pelokalan dan menyajikan beberapa persyaratan tentang bagaimana file terjemahan harus dinamai dan diatur. Dua jenis file digunakan untuk meng-host terjemahan: PO dan MO.

PO (Portable Object) menyimpan terjemahan untuk string dan aturan pluralisasi dan metadata. File-file ini memiliki struktur yang cukup sederhana dan mudah diedit oleh manusia, jadi pada artikel ini kita akan menaatinya. Setiap file PO berisi terjemahan (atau bagian dari terjemahan) untuk satu bahasa dan harus disimpan dalam direktori yang dinamai bahasa ini: en, fr, de, dll.

MO (Machine Object) file berisi data biner yang tidak dimaksudkan untuk diedit langsung oleh manusia. Mereka lebih sulit untuk bekerja dengan, dan mendiskusikannya berada di luar cakupan artikel ini.

Untuk membuat hal-hal yang lebih kompleks, ada juga file POT (Portable Object Template). Mereka hanya menjamu string data untuk diterjemahkan, tapi bukan terjemahannya sendiri. Pada dasarnya, file POT hanya digunakan sebagai cetak biru untuk membuat file PO untuk berbagai locales.

Contoh Aplikasi Phoenix

Baiklah, jadi sekarang mari kita lanjutkan praktik! Jika Anda ingin mengikuti, pastikan Anda telah menginstal yang berikut ini:

Buat contoh aplikasi baru tanpa database dengan menjalankan:

--no-ecto mengatakan bahwa database tidak boleh dimanfaatkan oleh aplikasi (Ecto adalah tool untuk berkomunikasi dengan DB itu sendiri). Perhatikan bahwa generator mungkin memerlukan beberapa menit untuk mempersiapkan semuanya.

Sekarang gunakan cd untuk pergi ke folder i18ndemo yang baru dibuat dan jalankan perintah berikut untuk boot server:

Selanjutnya, buka browser dan arahkan ke http://localhost:4000, di mana Anda harus melihat pesan 'Welcome to Phoenix!'.

Hello, Gettext!

Yang menarik dari aplikasi Phoenix kita dan, khususnya, pesan sambutannya adalah bahwa Gettext sudah digunakan secara default. Silakan buka file demo/lib/demo_web/templates/page/index.html.eex yang bertindak sebagai halaman awal default. Hapus semuanya kecuali untuk kode ini:

Pesan sambutan ini menggunakan fungsi gettext yang menerima string untuk diterjemahkan sebagai argumen pertama. String ini dapat dianggap sebagai translation key, meskipun agak berbeda dari tombol yang digunakan pada Rails I18n dan beberapa framework lainnya. Di Rails kita akan menggunakan kunci seperti page.welcome, sedangkan di sini string yang diterjemahkan adalah key itu sendiri. Jadi, jika terjemahannya tidak bisa ditemukan, kita bisa menampilkan string ini secara langsung. Bahkan pengguna yang mengenal bahasa Inggris dengan buruk bisa mendapatkan setidaknya sense dasar tentang apa yang sedang terjadi.

Pendekatan ini cukup berguna - berhenti sejenak dan memikirkannya. Anda memiliki aplikasi di mana semua pesan dalam bahasa Inggris. Jika Anda ingin menginternasionalisasikannya, dalam kasus yang paling sederhana yang harus Anda lakukan adalah membungkus pesan Anda dengan fungsi gettext dan memberikan terjemahan untuk mereka (nanti kita akan melihat bahwa proses penggalian key dapat dengan mudah dilakukan secara otomatis, yang mempercepat semuanya bertambah lebih).

Oke, mari kita kembali ke potongan kode kecil kita dan lihat argumen kedua dilewatkan ke gettext: nama:"Phoenix". Ini adalah apa yang disebut pengikatan-parameter yang dibungkus dengan %{} yang ingin kami interpolasikan ke terjemahan yang diberikan. Dalam contoh ini, hanya ada satu parameter yang disebut name.

Kami juga dapat menambahkan satu pesan lagi ke halaman ini untuk tujuan demonstrasi:

Menambahkan Terjemahan Baru

Sekarang kita memiliki dua pesan di halaman root, di mana kita harus menambahkan terjemahan untuk mereka? Tampaknya semua terjemahan disimpan di bawah folder priv/gettext, yang memiliki struktur yang telah ditentukan. Mari luangkan waktu untuk mendiskusikan bagaimana file Gettext harus diatur (ini tidak hanya berlaku untuk Phoenix tapi juga aplikasi apa pun yang menggunakan Gettext).

Pertama-tama, kita harus membuat folder yang dinamai sesuai dengan lokal yang akan disimpan untuk diterjemahkan. Di dalam, seharusnya ada folder bernama LC_MESSAGES yang berisi satu atau beberapa file .po dengan terjemahan sebenarnya. Dalam kasus yang paling sederhana, Anda akan memiliki satu file default.po per lokal. default di sini adalah nama domain (atau ruang lingkup). Domain digunakan untuk membagi terjemahan ke dalam berbagai kelompok: misalnya, Anda mungkin memiliki domain yang bernama admin, wysiwig, cart, dan lainnya. Ini nyaman bila Anda memiliki aplikasi besar dengan ratusan pesan. Untuk aplikasi yang lebih kecil, bagaimanapun, memiliki domain default tunggal sudah cukup.

Jadi struktur file kita mungkin terlihat seperti ini:

  • en
    • LC_MESSAGES
      • default.po
      • admin.po
  • ru
    • LC_MESSAGES
      • default.po
      • admin.po

Untuk mulai membuat file PO, pertama kita memerlukan template yang sesuai (POT). Kita bisa membuatnya secara manual, tapi saya terlalu malas melakukannya dengan cara ini. Mari jalankan perintah berikut sebagai gantinya:

Ini adalah tool yang sangat berguna yang memindai file proyek dan memeriksa apakah Gettext digunakan di mana saja. Setelah naskah selesai, sebuah file priv/gettext/default.pot baru yang berisi string untuk diterjemahkan akan dibuat.

Seperti yang telah kita pelajari, file POT adalah template, jadi mereka menyimpan hanya kunci itu sendiri, bukan terjemahannya, jadi jangan memodifikasi file seperti itu secara manual. Buka file yang baru dibuat dan lihat isinya:

Nyaman, bukan? Semua pesan kami disisipkan secara otomatis, dan kami dapat dengan mudah melihat dengan tepat di mana mereka berada. msgid, seperti yang mungkin sudah Anda duga, adalah key, sedangkan msgstr akan berisi terjemahan.

Langkah selanjutnya adalah, tentu saja, menghasilkan file PO. Menjalankan:

Script ini akan menggunakan template default.pot dan membuat file default.po di folder priv/gettext/en/LC_MESSAGES. Untuk saat ini, kami hanya memiliki bahasa Inggris, namun dukungan untuk bahasa lain juga akan ditambahkan di bagian berikutnya.

By the way, adalah mungkin untuk membuat atau memperbarui template POT dan semua file PO dalam satu waktu dengan menggunakan perintah berikut:

Sekarang mari kita buka file priv/gettext/en/LC_MESSAGES/default.po, yang memiliki konten berikut:

Ini adalah file dimana kita harus melakukan terjemahan yang sebenarnya. Tentu saja, tidak masuk akal untuk melakukannya karena pesannya sudah dalam bahasa Inggris, jadi mari kita lanjutkan ke bagian berikutnya dan tambahkan dukungan untuk bahasa kedua.

Multiple Locales

Wajar, lokasi default untuk aplikasi Phoenix adalah bahasa Inggris, namun pengaturan ini dapat diubah dengan mudah dengan men-tweak file config/config.exs. Misalnya, mari kita tetapkan lokal default ke bahasa Rusia (jangan ragu untuk tetap menggunakan bahasa lain pilihan Anda):

Sebaiknya tentukan daftar lengkap semua lokal yang didukung:

Sekarang apa yang perlu kita lakukan adalah menghasilkan file PO baru yang berisi terjemahan untuk lokal Rusia. Hal itu bisa dilakukan dengan menjalankan script gettext.merge lagi, tapi dengan tombol --locale switch:

Tentunya, folder priv/gettext/ru/LC_MESSAGES dengan file .po di dalamnya akan dihasilkan. Perhatikan, by the way, selain file default.po, kita juga punya error.po. Ini adalah tempat default untuk menerjemahkan pesan error, namun pada artikel ini kita akan mengabaikannya.

Sekarang tweak priv/gettext/ru/LC_MESSAGES/default.po dengan menambahkan beberapa terjemahan:

Sekarang, tergantung pada lokasi yang dipilih, Phoenix akan menerjemahkan terjemahan bahasa Inggris atau Rusia. Tapi tunggu sebentar! Bagaimana kita bisa benar-benar beralih antar lokal dalam aplikasi kita? Mari lanjutkan ke bagian selanjutnya dan cari tahu!

Switching Between Locales

Setelah beberapa terjemahan tersedia, kami harus mengaktifkan pengguna kami untuk beralih antar lokal. Tampaknya ada plug pihak ketiga untuk yang disebut set_locale. Ini bekerja dengan mengekstrak lokasi yang dipilih dari URL atau header HTTP Accept-Language. Jadi, untuk menentukan lokasi di URL, Anda akan mengetik http://localhost:4000/en/some_path. Jika lokal tidak ditentukan (atau jika bahasa yang tidak didukung diminta), satu dari dua hal akan terjadi:

  • Jika permintaan berisi header HTTP Accept-Language dan lokal ini didukung, pengguna akan diarahkan ke halaman dengan lokal yang sesuai.
  • Jika tidak, pengguna akan diarahkan secara otomatis ke URL yang berisi kode lokal default.

Buka file mix.exs dan turunkan set_locale ke fungsi deps:

Kita juga harus menambahkannya ke fungsi application:

Selanjutnya, instal semuanya:

Router kami yang terletak di lib/demo_web/router.ex membutuhkan beberapa perubahan juga. Secara khusus, kita perlu menambahkan plug baru ke pipeline :browser:

Juga, ciptakan ruang lingkup baru:

Dan itu dia! Anda bisa boot server dan arahkan ke http://localhost:4000/ru dan http://localhost:4000/en. Perhatikan bahwa pesan diterjemahkan dengan benar, itulah yang kita butuhkan!

Sebagai alternatif, Anda dapat mengodekan fitur yang serupa dengan menggunakan Modul plug. Contoh kecil bisa ditemukan di panduan resmi Phoenix.

Satu hal lagi yang perlu disebutkan adalah bahwa dalam beberapa kasus Anda mungkin perlu menerapkan lokasi tertentu. Untuk melakukan itu, cukup gunakan fungsi with_locale:

Pluralization

Kami telah mempelajari dasar-dasar penggunaan Gettext dengan Phoenix, jadi sudah saatnya membahas hal-hal yang sedikit lebih rumit. Pluralization adalah salah satunya. Pada dasarnya, bekerja dengan bentuk plural dan singular adalah tugas yang sangat umum meski berpotensi rumit. Hal-hal yang kurang lebih jelas dalam bahasa Inggris karena Anda memiliki '1 apel', '2 apel', '9000 apel' dll (meskipun '1 lembu', 'lembu jantan 2'!).

Sayangnya, dalam beberapa bahasa lain seperti bahasa Rusia atau Polandia, peraturannya lebih kompleks. Misalnya, dalam kasus apel, Anda akan mengatakan '1 яблоко', '2 яблока', '9000 яблок'. Tapi untungnya bagi kita, Phoenix memiliki perilaku Gettext.Plural (Anda mungkin melihat tingkah laku dalam tindakan di salah satu artikel saya sebelumnya) yang mendukung banyak bahasa yang berbeda. Karena itulah yang harus kita lakukan adalah memanfaatkan fungsi ngettext.

Fungsi ini menerima tiga argumen yang dibutuhkan: string dalam bentuk tunggal, string dalam bentuk jamak, dan hitungan. Argumen keempat bersifat opsional dan bisa mengandung binding yang harus diinterpolasi ke dalam terjemahan.

Mari kita lihat ngettext beraksi dengan mengatakan berapa banyak uang yang dimiliki pengguna dengan memodifikasi file demo/lib/demo_web/templates/page/index.html.eex:

%{count} adalah interpolasi yang akan diganti dengan angka (540 dalam kasus ini). Jangan lupa untuk mengupdate template dan semua file PO setelah menambahkan string di atas:

Anda akan melihat bahwa sebuah blok baru ditambahkan ke kedua file default.po:

Kita tidak memiliki satu tapi dua kunci di sini sekaligus: dalam bentuk tunggal dan dalam bentuk jamak. msgstr[0] akan berisi beberapa teks yang akan ditampilkan bila hanya ada satu pesan. msgstr[1], tentu saja, berisi teks yang akan ditampilkan bila ada banyak pesan. Tidak apa-apa untuk bahasa Inggris, tapi tidak cukup untuk bahasa Rusia di mana kita perlu memperkenalkan kasus ketiga:

Kasus 0 digunakan untuk 1 buck, dan kasus 1 untuk nol atau beberapa dolar. Kasus 2 digunakan sebaliknya.

Terjemahan Pelingkupan Dengan Domain

Topik lain yang ingin saya bahas dalam artikel ini dikhususkan untuk domain. Seperti yang sudah kita ketahui, domain digunakan untuk lingkup terjemahan, terutama dalam aplikasi besar. Pada dasarnya, mereka bertindak seperti namespace.

Setelah semua, Anda mungkin berakhir dalam situasi ketika kunci yang sama digunakan di banyak tempat, namun harus diterjemahkan sedikit berbeda. Atau bila Anda memiliki terlalu banyak terjemahan dalam satu file default.po dan ingin membaginya entah bagaimana. Saat itulah domain bisa sangat berguna.

Gettext mendukung beberapa domain di luar kotak. Yang harus Anda lakukan adalah memanfaatkan fungsi dgettext, yang bekerja hampir sama dengan gettext. Satu-satunya perbedaan adalah bahwa ia menerima nama domain sebagai argumen pertama. Misalnya, mari memperkenalkan domain notifikasi untuk, yah, tampilkan notifikasi. Tambahkan tiga baris kode lagi ke file demo/lib/demo_web/templates/page/index.html.eex:

Sekarang kita perlu membuat file POT dan PO baru:

Setelah skrip selesai melakukan tugasnya, notifications.pot serta dua file notifications.po akan dibuat. Perhatikan sekali lagi bahwa mereka diberi nama berdasarkan domain. Yang harus Anda lakukan sekarang adalah menambahkan terjemahan untuk bahasa Rusia dengan memodifikasi file priv/ru/LC_MESSAGES/notifications.po:

Bagaimana jika Anda ingin membuat plural pesan yang tersimpan di bawah domain tertentu? Ini semudah memanfaatkan fungsi dngettext. Ini bekerja seperti ngettext tapi juga menerima nama domain sebagai argumen pertama:

Kesimpulan

Pada artikel ini, kita telah melihat bagaimana mengenalkan internasionalisasi dalam aplikasi Phoenix dengan bantuan Gettext. Anda telah mempelajari apa itu file Gettext dan jenis file apa yang akan digunakannya. Kami memiliki solusi ini dalam tindakan, telah bekerja dengan file PO dan POT, dan menggunakan berbagai fungsi Gettext.

Juga, kami telah melihat cara untuk menambahkan dukungan untuk beberapa lokal dan menambahkan cara untuk beralih di antara keduanya dengan mudah. Terakhir, kita telah melihat bagaimana menerapkan peraturan pluralisasi dan bagaimana menjabarkan terjemahan dengan bantuan domain.

Semoga artikel ini bermanfaat bagi anda! Jika Anda ingin mempelajari lebih lanjut tentang Gettext dalam framework Phoenix, Anda dapat merujuk ke panduan resmi, yang memberikan contoh dan referensi API yang berguna untuk semua fungsi yang ada.

Saya berterima kasih untuk tetap dengan saya dan sampai ketemu lagi!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.