PoEdit关键词 - 复数形式

8
我在我的应用程序中引入了类似于gettext的本地化系统,但我的翻译函数看起来像这样:
 t($category, $string, [$plural_string, $number, $vprintf_arguments])

我的PoEdit关键词:

t:2
t:2,3
  • t:2表示告诉PoEdit解析$string,它显然起作用了
  • t:2,3应该告诉PoEdit同时解析$string$plural_string - 但它没有:(

PoEdit只看到了$string,所以我没有得到复数形式的解析...我该如何解决这个问题?我不想更改函数的参数格式,因为我喜欢这种格式 :(

此外,此函数的作用类似于sprintf替换:

  • 如果第3个参数($plural_string)是一个数组,则函数将把数组中的值视为vsprintf的参数
  • 如果第3个参数是一个字符串,并且提供了$number,则函数将把$vprintf_arguments作为vsprintf的参数(如果提供了),并将$plural_string视为$string的复数形式

无论如何,PoEdit都不应干扰非引用参数,对吗?我的意思是,只有在它看起来像'abc abc'时,它才会将$plural_string解析为字符串


很抱歉如果这些问题对您来说看起来很简单,但我对这个产品的经验非常有限。您能否向我们展示包含无法获取其复数的字符串的.po文件片段?您填充了msgid_plural字段吗?您在文件中使用了预期的字符集/编码吗? - jap1968
你能否请发一下更多的PHP函数?还有可能再给一个例子吗?期待您的回复。谢谢 -Tim =) - Timothy Martens
是的,没有看到任何代码,很难理解出错在哪里...而且,你使用什么类型的分词器来提取翻译字符串? - redShadow
2个回答

7

gettext只处理单个字符串。

你可能需要的是ngettext。(查找语法)

在这里,你将为单数输入一个文本,为复数输入另一个文本,并输入数字。

这个聪明的方法是,许多语言具有与英语完全不同的复数结构。例如,俄语使用三种不同的形式。一种是计数以发音为“one”结尾的情况:1、21、31、41等。第二种形式适用于以2、3或4结尾的计数。第三种形式适用于其余的情况...

而且,使用ngettext可以实现这一点。是的,在poedit中,必须正确定义目标语言的复数结构,但然后它就可以工作了。

http://www.gnu.org/s/hello/manual/gettext/Plural-forms.html


欢迎来到 Stack Overflow,回答得真棒。我一直以为 gettext 不能帮助大多数语言做好复数形式,谢谢! - sarnold

1

正如Tor-Bjorn Fjellner所回答的那样,这实际上应该是有效的。

如果你告诉poedit这种语言实际上有复数形式(使用poedit翻译复数形式),并考虑了你的关键字,poedit会提供它们进行翻译。

例子

复数形式: nplurals=2; plural=n != 1;

关键字:

  • t:2
  • t:2,3

PHP代码:

<?php

t("cat", "strA");

t("cat", "strB1", "strB2", 2, array());

t("cat", "strC1", "strC2", 3, array());

Poedit UI:

Poedit Plural Forms

我在你的问题中没有理解的是关于数组等方面的点。我无法解密你在poedit/gettext领域中的意图,如果你添加一些具体的代码示例以及它们的预期结果,我认为你的问题会更有益处。

好的,我搞定了!!原来我必须在关键字列表中颠倒t:2和t:2,3。你是怎么按那个顺序得到结果的? - Alex
没什么想法,我觉得我没有做什么特别的事情。也许是程序版本的差异? - hakre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接