gettext特定的字符串不会被翻译

时间:2015-07-10 10:55:50

标签: php gettext

我在PHP支持的网站(PHP / 5.3在Windows上作为Apache模块运行)中安装了一个gettext。问题是某些任意字符串无法翻译。一些文本(少于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 -->
    
  • 在具有不同Windows版本和体系结构的另一台PHP / 5.3服务器上100%可重现:我在同一个字符串中遇到问题。
  • 如果我更改源文本,翻译或两者,问题仍然存在于完全相同的位置。
  • 受影响的字符串相当无趣(根本没有非ASCII字符或我能想到的任何特殊情况)。

任何想法或假设?

1 个答案:

答案 0 :(得分:2)

gettext库依赖于环境变量中传输的区域设置信息。这在Windows上的Apache mod_php SAPI(又名“PHP as Apache模块”)上非常不可靠,因为单个线程通常由不同的脚本共享。

在我的情况下,我正在运行http://parent.example.com,它将内部HTTP发布请求(带有Curl)发送到http://child.example.com,然后编写并打印结果。碰巧两个站点都托管在同一个站点上,因此两个脚本共享环境,我得到了这个序列:

  1. 父级将“parent.mo”设置为目录
  2. Child将“child.mo”设置为目录
  3. 家长想要打印翻译文本,从错误的目录中获取内容
  4. 两个网站都是相关的,因此它们共享许多字符串,但不是全部(因此获得大多数翻译的红色鲱鱼。
  5. 我能够使用Process Monitor实用程序对此进行诊断。我在执行页面加载时捕获数据,然后通过“路径以.mo结束”进行过滤。这表明Apache除了正确的目录之外还加载了一个意外的目录。

    快速&amp;肮脏的解决方法我在bindtextdomain()之后再次呼叫textdomain()curl_exec()。 (从长远来看,我将不得不迁移到FastCGI,使用纯PHP的gettext库或说服客户端切换到Linux,无论更容易。)