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