Найти - Пользователи
Полная версия: pyQT4: как правильно локализовать приложение?
Начало » GUI » pyQT4: как правильно локализовать приложение?
1 2
The gray Cardinal
Подскажите пожалуйста статью, где было бы описано, как правильно спроектировать приложение на pyQT4 так, чтобы его можно было без проблем локализовать (чтобы оно поддерживало произвольное количество языков).
ZZZ
Хм… В Qt есть замечательная система локализации, которая очень легко вписывается в любую архитектуру. Я даже занимался как-то переделкой программы, чтобы она поддерживала смену языка – всё очень элементарно.
gmorgunov
The gray Cardinal
Подскажите пожалуйста статью, где было бы описано, как правильно спроектировать приложение на pyQT4 так, чтобы его можно было без проблем локализовать (чтобы оно поддерживало произвольное количество языков).
Можно посмотреть: “Rapid GUI Programming with Python and Qt” Mark Summerfield стр. 512
Правда, где скачивал, я уже не помню. :/

Можно здесь:http://www.prog.org.ru/topic_8030_0.html. Думаю перевести С++ в Python для вас будет несложно :)


C уважением gmorgunov.
The gray Cardinal
ZZZ
В Qt есть замечательная система локализации…
Мне этого заявления мало :). Нужно ткнуть носом в небольшой конкретный туториал, наверное. Просто понять общие принципы.
Ну, скажем, писать в коде
label = QtGui.QLabel(u'Текст метки по-русски')
глупо, видимо, так?
Т.е., например, я хочу иметь более-менее стандартные файлы локализации, в которых будут храниться все названия моих меток.
Что конкретно почитать, чтобы врубиться во всё это?
The gray Cardinal
gmorgunov
Там конкретный вопрос про вывод на консоль Windows русских строк. Это не совсем то, о чём я спрашиваю.
gmorgunov
The gray Cardinal
gmorgunov
Там конкретный вопрос про вывод на консоль Windows русских строк. Это не совсем то, о чём я спрашиваю.
Вообще-то метод tr() применим ко всем объектам, содержащим текст(Qt4 - Windows,Linux)

В PyQt4 это выглядит вот так экзотически:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtCore,QtGui

if __name__=="__main__":
app = QtGui.QApplication(sys.argv)

QtCore.QTextCodec.setCodecForTr(QtCore.QTextCodec.codecForName("UTF-8"))

label = QtGui.QLabel()
label.setText(QtCore.QCoreApplication.translate(""," Зыы "))
label.show()

sys.exit(app.exec_())
Выводы делайте сами :)
The gray Cardinal
gmorgunov
Спасибо, хорошо. Но мало :).
Метод translate() опрашивает файлы перевода. Что это за файлы (формат), где должны лежать? Сводится ли весь процесс локализации только к изготовлению таких файлов и использованию функции translate()?
gmorgunov
Троли сами пишут здесь:http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/pyqt4ref.html#internationa
The PyQt behaviour is unsatisfactory and may be changed in the future
плохо мол сделали … Я на это забил и пользую уникод. :)
The gray Cardinal
Тогда конкретный вопрос. Допустим, есть такой ts-файл (пример пригоден для работы в Qt Linguist):
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS><TS version="1.1" language="ru_RU">
<defaultcodec></defaultcodec>
<context>
<name>testApp</name>
<message>
<source>Hello, World!</source>
<translation>Привет, мир!</translation>
</message>
</context>
</TS>
С помощью утилиты lrelease превращаю его в файл testApp_ru_RU.qm. Далее пишу такой код (пример пригоден для запуска):
#!/usr/bin/python
# -*- coding: utf-8 -*-
from PyQt4 import QtCore

class MyTranslator(QtCore.QTranslator):
def __init__(self, parent=None):
QtCore.QTranslator.__init__(self, parent)
def translate(self, context, sourceText):
res = QtCore.QTranslator.translate(self, context, sourceText)
if len(res) == 0:
res = QtCore.QString(sourceText)
return res

tr = MyTranslator()
tr.load('testApp_ru_RU.qm')
print tr.translate('testApp', 'Hello, World!').toUtf8()
print tr.translate('testApp1', 'Hello, World!').toUtf8()
print tr.translate('testApp', 'Hello, World').toUtf8()
Класс MyTranslator мне понадобился для того, чтобы сделать наивную проверку “if len(res) == 0”, т.к. метод translate() класса QtCore.QTranslator возвращает пустую строку, если перевод не удался (а я хочу получить в этом случае исходную строку).
Это допустимый метод работы?
Что здесь неправильно / плохо?
gmorgunov
The gray Cardinal
Проверил. Вроде все нормально, работает.
Но. Почему она транслирует только в первый раз?
Т.е. на:
tr = MyTranslator()
tr.load('testApp_ru_RU.qm')
print tr.translate('testApp', 'Hello, World!').toUtf8()
print tr.translate('testApp1', 'Hello, World!').toUtf8()
print tr.translate('testApp', 'Hello, World').toUtf8()

tr1 = MyTranslator()
tr1.load('testApp_ru_RU.qm')
print tr1.translate('testApp', 'Hello, World').toUtf8()
Выдает:
Привет, мир!
Hello, World!
Hello, World
Hello, World

И где восклицательные знаки?

А так, конечно, надо эту методу запомнить(сохранить у себя- пригодится) :)

P.S. Проверил, с koi8-r не работает(метода нет)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB