0

我是使用 python 进行 GUI 编程的新手,我需要一个简单的示例来说明如何根据位于项目内部的 .po 文件(我能够生成)更改 GUI 语言。我正在使用 GNOME 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”(意大利语为你好)。但我似乎无法更改 GUI 小部件的语言,例如我看到“随机文本”而不​​是“Testo a caso”(再次,意大利语翻译)。

有没有我可以传递给 Gtk.Template 的参数,或者我可以做一些 python 魔术来修改这种行为?

4

1 回答 1

0

首先在你的项目中创建一个标准的 locales 目录:

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
于 2020-12-18T16:35:15.170 回答