Artikel

Panduan langkah demi langkah pelokalan Laravel, tutorial dengan contoh

Cara melokalkan proyek Laravel, cara mengembangkan proyek di Laravel, dan membuatnya dapat digunakan dalam berbagai bahasa. Pada artikel ini kita melihat cara bekerja dengan file terjemahan, membuat pengalih bahasa, dan lainnya dengan contoh.

Laravel adalah aplikasi yang dirancang untuk menjadi lokal, beradaptasi dengan berbagai bahasa dan budaya. Pelokalan menyesuaikan aplikasi internasional ke bahasa tertentu melalui terjemahan.

Prasyarat

  • Pada artikel ini kita akan merujuk Laravel versi 8.x;
  • Agar berhasil mengikuti tutorial ini, Anda harus memiliki pengetahuan yang diperlukan tentang bahasa pemrograman PHP dan framework Laravel.
  • Domain Anda adalah localhost. Jika tidak, ganti localhost dengan nama domain atau alamat IP Anda sendiri (tergantung pada instalasi Anda).

Bekerja dengan file terjemahan

Di Laravel, seperti di banyak kerangka kerja lainnya, kami dapat menyimpan terjemahan untuk berbagai bahasa dalam file terpisah. Ada dua cara untuk mengatur file terjemahan Laravel:

  • Pendekatan lama yang menyimpan file di lokasi berikut: resources/lang/{en,fr,ru}/{myfile.php};
  • Pendekatan baru yang menyimpan file di lokasi berikut: resources/lang/{fr.json, ru.json};

Untuk bahasa yang berbeda menurut wilayah, Anda harus menamainya directory/file bahasa menurut ISO 15897. Misalnya, untuk bahasa Inggris UK yang akan Anda gunakan en_GB dari pada en-gb. Dalam artikel ini, kita akan berfokus pada pendekatan kedua, tetapi hal yang sama berlaku untuk pendekatan pertama (kecuali bagaimana kunci terjemahan diberi nama dan diambil). 

Terjemahan sederhana

Sekarang, mari kita pergi ke resources/views/welcome.blade.phpfile dan mengganti isi file bodytag dengan milik kita, seperti ini:

<body class="antialiased">
    <div class="relative flex items-top justify-center min-h-screen bg-gray-100 dark:bg-gray-900 sm:items-center py-4 sm:pt-0">
        <div class="max-w-6xl mx-auto sm:px-6 lg:px-8">
            <div class="flex justify-center pt-8 sm:justify-start sm:pt-0">
                Welcome to our website
            </div>
        </div>
    </div>
</body>

Kita akan mulai dengan menyiapkan pesan selamat datang pelokalan, yang sangat mudah dilakukan di Laravel. Yang harus Anda lakukan adalah mengganti teks "Selamat datang di situs web kami" dengan kode berikut: {{ __('Welcome to our website') }}. Ini akan menginstruksikan Laravel untuk menampilkan "Welcome to our website" secara defaultdefinite dan cari terjemahan dari string ini jika bahasa selain bahasa Inggris disetel (kita akan membahasnya nanti). Bahasa Inggris akan ditetapkan sebagai bahasa defaultdefiakhir dari aplikasi kami, jadi dengan pengaturan defaultdefiPada akhirnya kami hanya akan menampilkan teks "Selamat datang di situs web kami". Jika lokalnya berbeda, kami akan mencoba menemukan terjemahan yang cocok dan akan segera dibuat.

Lokalisasi Laravel

Tapi bagaimana Laravel mengetahui bahasa apa yang saat ini atau bahasa apa yang tersedia di aplikasi? Ini dilakukan dengan melihat konfigurasi lokal di aplikasi config/app.php. Buka file ini dan cari dua kunci array asosiatif ini:

/*
|--------------------------------------------------------------------------
| Application Locale Configuration
|--------------------------------------------------------------------------
|
| The application locale determines the default locale that will be used
| by the translation service provider. You are free to set this value
| to any of the locales which will be supported by the application.
|
*/
'locale' => 'en',
/*
|--------------------------------------------------------------------------
| Application Fallback Locale
|--------------------------------------------------------------------------
|
| The fallback locale determines the locale to use when the current one
| is not available. You may change the value to correspond to any of
| the language folders that are provided through your application.
|
*/
'fallback_locale' => 'en',

Deskripsi yang ditampilkan di atas kunci harus cukup jelas, tetapi singkatnya, kuncinya locale berisi pra lokaldefiselesaikan aplikasi Anda (setidaknya, jika tidak ada lokal lain yang disetel dalam kode). Dan fallback_locale itu diaktifkan jika kami menyetel lokal yang tidak ada di aplikasi kami.

Sementara file ini terbuka, mari tambahkan kunci baru untuk memudahkan kita mendaftar semua lokal yang akan didukung aplikasi kita. Kami akan menggunakan ini nanti saat menambahkan pengalih lokal. Namun, ini adalah tugas opsional karena Laravel tidak mengharuskan kita untuk melakukannya.

/*
|--------------------------------------------------------------------------
| Available locales
|--------------------------------------------------------------------------
|
| List all locales that your application works with
|
*/
'available_locales' => [
  'English' => 'en',
  'Italian' => 'it',
  'French' => 'fr',
],

Sekarang aplikasi kami mendukung tiga bahasa: Inggris, Italia, dan Prancis.

File terjemahan

Sekarang setelah kami menetapkan semua lokal yang akan kami kerjakan, kami dapat melanjutkan dan melanjutkan untuk menerjemahkan pesan pra selamat datang kamidefimalam.

Mari kita mulai dengan menambahkan file pelokalan baru ke folder resources/lang. Pertama, buat file resources/lang/it.json dan tambahkan terjemahan yang sesuai, sebagai berikut:

{
  "Welcome to our website": "Benvenuto nel nostro sito web"
}

Selanjutnya, buat file resources/lang/fr.json:

{

"Selamat datang di website kami": "Selamat datang di situs kami"

}

Seperti yang Anda lihat, kami selalu mengacu pada pesan awaldefinito yang kami tambahkan di file welcome.blade.php (yang {{ __('Welcome to our website') }}). Alasan mengapa kita tidak perlu membuat file en.json itu karena Laravel sudah mengetahui pesan mana yang kita lewati dengan pengaturan sebelumnyadefiselesai pada fungsinya __() mereka untuk pra lokal kamidefinito en.

Perubahan lokal di Laravel

Pada titik ini, Laravel tidak mengetahui cara mengubah lokal, jadi untuk saat ini, mari lakukan terjemahan langsung di dalam jalur. Ubah pra jalur selamat datangdefiselesai seperti gambar di bawah ini:

Route::get('/{locale?}', function ($locale = null) {
    if (isset($locale) && in_array($locale, config('app.available_locales'))) {
        app()->setLocale($locale);
    }
    
    return view('welcome');
});

Kami sekarang dapat mengunjungi situs web kami, menentukan salah satu bahasa yang tersedia sebagai segmen jalur pertama: misalnya, localhost/rulocalhost/fr. Anda akan melihat konten yang dilokalkan. Jika Anda menentukan lokal yang tidak didukung atau tidak menentukan lokal sama sekali, Laravel akan menggunakannya ensecara defaultdefinita.

middleware

Mengganti lokal untuk setiap tautan situs mungkin bukan yang Anda inginkan, dan mungkin tidak terlihat bersih secara estetis. Itu sebabnya kami akan melakukan pengaturan bahasa melalui pengalih bahasa khusus dan menggunakan sesi pengguna untuk menampilkan konten yang diterjemahkan. Oleh karena itu, buat middleware baru di dalam app/Http/Middleware/Localization.phpfile atau dengan menjalankan artisan make:middleware Localization.

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Session;

class Localization
{
    /**
    * Handle an incoming request.
    *
    * @param  \Illuminate\Http\Request  $request
    * @param  \Closure  $next
    * @return mixed
    */
    public function handle(Request $request, Closure $next)
    {
        if (Session::has('locale')) {
            App::setLocale(Session::get('locale'));
        }
        return $next($request);
    }
}

Middleware ini akan menginstruksikan Laravel untuk menggunakan lokal yang dipilih pengguna jika pilihan ini ada di sesi.

Karena kami membutuhkan ini untuk dilakukan pada setiap permintaan, kami juga perlu menambahkannya ke tumpukan pre middlewaredefiselesai di app/http/Kernel.phpuntuk webgrup perantara:

* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
  'web' => [
      \App\Http\Middleware\EncryptCookies::class,
      \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
      \Illuminate\Session\Middleware\StartSession::class,
      // \Illuminate\Session\Middleware\AuthenticateSession::class,
      \Illuminate\View\Middleware\ShareErrorsFromSession::class,
      \App\Http\Middleware\VerifyCsrfToken::class,
      \Illuminate\Routing\Middleware\SubstituteBindings::class,
      \App\Http\Middleware\Localization::class, /* <--- add this */
  ],

Ubah arah

Selanjutnya, kita perlu menambahkan jalur untuk mengubah lokal. Kami menggunakan jalur penutupan, tetapi Anda dapat menggunakan kode yang persis sama di dalam pengontrol jika Anda mau:

Route::get('language/{locale}', function ($locale) {
    app()->setLocale($locale);
    session()->put('locale', $locale);

    return redirect()->back();
});

Juga, jangan lupa untuk menghapus toggle lokal yang sebelumnya ditambahkan di jalur pra selamat datang kamidefimalam:

Route::get('/', function () {
    return view('welcome');
});

Setelah ini selesai, satu-satunya cara bagi pengguna untuk mengubah bahasa yang saat ini disetel adalah dengan memasukkan localhost/language/{locale}. Sana localepilihan akan disimpan dalam sesi dan akan mengarahkan pengguna ke tempat asalnya (centang Localizationalat tengah). Untuk mencobanya, buka localhost/language/ru(selama cookie sesi Anda ada di browser Anda) dan Anda akan melihat konten yang diterjemahkan. Anda dapat menjelajahi situs web dengan bebas atau mencoba menyegarkan halaman dan melihat bahwa bahasa yang dipilih dipertahankan.

Komutator

Sekarang kita perlu membuat sesuatu yang dapat diklik pengguna untuk mengubah bahasa alih-alih memasukkan kode lokal secara manual ke dalam URL. Untuk melakukan ini, kami akan menambahkan pemeriksa bahasa yang sangat sederhana. Oleh karena itu, buatlah yang baru resources/views/partials/language_switcher.blade.phpfile dengan kode berikut:

<div class="flex justify-center pt-8 sm:justify-start sm:pt-0">
    @foreach($available_locales as $locale_name => $available_locale)
        @if($available_locale === $current_locale)
            <span class="ml-2 mr-2 text-gray-700">{{ $locale_name }}</span>
        @else
            <a class="ml-1 underline ml-2 mr-2" href="language/{{ $available_locale }}">
                <span>{{ $locale_name }}</span>
            </a>
        @endif
    @endforeach
</div>

Sertakan pengalih yang baru dibuat dalam tampilan "selamat datang":

<body class="antialiased">
    <div class="relative flex items-top justify-center min-h-screen bg-gray-100 dark:bg-gray-900 sm:items-center py-4 sm:pt-0">
        <div class="max-w-6xl mx-auto sm:px-6 lg:px-8">
            @include('partials/language_switcher')
            <div class="flex justify-center pt-8 sm:justify-start sm:pt-0">
                {{ __('Welcome to our website') }}
            </div>
        </div>
    </div>
</body>

Buka app/Providers/AppServiceProvider.phpfile dan tambahkan kode untuk dibagikan saat pengalih bahasa kita akan disusun. Secara khusus, kami akan membagikan lokal saat ini yang dapat diakses sebagai file {{ $current_locale }}.

Buletin inovasi
Jangan lewatkan berita terpenting tentang inovasi. Daftar untuk menerimanya melalui email.

Opsi terjemahan lanjutan di PHP Laravel

Kami terutama akan bekerja dengan resources/views/welcome.blade.php, jadi semuanya harus terjadi dalam tampilan sambutan kami kecuali ditentukan lain.

Parameter dalam string terjemahan

Misalnya, katakan halo kepada pengguna imajiner kita (Amanda) alih-alih hanya menampilkan pesan umum:

{{ __('Welcome to our website, :Name', ['name' => 'caroline']) }}

Perhatikan bahwa kami menggunakan nama dengan huruf pertama dalam huruf kecil, tetapi placeholder dengan huruf pertama dalam huruf besar. Dengan cara ini, Laravel dapat membantu Anda secara otomatis mengkapitalisasi kata yang sebenarnya. Ini akan terjadi jika placeholder dimulai dengan huruf besar, misalnya, :Namemenghasilkan "Caroline" atau kata yang dikapitalisasi penuh,  :NAME, menghasilkan "CAROLINE".

Kami juga memperbarui file terjemahan kami resources/lang/fr.jsonresources/lang/it.json , karena saat ini kami hanya akan melihat versi bahasa Inggris di mana saja karena kunci terjemahan tidak cocok dengan terjemahannya.

Perancis:

{

   "Welcome to our website, :Name": "Bienvenue sur notre site, :Name"

}

Italia:

{

   "Welcome to our website, :Name": "Benvenuto sul nostro sito web, :Name"

}

Pluralisasi

Untuk melihat pluralisasi dalam tindakan, mari tambahkan paragraf teks baru. 

Untuk melakukan pluralisasi, Anda harus menggunakan fungsi trans_choice dari pada __(), Misalnya:

{{ __('Welcome to our website, :Name', ['name' => 'caroline']) }}
<br>
{{ trans_choice('There is one apple|There are many apples', 2) }}

Seperti yang Anda lihat, bentuk jamak dipisahkan oleh a |.

Sekarang, bagaimana jika kita membutuhkan banyak bentuk jamak? 

Ini juga mungkin:

{{ trans_choice('{0} There :form no apples|{1} There :form just :count apple|[2,19] There :form :count apples', 24) }}

Dalam hal ini, kami mengizinkan angka 01, dan dari 219, dan akhirnya dari 20 dan seterusnya. Tentu saja, Anda dapat menambahkan aturan sebanyak yang Anda butuhkan.

Jadi bagaimana jika kita menginginkan placeholder dalam bentuk jamak kita? 

{{ trans_choice('{0} There :form no apples|{1} There :form just :count apple|[2,19] There :form :count apples', 24, ['form' => 'is']) }}

Kita juga dapat menggunakan hitungan yang diteruskan dalam `trans_choice` jika diperlukan menggunakan placeholder :count spesial:

{{ trans_choice('{0} There :form no apples|{1} There :form just :count apple|[2,19] There :form :count apples', 1, ['form' => 'is']) }}

Terakhir, jangan lupa memperbarui file terjemahan Anda dengan setiap perubahan yang Anda buat pada terjemahan dasar.

Italia:

{
  "Welcome to our website, :Name": "Benvenuto nel nostro sito, :Name",
  "{0} There :form no apples|{1} There :form just :count apple|[2,19] There :form :count apples": "{0} Nessuna mela|{1} C'è:count mela|[2,19] Ci sono :count mele"
}

Perancis:

{    
  "Welcome to our website, :Name": "Bienvenue sur notre site, :Name",
  "{0} There :form no apples|{1} There :form just :count apple|[2,19] There :form :count apples": "{0} Il n'y a pas de pommes|{1} Il n'y :form :count pomme|[2,19] Il y :form :count pommes"
}

Bekerja dengan tanggal lokal di Laravel

Untuk menemukan tanggal, kami akan memanfaatkan kekuatan Karbon , yang disertakan dengan Laravel secara defaultdefinita. Lihat Dokumentasi karbon ; Anda dapat melakukan banyak hal menarik. Misalnya, kita dapat mengatur lokal kita dengan aturan tanggal dan waktu.

Sebagai contoh sederhana kami, kami akan menampilkan tanggal saat ini yang dilokalkan untuk bahasa yang dipilih. Di kami routes/web.php, kami memperbarui jalur halaman selamat datang dan meneruskan pesan tanggal yang dilokalkan ke milik kami view selamat datang:

<?php
Route::get('/', function () {
    $today = \Carbon\Carbon::now()
        ->settings(
            [
                'locale' => app()->getLocale(),
            ]
        );

    // LL is macro placeholder for MMMM D, YYYY (you could write same as dddd, MMMM D, YYYY)
    $dateMessage = $today->isoFormat('dddd, LL');

    return view('welcome', [
        'date_message' => $dateMessage
    ]);
});

Mari perbarui resources/views/welcome.blade.php menambahkan tampilan tanggal, seperti:

{{ __('Welcome to our website, :Name', ['name' => 'amanda']) }}
<br>
{{ trans_choice('{0} There :form :count apples|{1} There :form just :count apple|[2,19] There :form :count apples', 1, ['form' => 'is']) }}
<br>
{{ $date_message }}

Mencoba mengubah bahasa di halaman beranda localhost, kita akan melihat bahwa tanggal sekarang dilokalkan, misalnya:

Memformat angka dan mata uang dengan NumberFormatter

Di berbagai negara, orang menggunakan format berbeda untuk merepresentasikan angka, misalnya:

  • Amerika Serikat → 123.123,12
  • Perancis → 123 123,12

Oleh karena itu, untuk mencerminkan perbedaan ini di aplikasi Laravel Anda, Anda dapat menggunakan Pemformat Angka dengan cara berikut:

<?php
$num = NumberFormatter::create('en_US', NumberFormatter::DECIMAL);

$num2 = NumberFormatter::create('fr', NumberFormatter::DECIMAL);

Anda juga dapat menulis angka dalam bahasa tertentu dan menampilkan sesuatu seperti "seratus dua puluh tiga ribu seratus dua puluh tiga koma satu dua":

<?php
$num = NumberFormatter::create('en_US', NumberFormatter::SPELLOUT);
$num2 = NumberFormatter::create('fr', NumberFormatter::SPELLOUT);

Selain itu, NumberFormatter memungkinkan Anda menemukan mata uang dengan mudah, misalnya:

<?php
$currency1 = NumberFormatter::create('fr', NumberFormatter::CURRENCY);
$currency2 = NumberFormatter::create('en_US', NumberFormatter::CURRENCY);

Sehingga untuk fr Anda akan melihat Euro, sedangkan untuk en_US mata uang akan dalam dolar AS.

Ercole Palmeri

Buletin inovasi
Jangan lewatkan berita terpenting tentang inovasi. Daftar untuk menerimanya melalui email.

Artikel Terbaru

Intervensi inovatif dalam Augmented Reality, dengan penampil Apple di Poliklinik Catania

Operasi oftalmoplasti menggunakan penampil komersial Apple Vision Pro dilakukan di Poliklinik Catania…

3 Mei 2024

Manfaat Halaman Mewarnai untuk Anak - dunia keajaiban untuk segala usia

Mengembangkan keterampilan motorik halus melalui mewarnai mempersiapkan anak untuk keterampilan yang lebih kompleks seperti menulis. Mewarnai…

2 Mei 2024

Masa Depan Ada di Sini: Bagaimana Industri Perkapalan Merevolusi Perekonomian Global

Sektor angkatan laut adalah kekuatan ekonomi global sejati, yang telah menuju pasar 150 miliar...

1 Mei 2024

Penerbit dan OpenAI menandatangani perjanjian untuk mengatur aliran informasi yang diproses oleh Kecerdasan Buatan

Senin lalu, Financial Times mengumumkan kesepakatan dengan OpenAI. FT melisensikan jurnalisme kelas dunianya…

April 30 2024