Membuat Website Multi Bahasa atau Multi Language dengan Laravel Localization
Tags: tutorials
Published: 2022-11-26 06:36:24

---
title: Membuat Website Multi Bahasa atau Multi Language dengan Laravel Localization
published: true
date: 2022-04-09 14:43:35 UTC
tags: Tutorials
canonical_url: https://divisidev.com/post/membuat-website-multi-bahasa-atau-multi-language-dengan-laravel-localization
---

 **Laravel Localization** - Laravel menyediakan fitur yang mempermudah kita dalam membuat suatu web atau sistem dengan multi bahasa, fitur tersebut adalah Localization. localization, menyediakan cara mudah untuk mengambil string dalam berbagai bahasa. 

Laravel menyediakan dua cara untuk mengelola translation string. Pertama, translation string dapat disimpan dalam file di direktori `lang`. Dalam direktori tersebut, mungkin terdapat subdirektori untuk setiap bahasa yang ingin ditampilkan di sistem atau aplikasi kita. Cara yang pertama ini merupakan pendekatan yang digunakan Laravel untuk mengelola translation string untuk fitur bawaan Laravel seperti validation error message:

```
/lang
    /en
        messages.php
    /id
        messages.php
```

Cara yang kedua, translation string dapat didefinisikan di dalam file JSON yang ditempatkan di dalam direktori `lang`. Jika menggunakan cara ini, setiap bahasa yang akan digunakan dalam sistem atau aplikasi akan memiliki file JSON yang sesuai di dalam direktori ini. Cara kedua ini direkomendasikan untuk aplikasi yang memiliki banyak string yang dapat diterjemahkan.

```
/lang
    en.json
    id.json
```

Di artikel ini saya akan membahas bagaimana cara membuat aplikasi multiple language menggunakan fitur Laravel Localization.

## Laravel Localization

### Step 1: Install Laravel

```
//via Laravel Installer
composer global require laravel/installer
laravel new laravel-localization

//via Composer
composer create-project laravel/laravel laravel-localization
```

Oke, kita awali mulai dari install laravel. Ada beberapa cara untuk menginstall laravel, diantaranya menggunakan laravel install dan composer. Silakan temen-temen menginstall laravel project seperti contoh di atas.

### Step 2: Setup Route

```
Route::get('locale/{locale}', function ($locale) {
    if (! in_array($locale, ['en', 'id'])) {
        abort(400);
    }

    app()->setLocale($locale);
    session()->put('locale', $locale);
    
    return redirect()->back();
})->name('locale');
```

Selanjutnya, buat route baru yang mana pada route ini kita akan terapkan juga logic untuk mengubah bahasa pada aplikasi kita. Dari contoh route di atas, kita perlu menambahkan parameter `locale` pada route ubah bahasa dan hanya menerima value en atau id. Kita dapat mengubah default language  untuk single HTTP request saat runtime menggunakan method `setLocale`. Kemudian, value `$locale` yang dikirimkan akan kita simpan ke dalam session locale.

Default language tersimpan dalam opsi `locale` di `config/app.php` configuration file. Kita bebas mengubah value pada opsi `locale` ini sesuai dengan kebutuhan. 

```
'fallback_locale' => 'en',
```

Kita juga dapat mengonfigurasi "fallback language", yang akan digunakan saat bahasa aktif tidak berisi string terjemahan tertentu. Seperti bahasa default, bahasa fallback juga dikonfigurasi dalam file konfigurasi config/app.php seperti contoh di atas.

### Step 3: Setup View

```
<!doctype html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>
            Laravel Multiple Language Example
        </title>
        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
    </head>
    <body>
        <nav class="navbar navbar-expand-lg bg-light">
            <div class="container">
                <a class="navbar-brand" href="#">
                    Divisidev
                </a>
                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
                </button>
                <div class="collapse navbar-collapse" id="navbarSupportedContent">
                    <ul class="navbar-nav ms-auto mb-2 mb-lg-0">
                        <li class="nav-item">
                            <a class="nav-link active" aria-current="page" href="#">
                                {{ __('navbar.home') }}
                            </a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link" href="#">
                                {{ __('navbar.about') }}
                            </a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link" href="#">
                                {{ __('navbar.contact') }}
                            </a>
                        </li>
                        <li class="nav-item dropdown">
                            <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
                                {{ App::currentLocale() }}
                            </a>
                            <ul class="dropdown-menu">
                                <li>
                                    <a class="dropdown-item" href="{{ route('locale', 'en') }}">
                                        English
                                    </a>
                                <li>
                                    <a class="dropdown-item" href="{{ route('locale', 'id') }}">
                                        Indonesia
                                    </a>
                                </li>
                            </ul>
                        </li>
                    </ul>
                </div>
            </div>
        </nav>
        <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4" crossorigin="anonymous"></script>
    </body>
</html>
```

