1. 程式人生 > >yii2框架-i18n國際化(十二)

yii2框架-i18n國際化(十二)

這一節主要是聊聊關於yii2框架的自帶的國際化的i18n元件。根據不同的地區和語言,軟體產品可以支援全方位資訊翻譯,檢視翻譯,日期和數字格式化,方便不同使用者的使用。
一個 Yii 應用使用兩種語言:yii\base\Application::$sourceLanguage 和 yii\base\Application::$language 。前者指的是寫在程式碼中的語言,後者是向終端使用者顯示內容的語言。 而資訊翻譯服務主要是將文字訊息從原語言翻譯到目標語言。
簡單的說,就是源語言作為鍵,值可以對應不同的目標語言。

可以用類似下面的應用程式配置來配置應用程式語言:
return [
    // 設定目標語言為俄語
    'language' => 'ru-RU',
    
    // 設定源語言為英語
    'sourceLanguage' => 'en-US',
       ......
];
預設的 yii\base\Application::$sourceLanguage 值是 en-US,即美國英語。 建議你保留此預設值不變,因為通常讓人將英語翻譯成其它語言要比將其它語言翻譯成其它語言容易得多。

你經常需要根據不同的因素來動態地設定 yii\base\Application::$language ,如終端使用者的語言首選項。 要在應用程式配置中配置它,你可以使用下面的語句來更改目標語言:

// 改變目標語言為中文
\Yii::$app->language = 'zh-CN';


(1)訊息翻譯

訊息翻譯服務用於將一條文字資訊從一種語言(通常是 yii\base\Application::$sourceLanguage ) 翻譯成另一種語言(通常是 yii\base\Application::$language)。 它的翻譯原理是通過在語言檔案中查詢要翻譯的資訊以及翻譯的結果。如果要翻譯的資訊可以在語言檔案中找到,會返回相應的翻譯結果; 否則會返回原始未翻譯的資訊。

為了使用訊息翻譯服務,需要做如下工作:

呼叫 Yii::t() 方法且在其中包含每一條要翻譯的訊息;
配置一個或多個訊息來源,能在其中找得到要翻譯的訊息和翻譯結果;
讓譯者翻譯資訊並將它們儲存在訊息來源。
這個 Yii::t() 方法的用法如下,

echo \Yii::t('app', 'This is a string to translate!');

通俗簡單的說,Yii::t()的這個方法,通過呼叫i18n這個component,i18這個元件可以設定定義語言檔案存放的basePath,fileMapl類對映檔案等等
下面看一個例子
'components' => [
    // ...
    'i18n' => [
        'translations' => [
            'app*' => [
                'class' => 'yii\i18n\PhpMessageSource',
                //'basePath' => '@app/messages',
                //'sourceLanguage' => 'en-US',
                'fileMap' => [
                    'app' => 'app.php',
                    'app/error' => 'error.php',
                ],
            ],
        ],
    ],
],

app*是一個模式,Yii::t()的第一個引數,凡是以app開頭的都將定義到該模式下,在該模式定義好的語言檔案尋找對應的語言檔案,同時這個路徑位置由Yii::$app->language和'basePath' => '@app/messages',共同決定,所以一般需要在@app/messages下建立一個和language同名的資料夾,例如變成@app/messages/zh_CN。在zh_CN下可以建立語言檔案。例如app_video.php,那麼Yii::t('app_video','this name')時,就會直接找到@app/messages/zh_CN/app_video.php這個檔案,'this name' 對應的中文名稱了。
同時對於fileMap這個對映檔案陣列,就是將Yii::t()對應的第一個引數的需要找的語言檔案,對映至一個檔案,例如Yii::t('app/error','hello'),如果配置好
'fileMap' => [
    'app/error' => 'error.php',
],
那麼就會對映至@app/messages/zh_CN/error.php,如果沒有配置的話,那麼就會直接尋找
@app/messages/zh_CN/app/error.php,就需要在建立一個app檔案夾了,這個在對於模組化設計時是非常有幫助的,比如app/video/info.php,不配置fileMap,那麼在@app/messages/zh_CN建立一個app資料夾作為應用的語言資料夾,再在app下建立video資料夾,video就是在應用中的模組,這樣子可以將各個模組的語言檔案有序分離,方便開發和維護。

(2)訊息格式化
在要翻譯的訊息裡,你可以嵌入一些佔位符,並讓它們通過動態的引數值來代替。你甚至可以根據目標語言格式的引數值來使用特殊的佔位符
在待翻譯的訊息,可以嵌入一個或多個佔位符,以便它們可以由給定的引數值取代。通過給不同的引數值,可以動態地改變翻譯內容的訊息。 在下面的例子中,佔位符 {username} 在 “Hello, {username}!” 中將分別被 'Alexander'和'Qiang' 所替換。

$username = 'Alexander';
// 輸出:“Hello, Alexander”
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);

$username = 'Qiang';
// 輸出:“Hello, Qiang”
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);
下面舉個例子:
語言檔案app.php:
return [
'id for {name} is {id}'=>'{name}的id是{id}',
];

那麼在呼叫時:
$varlue = Yii::t('app','id for {name} is {id}',[
'name' =>'bingcool',
'id' =>11
]);
echo $varlue;

輸出的結果:bingcool的id是11。所以name和id是動態的變數賦值。
上面這個例子叫做名稱佔位符。即每個佔位符的格式為 {引數名稱} ,你所提供的引數作為關聯陣列, 其中陣列的鍵是引數名稱(沒有大括號),陣列的值是對應的引數值。

下面說一下位置佔位符
位置佔位符是使用基於零的整數序列,在呼叫 Yii::t() 時會引數值根據它們出現位置的順序分別進行替換。 在下面的例子中,位置佔位符 {0},{1} 和 {2} 將分別被 $price,$count 和 $subtotal 所替換。
$price = 100;
$count = 2;
$subtotal = 200;
echo \Yii::t('app', 'Price: {0}, Count: {1}, Subtotal: {2}', $price, $count, $subtotal);

提示:大多數情況下你應該使用名稱佔位符。這是因為引數名稱可以讓翻譯者更好的理解要被翻譯的訊息。


(3)格式化引數
你可以在訊息的佔位符指定附加格式的規則,這樣的引數值可在替換佔位符之前格式化它們。在下面的例子中, 價格引數值將視為一個數並格式化為貨幣值:
要求安裝php_intl擴充套件
$price = 100;
echo \Yii::t('app', 'Price: {0, number, currency}', $price);
這一章節參考: