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程序中正确指定即可。