lang::get()返回空字符串主因是语言包未加载,90%系路径、命名或加载时机错误:必须严格使用lang/zh-cn.php格式,仅扫描app/lang/目录,文件需纯php数组无bom,多级键须嵌套数组,api中需显式调用lang::setlocale()且早于lang::get()。

Lang::get() 返回空字符串,90% 是语言包根本没加载进来,不是配置写错了,而是路径、命名或加载时机出了问题。
lang/ 目录结构和文件命名必须严格匹配 ThinkPHP 约定
ThinkPHP 只识别 lang/zh-cn.php、lang/en-us.php 这种短横线格式,zh_CN、zhcn、zh-CN 全部无效。多语言包不能放在子模块目录(如 app/index/lang/)里,除非你手动 Lang::load();默认只扫描应用根目录下的 lang/。
- 正确路径:
app/lang/zh-cn.php、app/lang/en-us.php - 文件内必须是纯 PHP 数组返回:
return ['user_login' => '请登录'];,不能有 BOM 头、不能有 echo 或 HTML 输出 - 如果用了多级键如
lang('user.info.name'),语言包里必须是嵌套数组:return ['user' => ['info' => ['name' => '用户名']]];,平铺写法'user.info.name' => '用户名'不生效
API 接口里切换语言不能依赖 URL 参数自动识别
ThinkPHP 的 LoadLangPack 中间件默认只在 Web 请求生命周期中运行,而 API(尤其 JSON 接口)常被 Postman、小程序、App 直接调用,?lang=en-us 很可能被忽略——因为中间件执行前,Lang 已完成初始化。
- 必须在控制器入口或中间件中显式调用
Lang::setLocale($lang),且确保该调用发生在Lang::get()之前 - 推荐从 Header 读取:
$lang = request()->header('accept-language', 'zh-cn');,再做简单映射(如zh-CN→zh-cn) - 或统一约定请求体带字段:
{"lang": "en-us"},解析后设为Lang::setLocale($input['lang'] ?? 'zh-cn') - 切忌在模型或 service 层调用
Lang::get()前未确认 locale 已设置——此时永远回退到default_lang
JSON 响应中的多语言字段要避免硬编码分支
API 返回的错误消息、提示文案等,不能靠 if ($lang === 'en') { return ['msg' => 'Failed']; } 这种写法,既难维护又易漏覆盖。
- 统一用
lang('api.auth_failed'),把所有提示文本收归语言包管理 - 若需动态内容(如用户昵称 + 提示),用占位符:
'welcome_user' => '欢迎, :name!',调用时lang('welcome_user', ['name' => $user->name]) - 数据库字段多语言(如 title_zh/title_en)不建议在 API 层 if-else 拼字段名,可封装成模型 accessor:
public function getTitleAttr() { return $this->getData('title_' . Lang::getLangSet()); },但注意:where 查询仍需手动写title_zh,accessor 不参与 SQL 构建
第三方扩展的语言包不会自动加载
vendor 里的插件(比如支付 SDK、短信组件)自带的 lang/ 目录,ThinkPHP 默认完全无视。你看到的空字符串,很可能来自某个扩展内部调用的 Lang::get(),但它根本没加载自己的语言文件。
- 必须手动加载:
Lang::load(VENDOR_PATH . 'topthink/think-sms/lang/zh-cn.php'); - 加载时机很重要:不能在 config 阶段(
Lang类还没初始化),建议放在中间件或 BaseController 的initialize()方法里 - 如果扩展本身不提供语言包,就别指望它支持多语言——要么 fork 修改,要么在你自己的响应层兜底翻译
最常被忽略的一点:语言包加载是单次行为,Lang::setLocale() 只切换当前 locale,不重新加载对应语言包。如果某语言包文件在运行时被修改过,需要清空 runtime/cache/ 下的 lang 缓存,否则旧内容一直生效。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











