Yii 2 - Membuat website multi bahasa dengan menggunakan sistem i18n

alfa6661
- December 07, 2015
0 (0 votes)
Rate :
Cara membuat website dengan multi bahasa menggunakan Yii Framework.

Pada tutorial kali ini kita akan membahas multi language dengan Yii Framework 2. Banyak website yang memberikan kemudahan bagi para pengunjungnya untuk mengerti dan paham tentang isi website mereka. Salah satunya adalah menyediakan fitur Multi language (lebih dari 1 bahasa).

Untuk membangun website multi bahasa ada beberapa pilihan yang digunakan oleh setiap web developer
diantaranya:

  1. Membuat beberapa website yang bersamaan namun berbagai bahasa.
  2. Menggunakan variabel array atau untuk membuat website bahasa.

Pada tutorial ini, kita akan menggunakan cara nomor 2. kita kan menggunakan fungsi built-in Yii Framework untuk dukungan internasionalisasi yaitu i18n yang akan membuat aplikasi kita siap untuk diterjemahkan kedalam beberapa bahasa.

Apa i18n

18 adalah singkatan untuk jumlah alfabet antara yang pertama dan terakhir 'i' dan 'n' dalam internationalization atau internasionalisasi. Internasionalisasi (I18N) merujuk pada proses mendesain aplikasi software agar bisa diadaptasi ke berbagai bahasa dan wilayah tanpa perubahan proses pembuatannya. Untuk aplikasi Web, proses ini merupakan bagian penting karena pengguna potensial mungkin datang dari seluruh dunia.

Cara Kerja i18n

Contoh, ini adalah menu navigasi sebelum menggunakan i18n.

echo Nav::widget([
	'options' => ['class' => 'navbar-nav navbar-right'],
	'items' => [
		['label' => 'Home', 'url' => ['/site/index']],
	]
]);

Dan ini bagaimana kode setelah menggunakan i18n.

echo Nav::widget([
	'options' => ['class' => 'navbar-nav navbar-right'],
	'items' => [
		['label' => Yii::t('app', 'Home'), 'url' => ['/site/index']],
	]
]);

Untuk menampilkan output sesuai dengan bahasa yang sedang dipilih kita bisa menggunakan fungsi Yii::t().

Konfigurasi I18n

Langkah pertama untuk konfigurasi kita perlu untuk menggenerate file konfigurasi i18n dengan menggunakan perintah:

./yii message/config @app/config/i18n.php

Ini akan membuat file i18n.php pada folder config.

<?php
return [
    // string, required, root directory of all source files
    'sourcePath' => __DIR__,
    // array, required, list of language codes that the extracted messages
    // should be translated to. For example, ['zh-CN', 'de'].
    'languages' => ['de'],
    // string, the name of the function for translating messages.
    // Defaults to 'Yii::t'. This is used as a mark to find the messages to be
    // translated. You may use a string for single function name or an array for
    // multiple function names.
    'translator' => 'Yii::t',
    // boolean, whether to sort messages by keys when merging new messages
    // with the existing ones. Defaults to false, which means the new (untranslated)
    // messages will be separated from the old (translated) ones.
    'sort' => false,
    // boolean, whether to remove messages that no longer appear in the source code.
    // Defaults to false, which means each of these messages will be enclosed with a pair of '@@' marks.
    'removeUnused' => false,
    // array, list of patterns that specify which files/directories should NOT be processed.
    // If empty or not set, all files/directories will be processed.
    // A path matches a pattern if it contains the pattern string at its end. For example,
    // '/a/b' will match all files and directories ending with '/a/b';
    // the '*.svn' will match all files and directories whose name ends with '.svn'.
    // and the '.svn' will match all files and directories named exactly '.svn'.
    // Note, the '/' characters in a pattern matches both '/' and '\'.
    // See helpers/FileHelper::findFiles() description for more details on pattern matching rules.
    'only' => ['*.php'],
    // array, list of patterns that specify which files (not directories) should be processed.
    // If empty or not set, all files will be processed.
    // Please refer to "except" for details about the patterns.
    // If a file/directory matches both a pattern in "only" and "except", it will NOT be processed.
    'except' => [
        '.svn',
        '.git',
        '.gitignore',
        '.gitkeep',
        '.hgignore',
        '.hgkeep',
        '/messages',
    ],
    // 'php' output format is for saving messages to php files.
    'format' => 'php',
    // Root directory containing message translations.
    'messagePath' => __DIR__ . DIRECTORY_SEPARATOR . 'messages',
    // boolean, whether the message file should be overwritten with the merged messages
    'overwrite' => true,
    /*
    // 'db' output format is for saving messages to database.
    'format' => 'db',
    // Connection component to use. Optional.
    'db' => 'db',
    // Custom source message table. Optional.
    // 'sourceMessageTable' => '{{%source_message}}',
    // Custom name for translation message table. Optional.
    // 'messageTable' => '{{%message}}',
    */
    /*
    // 'po' output format is for saving messages to gettext po files.
    'format' => 'po',
    // Root directory containing message translations.
    'messagePath' => __DIR__ . DIRECTORY_SEPARATOR . 'messages',
    // Name of the file that will be used for translations.
    'catalog' => 'messages',
    // boolean, whether the message file should be overwritten with the merged messages
    'overwrite' => true,
    */
];

