Website Multi Bahasa dengan Code Igniter

Saya dan tim kandangbuaya kali ini kebagian ‘tugas negara’, untuk membuat website resmi Elins UGM yang baru. Sebenarnya dari pihak Prodi hanya menginginkan untuk dibuat satu bahasa saja. Namun saya mengusulkan untuk dibikin multi bahasa. Dan akhirnya dibuat dua bahasa, Indonesia dan English.

Kami coding menggunakan CodeIgniter PHP Framework, dimana CI sudah support untuk internasionalisasi multi bahasa. Nah, bagaimana kita mengaplikasikannya? Disini, kita menggunakan Cookie untuk menyimpan seting bahasa dari user. Jadi user bisa memilih bahasa Indonesia maupun Bahasa Inggris(English) dan kemudian disimpan di Cookie. Nah setiap halaman diload, program akan mengecek dulu, bahasa apa yang dipakai, kemudian baru menampilkan tampilan bahasa yang cocok. Default bahasa adalah bahasa Indonesia. Berikut adalah contoh source code yang kami gunakan. Ini hanya contoh saja. Jadi masih butuh banyak sekali pengembangan.

<?php
// Controller I
class Content extends Controller {
	public function __construct() {
		parent::Controller();
		// file-file ini sebaiknya di load di fitur autoload
		$this->load->helper('url');
		$this->load->helper('cookie');
		$this->load->library('language');

		if(get_cookie('bahasa') === 'en') {
			$this->config->set_item('language', 'english');
			$this->load->model('english', 'current_language');
		}
		else {
			$this->config->set_item('language', 'indonesia');
			$this->load->model('indonesia', 'current_language');

			set_cookie(array('name'	=> 'bahasa',
						  'value'	=> 'in',
						  'expire' 	=> '8650',
						  'prefix' 	=> ''));
		}
	}

	public function index() {
		// Mengambil data dari language file di application/language
		$this->lang->load('d3ptzz');
		$data['title'] = $this->lang->line('title');
		$data['hello'] = $this->lang->line('hallo');

		// Mengambil data dari model
		$data['dari_db'] = $this->current_language->get_data();
		$this->load->view('view_multibahasa', $data);
	}
}
//------------------------------------------------------
?>

<?php
//Controller II

// Controller ini fungsinya cuma merubah cookie['bahasa] sesuai request.
// Setelah selesai merubah cookie['bahasa'], terus di redirect ke halaman semula
class Language_setter extends Controller {
	public function __construct() {
		parent::Controller();
		$this->load->helper('cookie');
		$this->load->helper('url');
	}

	public function index() {	}

	public function set_to($language) {
		if(strtolower($language) === 'english') {
			$lang = 'en';
		}
		else {
			$lang = 'in';
		}

		set_cookie(array('name'		=> 'bahasa',
					  'value'	=> $lang,
					  'expire' 	=> '86500',
					  'prefix' 	=> ''));

		if($this->input->server('HTTP_REFERER'))
			redirect($this->input->server('HTTP_REFERER'));
	}
}
//------------------------------------------------------
?>

<?php
// Model I
class English extends Model {
	public function __cosntruct() {
		parent::Model();
	}

	public function get_data() {
		// Pura-puranya disini dilakukan query ke database
		// dan ini adalah hasilnya :
		return 'I am data from database fetched via English model';
	}
}
//------------------------------------------------------
?>

<?php
// Model II
class Indonesia extends Model {
	public function __cosntruct() {
		parent::Model();
	}

	public function get_data() {
		// Pura-puranya disini dilakukan query ke database
		// dan ini adalah hasilnya :
		return 'Saya data dari database di ambil via model "Indonesia"';
	}
}

//------------------------------------------------------
?>

<?php
// File view, beri nama view_multibahasa.php
?>
<html>
<head><title><?=$title?></title>
</head>
<body>
<table border="1" cellpadding="5">
 <tr>
	<td width="600">
		<h2><?=$title?></h2>
	</td>
	<td width="200">
		<a href="<?=site_url('language_setter/set_to/indonesia')?>">Indonesia</a> |
		<a href="<?=site_url('language_setter/set_to/english')?>">English</a>
	</td>
 </tr>
 <tr>
	<td width="400">
		<h4>Mengambil Data dari file lang bahasa di application/language</h4>
		<p><?=$hello?></p>
	</td>
	<td width="100"></td>
 <tr>
 <tr>
	<td width="400">
		<h4>Mengambil Data dari Database via Model</h4>
		<p><?=$dari_db?></p>
	</td>
	<td width="100"></td>
 <tr>
</table>
</body>
</html>
<?
//------------------------------------------------------
?>

<?php
// Simpan di application/language/english/d3ptzz_lang.php
$lang['title'] = ' Multi Language Web Site';
$lang['hallo'] = 'Hi, my name is d3ptzz.';

//------------------------------------------------------
?>

