本地化

簡介

Laravel 的本地化功能提供方便的方法來取得多語系的字串,讓你的網站可以簡單的支援多語系。語系字串存放在 resources/lang 資料夾的檔案裡。在此資料夾內,每個網站支援的語系都會對應到一個子目錄:

/resources
    /lang
        /en
            messages.php
        /es
            messages.php

語系檔會回傳鍵值為字串的陣列。例如:

<?php

return [
    'welcome' => 'Welcome to our application'
];

切換語系

網站的預設語系儲存在 config/app.php 設定檔中。你隨時可以根據應用程式需求來修改這個值。也可以用 App facade 的 setLocale 方法來切換現行語系:

Route::get('welcome/{locale}', function ($locale) {
    App::setLocale($locale);

    //
});

你也可以設定「備用語系」,會在現行語言沒有給定的翻譯自傳時使用。如同預設語系,備用語系也可以在 config/app.php 設定檔中設定:

'fallback_locale' => 'en',

判斷當前語系

你可以使用 App facade 的 getLocaleisLocal 方法來判斷當前語系或檢查語系是否為給定值:

$locale = App::getLocale();

if (App::isLocale('en')) {
    //
}

定義翻譯字串

使用短鍵值

翻譯字串通常儲存在 resources/lang 資料夾的檔案中。在此資料夾內,每個網站支援的語系都會對應到一個子目錄:

/resources
    /lang
        /en
            messages.php
        /zh-TW
            messages.php

語系檔會回傳鍵值為字串的陣列。例如:

<?php

// resources/lang/en/messages.php

return [
    'welcome' => 'Welcome to our application'
];

以翻譯字串為鍵值

對有大量翻譯需求的網站來說,為每個字串定義一個「短鍵值」很快就會在視圖中使用時令人困惑。因此,Laravel 也支援以「預設」語系的字串來作為定義翻譯字串的鍵值。

以翻譯字串為鍵值的語系檔存放在resources/land的 JSON 檔案中。例如,如果網站想支援中文,應該要建立一個 resources/lang/zh-TW.json 檔案:

{
    "I love programming.": "我愛寫程式。"
}

取出翻譯字串

你可以使用__輔助函式來從語系檔中取出內容。__方法第一個參數是檔案跟翻譯字串的鍵值。例如,從 resources/lang/messages.php 語系檔中取出 welcome 翻譯字串:

echo __('messages.welcome');

echo __('I love programming.');

如果你是使用 Blade 模板引擎,可以用 {{ }} 語法或 @land 指令來回傳翻譯字串:

 {{ __('messages.welcome') }} 

@lang('messages.welcome')

如果指定的翻譯字串不存在,__方法只會回傳翻譯字串鍵值。所以在使用上面的範例,__方法在翻譯字串不存在時翻譯會回傳 messages.welcome

在翻譯字串中取代參數

你也可以在翻譯字串中定義佔位符。所有佔位符都要以:前綴。例如,可以定義一個有佔位名稱的歡迎訊息:

'welcome' => 'Welcome, :name',

要取代翻譯字串中的佔位符,需把替代品的陣列傳給__方法的第二個參數:

echo __('messages.welcome', ['name' => 'dayle']);

如果佔位符全部都是大寫,或只有第一個字母大寫,被翻譯出的值也會變成對應的大寫:

'welcome' => 'Welcome, :NAME', // Welcome, DAYLE
'goodbye' => 'Goodbye, :Name', // Goodbye, Dayle

複數化

複數化是個複雜的問題,不同語言對於複數化有不同的規則。使用「 」字元,可以區分單複數字串格式:
'apples' => 'There is one apple|There are many apples',

甚至可以建立更複雜的複數化規則給不同數字範圍的翻譯字串:

'apples' => '{0} There are none|[1,19] There are some|[20,*] There are many',

定義好有複數化選項的翻譯字串後,便可以用 trans_choice 方法來取得指定「數量」的內容。在這個範例中,因為數量大於一,會複數格式的翻譯字串:

echo trans_choice('messages.apples', 10);

你也可以在多個設定中定義佔位符屬性。這些佔位符可以透過傳入一組陣列作為第三個參數到 trans_choice 函式中替換內容:

'minutes_ago' => '{1} :value minute ago|[2,*] :value minutes ago',

echo trans_choice('time.minutes_ago', 5, ['value' => 5]);

覆寫套件的語言檔

部分套件帶有自己的語系檔,可以藉由放置檔案在 resources/lang/vendor/{package}/{locale} 來複寫它們,而不是直接修改套件的核心檔案。

例如,如果需要覆寫 skyrim/hearthfire 套件的英文語系檔 messages.php,您應該把檔案放置在: resources/lang/vendor/hearthfire/en/messages.php。在這個檔案中,只要去定義需要覆寫的翻譯字串,任何沒有覆寫的翻譯字串仍會從套件的語言檔載入。