グッズ

Laravel ローカリゼーションのステップバイステップ ガイド、例を含むチュートリアル

Laravel プロジェクトをローカライズする方法、Laravel でプロジェクトを開発して多言語で使用できるようにする方法。 この記事では、翻訳ファイルの操作方法、言語スイッチャーの作成方法などを例を挙げて説明します。

Laravel は、さまざまな言語や文化に適応するために、ローカルに設計されたアプリケーションです。 ローカリゼーションでは、翻訳を通じて国際化されたアプリケーションを特定の言語に合わせます。

前提条件

  • この記事では、 Laravel バージョン 8.x;
  • このチュートリアルをうまく進めるには、PHP プログラミング言語と Laravel フレームワークに関する必要な知識が必要です。
  • あなたのドメインは localhost. そうでない場合は、交換してください localhost 独自のドメイン名または IP アドレスを使用します (インストールによって異なります)。

翻訳ファイルの操作

Laravel では、他の多くのフレームワークと同様に、さまざまな言語の翻訳を別々のファイルに保存できます。 Laravel 翻訳ファイルを整理するには、次の XNUMX つの方法があります。

  • 次の場所にファイルを保存する古いアプローチ: resources/lang/{en,fr,ru}/{myfile.php};
  • 次の場所にファイルを保存する新しいアプローチ: resources/lang/{fr.json, ru.json};

地域によって異なる言語については、名前を付ける必要があります directory/file ISO 15897 に準拠した言語です。たとえば、英国英語の場合は、 en_GB の代わりに en-gb. この記事では、XNUMX 番目の方法に焦点を当てますが、最初の方法についても同じことが言えます (翻訳キーの名前と取得方法を除く)。 

簡単な翻訳

では、行きましょう resources/views/welcome.blade.phpファイルの内容を置き換えます body次のように、私たちのタグを付けます。

<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>

ローカリゼーションのウェルカム メッセージを準備することから始めます。これは Laravel では非常に簡単です。 「Welcome to our website」というテキストを次のコードに置き換えるだけです。 {{ __('Welcome to our website') }}。 これにより、Laravel にデフォルトで「当社の Web サイトへようこそ」を表示するように指示されます。definite を実行し、英語以外の言語が設定されている場合は、この文字列の翻訳を探します (これについては後で説明します)。 英語がデフォルトの言語として設定されますdefi私たちのアプリの仕様なので、デフォルト設定ではdefi最後に「当社のウェブサイトへようこそ」というテキストを表示するだけです。 ロケールが異なる場合は、一致する翻訳が検索され、すぐに作成されます。

Laravel ローカリゼーション

しかし、Laravel はどの言語が現在の言語であるか、またはどの言語がアプリケーションで使用可能かをどのように知るのでしょうか? これは、アプリのローカル構成を調べることによって行われます config/app.php. このファイルを開いて、次の XNUMX つの連想配列キーを探します。

/*
|--------------------------------------------------------------------------
| 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',

キーの上に表示される説明は一目瞭然ですが、要するに、キー locale ローカルプレが含まれていますdefi(少なくとも、コード内に他のロケールが設定されていない場合)。 そしてその fallback_locale アプリケーションで存在しないロケールを設定した場合にアクティブになります。

このファイルを開いている間に、アプリケーションがサポートするすべてのロケールを一覧表示するための新しいキーを追加しましょう。 これは後でローカル スイッチャーを追加するときに使用します。 ただし、Laravel では実行する必要がないため、これはオプションのタスクです。

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

現在、アプリケーションは英語、イタリア語、フランス語の XNUMX つの言語をサポートしています。

翻訳ファイル

作業するすべてのロケールを確立したので、プレウェルカム メッセージの翻訳に進むことができます。defiナイト。

新しいローカリゼーション ファイルをフォルダーに追加することから始めましょう。 resources/lang. まず、ファイルを作成します resources/lang/it.json 次のように、対応する翻訳を追加します。

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

次に、ファイルを作成します resources/lang/fr.json:

{

"私たちのウェブサイトへようこそ": 「当サイトへようこそ」

}

ご覧のとおり、常にプレメッセージを参照します。defiファイルに追加したnito welcome.blade.php (どれが {{ __('Welcome to our website') }})。 ファイルを作成する必要がない理由 en.json これは、Laravel が事前設定によってどのメッセージを渡すかをすでに知っているためですdefi関数を終えた __() それらは私たちのローカルプレ用ですdefiにとえん。

Laravel のローカル変更

この時点では、Laravel はロケールを変更する方法を知らないため、今のところはパス内で直接変換を実行しましょう。 事前にウェルカムパスを変更するdefi以下のように終了しました。

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

使用可能な言語のいずれかを最初のパス セグメントとして指定して、Web サイトにアクセスできるようになりました。たとえば、 localhost/rulocalhost/fr. ローカライズされたコンテンツが表示されます。 サポートされていないロケールを指定した場合、またはロケールをまったく指定しなかった場合、Laravel は enデフォルトではdefiニタ。

ミドルウェア

サイト リンクごとにロケールを切り替えることは、望ましくない場合があり、見栄えがよくない場合があります。 そのため、特別な言語スイッチャーを使用して言語設定を行い、ユーザー セッションを使用して翻訳されたコンテンツを表示します。 したがって、新しいミドルウェアを内部に作成します app/Http/Middleware/Localization.phpファイルまたは実行 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);
    }
}

このミドルウェアは、ユーザーが選択したロケールがセッションに存在する場合、Laravel にそのロケールを使用するように指示します。

これはリクエストごとに実行する必要があるため、プレミドルウェア スタックにも追加する必要があります。defiで終わった app/http/Kernel.php以下のために webミドルウェア グループ:

* 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 */
  ],

コース変更

次に、ロケールを変更するためのパスを追加する必要があります。 クロージャー パスを使用していますが、必要に応じてコントローラー内でまったく同じコードを使用できます。

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

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

また、以前にプレウェルカムパスに追加されたロケール切り替えを削除することを忘れないでください。defi夜:

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

これが完了すると、ユーザーが現在設定されている言語を変更する唯一の方法は、次のように入力することです。 localhost/language/{locale}。 ザ・ locale選択内容はセッション内に保存され、ユーザーを元の場所にリダイレクトします ( Localizationミドルウェア)。 試すには、にアクセスしてください localhost/language/ru(ブラウザにセッション Cookie が存在する限り) 翻訳されたコンテンツが表示されます。 Web サイト内を自由に移動したり、ページを更新して選択した言語が保持されていることを確認したりできます。

整流子

ここで、ローカル コードを URL に手動で入力する代わりに、ユーザーがクリックして言語を変更できるものを作成する必要があります。 これを行うために、非常に単純な言語チェッカーを追加します。 したがって、新しい resources/views/partials/language_switcher.blade.php次のコードを含むファイル:

<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>

新しく作成したスイッチャーを「ようこそ」ビューに含めます。

<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>

XNUMX月 app/Providers/AppServiceProvider.phpファイルを作成し、言語スイッチャーが構成されるときに共有するコードを追加します。 具体的には、ファイルとしてアクセスできる現在のロケールを共有します {{ $current_locale }}.

イノベーションニュースレター
イノベーションに関する最も重要なニュースをお見逃しなく。 メールで受け取るにはサインアップしてください。

PHP Laravel の高度な翻訳オプション

主に取り組んでいきます resources/views/welcome.blade.php、したがって、特に指定がない限り、すべてがウェルカム ビューで発生する必要があります。

翻訳文字列のパラメータ

たとえば、一般的なメッセージを表示するだけでなく、架空のユーザー (Amanda) に挨拶してみましょう。

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

