Изменить локализацию проекта pygobject

Я новичок в программировании графического интерфейса с помощью python, и мне нужен простой пример того, как изменить язык графического интерфейса на основе файлов .po (которые я могу генерировать), расположенных внутри проекта. Я использую GNOME Builder для этой задачи.

Я бы хотел загрузить определение графического интерфейса из xml, созданного разработчиком (или Glade), и позволить программе изменять тексты в зависимости от языка/языка моего компьютера.

test
  |
  |- po
  |  |- it.po
  |  |- en.po
  |  |- ...
  |
  |- src
  |  |- test.in 
  |  |- main.py
  |  |- window.py
  |  |- window.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 в терминале (привет по-итальянски). Но я не могу изменить язык виджетов графического интерфейса, например, я вижу случайный текст, а не Testo a caso (опять же, итальянский перевод).

Есть ли какой-либо параметр, который я могу передать в Gtk.Template, или какую-то магию Python, которую я могу сделать, чтобы изменить это поведение?


person Federico Marchetti    schedule 25.10.2020    source источник
comment
Знаете ли вы о параметре translatable=yes для записей XML? См., например, код пользовательского интерфейса здесь: python-gtk-3 -tutorial.readthedocs.io/en/latest/builder.html   -  person nielsdg    schedule 25.10.2020
comment
Да, я установил его для всех виджетов, содержащих текст, но, к сожалению, это не решает проблему.   -  person Federico Marchetti    schedule 25.10.2020


Ответы (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
person Danial Behzadi    schedule 18.12.2020