更改pygobject项目的本地化

问题描述

我是使用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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...