根本原因是语言包未加载或语言标识不匹配;需检查lang::getlangset()返回值、路径是否为lang/zh-cn.php、用lang::range()确认加载状态,且lang::get()必须在语言环境就绪后调用。

Lang::get()返回原键名,不是翻译值
根本原因是语言包没加载成功,或当前语言环境不匹配。Lang::get('hello')不会报错,而是静默返回'hello',线上很难察觉。
- 检查
Lang::getLangSet()返回值是否为你预期的语言标识(如zh-cn),不是空字符串或en-us - 确认语言包路径为
lang/zh-cn.php(注意是短横线、小写、无下划线),不是zh_CN.php或ZH-CN.php - 用
Lang::range()查看当前已加载的所有键——如果返回空数组,说明语言包根本没进加载队列 - 别在控制器构造函数里调
Lang::get(),此时Lang中间件还没执行,语言环境仍是初始状态
Lang::get()在命令行下始终返回空或英文
CLI 环境没有$_SERVER['HTTP_ACCEPT_LANGUAGE'],也不触发 URL 参数解析,默认 locale 是空字符串,导致lang/目录下找不到/.php文件。
- 必须显式调用
Lang::setLang('zh-cn'),不能依赖自动探测 - 手动加载语言包:
Lang::load(app_path() . 'lang/zh-cn/common.php') - 若使用验证器静态方法
Validate::check(),需提前Lang::load(),否则validate.php里的提示不会翻译 - 注意:
Lang::setLang()只影响后续调用,设晚了(比如在Validate::check()之后)就无效
多语言切换后Lang::get()仍不更新
切换语言不是“改个变量就全局生效”,它只对后续的Lang::get()起作用;已加载的语言包不会自动重载,更不会刷新已缓存的翻译结果。
-
Lang::setLang('en-us')必须在请求最开始执行,推荐放在全局中间件handle()的第一行 - 不要在模板中用
{:lang('xxx')}后再切语言——模板编译后语言已固定,不会回溯 - 如果用了
Lang::load()手动加载过某语言包,再切语言时不会自动卸载,得自己控制加载时机 - 注意缓存:模板引擎可能缓存了带翻译的 HTML,清空
runtime/view/再试
嵌套键名(如user.name)无法翻译
ThinkPHP 的Lang::get()支持点号分隔的嵌套访问,但前提是语言包结构必须严格匹配,且不能有 BOM 头。
- 语言包里必须写成
return ['user' => ['name' => '用户名']],不能写成return ['user.name' => '用户名'] - 文件保存为 UTF-8 无 BOM 格式,BOM 会导致
require失败,语言包静默跳过 - 验证器字段级提示如
'user_email.email' => '邮箱格式不对',必须和规则字段名完全一致,大小写敏感 - 调试时用
var_dump(Lang::range())直接看结构,比猜键名快得多
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











