[心得] CakePHP 1.2 i18n 實做.

看板PHP作者 (想買台 swift ...)時間17年前 (2008/10/01 18:46), 編輯推噓2(201)
留言3則, 2人參與, 最新討論串1/1
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 原始碼.請自 行下載~... 附件在這.. http://phorum.study-area.org/index.php/topic,53864.0.html -- 我是上來領便當的... 逛 php 版, database 版只是順便而已... http://blog.darkhero.net 個人網誌 http://phorum.study-area.org/index.php/board,31.0.html 公司缺人 PHP 網站程式設計師(中初階學徒可), 熟 MVC 尤嘉~ 請發站內信給我... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.62.60

10/01 20:42, , 1F
我忘記去聽阿凱大大的台中場了 Orz
10/01 20:42, 1F

10/01 20:44, , 2F
等台南場邀我的時候你就可以到台南聽了 :)
10/01 20:44, 2F

10/01 20:50, , 3F
水喔 真的嗎 哈哈 太棒了
10/01 20:50, 3F
文章代碼(AID): #18urJkIq (PHP)
文章代碼(AID): #18urJkIq (PHP)