gettext在开发环境与生产环境中的行为差异问题求助
gettext翻译数组生效差异问题分析及解决
核心原因
问题出在gettext初始化时机与数组赋值的先后顺序,结合Windows和Linux的gettext机制差异导致:
- 开发环境(XAMPP/Windows):你大概率先完成了gettext的locale配置(
setlocale、bindtextdomain、textdomain等调用),再定义$names数组。此时调用_('New')时,gettext已经加载对应翻译文件,数组里存的是翻译后的结果,所以函数直接返回$names[$string]就能生效。 - 生产环境(Linux):
$names数组的定义大概率在gettext初始化代码之前。这时第一次调用_('New')时,gettext还未完成配置,只会返回原字符串"New";等到函数执行时,gettext已经初始化完成,再次调用_($names[$string])才会触发正确翻译。
全局变量本身不是问题,系统/PHP版本差异是表象,本质是翻译函数执行时的上下文环境是否已完成gettext初始化。
解决方案
调整代码执行顺序:
将$names数组的赋值代码,移到所有gettext初始化代码之后。示例:// 先完成gettext初始化 setlocale(LC_ALL, 'zh_CN.utf8'); bindtextdomain('myapp', './locale'); textdomain('myapp'); // 再定义翻译数组 $names = array(); $names['new'] = _('New'); // ...其他赋值 function name($string) { global $names; return $names[$string]; }这样数组里存的就是已翻译后的内容,无需二次调用
_()。保留二次调用的写法(更灵活):
如果调整顺序有困难,或者需要支持动态切换locale的场景,保留生产环境的写法更稳妥。因为数组存储的是原字符串,每次调用函数时都会基于当前生效的gettext环境翻译,能适应后续locale变更:function name($string) { global $names; return _($names[$string]); }
内容的提问来源于stack exchange,提问作者Ramblin Wreck
相关产品推荐
相关产品推荐