Kode di atas merupakan template untuk konfigurasi i18n, kita perlu menyesuaikan agar sesuai dengan yang kita harapkan. Kita bisa modifikasi konfigurasi di atas dengan menambahkan daftar bahasa yang akan digunakan, path dimana lokasi file bahasa akan disimpan, mengabaikan kategori, dll.

Contoh:

Kita akan menambahkan bahasa indonesia, mengubah lokasi penyimpanan bahasa, dan mengabaikan kategori.

return [
    // ....
    'languages' => ['id'],    
    // Message categories to ignore
    'ignoreCategories' => [
        'yii',
    ],
    // @app/messages
    'messagePath' => __DIR__ . DIRECTORY_SEPARATOR .'..'. DIRECTORY_SEPARATOR . 'messages',
    // ....

Pada langkah selanjutnya, kita akan menjalankan kode untuk mengekstrak bahasa yang akan memindai semua kode yang ada di aplikasi kita untuk menghasilkan file bahasa untuk semua label yang digunakan dalam kode kita.

./yii message/extract @app/config/i18n.php

Kita akan melihat Yii akan memindai semua file yang ada:

Extracting messages from /var/www/demo/yii2/config/db.php...
Extracting messages from /var/www/demo/yii2/config/console.php...
Extracting messages from /var/www/demo/yii2/views/layouts/main.php...
Extracting messages from /var/www/demo/yii2/views/site/about.php...
Extracting messages from /var/www/demo/yii2/views/site/contact.php...
Extracting messages from /var/www/demo/yii2/views/site/index.php...
Extracting messages from /var/www/demo/yii2/views/site/login.php...
Extracting messages from /var/www/demo/yii2/views/site/error.php...
Saving messages to /var/www/demo/yii2/config/../messages/id/app.php...

Kode diatas akan membuat direktori bahasa dan file bahasa yang kita definisikan pada kode sebelumnya. Berikut contoh kode hasil generate nya.

return [
    'About' => '',
    'Contact' => '',
    'Get started with Yii' => '',
    'Login' => '',
    'Logout ({username})' => '',
    'You have successfully created your Yii-powered application.' => '',
    'Congratulations!' => '',
    'Home' => '',
];

Kemudian isi kode di atas sesuai dengan terjemahan bahasanya.

return [
    'About' => 'Tentang',
    'Contact' => 'Kontak',
    'Get started with Yii' => 'Memulai Yii',
    'Login' => 'Masuk',
    'Logout ({username})' => 'Keluar ({username})',
    'You have successfully created your Yii-powered application.' => 'Anda telah berhasil membuat aplikasi berbasis-Yii.',
    'Congratulations!' => 'Selamat!',
    'Home' => 'Beranda',
];

Memilih bahasa yang akan digunakan:

Ada 2 cara untuk mengatur bahasa yang akan digunakan pada aplikasi kita:

Membuat pengaturan permanen

Kita bisa mengatur bahasa secara permanen pada file konfigurasi dengan menambahkan

'language' => 'id',

Merubah bahasa secara runtime

Kita bisa merubah behasa secara runtime dengan menambahkan kode pada fungsi init() controller.

public function init() 
{ 
	Yii::$app->language = 'id';
	parent::init();
}

Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter

– Eric S. Raymond

Have a better explanation?

If you have comments about this post. Please write your comments below

  • shaf_si - posted 1 year ago

    Sore,

    Tuk memanggil function initnya bgmn? apa bisa langsung refesh (reload).


    Thanks

    NewBie

    • alfa6661 - posted 1 year ago

      Gak perlu di panggil.

      fungsi init selalu di jalankan ketika controller di akses.