thinkphp多语言站点需严格遵循语言包组织、自动识别与提前加载三者配合:lang/目录下按zh-cn等小写连字符命名子目录,配置lang_switch_on、lang_auto_detect及lang_list,并通过中间件在最早时机调用lang::detect()。

ThinkPHP 实现多语言站点,核心是「语言包组织 + 自动识别 + 提前加载」三者配合。浏览器语言自动识别不是开箱即用的魔法,它依赖明确的配置和执行时机——稍有错位,lang('hello') 就会原样返回 'hello',而不会报错。
语言包目录结构与命名规范
必须严格按 ThinkPHP 要求组织,否则静默失效:
- 根目录下建
lang/文件夹(不是config/lang.php或application/Lang/) - 每个语言建子目录,全小写、连字符分隔,如
lang/zh-cn/、lang/en-us/、lang/ja-jp/;zh_CN、ZH-CN均无效 - 子目录内放 PHP 文件,如
common.php(默认加载)或按分组命名,如user.php;文件内容必须以return ['key' => '翻译'];结尾 - Linux 服务器对大小写敏感,路径错一个字母,语言包就加载失败
开启自动识别与关键配置项
仅设 lang_switch_on => true 不够,需组合配置才能让浏览器 Accept-Language 生效:
- 在
config/app.php中启用:'lang_switch_on' => true - 显式开启探测:
'lang_auto_detect' => true - 限定合法语言白名单:
'lang_list' => 'zh-cn,en-us,ja-jp'(逗号分隔字符串或数组均可) - 默认语言建议设为:
'default_lang' => 'zh-cn' - 若用子域名(如
en.site.com),必须关闭 URL 参数干扰:'allow_url_lang' => false,否则?lang=zh-cn会覆盖域名判断
确保识别逻辑在最早时机执行
浏览器语言识别不是自动发生的后台服务,它必须在任何翻译调用前完成:
- 推荐方式:自定义中间件(如
app/middleware/Lang.php),在handle()开头就调用\think\Lang::detect() -
Lang::detect()默认只读Accept-Language请求头和lang=参数,不读 Session;如需结合用户偏好,应手动从 Session 取值后调用\think\Lang::setLang($lang) - 切记:不能在控制器构造函数或操作方法里才设置语言——那时系统可能已加载了默认语言的验证提示、错误信息等
- 中间件必须注册到全局栈(
app/middleware.php)或对应路由组,否则不执行
模板与代码中使用翻译
统一用 lang() 函数,它支持动态占位和复数,无需额外引入:
- 基础用法:
lang('welcome')→ 对应语言包中的'welcome' => '欢迎' - 带参数:
lang('hello_name', ['name' => '张三']),语言包中写'hello_name' => '你好,{name}!' - 复数控制:
lang('item|items', 1)返回左边,lang('item|items', 5)返回右边 - 模板中同样可用:
{:lang('welcome')}或{$Think.lang.welcome}(后者依赖模板变量自动注入) - 键名缺失时默认返回原字符串,上线前建议跑完整性检查,避免漏翻
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











