[ Laravel 5.8 文件 ] 前端開發 —— 本地化
簡介
Laravel 的本地化特性允許你在應用中輕鬆實現多語言支援。語言字串預設存放在resources/lang
目錄中,該目錄包含了應用支援的每種語言的子目錄:
/resources /lang /en messages.php /es messages.php
所有語言檔案都返回一個鍵值對陣列,例如:
<?php return [ 'welcome' => 'Welcome to LaravelAcademy.org' ];
配置 Locale 選項
應用預設語言存放在配置檔案config/app.php
中,當然,你可以修改該值來滿足應用需要。你還可以在執行時使用App
門面上的setLocale
方法改變當前語言:
Route::get('welcome/{locale}', function ($locale) { App::setLocale($locale); // });
你還可以配置一個“備用語言”,噹噹前語言不包含給定語言行時備用語言被返回。和預設語言一樣,備用語言也在配置檔案config/app.php
中配置:
'fallback_locale' => 'en',
判斷當前的本地語言
你可以使用App
門面上的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 LaravelAcademy.org' ];
使用翻譯字串作為鍵
對於那些對翻譯有重度要求的應用來說,為每個字串定義一個“short key”在檢視中引用的時候會變得越來越難以理解,甚至引起困惑。因為這個原因,Laravel 還支援使用“預設”翻譯字串作為鍵來定義翻譯字串。
使用翻譯字串作為鍵的翻譯檔案以 JSON 檔案的方式存放在resources/lang
目錄下。例如,如果你的應用有一個西班牙版翻譯,需要建立一個resources/lang/es.json
檔案:
{ "I love programming.": "Me encanta la programación." }
獲取翻譯字串
你可以使用輔助函式__
從語言檔案中獲取行,該方法接收檔案和翻譯字串的鍵作為第一個引數,舉個例子,我們從語言檔案resources/lang/messages.php
中獲取welcome
對應的翻譯字串:
echo __('messages.welcome'); echo __('I love programming.');
當然如果你使用了Blade 模板引擎,可以使用{{ }}
語法列印翻譯字串或者使用@lang
指令:
{{ __('messages.welcome') }} @lang('messages.welcome')
如果指定的翻譯字串不存在,__
函式將返回翻譯字串的鍵,所以,使用上面的例子,如果翻譯字串不存在的話,__
函式將返回messages.welcome
。
注:@lang
指令不會轉義任何輸出,使用這個指令的時候,你需要對自己輸出的轉義操作負全責。
替換翻譯字串中的引數
如果需要的話,你可以在翻譯字串中定義佔位符,所有的佔位符都有一個:
字首,例如,你可以用佔位符name
定義一個welcome
訊息:
'welcome' => 'Welcome, :name',
要在獲取翻譯字串的時候替換佔位符,傳遞一個替換陣列作為__
函式的第二個引數:
echo __('messages.welcome', ['name' => 'laravel']);
如果佔位符都是大寫的,或者首字母是大寫的,那麼相應的,傳入的值也會保持和佔位符格式一致:
'welcome' => 'Welcome, :NAME', // Welcome, LARAVEL 'goodbye' => 'Goodbye, :Name', // Goodbye, Laravel
複數
複數是一個複雜的問題,因為不同語言對複數有不同的規則,通過使用管道符“|”,你可以區分一個字串的單數和複數形式:
'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
函式獲取給定行數的語言行,在本例中,由於行數大於1,將會返回翻譯字串的複數形式:
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
檔案。在這個檔案中只需要定義你想要覆蓋的句子,沒有覆蓋的句子仍然從該擴充套件包原來的語言檔案中載入。