Implementasi multi-language dengan data yang diambil dari database, kita akan menyimpan terjemahan setiap teks atau kalimat dalam tabel di database. Ini sangat berguna untuk aplikasi yang memerlukan terjemahan dinamis yang mudah dikelola melalui database. Berikut adalah tutorial lengkapnya.

Langkah 1: Buat Project Laravel dan Siapkan Database

Buat Project Laravel Baru atau Gunakan Project yang Sudah Ada

laravel new multi-language-db 
cd multi-language-db

Konfigurasi Database di .env

Sesuaikan konfigurasi database di file .env:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=multilanguage_db
DB_USERNAME=root
DB_PASSWORD=

Jalankan Perintah Migrasi

Jika sudah siap, jalankan migrasi untuk memastikan tabel users dan tabel dasar lainnya sudah ada di database.

php artisan migrate

Langkah 2: Buat Tabel Translasi di Database

Buat Migration Baru untuk Tabel translations

Kita akan membuat tabel translations untuk menyimpan data terjemahan. Setiap teks yang akan diterjemahkan akan memiliki key unik dan terjemahan untuk setiap bahasa.

php artisan make:migration create_translations_table

Edit File Migration

Di dalam file migration baru (database/migrations/...create_translations_table.php), tambahkan kolom yang diperlukan untuk menyimpan data terjemahan.

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateTranslationsTable extends Migration
{
    public function up()
    {
        Schema::create('translations', function (Blueprint $table) {
            $table->id();
            $table->string('key');
            $table->string('language');
            $table->text('text');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('translations');
    }
}

Migrasikan Tabel

Jalankan migrasi untuk membuat tabel translations:

php artisan migrate

Langkah 3: Menambahkan Data Translasi ke Database

Isi Data Terjemahan untuk Bahasa yang Dibutuhkan

Anda bisa menambahkan data langsung melalui Tinker atau dengan seeding. Misalnya:

php artisan tinker

Kemudian isi data di tinker command sebagai berikut: 

DB::table('translations')->insert([
    ['key' => 'welcome', 'language' => 'en', 'text' => 'Welcome to our application!'],
    ['key' => 'welcome', 'language' => 'id', 'text' => 'Selamat datang di aplikasi kami!'],
    ['key' => 'login', 'language' => 'en', 'text' => 'Login'],
    ['key' => 'login', 'language' => 'id', 'text' => 'Masuk'],
    // Tambahkan lebih banyak data sesuai kebutuhan
]);

Jika berhasil, data akan tampil di database seperti berikut:

Langkah 4: Buat Helper atau Model untuk Mengambil Terjemahan

Buat Model Translation

Buat model Translation agar kita dapat mengakses data terjemahan dari database:

php artisan make:model Translation

Edit Model Translation

Di dalam file app/Models/Translation.php, tambahkan metode untuk mengambil teks terjemahan berdasarkan kunci dan bahasa:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Translation extends Model
{
    protected $fillable = ['key', 'language', 'text'];

    public static function getTranslation($key, $language)
    {
        $translation = self::where('key', $key)->where('language', $language)->first();
        return $translation ? $translation->text : $key;
    }
}

Buat Helper Function untuk Mengambil Terjemahan

Tambahkan fungsi helper di app/helpers.php. Dan isi code berikut:

// app/helpers.php
use App\Models\Translation;

function translate($key)
{
    $language = session('locale', 'en'); // default 'en'
    return Translation::getTranslation($key, $language);
}

Buka file composer.json dan daftarkan helper tadi di bawah "autoload" -> "files":
 

"autoload": {
        "psr-4": {
            "App\\": "app/",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeders/"
        },
        "files": [
            "app/helpers.php"
        ]
    },

Setelah itu, jalankan perintah berikut agar perubahan composer.json diterapkan:

composer dump-autoload

Langkah 5: Menambahkan Middleware untuk Mengubah Bahasa

Buat Middleware Baru

Buat middleware LanguageSwitcher untuk mengubah bahasa berdasarkan session:

php artisan make:middleware LanguageSwitcher

Edit Middleware

Di app/Http/Middleware/LanguageSwitcher.php, tambahkan kode berikut:

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\App;

class LanguageSwitcher
{
    public function handle($request, Closure $next)
    {
        $language = session('locale', 'en');
        App::setLocale($language);

        return $next($request);
    }
}

Daftarkan Middleware

Buka app/Http/Kernel.php dan daftarkan LanguageSwitcher di grup web:

protected $middlewareGroups = [
    'web' => [
        // middleware lainnya
        \App\Http\Middleware\LanguageSwitcher::class,
    ],
];

Langkah 6: Menambahkan Controller dan Route untuk Mengubah Bahasa

Buat Controller untuk Bahasa

Buat LanguageController:

php artisan make:controller LanguageController

Edit Controller

Di dalam LanguageController, tambahkan metode untuk mengubah bahasa:

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class LanguageController extends Controller
{
    public function switchLang($lang)
    {
        session(['locale' => $lang]);
        return redirect()->back();
    }
}

Tambahkan Route untuk Mengganti Bahasa

Di routes/web.php, tambahkan route:

use App\Http\Controllers\LanguageController;

Route::get('lang/{lang}', [LanguageController::class, 'switchLang'])->name('lang.switch');

Langkah 7: Menampilkan Terjemahan di Tampilan

Gunakan helper translate() untuk menampilkan teks berdasarkan bahasa aktif. Contoh di resources/views/welcome.blade.php:

<h1>{{ translate('welcome') }}</h1>
<a href="{{ route('lang.switch', 'en') }}">English</a> |
<a href="{{ route('lang.switch', 'id') }}">Indonesia</a>

Langkah 8: Testing Multi-Language dari Database

Jalankan Server

php artisan serve

Uji Fitur Multi-Language

Akses halaman http://localhost:8000, dan klik link bahasa yang disediakan untuk mengganti bahasa tampilan. Jika berhasil akan seperti berikut untuk bahasa indonesia

Jika English dklik, maka akan menghasilkan seperti berikut: