迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > PHP >

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

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

本文地址:

相关文章

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对分布式数据库的操作。

扫一扫阅读全部技术教程

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

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便