好的,进一步思考,我意识到我知道如何在 gettext 中使用预先存在的翻译。要使用预先存在的文本域asdf
,只需执行
const Gettext = imports.gettext.domain('asdf');
const _ = Gettext.gettext;
那里没有惊喜。
事实证明,我的实际问题是我想使用“最小化”、“最大化”、“恢复”、“关闭”等翻译,虽然我确信这些翻译已经存在于我的系统某处,但我没有不知道他们实际上在哪个gettext 域中。
要找出答案:
在 Fedora(无论如何是我的版本)上,翻译文本位于/usr/share/locale
.
我进去了/usr/share/locale/en_GB/LC_MESSAGES
,那里有一堆.mo
文件。这些不是人类可读的,但我仍然可以通过它们 grep:
[foo@bar]$ grep -i maximize *.mo
Binary file devhelp.mo matches
Binary file evolution-3.2.mo matches
Binary file f-spot.mo matches
Binary file gnome-games.mo matches
Binary file gnome-media-2.0.mo matches
Binary file gnome-utils-2.0.mo matches
Binary file metacity.mo matches
Binary file mutter.mo matches
Binary file nautilus.mo matches
浏览列表时,我突然想到,因为我正在寻找窗口菜单上项目的翻译,所以可能是我的窗口管理器拥有这些翻译。我的窗口管理器(因为我在 gnome-shell 上)mutter
是基于metacity
.
所以,我下载了 mutter 源并查看了po
文件(人类可读的翻译文件),你瞧!
#: ../src/ui/menu.c:69
msgid "Mi_nimize"
msgstr "Mi_nimise"
#: ../src/ui/menu.c:71
msgid "Ma_ximize"
msgstr "Ma_ximise"
#: ../src/ui/menu.c:73
msgid "Unma_ximize"
msgstr "Unma_ximise"
...and so on (the underscores are the keyboard accelerators for that menu item).
所以现在我已经找到了翻译,这只是一个例子(在我的代码中):
const Gettext = imports.gettext.domain('mutter')
const _ = Gettext.gettext;
log(_("Ma_ximize")); // to translate 'Ma_ximize'
(我必须输入_("Ma_ximize")
gettext ,因为这是mutter.mo
文件中翻译的确切字符串——没有下划线就没有"Maximize"
翻译。之后我不得不从翻译的文本中删除下划线,这可能会搞砸使用下划线的语言作为他们写作的一部分,但我希望这不是很多)。
所以,总而言之——使用另一个(预先存在的)文本域很容易,但问题是找到具有您想要的字符串的文本域。