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

來源:互聯網
上載者:User

標籤: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 批量產生技術) 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.