Berikutnya masuk ke file welcome.blade.php dan ganti kode yang ada menjadi seperti di atas. Di sini kita menambahkan opsi bahasa yaitu English dan Bahasa dalam bentuk dropdown. Perhatikan juga, disini kita juga menambahkan `{{App::currentLocale()}}` yang berfungsi untuk menampilkan bahasa atau locale yang aktif saat ini.

### Step 4: Create Middleware

```
php artisan make:middleware Localization

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class Localization
{
    public function handle(Request $request, Closure $next)
    {
        if (session()->has('locale')) {
            app()->setLocale(session()->get('locale'));
        }
        return $next($request);
    }
}
```

Sekarang kita perlu membuat middleware untuk mengelola bahasa dinamis yang dipilih melalu dropdown ubah bahasa. Silahkan jalankan perintah `php artisan make:middleware Localization` untuk membuat file middleware dengan nama file Localization. Buka file App/Http/Middleware/Localization.php, kemudian sesuaikan kode yang ada dengan kode seperti di atas.

```
\App\Http\Middleware\Localization::class,
```

Jangan lupa untuk mendaftarkan middleware yang baru saja dibuat ke kernel.php atau lebih tepatnya di dalam `protected $middlewareGroups`. Sehingga sekarang middlewareGroups akan nampak seperti kode di bawah ini.

```
protected $middlewareGroups = [
    'web' => [
        ....
        ....
        ....
        \App\Http\Middleware\Localization::class,
    ],

    'api' => [
        // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
        'throttle:api',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
];
```

### Step 5: Setup Translation

![laravel lang](https://divisidev.com/storage/photos/1/laravel%20lang.PNG)

Oke, selanjutnya kita perlu membuat folder lang baru dengan nama **id** untuk menyimpan file-file terjemahan Bahasa. Kemudian, buat file navbar.php pada kedua folder lang tersebut ( **en & id** ) seperti contoh gambar di atas.

**en/navbar.php**

```
<?php

return [
    'home' => 'Home',
    'about' => 'About Us',
    'contact' => 'Contact Us',
];
```

Setelah kita membuat file navbar.php pada kedua folder lang, sekarang silakan buka file yang terletak di lang/en/navbar.php dan tambahkan kode seperti di atas. Jadi, di file ini merupakan teks terjemahan menu-menu yang ada di navbar dalam bahasa inggris.

**id/navbar.php**

```
<?php

return [
    'home' => 'Beranda',
    'about' => 'Tentang Kami',
    'contact' => 'Hubungi Kami',
];
```

Kemudian, kita buat versi Bahasa Indonesia dengan membuka file yang terletak di **lang/id/navbar.php** dan tambahkan kode seperti di atas.

## Testing

![laravel multiple language](https://divisidev.com/storage/photos/1/laravel%20multiple%20language.PNG)

Wokey, setelah melalui berbagai tahap mulai dari membuat route lang switcher sampai dengan membuat file-file terjemahannya, sekarang kita bisa mencoba fitur laravel multiple language yang kita buat dengan laravel localization ini. Silakan jalankan laravel project teman-teman, lalu akses project pada browser. Pada language switcher (di navbar) silakan ubah ke bahasa lain, maka teks pada navbar juga akan berubah mengikuti settingan bahasa yang aktif.

Cukup sekian artikel tentang implementasi atau membuat website atau aplikasi multi bahasa menggunakan laravel localization ini, semoga apa yang telah saya sampaikan dalam bentuk tulisan di artikel ini dapat dengan mudah dipahami dan bisa membantu teman-teman. Di artikel berikutnya, saya akan share tentang cara membuat aplikasi laravel multi bahasa yang string-stringnya akan kita simpan ke dalam database. See you 👋

 

Credit: [People illustrations by Storyset](https://storyset.com/people "People illustrations by Storyset")