I18n C++;hello world,复数形式 有一个C++代码,它适用于一个简单的固定字符串。我现在正在寻找一个例子程序,与复数工作。此示例代码显示六行。英语中只有一个是正确的。它不能正确处理复数 cat >helloplurals.cxx <<EOF // hellopurals.cxx #include <libintl.h> #include <locale.h> #include <iostream> #include <stdio.h> int main (){ setlocale(LC_ALL, ""); bindtextdomain("helloplurals", "."); textdomain( "helloplurals"); for (int ii=0; ii<5; ii++) printf (gettext("Hello world with %d moon.\n"), ii); } EOF g++ -o helloplurals helloplurals.cxx ./helloplurals

I18n C++;hello world,复数形式 有一个C++代码,它适用于一个简单的固定字符串。我现在正在寻找一个例子程序,与复数工作。此示例代码显示六行。英语中只有一个是正确的。它不能正确处理复数 cat >helloplurals.cxx <<EOF // hellopurals.cxx #include <libintl.h> #include <locale.h> #include <iostream> #include <stdio.h> int main (){ setlocale(LC_ALL, ""); bindtextdomain("helloplurals", "."); textdomain( "helloplurals"); for (int ii=0; ii<5; ii++) printf (gettext("Hello world with %d moon.\n"), ii); } EOF g++ -o helloplurals helloplurals.cxx ./helloplurals,c++,internationalization,gettext,C++,Internationalization,Gettext,你真的为不同的复数形式制作了一个.po文件吗?看。还要阅读所有的示例,特别是包含复数形式的.po文件。首先,gettext()并不神奇。它并不包含所有语言中所有单词的全球词典 它所做的只是在应用程序的消息数据库中查找消息的翻译,因此本例假设存在这样一个文件(在gettext()中可以找到它,这可能有点棘手) 接下来,你用错了。您链接到的页面描述了ngettext()函数,您必须使用该函数才能获得随计数变化的翻译 您的呼叫应该如下所示: printf("%s", ngettext("moon",

你真的为不同的复数形式制作了一个.po文件吗?看。还要阅读所有的示例,特别是包含复数形式的.po文件。

首先,
gettext()
并不神奇。它并不包含所有语言中所有单词的全球词典

它所做的只是在应用程序的消息数据库中查找消息的翻译,因此本例假设存在这样一个文件(在
gettext()
中可以找到它,这可能有点棘手)

接下来,你用错了。您链接到的页面描述了
ngettext()
函数,您必须使用该函数才能获得随计数变化的翻译

您的呼叫应该如下所示:

printf("%s", ngettext("moon", "moons", ii));

这让gettext根据count参数决定使用哪种形式。

我不确定您想要什么。如果只是对示例稍加修改,就可以得到所需的输出,只需将printf行替换为

printf(ngettext("Hello world with %d moon\n", "Hello world with %d moons\n", ii), ii);
但由于它只是对unwind答案的一个微不足道的修改,gettext文档也有一个非常类似的示例

printf (ngettext ("%d file removed", "%d files removed", n), n);

我不知道这是否真的是你想要的。如果你想使用一个更为C++语法的GETTeX,你必须查找像Booo::Frase.< /P>之类的库。问题的第一个链接有创建消息目录的顺序。这里我想找一个C++代码。添加了邮件目录注释。问题中的代码旨在成为一个具体的起点。我为gettext()函数组找到的文档中缺少明确的pluralsNote示例,从上下文中提取一个单词并进行翻译不是一个好主意,尤其是对于复数形式。你应该采用hole语句,因为其他形式可能取决于引用JS的“月亮数”:“向下投票者:请提供评论。”–Jon Skeet 5月8日9:25“这如何支持具有三种或三种以上形式的语言,如波兰语?目录包含语言规则;如果没有目录,ngettext应用的默认规则是英文规则(如果您尝试将其与法文或波兰语文本一起使用,则会有不正确的输出)。如果仅使用gettext(),则不会传递允许目录生效的数字。如果使用了ngettext(),则会传递一个可用于目录规则和消息的数字。传递的多条英文消息仅适用于未使用目录的情况,该目录适用于英文。谢谢你能把你的答案扩展到所有这些吗?
printf (ngettext ("%d file removed", "%d files removed", n), n);