迹忆博客
当前位置: 主页 > 学无止境 > 编程语言 > 文章

Thinkphp语言包实现原理与实践

发布时间: 2016-10-21 作者: 迹忆 浏览次数:

我们知道,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的语言包功能应该有一个比较清楚的认识了。

赞助
迹忆博客

除非注明转载,本站文章均为原创,欢迎转载,转载请以链接形式注明出处

本文地址: