【问题标题】:I18n C++ hello world with pluralsI18n C++ hello world 带复数
【发布时间】:2009-07-10 07:32:07
【问题描述】:

Complete C++ i18n gettext() “hello world” example 具有适用于简单固定字符串的 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

GNU gettext() for plural forms 描述了语言处理复数的各种方式,例如:

  • 韩语 - 没有复数
  • 英语 - 两种形式,单数仅用于一种
  • 法语 - 两种形式,单数用于零和一
  • 波兰语 - 三种形式,一种特殊情况以及一些以 2、3 或 4 结尾的数字

我的期望是代码将能够专门针对上述所有情况以及此处未列出的其他几种变体工作(给定消息目录)。用英文执行时正确的输出是:

Hello world with 0 moons.
Hello world with 1 moon.
Hello world with 2 moons.
Hello world with 3 moons.
Hello world with 4 moons.

【问题讨论】:

  • 引用 JS:“反对者:请提供 cmets。- Jon Skeet 5 月 8 日 9:25”

标签: c++ internationalization gettext


【解决方案1】:

我不确定你想要什么。如果对您的示例稍作修改即可提供所需的输出,只需将 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++ 语法的 gettext,则必须寻找类似 Boost::Format 的库。

【讨论】:

  • 这如何支持具有三种或更多形式的语言,例如波兰语?
  • 目录包含语言规则;如果您没有目录,则 ngettext 应用的默认规则是英文的(因此,如果您尝试将其与法文或波兰文文本一起使用,则会得到不正确的输出)。
  • 如果您只使用 gettext(),则没有传递允许目录启动的数字。如果使用 ngettext(),则传递一个可与目录规则和消息一起使用的数字。传递的多条英语消息仅适用于不使用适用于英语的目录的情况。谢谢。你会扩大你的答案以涵盖所有这些吗?
【解决方案2】:

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

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

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

您的电话应如下所示:

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

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

【讨论】:

  • 在问题中添加了消息目录注释。问题中的代码旨在作为一个具体的起点。我为 gettext() 函数组找到的文档缺少明确的复数示例
  • 注意,从上下文中提取单词并翻译它不是一个好主意,尤其是对于复数形式。你应该采取洞判,因为其他形式可能取决于“卫星数”
【解决方案3】:

你真的为不同的复数形式制作了一个 .po 文件吗?请参阅description of the gettext workflow on Wikipedia。另请阅读gettxt documentation about plural forms全部,尤其是包含复数形式的 .po 文件的示例。

【讨论】:

  • 问题中的第一个链接具有创建消息目录的顺序。在这里,我正在寻找示例 C++ 代码。
猜你喜欢
  • 2010-11-03
  • 2013-02-23
  • 1970-01-01
  • 2011-12-25
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多