Laravel的本地化特性提供了一個(gè)方便的方式從多個(gè)語言文件中獲取字符串,從而允許你在應(yīng)用中輕松支持多種語言。
語言字符串存放在resources/lang
目錄中,在該目錄中應(yīng)該包含應(yīng)用支持的每種語言的子目錄:
/resources
/lang
/en
messages.php
/es
messages.php
所有語言文件都返回一個(gè)鍵值對(duì)數(shù)組,例如:
<?php
return [
'welcome' => 'Welcome to our application'
];
應(yīng)用默認(rèn)語言存放在配置文件config/app.php
中,當(dāng)然,你可以修改該值來匹配應(yīng)用需要。你還可以在運(yùn)行時(shí)使用App
門面上的setLocale
方法改變當(dāng)前語言:
Route::get('welcome/{locale}', function ($locale) {
App::setLocale($locale);
//
});
你還可以配置一個(gè)“備用語言”,當(dāng)當(dāng)前語言不包含給定語言行時(shí)備用語言被返回。和默認(rèn)語言一樣,備用語言也在配置文件config/app.php
中配置:
'fallback_locale' => 'en',
你可以使用幫助函數(shù)trans
從語言文件中獲取行,該方法接收文件和語言行的鍵作為第一個(gè)參數(shù),例如,讓我們?cè)谡Z言文件resources/lang/messages.php
中獲取語言行welcome
:
echo trans('messages.welcome');
當(dāng)然如果你使用Blade模板引擎,可以使用{{?}}語法打印語言行:
{{ trans('messages.welcome') }}
如果指定的語言行不存在,trans
函數(shù)將返回語言行的鍵,所以,使用上面的例子,如果語言行不存在的話,trans
函數(shù)將返回messages.welcome
。
替換語言行中的參數(shù)
如果需要的話,你可以在語言行中定義占位符,所有的占位符都有一個(gè):前綴,例如,你可以用占位符名稱定義一個(gè)welcome
消息:
'welcome' => 'Welcome, :name',
要在獲取語言行的時(shí)候替換占位符,傳遞一個(gè)替換數(shù)組作為trans
函數(shù)的第二個(gè)參數(shù):
echo trans('messages.welcome', ['name' => 'Dayle']);
多元化是一個(gè)復(fù)雜的問題,因?yàn)椴煌Z言對(duì)多元化有不同的規(guī)則,通過使用管道字符“|”,你可以區(qū)分一個(gè)字符串的單數(shù)和復(fù)數(shù)形式:
'apples' => 'There is one apple|There are many apples',
然后,你可以使用trans_choice
函數(shù)獲取給定行數(shù)的語言行,在本例中,由于行數(shù)大于1,將會(huì)返回語言行的復(fù)數(shù)形式:
echo trans_choice('messages.apples', 10);
由于Laravel翻譯器由Symfony翻譯組件提供,你可以創(chuàng)建更復(fù)雜的多元化規(guī)則:
'apples' => '{0} There are none|[1,19] There are some|[20,Inf] There are many',
有些包可以處理自己的語言文件。你可以通過將自己的文件放在resources/lang/vendor/{package}/{locale}
目錄下來覆蓋它們而不是破壞這些包的核心文件來調(diào)整這些句子。
所以,舉個(gè)例子,如果你需要覆蓋名為skyrim/hearthfire
的包中的messages.php
文件里的英文句子,可以創(chuàng)建一個(gè)resources/lang/vendor/hearthfire/en/messages.php
文件。在這個(gè)文件中只需要定義你想要覆蓋的句子,你沒有覆蓋的句子仍然從該包原來的語言文件中加載。
更多建議: