在看了wangking717的《php gettext方式實現UTF-8國際化多語言(i18n)》(原文:http://blog.csdn.net/wangking717/article/details/4739465#reply)後,自己操作時有少許出入,故記下補充內容。下面轉載原文,紅字為自己的補充內容。
近來隨著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函數包含,表示這些被包含的文字是需要用來翻譯的。
[php] view plain copy <? include_once('inc/setLan.php'); $domain = 'test'; 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] view plain copy <?php $lan = $_REQUEST['lan']; if($lan == 'zh_CN'){ putenv('LANG=zh_CN'); setlocale(LC_ALL, 'zh_CN'); //指定要用的語系,如:en_US、zh_CN、zh_TW }else if ($lan == 'zh_TW'){ putenv('LANG=zh_TW'); setlocale(LC_ALL, 'zh_TW'); //指定要用的語系,如:en_US、zh_CN、zh_TW }else if ($lan == 'en_US') { putenv('LANG=en_US'); setlocale(LC_ALL, 'en_US'); //指定要用的語系,如:en_US、zh_CN、zh_TW } ?>
步驟三:編輯好了test.php後,我們就應該對這個頁面產生對應的語言套件(test.po和test.mo檔案)
要產生語言套件,我們需要藉助兩款工具。
gettext工具下載地址:http://nchc.dl.sourceforge.net/sourceforge/gnuwin32/gettext-0.14.4.exe (用來產生po檔案,安裝好了以後,需要把”安裝路徑/bin”添加到系統內容變數path裡)
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
【補充1:】
1、在用Poedit修改po前記得先用其他文字編輯器把"Project-Id-Version: PACKAGE VERSION\n"裡的“PACKAGE VERSION”改成其他版本號碼,例如1.0;否則用Poedit編輯後儲存失敗;
用poedit工具開啟test.po,然後針對這些語言翻譯成我們對應的語言,儲存後poedit會自動生產mo檔案(unicode二進位碼)。
將po檔案和mo檔案放入項目根目錄
/locale
/language //這個建議改為en_US
/LC_MESSAGES
test.po
test.mo
如我們放入的是簡體中文則放入:
/locale
/zh_CN
/LC_MESSAGES
test.po
test.mo
如我們放入的是繁體中文則放入:
/locale
/zh_TW
/LC_MESSAGES
test.po
test.mo
【補充2:】
2、更新mo後要重啟伺服器,否則修改不起作用。
OK。一切都非常順利,我們開始訪問測試下多語言吧。訪問test.php?lan=zh_CN則顯示簡體,訪問test.php?lan=zh_TW顯示繁體。