在開發面向全球用戶的 Web 應用時,國際化(i18n)是不可或缺的功能。Yi i Framework 內建強大的訊息翻譯機制,透過 Yii::t() 方法即可輕鬆實現多語言支援。本文將以實際範例,完整說明如何在 Yii 專案中加入中文支援,涵蓋配置、訊息來源建立、程式碼改寫等關鍵步驟。
Yii 的翻譯核心在於 Yii::t($category, $message, $params=array(), $source=null, $language=null) 方法。它會根據應用程式設定的 源語言(sourceLanguage)與 目標語言(language),從對應的訊息來源載入翻譯。若找不到翻譯,則直接回傳原訊息。
在 protected/config/main.php 中設定語言與訊息來源路徑:
<?php
return array(
'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
'sourceLanguage'=>'en', // 來源語言:英文
'language'=>'zh_cn', // 目標語言:簡體中文
'name'=>'i18nDemo',
'components'=>array(
'coreMessages'=>array(
'basePath'=>'protected/messages', // 訊息檔案根目錄
),
),
);
於 protected/messages/zh_cn/ 目錄下建立 yii.php(類別名稱自訂),回傳鍵值對應的翻譯陣列:
<?php
return array(
'Application Name' => '應用程式名稱',
'Greetings from Santa' => '來自聖誕老人的問候',
'firstName' => '名',
'lastName' => '姓',
'Choose your Christmas Gift' => '選擇你喜歡的聖誕禮物',
'iPad' => 'iPad',
'Remote control helicopter' => '遙控直升機',
'60 inch 3D LED TV' => '60吋3D LED電視',
'Holy Bible' => '聖經',
'Choose your Christmas dinner' => '選擇你的聖誕晚餐',
'Egg' => '雞蛋',
'Ham' => '火腿',
'Chicken' => '雞肉',
'Pork' => '豬肉',
'Beer' => '啤酒',
'Coke' => '可樂',
'Wine' => '紅酒',
'Submit' => '送出',
'Merry Christmas' => '聖誕快樂',
'On Christmas Day,You will be given' => '聖誕節那天你將獲得',
'And you will have' => '你可以擁有',
'for Christmas dinner' => '作為聖誕晚餐',
'Start Again' => '重新選擇'
);
將原本寫死的字串替換為翻譯呼叫。以資料模型為例:
<?php
class DataModel extends CFormModel
{
public function getGifts()
{
return array(
'1' => Yii::t('yii','iPad'),
'2' => Yii::t('yii','Remote control helicopter'),
'3' => Yii::t('yii','60 inch 3D LED TV'),
'4' => Yii::t('yii','Holy Bible'),
);
}
public function getMeals()
{
return array(
'1' => Yii::t('yii','Egg'),
'2' => Yii::t('yii','Ham'),
'3' => Yii::t('yii','Chicken'),
'4' => Yii::t('yii','Pork'),
'5' => Yii::t('yii','Beer'),
'6' => Yii::t('yii','Coke'),
'7' => Yii::t('yii','Wine'),
);
}
}
Yii::app()->language,實現即時切換。Yii::t('yii', 'Hello {name}', array('{name}'=>$user)) 支援變數插值。CChoiceFormat 處理不同語言的複數規則。CPhpMessageSource 外,亦可使用資料庫、Gettext 等儲存方式。
本文完整程式碼可至 I18NDemo.zip 下載參考。