如何让我的应用程序找到 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)
和 autoconf
在 configure.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_PACKAGE
和 LOCALEDIR
是通常由 autoconf 定义的宏。 (您似乎只使用 PACKAGE
而不是 GETTEXT_PACKAGE
,而 LOCALEDIR
是存储 .mo
文件的地方。)
/usr/share/...
下的翻译文件应该命名为xnec2c.mo
,而不是.po
。您提到已经尝试过了,但是由于您根本没有提到 msgfmt
,您是否只是将 .po
重命名为 .mo
?
重命名无效,文件格式错误。 .po
需要使用命令msgfmt -vco xnec2c.mo xnec2c.po
.
进行转换
(-v
用于详细,-c
用于更严格的语法检查,-o
用于输出)
我正在尝试 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)
和 autoconf
在 configure.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_PACKAGE
和 LOCALEDIR
是通常由 autoconf 定义的宏。 (您似乎只使用 PACKAGE
而不是 GETTEXT_PACKAGE
,而 LOCALEDIR
是存储 .mo
文件的地方。)
/usr/share/...
下的翻译文件应该命名为xnec2c.mo
,而不是.po
。您提到已经尝试过了,但是由于您根本没有提到 msgfmt
,您是否只是将 .po
重命名为 .mo
?
重命名无效,文件格式错误。 .po
需要使用命令msgfmt -vco xnec2c.mo xnec2c.po
.
(-v
用于详细,-c
用于更严格的语法检查,-o
用于输出)