Форум программистов, компьютерный форум, киберфорум
iamvic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
Путевые заметки в процессе познания Python и PyQt/PySide.
Помни - только тег CODE не портит код добавлением пробела в начало пустой строки.

К вопросу о локализации приложений PyQt.

Запись от iamvic размещена 12.06.2022 в 19:54
Показов 2431 Комментарии 4
Метки pyqt5, python, python 3, qt5

Так получилось, что тема Переименовать кнопку "setDetailedText", которую недавно поднял telnofff, как-то незаметно превратилась в Памятку. Насколько я понял, настоящей-то причиной появления этой темы было не желание заменить стандартный текст на этой злосчастной кнопке на какой свой, а то, что этот текст выдавался на английском вместо используемого в системе русского. Помогает решить эту проблему только явное указание транслятору использовать соответствущий файл перевода, уже установленный в системе при инсталляции PyQt. Ситуация получается достаточно странная - сам PyQt прекрасно знает, где расположены файлы переводов, но воспользоваться ими без прямого и явного указания не может. Чтобы проверить всегда ли это так, может быть надо что-то подкрутить в системе, чтоб не маяться с этой обязаловкой, и был написан такой пробничек:

locale_probe1.py
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/usr/bin/python3
# -*- coding: utf-8 -*-
#
# Locale Probe v0.01
 
import sys, platform
from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication, QMessageBox
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
 
    if len(sys.argv) > 1:
        # если есть хоть один параметр, то подсунем нужный ресурс
        # переводчику явным образом (хотя это вроде бы необязательно?)
        qtrn = QtCore.QTranslator()
        if QtCore.QLocale().name()[0:2] != 'en':
            qtrn.load(
                'qtbase_' + QtCore.QLocale().name()[0:2],
                QtCore.QLibraryInfo.location(
                    QtCore.QLibraryInfo.TranslationsPath))
            QApplication.installTranslator(qtrn)
 
    mbox = QMessageBox(
        QMessageBox.Question,
        'Требуется подтверждение',
        'Операционная система {!s}\n'
        'Python v.{!s}\n'
        'Qt v.{!s}\n'
        'PyQt v.{!s}\n\n'
        'Сейчас приложение будет закрыто. Чтобы узнать подробности'
        ' происходящего, нажмите кнопку {!s}',
        QMessageBox.Ignore | QMessageBox.Discard | QMessageBox.Abort)
    mbox.setDetailedText(
        'Если язык, на котором выполнены надписи на кнопках, отличается'
        ' от языка Вашей операционной системы, то попробуйте запустить'
        ' приложение с параметром, например, так:\n\n'
        'python {!s} 0'.format(sys.argv[0]))
 
    for button in mbox.buttons():
        if mbox.buttonRole(button) == QMessageBox.ActionRole:
            mbox.setText(mbox.text().format(
                platform.system(),
                sys.version,
                QtCore.QT_VERSION_STR,
                QtCore.PYQT_VERSION_STR,
                button.text()))
            break
 
    mbox.show()
    sys.exit(app.exec_())
Там всё прозрачно:
- запустили без параметра, значит действует по умолчанию в соответствии с настройками инсталлятора;
- запустили с параметром, значит файл переводов указывается явно, исходя из языка, используемого системой.

Результаты тестов в ближайшем окружении не обрадовали:
- в Windows всегда требуется явное указание файлов переводов,
- в Linux по разному - Lubuntu, Xubuntu и прочие ведут себя аналогично Windows, а вот для OpenSUSE явного указания не требуется. Значит можно что-то подкрутить в самой операционной системе - знать бы ещё что?..

убрано под спойлер для истории 19.06.2022 22:00:00
Кликните здесь для просмотра всего текста

Картинки:

Windows без параметра
Нажмите на изображение для увеличения
Название: locale_probe_a.png
Просмотров: 334
Размер:	16.5 Кб
ID:	7592

Windows c параметром
Нажмите на изображение для увеличения
Название: locale_probe_c.png
Просмотров: 312
Размер:	16.8 Кб
ID:	7593

Linux OpenSUSE без параметра
Нажмите на изображение для увеличения
Название: locale_probe_e.png
Просмотров: 310
Размер:	30.9 Кб
ID:	7594

добавлено 14.06.2022 22:20
Добавлю пример, родившийся по ходу обсуждения (картинки уж больно выразительны)
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/python3
# -*- coding: utf-8 -*-
#
# Locale Probe v0.02
 
import sys, platform
from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication, QFontDialog
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
 
    if len(sys.argv) > 1:
        # если есть хоть один параметр, то подсунем нужный ресурс
        # переводчику явным образом (хотя это вроде бы необязательно?)
        qtrn = QtCore.QTranslator()
        if QtCore.QLocale().name()[0:2] != 'en':
            qtrn.load(
                'qtbase_' + QtCore.QLocale().name()[0:2],
                QtCore.QLibraryInfo.location(
                    QtCore.QLibraryInfo.TranslationsPath))
            QApplication.installTranslator(qtrn)
 
    (newfont, ok) = QFontDialog.getFont(
        QApplication.font(), None, 'Выбор шрифта')
    sys.exit(0)
Windows без параметра
Нажмите на изображение для увеличения
Название: locale_probe_f.png
Просмотров: 300
Размер:	20.8 Кб
ID:	7602

