用品

Laravel 本地化分步指南,帶示例的教程

如何本地化 Laravel 項目,如何在 Laravel 中開發項目並使其可用於多種語言。 在本文中,我們將通過示例了解如何使用翻譯文件、創建語言切換器等。

Laravel 是一個為本地化設計的應用程序,以適應各種語言和文化。 本地化通過翻譯為特定語言定制國際化應用程序。

先決條件

  • 在這篇文章中,我們將提到 Laravel 版本 8.x;
  • 要成功學習本教程,您需要具備 PHP 編程語言和 Laravel 框架的必要知識。
  • 您的域名是 localhost. 如果不是,請更換 localhost 使用您自己的域名或 IP 地址(取決於您的安裝)。

使用翻譯文件

在 Laravel 中,就像在許多其他框架中一樣,我們可以將不同語言的翻譯存儲在單獨的文件中。 組織 Laravel 翻譯文件的方式有兩種:

  • 將文件存儲在以下位置的舊方法: resources/lang/{en,fr,ru}/{myfile.php};
  • 一種將文件存儲在以下位置的新方法: resources/lang/{fr.json, ru.json};

對於地域不同的語言,你應該給它們命名 directory/file 符合 ISO 15897 的語言。例如,對於英式英語,您將使用 en_GB 代替 en-gb. 在本文中,我們將重點關注第二種方法,但第一種方法也是如此(除瞭如何命名和檢索翻譯鍵)。 

簡單的翻譯

現在,讓我們去 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') }}。 這將指示 Laravel 默認顯示“歡迎來到我們的網站”defi如果設置了英語以外的語言(我們稍後會介紹),則查找該字符串的翻譯。 英語將被設置為默認語言defi我們的應用程序完成了,所以默認設置defi最後我們將簡單地顯示文本“歡迎來到我們的網站”。 如果語言環境不同,我們將嘗試找到匹配的翻譯,稍後就會創建它。

Laravel 本地化

但是 Laravel 是如何知道當前是哪種語言或者應用中有哪些語言可用呢? 它通過查看應用程序中的本地配置來執行此操作 config/app.php. 打開此文件並查找這兩個關聯數組鍵:

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

現在我們的應用程序支持三種語言:英語、意大利語和法語。

翻譯文件

現在我們已經建立了我們將使用的所有區域設置,我們可以繼續翻譯我們的歡迎消息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');
});

我們現在可以訪問我們的網站,指定任何可用的語言作為第一個路徑段:例如, 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),您就會看到翻譯後的內容。 您可以在網站上自由移動或嘗試刷新頁面並查看所選語言是否已保留。

換向器

現在我們需要創建一些東西,用戶可以單擊它來更改語言,而不是手動將本地代碼輸入到 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>

四月 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, 產生“CAROLINE”。

我們還更新了翻譯文件 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,e da 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 中使用本地化日期

為了定位日期,我們將利用  ,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);

您還可以用特定語言編寫數字並顯示類似“十二萬三千一百二十三點一二”的內容:

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

創新通訊
不要錯過有關創新的最重要新聞。 註冊以通過電子郵件接收它們。

最近的文章

兒童著色頁的好處 - 適合所有年齡層的魔法世界

透過著色培養精細運動技能可以幫助孩子為寫作等更複雜的技能做好準備。填色…

2五月2024

未來已來:航運業如何徹底改變全球經濟

海軍部門是真正的全球經濟力量,已邁向 150 億美元的市場…

1五月2024

出版商與 OpenAI 簽署協議以規範人工智慧處理的資訊流

上週一,英國《金融時報》宣布與 OpenAI 達成協議。英國《金融時報》授予其世界級新聞報道許可…

30月2024

線上支付:串流服務如何讓您永遠付款

數百萬人為串流媒體服務付費,每月支付訂閱費用。人們普遍認為您...

29月2024