thinkphp语言包实现原理与实践-ag捕鱼王app官网

thinkphp语言包实现原理与实践

作者:迹忆 最近更新:2022/12/11 浏览次数:

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

上一篇:

下一篇:php zookeeper你需要知道的细节

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

发布时间:2016/09/14 浏览次数:507 分类:php

在php中使用$_session来操作session,而thinkphp提供了session的封装函数session()。单单这一个函数就实现了session的增删改查的功能。

发布时间:2016/09/12 浏览次数:1406 分类:php

thinkphp其自动加载机制比较完善。对于自动加载机制主要使用的两个函数为__autoload()和spl_autoload_register()。下面简单的做一些介绍。

发布时间:2016/09/08 浏览次数:440 分类:php

我们来分析一下thinkphp中比较重要的一部分——分布式数据库的连接,对其底层的连接代码做一个分析。帮助大家更好的理解thinkphp对分布式数据库的操作。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便
网站地图