Membuat aplikasi yang mendukung lebih dari satu bahasa adalah kebutuhan yang semakin umum, terutama untuk aplikasi yang ditujukan ke pengguna dari berbagai negara. Laravel memiliki fitur Localization bawaan yang memudahkan kamu mengelola terjemahan teks tanpa harus mengubah kode di banyak tempat. Dalam tutorial ini, kita akan membuat aplikasi yang bisa beralih antara Bahasa Indonesia dan Bahasa Inggris.
Struktur File Terjemahan
Laravel menyimpan file terjemahan di folder lang/. Mulai Laravel 9, folder ini ada di root project. Jika belum ada, buat dengan:
php artisan lang:publish
Struktur folder yang akan kita buat:
lang/
โโโ en/
โ โโโ messages.php
โ โโโ auth.php
โโโ id/
โโโ messages.php
โโโ auth.php
Membuat File Terjemahan PHP
Buat file lang/en/messages.php:
<?php
return [
'welcome' => 'Welcome to :app!',
'greeting' => 'Hello, :name!',
'nav' => [
'home' => 'Home',
'about' => 'About',
'contact' => 'Contact',
'products' => 'Products',
],
'product' => [
'title' => 'Product List',
'not_found' => 'No products found.',
'count' => '{0} No products|{1} One product|[2,*] :count products',
],
];
Buat file lang/id/messages.php:
<?php
return [
'welcome' => 'Selamat datang di :app!',
'greeting' => 'Halo, :name!',
'nav' => [
'home' => 'Beranda',
'about' => 'Tentang Kami',
'contact' => 'Kontak',
'products' => 'Produk',
],
'product' => [
'title' => 'Daftar Produk',
'not_found' => 'Tidak ada produk ditemukan.',
'count' => '{0} Tidak ada produk|{1} Satu produk|[2,*] :count produk',
],
];
Menggunakan Terjemahan di Blade
Gunakan helper __() atau directive @lang untuk menampilkan teks yang diterjemahkan:
<!-- Terjemahan sederhana -->
<h1>{{ __('messages.welcome', ['app' => config('app.name')]) }}</h1>
<!-- Dengan parameter nama -->
<p>{{ __('messages.greeting', ['name' => auth()->user()->name]) }}</p>
<!-- Akses nested array -->
<nav>
<a href="/">{{ __('messages.nav.home') }}</a>
<a href="/products">{{ __('messages.nav.products') }}</a>
</nav>
<!-- Pluralisasi -->
<p>{{ trans_choice('messages.product.count', $count, ['count' => $count]) }}</p>
Format JSON untuk Terjemahan Simpel
Laravel juga mendukung file JSON untuk terjemahan yang lebih simpel โ cocok untuk kalimat panjang:
// lang/id.json
{
"Login": "Masuk",
"Register": "Daftar",
"Forgot your password?": "Lupa kata sandi?",
"Remember me": "Ingat saya",
"Email Address": "Alamat Email",
"Password": "Kata Sandi"
}
// Penggunaan di Blade (key = teks bahasa Inggris)
{{ __('Login') }}
{{ __('Forgot your password?') }}
Mengatur Locale Aplikasi
Locale default dikonfigurasi di config/app.php:
'locale' => env('APP_LOCALE', 'id'),
'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'),
Untuk mengubah locale secara dinamis di runtime:
use Illuminate\Support\Facades\App;
// Set locale
App::setLocale('en');
// Cek locale saat ini
App::getLocale(); // 'en'
// Cek apakah locale tertentu aktif
App::isLocale('id'); // true/false
Membuat Language Switcher
Buat route dan controller untuk mengganti bahasa:
// routes/web.php
Route::get('/lang/{locale}', function ($locale) {
if (! in_array($locale, ['en', 'id'])) {
abort(400, 'Locale tidak didukung.');
}
session(['locale' => $locale]);
return redirect()->back();
})->name('lang.switch');
Buat middleware untuk mengaplikasikan locale dari session:
php artisan make:middleware SetLocale
<?php
// app/Http/Middleware/SetLocale.php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
class SetLocale
{
public function handle(Request $request, Closure $next)
{
$locale = session('locale', config('app.locale'));
App::setLocale($locale);
return $next($request);
}
}
Daftarkan middleware di bootstrap/app.php (Laravel 11) atau app/Http/Kernel.php (Laravel 10):
// bootstrap/app.php (Laravel 11)
->withMiddleware(function (Middleware $middleware) {
$middleware->web(append: [
\App\Http\Middleware\SetLocale::class,
]);
})
Tambahkan tombol switcher di Blade:
<div>
<a href="{{ route('lang.switch', 'id') }}"
class="{{ app()->getLocale() === 'id' ? 'font-bold' : '' }}">
ID
</a>
|
<a href="{{ route('lang.switch', 'en') }}"
class="{{ app()->getLocale() === 'en' ? 'font-bold' : '' }}">
EN
</a>
</div>
Kesimpulan
Fitur Localization Laravel membuat implementasi multi bahasa menjadi sangat terstruktur. File PHP untuk grup terjemahan yang kompleks, file JSON untuk terjemahan sederhana, dan middleware untuk mengelola locale per session โ semuanya sudah disediakan oleh Laravel. Dengan pola ini, menambah bahasa baru cukup dengan membuat folder dan file terjemahan tanpa mengubah satu baris kode logika pun.