thinkphp多语言包必须放在指定路径才生效:tp3.2放common/lang/下,tp5.x放application/lang/语言码/common.php,tp6.x默认app/lang/且需lang.php中声明;文件须返回纯数组、无bom、命名严格小写如zh-cn。

ThinkPHP 多语言包文件怎么放才生效
ThinkPHP 对语言包路径非常敏感,放错位置就完全不加载。不同版本规则差异大,尤其容易卡在 Lang 目录层级和命名上。
- ThinkPHP 3.2:语言包必须放在
Common/Lang/下,如Common/Lang/zh-cn.php、Common/Lang/en-us.php;模块级语言包可放Home/Lang/zh-cn.php,但需确保CheckLangBehavior被正确触发 - ThinkPHP 5.x:统一走
application/lang/,子目录按语言标识命名,如application/lang/zh-cn/common.php或application/lang/en-us/common.php;文件名不强制叫common.php,但控制器中调用lang('key')时默认加载该文件 - ThinkPHP 6.x:语言包路径由配置项
lang_path决定,默认是app/lang/,且支持多级目录(如app/lang/zh-cn/home.php),但必须在lang.php配置中声明启用对应语言组 - 所有版本都要求语言包返回纯数组,不能有输出、不能含 BOM,否则导致
include失败,模板里{$Think.lang.xxx}或lang('xxx')全部为空
为什么 lang('login') 总是返回空或原 key
这不是代码写错了,而是语言包没被加载,或者 key 根本没定义——框架不会报错,只会静默 fallback。
- 检查当前语言是否在
LANG_LIST配置里,比如写了'zh-cn,en-us',但请求参数是?l=zh,就会失败 - 确认
LANG_SWITCH_ON和LANG_AUTO_DETECT都为true,否则行为类CheckLangBehavior不执行,语言切换逻辑直接跳过 - ThinkPHP 5+ 中,
lang('login')默认只查common.php,如果你把翻译写在admin.php里,得显式写成lang('login', '', 'admin') - ThinkPHP 3.2 模板中用
{$Think.lang.login},但前提是控制器没手动覆盖$this->assign('Think', ...),否则Think.lang被冲掉
如何安全地做中英切换而不炸 Cookie 或 URL
手动设 Cookie 或拼 URL 参数是最常见翻车点,尤其在 ThinkPHP 3.2 和 5.x 混用项目里。
- 别直接写
cookie('think_var', 'en-us')后就跳转——TP 3.2 的CheckLangBehavior是在app_begin阶段读取的,必须确保 cookie 在该阶段前已存在;建议用重定向方式:先 setcookie,再redirect(Url::build()) - URL 切换推荐统一用
VAR_LANGUAGE => 'lang'(别用默认的l),避免和某些伪静态规则冲突,比如 Nginx 把/index.php?l=en-us误判为非法参数而拦截 - TP 5.1+ 支持
Lang::setLocale('en-us')强制切换,但仅对当次请求有效;若要持久化,仍需配合 Cookie 或 Session,且必须在Lang类初始化后调用(不能在构造函数里) - 切忌在 AJAX 请求里传
lang=xx却不带 Cookie,会导致前后端语言不一致——TP 默认优先读 Cookie,其次才是 GET 参数
百度翻译 API 接入时 curl 返回空或 400 错误
不是密钥错了,大概率是请求构造或编码没对上,百度开放平台对 q 和 from/to 校验极严。
-
q参数必须urlencode(),且不能重复 encode;如果原文含中文,urlencode('你好')得到%E4%BD%A0%E5%A5%BD,再套一层就废了 -
from和to必须用百度支持的代码,比如zh、en、auto,别用zh-cn或en-us,否则返回{"error_code":"52001","reason":"Request timeout"}这类误导性错误 - cURL 要显式设置
CURLOPT_SSL_VERIFYPEER => false(开发期),否则自签名证书或旧系统 OpenSSL 版本会直接 fail;生产环境应配好 CA 证书路径 - 百度接口返回的是
trans_result数组,不是扁平 JSON,解析时得写$data->trans_result[0]->dst,漏掉[0]就拿不到结果
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











