如何让我的应用程序找到 gettext 翻译?

How do I make my application find the gettext translations?

我正在尝试 xnec2c 的 gettext 翻译。

gettext 在构建时生成一个 po/xnec2c.pot 文件,我已经将该 .pot 文件翻译成 de_DE 并将其放在 /usr/share/locale/de_DE/LC_MESSAGES/xnec2c.po 中(也试过如 .pot.mo).

如果我将 xnec2c 调用为 LC_ALL=de_DE ./xnec2c,那么我知道它获得了语言环境,因为小数点变成了逗号而不是浮点值中的句点,但文本没有被翻译。我也试过设置 LC_MESSAGES=de_DE 但文本语言没有变化。

_()宏定义为:

#define _(String) dgettext (PACKAGE, String)

autoconfconfigure.ac 中将 PACKAGE 定义为“xnec2c”,它在 config.h.

中正确显示

控制台输出使用vfprintf如下,注意使用_(format):

vfprintf(stderr, _(format), args);

并且我已验证要打印的格式化字符串存在于已翻译的 .pot 文件中。

我该如何解决这个问题?我已经阅读了相当多的 gettext 文档,但不确定接下来要尝试什么。

('gtk' 标签在这里是因为我们也在使用翻译的 .glade 文件,以防相关。)

这里有一些示例(机械翻译为 de 不是我的母语 $LANG):

xnec2c.pot

#: src/callback_func.c:684
msgid "View Currents"
msgstr ""

#: src/callback_func.c:810
msgid "GNUplot files (*.gplot)"
msgstr ""

#: src/callbacks.c:88 src/callbacks.c:328 src/callbacks.c:2065
msgid "Really quit xnec2c?"
msgstr ""

/usr/share/locale/de_DE/LC_MESSAGES/xnec2c.po

msgid "View Currents"
msgstr "Ströme anzeigen"

msgid "GNUplot files (*.gplot)"
msgstr "GNUplot-Dateien (*.gplot)"

msgid "Really quit xnec2c?"
msgstr "Wirklich verlassen xnec2c?"

在程序开始附近你必须调用类似

的东西
  bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
  bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
  textdomain(GETTEXT_PACKAGE);

其中 GETTEXT_PACKAGELOCALEDIR 是通常由 autoconf 定义的宏。 (您似乎只使用 PACKAGE 而不是 GETTEXT_PACKAGE,而 LOCALEDIR 是存储 .mo 文件的地方。)

/usr/share/...下的翻译文件应该命名为xnec2c.mo,而不是.po。您提到已经尝试过了,但是由于您根本没有提到 msgfmt,您是否只是将 .po 重命名为 .mo

重命名无效,文件格式错误。 .po需要使用命令msgfmt -vco xnec2c.mo xnec2c.po.

进行转换

-v 用于详细,-c 用于更严格的语法检查,-o 用于输出)