YII2 i18n配置ar-AR默认语言异常 空值显示印尼语提示问题
Yii2 配置ar-AR语言时空值提示加载印尼语翻译问题修复
问题根因
页面空值显示的(belum diset)是Yii2核心内置的未设置提示,对应翻译键为(not set),常规业务翻译正常但核心翻译项加载到印尼语,本质是核心消息源的语言匹配逻辑命中了印尼语语言包,常见触发场景如下:
- 语言配置被中途覆盖:
yii\i18n\Formatter类负责空值格式化输出,如果在控制器初始化、全局beforeAction事件、模块单独配置中,在页面渲染节点前动态将Yii::$app->language修改为id/id-ID,或是单独给formatter组件配置了印尼语语言参数,就会导致核心格式化类读取印尼语翻译,而业务代码里的翻译因为提前加载了阿拉伯语语言包所以表现正常。 - 翻译兜底规则配置错误:如果i18n组件中针对
yii类别(核心翻译类别)配置了印尼语作为优先兜底语言,当阿拉伯语语言包中缺失(not set)翻译项时,会直接加载印尼语的对应翻译。 - 缓存或核心文件缺失:runtime目录下的i18n缓存残留了之前测试印尼语场景的缓存数据,或是vendor目录下Yii2核心自带的
ar-AR语言包文件损坏、缺失,导致语言匹配时命中了存在对应翻译项的印尼语包。
修复步骤
- 第一步直接清空项目
runtime目录下所有缓存文件,先排除旧配置缓存残留的干扰,开发环境切过语言配置后没清缓存出这类问题的概率很高。 - 全局检索项目代码,排查所有修改
Yii::$app->language的逻辑,以及配置目录下formatter组件的独立配置,确认空值渲染节点的全局语言参数为ar-AR,不存在中途篡改未还原的问题。 - 检查i18n组件的translations配置,针对
yii*类别的消息源,不要将印尼语设置为高优先级兜底语言,兜底建议优先配置为en-US,参考配置如下:
'i18n' => [ 'translations' => [ 'yii*' => [ 'class' => 'yii\i18n\PhpMessageSource', 'basePath' => '@yii/messages', 'sourceLanguage' => 'en-US', // 错误配置:'fallback' => ['id'] 'fallback' => ['en-US'], ], ], ],
- 校验核心阿拉伯语语言包完整性:检查
vendor/yiisoft/yii2/messages/ar-AR/yii.php文件是否存在,文件内是否包含'(not set)' => 'غير محدد'的键值对。如果文件缺失或内容不全,可以直接在项目自身的messages/ar-AR/yii.php文件中补写该翻译项,项目内自定义翻译的优先级高于核心包的翻译内容。
内容的提问来源于stack exchange,提问作者Naeem Marzu
相关产品推荐
相关产品推荐

