Wielojęzyczny interfejs aplikacji PyQt4
Biblioteka Qt wykorzystuje własny system wielojęzycznego interfejsu poprzez Qt Linguist. W PyQt4 można z niego korzystać (lub jak ktoś bardzo chce to z gettexta) przy tworzeniu wielojęzycznych interfejsów.
Oznaczanie fraz do tłumaczenia
Ogólnie wszystkie napisy użyte w interfejsie (Qt Designer) są oznaczane do tłumaczenia. Jeżeli chcemy we własnym kodzie oznaczyć tekst do tłumaczenia to używamy metody tr:
Generowanie plików tłumaczeń
- Stwórz plik .pro w katalogu aplikacji PyQt4 o zawartości wg wzoru:
Gdzie w SOURCES podajemy pliki, z których mają zostać wydobyte frazy do tłumaczeń. TRANSLATIONS to lista plików tłumaczeń Qt Linguist .ts jakie mają zostać wygenerowane, zaktualizowane (nazwaAplikacji_LANG.ts).
SOURCES = run.py klasa.py klasa.ui TRANSLATIONS = nazwaAplikacji_pl.ts
- Generujemy pliki .ts za pomocą pylupdate4:
pylupdate4 nazwapliku.pro
Tłumaczenie
Plik ts otwieramy w Qt Linguist - aplikacji dostępnej wraz z Qt. Tłumaczymy poszczególne frazy, zapisujemy i w menu "Plik" klikamy opcję Wydaj, co spowoduje wygenerowanie wynikowego tłumaczenia w formacie qm używalnego przez system wielojęzyczności.
Wykorzystanie plików tłumaczeń w aplikacji
Żeby aplikacja mogła skorzystać z tłumaczeń należy zmodyfikować sposób jej uruchamiania, oraz udostępnić gdzieś pliki tłumaczeń (zaleca się dodanie ich jako zasobów). Oto przykładowa klasa rozruchowa wykorzystująca system wielojęzyczności:
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtCore, QtGui
from test import Ui_MainWindow
from resources_rc import *
class testApp(QtGui.QMainWindow):
def __init__(self, parent=None):
super(testApp, self).__init__(parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
## STARE
#if __name__ == "__main__":
#app = QtGui.QApplication(sys.argv)
#myapp = testApp()
#myapp.show()
#sys.exit(app.exec_())
## NOWE
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
# domyślny systemowy język
locale = QtCore.QLocale.system().name()
qtTranslator = QtCore.QTranslator()
# próbujemy załadować tłumaczenie dla tego języka
# które jest w zasobach w przedrostku "tra" jako test_pl.qm -- dla polskiego języka
if qtTranslator.load("test_" + locale, ":tra/"):
app.installTranslator(qtTranslator)
myapp = testApp()
myapp.show()
sys.exit(app.exec_())
Comment article