refactor: settings & language

This commit is contained in:
2023-09-08 01:01:21 +08:00
parent 7bc8780cb0
commit 06ac59091f
23 changed files with 990 additions and 533 deletions

View File

@ -0,0 +1,66 @@
from PySide6.QtCore import QEvent, QLibraryInfo, QLocale, QObject, QTranslator
from PySide6.QtWidgets import QApplication
INSTALLED_TRANSLATORS = []
def changeAppLanguage(
locale: QLocale,
fallbackLocale: QLocale = QLocale("en_US"),
):
app = QApplication.instance()
for translator in INSTALLED_TRANSLATORS:
app.removeTranslator(translator)
translator = QTranslator()
translatorLoadSuccess = translator.load(locale, "", "", ":/lang/")
if not translatorLoadSuccess:
translator.load(fallbackLocale, "", "", ":/lang/")
qtTranslator = QTranslator()
qtTranslatorLoadSuccess = qtTranslator.load(
locale,
"qt",
"_",
QLibraryInfo.path(QLibraryInfo.LibraryPath.TranslationsPath),
)
if not qtTranslatorLoadSuccess:
qtTranslator.load(
fallbackLocale,
"qt",
"_",
QLibraryInfo.path(QLibraryInfo.LibraryPath.TranslationsPath),
)
app.installTranslator(translator)
INSTALLED_TRANSLATORS.append(translator)
app.installTranslator(qtTranslator)
INSTALLED_TRANSLATORS.append(qtTranslator)
def localeToCode(locale: QLocale):
code = QLocale.languageToCode(locale.language())
country = locale.country()
if country and country != QLocale.Country.AnyCountry:
code += f"_{QLocale.countryToCode(country)}"
return code
def localeToFullName(locale: QLocale):
ret = QLocale.languageToString(locale.language())
country = locale.country()
if country and country != QLocale.Country.AnyCountry:
ret += f" ({QLocale.countryToString(country)})"
return ret
class LanguageChangeEventFilter(QObject):
def eventFilter(self, watched: QObject, event: QEvent) -> bool:
if (
event.type() == QEvent.Type.LanguageChange
and hasattr(watched, "retranslateUi")
and callable(watched.retranslateUi)
):
watched.retranslateUi(watched)
return super().eventFilter(watched, event)

View File

@ -1,5 +1,6 @@
import sys
from PySide6.QtCore import QSettings, QFileInfo
from PySide6.QtCore import QFileInfo, QSettings
__all__ = [
"DATABASE_URL",
@ -8,11 +9,14 @@ __all__ = [
"TESSERACT_FILE",
"KNN_MODEL_FILE",
"SIFT_DATABASE_FILE",
"ANDREAL_FOLDER",
"ANDREAL_EXECUTABLE",
"Settings",
]
# a key without slashes will appear in the "General" section
# see https://doc.qt.io/qt-6/qsettings.html#Format-enum for details
LANGUAGE = "Language"
DATABASE_URL = "DatabaseUrl"
DEVICES_JSON_FILE = "Ocr/DevicesJsonFile"
@ -21,7 +25,7 @@ TESSERACT_FILE = "Ocr/TesseractFile"
KNN_MODEL_FILE = "Ocr/KnnModelFile"
SIFT_DATABASE_FILE = "Ocr/SiftDatabaseFile"
ANDREAL_PATH = "Andreal/AndrealFolderPath"
ANDREAL_FOLDER = "Andreal/AndrealFolder"
ANDREAL_EXECUTABLE = "Andreal/AndrealExecutable"
@ -44,6 +48,12 @@ class Settings(QSettings):
self.setValue(key, None)
self.sync()
def language(self):
return self._strItem(LANGUAGE)
def setLanguage(self, value: str):
self._setStrItem(LANGUAGE, value)
def databaseUrl(self):
return self._strItem(DATABASE_URL)
@ -94,3 +104,21 @@ class Settings(QSettings):
def resetSiftDatabaseFile(self):
self._resetStrItem(SIFT_DATABASE_FILE)
def andrealFolder(self):
return self._strItem(ANDREAL_FOLDER)
def setAndrealFolder(self, value: str):
self._setStrItem(ANDREAL_FOLDER, value)
def resetAndrealFolder(self):
self._resetStrItem(ANDREAL_FOLDER)
def andrealExecutable(self):
return self._strItem(ANDREAL_EXECUTABLE)
def setAndrealExecutable(self, value: str):
self._setStrItem(ANDREAL_EXECUTABLE, value)
def resetAndrealExecutable(self):
self._resetStrItem(ANDREAL_EXECUTABLE)