【问题标题】:Log strings for which PHP gettext does not find any translationPHP gettext 找不到任何翻译的日志字符串
【发布时间】:2012-09-13 23:49:33
【问题描述】:

我有一个使用 php 内置的 Gettext / PO 支持国际化的网站

echo _("string to be translated");

该网站处于测试阶段,肯定有一些字符串没有被翻译。为了帮助调试,有没有办法记录 gettext 错误,即记录 PO 未在 PO 文件中找到任何匹配条目的字符串?

【问题讨论】:

  • 您应该自动使用适当的工具将所有 i18n'ed 字符串提取到 .po 文件中,然后使用 POedit 等本地化工具查看这些文件。这会向您显示哪些字符串仍需要翻译,并且所有字符串都应该在文件中,因为提取已自动完成。
  • 所以没有办法记录 gettext 错误?随着代码库的不断变化,随着时间的推移可能会出现错误
  • 据我所知(但我不是 gettext 方面的专家)。在 gettext 中找不到本地化特别不被视为错误。我也不会考虑记录查找未翻译字符串的好方法,因为这意味着您必须运行发生翻译的所有代码路径才能找到未翻译的字符串。这比为提取设置建立良好的工作流程更难管理。
  • 顺便问一下,你会使用什么工具来自动从 PHP 脚本中提取所有要翻译的字符串?
  • 默认是gettext工具链中的xgettext。

标签: php internationalization translation gettext po


【解决方案1】:

您想要做的问题是您只能在运行时找到未翻译的字符串,并且只能找到实际执行的代码路径。您可能需要数年时间才能找到所有字符串,同时您必须定期查看日志文件并将更新的翻译与日志文件中发生的情况同步。这不是一种确定性的翻译方法。

如果您使用的是 gettext,则需要建立一个适合它的工作流程。 gettext 工作流程和工具链经过深思熟虑并经过时间考验。

  1. 通过在 gettext 函数中包装字符串来准备源代码。
  2. 将准备好的字符串提取到 POT 文件中,通常是 using xgettext,但可能会使用自定义解析器/提取器和类似 Kunststube\POTools 的库(无耻的自我宣传)。
  3. 从提取的模板文件using msginit创建 PO 文件。
  4. 翻译 PO 文件。
  5. 保持更新的源/POT 文件与 PO 文件同步 using msgmerge
  6. 将 PO 文件编译成 MO 文件using msgfmt
  7. 冲洗,重复。

简而言之,这是正确的 gettext 工作流程,它解决了翻译过程中的大多数问题。特别是如果您有分布式翻译器,您通常会在源代码更新和翻译进入之间存在时间滞后和重叠。如果没有自动字符串提取和msgmerge 实用程序,这个过程很容易陷入混乱,这就是为什么你应该坚持到上面的步骤。

如果您这样做了,您的问题将变得无关紧要,因为您可以随时使用 gettext 实用程序或 Poedit 之类的工具检查您的 PO 文件,以查看哪些字符串未翻译。

【讨论】:

  • 这很可能无法解决人们在翻译方面可能遇到的所有问题。假设您有配置,其中定义了稍后需要翻译的字符串(而不是在解析配置时)。提取代码中的所有字符串常量可能是一个坏主意(对象/关联数组的所有键),并且在配置级别转换意味着缓存特定的配置区域设置。当然,对于大多数翻译,您会找到调用 gettext 的方法,但不是全部。日志机制很有意义。
【解决方案2】:

可能更重要的是,因为您的测试版将使用像 podebug 这样的工具进行一些伪本地化。因此,一旦您提取了 PO 字符串,您就可以将它们本地化,以便查看是否所有字符串都在您的 UI 中提取。

【讨论】:

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