Moin,
ich bin mit PyQt6 unterwegs aber das sollte bei PySide6 ähnlich sein.
Alle zu übersetzende Texte müssen ein "self.tr" davor bekommen wie z.B.
Anschließend wird aus den .py und, falls vorhanden, den .ui Dateien die .TS Datei erzeugt
Code: Alles auswählen
# für PyQt6
qt6-tools lupdate main.py ui/main.ui -ts example_de.ts
# für PySide6 ?
pyside6-lupdate main.py ui/main.ui -ts example_de.ts
Nun mußt du übersetzen, also den Linguist starten, dort die TS Datei öffnen und den Text in die gewünschte Sprache(n) übersetzen
Code: Alles auswählen
# für PyQt6
qt6-tools linguist
# für PySide6 ?
pyside6-linguist
Ist das getan, speicherst du die TS Datei und übersetzt sie ins Binärformat
Code: Alles auswählen
# für PyQt6
qt6-tools lrelease example_de.ts -qm example_de.qm
# für PySide6 ?
pyside6-lrelease example_de.ts -qm example_de.qm
Die Übersetzungen müssen jetzt zur Laufzeit in die QTranslator-Klasse geladen werden
Code: Alles auswählen
path = QLibraryInfo.path(QLibraryInfo.LibraryPath.TranslationsPath)
translator = QTranslator(app)
if translator.load(QLocale.system(), 'qtbase', '_', path):
app.installTranslator(translator)
Das war mein Ausgangspunkt und das sollte so ähnlich auch unter PySide6 laufen.
Hier mal ein kleines Beispiel für eine GUI, die auf Knopfdruck die Sprache wechselt.
Die .qm Dateien mußt du dir, wie oben beschrieben, erzeugen denn die kann ich hier nicht als Code anzeigen.
In der settings.txt wird die gewählte Sprache für den nächsten Start der App gespeichert, kann also beim ersten Start leer sein.
Code: Alles auswählen
# Dateiname: de.ts
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="de_DE" sourcelanguage="en_GB">
<context>
<name>Main</name>
<message>
<location filename="../main.py" line="15"/>
<location filename="../main.py" line="51"/>
<source>Main | English</source>
<translation>Main | Deutsch</translation>
</message>
<message>
<location filename="../main.py" line="20"/>
<location filename="../main.py" line="53"/>
<source>Change Language</source>
<translation>Sprache ändern</translation>
</message>
<message>
<location filename="../main.py" line="22"/>
<location filename="../main.py" line="52"/>
<source>English</source>
<translation>Deutsch</translation>
</message>
<message>
<location filename="../main.py" line="59"/>
<source>Select Language</source>
<translation>Sprache wählen</translation>
</message>
<message>
<location filename="../main.py" line="59"/>
<source>Language:</source>
<translation>Sprache:</translation>
</message>
</context>
</TS>
Code: Alles auswählen
# Dateiname: en.ts
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="en_GB" sourcelanguage="en_GB">
<context>
<name>Main</name>
<message>
<location filename="../main.py" line="15"/>
<location filename="../main.py" line="51"/>
<source>Main | English</source>
<translation>Main | English</translation>
</message>
<message>
<location filename="../main.py" line="20"/>
<location filename="../main.py" line="53"/>
<source>Change Language</source>
<translation>Change Language</translation>
</message>
<message>
<location filename="../main.py" line="22"/>
<location filename="../main.py" line="52"/>
<source>English</source>
<translation>English</translation>
</message>
<message>
<location filename="../main.py" line="59"/>
<source>Select Language</source>
<translation>Select Language</translation>
</message>
<message>
<location filename="../main.py" line="59"/>
<source>Language:</source>
<translation>Language:</translation>
</message>
</context>
</TS>
Code: Alles auswählen
# main.py
import sys
from PySide6.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QLabel, QInputDialog
from PySide6.QtCore import QTranslator, QLibraryInfo, QLocale
class Main(QWidget):
def __init__(self):
super().__init__()
self.translator = QTranslator()
self.language_file = 'settings.txt'
self.initUI()
self.loadLanguageSetting()
def initUI(self):
self.setWindowTitle(self.tr('Main | English'))
layout = QVBoxLayout()
input_layout = QVBoxLayout()
self.language_button = QPushButton(self.tr('Change Language'), self)
self.language_button.clicked.connect(self.changeLanguage)
self.label = QLabel(self.tr('English'), self)
input_layout.addWidget(self.language_button)
input_layout.addWidget(self.label)
layout.addLayout(input_layout)
self.setLayout(layout)
self.show()
def saveLanguageSetting(self, language):
with open(self.language_file, 'w') as file:
file.write(language)
def loadLanguageSetting(self):
try:
with open(self.language_file, 'r') as file:
language = file.read().strip()
self.switchTranslator(language)
except FileNotFoundError:
self.switchTranslator('en')
def switchTranslator(self, language):
if language == 'en':
self.translator.load(QLibraryInfo.path(QLibraryInfo.LibraryPath.TranslationsPath))
elif language == 'de':
self.translator.load('translations/de.qm')
QApplication.instance().installTranslator(self.translator)
self.retranslateUi()
def retranslateUi(self):
self.setWindowTitle(self.tr('Main | English'))
self.label.setText(self.tr('English'))
self.language_button.setText(self.tr('Change Language'))
def changeLanguage(self):
languages = ['English (EN)', 'Deutsch (DE)']
current_language = 'English (EN)'
language, ok = QInputDialog.getItem(self, self.tr('Select Language'), self.tr('Language:'), languages, languages.index(current_language), False)
if ok and language:
if language == 'English (EN)':
self.saveLanguageSetting('en')
self.switchTranslator('en')
elif language == 'Deutsch (DE)':
self.saveLanguageSetting('de')
self.switchTranslator('de')
if __name__ == '__main__':
app = QApplication(sys.argv)
path = QLibraryInfo.path(QLibraryInfo.LibraryPath.TranslationsPath)
translator = QTranslator(app)
if translator.load(QLocale.system(), 'qtbase', '_', path):
app.installTranslator(translator)
gui = Main()
gui.show()
sys.exit(app.exec())