0

我正在编写一个小程序(javascript,但我认为这并不重要)并且正在尝试为其添加翻译。

其中唯一需要翻译的字符串是“Minimize”、“Maximize”、“Restore”、“Close”等——这些应该已经在某处进行了翻译,对吧?因为当我右键单击窗口的系统标题栏时,我会得到一个带有这些相同选项的菜单(我使用的是 Linux)。

有什么方法可以让我使用这些已经完成的翻译,而不必再次进行翻译(这涉及到我找到一大群愿意自愿提供一些时间进行翻译的翻译)?

是否只是找到正确的 gettext 域的问题?这就是我目前的设置方式(它在javascript中,但这与问题无关):

const Gettext = imports.gettext.domain('foobar-gettext-domain');               
const _ = Gettext.gettext;
4

1 回答 1

0

好的,进一步思考,我意识到我知道如何在 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"翻译。之后我不得不从翻译的文本中删除下划线,这可能会搞砸使用下划线的语言作为他们写作的一部分,但我希望这不是很多)。

所以,总而言之——使用另一个(预先存在的)文本域很容易,但问题是找到具有您想要的字符串的文本域。

于 2012-07-20T01:02:53.027 回答