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
完结。无图无真相啊,但我说的都是真的,动手实践吧。