看板 PHP 關於我們 聯絡資訊
今天我在開另一個專案時,老是對ci的 $lang['NAME'] = '姓名'; $lang['ADDRESS'] = '地址'; 或是 $lang = array( 'NAME' => '姓名', 'ADDRESS' => '地址' ); 這種寫法覺得不是那麼的方便。 尤其是在同時要搞二、三個語系檔的情況下。 (通常習慣也是會讓他分屬不同的資料夾。) 總是覺得說換成 [base] NAME = 姓名 ADDRESS = 地址 這樣的INI寫法會讓人覺得方便性高吧! 所以就索性把lang檔給他整個改寫了。 流程如下: 1.先在ci的根目錄下建一個放ini的目錄,我是設定叫language。 2.在application的language內建立你的語系目錄和lang檔。 (例如chinese_tw目錄和chinese_tw_lang.php) 3.修改chinese_tw_lang.php(或其他語系)的內容如下: ------未經chris_QQ提醒前的做法------(效能評估:0.02~0.05秒間) <?php $lang_ini = file('language/chinese_tw.ini'); foreach($lang_ini as $value){ $value_arr = trim(str_replace(" ","",$value)); if(empty($value_arr) || substr($value_arr,0,1) == '[' || !strpos($value_arr,'=')) continue; list($source,$target) = explode("=",$value_arr); $lang[$source] = $target; } ?> ------修正後------(效能評估:0.001~0.003左右) <?php $lang = parse_ini_file('language/chinese_tw.ini'); ?> ($lang = array()的效能評估約莫也是在0.001~0.003,略低於上述修正後) 以上單位:秒 4.在你的language中建立ini檔(這裡檔名叫chinese_tw.ini) 5.ini的格式就是: [base] <==你的分類說明 NAME = 姓名 ADDRESS = 地址 [button] CONFIRM = 確認送出 RESET = 清除 6.記得要把.htaccess中加上language目錄權限,否則會無法讀取。 7.到你的程式用view呼叫樣板測試<?=lang("NAME")?>吧!別忘了config/autoload.php 中的$autoload['helper']要加上language。 這樣以後就可以輕輕鬆鬆用ini檔來設定語系了。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.104.130.243
chrisQQ:感覺比較適合在有開 page cache、loading 較低的系統上~ 12/03 11:10
chrisQQ:如果只是習慣 ini 的寫法的話,在考量效能的情況下,我 12/03 11:11
chrisQQ:覺得可以在寫一隻程式來將 ini 格式 complie 成 php array 12/03 11:11
chrisQQ: 再 12/03 11:11
tkdmaf:所以樓上沒注意到這隻程式就是載入到$lang嗎? 12/03 11:17
chrisQQ:所以載入一次到 $lang 裡面之後 CI 會自動 cache 起來? 12/03 11:19
mesak:繞一圈 讀取? 12/03 14:10
mesak: 原PO是 想用一個INI 把全部語言都設定出來嗎? 12/03 14:14
tkdmaf:一個ini讀取全部的語系?如果我有那麼行就好了。 12/03 14:38
tkdmaf:chrisQQ的講法我了解了。正在想如何處理做一次讀取。 12/03 14:39
chrisQQ:如果沒記錯架構的話,這樣變成讀取一次頁面就要重新parse 12/03 14:39
chrisQQ:一次 lang 檔… 我想CI直接用 array 也是想降低loading吧 12/03 14:39
tkdmaf:另外這並不是什麼繞一圈讀取。而是儘可能不要去改到程式端 12/03 14:40
chrisQQ:想寫成自動化的話,就是產生一個 lang 的 cache 檔, 12/03 14:40
chrisQQ:裡面就是將你 parse 過後的 ini 寫成 php array 格式 12/03 14:40
chrisQQ:如果這個 cache 檔不存在就重新從 ini parse 一份 12/03 14:42
chrisQQ:lang load 的時候就去讀這個 cache 過後的 php array 就好 12/03 14:42
chrisQQ:不改 server 架構的話就是寫在你的 chinese_tw.php 前頭 12/03 14:43
chrisQQ:if (file_exists('cached_lang.php')) {include xxx;} 12/03 14:44
chrisQQ:else {regenerate_cache_lang();} 這樣的方法吧@@ 12/03 14:45
chrisQQ:辜到的第一篇 http://blog.twix.idv.tw/myblog/view/189 12/03 14:46
chrisQQ:疑,我錯了,他是用 serialize ... 請忽略上篇 12/03 14:52
tkdmaf:沒關係!因為我沒發現到有parse_ini_file 12/03 14:58
tkdmaf:我做過效能評估了。用parse_ini_file的速度和array相當。 12/03 14:59
tkdmaf:所以我待會會修正本文。 12/03 14:59
※ 編輯: tkdmaf 來自: 218.167.139.27 (12/03 15:06)
chrisQQ:以下是推測:量大的話可能就不會這麼接近了,我猜ˇˇ 12/03 15:03
chrisQQ:不過如果 loading 在可接受範圍,就沒什麼關係,反正 12/03 15:03
chrisQQ:很多機器cpu大部分的時間都在 idle … 不差這幾毫秒 12/03 15:03
chrisQQ:題外話,如果只是要加 [base] 比較好分別的話,那考不考慮 12/03 15:07
chrisQQ:$array = array( 12/03 15:07
chrisQQ:/* base */ 12/03 15:07
chrisQQ:'name' => '姓名', 12/03 15:07
chrisQQ:/* other */ 12/03 15:07
chrisQQ:'test' => '測試' 12/03 15:07
chrisQQ:); 12/03 15:07
chrisQQ:這樣來寫啊@@? 12/03 15:07
tkdmaf:parse_ini_file會自動解析ini的[base]所以倒是無所謂。 12/03 15:13
tkdmaf:我現在是在測兩種方式一樣都給10000筆語系時的時間差。 12/03 15:14
tkdmaf:任何程式的效能量測還是跑過幾次測試值比較實在。 12/03 15:16
tkdmaf:測1萬筆時卻測出了出乎意料之外的結果。 12/03 15:30
tkdmaf:使用INI的時間為0.13~0.2,但用$lang=array()則是0.23~0.33 12/03 15:30
tkdmaf:反而是純讀INI的速度變快了。 12/03 15:31
tkdmaf:使用未修正parse_ini_file前的則是0.75左右 12/03 15:32