在地化
簡介
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 的getLocale
和isLocale
方法來決定目前的區域設定或檢查語言環境是否為給定值:
$locale = App::getLocale();if (App::isLocale('en')) { // }
定義翻譯字串
#使用短鍵
通常,翻譯字串都存放在resources/lang
目錄下的檔案裡。在此目錄中,但凡應用支援的每種語言都應該有一個對應的子目錄:
/resources /lang /en messages.php /es messages.php
所有語言檔案都傳回鍵值對數組,例如:
<?php // resources/lang/en/messages.php return [ 'welcome' => 'Welcome to our application' ];
使用翻譯字串作為鍵
對於有大量翻譯需求的應用,如果每個翻譯語句都要一一使用『短鍵』 來定義,那麼當你在視圖中嘗試去引用這些『短鍵』 的時候,很容易變得混亂。因此, Laravel 也支援使用字串 『預設』 翻譯作為關鍵字來定義翻譯字串。
使用翻譯字串作為鍵的翻譯檔案以 JSON 格式儲存在 resources/lang
目錄中。例如,如果你的應用程式中有西班牙文翻譯,你應該在該目錄下新建一個resources/lang/es.json
檔案:
{ "I love programming.": "Me encanta programar." }
檢索翻譯字串
你可以使用輔助函數__
從語言檔案檢索,__
函數接受翻譯字串所在的檔案名稱加鍵名作為其第一個參數。例如,我們要檢索resources/lang/messages.php
語言檔案中的翻譯字串welcome
:
echo __('messages.welcome'); echo __('I love programming.');
如果你正在使用Blade 模板引擎,你可以在視圖文件中使用{{ }}
語法或使用@lang
指令來列印翻譯字串:
{{ __('messages.welcome') }} @lang('messages.welcome')
如果指定的翻譯字串不存在,那麼__
函數會直接傳回該翻譯字串的鍵名。所以,如果上述範例中的翻譯字串對應的鍵值對不存在, __
函數將會直接傳回 messages.welcome
。
{note}
@lang
指令不會對任何輸出進行轉義。當你使用這個指令時,你必須 完全由自己承擔 對輸出內容的轉義工作。
翻譯字串中的參數替換
如果需要,你可以在翻譯字串中定義佔位符。所有的佔位符都有一個 :
前綴。例如,你可以使用佔位符name 定義歡迎訊息:
'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
函數來檢索給定『數量』的內容。例如,設定 『總數』 為 10 ,符合數量範圍 1 至 19 ,所以會得到 There are some 這條複數語句:
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]);
如果你想讓傳遞給trans_choice
函數的『數量』 參數顯示在在翻譯字串中,你可以使用:count
佔位符:
'apples' => '{0} There are none|{1} There is one|[2,*] There are :count',
重寫擴充包的語言檔案
部分擴充包可能會附帶自己的語言檔案。你可以透過在 resources/lang/vendor/{package}/{locale}
目錄放置檔案來重寫它們,而不要直接修改擴充包的核心檔案。
例如,當你需要重寫 skyrim/hearthfire
擴充包的英文語言檔案messages.php
,則需要把檔案存放為resources/lang /vendor/hearthfire/en/messages.php
。在這個檔案中,你只需要定義你想要修改的翻譯字串。任何沒有被重寫的翻譯字串仍將從擴充包的原始語言檔案中載入。