<?php
// Simpan di application/language/indonesia/d3ptzz_lang.php
$lang['title'] = ' Web Site Multi Bahasa';
$lang['hallo'] = 'Hallo, nama saya d3ptzz.';

//------------------------------------------------------
?>

Copyright Code diatas pada Bayu Hernanto.

52 thoughts on “Website Multi Bahasa dengan Code Igniter

    1. Bayu Hernanto

      @uwiuw, Mungkin karena mudah, sehingga yg masih amatir pun bisa. Sudah mudah, dokumentasinya excelent lagi. Betapa banyak framework yg hebat tapi dokumentasi tidak digarap dengan serius, akhirnya komunitasnya sedikit.

      Reply
      1. riez

        @Bayu Hernanto,

        maaf pak, maksudnya dokumentasi ny excelent gmna ya?dokumentasi dsni mksud ny dokumentasi apa?
        thx atas info ny…^_^

        Reply
        1. sinta

          @d3ptzz: kak, ada id YM nya gak kak??mw tanya2 tentang multilanguage di CI…mksh..kalo g add aja ke mail saya ya kak…maturnuwun..

          Reply
  1. Muhammad Rashid Babsail

    mas, mo tanya nih…
    Coba lihat di controller Content::__construct()
    disitu dilakukan pengecekan cookie apakah EN / ID untuk menentukan bahasa apa yang di pakai. Nah, seandainya saya punya 5 controller berbeda dan tiap2 controller memerlukan adanya pengecekan bahasa, gimana donk? apakah musti mengcopykan beberapa baris pengecekan bahasa ke masing-masing controller?

    Di bayangan saya sih, bisa di handle oleh library. Tapi sama saja, masing-masing controller harus mengakses library pengecekan bahasa tersebut.

    Apakah ada cara yang lebih mudah, tentunya dengan mengikuti kaidah DRY (Dont Repeat Yourself) ? Jadi cukup saya tulis/definisikan sekali dan otomatis akan berjalan setiap request ke sebuah controller.

    Mohon balasannya…
    Terima kasih…

    Reply
    1. d3ptzz Post author

      @muhammad: tentu saja bisa. Kita buat sebuah librari yang menghandle bahasa, misalnya seperti contoh. Kemudian dibuat auto load. Bisa di lihat di /system/application/config/autoload.php

      jadi seting saja librari itu dibuat autoload.. Bagaimana?

      Reply
      1. Muhammad Rashid Babsail

        saya sudah buat library setting yang fungsinya membaca bahasa di cookie dan kemudian mengeset config[‘langugage’] ke bahasa tersebut. tapi anehnya meskipun cookie sudah berubah ke bahasa lain, tetap saja yang jalan adalah bahasa default yg telah di set di config. apapun perubahan yang di lakukan tidak berpengaruh.
        apakah ini di karenakan config[‘language’] yg ada di file config di load terlebih dahulu kemudian baru library, sehingga perubahan bahasa tidak berpengaruh ?

        Reply
        1. d3ptzz Post author

          hmm…

          saya baru saja mencoba. dan berhasil dengan baik.

          coba kirimkan kode yang anda bikin ke email saya..

          semoga saya bisa membantu anda.

          Reply
    2. Bayu Hernanto

      @Muhammad Rashid Babsail, Bikin aja library MY_Controller, terus pengecekan cookie dilakukan disitu.
      Nanti tiap controller tinggal menginherit ke library MY_Controller. Sehingga kita ngga perlu mengulang-ulang kerjaan itu lagi…

      Reply
      1. aeris

        @Bayu Hernanto, mas.. bisa kasih contoh gak.. saya masih newbie, buat library MY_Controller yg pengecekan cookie disitu juga.. utk mas puji terima kasih ya tutorialnya… tutorialnya sangat mencerahkan pikiran saya.. hehehe

        Reply
  2. masrub

    boss.. cari tutorialnya yg berbahasa indonesia dimana yah??
    apakah harus ke gramedia?
    hehe.. ini sambil cari2 di gugel .. kali2 ada yg gratis..
    kalau ada info japri saja ya om.. makasih

    Reply
  3. indra lasmana

    mas,kok error ya??
    Unable to load the requested language file: language/bowo_lang.php

    tolong kirim saya sourcecode nya mas, saya butuh banget buat KKP saya mas.

    Reply
    1. d3ptzz Post author

      @indra lasmana: sourcecode ya ada diatas itu semuanya. kan sudah ada keterangannya. nama file dan dimana menyimpannya… ๐Ÿ™‚

      tadi ada sedikit kesalahan.
      $this->lang->load(‘bowo’);
      harusnya :
      $this->lang->load(‘d3ptzz’);

      Reply
  4. aeris

    mas, saya belum mudeng nih buat library untuk bahasa, agar gak diload di masing2 controller.. saya masih baru di CI .. mohon bantuannya

    Reply
  5. ojie permana

    thanks bangat mas tutorial…pas dengan apa yang saya cari.
    tapi..saya mohon bantuan dikit mas biar cocok dengan dengan database..
    misalnya saya punya tebel news kira kira untuk tabel news ini disainnya gimana ya mas supaya bisa menghendel kedua bahasa ini.

    thanks mas….
    maap lagi nich mas…kalo bisa kirim ke email saya ya mas
    maap lagi nich jadi ngerasa nyusahain orang…
    thanks buat bantuannya mas..

    [email protected]

    Reply
    1. d3ptzz Post author

      @ojiepermana: saya balas di sini saja ya, ๐Ÿ™‚

      kalau misalnya hanya ingin dua bahasa itu, maka bisa dibuat ada kolom judul bahasa indo, judul bahasa inggris. Nah kalau misalnya lebih dari itu atau ada kemungkinan berkembang, bisa dibuat tabel sendiri-sendiri. nanti isinya adalah id dari news, judul, isi sesuai dengan bahasa tabel itu. misalnya tabel indonesia dan tabel inggris..:-)

      Reply
      1. ojie permana

        oke mas….
        jadi kalo kemungkinan ada dua bahasa kita cukup satu tabel aja tapi ada beberapa kolom yang mengehendel bahasa tersebut

        ada seperti ini benar:

        tabel news :
        id_news
        id_headline
        en_headline
        date
        id_content
        en_content

        benar ngak mas ?

        Reply
        1. Muhammad Rashid Babsail

          apa ga repot banget tuh kalo musti nambahin field untuk masing2 bahasa?
          kalo seandainya ada penambahan bahasa lagi kan repot musti ngobok2 ke model nya lagi.
          mungkin yg lebih mudah, buat 1 table master bahasa yg menyimpan daftar bahasa.
          nah id dari bahasa itu akan menjadi FK dari table Post. jadi setiap penambahan/pengurangan bahasa akan mudah.

          contoh:

          tblPost
          ========
          id *
          lang_id **
          title
          content
          ———————
          tblLanguage
          =========
          id *
          language
          codea

          Reply
          1. d3ptzz Post author

            iya.. coba lihat comment saya paling bawah.. ๐Ÿ˜€ saya telat menyadarinya..:D btw makasih telah diingatkan..:)

    1. d3ptzz Post author

      mungkin bikin dua kolom dalam tabel, ID_posting dan language. jadi nanti dua posting yang sama akan mempunyai ID_posting yang sama sedangkan language-nya berbeda tergantung dengan bahasa yang digunakan di posting tersebut

      Reply
  6. Kania

    Mas minta contoh souce nya donk, yang udah pake model
    Tolong kirim ke emai saya ya..
    alamat email nya kan di require niy.
    terima kasih…..

    Reply
  7. Pingback: CodeIgniter Multi-Language Part-1 « Cyberqoe's Blog

  8. fananicenter

    bang Admin Mintak Source nya dong yang sudah ada Model+database nya.. tolong bgt,, lagi butuh nich,,,n_n

    Reply
  9. iruru

    Master Admin…

    Code di atas sudah saya coba dgn sedikit perubahan (saya pakai CI 2.0.1)..
    ini perubahan yg saya buat:

    file content.php
    awal: $this->load->library(‘language’);
    saya ubah jadi: $this->load->helper(‘language’);

    file autoload:
    $autoload[‘helper’] = array(‘url’,’cookie’,’language’);

    untuk view_multibahasa sudah bisa terpanggil, tetapi ketika saya klik tulisan Indonesia atau English (untuk ganti bahasa).. muncul error seperti ini:
    “The requested URL /multi_language_ci/language_setter/set_to/english was not found on this server.”
    *multi_language_ci = nama folder tempat saya menyimpan CI

    kok bisa muncul error kaya’ gitu ya? terus solusinya kaya’ gimana?
    tolong pencerahannya master… >_<

    Thx b4

    Reply
  10. Mawan

    Mas, mohon bantuan.. saya ko ada error seperti ini ya ..

    Fatal error: Class ‘Controller’ not found in /var/www/cookbahasa/application/controllers/multibahasa.php on line 3

    saya masih pemula mas dalam CI..
    untuk code Controller I saya beri nama dengan multibahasa.php
    untuk code Controller II saya beri nama language_setter.php
    tetapi pas di panggil urllocalsaya/index.php/multibahasa ada error di atas mas.. mohon bantuan ya

    Reply
    1. d3ptzz Post author

      @mawan: Kode di posting ini untuk CI 1.7.x kalau untuk CI 2.x, maka extends-nya diganti jadi Class NamaClass extends CI_Controller

      Reply
  11. ryan

    mas, mau tanya kok saya buat di ci 2.1 nggak bisa ya..
    padahal di controller nya udah saya ganti extends CI_Controller..
    saya mau buat “kosongan” dulu tapi kok masih belum mau ya mas..semua file udah saya letakkan di tempatnya..
    mohon bantuannya ya mas.. *Urgent

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.