thinkphp 多语言配置详解

2022年开始,全球化是现在和未来的方向,多语言配置成为了必选功能。

thinkphp的多语言配置是很方便的,但是需要知道它的配置。

框架语言包: thinkphp\lang\语言包名.php
应用语言包: application\lang\语言包名.php
模块语言包: application\模块名称(admin|index|api等)\lang\语言包名.php
文件语言包: application\模块名称\lang\语言包名\类文件名称.php
动态语言包:Lang::load(APP_PATH . 'common\lang\zh-cn.php');
临时语言包:Lang::set('diy1','临时'); $value = Lang::get('diy1');

在app相关配置的conf目录内,打开config.php配置一下。

// 是否开启多语言
'lang_switch_on'         => true,
// 你想自定义多少语言
// Lang::setAllowLangList(['zh-cn','en-us',]);
'lang_list'		 => ['zh-cn','en-us'],
// 打开网站时默认语言
'default_lang'           => 'en-us',
// 自动侦测语言
'lang_auto_detect'       => true,
//'var_language'         => 'lang',        // 默认语言切换变量

看吧,很齐整吧。

接着,在app根目录(App或Application)创建lang目录,

里面创建两个语言文件,返回数组的形式

zh-cn.php 和 en-us.php 分别代码如下

<?php
return [
	"mylang"=>"中文",
	"test1"=>"我是测试",
];
<?php
return [
	"mylang"=>"English",
	"test1"=>"a test",
];

这就是全局语言文件的创建方法。

那怎么用呢,简单来说这样

echo lang('test1');

模版中网页

<div>{:lang('test1')}</div>

如何切换语言呢?

在app的controller目录里面,创建一个文件GetLang.php

<?php
namespace app\api\controller;
use think\Cookie;
use think\Lang;
use think\Request;
class GetLang{
	public function get_lang()
	{
		//Route::get('lang', 'api/getlang/get_lang'); //路由缩短
		$lang = null;
		if(input('?lang')){
			$lang = input('lang');
		}
		if($lang==null){
			if(Cookie::has('think_var')){
				$lang = Cookie::get('think_var');
			}else{
				$lang = 'zh-cn';
			}
		}
		$lang = Lang::range($lang);//设定当前语言
		Lang::load(APP_PATH.DS.'lang'.DS.$lang.EXT,$lang);//加载当前语言包
		Cookie::set('think_var',$lang);
		return $lang;
	}
	public function jslang()
	{
		//Route::get('jslang.js', 'api/getlang/jslang'); //路由缩短
		ob_end_clean();
		//js文件header
		//header('Content-Type: text/javascript;charset=UTF-8');
        header('Content-Type: application/x-javascript; charset=UTF-8');
		//获取当前语言类型
        $now_lang = self::get_lang();
		//加载全局语言文件array
		$langdata=require(APP_PATH.DS.'lang'.DS.$now_lang.EXT);
        $jslang=json_encode($langdata);
$jscode=<<<EOF
function changeLanguage(obj,defineUrl) {
  var url = defineUrl || document.URL;
  var re = re = /[?&]language=[^&]*/;
  url = url.replace(re, "");
  if (url.indexOf("?") > -1) {
    url += "&lang=" + obj.value;
  } else {
    url += "?lang=" + obj.value;
  }
  location.href = url;
}
var jslang=new Array();
var jslangdata='{$jslang}';
jslang=JSON.parse(jslangdata);
EOF;
        //导出js文件例子
        echo $jscode;
	}
}

这里我DIY了一个给js调用的语言包

<script src="api/getlang/jslang?lang=zh-cn"></script>

你在非模版文件的网页可以这样

jslang['test1']

来使用多语言。

比如:

<script src="/api/getlang/jslang?lang=zh-cn"></script>
<script>alert(jslang['test1']);</script>

当然你还可以在首页的controller中index.php, 加入类似这样的代码:

<?php
namespace app\api\controller;
use think\Controller;
class Index extends Controller
{
	public function index(){
		//下面这个代码合并到你的index.php中
		//****start****
		$lang = new \app\api\controller\GetLang;
		$now_lang = $lang->get_lang();//获取当前语言
		if($now_lang=='zh-cn'){
			$now_lang='en-us';
		}elseif($now_lang=='en-us'){
			$now_lang='zh-cn';
		}
		$this->assign('set_lang',$now_lang);
		//****end****
		
		return $this->fetch();
	}
}

模板文件 index.html

<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>{:lang('test1')}</title>
</head>
<body>
	<a href="?lang={$set_lang}">{:lang('mylang')}</a>
</body>
</html>

或者

<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>{:lang('test1')}</title>
</head>
<body>
<button onclick="changelang('zh-cn')">切中文</button>
<script>
function changelang(lang){
$.get("{:Url('api/getlang/get_lang')}",{lang:lang},function(res){
 location.reload();
});
}
</script>
</body>
</html>

切换的大概就是如上。

深入了解多语言的附加解说。

刚说的是全局的,当然也可以是模块级的局部设置

在controller同级目录创建lang文件夹

也一样创建名称分别为

zh-cn.php 和 en-us.php 两个文件,代码和全局相同方法。

这样这些语言文件仅作用于同级目录。

如果你要具体到每个模块,比如Testme.php,你也可以这样

在lang目录下创建两个目录分别为

zh-cn 和 en-us

在各自语言目录里面创建

testme.php

代码和上面所说也相同,但这语言包仅作用于Testme.php

完结。无图无真相啊,但我说的都是真的,动手实践吧。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注