Перевести GTK UI, написанный на Glade и Python - PullRequest
0 голосов
/ 16 июня 2020

Я потратил некоторое время на поиски ответов, и у меня их масса. И теоретически мой код должен работать, но это не так. Сначала выложу минимальный код, а потом опишу проблемы.

test.glade:

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <!-- interface-requires gtk+ 3.0 -->
  <object class="GtkWindow" id="window">
    <property name="can_focus">False</property>
    <property name="window_position">center-always</property>
    <property name="default_width">400</property>
    <signal name="destroy" handler="main_quit" swapped="no"/>
    <child>
      <object class="GtkBox" id="box1">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="GtkLabel" id="label1">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">File</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="label2">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">Edit</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="label3">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">Find</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">2</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="label4">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">View</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">3</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="label5">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">Document</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">4</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

test.py:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from gi.repository import Gtk
from os.path import abspath, dirname, join, realpath
import gettext
import locale

APP = 'myapp'
WHERE_AM_I = abspath(dirname(realpath(__file__)))
LOCALE_DIR = join(WHERE_AM_I, 'mo')

locale.setlocale(locale.LC_ALL, locale.getlocale())
locale.bindtextdomain(APP, LOCALE_DIR)
gettext.bindtextdomain(APP, LOCALE_DIR)
gettext.textdomain(APP)
_ = gettext.gettext

print('Using locale directory: {}'.format(LOCALE_DIR))

class MyApp(object):

    def __init__(self):
        # Build GUI
        self.builder = Gtk.Builder()
        self.glade_file = join(WHERE_AM_I, 'test.glade')
        self.builder.set_translation_domain(APP)
        self.builder.add_from_file(self.glade_file)

        print(_('File'))
        print(_('Edit'))
        print(_('Find'))
        print(_('View'))
        print(_('Document'))

        # Get objects
        go = self.builder.get_object
        self.window = go('window')

        # Connect signals
        self.builder.connect_signals(self)

        # Everything is ready
        self.window.show()

    def main_quit(self, widget):
        Gtk.main_quit()

if __name__ == '__main__':
    gui = MyApp()
    Gtk.main()

en.po:

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-06-15 15:18+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: test.glade:66
msgid "Document"
msgstr "Dokumentumok"

#: test.glade:30
msgid "Edit"
msgstr "Szerkesztés"

#: test.glade:18
msgid "File"
msgstr "Fájl"

#: test.glade:42
msgid "Find"
msgstr "Keresés"

#: test.glade:54
msgid "View"
msgstr "Nézet"

И файл myapp.mo находится в mo / hu_HU / LC_MESSAGES / myapp.mo

Проблема:

Строки в коде python переведены отлично (поэтому, когда я использую set_label, он тоже работает), но строки в файле glade не будут работать, даже если они переведены успешно. Значит, проблема не в загрузке локали.

Вывод:

Using locale directory: /home/daniel/Downloads/test/mo
Fájl
Szerkesztés
Keresés
Nézet
Dokumentumok

GUI: enter image description here

I Я использую ubuntu 20.04 с рабочим столом Gnome, а язык системы - целевой язык (hu_HU)

1 Ответ

1 голос
/ 16 июня 2020

Код работает для меня, когда я использую правильную кодировку вместо слова CHARSET в en.po - ie. UTF-8

"Content-Type: text/plain; charset=UTF-8\n". 

enter image description here


BTW:

Когда я использую в консоли / терминал

msgfmt -c en.po -o myapp.mo

, тогда он даже показывает предупреждение

en.po: warning: Charset "CHARSET" is not a portable encoding name.
                Message conversion to user's charset might not work.

и подтверждает, что CHARSET необходимо изменить.


Он также показывает предупреждения для другие значения - PACKAGE VERSION, YEAR-MO-DA HO:MI+ZONE, FULL NAME <EMAIL@ADDRESS>, LANGUAGE - но они не так важны.

po/en.po:7: warning: header field 'Project-Id-Version' still has the initial default value
po/en.po:7: warning: header field 'PO-Revision-Date' still has the initial default value
po/en.po:7: warning: header field 'Last-Translator' still has the initial default value
po/en.po:7: warning: header field 'Language-Team' still has the initial default value
po/en.po:7: warning: header field 'Language' still has the initial default value

EDIT:

кажется кодовыми наборами LC_ALL - locale.setlocale(locale.LC_ALL, ...), но в моей системе (Linux Mint 19.2 на основе Ubuntu 18.04) у меня также есть LANG=pl_PL.UTF-8, LANGUAGE=pl_PL:pl и, возможно, это имеет значение. Но я не могу установить его в коде locale.setlocale(locale.LANG, ...)

EDIT:

Вы подтвердили, что проблема была в переменной LANGUAGE.

Если LANGUAGE равно hu:en или hu, то .mo файл должен находиться в папке hu вместо hu_HU


BTW:

Я проверил, что у меня также есть папка hu в /usr/share/locale/, но когда я запускаю

locale -a | grep hu

, он показывает мне

hu_HU
hu_HU.UTF-8

И locale.setlocale(locale.LC_ALL, 'hu') дает мне ошибку, но locale.setlocale(locale.LC_ALL, 'hu_HU') работает без ошибок.

Я создал две папки с разными словами mo/hu_HU/... и mo/pl_PL/..., и даже если я использую locale.setlocale(locale.LC_ALL, 'hu_HU'), я вижу слова из pl_PL. Но когда я удаляю locale.setlocale(), я вижу английские sh слов.

Чтобы увидеть слова из hu_HU, мне нужно запустить его в консоли как

 LANGUAGE=hu_HU python test.py
...