2015-07-10 86 views
1

我在一个PHP驱动的Web站点(在Windows上作为Apache模块运行的PHP/5.3)上有一个可用的gettext安装。问题是某些任意字符串不会被翻译为。一些文本(少于1%,始终相同)保留原文。疯狂位是详细信息:gettext特定的字符串不会被翻译

  • 周边字符串也得到翻译:

    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字符或我能想到的任何特殊性)。

任何想法或假设?

+1

您能给出一个最基本的,可重复的例子吗? – hek2mgl

+0

@ hek2mgl - 恐怕不是。这是一个由同事编写的家庭酝酿的MVC框架,并且该问题在外部不存在:( –

+0

恕我直言,这个问题在这种情况下是题外话 – hek2mgl

回答

2

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

在我的情况下,我运行的是http://parent.example.com,它发出一个内部HTTP请求(带卷曲)到http://child.example.com,然后组合并打印结果。它发生两个站点都在同一个网站托管,因此这两个脚本共有的环境,我得到这个序列:

  1. 父亲集“parent.mo”作为目录
  2. 孩子套“child.mo”的目录
  3. 家长要打印的翻译文本,从错误的目录
  4. 两个站点都因此有关他们有许多共同的字符串,但不是所有的(因此红色得到了大多数翻译的鲱鱼。

我は得到的东西使用Process Monitor实用程序可以诊断此问题。我在进行页面加载时捕获数据,然后通过“路径以.mo结束”进行过滤。这揭示了Apache正在加载一个意外的目录以及正确的目录。

由于快速&肮脏的解决方法我打电话bindtextdomain()textdomain()再次curl_exec()之后。 (从长远来看,我将不得不迁移到FastCGI,使用纯PHP的gettext库或者说服客户切换到Linux,无论哪个更容易。)