程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP基礎知識 >> 在Yii應用程序中使用gettext

在Yii應用程序中使用gettext

編輯:PHP基礎知識
 

PO 文件是面向翻譯人員的、提取於源代碼的一種資源文件。當軟件升級的時候,通過使用 gettext 軟件包處理 PO
文件,可以在一定程度上使翻譯成果得以繼承,減輕翻譯人員的負擔。
MO 文件是面向計算機的、由 PO 文件通過 gettext
軟件包編譯而成的二進制文件。程序通過讀取 MO 文件使自身的界面轉換成用戶使用的語言。

最近在寫程序的國際化中,開始使用i18n標准化,要對mo、po文件的操作,在yii framework裡已經有CGettextMessageSource類可以使用
在protected/config中的mian.php中修改,components裡添加messages
'components' =>array(
"messages" => array(
"class" => "CGettextMessageSource",
"useMoFile" => FALSE, //false為使用po文件,要用mo文件設置為true
),
//...
)

我之前用php數組方式做國際化,以為也一樣對應po文件,就把php文件的數據對應做了po文件
但一直沒有效果,搞了老半天,最後看了CGettextMessageSource的源碼發現原來文件分布跟CPhpMessageSource的不一樣了
對應的.po文件在 protected/messages/zh-cn/messages.po,就這一個文件
在程序中的翻譯,使用
Yii::t("", "MessageID");

messages.po 裡內容如
msgid "username"
msgstr "用戶名"

msgid "password"
msgstr "密碼"

如果你要分組的話,像這樣使用
Yii::t("user", "MessageID");

需要在messages.po裡需要的每項加上msgctxt,編寫如
msgctxt "user"
msgid "username"
msgstr "用戶名"

msgctxt "user"
msgid "password"
msgstr "密碼"

但是像我這樣之前分多個php文件保存數組的翻譯內容,並使用 Yii::t(“user”,”MessageID”); 這樣來翻譯,需要改很多地方
於是只好重寫CGettextMessageSource類中的loadMessages方法了
在protected/components裡創建類 MyGettextMessage.php,代碼如下
class MyGettextMessage extends CGettextMessageSource {

protected function loadMessages($category, $language)
{
if(empty($category))
$category=$this->catalog;
$messageFile=$this->basePath . DIRECTORY_SEPARATOR . $language . DIRECTORY_SEPARATOR . $category;
if($this->useMoFile)
$messageFile.=self::MO_FILE_EXT;
else
$messageFile.=self::PO_FILE_EXT;

if ($this->cachingDuration > 0 && $this->cacheID!==false && ($cache=Yii::app()->getComponent($this->cacheID))!==null)
{
$key = self::CACHE_KEY_PREFIX . $messageFile;
if (($data=$cache->get($key)) !== false)
return unserialize($data);
}

if (is_file($messageFile))
{
if($this->useMoFile)
$file=new CGettextMoFile($this->useBigEndian);
else
$file=new CGettextPoFile();
$messages=$file->load($messageFile,'');
if(isset($cache))
{
$dependency=new CFileCacheDependency($messageFile);
$cache->set($key,serialize($messages),$this->cachingDuration,$dependency);
}
return $messages;
}
else
return array();
}
}

protected/config中的mian.php中修改為
'components' =>array(
"messages" => array(
"class" => "application.components.MyGettextMessage",
"useMoFile" => FALSE, //false為使用po文件,要用mo文件設置為true
),
//...
)

這樣,就可以跟php方式一樣,對應文件名稱查找翻譯文件了

 

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved