Laravel の簡単な i18n ローカリゼーション。Laravel ローカリゼーション クラスと組み合わせるのに便利なツールです。
パッケージでは次のものが提供されます。
ララベル | 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 は必要ありません) | 1.2. |
5.2.0-6.x (PHP バージョン 7 以上が必要) | 1.4.x |
6.x-10.x (PHP バージョン 7 以上が必要) | 1.8.x |
10.x-11.x (PHP バージョン 8.2 以上が必要) | 2.0.x |
パッケージをコンポーザー経由でインストールします: composer require mcamara/laravel-localization
Laravel 5.4 以前の場合は、サービスプロバイダーを登録する必要があります。
デフォルト設定を編集するには、次を実行します。
php artisan vendor:publish --provider="McamaraLaravelLocalizationLaravelLocalizationServiceProvider"
その後、 config/laravellocalization.php
が作成されます。
構成オプションは次のとおりです。
パッケージ ミドルウェアを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
];
}
Laravel 11 を使用している場合は、 withMiddleware
クロージャのbootstrap/app.php
ファイルに登録できます。
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,
]);
})
以下をルート ファイルに追加します。
// 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 **/
このルート グループがルート ファイルに追加されると、ユーザーは、 supportedLocales
に追加されたすべてのロケール (デフォルトではen
とes
) にアクセスできるようになります。たとえば、上記のルート ファイルは次のアドレスを作成します。
// 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
パッケージは、URL に従ってアプリケーションのロケールApp::getLocale()
を設定します。このロケールは、Laravel のローカリゼーション機能に使用できます。
次のようにミドルウェアをグループに追加できます。
Route:: group (
[
' prefix ' => LaravelLocalization:: setLocale (),
' middleware ' => [ ' localeSessionRedirect ' , ' localizationRedirect ' , ' localeViewPath ' ]
], function (){ //...
});
1. : リダイレクトミドルウェアを使用することを強くお勧めします。ロケールのない URL は、ブラウザー/デフォルトのロケールを決定し、ローカライズされた URL にリダイレクトするためにのみ使用してください。そうしないと、検索エンジン ロボットがhttp://url-to-laravel/test
などをクロールするときに、訪問ごとに異なる言語コンテンツを取得する可能性があります。また、同じコンテンツに複数の URL があると、SEO の重複コンテンツの問題が発生します。
2. : リダイレクト ミドルウェアを使用する場合でも、リンクをローカライズすることを強くお勧めします。そうしないと、ユーザーがリンクをクリックするたびに少なくとも 1 回のリダイレクトが発生することになります。また、投稿フォームからのアクション URL が get リクエストにリダイレクトされないように、ローカライズする必要があります。
次のリダイレクト ミドルウェアはconfig/laravellocalization.php
のhideDefaultLocaleInURL
とuseAcceptLanguageHeader
の設定に依存します。
URL にロケールが存在する場合は、このミドルウェアによってセッションにロケールが保存されます。
URL にロケールが存在しない場合、このミドルウェアは以下をチェックします。
useAcceptLanguageHeader
が true に設定されている場合は、ブラウザーからロケールを計算し、ロケールを使用して URL にリダイレクトします。hideDefaultLocaleInURL
が true に設定されていない限り、ロケールを含む URL にリダイレクトされます。たとえば、ユーザーが http://url-to-laravel/test に移動し、 en
が現在のロケールである場合、ユーザーは自動的に http://url-to-laravel/en/test にリダイレクトされます。
LocaleSessionRedirect と似ていますが、セッションではなく Cookie に値を保存します。
URL にロケールが存在する場合は、このミドルウェアによってロケールが Cookie に保存されます。
URL にロケールが存在しない場合、このミドルウェアは以下をチェックします。
useAcceptLanguageHeader
が true に設定されている場合は、ブラウザーからロケールを計算し、ロケールを含む URL にリダイレクトします。hideDefaultLocaleInURL
が true に設定されている場合を除き、ロケールを含む URL にリダイレクトされます。たとえば、ユーザーが http://url-to-laravel/test に移動し、 de
現在のロケールである場合、ユーザーは自動的に http://url-to-laravel/de/test にリダイレクトされます。
デフォルトのロケールが URL に存在し、 hideDefaultLocaleInURL
が true に設定されている場合、ミドルウェアはロケールなしで URL にリダイレクトします。
たとえば、 es
がデフォルトのロケールの場合、http://url-to-laravel/es/test は http://url-to-laravel/test にリダイレクトされ、 App::getLocale()
が設定されます。 es
に。
このパッケージには多数のヘルパーが付属しています。
ローカライズされた URL では、ローカライズされたルートを生成するときにルート モデル バインディングが考慮されるほか、 hideDefaultLocaleInURL
および翻訳されたルートの設定も考慮されます。
// If current locale is Spanish, it returns `/es/test`
<a href="{{ LaravelLocalization:: localizeUrl ( ' /test ' ) }}">@ lang ( ' Follow this link ' )</a>
特定のロケールで現在の URL を取得します。
// Returns current url with English locale.
{{ LaravelLocalization:: getLocalizedURL ( ' en ' ) }}
ローカリゼーションを一切除いた URL を返します。
// Returns /about
{{ LaravelLocalization:: getNonLocalizedURL ( ' /es/about ' ) }}
目的のロケールにローカライズされたルートを返します。指定されたロケールに翻訳キーが存在しない場合、この関数は false を返します。
// Returns /es/acerca
{{ LaravelLocalization:: getURLFromRouteNameTranslated ( ' es ' , ' routes.about ' ) }}
属性を持つルートを使用したローカライズされたリンクの例
// 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>
サポートされているすべてのロケールとそのプロパティを配列として返します。
{{ LaravelLocalization:: getSupportedLocales () }}
サポートされているすべてのロケールを構成ファイルで指定された順序で返します。この関数を使用して、言語セレクターでロケールを出力できます。
{{ LaravelLocalization:: getLocalesOrder () }}
サポートされているロケールのすべてのキーを含む配列を返します。
{{ LaravelLocalization:: getSupportedLanguagesKeys () }}
現在のロケールのキーを返します。
{{ LaravelLocalization:: getCurrentLocale () }}
現在のロケール名を文字列として返します (英語/スペイン語/アラビア語/...など)。
{{ LaravelLocalization:: getCurrentLocaleName () }}
現在のロケールのネイティブ名を文字列として返します (英語/スペイン語/عربى/ ..etc)。
{{ LaravelLocalization:: getCurrentLocaleNative () }}
現在のロケールの地域名を文字列として返します (en_GB/en_US/fr_FR/ ..etc)。
{{ LaravelLocalization:: getCurrentLocaleRegional () }}
現在のロケールの方向を文字列 (ltr/rtl) として返します。
{{ LaravelLocalization:: getCurrentLocaleDirection () }}
現在のロケール スクリプトの ISO 15924 コードを文字列として返します。 「ラテン」、「キル」、「アラブ」など。
{{ LaravelLocalization:: getCurrentLocaleScript () }}
ミドルウェアLaravelLocalizationViewPath
を登録して、現在のロケールを view-base-path として設定します。
ビューを翻訳ファイルなどの言語ベースのフォルダーにラップできるようになりました。
resources/views/en/
、 resources/views/fr
、...
SupportedLocales はキーの名前を変更しても変更できるため、 en-GB
の代わりに文字列uk
使用してカスタム lang URL セグメントを提供することができます。もちろん、既存のキーとの衝突を防ぐ必要があり、可能な限り規則に従う必要があります。ただし、このようなカスタム キーを使用している場合は、マッピングをlocalesMapping
配列に保存する必要があります。このlocalesMapping
、LanguageNegotiator が HTTP Accept Language ヘッダーに基づいて目的のロケールを正しく割り当てることができるようにするために必要です。以下は、HTTP Accept Language ヘッダー「en-GB」を URL セグメント「uk」にマップする方法の簡単な例です。
// config/laravellocalization.php
' localesMapping ' => [
' en-GB ' => ' uk '
],
その後、 http://url-to-laravel/en-GB/a/b/c
は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
プロジェクトで複数のロケールをサポートしている場合は、ユーザーに言語を変更する方法を提供する必要があるでしょう。以下は、独自の言語セレクターの作成に使用できるブレード テンプレート コードの簡単な例です。
< 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 >
ここでは、デフォルト言語が getLocalizedURL() で強制的に URL に存在するようになります。 hideDefaultLocaleInURL = true
であっても。
ルート モデル バインディングがサポートされていることに注意してください。
ルートを翻訳することもできます。たとえば、http://url/en/about と http://url/es/acerca (acerca はスペイン語で about)、または http://url/en/article/ important-article と http://url/ es/articulo/ important-article (記事はスペイン語で articulo です) は、次のように同じコントローラー/ビューにリダイレクトされます。
少なくともlocalize
ミドルウェアがRoute::group
ミドルウェアにロードされている必要があります (インストール手順を参照)。
言語ごとに、 routes.php
resources/lang/**/routes.php
フォルダーに追加します。ファイルには、翻訳可能なすべてのルートを含む配列が含まれています。たとえば、次のようになります。
留意してください: Laravel 9 以降、
resources/lang
フォルダーはルート プロジェクト フォルダー (lang
) に配置されるようになりました。プロジェクトのルートにlang
フォルダーがある場合は、routes.php
lang/**/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} " ,
];
次のように、 routes/web.php
にルートを追加できます。
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 ;
});
//,...
});
ファイルが保存されると、 http://url/en/about 、 http://url/es/acerca 、 http://url/en/article/ important-article および http://url/es/ にアクセスできるようになります。記事/重要記事は問題ありません。
おそらく、前の例でスペイン語の URL に英語のスラッグが含まれていることに気づいたでしょう。
http://url/es/articulo/important-article
たとえば次のように、スラッグを翻訳することが可能です。
http://url/en/article/important-change
http://url/es/articulo/cambio-importante
ただし、これを行うには、各記事に多数のスラッグ (ロケールごとに 1 つ) が必要です。この関係をどのように実装するかはあなた次第です。翻訳可能なルート パラメーターの唯一の要件は、関連するモデルがインターフェイスLocalizedUrlRoutable
を実装していることです。
McamaraLaravelLocalizationInterfacesLocalizedUrlRoutable
実装するには、関数getLocalizedRouteKey($locale)
を作成する必要があります。この関数は、指定されたロケールに対して翻訳されたスラッグを返す必要があります。上記の例では、モデル アーティクル内で、 getLocalizedRouteKey('en')
important-change
を返し、 getLocalizedRouteKey('es')
cambio-importante
を返す必要があります。
Route-model-binding を使用するには、モデル内の関数resolveRouteBinding($slug)
を上書きする必要があります。この関数は、翻訳されたスラッグ$slug
に属するモデルを返す必要があります。例えば:
public function resolveRouteBinding ( $ slug )
{
return static :: findByLocalizedSlug ( $ slug )-> first () ?? abort ( 404 );
}
翻訳可能なルート パラメータを設定する方法を説明するこのビデオをチェックしてみてください。
URL パラメータも翻訳したい場合は、翻訳中に URL パラメータをキャプチャできます。これを行うには、次のように、 routes.translation
イベントのイベント リスナーを作成するだけです。
Event:: listen ( ' routes.translation ' , function ( $ locale , $ attributes )
{
// Do your magic
return $ attributes ;
});
ロケールと属性をパラメータとしてクロージャに必ず渡してください。イベント サブスクライバーを使用することもできます。http://laravel.com/docs/events#event-subscribers を参照してください。
ルートをキャッシュするには、次を使用します。
php artisan route:trans:cache
...通常のroute:cache
コマンドの代わりに。 artisan route:cache
使用すると正しく動作しません。
ルート キャッシュ ソリューションが機能するには、アプリケーションのルート プロビジョニングに若干の調整を行う必要があります。
laravel11以前
アプリのRouteServiceProvider
で、 LoadsTranslatedCachedRoutes
トレイトを使用します。
<?php
class RouteServiceProvider extends ServiceProvider
{
use Mcamara LaravelLocalization Traits LoadsTranslatedCachedRoutes;
laravel11以降
アプリのAppServiceProvider
の register メソッドでCachedTranslatedRouteLoader
クラスを使用します。
<?php
class AppServiceProvider extends ServiceProvider
{
use Mcamara LaravelLocalization Traits LoadsTranslatedCachedRoutes;
/**
* Bootstrap any application services.
*/
public function boot(): void
{
RouteServiceProvider:: loadCachedRoutesUsing ( fn () => $ this -> loadCachedRoutes ());
. . .
}
詳細については、こちらを参照してください。
これは、 Routes::group
内にあるアクション ルートをローカライズしていない場合に発生する可能性があります。これによりリダイレクトが発生し、post リクエストが get リクエストに変更される場合があります。これを防ぐには、ローカライズ ヘルパーを使用します。
たとえば、 Auth::routes()
使用してRoute::group
に追加した場合、次のようになります。
<form action="/logout" method="POST">
<button>Logout</button>
</form>
機能しません。代わりに、使用する必要があります
<form action ="{{ LaravelLocalization:: localizeURL ( ' /logout ' ) }} " method= " POST ">
<button>Logout</button>
</form>
これを解決するもう 1 つの方法は、http メソッドを 'laravellocalization.httpMethodsIgnored' に設定して、このタイプのリクエストが処理されないようにすることです。
投稿 URL をローカライズせず、リダイレクト ミドルウェアを使用する場合、投稿リクエストは取得リクエストとしてリダイレクトされます。このような get ルートを定義していない場合、この例外が発生します。
投稿 URL をローカライズするには、「POST が機能しない」の例を参照してください。
これは、投稿 URL をローカライズしていない場合にも発生します。投稿 URL をローカライズしない場合、検証中にデフォルトのロケールが設定され、 back()
に戻るときにデフォルトのロケールで検証メッセージが表示されます。
投稿 URL をローカライズするには、「POST が機能しない」の例を参照してください。
テスト設定中は、呼び出されたルートはまだ不明です。これは、言語を設定できないことを意味します。テスト中にリクエストが行われると、結果は 404 になります。プレフィックスが設定されていないと、ローカライズされたルートは存在しないように見えます。
これを修正するには、この関数を使用して言語プレフィックスを手動で設定します。
// 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
}
あなたもその一員になりたいなら、マカマラに聞いてください!
ここで変更ログを表示します -> 変更ログ
Laravel Localization は、MIT ライセンスに基づいてライセンス供与されたオープンソースの Laravel パッケージです