[心得] CodeIgniter 1.7.2語系檔修正ini做法。

看板PHP作者 (皮皮快跑)時間15年前 (2010/12/02 22:09), 編輯推噓0(0043)
留言43則, 3人參與, 最新討論串1/2 (看更多)
今天我在開另一個專案時,老是對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

12/03 11:10, , 1F
感覺比較適合在有開 page cache、loading 較低的系統上~
12/03 11:10, 1F

12/03 11:11, , 2F
如果只是習慣 ini 的寫法的話,在考量效能的情況下,我
12/03 11:11, 2F

12/03 11:11, , 3F
覺得可以在寫一隻程式來將 ini 格式 complie 成 php array
12/03 11:11, 3F

12/03 11:11, , 4F
12/03 11:11, 4F

12/03 11:17, , 5F
所以樓上沒注意到這隻程式就是載入到$lang嗎?
12/03 11:17, 5F

12/03 11:19, , 6F
所以載入一次到 $lang 裡面之後 CI 會自動 cache 起來?
12/03 11:19, 6F

12/03 14:10, , 7F
繞一圈 讀取?
12/03 14:10, 7F

12/03 14:14, , 8F
原PO是 想用一個INI 把全部語言都設定出來嗎?
12/03 14:14, 8F

12/03 14:38, , 9F
一個ini讀取全部的語系?如果我有那麼行就好了。
12/03 14:38, 9F

12/03 14:39, , 10F
chrisQQ的講法我了解了。正在想如何處理做一次讀取。
12/03 14:39, 10F

12/03 14:39, , 11F
如果沒記錯架構的話,這樣變成讀取一次頁面就要重新parse
12/03 14:39, 11F

12/03 14:39, , 12F
一次 lang 檔… 我想CI直接用 array 也是想降低loading吧
12/03 14:39, 12F

12/03 14:40, , 13F
另外這並不是什麼繞一圈讀取。而是儘可能不要去改到程式端
12/03 14:40, 13F

12/03 14:40, , 14F
想寫成自動化的話,就是產生一個 lang 的 cache 檔,
12/03 14:40, 14F

12/03 14:40, , 15F
裡面就是將你 parse 過後的 ini 寫成 php array 格式
12/03 14:40, 15F

12/03 14:42, , 16F
如果這個 cache 檔不存在就重新從 ini parse 一份
12/03 14:42, 16F

12/03 14:42, , 17F
lang load 的時候就去讀這個 cache 過後的 php array 就好
12/03 14:42, 17F

12/03 14:43, , 18F
不改 server 架構的話就是寫在你的 chinese_tw.php 前頭
12/03 14:43, 18F

12/03 14:44, , 19F
if (file_exists('cached_lang.php')) {include xxx;}
12/03 14:44, 19F

12/03 14:45, , 20F
else {regenerate_cache_lang();} 這樣的方法吧@@
12/03 14:45, 20F

12/03 14:46, , 21F
12/03 14:46, 21F

12/03 14:52, , 22F
疑,我錯了,他是用 serialize ... 請忽略上篇
12/03 14:52, 22F

12/03 14:58, , 23F
沒關係!因為我沒發現到有parse_ini_file
12/03 14:58, 23F

12/03 14:59, , 24F
我做過效能評估了。用parse_ini_file的速度和array相當。
12/03 14:59, 24F

12/03 14:59, , 25F
所以我待會會修正本文。
12/03 14:59, 25F
※ 編輯: tkdmaf 來自: 218.167.139.27 (12/03 15:06)

12/03 15:03, , 26F
以下是推測:量大的話可能就不會這麼接近了,我猜ˇˇ
12/03 15:03, 26F

12/03 15:03, , 27F
不過如果 loading 在可接受範圍,就沒什麼關係,反正
12/03 15:03, 27F

12/03 15:03, , 28F
很多機器cpu大部分的時間都在 idle … 不差這幾毫秒
12/03 15:03, 28F

12/03 15:07, , 29F
題外話,如果只是要加 [base] 比較好分別的話,那考不考慮
12/03 15:07, 29F

12/03 15:07, , 30F
$array = array(
12/03 15:07, 30F

12/03 15:07, , 31F
/* base */
12/03 15:07, 31F

12/03 15:07, , 32F
'name' => '姓名',
12/03 15:07, 32F

12/03 15:07, , 33F
/* other */
12/03 15:07, 33F

12/03 15:07, , 34F
'test' => '測試'
12/03 15:07, 34F

12/03 15:07, , 35F
);
12/03 15:07, 35F

12/03 15:07, , 36F
這樣來寫啊@@?
12/03 15:07, 36F

12/03 15:13, , 37F
parse_ini_file會自動解析ini的[base]所以倒是無所謂。
12/03 15:13, 37F

12/03 15:14, , 38F
我現在是在測兩種方式一樣都給10000筆語系時的時間差。
12/03 15:14, 38F

12/03 15:16, , 39F
任何程式的效能量測還是跑過幾次測試值比較實在。
12/03 15:16, 39F

12/03 15:30, , 40F
測1萬筆時卻測出了出乎意料之外的結果。
12/03 15:30, 40F

12/03 15:30, , 41F
使用INI的時間為0.13~0.2,但用$lang=array()則是0.23~0.33
12/03 15:30, 41F

12/03 15:31, , 42F
反而是純讀INI的速度變快了。
12/03 15:31, 42F

12/03 15:32, , 43F
使用未修正parse_ini_file前的則是0.75左右
12/03 15:32, 43F
文章代碼(AID): #1CzwYsSp (PHP)
文章代碼(AID): #1CzwYsSp (PHP)