【问题标题】:gettext Specific strings don't get translatedgettext 特定字符串不会被翻译
【发布时间】:2015-07-10 10:55:49
【问题描述】:

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

有什么想法或假设吗?

【问题讨论】:

  • 你能举一个最基本的、可重现的例子吗?
  • @hek2mgl - 恐怕不会。这是一个由同事编写的自制 MVC 框架,问题在外部无法生存:(
  • 恕我直言,在这种情况下,这个问题是题外话。
  • 我刚刚能够使用相同的代码和两个相同的 *.po 文件来重现它。我怀疑 *.mo 的编译有问题 :-!
  • 我没有这么说,我只是担心当它无法重现时,没有人有机会回答这个问题。

标签: php gettext


【解决方案1】:

gettext 库依赖于环境变量中传输的语言环境信息。这在 Windows 上的 Apache mod_php SAPI(又名“PHP 作为 Apache 模块”)上极其不可靠,因为单个线程通常会被不同的脚本共享。

就我而言,我正在运行http://parent.example.com,它向http://child.example.com 发出了一个内部HTTP 发布请求(使用Curl),然后组合并打印了结果。碰巧两个站点都托管在同一个站点上,因此两个脚本共享环境,我得到了这个序列:

  1. 家长将“parent.mo”设置为目录
  2. 孩子将“child.mo”设置为目录
  3. 家长想打印翻译文本,从错误目录中获取内容
  4. 两个网站是相关的,因此它们共享许多字符串,但不是全部(因此获得最多翻译的红鲱鱼。

我能够使用Process Monitor 实用程序诊断此问题。我在加载页面时捕获了数据,然后按“路径以.mo”结尾。这表明 Apache 除了加载正确的目录之外,还加载了一个意外的目录。

作为快速而肮脏的解决方法,我在curl_exec() 之后再次致电bindtextdomain()textdomain()。 (从长远来看,我将不得不迁移到 FastCGI,使用纯 PHP gettext 库或说服客户端切换到 Linux,任何更容易的方法。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    相关资源
    最近更新 更多