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的语言包功能应该有一个比较清楚的认识了。
相关文章
ThinkPHP中session函数详解
发布时间:2016/09/14 浏览次数:460 分类:PHP
-
在PHP中使用$_SESSION来操作session,而ThinkPHP提供了session的封装函数session()。单单这一个函数就实现了session的增删改查的功能。
ThinkPHP自动加载机制代码分析
发布时间:2016/09/12 浏览次数:1386 分类:PHP
-
ThinkPHP其自动加载机制比较完善。对于自动加载机制主要使用的两个函数为__autoload()和spl_autoload_register()。下面简单的做一些介绍。
Thinkphp分布式数据库连接代码分析
发布时间:2016/09/08 浏览次数:408 分类:PHP
-
我们来分析一下Thinkphp中比较重要的一部分——分布式数据库的连接,对其底层的连接代码做一个分析。帮助大家更好的理解thinkphp对分布式数据库的操作。