77 lines
2.4 KiB
Python
77 lines
2.4 KiB
Python
import typing
|
|
from typing import Callable
|
|
|
|
from PyQt6.QtCore import Qt, QLocale
|
|
from PyQt6.QtWidgets import QWidget, QLabel, QVBoxLayout, QComboBox, QPushButton
|
|
|
|
from source import assets_path, translate, ui
|
|
|
|
|
|
class LanguageSelection(QWidget):
|
|
def __init__(self, parent: QWidget, after: Callable):
|
|
super().__init__(parent=parent)
|
|
|
|
self.after = after
|
|
|
|
# layout
|
|
self._layout = QVBoxLayout()
|
|
self.setLayout(self._layout)
|
|
|
|
# title
|
|
self.title = QLabel()
|
|
self._layout.addWidget(self.title)
|
|
self.title.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
|
|
|
# language selection
|
|
self.select_language = QComboBox()
|
|
self._layout.addWidget(self.select_language)
|
|
|
|
language_default = QLocale().language() # get the default locale
|
|
|
|
for i, language_file in enumerate((assets_path / "language").glob("*.qm")):
|
|
# add every translated language to the selection
|
|
|
|
language_code: str = language_file.stem
|
|
language = QLocale.codeToLanguage(language_code, QLocale.LanguageCodeType.ISO639)
|
|
|
|
self.select_language.addItem(language.name, language_code)
|
|
|
|
# if the added language is the default one, select it directly
|
|
if language == language_default:
|
|
self.select_language.setCurrentIndex(i)
|
|
|
|
self.select_language.currentIndexChanged.connect(self.refresh_language) # NOQA: connect exist
|
|
|
|
# start button
|
|
self.button_start = QPushButton()
|
|
self._layout.addWidget(self.button_start)
|
|
self.button_start.clicked.connect(self.start) # NOQA: connect exist
|
|
|
|
# refresh the texts
|
|
self.refresh_language()
|
|
|
|
super().show()
|
|
|
|
def refresh_language(self):
|
|
language_code = self.select_language.currentData()
|
|
|
|
# load the correct translation in the window
|
|
window = typing.cast(ui.SurveyWindow, self.window())
|
|
window.translator.load(str(assets_path / f"language/{language_code}.qm"))
|
|
|
|
# apply the language on the custom translator
|
|
translate.set_language(language_code)
|
|
|
|
# refresh the texts
|
|
self.retranslate()
|
|
|
|
def retranslate(self):
|
|
self.title.setText(self.tr("SELECT YOUR LANGUAGE"))
|
|
self.button_start.setText(self.tr("START"))
|
|
|
|
def start(self) -> None:
|
|
# call the after event
|
|
self.after()
|
|
|
|
# delete the language selection
|
|
self.deleteLater()
|