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:

self.tr('this is something for translation')
Standardem jest tworzenie aplikacji w języku angielskim, który później jest tłumaczony na inne języki.

Generowanie plików tłumaczeń

  • Stwórz plik .pro w katalogu aplikacji PyQt4 o zawartości wg wzoru:
    SOURCES = run.py klasa.py klasa.ui
    
    TRANSLATIONS = nazwaAplikacji_pl.ts
    
    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).
  • 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_())

Pobierz źródła

Pobierz źródła
RkBlog

PyQt, 7 September 2009

Comment article
Comment article RkBlog main page Search RSS Contact