Rare: Decouple Rare's locale from legendary's
* Instead of using legendary's locale as fallback, use system't locale as default. * Do not hardcode language names and countries but use QLocale on the translation filenames.
This commit is contained in:
parent
c5c581eb6e
commit
284543a6d9
|
@ -9,6 +9,7 @@ from PyQt5.QtCore import QThreadPool, QTimer, pyqtSlot, Qt
|
||||||
from PyQt5.QtWidgets import QApplication, QMessageBox
|
from PyQt5.QtWidgets import QApplication, QMessageBox
|
||||||
from requests import HTTPError
|
from requests import HTTPError
|
||||||
|
|
||||||
|
from rare.models.options import options
|
||||||
from rare.components.dialogs.launch_dialog import LaunchDialog
|
from rare.components.dialogs.launch_dialog import LaunchDialog
|
||||||
from rare.components.main_window import MainWindow
|
from rare.components.main_window import MainWindow
|
||||||
from rare.shared import RareCore
|
from rare.shared import RareCore
|
||||||
|
@ -45,8 +46,8 @@ class Rare(RareApp):
|
||||||
self.signals = RareCore.instance().signals()
|
self.signals = RareCore.instance().signals()
|
||||||
self.core = RareCore.instance().core()
|
self.core = RareCore.instance().core()
|
||||||
|
|
||||||
lang = self.settings.value("language", self.core.language_code, type=str)
|
language = self.settings.value(*options.language)
|
||||||
self.load_translator(lang)
|
self.load_translator(language)
|
||||||
|
|
||||||
# set Application name for settings
|
# set Application name for settings
|
||||||
self.main_window: Optional[MainWindow] = None
|
self.main_window: Optional[MainWindow] = None
|
||||||
|
|
|
@ -23,17 +23,6 @@ from rare.utils.paths import create_desktop_link, desktop_link_path, log_dir, de
|
||||||
|
|
||||||
logger = getLogger("RareSettings")
|
logger = getLogger("RareSettings")
|
||||||
|
|
||||||
languages = [("en", "English"),
|
|
||||||
("de", "Deutsch"),
|
|
||||||
("fr", "Français"),
|
|
||||||
("zh-Hans", "Simplified Chinese"),
|
|
||||||
("zh_TW", "Chinese Taiwan"),
|
|
||||||
("pt_BR", "Portuguese (Brazil)"),
|
|
||||||
("ca", "Catalan"),
|
|
||||||
("ru", "Russian"),
|
|
||||||
("tr", "Turkish"),
|
|
||||||
("uk", "Ukrainian")]
|
|
||||||
|
|
||||||
|
|
||||||
class RareSettings(QWidget, Ui_RareSettings):
|
class RareSettings(QWidget, Ui_RareSettings):
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
|
@ -42,20 +31,19 @@ class RareSettings(QWidget, Ui_RareSettings):
|
||||||
self.core = LegendaryCoreSingleton()
|
self.core = LegendaryCoreSingleton()
|
||||||
self.settings = QSettings(self)
|
self.settings = QSettings(self)
|
||||||
|
|
||||||
language = self.settings.value("language", self.core.language_code, type=str)
|
|
||||||
|
|
||||||
# Select lang
|
# Select lang
|
||||||
self.lang_select.addItems([i[1] for i in languages])
|
language = self.settings.value(*options.language)
|
||||||
if language in get_translations():
|
self.lang_select.addItem(self.tr("System default"), "")
|
||||||
index = [lang[0] for lang in languages].index(language)
|
for locale, title in get_translations():
|
||||||
|
self.lang_select.addItem(title, locale)
|
||||||
|
if (index := self.lang_select.findData(language, Qt.UserRole)) > 0:
|
||||||
self.lang_select.setCurrentIndex(index)
|
self.lang_select.setCurrentIndex(index)
|
||||||
else:
|
else:
|
||||||
self.lang_select.setCurrentIndex(0)
|
self.lang_select.setCurrentIndex(0)
|
||||||
self.lang_select.currentIndexChanged.connect(self.update_lang)
|
self.lang_select.currentIndexChanged.connect(self.on_lang_changed)
|
||||||
|
|
||||||
colors = get_color_schemes()
|
self.color_select.addItems(get_color_schemes())
|
||||||
self.color_select.addItems(colors)
|
if (color := self.settings.value("color_scheme")) in get_color_schemes():
|
||||||
if (color := self.settings.value("color_scheme")) in colors:
|
|
||||||
self.color_select.setCurrentIndex(self.color_select.findText(color))
|
self.color_select.setCurrentIndex(self.color_select.findText(color))
|
||||||
self.color_select.setDisabled(False)
|
self.color_select.setDisabled(False)
|
||||||
self.style_select.setDisabled(True)
|
self.style_select.setDisabled(True)
|
||||||
|
@ -63,9 +51,8 @@ class RareSettings(QWidget, Ui_RareSettings):
|
||||||
self.color_select.setCurrentIndex(0)
|
self.color_select.setCurrentIndex(0)
|
||||||
self.color_select.currentIndexChanged.connect(self.on_color_select_changed)
|
self.color_select.currentIndexChanged.connect(self.on_color_select_changed)
|
||||||
|
|
||||||
styles = get_style_sheets()
|
self.style_select.addItems(get_style_sheets())
|
||||||
self.style_select.addItems(styles)
|
if (style := self.settings.value("style_sheet")) in get_style_sheets():
|
||||||
if (style := self.settings.value("style_sheet")) in styles:
|
|
||||||
self.style_select.setCurrentIndex(self.style_select.findText(style))
|
self.style_select.setCurrentIndex(self.style_select.findText(style))
|
||||||
self.style_select.setDisabled(False)
|
self.style_select.setDisabled(False)
|
||||||
self.color_select.setDisabled(True)
|
self.color_select.setDisabled(True)
|
||||||
|
@ -129,7 +116,7 @@ class RareSettings(QWidget, Ui_RareSettings):
|
||||||
self.desktop_link_btn.clicked.connect(self.create_desktop_link)
|
self.desktop_link_btn.clicked.connect(self.create_desktop_link)
|
||||||
self.startmenu_link_btn.clicked.connect(self.create_start_menu_link)
|
self.startmenu_link_btn.clicked.connect(self.create_start_menu_link)
|
||||||
|
|
||||||
self.log_dir_open_button.clicked.connect(self.open_dir)
|
self.log_dir_open_button.clicked.connect(self.open_directory)
|
||||||
self.log_dir_clean_button.clicked.connect(self.clean_logdir)
|
self.log_dir_clean_button.clicked.connect(self.clean_logdir)
|
||||||
|
|
||||||
# get size of logdir
|
# get size of logdir
|
||||||
|
@ -212,7 +199,8 @@ class RareSettings(QWidget, Ui_RareSettings):
|
||||||
self.color_select.setDisabled(False)
|
self.color_select.setDisabled(False)
|
||||||
set_style_sheet("")
|
set_style_sheet("")
|
||||||
|
|
||||||
def open_dir(self):
|
@staticmethod
|
||||||
|
def open_directory():
|
||||||
if platform.system() == "Windows":
|
if platform.system() == "Windows":
|
||||||
os.startfile(log_dir()) # pylint: disable=E1101
|
os.startfile(log_dir()) # pylint: disable=E1101
|
||||||
else:
|
else:
|
||||||
|
@ -223,5 +211,9 @@ class RareSettings(QWidget, Ui_RareSettings):
|
||||||
self.settings.setValue(options.save_size.key, self.save_size.isChecked())
|
self.settings.setValue(options.save_size.key, self.save_size.isChecked())
|
||||||
self.settings.remove(options.window_size.key)
|
self.settings.remove(options.window_size.key)
|
||||||
|
|
||||||
def update_lang(self, i: int):
|
def on_lang_changed(self, index: int):
|
||||||
self.settings.setValue("language", languages[i][0])
|
if not index:
|
||||||
|
self.settings.remove(options.language.key)
|
||||||
|
return
|
||||||
|
language = self.lang_select.itemData(index, Qt.UserRole)
|
||||||
|
self.settings.setValue(options.language.key, language)
|
||||||
|
|
|
@ -19,7 +19,7 @@ class WineSettings(QGroupBox):
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
super(WineSettings, self).__init__(parent=parent)
|
super(WineSettings, self).__init__(parent=parent)
|
||||||
self.setTitle(self.tr("Wine Setings"))
|
self.setTitle(self.tr("Wine settings"))
|
||||||
|
|
||||||
self.core = LegendaryCoreSingleton()
|
self.core = LegendaryCoreSingleton()
|
||||||
self.signals = GlobalSignalsSingleton()
|
self.signals = GlobalSignalsSingleton()
|
||||||
|
@ -79,7 +79,6 @@ class WineSettings(QGroupBox):
|
||||||
raise RuntimeError
|
raise RuntimeError
|
||||||
config.save_wine_prefix(self.app_name, path)
|
config.save_wine_prefix(self.app_name, path)
|
||||||
self.environ_changed.emit("WINEPREFIX")
|
self.environ_changed.emit("WINEPREFIX")
|
||||||
self.signals.application.prefix_updated.emit()
|
|
||||||
|
|
||||||
def load_exec(self) -> str:
|
def load_exec(self) -> str:
|
||||||
if self.app_name is None:
|
if self.app_name is None:
|
||||||
|
|
|
@ -143,8 +143,8 @@ class RareLauncher(RareApp):
|
||||||
return
|
return
|
||||||
self.rgame = RareGameSlim(self.core, game)
|
self.rgame = RareGameSlim(self.core, game)
|
||||||
|
|
||||||
lang = self.settings.value("language", self.core.language_code, type=str)
|
language = self.settings.value(*options.language)
|
||||||
self.load_translator(lang)
|
self.load_translator(language)
|
||||||
|
|
||||||
if QSettings(self).value(*options.log_games):
|
if QSettings(self).value(*options.log_games):
|
||||||
self.console = ConsoleDialog(game.app_title)
|
self.console = ConsoleDialog(game.app_title)
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import locale
|
||||||
import platform as pf
|
import platform as pf
|
||||||
from argparse import Namespace
|
from argparse import Namespace
|
||||||
from typing import Any, Type
|
from typing import Any, Type
|
||||||
|
@ -24,6 +25,7 @@ class Defaults(Namespace):
|
||||||
exclude_non_asset = Value(key="exclude_non_asset", default=False, dtype=bool)
|
exclude_non_asset = Value(key="exclude_non_asset", default=False, dtype=bool)
|
||||||
exclude_entitlements = Value(key="exclude_entitlements", default=False, dtype=bool)
|
exclude_entitlements = Value(key="exclude_entitlements", default=False, dtype=bool)
|
||||||
|
|
||||||
|
language = Value(key="language", default=locale.getlocale()[0], dtype=str)
|
||||||
sys_tray = Value(key="sys_tray", default=True, dtype=bool)
|
sys_tray = Value(key="sys_tray", default=True, dtype=bool)
|
||||||
auto_update = Value(key="auto_update", default=False, dtype=bool)
|
auto_update = Value(key="auto_update", default=False, dtype=bool)
|
||||||
auto_sync_cloud = Value(key="auto_sync_cloud", default=False, dtype=bool)
|
auto_sync_cloud = Value(key="auto_sync_cloud", default=False, dtype=bool)
|
||||||
|
|
|
@ -14,11 +14,11 @@ class GlobalSignals:
|
||||||
# str: title, str: body
|
# str: title, str: body
|
||||||
notify = pyqtSignal(str, str)
|
notify = pyqtSignal(str, str)
|
||||||
# none
|
# none
|
||||||
prefix_updated = pyqtSignal()
|
|
||||||
# none
|
|
||||||
update_tray = pyqtSignal()
|
update_tray = pyqtSignal()
|
||||||
# none
|
# none
|
||||||
update_statusbar = pyqtSignal()
|
update_statusbar = pyqtSignal()
|
||||||
|
# str: locale
|
||||||
|
# change_translation = pyqtSignal(str)
|
||||||
|
|
||||||
class GameSignals(QObject):
|
class GameSignals(QObject):
|
||||||
# model
|
# model
|
||||||
|
|
|
@ -1,16 +1,15 @@
|
||||||
import os
|
import os
|
||||||
from enum import IntEnum
|
from enum import IntEnum
|
||||||
from logging import getLogger
|
from logging import getLogger
|
||||||
from typing import List, Union, Type, Dict
|
from typing import Union, Type, Dict, Tuple, Iterable
|
||||||
|
|
||||||
import qtawesome
|
import qtawesome
|
||||||
import requests
|
|
||||||
from PyQt5.QtCore import (
|
from PyQt5.QtCore import (
|
||||||
QObject,
|
QObject,
|
||||||
QSettings,
|
QSettings,
|
||||||
QFile,
|
QFile,
|
||||||
QDir,
|
QDir,
|
||||||
Qt,
|
Qt, QLocale,
|
||||||
)
|
)
|
||||||
from PyQt5.QtGui import QPalette, QColor, QFontMetrics
|
from PyQt5.QtGui import QPalette, QColor, QFontMetrics
|
||||||
from PyQt5.QtWidgets import qApp, QStyleFactory, QLabel
|
from PyQt5.QtWidgets import qApp, QStyleFactory, QLabel
|
||||||
|
@ -106,11 +105,8 @@ def set_color_pallete(color_scheme: str) -> None:
|
||||||
qtawesome.set_defaults(color=icon_color)
|
qtawesome.set_defaults(color=icon_color)
|
||||||
|
|
||||||
|
|
||||||
def get_color_schemes() -> List[str]:
|
def get_color_schemes() -> Iterable[str]:
|
||||||
colors = []
|
yield from QDir(":/schemes")
|
||||||
for file in QDir(":/schemes"):
|
|
||||||
colors.append(file)
|
|
||||||
return colors
|
|
||||||
|
|
||||||
|
|
||||||
def set_style_sheet(style_sheet: str) -> None:
|
def set_style_sheet(style_sheet: str) -> None:
|
||||||
|
@ -132,31 +128,17 @@ def set_style_sheet(style_sheet: str) -> None:
|
||||||
qtawesome.set_defaults(color="#eeeeee")
|
qtawesome.set_defaults(color="#eeeeee")
|
||||||
|
|
||||||
|
|
||||||
def get_style_sheets() -> List[str]:
|
def get_style_sheets() -> Iterable[str]:
|
||||||
styles = []
|
yield from QDir(":/stylesheets/")
|
||||||
for file in QDir(":/stylesheets/"):
|
|
||||||
styles.append(file)
|
|
||||||
return styles
|
|
||||||
|
|
||||||
|
|
||||||
def get_translations():
|
def get_translations() -> Tuple[Tuple[str, str], ...]:
|
||||||
langs = ["en"]
|
langs = []
|
||||||
for i in os.listdir(os.path.join(resources_path, "languages")):
|
for i in os.listdir(os.path.join(resources_path, "languages")):
|
||||||
if i.endswith(".qm") and not i.startswith("qt_"):
|
if i.endswith(".qm") and not i.startswith("qt_"):
|
||||||
langs.append(i.split(".")[0])
|
locale = QLocale(i.split(".")[0])
|
||||||
return langs
|
langs.append((locale.name(), f"{locale.nativeLanguageName()} ({locale.nativeCountryName()})"))
|
||||||
|
return tuple(langs)
|
||||||
|
|
||||||
def get_latest_version():
|
|
||||||
try:
|
|
||||||
resp = requests.get(
|
|
||||||
"https://api.github.com/repos/RareDevs/Rare/releases/latest",
|
|
||||||
timeout=2,
|
|
||||||
)
|
|
||||||
tag = resp.json()["tag_name"]
|
|
||||||
return tag
|
|
||||||
except requests.exceptions.ConnectionError:
|
|
||||||
return "0.0.0"
|
|
||||||
|
|
||||||
|
|
||||||
def path_size(path: Union[str, os.PathLike]) -> int:
|
def path_size(path: Union[str, os.PathLike]) -> int:
|
||||||
|
@ -169,7 +151,7 @@ def path_size(path: Union[str, os.PathLike]) -> int:
|
||||||
|
|
||||||
|
|
||||||
def format_size(b: Union[int, float]) -> str:
|
def format_size(b: Union[int, float]) -> str:
|
||||||
for s in ["", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei"]:
|
for s in ("", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei"):
|
||||||
if b < 1024:
|
if b < 1024:
|
||||||
return f"{b:.2f} {s}B"
|
return f"{b:.2f} {s}B"
|
||||||
b /= 1024
|
b /= 1024
|
||||||
|
|
|
@ -15,6 +15,7 @@ if platform.system() == "Windows":
|
||||||
|
|
||||||
logger = getLogger("Paths")
|
logger = getLogger("Paths")
|
||||||
|
|
||||||
|
# This depends on the location of this file (obviously)
|
||||||
resources_path = Path(__file__).absolute().parent.parent.joinpath("resources")
|
resources_path = Path(__file__).absolute().parent.parent.joinpath("resources")
|
||||||
|
|
||||||
# lk: delete old Rare directories
|
# lk: delete old Rare directories
|
||||||
|
|
|
@ -101,11 +101,11 @@ class RareApp(QApplication):
|
||||||
f" - Qt version: {QT_VERSION_STR}, PyQt version: {PYQT_VERSION_STR}"
|
f" - Qt version: {QT_VERSION_STR}, PyQt version: {PYQT_VERSION_STR}"
|
||||||
)
|
)
|
||||||
|
|
||||||
self.settings = QSettings()
|
self.settings = QSettings(self)
|
||||||
|
|
||||||
# Translator
|
# Translator
|
||||||
self.translator = QTranslator()
|
self.translator = QTranslator(self)
|
||||||
self.qt_translator = QTranslator()
|
self.qt_translator = QTranslator(self)
|
||||||
|
|
||||||
# Style
|
# Style
|
||||||
# lk: this is a bit silly but serves well until we have a class
|
# lk: this is a bit silly but serves well until we have a class
|
||||||
|
@ -129,15 +129,15 @@ class RareApp(QApplication):
|
||||||
self.setWindowIcon(QIcon(":/images/Rare.png"))
|
self.setWindowIcon(QIcon(":/images/Rare.png"))
|
||||||
|
|
||||||
def load_translator(self, lang: str):
|
def load_translator(self, lang: str):
|
||||||
if os.path.isfile(f := os.path.join(paths.resources_path, "languages", f"{lang}.qm")):
|
|
||||||
self.translator.load(f)
|
|
||||||
self.logger.info(f"Your language is supported: {lang}")
|
|
||||||
elif not lang == "en":
|
|
||||||
self.logger.info("Your language is not supported")
|
|
||||||
self.installTranslator(self.translator)
|
|
||||||
|
|
||||||
# translator for qt stuff
|
# translator for qt stuff
|
||||||
if os.path.isfile(f := os.path.join(paths.resources_path, f"qt_{lang}.qm")):
|
if self.qt_translator.load(f"qt_{lang}", os.path.join(paths.resources_path, "languages")):
|
||||||
self.qt_translator = QTranslator()
|
self.logger.debug("Using translation for locale: $s", lang)
|
||||||
self.qt_translator.load(f)
|
else:
|
||||||
self.installTranslator(self.qt_translator)
|
self.logger.info("Couldn't find translation for locale: %s", lang)
|
||||||
|
self.installTranslator(self.qt_translator)
|
||||||
|
|
||||||
|
if self.translator.load(lang, os.path.join(paths.resources_path, "languages")):
|
||||||
|
self.logger.info("Using translation for locale: $s", lang)
|
||||||
|
else:
|
||||||
|
self.logger.info("Couldn't find translation for locale: %s", lang)
|
||||||
|
self.installTranslator(self.translator)
|
||||||
|
|
Loading…
Reference in a new issue