c++ - 使用带有 --extract-all 的 xgettextt 处理复数

标签 c++ linux internationalization xgettext

--extract-allxgettext 一起使用不适用于复数。使用 I18n C++ hello world with plurals 的答案因为这里的 C++ 代码是两个使用 xgettext 的测试。

cat >helloplurals.cxx <<EOF
// hellopurals.cxx
#include <libintl.h>
#include <locale.h>
#include <iostream>
int main (){
    setlocale(LC_ALL, "");
    bindtextdomain("helloplurals", ".");
    textdomain( "helloplurals");
    for (int ii=0; ii<5; ii++)
        printf(ngettext("Hello world with %d moon.\n", "Hello world with %d moons.\n", ii), ii);
EOF
xgettext --package-name helloplurals --package-version 1.1 --default-domain helloplurals --output helloplurals.pot helloplurals.cxx
xgettext --extract-all --package-name helloplurals --package-version 1.1 --default-domain helloplurals --output helloplurals-ea.pot helloplurals.cxx

没有 --extract-all 的会按预期工作,包括对复数的处理:

#: helloplurals.cxx:10
#, c-format
msgid "Hello world with %d moon.\n"
msgid_plural "Hello world with %d moons.\n"
msgstr[0] ""
msgstr[1] ""

--extract-all 添加到命令行时,生成的 POT 文件不会。相反,有单独的条目:

#: helloplurals.cxx:10
#, c-format
msgid "Hello world with %d moon.\n"
msgstr ""

#: helloplurals.cxx:10
#, c-format
msgid "Hello world with %d moons.\n"
msgstr ""

直接传递给 gettext() 类函数的字符串文字可以正确处理复数消息,如 xgettext 的第一个示例使用所示。

对于未直接传递给 gettext() 类函数之一的字符串文字 将选项 --extract-allxgettext 一起使用可用于生成 POT 文件中的条目。

如何处理未直接传递给 gettext() 的字符串文字,例如源代码中的函数也包含直接传递给 gettext() 的复数字符串文字 类似函数来生成复数条目:msgid_pluralmsgstr[]?

最佳答案

我认为 xgettext 不支持这一点。如果您传递 --extract-all,它将忽略出现字符串的任何上下文。您可以考虑将此报告为错误。

无论如何,我建议明确标记所有字符串。有很好的工具支持可以相当快地完成这项工作。

关于c++ - 使用带有 --extract-all 的 xgettextt 处理复数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1114364/

相关文章:

c++ - 为什么此代码在模板特化方面有错误

c++ - 在 unix 上从 c/c++ 断点/调试其他用户进程

asp.net - 全局化、本地化、国际化 : Add Languages (French, 等)/asp.net 4.0/for dummies

c++ - 在双端队列中弹出前后

c++ - MSVCP120d.dll 丢失

linux - 对不同文件运行命令并存储输出结果

linux - 从终端输出中替换 Amazon EC2 SSH 主机名(文本文件)

linux - rsync 错误代码的完整列表

laravel-5 - 在 laravel 5/vue app2 中切换语言

Android - 枚举的本地化