Yii::t()需严格匹配配置的category和消息源路径,否则静默返回原字符串;源文本须与翻译文件中key完全一致;PHP文件适合开发,DB适合运营修改;sourceLanguage应为en-US,language动态设置;视图翻译依赖标准语言子目录结构。

Yii::t() 怎么用才真正触发翻译
不写对 category 和配置匹配的路径,Yii::t() 就只是原样输出字符串,不会报错也不会警告——这是最常被忽略的“静默失败”。它只查你配好的消息源,不自动 fallback 到其他 category 或语言文件。
-
Yii::t('backend', 'Login failed')要生效,必须在 i18n 配置里声明'backend'这个 category 对应的消息源(比如PhpMessageSource或DbMessageSource) - 如果没配
'backend',哪怕messages/zh-CN/backend.php文件存在,也完全不会读取 - 源语言默认是
en-US,但Yii::t()第二个参数的字符串本身**不是键**,而是直接作为源文本参与查找;所以英文原文必须和数据库或 PHP 文件里的 key 完全一致(含空格、标点)
PHP 文件 vs 数据库存储:选哪个更实际
开发阶段用 PHP 文件(PhpMessageSource)快、透明、易调试;上线后想支持运营人员后台改译文,才值得切到数据库(DbMessageSource)。强行一开始用 DB,反而增加部署复杂度和缓存调试成本。
- PHP 方式:文件路径必须严格匹配配置中的
fileMap,例如'backend'=>'backend.php'→ 实际路径是@common/messages/zh-CN/backend.php - DB 方式:先跑
yii migrate --migrationPath=@yii/i18n/migrations/建表;再在配置中把'class'换成'yii\i18n\DbMessageSource',并确保$sourceMessageTable和$messageTable名字与数据库一致 - DB 存储不自动同步新字符串——新增的
Yii::t()调用不会自动插入source_message表,得靠yii message命令扫描生成,否则查不到
i18n 配置里 sourceLanguage 和 language 的作用别搞反
sourceLanguage 是代码里写的原始语言(建议死守 en-US),language 是当前要显示给用户的目标语言。改 \Yii::$app->language 只影响后续的 Yii::t() 调用,不影响已渲染完的视图。
- 不要在配置里写
'sourceLanguage' => 'zh-CN',否则所有翻译都会变成“中文→中文”,失去意义 -
'language' => 'zh-CN'写在应用配置里,是全局默认;但用户切换语言时,应存进 cookie 或 session,再动态赋值给\Yii::$app->language - 浏览器语言检测(
$_SERVER['HTTP_ACCEPT_LANGUAGE'])只是参考,不能直接当language用——它可能返回zh-CN,zh;q=0.9,en;q=0.8,得解析出首选项再校验是否支持
视图文件整页翻译容易漏掉目录结构
整页翻译不是靠 Yii::t(),而是靠 Yii 自动加载对应语言子目录下的同名视图文件。路径错一级,就彻底不生效,且无任何提示。
- 想让
views/site/index.php显示中文版,必须把翻译后的内容放在views/site/zh-CN/index.php,不是views/zh-CN/site/index.php - 子目录名必须是标准语言标签,如
zh-CN、en-US、es-ES;写成zh或cn会找不到 - 该机制和消息翻译互不干扰:即使
views/site/zh-CN/index.php存在,里面写的纯文本仍可再用Yii::t()套一层,适合混合静态内容+动态文案的场景








