mirror of
https://github.com/283375/arcaea-offline-pyside-ui.git
synced 2025-07-01 04:16:26 +00:00
refactor: settings & language
This commit is contained in:
66
ui/extends/shared/language.py
Normal file
66
ui/extends/shared/language.py
Normal 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)
|
@ -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)
|
||||
|
Reference in New Issue
Block a user