python glade gettext多国语言的支持


                    今天仔细研究了下gtk程序中多国语言的支持问题,自己也写了个简单的程序来实现gtk程序的中英文支持。用到的工具是glade-3,gettext,pygtk,python.对于这些工具的介绍我就省略了。网上有很多这方面的资料^_^。
    首先用glade-3绘制一个简单的UI,此文件命名为MultiLanguage.glade。glade中对多国语言的支持不需要特别设置,只需要在label,title的property中的translatable选为yes就行了。其他的就是在py中进行操作。然后写一个python脚本程序testMulti.py来运用这个glade。接着用xgettext及msgfmt命令来生成所需要的po,mo文件。具体如下:
    xgettext -ktranslatable -k_ MultiLanguage.glade testMulti.py -o MultiLanguage.po
    (在VI中需要对其进行编辑,修改MultiLanguage.po文件中的charset=CHARSET为charset=UTF-8。接着把msgid的英文语句翻译好写到msgstr中就行了。)
    msgfmt MultiLanguage.po -o MultiLanguage.mo
    sudo cp MultiLanguage.mo /usr/share/locale/zh_CN/LC_MESSAGE/MultiLanguage.mo
    这样运行./testMulti.py即可显示多国语言了。简单吧。
    testMulti.py文件中的主要内容如下:
#!/usr/bin/env python
import pygtk
pygtk.require('2.0')
import gtk
import gtk.glade
import gettext
rcdomain = "MutiLanguage"
#localedir = "/home/spartk/mypro/pygtk"
localedir = "/usr/share/locale"
class MutilLanguage:
    def __init__(self):
        self.gladefile = "MutiLanguage.glade"
        #此句我调试了很久才搞定,真是郁闷。
        self.wTree = gtk.glade.XML(self.gladefile,"MainWin",rcdomain)
        dict = {"on_MainWin_delete_event": self.on_MainWin_delete_event}
        self.wTree.signal_autoconnect(dict)
        
        self.mainwin = self.wTree.get_widget("MainWin")
        #install language
        gettext.bindtextdomain(rcdomain, localedir)
        gettext.textdomain(rcdomain)
        gettext.install(rcdomain, localedir, unicode=True)
        gtk.glade.bindtextdomain(rcdomain, localedir)
        gtk.glade.textdomain(rcdomain)
        self.hbox1 = self.wTree.get_widget("hbox1")
        label = gtk.Label(_("Hello World"))
        label.show()
        self.hbox1.pack_start(label)
    def on_MainWin_delete_event(self, widget, event, data=None):
        self.mainwin.destroy()
        gtk.main_quit()
    def main(self):
        gtk.main()
if __name__ == "__main__":
    MutilLanguage().main()
注意:
1. 要显示中文,需要把系统语言设置成中文。至于在不需要改变系统语言时,如何显示中文,不清楚。
2. 经验证,mo,po文件存放的路径可以是任意的,只要在py程序中正确指定即可。