作者 主題: [CakePHP]多國語系如何做?  (閱讀 4058 次)

0 會員 與 1 訪客 正在閱讀本文。

Darkhero

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3728
  • 性別: 男
    • 檢視個人資料
    • ㄚ凱隨手紀
[CakePHP]多國語系如何做?
« 於: 2008-10-01 18:40 »
這篇標題是詢問,但是我是來解答的!

CakePHP 1.2RC 中提供了很簡單輕鬆自在的 i18n , L10n 的解決方案,這裡簡單的介紹如何使用.

相信不少人會遇到客戶要求要做多國語系的東西,通常不外乎放資料庫,放檔案,或是採用標準的 gettext 的方案。
而 CakePHP 基本上也是遵循標準的方案,採用 gettext 的 mo, po 的機制去處理。

不過 CakePHP 不用載入 php-gettext 的模組就可以讀取解析,相信應該是直接用php程式碼解決了...

若是你有使用 cake.php 建立專案目錄的話,應該已經在從 skel 產生出來程式碼當中看到,目前大部分輸出已經都用 __('hello') 來輸出了,這樣就是標準的 gettext 的輸出方式。

首先你要知道的就是..你所有在程式碼中,不管是 View, 還是 Controller ,只要是輸出字串的地方,都要用 __('英文字串') 來輸出..
例如
代碼: [選擇]
__('Hello World!');
實際輸出的時候,CakePHP 要是找不到語系檔案之類的,就會自動輸出 __('Hello World') 中的英文索引.

接下來會問,那要如何製作翻譯檔案??

你可以參考一些文章像是...
http://www.xcopy.net.cn/read.php/229.htm

但是這時候你應該會問,po 檔還要自己寫,還要自己編輯喔..T_T...

這時候就要靠偉大的 cakephp 核心來幫忙了,若是你有用過 cake.php 的 bake 功能來建立過專案目錄...
那現在你就會很熟悉囉!..

cake.php 有提供一個 i18n 的 console 的功能.
實際執行的時候會像是這樣...
代碼: [選擇]
C:\AppServ>library\cake\console\cake.bat i18n -app demo


Welcome to CakePHP v1.2.0.7296 RC2 Console
---------------------------------------------------------------
App : demo
Path: C:/AppServ/demo
---------------------------------------------------------------
I18n Shell
---------------------------------------------------------------
[E]xtract POT file from sources
[I]nitialize i18n database table
[H]elp
[Q]uit
What would you like to do? (E/I/H/Q)

這裡你只要打入 E 接著會問你要輸出的 pot (po 來源檔) 在哪裡,也會問你要不要把所有的翻譯都放在同一個檔案中,以及要輸出的檔名是什麼(預設會叫做 default).
代碼: [選擇]
What is the full path you would like to output?
Example: c:\AppServ\demo\locale
[Q]uit
[c:\AppServ\demo\locale] >


Extracting...
---------------------------------------------------------------
Path: c:\AppServ\demo
Output Directory: c:\AppServ\demo\locale\
---------------------------------------------------------------
Would you like to merge all translations into one file? (y/n)
[y] > y
What should we name this file?
[default] >
Processing c:\AppServ\demo\app_controller.php...
Processing c:\AppServ\demo\app_helper.php...
Processing c:\AppServ\demo\app_model.php...
Processing c:\AppServ\demo\index.php...

等他跑完後,到你的專案目錄下的 locale 看一下..會出現一個(或多個).pot 檔案..
這個檔案用 poedit 開啟...(poedit 是一個po翻譯檔案編輯軟體).

然後把每一行一個個翻譯完成後放另存到對應的目錄中,像是 locale/eng/LC_MESSAGES (這是英文的目錄) locale/zh_TW/LC_MESSAGES ...

就算翻譯完成了!...

最後..要怎麼讓 cakephp 會自動去讀取翻譯檔案,還有如何讓使用者可以切換翻譯呢?

首先開啟你的 app_controller.php 在開頭加上..像是下面這樣..
代碼: [選擇]
uses ( 'L10n' );
class AppController extends Controller {
}

然後看一下你的網頁輸出..若是你的瀏覽器預設是中文,應該會自動去讀取 zh_TW 裡面的翻譯檔案輸出中文...
因為 CakePHP 會自動判斷 HTTP_ACCEPT_LANGUAGE 來決定要抓取的語系檔案.

那怎麼切換語系呢?

可以參考一下這個 function 當然你要放在哪個 action 裡面就自己決定吧...
代碼: [選擇]
public function changeLang($langname = 'en') {
$this->Session->write ( 'Config.language', $langname );
$this->redirect ( '/users/' );

}

這時候你只要在瀏覽器網址鍵入 http://xxx/users/changeLang/eng 就會切換到英文的語系檔案.
http://xxx/users/changeLang/zh_TW 就會切換到英文的語系檔案.

附件是從台中 CakePHP 的講課的範例程式直接製作的 i18n 實驗.
database schema 在 config/demo.sql . 本壓縮包不包含 cakephp 1.2rc 原始碼.請自行下載~...
« 上次編輯: 2008-10-01 18:42 由 Darkhero »
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
Blog: http://blog.darkhero.net/
秘密基地: http://www.darkhero.net/comic/
目前服務的網站: http://www.libook.com.tw/

Darkhero

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3728
  • 性別: 男
    • 檢視個人資料
    • ㄚ凱隨手紀
回覆: [CakePHP]多國語系如何做?
« 回覆 #1 於: 2008-10-01 18:52 »
補充.. cake.php i18n -app demo 是在做什麼的呢?

相信你我都沒有那個美國時間一個個 msgid 去編輯吧....
cake.php i18n 就是自動幫你 scan 所有的 controller, view 然後把要建立的語系資料都抓出來作成 pot 檔案....
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
Blog: http://blog.darkhero.net/
秘密基地: http://www.darkhero.net/comic/
目前服務的網站: http://www.libook.com.tw/