您的当前位置:首页>全部文章>文章详情

ThinkPHP6多应用多语言切换,最佳解决方案

发表于:2023-03-18 17:27:52浏览:2495次TAG: #ThinkPHP #PHP #多语言 #多语言切换

在当今国际化的世界中,越来越多的企业走向国际,面向多元化的内容建设,网站的发展也已经随着现在不同国家的需求,打造出来了很多的关于不同国家和地区的网站,多语言网站成为必备的宣传阵地,能使网站在不同的国家和地区进行打开查看。
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、创建对应多语言文件
图片alt
图片alt
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>