Slim Framework Multi-language dengan Symfony Translation

Halo guys, apa kabar? Pastinya baik-baik saja. Akhir-akhir ini saya sering mendapatkan order website company profile dengan multi-language. Paling enak menggunakan WordPress karena ada plugin. Tapi gimana kalo web app?

Saat saya dulu menggunakan CodeIgniter dengan mudah saya menggunakan library bawaan, tapi saat ini saya menggunakan Slim Framework. Tidak susah mencari package translation/language karena semua ada di packagist.

Saya menggunakan symfony/translation untuk package translation karena penggunaannya yang mudah dan tentu saja agnostik (tidak tergantung dengan framework). Langsung saja kita mulai tutorialnya.

Sebelum melanjutkan tutorial, saya sarankan untuk membaca artikel berseri Slim Framework di URL ini agar tutorial ini lebih mudah dimengerti.

Langkah pertama kita akan menginstal Slim Framework, tapi saya akan menggunakan skeleton saja agar lebih mudah.

$ composer create-project slim/slim-skeleton [my-app-name]

Pastikan untuk membuat folder logs writeable, karena monolog akan menyimpan log didalam folder log.

$ chmod -R 777 logs/

Lalu kita install symfony/translation.

$ composer require symfony/translation

symfony/translation menyediakan beberapa dukungan filetype/format, tapi saat ini saya akan menggunakan php array saja. Untuk itu kita akan membuat folder lang dan isinya hanya translasi untuk Bahasa Indonesia dan Inggris saja.

$ mkdir lang/

$ touch lang/id.php

$ touch lang/en.php

Isi file tersebut masing-masing sesuai dengan bahasanya. Seperti contoh di bawah ini:

Selanjutnya kita akan setting di  src/settings.php

Setelah itu kita tambahkan di dependency di file src/dependencies.php

Saya akan jelaskan sedikit untuk code di atas:

$settings = $c->get('settings')['lang']; digunakan untuk mengambil setting.

$translator = new Translator("id", new MessageSelector()); factory untuk class Translator, di mana bahasa default yang digunakan adalah id(Indonesia).

$translator->setFallbackLocales(['en']); set bahasa ke en(English) jika id tidak tersedia.

$translator->addLoader('php', new PhpFileLoader()); definisikan loader, penjelasan sebelumnya loader yang kita gunakan adalah php.

Perulangan dalam foreach() adalah me-load file php yang berisi translate.

Untuk mentranslate kita bisa gunakan method trans pada routes.php:

Language pada URL

Pernah kan liat website yang urlnya gini www.domain.com/en/? Atau  www.domain.com/id/? Atau semacam itu? Yaps, secara kasat mata itu mengarah ke sebuah folder yang isinya file HTML yang berbeda sesuai dengan bahasanya, tapi jauh lebih rumit dari itu, file HTML yang sama dapat memuat bahasa yang bebeda seperti di bawah ini:

Bagaimana logikanya?

  1. Sebelumnya sudah kita tentukan bahasa default-nya adalah id
  2. Pisahkan URI berdasarkan / (slash), cari array yang pertama; contoh URI: /en/make-translation-slim-framework, maka array yang pertama adalah en
  3. Jika segment pertama cocok dengan languge setting maka setting bahasa ke en
  4. Kemudian re-route ke url tanpa ada bahasal; sesuai dengan contoh no 2 maka re-route ke make-translation-slim-framework
  5. Jika tidak cocok , jalankan code selanjutnya.

Dalam kasus ini, saya akan menggunakan middleware untuk melakukan pengecekan bahasa, setting bahasa, dan re-route. Kurang lebih codenya seperti di bawah ini:

Ada yang aneh?

use ($app), semestinya bisa hanya menggunakan $this, tapi terdapat inconsistency pada pemanggilan method karena $this dalam middleware ada container. Penjelasan lengkapnya ada di sini.

subRequest, method ini berfungsi mengalihkan route atau re-route ke halaman yang kita kehendaki, dengan return berupa response. Lengkapnya ada di sini.

Setelah mengubah middleware, saya akan melakukan modifikasi pada route:

Test aplikasi dengan mengarahkan ke url di bawah ini:

  1. http://web.local/
  2. http://web.local/id
  3. http://web.local/en
  4. http://web.local/tirta
  5. http://web.local/id/tirta
  6. http://web.local/en/tirta

http://web.local/ = localhost dengan embel-embel project folder.

Jika kamu sudah coba membuat sendiri ayo coba sharing lewat kolom komentar di bawah. Saya tunggu ya!

Leave a Reply