透過Gettext for PHP快速做出多國語系程式

Gettext是由GNU所推出的一個… 嗯,我也不知道該怎形容他,類似規範吧,可是也算是一組library,反正就是可以讓你很方便的幫你的程式作多國語系的東西啦~ 而這篇文章要講的就是如何把Gettext用在PHP上面,開發多國語系的程式、網站

GNU Gettext專案網址:http://www.gnu.org/s/gettext/

在以前我們如果要幫程式作多國語系,不外乎以下幾種方式,其一就是自己開發讀取語系檔的函式,去讀取外部的語系檔,然後修改程式內部的字串,像是Imgburn就是如此,再來還有一種方式就是透過反編譯的技術去修改主程式,方法一的缺點是要自己去寫函式來讀取語系檔,方法二的缺點則是反編譯其實有點麻煩… 而且有版權的問題

在這裡要介紹的Gettext他原理跟方法一類似,是透過讀取語系檔來做多國語系的,但是他的好處是他已經幫你寫好函式啦~ 而且他的語系檔格式是很流行的,所以當網友想幫你做多國語系時,就不用再特別去研究你的語系檔格式

Gettext目前在很多語言上都可以使用,例如C++、Python、Java、PHP… ,而且很多的程式都支援他,例如知名的CMS系統:WordPress就是使用Gettext做到多國語系的,只是他的作法跟本文不太一樣,WordPress是使用他們自己開發的函式來讀取Gettext的語系檔

P.S.Gettext的語系檔是.po與.mo檔~ .po是給翻譯人員看的,.mo則是給程式看的,並且要製作語系檔的話可以使用poedit這套程式,這部份等之後會在做教學

以下我就簡單教大家如何在PHP裡面使用Gettext吧

Gettext for PHP

1.先開啟你的PHP設定檔(php.ini),然後把gettext啟動

原本:【;extension=php_gettext.dll】改成【extension=php_gettext.dll】

P.S.把最前面的分號拿掉

2.在你的伺服器裡面建立一個資料夾取名:gettext_demo,並且在該資料夾中建立一個檔案(index.php),輸入下列內容:

這裡簡單解釋上面的語法

  • textdomain()這個是設定你的專案名稱,這可以隨便設定,只是之後語系檔的名稱要跟這裡設定一樣
  • bindtextdomain()是設定語系檔的存放位置,像我上面的寫法代表語系檔會存在Languages底下
  • putenv、setlocale這兩個函式是設定「要顯示的語系」,比如我原本是用中文開發程式,然後我現在要顯示英文,則設定en_US,如果要顯示簡體則是zh_CN,格式就照範例就可以了
  • gettext()的部份則是要作多國語系的文字,gettext函式會自動去檢查語系檔,如果語系檔裡面有文字跟gettext內帶的參數一樣的字串,則會用語系檔的字串來顯示,如果語系檔裡沒有,則直接顯示gettext內的參數,以本例來講:函式會去檢查語系檔裡面是否含有「測試gettext」跟「逐風者」兩個字串的對應文字,如果語系檔裡面有對應的文字,那gettest這個函式就會顯示語系檔內的文字,否則就直接顯示「測試gettext」跟「逐風者」
  • 至於_()則是gettext()的代稱,這是為了方便開發者而設計的,直接用底線來代表gettext,這樣寫程式時可以少打很多字

3.再來請於gettext_demo資料夾底下建立一個Language資料夾,然後再Language底下建立en_US資料夾,最後再en_US底下建立LC_MESSAGES資料夾

整個路徑看起來就是:gettext_demo/Language/en_US/LC_MESSAGES

4.將語系檔放到./gettext_demo/Language/en_US/LC_MESSAGES底下

語系檔可以使用Poedit製作,或是到專案檔裡面找我做好的簡易語系檔

以本文來講是用英文的語系檔做介紹,所以放到en_US底下,可是如果改天你要做簡體的,那就改成zh_CN,也就是路徑會變成:gettext_demo/Language/zh_CN/LC_MESSAGES

還有「Language」的部份是看你bindtextdomain()的設定來決定這個資料夾,例如Languages($project_name,’lan’);,則你的語系檔應該要放在lan資料夾而非Language,這些都是會變得請自行變通

最後就是我之前一直沒處理好的地方,他的語系檔的命名原則是使用你testdomain()所設定的那個名字,例如:textdomain(‘xxx’),則語系檔要命名成xxx.mo以及xxx.po,而且不管是哪個語言的語系檔都是這樣子命名! 之前被WordPress影響,所以一直以為命名方法是zh_TW.po、zh_TW.mo這樣子… 後來被網友提醒才發現原來不是XD

專案檔下載:Google4SharedBox.netDropbox

P.S.你可以直接把專案檔裝到你的伺服器上面測試看看,記得要開始PHP的設定才能使用

2 thoughts on “透過Gettext for PHP快速做出多國語系程式”

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料