【问题标题】:Change localization of pygobject project更改 pygobject 项目的本地化
【发布时间】:2021-02-07 22:40:54
【问题描述】:

我是使用 python 进行 GUI 编程的新手,我需要一个简单的示例来说明如何根据位于项目中的 .po 文件(我能够生成)更改 GUI 语言。我正在使用 GNOME Builder 来完成这项任务。

我想要的是从 xml 加载由 builder(或 Glade)生成的 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 魔术来修改这种行为?

【问题讨论】:

标签: python-3.x localization gtk3 pygobject gnome-builder


【解决方案1】:

首先在你的项目中创建一个标准的语言环境目录:

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

【讨论】: