Lokalisasi i18n yang mudah untuk Laravel, alat yang berguna untuk digabungkan dengan kelas lokalisasi Laravel.
Paket ini menawarkan hal-hal berikut:
Laravel | lokalisasi laravel |
---|---|
4.0.x | 0,13.x |
4.1.x | 0,13.x |
4.2.x | 0,15.x |
5.0.x/5.1.x | 1.0.x |
5.2.x-5.4.x (PHP 7 tidak diperlukan) | 1.2. |
5.2.0-6.x (diperlukan versi PHP >= 7) | 1.4.x |
6.x-10.x (diperlukan versi PHP >= 7) | 1.8.x |
10.x-11.x (diperlukan versi PHP >= 8.2) | 2.0.x |
Instal paket melalui komposer: composer require mcamara/laravel-localization
Untuk Laravel 5.4 ke bawah perlu mendaftarkan penyedia layanan.
Untuk mengedit konfigurasi default, Anda dapat menjalankan:
php artisan vendor:publish --provider="McamaraLaravelLocalizationLaravelLocalizationServiceProvider"
Setelah itu, config/laravellocalization.php
akan dibuat.
Opsi konfigurasinya adalah:
Anda dapat mendaftarkan paket middleware di file app/Http/Kernel.php
:
<?php namespace App Http ;
use Illuminate Foundation Http Kernel as HttpKernel ;
class Kernel extends HttpKernel {
/**
* The application's route middleware.
*
* @var array
*/
protected $ middlewareAliases = [
/**** OTHER MIDDLEWARE ****/
' localize ' => Mcamara LaravelLocalization Middleware LaravelLocalizationRoutes::class,
' localizationRedirect ' => Mcamara LaravelLocalization Middleware LaravelLocalizationRedirectFilter::class,
' localeSessionRedirect ' => Mcamara LaravelLocalization Middleware LocaleSessionRedirect::class,
' localeCookieRedirect ' => Mcamara LaravelLocalization Middleware LocaleCookieRedirect::class,
' localeViewPath ' => Mcamara LaravelLocalization Middleware LaravelLocalizationViewPath::class
];
}
Jika Anda menggunakan Laravel 11, Anda dapat mendaftar di file bootstrap/app.php
di penutupan withMiddleware
:
return Application:: configure (basePath: dirname ( __DIR__ ))
// Other application configurations
-> withMiddleware ( function ( Middleware $ middleware ) {
$ middleware -> alias ([
/**** OTHER MIDDLEWARE ALIASES ****/
' localize ' => Mcamara LaravelLocalization Middleware LaravelLocalizationRoutes::class,
' localizationRedirect ' => Mcamara LaravelLocalization Middleware LaravelLocalizationRedirectFilter::class,
' localeSessionRedirect ' => Mcamara LaravelLocalization Middleware LocaleSessionRedirect::class,
' localeCookieRedirect ' => Mcamara LaravelLocalization Middleware LocaleCookieRedirect::class,
' localeViewPath ' => Mcamara LaravelLocalization Middleware LaravelLocalizationViewPath::class,
]);
})
Tambahkan yang berikut ke file rute Anda:
// routes/web.php
Route:: group ([ ' prefix ' => LaravelLocalization:: setLocale ()], function ()
{
/** ADD ALL LOCALIZED ROUTES INSIDE THIS GROUP **/
Route:: get ( ' / ' , function ()
{
return View:: make ( ' hello ' );
});
Route:: get ( ' test ' , function (){
return View:: make ( ' test ' );
});
});
/** OTHER PAGES THAT SHOULD NOT BE LOCALIZED **/
Setelah grup rute ini ditambahkan ke file rute, pengguna dapat mengakses semua lokal yang ditambahkan ke dalam supportedLocales
( en
dan es
secara default). Misalnya, file rute di atas membuat alamat berikut:
// Set application language to English
http://url-to-laravel/en
http://url-to-laravel/en/test
// Set application language to Spanish
http://url-to-laravel/es
http://url-to-laravel/es/test
// Set application language to English or Spanish (depending on browsers default locales)
// if nothing found set to default locale
http://url-to-laravel
http://url-to-laravel/test
Paket ini menyetel lokal aplikasi Anda App::getLocale()
sesuai dengan url Anda. Lokal kemudian dapat digunakan untuk fitur lokalisasi Laravel.
Anda dapat menambahkan middleware ke grup Anda seperti ini:
Route:: group (
[
' prefix ' => LaravelLocalization:: setLocale (),
' middleware ' => [ ' localeSessionRedirect ' , ' localizationRedirect ' , ' localeViewPath ' ]
], function (){ //...
});
1. : Sangat disarankan untuk menggunakan middleware pengalihan. Url tanpa lokal hanya boleh digunakan untuk menentukan browser/lokal default dan untuk mengalihkan ke url yang dilokalkan. Jika tidak, ketika robot mesin pencari merayapi misalnya http://url-to-laravel/test
mereka mungkin mendapatkan konten bahasa yang berbeda untuk setiap kunjungan. Juga memiliki banyak url untuk konten yang sama menciptakan masalah duplikat konten SEO.
2. : Sangat disarankan untuk melokalkan tautan Anda, meskipun Anda menggunakan middleware pengalihan. Jika tidak, Anda akan menyebabkan setidaknya satu pengalihan setiap kali pengguna mengeklik tautan. Selain itu, url tindakan apa pun dari formulir kiriman harus dilokalkan, untuk mencegahnya dialihkan ke permintaan dapatkan.
Middleware pengalihan berikut bergantung pada pengaturan hideDefaultLocaleInURL
dan useAcceptLanguageHeader
di config/laravellocalization.php
:
Setiap kali lokal ada di url, maka akan disimpan dalam sesi oleh middleware ini.
Jika tidak ada lokal di url, maka middleware ini akan memeriksa yang berikut ini
useAcceptLanguageHeader
disetel ke true, hitung lokal dari browser dan arahkan ke url dengan lokal.hideDefaultLocaleInURL
disetel ke true. Misalnya, jika pengguna menavigasi ke http://url-to-laravel/test dan en
adalah lokal saat ini, maka pengguna akan dialihkan secara otomatis ke http://url-to-laravel/en/test.
Mirip dengan LocaleSessionRedirect, tetapi menyimpan nilai dalam cookie, bukan dalam sesi.
Setiap kali suatu lokal ada di url, itu akan disimpan dalam cookie oleh middleware ini.
Jika tidak ada lokal di url, maka middleware ini akan memeriksa yang berikut ini
useAcceptLanguageHeader
disetel ke true, hitung lokal dari browser dan arahkan ke url dengan lokal.hideDefaultLocaleInURL
disetel ke true. Misalnya, jika pengguna menavigasi ke http://url-to-laravel/test dan de
adalah lokal saat ini, pengguna akan dialihkan secara otomatis ke http://url-to-laravel/de/test.
Ketika lokal default ada di url dan hideDefaultLocaleInURL
disetel ke true, maka middleware akan mengalihkan ke url tanpa lokal.
Misalnya, jika es
adalah lokal default, maka http://url-to-laravel/es/test akan dialihkan ke http://url-to-laravel/test dan App::getLocale()
akan disetel es
.
Paket ini dilengkapi dengan banyak pembantu.
URL yang dilokalkan memperhitungkan pengikatan model rute saat membuat rute yang dilokalkan, serta setelan hideDefaultLocaleInURL
dan Rute yang Diterjemahkan.
// If current locale is Spanish, it returns `/es/test`
<a href="{{ LaravelLocalization:: localizeUrl ( ' /test ' ) }}">@ lang ( ' Follow this link ' )</a>
Dapatkan URL saat ini di lokal tertentu:
// Returns current url with English locale.
{{ LaravelLocalization:: getLocalizedURL ( ' en ' ) }}
Mengembalikan URL yang bersih dari pelokalan apa pun.
// Returns /about
{{ LaravelLocalization:: getNonLocalizedURL ( ' /es/about ' ) }}
Mengembalikan rute, dilokalkan ke lokasi yang diinginkan. Jika kunci terjemahan tidak ada di lokal yang diberikan, fungsi ini akan mengembalikan false.
// Returns /es/acerca
{{ LaravelLocalization:: getURLFromRouteNameTranslated ( ' es ' , ' routes.about ' ) }}
Contoh tautan yang dilokalkan menggunakan rute dengan atribut
// An array of attributes can be provided.
// Returns /en/archive/ghosts, /fr/archive/fantômes, /pt/arquivo/fantasmas, etc.
<a href="{{ LaravelLocalization:: getURLFromRouteNameTranslated ( App:: currentLocale (), ' routes.archive ' , array ( ' category ' => ' ghosts ' )) }}">Ghost Stories</a>
Kembalikan semua lokal yang didukung dan propertinya sebagai array.
{{ LaravelLocalization:: getSupportedLocales () }}
Kembalikan semua lokal yang didukung tetapi dalam urutan yang ditentukan dalam file konfigurasi. Anda dapat menggunakan fungsi ini untuk mencetak lokal di pemilih bahasa.
{{ LaravelLocalization:: getLocalesOrder () }}
Kembalikan array dengan semua kunci untuk lokal yang didukung.
{{ LaravelLocalization:: getSupportedLanguagesKeys () }}
Kembalikan kunci lokal saat ini.
{{ LaravelLocalization:: getCurrentLocale () }}
Kembalikan nama lokal saat ini sebagai string (Inggris/Spanyol/Arab/ ..dll).
{{ LaravelLocalization:: getCurrentLocaleName () }}
Mengembalikan nama asli lokal saat ini sebagai string (Bahasa Inggris/Español/عربى/ ..etc).
{{ LaravelLocalization:: getCurrentLocaleNative () }}
Mengembalikan nama regional lokal saat ini sebagai string (en_GB/en_US/fr_FR/ ..etc).
{{ LaravelLocalization:: getCurrentLocaleRegional () }}
Kembalikan arah lokal saat ini sebagai string (ltr/rtl).
{{ LaravelLocalization:: getCurrentLocaleDirection () }}
Kembalikan kode ISO 15924 untuk skrip lokal saat ini sebagai string; "Latn", "Cyrl", "Arab", dll.
{{ LaravelLocalization:: getCurrentLocaleScript () }}
Daftarkan middleware LaravelLocalizationViewPath
untuk menyetel lokal saat ini sebagai jalur dasar tampilan.
Sekarang Anda dapat menggabungkan tampilan Anda dalam folder berbasis bahasa seperti file terjemahan.
resources/views/en/
, resources/views/fr
, ...
Karena Anda dapat memodifikasi SupportLocales bahkan dengan mengganti nama kuncinya, string uk
dapat digunakan sebagai ganti en-GB
untuk menyediakan segmen url bahasa khusus. Tentu saja, Anda perlu mencegah benturan dengan kunci yang sudah ada dan harus tetap berpegang pada konvensi selama mungkin. Tetapi jika Anda menggunakan kunci khusus seperti itu, Anda harus menyimpan pemetaan Anda ke array localesMapping
. localesMapping
ini diperlukan untuk memungkinkan LanguageNegotiator menetapkan dengan benar lokal yang diinginkan berdasarkan HTTP Accept Language Header. Berikut ini contoh singkat cara memetakan HTTP Accept Language Header 'en-GB' ke segmen url 'uk':
// config/laravellocalization.php
' localesMapping ' => [
' en-GB ' => ' uk '
],
Setelah itu http://url-to-laravel/en-GB/a/b/c
menjadi http://url-to-laravel/uk/a/b/c
.
LaravelLocalization:: getLocalizedURL ( ' en-GB ' , ' a/b/c ' ); // http://url-to-laravel/uk/a/b/c
LaravelLocalization:: getLocalizedURL ( ' uk ' , ' a/b/c ' ); // http://url-to-laravel/uk/a/b/c
Jika Anda mendukung beberapa lokal di proyek Anda, Anda mungkin ingin memberi pengguna cara untuk mengubah bahasa. Di bawah ini adalah contoh sederhana kode templat blade yang dapat Anda gunakan untuk membuat pemilih bahasa Anda sendiri.
< ul >
@foreach ( LaravelLocalization :: getSupportedLocales () as $localeCode => $properties )
< li >
< a rel = " alternate " hreflang = " {{ $localeCode } } " href = " {{ LaravelLocalization :: getLocalizedURL ( $localeCode , null , [], true ) } } " >
{{ $properties [ ' native ' ] } }
</ a >
</ li >
@endforeach
</ ul >
Di sini bahasa default akan dipaksa di getLocalizedURL() untuk ada di URL bahkan hideDefaultLocaleInURL = true
.
Perhatikan bahwa Pengikatan Model Rute didukung.
Anda dapat menerjemahkan rute Anda. Misalnya, http://url/en/about dan http://url/es/acerca (acerca artinya dalam bahasa Spanyol) atau http://url/en/article/important-article dan http://url/ es/articulo/important-article (artikel dalam bahasa Spanyol) akan dialihkan ke pengontrol/tampilan yang sama seperti berikut:
Setidaknya middleware localize
harus dimuat di middleware Route::group
Anda (Lihat instruksi instalasi).
Untuk setiap bahasa, tambahkan routes.php
ke folder resources/lang/**/routes.php
. File tersebut berisi array dengan semua rute yang dapat diterjemahkan. Misalnya seperti ini:
Perlu diingat: mulai dari Laravel 9, folder
resources/lang
sekarang terletak di folder root project (lang
). Jika proyek Anda memiliki folderlang
di root, Anda harus menambahkanroutes.php
ke folderlang/**/routes.php
.
<?php
// resources/lang/en/routes.php
return [
" about " => " about " ,
" article " => " article/{article} " ,
];
<?php
// resources/lang/es/routes.php
return [
" about " => " acerca " ,
" article " => " articulo/{article} " ,
];
Anda dapat menambahkan rute di routes/web.php
seperti ini:
Route:: group ([ ' prefix ' => LaravelLocalization:: setLocale (),
' middleware ' => [ ' localize ' ]], function () {
Route:: get (LaravelLocalization:: transRoute ( ' routes.about ' ), function () {
return view ( ' about ' );
});
Route:: get (LaravelLocalization:: transRoute ( ' routes.article ' ), function ( App Article $ article ) {
return $ article ;
});
//,...
});
Setelah file disimpan, Anda dapat mengakses http://url/en/about , http://url/es/acerca , http://url/en/article/important-article dan http://url/es/ artikel/artikel penting tanpa masalah.
Mungkin Anda memperhatikan pada contoh sebelumnya siput bahasa Inggris di url bahasa Spanyol:
http://url/es/articulo/important-article
Dimungkinkan untuk menerjemahkan slug, misalnya seperti ini:
http://url/en/article/important-change
http://url/es/articulo/cambio-importante
Namun, untuk melakukan hal ini, setiap artikel harus memiliki banyak slug (satu untuk setiap lokasi). Terserah Anda bagaimana Anda ingin mengimplementasikan hubungan ini. Satu-satunya persyaratan untuk parameter rute yang dapat diterjemahkan adalah model yang relevan mengimplementasikan antarmuka LocalizedUrlRoutable
.
Untuk mengimplementasikan McamaraLaravelLocalizationInterfacesLocalizedUrlRoutable
, kita harus membuat fungsi getLocalizedRouteKey($locale)
, yang harus mengembalikan slug yang diterjemahkan untuk lokal tertentu. Dalam contoh di atas, di dalam artikel model, getLocalizedRouteKey('en')
harus mengembalikan important-change
dan getLocalizedRouteKey('es')
harus mengembalikan cambio-importante
.
Untuk menggunakan pengikatan model rute, seseorang harus menimpa fungsi resolveRouteBinding($slug)
dalam model. Fungsi tersebut harus mengembalikan model milik slug $slug
yang diterjemahkan. Misalnya:
public function resolveRouteBinding ( $ slug )
{
return static :: findByLocalizedSlug ( $ slug )-> first () ?? abort ( 404 );
}
Anda mungkin ingin melihat video ini yang menunjukkan bagaimana seseorang dapat mengatur parameter rute yang dapat diterjemahkan.
Anda dapat menangkap parameter URL selama penerjemahan jika Anda ingin menerjemahkannya juga. Untuk melakukannya, cukup buat pendengar acara untuk acara routes.translation
seperti:
Event:: listen ( ' routes.translation ' , function ( $ locale , $ attributes )
{
// Do your magic
return $ attributes ;
});
Pastikan untuk meneruskan lokal dan atribut sebagai parameter ke penutupan. Anda juga dapat menggunakan Pelanggan Acara, lihat: http://laravel.com/docs/events#event-subscribers
Untuk menyimpan rute Anda dalam cache, gunakan:
php artisan route:trans:cache
... alih-alih perintah route:cache
yang normal. Menggunakan artisan route:cache
tidak akan berfungsi dengan benar!
Agar solusi cache rute berfungsi, diperlukan sedikit penyesuaian pada penyediaan rute aplikasi Anda.
sebelum laravel 11
Di RouteServiceProvider
Aplikasi Anda, gunakan sifat LoadsTranslatedCachedRoutes
:
<?php
class RouteServiceProvider extends ServiceProvider
{
use Mcamara LaravelLocalization Traits LoadsTranslatedCachedRoutes;
setelah laravel 11
Di AppServiceProvider
Aplikasi Anda, gunakan kelas CachedTranslatedRouteLoader
dalam metode register:
<?php
class AppServiceProvider extends ServiceProvider
{
use Mcamara LaravelLocalization Traits LoadsTranslatedCachedRoutes;
/**
* Bootstrap any application services.
*/
public function boot(): void
{
RouteServiceProvider:: loadCachedRoutesUsing ( fn () => $ this -> loadCachedRoutes ());
. . .
}
Untuk lebih jelasnya lihat di sini.
Ini mungkin terjadi jika Anda tidak melokalkan rute tindakan yang ada di dalam Routes::group
Anda. Hal ini dapat menyebabkan pengalihan, yang kemudian mengubah permintaan posting menjadi permintaan dapatkan. Untuk mencegahnya, cukup gunakan pembantu localize.
Misalnya, jika Anda menggunakan Auth::routes()
dan memasukkannya ke dalam Route::group
Kemudian
<form action="/logout" method="POST">
<button>Logout</button>
</form>
tidak akan berhasil. Sebaliknya, kita harus menggunakan
<form action ="{{ LaravelLocalization:: localizeURL ( ' /logout ' ) }} " method= " POST ">
<button>Logout</button>
</form>
Cara lain untuk mengatasi ini adalah dengan memasukkan metode http ke konfigurasi 'laravellocalization.httpMethodsIgnored' untuk mencegah pemrosesan permintaan jenis ini
Jika Anda tidak melokalkan url postingan Anda dan menggunakan middleware pengalihan, maka permintaan postingan akan dialihkan sebagai permintaan get. Jika Anda belum menentukan rute get tersebut, Anda akan menyebabkan pengecualian ini.
Untuk melokalkan url postingan Anda lihat contoh di POST tidak berfungsi.
Hal ini juga terjadi jika Anda tidak melokalkan url postingan Anda. Jika Anda tidak melokalkan url postingan Anda, lokal default disetel saat memvalidasi, dan saat kembali ke back()
pesan validasi akan ditampilkan di lokal default.
Untuk melokalkan url postingan Anda lihat contoh di POST tidak berfungsi.
Selama pengaturan pengujian, rute yang dipanggil belum diketahui. Ini berarti tidak ada bahasa yang dapat diatur. Ketika permintaan dibuat selama pengujian, ini menghasilkan 404 - tanpa set awalan, rute yang dilokalkan sepertinya tidak ada.
Untuk memperbaikinya, Anda dapat menggunakan fungsi ini untuk mengatur awalan bahasa secara manual:
// TestCase.php
protected function refreshApplicationWithLocale ( $ locale )
{
self :: tearDown ();
putenv (LaravelLocalization:: ENV_ROUTE_KEY . ' = ' . $ locale );
self :: setUp ();
}
protected function tearDown (): void
{
putenv (LaravelLocalization:: ENV_ROUTE_KEY );
parent :: tearDown ();
}
// YourTest.php
public function testBasicTest ()
{
$ this -> refreshApplicationWithLocale ( ' en ' );
// Testing code
}
Tanyakan pada mcamara apakah Anda ingin menjadi salah satu dari mereka!
Lihat log perubahan di sini -> log perubahan
Lokalisasi Laravel adalah paket laravel sumber terbuka yang dilisensikan di bawah lisensi MIT