问题描述
我是使用python进行GUI编程的新手,我需要一个简单的示例,说明如何基于位于项目内的.po文件(我能够生成)更改GUI语言。我正在为此任务使用GNOME Builder。
我想要从builder(或Glade)生成的xml加载gui定义,并让程序根据计算机的语言环境/语言更改文本。
test
|
|- po
| |- it.po
| |- en.po
| |- ...
|
|- src
| |- test.in
| |- main.py
| |- window.py
| |- window.ui
| |- ...
此文件包含主要的UI校准
#window.py
from gi.repository import Gtk
@Gtk.Template(resource_path='/path/to/ui/window.ui')
class Testwindow(Gtk.applicationwindow):
__gtype_name__ = 'Testwindow'
label = Gtk.Template.Child()
def __init__(self,**kwargs):
super().__init__(**kwargs)
print(_("hello"))
_("some string")
因此,在加载window.py时,我在终端中收到“ Ciao”(意大利语为hello)。但是我似乎无法更改GUI小部件的语言,例如,我看到的是“ Random Text”(随机文本),而不是“ Testo a caso”(同样,意大利语翻译)。
是否可以将任何参数传递给Gtk.Template,或者可以使用某些Python魔术来修改此行为?
解决方法
首先在您的项目中创建一个标准的语言环境目录:
locales
├── it
│ └── LC_MESSAGES
│ ├── messages.mo
│ └── messages.po
├── fa
│ └── LC_MESSAGES
│ ├── messages.mo
│ └── messages.po
└── messages.pot #the English one
然后使用gettext(用于python字符串)和locale(用于xml字符串)模块:
import gettext
import locale
locale_dir = LOCALE_DIR
locale.setlocale(locale.LC_ALL,'')
locale.bindtextdomain('messages',locale_dir)
gettext.bindtextdomain('messages',locale_dir)
gettext.textdomain('messages')
_ = gettext.gettext