Thinkphp语言包实现原理与实践
我们知道,Thinkphp中支持语言包功能。ThinkPHP具备语言包定义、自动识别、动态定义语言参数的功能。
首先我们来说语言文件名称,该文件名称是受我们控制的,我们可以在底层配置文件convention.php中进行配置
'DEFAULT_LANG' => 'zh-cn', // 默认语言
还有,在框架底层有一个语言文件 ThinkPHP/Lang/zh-cn.php 这里使用的就是默认的文件名称。这个文件没有什么问题,在框架一开始运行的时候,该文件里的所有设置都被L()函数加载到内存中供后面程序使用。实现默认文件名和底层框架语言文件加载的代码定义在Think.class.php文件中。
L(include THINK_PATH.'Lang/'.strtolower(C('DEFAULT_LANG')).'.php'); //其所在位置在86行
框架底层语言文件没有什么问题。我们在ThinkPHP/Lang/zh-cn.php中设置如下内容
'MAIL_FORMAT_ERR' => '邮箱格式错误!'
然后我们使用L()函数来取出上面的内容
ehco L(‘MAIL_FORMAT_ERR’) //打印的结果就是 邮箱格式错误!
这没有什么问题。问题是很多情况下我们最好不要随便动框架底层的东西。对于不同的应用模块,我们想针对每个应用都建立其自己的语言包,那这样应该怎么来实现呢?
其实系统已经为我们提供了这些功能,只需要我们自己做一些设置。整个框架的语言包文件命名和位置有以下四种情况(我们文件名称以zh-cn为例)
- 底层框架语言包 ThinkPHP/Lang/zh-cn.php
- 应用公共语言包 Application/Common/Lang/zh-cn.php
- 模块语言包 Application/Home/Lang/zh-cn.php
- 控制器语言包 Application/Home/Lang/zh-cn/user.php
对于底层框架语言包在前面我们已经介绍过,很简单。所以下面我们主要来看剩下的三种情况。其实呢,剩下的三种情况可以归为一种情况。在我们什么都不做的情况下,剩下的三个位置的语言文件是不起作用的。下面我们来举例看一下
Application/Common/Lang/zh-cn.php 文件下有如下内容
return array(
'MAIL_FORMAT_ERR' => '邮箱格式错误!'
);
//使用L函数输出该结果
echo L('MAIL_FORMAT_ERR');
//结果为 MAIL_FORMAT_ERR
同样的情况,其它两种情况也是这个结果。
针对这种情况我们需要做如下的事情。
首先 开启语言检测行为
第一步我们就是开启语言检测行为。在应用的配置目录下面新建行为定义文件tags.php(Application/Common/Conf/tags.php),并且添加如下配置。
return array( // 添加下面一行定义即可
'app_begin' => array('Behavior\CheckLangBehavior'),
);
因为在ThinkPHP/Library/Behavior 行为目录下有CheckLangBehavior.class.php文件。该文件的功能就是来检测多语言行为的,所以我们首先要启用该文件。
Application/Common/Conf/tags.php 是应用行为定义文件,它是在系统执行开始就被加载的。
其加载代码在Think.class.php中有定义。
// 加载应用行为定义
if(is_file(CONF_PATH.'tags.php'))
// 允许应用增加开发模式配置定义
Hook::import(include CONF_PATH.'tags.php');
所以说,Application/Common/Conf/tags.php这个文件默认是不存在的,因此需要我们自己手动创建。
开启语言包功能
第一步我们启用了语言检测行为文件CheckLangBehavior.class.php。但是光有这些还是不够的,因此我们还需要开启语言包功能。
其实在CheckLangBehavior类中,实现检测的主要是 checkLanguage()方法。在该方法的开头就有这样的一段代码
// 不开启语言包功能,仅仅加载框架语言文件直接返回
if (!C('LANG_SWITCH_ON',null,false)){
return;
}
看到没,不开启语言包功能,即使我们启用了检测文件也没有用,直接就给我们返回空了。所以说,还需要我们开启语言包功能。很简单,只要在应用的公共配置文件中添加这一选项就可以了。当然,哪个应用需要开启语言包就在哪个应用的配置文件中添加也可以。(注意:我们尽量不要在框架底层配置文件(convention.php)中做修改)。
'LANG_SWITCH_ON' => true, // 开启语言包功能
这样checkLanguage()函数的后续代码就可以执行了。分别加载上面所说的四种情况的语言文件数据的代码如下:
// 读取框架语言包
$file = THINK_PATH.'Lang/'.LANG_SET.'.php';
if(LANG_SET != C('DEFAULT_LANG') && is_file($file))
L(include $file);
// 读取应用公共语言包
$file = LANG_PATH.LANG_SET.'.php';
if(is_file($file))
L(include $file);
// 读取模块语言包
$file = MODULE_PATH.'Lang/'.LANG_SET.'.php';
if(is_file($file))
L(include $file);
// 读取当前控制器语言包
$file = MODULE_PATH.'Lang/'.LANG_SET.'/'.strtolower(CONTROLLER_NAME).'.php';
if (is_file($file))
L(include $file);
经过以上的分析,相信大家多ThinkPHP的语言包功能应该有一个比较清楚的认识了。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341