【问题标题】:Gettext wont parse plural forms when singular exists当单数存在时,Gettext 不会解析复数形式
【发布时间】:2013-03-07 20:11:23
【问题描述】:

这是我的情况: 我通过 Poedit 使用 gettext 来翻译 PHP 应用程序。 我有一个复数的自定义函数:

function ListOutput($result,$column_names,$singular='.',$plural='.',$link=false,$group=array(),$options=array())

在 Poedit 中使用此关键字引用:ListOutput:3,4

现在,我的问题是,当我有一个要翻译的字符串时,我使用_('example_string'),但如果我稍后通过ListOutput($result,$column_names,'example_string', 'example_string_plural') 翻译它,Poedit 中只会出现 example_string

此外,我应该说这个问题有时会出现,其他时候,我会有复数形式和单数形式(所以,单数字符串 2 次......)。

注意1:如果字符串仅在ListOutput()中引用,复数形式将正确出现在Poedit中。

注意2:ListOutput() 函数调用ngettext(),将列表元素的数量作为第三个参数。

【问题讨论】:

  • 没有人想不到你自己的函数 ListOutput() 中发生了什么。请制作能够重现您的问题的最少代码,这可能是使用您的参数调用 ngettext()。

标签: php internationalization gettext poedit plural


【解决方案1】:

我对@9​​87654321@ 的这种行为并不感到惊讶。在 Gettext 中,(未翻译的)字符串是 ID——目录中不能有两个具有相同 ID 的不同条目。这没有任何意义,不是吗?

您要求xgettextmsgid "example_string" 写入具有两个冲突定义的ePO 目录:作为单一形式条目(来自_() 出现)或作为具有复数形式的条目(来自ListOutput()称呼)。如果它报告错误会更好,但它也只选择第一个定义并不完全令人惊讶。

无论如何,这似乎很可疑——同一个字符串怎么能以两种方式正确使用?这两种用法中的一种很可能是不正确的。如果确实合法,您可以使用msgctxt 来消除这两个字符串的歧义。

【讨论】:

  • 哈哈,今天偶然发现了这种行为。恕我直言,这是 PO 格式 / xgettext 考虑到 msgid 可能与复数形式冲突的缺陷。复数形式的 msgid 应该是单数和复数的连接,这应该可以处理 PO 目录中的两种形式。如果不是,至少抛出一个可理解的错误,说明存在冲突,而不仅仅是一个一个地擦除:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多