用TP5开发已经好久了,包括之前做多国语言的项目,但是在实际开发中却一直没有使用过thinkphp5自带的多语言处理。今天闲来无事给自己开发新项目中心血来潮用了一下,结果我这个老司机一不小心就入了坑。其实入坑并不可怕,最重要的是解决问题。因此本篇笔记也分享给其他使用thinkphp5多语言的朋友们。
开发项目首先要看开发文档!!!
在TP5的官方开发文档中是这样用的,第一步开启多语言支持,在项目配置文件config.php文件中配置以下两项内容。如果是单独某个模块开启的话,相关配置写在某个模块应用下面即可,这是TP的常用方法,不多说明。
- // 是否开启多语言
- 'lang_switch_on' => false,
- // 默认语言
- 'default_lang' => 'zh-cn',
第二步,我们可以任意在以下目录中创建我们的语言包文件。系统默认加载三个语言包
- 框架语言包: thinkphp\lang\当前语言.php
- 应用语言包: application\lang\当前语言.php
- 模块语言包: application\模块\lang\当前语言.php
完成上述两个步骤后你会发现其实多语言已经可以用了。
但是只能把所有的想要使用的信息以数组的形式放在lang目录下的zh-cn.php文件中,写成其他形式的语言包是无法使用的。比如波波建了一个中文的语言包目录,想着一个控制器对应一个语言包,方便后期管理,不然都写在一个文件中的话,随着项目的日臻完善,语言包文件会非常大,不利于加载,更不利于维护。
我们看到官方开发文档中说明,如果语言包不放在这三个位置的时候,需要用Lang::load('文件路径')加载的。因此波波采用了一个折中的办法,用户访问一个控制器,就加载这个控制器对应的语言包。
文件夹目录结构如上图所示,我们需要建立一个BasicController.php文件。添加如下代码。
- /**
- * 基础接口SDK
- * @param Request|null $request
- */
- public function __construct(Request $request = null)
- {
- define('MODULE_NAME',request()->module());
- define('CONTROLLER_NAME',request()->controller());
- define('ACTION_NAME',request()->action());
- //多语言处理
- $langType = emptyempty($_COOKIE['think_var'])?Config::get('default_lang'):$_COOKIE['think_var'];
- Lang::load(APP_PATH . 'api/lang/'. $langType .'/'.strtolower( CONTROLLER_NAME ) .'.php' );
- }
写业务逻辑的时候继承下这个控制器就可以了。
关于thinkPHP5多语言的使用如果您有其他心得,也欢迎留言分享。官方文档:https://www.kancloud.cn/manual/thinkphp5/118132