1
0
Fork 0
mirror of synced 2024-06-02 10:44:40 +12:00

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:
loathingKernel 2024-01-23 22:02:22 +02:00
parent c5c581eb6e
commit 284543a6d9
9 changed files with 56 additions and 79 deletions

View file

@ -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

View file

@ -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)

View file

@ -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:

View file

@ -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)

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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)