Windows c параметром
Нажмите на изображение для увеличения
Название: locale_probe_g.png
Просмотров: 335
Размер:	21.1 Кб
ID:	7603


Очередной примерчик даёт всё-таки более наглядное представление о происходящем:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/usr/bin/python3
# -*- coding: utf-8 -*-
#
# Locale Probe v0.07
 
import sys
from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication, QFontDialog
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
 
    header = '({!s}:{!s}) Требуется добавить транслятор'
    tr_num = len(app.findChildren(QtCore.QTranslator))
    lang = QtCore.QLocale().name()[0:2]
    if tr_num > 0 or lang == 'en':
        header = '({!s}:{!s}) Добавлять транслятор не требуется'
 
    (newfont, ok) = QFontDialog.getFont(
        QApplication.font(), None, header.format(tr_num, lang))
 
# ---> начало кода, обязательного для употребления в __main__
    if (len(app.findChildren(QtCore.QTranslator)) == 0 and
        QtCore.QLocale().name()[0:2] != 'en'):
        # если язык операционной системы - английский или
        # какие-то трансляторы уже установлены, то добавлять
        # ещё один не требуется (однако, бывают случаи,
        # когда нужные файлы локализации просто отcутствуют
        # или они неполные, но это совсем другая песня)
 
        qtrn = QtCore.QTranslator(app)
        # подсунем транслятору ресурс, соответстующий языковым
        # настройкам операционной системы, явным образом
        if qtrn.load(
                'qtbase_' + QtCore.QLocale().name()[0:2],
                # грузим файл локализации qtbase_ru.qm
                QtCore.QLibraryInfo.location(
                    QtCore.QLibraryInfo.TranslationsPath)):
 
            app.installTranslator(qtrn)
# <--- конец кода, обязательного для употребления в __main__
 
            (newfont, ok) = QFontDialog.getFont(
                QApplication.font(),
                None,
                '({!s}:{!s}) Вид после добавления транслятора'.format(
                    len(app.findChildren(QtCore.QTranslator)),
                    QtCore.QLocale().name()[0:2]))
 
    sys.exit(0)
Windows
Нажмите на изображение для увеличения
Название: locale_probe_winru0.png
Просмотров: 329
Размер:	20.3 Кб
ID:	7605Нажмите на изображение для увеличения
Название: locale_probe_winru1.png
Просмотров: 282
Размер:	21.0 Кб
ID:	7606

OpenSUSE
Нажмите на изображение для увеличения
Название: locale_probe_423.png
Просмотров: 290
Размер:	33.2 Кб
ID:	7607

По цифиркам в заголовке окон хорошо видно, что создаваемый в секции __main__ экземпляр QApplication под Windows не содержит ни одного предварительно загруженного транслятора, в отличие от создаваемого под OpenSUSE. А вот выяснить какие файлы подгружают эти трансляторы, похоже, не удастся - "нету у нас методов против QTranslator-а"
Метки pyqt5, python, python 3, qt5
Размещено в Памятка
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 4
Комментарии
  1. Старый комментарий
    Аватар для kapbepucm
    Может быть OpenSUSE использует DE, для которого Qt более "родной"? Я так понимаю, проблема в том, что "не хочет" работать QObject::tr в некоторых случаях.
    Запись от kapbepucm размещена 14.06.2022 в 14:42 kapbepucm вне форума
  2. Старый комментарий
    Честно говоря, что там сделали в OpenSUSE мне представляется уже не особо важным Мне тут коллеги накидали своих результатов - там и PySide2 есть, и PySide6, Linux-ов разных - пучок. Практически везде ситуация одинаковая, если прямого и явного указания нет, то и перевода нет. "PyQt - птица гордая, пока не пнёшь - будет каркать на тарабарском" Некоторое количество затесавшихся OpenSUSE - это экзотика на фоне всего остального...

    И как-то не просматривается пока другого общего решения, кроме "обязательных ужимок и прыжков" с явным указанием транслятору файла переводов . А под раздачу-то попадают как раз самые навороченные и ходовые из стандартных диалогов (QColorDialog, QFileDialog, QFontDialog, QMessageBox) и QDialogButtonBox.
    Запись от iamvic размещена 14.06.2022 в 17:40 iamvic вне форума
  3. Старый комментарий
    Решение-то весьма неочевидное. Самостоятельно прийти к пониманию происходящего можно, только имея неслабую подготовку и опыт. Чтобы осознать, что стандартные диалоги - это продукт, созданный с применением инструментов системы разделения труда (один кодит, другой рисует, третий переводит и т.д.), требуется перепробовать все эти инструменты (QtDesiner, QtLinguist и прочее), посоздавать свои файлы переводов, научиться их подключать и т.д. И только потом в голове щёлкнет и появится понимание чего не хватает этим стандартным диалогам для работы.

    Наверное, было бы совсем неплохо, если бы в разделе Python: GUI, графика была тема, например, "Важно: PyQt: неочевидные решения" куда можно было бы сваливать информашки такого рода. Это ж, наверное, не единственный и неповторимый в своём роде случай?
    Запись от iamvic размещена 16.06.2022 в 15:50 iamvic вне форума
  4. Старый комментарий
    Запись от iamvic размещена 21.06.2022 в 11:00 iamvic вне форума
 
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru