本帖最后由 xingch 于 2012-4-6 12:01 编辑
首先大吼一声:我又回来了{:soso_e113:}
做PHP的多语言系统,我一直使用的是单独的语言文件中用数组来实现。使用CI后发现也是这种设计,这样使用CI也用了2年了。其中对CI中语言文件的加载也做了些修改。
最近下载PHPMYADMIN新版的时候发现它里面的语言文件是.MO格式,百度下了解是符合L18n标准的多语言软件的实现方式,对此感觉非常不错。可以使用工具从源码中自动抽取需要翻译的标识。进一步把程序员从语言翻译中脱离出来,结构也简单很多。 下面分别对CI原有语言系统修改和标准化语言方式我自己的使用方法写下,也是抛砖引玉。 一、 原有的框架中是用数组形式存储在语言文件中调用。在每次使用语言文件的时候都要加载一次,本人比较喜欢自动加载。于是最次做了些修改。如下:(CI版本1.7.2) (1)扩展核心类CI_Controller PHP复制代码 class DK_Controller extends Controller {
/**
* __construct
*/
function DK_Controller ()
{
parent ::Controller();
$this->load_lng();
}
Function load_lng ()
{
//我把语言分为两类:1、供系统多处调用的语言文件(如系统名、版权等);2、单独模块语言文件(以类文单位)
$this->CI =& get_instance ();
$RTR =& load_class ('Router');
//加载整个系统公共语言
if ( ! in_array('system_lang'.EXT , $this->CI->lang->is_loaded, TRUE))
{
$lang_system = $this->CI->lang->load('system');
$this->lang_system = $lang_system;
}
//加载各个模块操作的语言,以类为单位,语言文件的文件名方式为:类名_lang.php
$className = strtolower($RTR->fetch_class());
if ( ! in_array($className.'_lang'.EXT , $this->CI->lang->is_loaded, TRUE))
{
$lang_page = $this->CI->lang->load($RTR->fetch_directory().$className);
$this->lang_page = $lang_page[$className];
}
}
} 复制代码 (2)语言文件格式:类名_lang.php PHP复制代码 class class_name extends DK_Controller {
function class_name ()
{
parent ::DK_Controller();
$lang_system = $this->lang_system;
$lang_page = $this->lang_page;
}[/align ][align =left ]Function action1 (){
$data = array(
'lang_system' => $this->lang_system,
'lang_page' => $this->lang_page,
);
//语言数组传入视图文件
$this->load->view('视图文件', $data);
}
} 复制代码二、 符合L18n标准的.MO语言文件模式,使用到的语言提取和编辑工具poEdit。 PHP里面调用.MO文件的函数为“gettext()”,也可以写成“_()”,实际为前者的宏定义。默认此扩展是没有开启的,所以要在PHP.INI中把该扩展开启。(我的WIN开发环境下“extension=php_gettext.dll“)。 1 语言文件存放目录 /application -----/locale ---------/zh_CN ------------system.mo ---------/ en_GB ------------system.mo 2 扩展核心控制类 扩展核心类CI_Controller PHP复制代码 class DK_Controller extends Controller {
/**
* __construct
*/
function DK_Controller ()
{
parent ::Controller();
$this->load_lng();//加载语言函数
}[/color ][/align ][align =left ][color =#000000]function load_lng()
{
define("ACKAGE", "d_system");//定义项目名称
putenv("LANG = zh_CN");//定义服务器变量
setlocale(LC_ALL , "zh_CN");//设置语言
bindtextdomain(PACKAGE , APPPATH .'locale');//设置语言包位置
bind_textdomain_codeset(PACKAGE , 'UTF-8');//设置编码,不设置会乱码
textdomain(PACKAGE );//绑定
}
} 复制代码 3 在控制类和视图中如果要输出语言的地方使用:_(‘this is a language!’);
4 使用POEDIT 中新建消息目录文档:
搜索源代码获取语言标记进行翻译不同语言,保存.MO文件存放在相应语言的文件夹下,供系统调用。
Poedit工具的使用和.MO文件的说明,可以上百度查下具体的解释说明。各位大虾有什么好的意见,希望多多指教。
|