php gettext方式實現UTF-8國際化多語言--(補充)

來源:互聯網
上載者:User

在看了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顯示繁體。



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.