diff --git a/.tx/config b/.tx/config index 9597f91f32..faac6225f6 100644 --- a/.tx/config +++ b/.tx/config @@ -2,9 +2,9 @@ host = https://www.transifex.com [o:rare-1:p:rare:r:placeholder-ts] -file_filter = rare/resources/languages/.ts -source_file = rare/resources/languages/translation_source.ts -source_lang = en_US +file_filter = rare/resources/languages/rare_.ts +source_file = rare/resources/languages/source.ts +source_lang = en type = QT minimum_perc = 50 diff --git a/misc/py2ts.sh b/misc/py2ts.sh index cc8631d04d..6b1e330a87 100755 --- a/misc/py2ts.sh +++ b/misc/py2ts.sh @@ -3,6 +3,9 @@ cwd="$(pwd)" cd "$(dirname "$0")"/.. || exit -pylupdate5 -noobsolete $(find rare/ -iname "*.py") -ts rare/resources/languages/translation_source.ts +#py_files=$(find rare -iname "*.py" -not -path rare/ui) +#ui_files=$(find rare/ui -iname "*.ui") + +pylupdate5 -noobsolete $(find rare/ -iname "*.py") -ts rare/resources/languages/source.ts cd "$cwd" || exit diff --git a/rare/components/tabs/settings/rare.py b/rare/components/tabs/settings/rare.py index ad03b80feb..22b93fd80f 100644 --- a/rare/components/tabs/settings/rare.py +++ b/rare/components/tabs/settings/rare.py @@ -1,6 +1,7 @@ import os import platform import subprocess +import locale import sys from logging import getLogger @@ -33,9 +34,9 @@ def __init__(self, parent=None): # Select lang language = self.settings.value(*options.language) - self.lang_select.addItem(self.tr("System default"), "") - for locale, title in get_translations(): - self.lang_select.addItem(title, locale) + self.lang_select.addItem(self.tr("System default"), options.language.default) + for lang_code, title in get_translations(): + self.lang_select.addItem(title, lang_code) if (index := self.lang_select.findData(language, Qt.UserRole)) > 0: self.lang_select.setCurrentIndex(index) else: @@ -212,8 +213,8 @@ def save_window_size(self): self.settings.remove(options.window_size.key) def on_lang_changed(self, index: int): - if not index: + lang_code = self.lang_select.itemData(index, Qt.UserRole) + if lang_code == locale.getlocale()[0]: self.settings.remove(options.language.key) - return - language = self.lang_select.itemData(index, Qt.UserRole) - self.settings.setValue(options.language.key, language) + else: + self.settings.setValue(options.language.key, lang_code) diff --git a/rare/resources/languages/qt_de.qm b/rare/resources/languages/qt_de.qm deleted file mode 100644 index 4a4c988e09..0000000000 Binary files a/rare/resources/languages/qt_de.qm and /dev/null differ diff --git a/rare/resources/languages/qt_pt_BR.qm b/rare/resources/languages/qt_pt_BR.qm deleted file mode 100644 index d8b478d773..0000000000 Binary files a/rare/resources/languages/qt_pt_BR.qm and /dev/null differ diff --git a/rare/resources/languages/ca.qm b/rare/resources/languages/rare_ca.qm similarity index 100% rename from rare/resources/languages/ca.qm rename to rare/resources/languages/rare_ca.qm diff --git a/rare/resources/languages/ca.ts b/rare/resources/languages/rare_ca.ts similarity index 100% rename from rare/resources/languages/ca.ts rename to rare/resources/languages/rare_ca.ts diff --git a/rare/resources/languages/de.qm b/rare/resources/languages/rare_de.qm similarity index 100% rename from rare/resources/languages/de.qm rename to rare/resources/languages/rare_de.qm diff --git a/rare/resources/languages/de.ts b/rare/resources/languages/rare_de.ts similarity index 100% rename from rare/resources/languages/de.ts rename to rare/resources/languages/rare_de.ts diff --git a/rare/resources/languages/fr.qm b/rare/resources/languages/rare_fr.qm similarity index 100% rename from rare/resources/languages/fr.qm rename to rare/resources/languages/rare_fr.qm diff --git a/rare/resources/languages/fr.ts b/rare/resources/languages/rare_fr.ts similarity index 100% rename from rare/resources/languages/fr.ts rename to rare/resources/languages/rare_fr.ts diff --git a/rare/resources/languages/pt_BR.qm b/rare/resources/languages/rare_pt_BR.qm similarity index 100% rename from rare/resources/languages/pt_BR.qm rename to rare/resources/languages/rare_pt_BR.qm diff --git a/rare/resources/languages/pt_BR.ts b/rare/resources/languages/rare_pt_BR.ts similarity index 100% rename from rare/resources/languages/pt_BR.ts rename to rare/resources/languages/rare_pt_BR.ts diff --git a/rare/resources/languages/ru.qm b/rare/resources/languages/rare_ru.qm similarity index 100% rename from rare/resources/languages/ru.qm rename to rare/resources/languages/rare_ru.qm diff --git a/rare/resources/languages/ru.ts b/rare/resources/languages/rare_ru.ts similarity index 100% rename from rare/resources/languages/ru.ts rename to rare/resources/languages/rare_ru.ts diff --git a/rare/resources/languages/tr.qm b/rare/resources/languages/rare_tr.qm similarity index 100% rename from rare/resources/languages/tr.qm rename to rare/resources/languages/rare_tr.qm diff --git a/rare/resources/languages/tr.ts b/rare/resources/languages/rare_tr.ts similarity index 100% rename from rare/resources/languages/tr.ts rename to rare/resources/languages/rare_tr.ts diff --git a/rare/resources/languages/uk.qm b/rare/resources/languages/rare_uk.qm similarity index 100% rename from rare/resources/languages/uk.qm rename to rare/resources/languages/rare_uk.qm diff --git a/rare/resources/languages/uk.ts b/rare/resources/languages/rare_uk.ts similarity index 100% rename from rare/resources/languages/uk.ts rename to rare/resources/languages/rare_uk.ts diff --git a/rare/resources/languages/zh-Hans.qm b/rare/resources/languages/rare_zh-Hans.qm similarity index 100% rename from rare/resources/languages/zh-Hans.qm rename to rare/resources/languages/rare_zh-Hans.qm diff --git a/rare/resources/languages/zh-Hans.ts b/rare/resources/languages/rare_zh-Hans.ts similarity index 100% rename from rare/resources/languages/zh-Hans.ts rename to rare/resources/languages/rare_zh-Hans.ts diff --git a/rare/resources/languages/zh_TW.qm b/rare/resources/languages/rare_zh_TW.qm similarity index 100% rename from rare/resources/languages/zh_TW.qm rename to rare/resources/languages/rare_zh_TW.qm diff --git a/rare/resources/languages/zh_TW.ts b/rare/resources/languages/rare_zh_TW.ts similarity index 100% rename from rare/resources/languages/zh_TW.ts rename to rare/resources/languages/rare_zh_TW.ts diff --git a/rare/resources/languages/translation_source.ts b/rare/resources/languages/source.ts similarity index 90% rename from rare/resources/languages/translation_source.ts rename to rare/resources/languages/source.ts index be0d8d0046..6126108168 100644 --- a/rare/resources/languages/translation_source.ts +++ b/rare/resources/languages/source.ts @@ -146,7 +146,7 @@ ButtonDialog - + Cancel @@ -154,27 +154,27 @@ CloudSaves - + <b>This game doesn't support cloud saves</b> - + Use "Calculate path" or "Browse" ... - + Calculate path - + Loading... - + Error - {} @@ -184,7 +184,7 @@ - + Error while calculating path for <b>{}</b>. Insufficient permissions to create <b>{}</b> @@ -250,64 +250,70 @@ Code + + + Error in game {}: +{} + + - Connection to game process failed (Timeout) + Error - {} - - Error in game {}: -{} + + Connection to game launcher for <b>{}</b> failed due to timeout. +This is usually do it the game or Rare's game launcher already running ConsoleDialog - + Show environment - + Save output to file - + Clear console - + Terminate - + Kill - + Saved - + Application "{}" finished with "{}" - - - ConsoleEnv - - Rare - Console Environment + + Console + + + ConsoleEnv Variable @@ -318,6 +324,11 @@ Value + + + Environment + + Constants @@ -468,163 +479,113 @@ DownloadsTab - + No active download - + Error - + Download error: {} - + Uninstall - {} - - - DxvkSettings - - - DxvkSettings - - - - DXVK Settings + + Downloads - - DXVK HUD Options + + Starting: "{}" is now downloading. - - DXVK Version + + Finished: "{}" is now playable. + + + DxvkSettings - + FPS - - Memory Usage - - - - - Device Info - - - - - GPU Usage - - - - - Frame Time graph - - - - - D3D Version - - - - - Show HUD - - - - - System Default - - - - - Hidden - - - - - Visible - - - - - Custom Options - - - - + Frametime - + Memory usage - + GPU usage - - Show Device info + + D3D feature level - - D3D feature level + + Scale - - Scale + + Compiler activity - - Custom options + + DXVK settings - - Compiler activity + + Device info + + + + + DXVK version EGLSyncExportGroup - + Exportable games - + No games to export to EGL - + Export - + The following errors occurred while exporting. @@ -652,22 +613,22 @@ - + Updating... - + Path to the Wine prefix where EGL is installed, or the Manifests folder - + Default Wine prefix is unset, or path does not exist. Create it or configure it in Settings -> Linux. - + Default Wine prefix is set but EGL manifests path does not exist. Your configured default Wine prefix might not be where EGL is installed. @@ -680,22 +641,22 @@ EGLSyncImportGroup - + Importable games - + No games to import from EGL - + Import - + The following errors occurred while importing. @@ -714,124 +675,117 @@ - EOSGroup + EnvVars - - No update available + + Environment variables + + + EnvVarsTableModel - - Something went wrong, when installing overlay + + Key - - Failed to disable Overlay. Probably it is installed by Epic Games Launcher + + Value - - Disabled + + Disabled, please set the variable name first. - - Failed to enable EOS overlay. Maybe it is already installed by Epic Games Launcher + + Readonly, please edit this via setting the appropriate setting. + + + EosGroup - - Enabled + + Something went wrong while installing Overlay + + + EosPrefixWidget - - Overlay is not installed. Could not update + + Disable overlay - - Do you want to uninstall overlay? + + Enable overlay - - - EnvVars - - Environment variables + + Unavailable - - - EnvVarsTableModel - - Key - - - - - Value + + Failed to completely disable the active EOS Overlay.{} - - Disabled, please set the variable name first. + + Since the previous overlay was managed by EGL you can safely ignore this is. - - Readonly, please edit this via setting the appropriate setting. + + Failed to completely enable EOS overlay.{} EosWidget - - Activated - - - - + Uninstall - + Update - + Install - + Epic Overlay - - Version + + Status: - - Location + + Epic Online Services Overlay is not installed - - Check for update + + Version: - - Epic Overlay Services is not installed + + Path: @@ -879,42 +833,42 @@ GameInfo - + Game Info - + Developer - + Installation Path - + Installation Size - + Version - + Application Name - + Actions - + ProtonDB Grade @@ -924,7 +878,7 @@ - + Platform @@ -1019,67 +973,67 @@ - + Link/Launch - + Install - + Tags - + Completed - + Hidden - + Favorites - + Backlog - + Modify - + Verify - + Repair - + Move - + Uninstall - + Import @@ -1118,138 +1072,143 @@ - GameListHeadBar + GameLaunchSettings - - Exclude Origin + + Default - - Import Game + + No - - Search Game + + Yes - - Sync with EGL + + Relative path to the replacement executable - - All games + + Game specific command line arguments - - Installed games + + Skip update check - - Available games + + Offline mode - - Epic Overlay and Ubisoft + + Launch parameters - - Integrations + + Override executable + + + GameListHeadBar - - Installed + + Exclude Origin - - Offline + + Import Game - - 32bit games + + Search Game - - macOS games + + Sync with EGL - - Include Unreal + + All games - - - GameSettings - - GameSettings + + Installed games - - Launch Settings + + Available games - - Skip update check + + Epic Overlay and Ubisoft - - Default + + Integrations - - Yes + + Installed - - No + + Offline - - Offline mode + + 32bit games - - Launch parameters + + macOS games - - parameters + + Include Unreal - - Relative path to launch executable + + Title - - Pre-launch command + + Recently played - - Override executable + + Newest + + + + + Oldest @@ -1429,42 +1388,42 @@ - + Success: <b>{}</b> imported - + Failed: <b>{}</b> - {} - + Error: Could not find AppName for <b>{}</b> - + Import summary - + Success: {} imported - + Failed: {} - {} - + Error: Could not find AppName for {} - + Tried to import {} folders. Successfully imported {} games, failed to import {} games and {} errors occurred @@ -1481,17 +1440,17 @@ Successfully imported {} games, failed to import {} games and {} errors occurred - + When importing multiple games, the current OS will be used at the platform for the games that support it, otherwise the Windows version will be imported. - + Status: Importing games - + Status: Finished importing games @@ -1578,7 +1537,7 @@ Successfully imported {} games, failed to import {} games and {} errors occurred IndicatorLineEdit - Use global/default setting + Use global/default settings @@ -1634,116 +1593,106 @@ Successfully imported {} games, failed to import {} games and {} errors occurred InstallDialog - error - - - - Download size - + Click verify... - + Total install size - + None - + Verify - + Install - + Update - + Updating... - + Game already installed - + Error - + Platform - + Create shortcut - + Warning - + You will not be able to run the game if you select <b>{}</b> as platform - + Also install: {} - - Optional downloads - - - - + Repair - + Repair and update - + Available space - + Modify - + Creating a shortcut is not supported on macOS - + Install folder @@ -1810,6 +1759,19 @@ Successfully imported {} games, failed to import {} games and {} errors occurred Do not try to install. + + + Advanced options + + + + + InstallDialogSelective + + + Optional downloads + + InstalledGameDlcWidget @@ -1893,139 +1855,168 @@ Successfully imported {} games, failed to import {} games and {} errors occurred + + LaunchSettingsBase + + + Launch settings + + + + + Path to script or program to run before the game launches + + + + + Wait for command to finish before starting the game + + + + + Wrappers + + + + + Prelaunch + + + LegendarySettings - + Less is slower (0: Default) - + MiB - + Preferred CDN - + Default - + Disable HTTPS - + Locale - + Cleanup - + Clean, but keep manifests - + Remove everything - + Cleanup complete! Successfully removed {} - + Default installation folder for macOS games - + Default installation folder for Windows games - + Default installation folder - + Download settings - + Max sorkers - + Max shared memory - + Platforms - + Include Win32 games - + Include macOS games - + Include Unreal engine - + Restart Rare to apply - + Refresh metadata - - - LinuxSettings - - LinuxSettings + + Do not load metadata for non-asset games (i.e. Origin games) on start-up. + +Disabling this greatly improves start-up time, but some games might not be visible in your library. - - Wine Settings + + Exclude non-asset games - - Prefix + + Do not load entitlement data (i.e game's date of purchase) on start-up. + +Disabling this greatly improves start-up time, but some library filters may not work. - - Executable + + Exclude entitlements @@ -2116,29 +2107,29 @@ Successfully imported {} games, failed to import {} games and {} errors occurred MainWindow - + Active: - + Queued: - + Quit {}? - + There are currently running operations. Rare cannot exit until they are completed. Do you want to clear the queue? - + There is an active download. Quitting Rare now will stop the download. Are you sure you want to quit? @@ -2148,105 +2139,97 @@ Are you sure you want to quit? MangoHudSettings - - MangoHud Settings - - - - - Custom options + + MangoHud settings - - Mangohud is not installed or not in path + + Read config - - - MangoSettings - + FPS - - Frame Time + + Frame time - - CPU Load + + CPU load - - GPU Load + + GPU load - - CPU Temp + + CPU temperature - - GPU Temp + + GPU temperature - + Memory usage - + VRAM usage - - Local Time + + Local time - - MangoHud Version + + MangoHud version - + System architecture - - FPS Graph + + FPS graph - - GPU Name + + GPU name - - CPU Power consumption + + CPU power consumption - - GPU Power consumption + + GPU power consumption - + Font size - + Position @@ -2254,52 +2237,52 @@ Are you sure you want to quit? MoveDialog - + Move - + You need to provide the destination directory. - + No write permission on destination. - + Same directory or subdirectory selected. - + Destination is inside source directory - + Game install directories cannot be nested. - + Not enough space available on drive. - + Required: - + Available: - + Moving here will overwrite <b>{}</b> @@ -2307,23 +2290,33 @@ Are you sure you want to quit? OverlaySettings - + Show HUD - - System Default + + Global - - Hidden + + Disabled + + + + + Enabled (defaults) - - Visible + + Enabled (custom) + + + + + Custom options @@ -2345,52 +2338,31 @@ Are you sure you want to quit? - - PathInputDialog - - - Cancel - - - - - PreLaunchSettings - - - Path to script - - - - - Wait for finish - - - ProtonSettings - - Proton Settings + + Please select path for proton prefix - - Proton + + Proton settings - - Don't use Proton + + Proton tool - - Prefix + + Compat data - - Please select path for proton prefix + + Don't use a compatibility tool @@ -2496,7 +2468,7 @@ Are you sure you want to quit? - + Pypresence is not installed @@ -2504,25 +2476,20 @@ Are you sure you want to quit? RareCore - + Loaded <b>{}</b> - + Launching Rare - - - Preparing library - - RareException - + Failed to login @@ -2565,42 +2532,42 @@ Are you sure you want to quit? - + Create start menu link - + Remove desktop link - + Remove start menu link - + Remove Desktop link - + Create desktop link - + Not supported - + Error - + Permission error, cannot remove {} @@ -2686,17 +2653,17 @@ Are you sure you want to quit? SelectiveDialog - + Optional downloads for - + Optional downloads - + Verify @@ -2704,8 +2671,8 @@ Are you sure you want to quit? SettingsTab - - Default Settings + + Defaults @@ -2909,20 +2876,10 @@ Are you sure you want to quit? TrayIcon - + Quit - - - Download finished - - - - - Download finished. {} is playable now - - UbiLinkWidget @@ -2975,12 +2932,12 @@ Are you sure you want to quit? - + All your Ubisoft games have already been activated. - + You have <b>{}</b> games available to redeem. @@ -2988,20 +2945,25 @@ Are you sure you want to quit? UninstallDialog - + Uninstall - + Keep files - + Keep configuation + + + Keep EOS Overlay registry keys + + UpdateGroup @@ -3016,6 +2978,24 @@ Are you sure you want to quit? + + WineSettings + + + Wine settings + + + + + Prefix + + + + + Executable + + + Wishlist @@ -3083,60 +3063,71 @@ Are you sure you want to quit? - WrapperSettings + WrapperAddDialog - - No wrapper added + + Add wrapper + + + WrapperEditDialog - - Add wrapper + + Save - - Enter wrapper command + + Edit wrapper + + + + + WrapperSettings + + + Add wrapper - + Warning - + Wrapper <b>{0}</b> is already in the list - + Wrapper <b>{0}</b> is not in $PATH. Add it anyway? - - Do not insert <b>proton</b> manually. Add it through Proton settings + + No wrappers defined + + + + + Do not insert compatibility tools manually. Add them through Proton settings WrapperWidget - + Manage through settings - + Manage - - - Edit wrapper command - - _SearchResultItem @@ -3149,20 +3140,30 @@ Are you sure you want to quit? self.signals - + Updating game metadata for Windows - + Updating game metadata for macOS - + Updating non-asset game metadata + + + Updating entitlements + + + + + Preparing library + + shop_info @@ -3199,11 +3200,6 @@ Are you sure you want to quit? widget - - - Advanced options - - Install diff --git a/rare/utils/misc.py b/rare/utils/misc.py index 77a648659a..50d8119376 100644 --- a/rare/utils/misc.py +++ b/rare/utils/misc.py @@ -135,8 +135,8 @@ def get_style_sheets() -> Iterable[str]: def get_translations() -> Tuple[Tuple[str, str], ...]: langs = [] for i in os.listdir(os.path.join(resources_path, "languages")): - if i.endswith(".qm") and not i.startswith("qt_"): - locale = QLocale(i.split(".")[0]) + if i.endswith(".qm") and i.startswith("rare_"): + locale = QLocale(i.removesuffix(".qm").removeprefix("rare_")) langs.append((locale.name(), f"{locale.nativeLanguageName()} ({locale.nativeCountryName()})")) return tuple(langs) diff --git a/rare/widgets/rare_app.py b/rare/widgets/rare_app.py index e19204a08c..51dad2daac 100644 --- a/rare/widgets/rare_app.py +++ b/rare/widgets/rare_app.py @@ -7,7 +7,18 @@ from argparse import Namespace import legendary -from PyQt5.QtCore import QSettings, QTranslator, QT_VERSION_STR, PYQT_VERSION_STR, QObject, pyqtSignal, pyqtSlot, Qt +from PyQt5.QtCore import ( + QSettings, + QTranslator, + QT_VERSION_STR, + PYQT_VERSION_STR, + QObject, + pyqtSignal, + pyqtSlot, + Qt, + QLibraryInfo, + QLocale, +) from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QApplication, QMessageBox @@ -103,9 +114,9 @@ def __init__(self, args: Namespace, log_file: str): self.settings = QSettings(self) - # Translator - self.translator = QTranslator(self) - self.qt_translator = QTranslator(self) + # # Translator + # self.translator = QTranslator(self) + # self.qt_translator = QTranslator(self) # Style # lk: this is a bit silly but serves well until we have a class @@ -130,14 +141,17 @@ def __init__(self, args: Namespace, log_file: str): def load_translator(self, lang: str): # translator for qt stuff - if self.qt_translator.load(f"qt_{lang}", os.path.join(paths.resources_path, "languages")): - self.logger.debug("Using translation for locale: %s", lang) - else: - 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) + locale = QLocale(lang) + self.logger.info("Using locale: %s", locale.name()) + translations = { + "qtbase": QLibraryInfo.location(QLibraryInfo.TranslationsPath), + "rare": os.path.join(paths.resources_path, "languages"), + } + for filename, path in translations.items(): + translator = QTranslator(self) + if translator.load(locale, filename, "_", path): + self.logger.debug("Loaded translation file: %s", translator.filePath()) + self.installTranslator(translator) + else: + self.logger.info("Couldn't find translation for locale: %s", locale.name()) + translator.deleteLater()