gettext 特定字符串不被翻译
gettext Specific strings don't get translated
我在 PHP 驱动的网站上安装了一个有效的 gettext(PHP/5.3 运行 作为 Windows 上的 Apache 模块)。问题是 某些任意字符串没有被翻译 。少数文本(不到 1% 且始终相同)保留原始语言。疯狂的一点是细节:
确实翻译了周围的字符串:
Line 95: <th><?php echo _('Address'); ?></th> <-- Translated -->
Line 96: <th><?php echo _('Number'); ?></th> <-- Not translated!!! -->
Line 97: <th><?php echo _('City'); ?></th> <-- Translated -->
- 它在另一个 PHP/5.3 具有不同 Windows 版本和体系结构的服务器中 100% 可重现:我在相同的字符串中遇到问题。
- 如果我更改源文本、翻译或两者,问题仍然存在于完全相同的位置。
- 受影响的字符串相当无趣(根本没有非 ASCII 字符或我能想到的任何特殊性)。
有什么想法或假设吗?
gettext 库依赖于在环境变量中传输的语言环境信息。这在 Windows 上的 Apache mod_php SAPI(又名 "PHP as Apache module")上非常不可靠,因为单个线程通常会被不同的脚本共享。
在我的例子中,我是 运行 http://parent.example.com
,它向 http://child.example.com
发出内部 HTTP post 请求(使用 Curl),然后组合并打印结果。碰巧这两个站点都托管在同一个站点上,所以两个脚本共享环境,我得到这个序列:
- 家长将"parent.mo"设置为目录
- 子集"child.mo"为目录
- 家长想打印翻译的文本,从错误的目录中拿东西
- 这两个站点是相关的,因此它们共享许多字符串,但不是全部(因此获得大多数翻译的红鲱鱼。
我能够使用 Process Monitor 实用程序对此进行诊断。我在加载页面时捕获数据,然后按 "path ends with .mo
" 过滤。这表明 Apache 除了加载正确的目录外,还加载了一个意外的目录。
作为快速且肮脏的解决方法,我在 curl_exec()
之后再次调用 bindtextdomain()
和 textdomain()
。 (从长远来看,我将不得不迁移到 FastCGI,使用纯 PHP gettext 库或说服客户端切换到 Linux,哪个更容易。)
我在 PHP 驱动的网站上安装了一个有效的 gettext(PHP/5.3 运行 作为 Windows 上的 Apache 模块)。问题是 某些任意字符串没有被翻译 。少数文本(不到 1% 且始终相同)保留原始语言。疯狂的一点是细节:
确实翻译了周围的字符串:
Line 95: <th><?php echo _('Address'); ?></th> <-- Translated --> Line 96: <th><?php echo _('Number'); ?></th> <-- Not translated!!! --> Line 97: <th><?php echo _('City'); ?></th> <-- Translated -->
- 它在另一个 PHP/5.3 具有不同 Windows 版本和体系结构的服务器中 100% 可重现:我在相同的字符串中遇到问题。
- 如果我更改源文本、翻译或两者,问题仍然存在于完全相同的位置。
- 受影响的字符串相当无趣(根本没有非 ASCII 字符或我能想到的任何特殊性)。
有什么想法或假设吗?
gettext 库依赖于在环境变量中传输的语言环境信息。这在 Windows 上的 Apache mod_php SAPI(又名 "PHP as Apache module")上非常不可靠,因为单个线程通常会被不同的脚本共享。
在我的例子中,我是 运行 http://parent.example.com
,它向 http://child.example.com
发出内部 HTTP post 请求(使用 Curl),然后组合并打印结果。碰巧这两个站点都托管在同一个站点上,所以两个脚本共享环境,我得到这个序列:
- 家长将"parent.mo"设置为目录
- 子集"child.mo"为目录
- 家长想打印翻译的文本,从错误的目录中拿东西
- 这两个站点是相关的,因此它们共享许多字符串,但不是全部(因此获得大多数翻译的红鲱鱼。
我能够使用 Process Monitor 实用程序对此进行诊断。我在加载页面时捕获数据,然后按 "path ends with .mo
" 过滤。这表明 Apache 除了加载正确的目录外,还加载了一个意外的目录。
作为快速且肮脏的解决方法,我在 curl_exec()
之后再次调用 bindtextdomain()
和 textdomain()
。 (从长远来看,我将不得不迁移到 FastCGI,使用纯 PHP gettext 库或说服客户端切换到 Linux,哪个更容易。)