最初の文字を小文字にした名前を使用しましたが、最初の文字を大文字にしたプレースホルダーを使用したことに注意してください。 このように、Laravel は実際の単語を自動的に大文字にするのに役立ちます。 これは、プレースホルダーが大文字で始まる場合に発生します。たとえば、 :Name「Caroline」または完全に大文字の単語を生成し、  :NAME、「キャロライン」をプロデュース。

翻訳ファイルも更新します resources/lang/fr.jsonresources/lang/it.json 、翻訳キーが翻訳と一致しないため、現時点では英語版しか表示されません。

フランス語:

{

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

}

イタリア語:

{

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

}

複数化

複数形化の動作を確認するために、テキストの新しい段落を追加してみましょう。 

複数形を実行するには、関数を使用する必要があります trans_choice の代わりに __()、 例えば:

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

ご覧のとおり、複数形は a で区切られています。 |.

では、複数の複数形が必要な場合はどうでしょうか。 

これも可能です:

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

この場合、数字を許可します 01、そして、 219、そして最後に20以降。 もちろん、必要なだけルールを追加できます。

では、複数形のプレースホルダーが必要な場合はどうすればよいでしょうか? 

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

プレースホルダーを使用して、必要に応じて「trans_choice」で渡されたカウントを使用することもできます :count 特別:

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

最後に、基本翻訳に加えた変更で翻訳ファイルを更新することを忘れないでください。

イタリア語:

{
  "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"
}

フランス語:

{    
  "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"
}

Laravel でローカライズされた日付を操作する

日付を特定するために、 Carbon 、Laravel にデフォルトで付属していますdefiニタ。 をチェックしてください カーボンドキュメンテーション ; 面白いことがたくさんできます。 たとえば、日付と時刻のルールを使用してロケールを設定できます。

簡単な例として、選択した言語にローカライズされた現在の日付を表示します。 私たちの中で routes/web.php、ようこそページのパスを更新し、ローカライズされた日付メッセージを私たちのものに渡します view いらっしゃいませ:

<?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
    ]);
});

更新しましょう resources/views/welcome.blade.php 次のように日付表示を追加します。

{{ __('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 }}

のホームページの言語を変更しようとしています localhost、日付がローカライズされていることがわかります。次に例を示します。

NumberFormatter を使用した数値と通貨の書式設定

国が異なれば、人々はさまざまな形式を使用して数値を表します。次に例を示します。

  • 米国 → 123.123,12
  • フランス → 123 123,12

したがって、これらの違いを Laravel アプリに反映するには、次を使用できます。 ナンバーフォーマッター 次のように:

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

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

数値を特定の言語で書き、「XNUMX」のように表示することもできます。

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

さらに、NumberFormatter を使用すると、次のような通貨を簡単に見つけることができます。

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

だから fr ユーロが表示されますが、 en_US 通貨は米ドルになります。

Ercole Palmeri

イノベーションニュースレター
イノベーションに関する最も重要なニュースをお見逃しなく。 メールで受け取るにはサインアップしてください。

最近の記事

カターニア総合病院での Apple ビューアによる拡張現実への革新的な介入

Apple Vision Pro 商用ビューアを使用した眼形成手術がカターニア総合病院で行われました。

3月2024

子供のためのぬり絵の利点 - すべての年齢層のための魔法の世界

ぬり絵を通じて細かい運動能力を発達させることで、子供たちは書くなどのより複雑なスキルを習得できるようになります。色…

2月2024

未来はここにあります: 海運業界が世界経済をどのように変革しているか

海軍部門は真の世界経済大国であり、150 億市場に向けて舵を切り続けています...

1月2024

パブリッシャーと OpenAI が人工知能によって処理される情報の流れを規制する契約に署名

先週の月曜日、フィナンシャル・タイムズ紙はOpenAIとの契約を発表した。 FT は世界クラスのジャーナリズムにライセンスを供与しています…

4月30 2024

あなたの言語でイノベーションを読む

イノベーションニュースレター
イノベーションに関する最も重要なニュースをお見逃しなく。 メールで受け取るにはサインアップしてください。

Seguici