必须启用lang_switch_on配置、在lang目录下按小写短横线命名建子目录并放PHP数组格式common.php、调用Lang::get()输出文案;ThinkPHP8原生支持无需扩展,而TP5需手动引入Lang类,TP6起整合进容器可门面调用。

要在ThinkPHP项目中实现多语言切换,比如让医院挂号系统同时支持中文、英文、日语界面,必须依赖框架对国际化的原生支持能力,而不是手动维护多套模板或硬编码翻译字符串。
ThinkPHP8的国际化能力升级
ThinkPHP8内置了完整的多语言支持机制,不再需要第三方扩展包即可完成语言包加载、变量替换、区域设置(locale)自动识别等关键动作。
第一步:在config/app.php中启用多语言支持,将'lang_switch_on' => true设为true;这一步不执行,后续所有语言切换逻辑都不会触发。
第二步:在lang/目录下按语言代码建立子目录,例如zh-cn/、en-us/、ja-jp/,每个目录内放置common.php等语言定义文件,键名统一用小写英文+下划线,如'login_success' => '登录成功'。
立即学习“PHP免费学习笔记(深入)”;
第三步:调用Lang::get('login_success')即可动态输出当前语言对应的文案;【注意:该函数只认lang目录下的PHP返回数组,不支持JSON或YAML格式】。
ThinkPHP5与ThinkPHP6的国际化差异
ThinkPHP5需手动引入think\lang\Lang类并注册语言包,而ThinkPHP6起已将语言管理整合进核心服务容器,Lang类可直接通过门面调用,无需use声明。
方法一:使用Lang::setLocale('ja-jp')强制切换当前请求语言,适用于用户手动点选国旗图标切换场景。
方法二:配置'lang_auto_detect' => true后,框架会自动读取HTTP头中的Accept-Language字段,匹配最接近的语言包;若浏览器发送的是zh-CN,zh;q=0.9,en-US;q=0.8,则优先加载zh-cn而非zh目录——【zh目录不会被自动 fallback,必须显式存在】。
方法三:在URL中携带?lang=fr-fr参数,配合路由规则自动注入语言标识,适合SEO友好型多语言站点。
动态语言包热加载与缓存控制
开发阶段可关闭语言缓存,避免修改lang/zh-cn/common.php后仍显示旧翻译。
将config/lang.php中的'cache_time' => 0设为0,每次请求都会重新加载PHP语言文件;上线后建议设为3600(1小时),减少IO开销。
语言包文件必须返回标准PHP数组,且不能含任何echo、print或HTML输出;一旦出现空白字符或BOM头,会导致require失败并抛出ParseError。
这一步操作起来很简单,直接把文件拖进去就行。



















