作者tkdmaf (皮皮快跑)
看板PHP
标题[心得] CodeIgniter 1.7.2语系档修正ini做法。
时间Thu Dec 2 22:09:56 2010
今天我在开另一个专案时,老是对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
1F:→ chrisQQ:感觉比较适合在有开 page cache、loading 较低的系统上~ 12/03 11:10
2F:→ chrisQQ:如果只是习惯 ini 的写法的话,在考量效能的情况下,我 12/03 11:11
3F:→ chrisQQ:觉得可以在写一只程式来将 ini 格式 complie 成 php array 12/03 11:11
4F:→ chrisQQ: 再 12/03 11:11
5F:→ tkdmaf:所以楼上没注意到这只程式就是载入到$lang吗? 12/03 11:17
6F:→ chrisQQ:所以载入一次到 $lang 里面之後 CI 会自动 cache 起来? 12/03 11:19
7F:→ mesak:绕一圈 读取? 12/03 14:10
8F:→ mesak: 原PO是 想用一个INI 把全部语言都设定出来吗? 12/03 14:14
9F:→ tkdmaf:一个ini读取全部的语系?如果我有那麽行就好了。 12/03 14:38
10F:→ tkdmaf:chrisQQ的讲法我了解了。正在想如何处理做一次读取。 12/03 14:39
11F:→ chrisQQ:如果没记错架构的话,这样变成读取一次页面就要重新parse 12/03 14:39
12F:→ chrisQQ:一次 lang 档… 我想CI直接用 array 也是想降低loading吧 12/03 14:39
13F:→ tkdmaf:另外这并不是什麽绕一圈读取。而是尽可能不要去改到程式端 12/03 14:40
14F:→ chrisQQ:想写成自动化的话,就是产生一个 lang 的 cache 档, 12/03 14:40
15F:→ chrisQQ:里面就是将你 parse 过後的 ini 写成 php array 格式 12/03 14:40
16F:→ chrisQQ:如果这个 cache 档不存在就重新从 ini parse 一份 12/03 14:42
17F:→ chrisQQ:lang load 的时候就去读这个 cache 过後的 php array 就好 12/03 14:42
18F:→ chrisQQ:不改 server 架构的话就是写在你的 chinese_tw.php 前头 12/03 14:43
19F:→ chrisQQ:if (file_exists('cached_lang.php')) {include xxx;} 12/03 14:44
20F:→ chrisQQ:else {regenerate_cache_lang();} 这样的方法吧@@ 12/03 14:45
22F:→ chrisQQ:疑,我错了,他是用 serialize ... 请忽略上篇 12/03 14:52
23F:→ tkdmaf:没关系!因为我没发现到有parse_ini_file 12/03 14:58
24F:→ tkdmaf:我做过效能评估了。用parse_ini_file的速度和array相当。 12/03 14:59
25F:→ tkdmaf:所以我待会会修正本文。 12/03 14:59
※ 编辑: tkdmaf 来自: 218.167.139.27 (12/03 15:06)
26F:→ chrisQQ:以下是推测:量大的话可能就不会这麽接近了,我猜ˇˇ 12/03 15:03
27F:→ chrisQQ:不过如果 loading 在可接受范围,就没什麽关系,反正 12/03 15:03
28F:→ chrisQQ:很多机器cpu大部分的时间都在 idle … 不差这几毫秒 12/03 15:03
29F:→ chrisQQ:题外话,如果只是要加 [base] 比较好分别的话,那考不考虑 12/03 15:07
30F:→ chrisQQ:$array = array( 12/03 15:07
31F:→ chrisQQ:/* base */ 12/03 15:07
32F:→ chrisQQ:'name' => '姓名', 12/03 15:07
33F:→ chrisQQ:/* other */ 12/03 15:07
34F:→ chrisQQ:'test' => '测试' 12/03 15:07
35F:→ chrisQQ:); 12/03 15:07
36F:→ chrisQQ:这样来写啊@@? 12/03 15:07
37F:→ tkdmaf:parse_ini_file会自动解析ini的[base]所以倒是无所谓。 12/03 15:13
38F:→ tkdmaf:我现在是在测两种方式一样都给10000笔语系时的时间差。 12/03 15:14
39F:→ tkdmaf:任何程式的效能量测还是跑过几次测试值比较实在。 12/03 15:16
40F:→ tkdmaf:测1万笔时却测出了出乎意料之外的结果。 12/03 15:30
41F:→ tkdmaf:使用INI的时间为0.13~0.2,但用$lang=array()则是0.23~0.33 12/03 15:30
42F:→ tkdmaf:反而是纯读INI的速度变快了。 12/03 15:31
43F:→ tkdmaf:使用未修正parse_ini_file前的则是0.75左右 12/03 15:32