標籤:des class blog code http ext
轉自:http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/08/09/2132603.html
近 來隨著i18n(國際化)的逐漸標準化,我也來講一講在PHP中如何?國際化支援。跟其他程式語言一樣,在 PHP 也可以利用 gettext 套件寫作 i18n 程式,實現 NLS(Native Language Support) 國際化支援,具體請參考官方文檔(http://www.gnu.org/software/gettext/manual/gettext.html )
這裡我們主要介紹window平台下使用php的擴充gettext實現程式的國際化。
gettext簡介:
GNU gettext是翻譯項目的重要一步,它提供了一個工作架構,由一些整合的工具和文檔組成,協助程式員、翻譯人員和終端使用者實現程式的國際化和本地化。用 Gettext的方式實現多語言得到了廣泛的支援,著名的BLOG程式wordpress的國際化就是用的GNU gettext。
大致原理:
GNU gettext使用PO或MO檔案來實現國際化和本地化。PO的意思是Portable Object,是一種文本結構,可以方便的由人們閱讀和修改。MO是Machine Object的簡寫,MO檔案是PO檔案的二進位形態。一般來說,一個PO或MO檔案對應於一種語言,如果一個程式要支援多種語言,每一種語言都需要自己 的PO或MO檔案。
開始應用:
步驟一:搭建環境(伺服器已經完成,環境已經搭建好了)
1、首先查看你的php擴充目錄下是否有php_gettext.dll這個檔案,如果沒有,這就需要你下載一個或是從其他地方拷貝一個,然後放到php擴充目錄。
2、開啟php.ini,尋找”;extension=php_gettext.dll“ ,然後去除注釋,重啟apache。
若一切順利,就可以在 phpinfo() 中看到 gettext 字樣,至此伺服器環境配置完畢。
步驟二:假如我們要翻譯test.php頁面裡的hello word!這句話。
編輯test.php,將要翻譯 的文字用gettext函數包含,表示這些被包含的文字是需要用來翻譯的。
<?
include_once ( ‘inc/setLan.php‘ );
$domain = ‘test‘ ; //網域名稱,可以任意取個有意義的名字,不過要跟相應的.mo檔案的檔案名稱相同(不包括副檔名)。
bindtextdomain ( $domain , "locale/" ); //設定某個域的mo檔案路徑
bind_textdomain_codeset($domain , ‘UTF-8‘ ); //設定mo檔案的編碼為UTF-8
textdomain($domain ); //設定gettext()函數從哪個域去找mo檔案
?>
<html>
<head>
<meta http-equiv="Content-Type" content= "text/html; charset=utf-8" />
<title>title</title>
</head>
<body bgcolor="#FFFFFF" text= "#000000" link= "#FF9966" vlink= "#FF9966" alink= "#FFCC99" >
<?= gettext ( ‘hello world.‘ ) ?>
</body>
</html>
這裡的setLan.php組件是用來接收語言參數的,當調用test.php?lan=zh_CN的時候,則顯示中文翻譯後的頁面,調用 test.php?lan=zh_TW,則顯示繁體翻譯後的頁面,當沒有參數的情況,則預設根據http頭資訊裡的語言進行顯示,如果頭資訊裡的語言我們 沒有提供語言套件,則預設顯示gettext函數裡包含的文字。
setLan.php代碼:
<?php
$lan = $_REQUEST [ ‘lan‘ ];
if ( $lan == ‘zh_CN‘ ){
putenv(‘LANG=zh_CN‘ );
setlocale(LC_ALL, ‘zh_CN‘ ); //指定要用的語系,如:en_US、zh_CN、zh_TW
}elseif ( $lan == ‘zh_TW‘ ){
putenv(‘LANG=zh_TW‘ );
setlocale(LC_ALL, ‘zh_TW‘ ); //指定要用的語系,如:en_US、zh_CN、zh_TW
}elseif ( $lan == ‘en_US‘ ) {
putenv(‘LANG=en_US‘ );
setlocale(LC_ALL, ‘en_US‘ ); //指定要用的語系,如:en_US、zh_CN、zh_TW
}
?>
步驟三:編輯好了test.php後,我們就應該對這個頁面產生對應的語言套件(test.po和test.mo檔案)
要產生語言套件,我們需要藉助兩款工具:
1、gettext工具:http://nchc.dl.sourceforge.net/sourceforge/gnuwin32/gettext-0.14.4.exe
(用來產生po檔案,安裝好了以後,需要把”安裝路徑/bin”添加到系統內容變數path裡)
2、Poedit工具:http://www.poedit.net/download.php (用來編輯po檔案,編輯需要翻譯的語言,最後自動產生mo檔案)
假設我們都安裝好了這些軟體,現在我們開始對test.php進行翻譯工作。開啟命令提示字元cmd,切換到test.php所在的目錄。
輸入 xgettext -d test test.php --from-code=utf-8 (當你要翻譯的頁面為index.php,只需要將藍色部分改為index即可),然後執行,這時候你可以在test.php所在目錄看到新產生的檔案test.po
用poedit工具開啟test.po,然後針對這些語言翻譯成我們對應的語言,儲存後poedit會自動生產mo檔案(unicode二進位碼)。
將po檔案和mo檔案放入項目目錄
/locale/language/LC_MESSAGES/test.po
/locale/language/LC_MESSAGES/test.mo
如我們放入的是簡體中文,則放入:
/locale/zh_CN/LC_MESSAGES/test.po
/locale/zh_CN/LC_MESSAGES/test.mo
如我們放入的是繁體中文,則放入:
/locale/zh_TW/LC_MESSAGES/test.po
/locale/zh_TW/LC_MESSAGES/test.mo
OK。一切都非常順利,我們開始訪問測試下多語言吧。訪問test.php?lan=zh_CN則顯示簡體,訪問test.php?lan=zh_TW顯示繁體。有什麼問題,留言共同討論 :)
php 通過include方式實現國際化多語言(i18n) :
最後記得要 重啟Apache,方可看到效果。
++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++
如何將多個檔案的語言翻譯放到同一個.mo檔案中???
如,測試專案檔案結構如下:
現想把 前台檔案 test.php,test2.php 等檔案的語言套件等放集中放在cn.mo檔案中,操作如下:
只需要把 test.php,test2.php 等檔案的 語言套件“域”都設定為“cn”,並且在對每個php檔案產生.mo檔案時,以追加的形式添加到“域cn” 即可。
test.php 檔案內容如下:
<?
putenv (‘LANG=zh_CN‘ );
setlocale ( LC_ALL, ‘zh_CN‘ );
//定義要用的語言檔案名稱
$domain = ‘cn‘ ;
bindtextdomain ( $domain , dirname(__FILE__).‘/locale‘ ); //設定某個域的mo檔案路徑
bind_textdomain_codeset($domain , ‘UTF-8‘ ); //設定mo檔案的編碼為UTF-8
textdomain($domain ); //設定gettext()函數從哪個域去找mo檔案
?>
<html>
<head>
<meta http-equiv="Content-Type" content= "text/html; charset=utf-8" />
<title>title</title>
</head>
<body bgcolor="#FFFFFF" text= "#000000" link= "#FF9966" vlink= "#FF9966" alink= "#FFCC99" >
<?=gettext (‘hello world.‘) ?>
</body>
</html>
產生.po檔案命令如下:
xgettext -d cn test.php --from-code=utf-8
test2.php 檔案內容如下:
<?
putenv (‘LANG=zh_CN‘ );
setlocale ( LC_ALL, ‘zh_CN‘ );
//定義要用的語言檔案名稱
$domain = ‘cn‘ ;
bindtextdomain ( $domain , dirname(__FILE__).‘/locale‘ ); //設定某個域的mo檔案路徑
bind_textdomain_codeset($domain , ‘UTF-8‘ ); //設定mo檔案的編碼為UTF-8
textdomain($domain ); //設定gettext()函數從哪個域去找mo檔案
?>
<html>
<head>
<meta http-equiv="Content-Type" content= "text/html; charset=utf-8" />
<title>title</title>
</head>
<body bgcolor="#FFFFFF" text= "#000000" link= "#FF9966" vlink= "#FF9966" alink= "#FFCC99" >
<?=gettext (‘woshishui‘) ?>
</body>
</html>
產生.po檔案命令如下: (注意,此時多加了一個命令參數 -j ,表明是以追加的形式添加語言套件的。)
xgettext -d cn test.php -j --from-code=utf-8
最終產生的 .po 檔案效果如下:
nplurals=2; plural=(n!=1);
最後把 產生的 “cn.po”、“cn.mo” 檔案拷貝到檔案夾 “locale\zh_CN\LC_MESSAGES\” 中。
最最後就是重啟下Apache啦。
附:wordpress之模板漢化(poedit的提示 及 .po .mo 批量產生技術)