ThinkPHP6多应用多语言切换,最佳解决方案
发表于:2023-03-18 17:27:52浏览:2495次
在当今国际化的世界中,越来越多的企业走向国际,面向多元化的内容建设,网站的发展也已经随着现在不同国家的需求,打造出来了很多的关于不同国家和地区的网站,多语言网站成为必备的宣传阵地,能使网站在不同的国家和地区进行打开查看。
ThinkPHP6使用多语言其实很简单,下面就以创建 中英繁多语言切换为例。
简体中文 zh-cn
繁体中文 zh-hk
美式英语 en-us
1、开启中间件的自动侦测
配置中间件 middleware.php 在模块主目录下创建以index为例:app/index/middleware.php
return [
// 多语言加载
\think\middleware\LoadLangPack::class,
];
2、配置语言应用文件地址 app/index/config/lang.php
use think\facade\Env;
return [
'lang_switch_on' => true,
// 默认语言
'default_lang' => 'en-us',
// 允许的语言列表
'allow_lang_list' => ['zh-cn', 'en-us',"zh-hk"],
// 多语言自动侦测变量名
'detect_var' => 'lang',
// 是否使用Cookie记录
'use_cookie' => true,
// 多语言cookie变量
'cookie_var' => 'think_lang',
// 多语言header变量
'header_var' => 'think-lang',
// 扩展语言包
'extend_list' => [],
// Accept-Language转义为对应语言包名称
'accept_language' => [
'zh-hans-cn' => 'en-us',
],
// 是否支持语言分组
'allow_group' => true,
];
3、创建对应多语言文件
zh-cn.php
return [
'wel' => '欢迎',
'i18n' => '多语言'
];
zh-hk.php
return [
'wel' => '歡迎',
'i18n' => '多語言'
];
en-us.php
return [
'wel' => 'welcome',
'i18n' => 'internationalization'
];
4、页面中使用
index.html(测试多语言切换)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ThinkPHP6测试多语言切换</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
</head>
<body>
<div>
<select id="language" class="lan">
<option value="zh-cn">中文简体</option>
<option value="zh-hk">中文繁体</option>
<option value="en-us">English</option>
</select>
</div>
<div>{:lang('wel')}</div>
<div>{:lang('i18n')}</div>
</body>
<script src="/static/jquery-3.4.1.min.js"></script>
<script>
$("#language option[value=" + getCookie("lang") + "]").attr("selected", true);
//选择语言
$("#language").bind('change', function () {
var language = $(this).children('option:selected').val();
setCookie("lang", language, {
expires: 30,
path: ''
});
location.reload();
});
function setCookie(name, value, options) {
options = options || {};
if (value === null) {
value = '';
options.expires = -1;
}
var expires = '';
if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
var date;
if (typeof options.expires == 'number') {
date = new Date();
date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 30));
} else {
date = options.expires;
}
expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
}
var path = options.path ? '; path=' + options.path : '';
var domain = options.domain ? '; domain=' + options.domain : '';
var s = [cookie, expires, path, domain, secure].join('');
var secure = options.secure ? '; secure' : '';
var c = [name, '=', encodeURIComponent(value)].join('');
var cookie = [c, expires, path, domain, secure].join('')
document.cookie = cookie;
}
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
</script>
</html>