3 Commits

Author SHA1 Message Date
34dff96e9a chore(readme): update todo
All checks were successful
Check Translations / check-translations (pull_request) Successful in 37s
Code and build check / Check code (pull_request) Successful in 1m28s
Code and build check / Build with uv (pull_request) Successful in 48s
Signed-off-by: Boris Yumankulov <boria138@altlinux.org>
2025-06-22 18:26:30 +05:00
8ff0daafa4 chore(localization): update
Signed-off-by: Boris Yumankulov <boria138@altlinux.org>
2025-06-22 18:24:10 +05:00
caed021c48 fix: QMessageBox on context menu
Signed-off-by: Boris Yumankulov <boria138@altlinux.org>
2025-06-22 17:43:27 +05:00
12 changed files with 888 additions and 488 deletions

View File

@@ -15,7 +15,7 @@
- [X] Добавить метаданные для тем (скриншоты, описание, домашняя страница и автор) - [X] Добавить метаданные для тем (скриншоты, описание, домашняя страница и автор)
- [ ] Продумать систему вкладок вместо текущей - [ ] Продумать систему вкладок вместо текущей
- [ ] [Добавить сессию Gamescope, аналогичную той, что используется в SteamOS](https://git.linux-gaming.ru/Boria138/gamescope-session-portprotonqt) - [ ] [Добавить сессию Gamescope, аналогичную той, что используется в SteamOS](https://git.linux-gaming.ru/Boria138/gamescope-session-portprotonqt)
- [ ] Разобраться почему теряется часть стилей в Gamescope - [X] Разобраться почему теряется часть стилей в Gamescope
- [ ] Разработать адаптивный дизайн (за эталон берётся Steam Deck с разрешением 1280×800) - [ ] Разработать адаптивный дизайн (за эталон берётся Steam Deck с разрешением 1280×800)
- [ ] Переделать скриншоты для соответствия [гайдлайнам Flathub](https://docs.flathub.org/docs/for-app-authors/metainfo-guidelines/quality-guidelines#screenshots) - [ ] Переделать скриншоты для соответствия [гайдлайнам Flathub](https://docs.flathub.org/docs/for-app-authors/metainfo-guidelines/quality-guidelines#screenshots)
- [X] Получать описания и названия игр из базы данных Steam - [X] Получать описания и названия игр из базы данных Steam
@@ -39,12 +39,11 @@
- [X] Добавить в карточки данные с AreWeAntiCheatYet - [X] Добавить в карточки данные с AreWeAntiCheatYet
- [X] Продублировать бейджи с карточки на страницу с деталями игры - [X] Продублировать бейджи с карточки на страницу с деталями игры
- [X] Добавить парсинг ярлыков из Steam - [X] Добавить парсинг ярлыков из Steam
- [X] Добавить парсинг ярлыков из EGS (скрыто для переработки) - [X] Добавить парсинг ярлыков из EGS
- [ ] Избавиться от бинарника legendary - [ ] Избавиться от бинарника legendary
- [X] Добавить запуск игр из EGS - [X] Добавить запуск игр из EGS
- [ ] Добавить скачивание игр из EGS - [ ] Добавить скачивание игр из EGS
- [ ] Добавить поддержку запуска сторонних игр из EGS - [ ] Добавить поддержку запуска сторонних игр из EGS
- [ ] Добавить поддержку запуска игр с EOS
- [ ] Добавить авторизацию в EGS через WebView вместо ручного ввода - [ ] Добавить авторизацию в EGS через WebView вместо ручного ввода
- [X] Получать описания для игр из EGS через их [API](https://store-content.ak.epicgames.com/api) - [X] Получать описания для игр из EGS через их [API](https://store-content.ak.epicgames.com/api)
- [X] Получать slug через GraphQL [запрос](https://launcher.store.epicgames.com/graphql) - [X] Получать slug через GraphQL [запрос](https://launcher.store.epicgames.com/graphql)
@@ -58,6 +57,7 @@
- [X] Добавить систему избранного для карточек - [X] Добавить систему избранного для карточек
- [X] Заменить все `print` на `logging` - [X] Заменить все `print` на `logging`
- [ ] Привести все логи к единому языку - [ ] Привести все логи к единому языку
- [ ] Уменьшить количество строк для перевода
- [X] Стилизовать все элементы без стилей (QMessageBox, QSlider, QDialog) - [X] Стилизовать все элементы без стилей (QMessageBox, QSlider, QDialog)
- [X] Убрать жёсткую привязку путей к стрелочкам QComboBox в `styles.py` - [X] Убрать жёсткую привязку путей к стрелочкам QComboBox в `styles.py`
- [X] Исправить частичное применение тем на лету - [X] Исправить частичное применение тем на лету

View File

@@ -14,3 +14,5 @@ MIME-Version:
Content-Type: Content-Type:
Content-Transfer-Encoding: Content-Transfer-Encoding:
Generated-By: Generated-By:
start.sh
EGS

View File

@@ -20,9 +20,9 @@ Current translation status:
| Locale | Progress | Translated | | Locale | Progress | Translated |
| :----- | -------: | ---------: | | :----- | -------: | ---------: |
| [de_DE](./de_DE/LC_MESSAGES/messages.po) | 0% | 0 of 161 | | [de_DE](./de_DE/LC_MESSAGES/messages.po) | 0% | 0 of 194 |
| [es_ES](./es_ES/LC_MESSAGES/messages.po) | 0% | 0 of 161 | | [es_ES](./es_ES/LC_MESSAGES/messages.po) | 0% | 0 of 194 |
| [ru_RU](./ru_RU/LC_MESSAGES/messages.po) | 100% | 161 of 161 | | [ru_RU](./ru_RU/LC_MESSAGES/messages.po) | 100% | 194 of 194 |
--- ---

View File

@@ -20,9 +20,9 @@
| Локаль | Прогресс | Переведено | | Локаль | Прогресс | Переведено |
| :----- | -------: | ---------: | | :----- | -------: | ---------: |
| [de_DE](./de_DE/LC_MESSAGES/messages.po) | 0% | 0 из 161 | | [de_DE](./de_DE/LC_MESSAGES/messages.po) | 0% | 0 из 194 |
| [es_ES](./es_ES/LC_MESSAGES/messages.po) | 0% | 0 из 161 | | [es_ES](./es_ES/LC_MESSAGES/messages.po) | 0% | 0 из 194 |
| [ru_RU](./ru_RU/LC_MESSAGES/messages.po) | 100% | 161 из 161 | | [ru_RU](./ru_RU/LC_MESSAGES/messages.po) | 100% | 194 из 194 |
--- ---

View File

@@ -12,7 +12,7 @@ from PySide6.QtCore import QUrl, QPoint, QObject, Signal, Qt
from PySide6.QtGui import QDesktopServices from PySide6.QtGui import QDesktopServices
from portprotonqt.config_utils import parse_desktop_entry, read_favorites, save_favorites from portprotonqt.config_utils import parse_desktop_entry, read_favorites, save_favorites
from portprotonqt.localization import _ from portprotonqt.localization import _
from portprotonqt.steam_api import is_game_in_steam, add_to_steam, remove_from_steam from portprotonqt.steam_api import is_game_in_steam, add_to_steam, remove_from_steam, get_steam_home, get_last_steam_user, convert_steam_id
from portprotonqt.dialogs import AddGameDialog from portprotonqt.dialogs import AddGameDialog
from portprotonqt.egs_api import add_egs_to_steam, get_egs_executable from portprotonqt.egs_api import add_egs_to_steam, get_egs_executable
import vdf import vdf
@@ -23,6 +23,7 @@ class ContextMenuSignals(QObject):
"""Signals for thread-safe UI updates from worker threads.""" """Signals for thread-safe UI updates from worker threads."""
show_status_message = Signal(str, int) show_status_message = Signal(str, int)
show_warning_dialog = Signal(str, str) show_warning_dialog = Signal(str, str)
show_info_dialog = Signal(str, str)
class ContextMenuManager: class ContextMenuManager:
"""Manages context menu actions for game management in PortProtonQt.""" """Manages context menu actions for game management in PortProtonQt."""
@@ -65,12 +66,21 @@ class ContextMenuManager:
self._show_warning_dialog, self._show_warning_dialog,
Qt.ConnectionType.QueuedConnection Qt.ConnectionType.QueuedConnection
) )
self.signals.show_info_dialog.connect(
self._show_info_dialog,
Qt.ConnectionType.QueuedConnection
)
def _show_warning_dialog(self, title: str, message: str): def _show_warning_dialog(self, title: str, message: str):
"""Show a warning dialog in the main thread.""" """Show a warning dialog in the main thread."""
logger.debug("Showing warning dialog: %s - %s", title, message) logger.debug("Showing warning dialog: %s - %s", title, message)
QMessageBox.warning(self.parent, title, message) QMessageBox.warning(self.parent, title, message)
def _show_info_dialog(self, title: str, message: str):
"""Show an info dialog in the main thread."""
logger.debug("Showing info dialog: %s - %s", title, message)
QMessageBox.information(self.parent, title, message)
def _is_egs_game_installed(self, app_name: str) -> bool: def _is_egs_game_installed(self, app_name: str) -> bool:
""" """
Check if an EGS game is installed by reading installed.json. Check if an EGS game is installed by reading installed.json.
@@ -123,10 +133,6 @@ class ContextMenuManager:
) )
# Show other actions only if the game is installed # Show other actions only if the game is installed
if self._is_egs_game_installed(game_card.appid): if self._is_egs_game_installed(game_card.appid):
uninstall_action = menu.addAction(_("Uninstall Game"))
uninstall_action.triggered.connect(
lambda: self.uninstall_egs_game(game_card.name, game_card.appid)
)
is_in_steam = is_game_in_steam(game_card.name) is_in_steam = is_game_in_steam(game_card.name)
if is_in_steam: if is_in_steam:
remove_steam_action = menu.addAction(_("Remove from Steam")) remove_steam_action = menu.addAction(_("Remove from Steam"))
@@ -227,23 +233,22 @@ class ContextMenuManager:
return return
if not os.path.exists(self.legendary_path): if not os.path.exists(self.legendary_path):
self._show_warning_dialog(_("Error"), _("Legendary executable not found at {0}").format(self.legendary_path)) self.signals.show_warning_dialog.emit(
_("Error"), _("Legendary executable not found at {0}").format(self.legendary_path)
)
return return
def on_add_to_steam_result(result: tuple[bool, str]): def on_add_to_steam_result(result: tuple[bool, str]):
success, message = result success, message = result
if success: if success:
self.signals.show_status_message.emit( self.signals.show_info_dialog.emit(
_("The game was added successfully. Please restart Steam for changes to take effect."), 5000 _("Success"),
_("'{0}' was added to Steam. Please restart Steam for changes to take effect.").format(game_name)
) )
else: else:
self.signals.show_warning_dialog.emit(_("Error"), message) self.signals.show_warning_dialog.emit(_("Error"), message)
if self.parent.statusBar(): logger.debug("Adding '%s' to Steam", game_name)
self.parent.statusBar().showMessage(_("Adding '{0}' to Steam...").format(game_name), 0)
logger.debug("Direct status message: Adding '%s' to Steam", game_name)
else:
logger.warning("Status bar not available when adding '%s' to Steam", game_name)
add_egs_to_steam(app_name, game_name, self.legendary_path, on_add_to_steam_result) add_egs_to_steam(app_name, game_name, self.legendary_path, on_add_to_steam_result)
def open_egs_game_folder(self, app_name: str): def open_egs_game_folder(self, app_name: str):
@@ -258,7 +263,7 @@ class ContextMenuManager:
exe_path = get_egs_executable(app_name, self.legendary_config_path) exe_path = get_egs_executable(app_name, self.legendary_config_path)
if not exe_path or not os.path.exists(exe_path): if not exe_path or not os.path.exists(exe_path):
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Executable file not found for game: {0}").format(app_name) _("Executable file not found for game: {0}").format(app_name)
) )
@@ -275,7 +280,7 @@ class ContextMenuManager:
else: else:
logger.warning("Status bar not available when opening folder for '%s'", app_name) logger.warning("Status bar not available when opening folder for '%s'", app_name)
except Exception as e: except Exception as e:
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Failed to open game folder: {0}").format(str(e)) _("Failed to open game folder: {0}").format(str(e))
) )
@@ -305,7 +310,7 @@ class ContextMenuManager:
return return
if not os.path.exists(self.legendary_path): if not os.path.exists(self.legendary_path):
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Legendary executable not found at {0}").format(self.legendary_path) _("Legendary executable not found at {0}").format(self.legendary_path)
) )
@@ -329,81 +334,6 @@ class ContextMenuManager:
logger.warning("Status bar not available when importing '%s'", game_name) logger.warning("Status bar not available when importing '%s'", game_name)
threading.Thread(target=run_import, daemon=True).start() threading.Thread(target=run_import, daemon=True).start()
def uninstall_egs_game(self, game_name: str, app_name: str):
"""
Uninstalls an Epic Games Store game using Legendary asynchronously.
Args:
game_name: The display name of the game.
app_name: The Legendary app_name (unique identifier for the game).
"""
if not self._check_portproton():
return
if not os.path.exists(self.legendary_path):
self._show_warning_dialog(
_("Error"),
_("Legendary executable not found at {0}").format(self.legendary_path)
)
return
reply = QMessageBox.question(
self.parent,
_("Confirm Uninstallation"),
_("Are you sure you want to uninstall '{0}'? This will remove the game files.").format(game_name),
QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,
QMessageBox.StandardButton.No
)
if reply != QMessageBox.StandardButton.Yes:
return
def run_uninstall():
cmd = [self.legendary_path, "uninstall", app_name, "--skip-uninstaller"]
try:
subprocess.run(
cmd,
capture_output=True,
text=True,
check=True,
env={"LEGENDARY_CONFIG_PATH": self.legendary_config_path}
)
self.signals.show_status_message.emit(
_("Successfully uninstalled '{0}'").format(game_name), 3000
)
except subprocess.CalledProcessError as e:
self.signals.show_status_message.emit(
_("Failed to uninstall '{0}'").format(game_name), 3000
)
self.signals.show_warning_dialog.emit(
_("Error"),
_("Failed to uninstall '{0}': {1}").format(game_name, e.stderr)
)
except FileNotFoundError:
self.signals.show_status_message.emit(
_("Legendary executable not found"), 3000
)
self.signals.show_warning_dialog.emit(
_("Error"),
_("Legendary executable not found")
)
except Exception as e:
self.signals.show_status_message.emit(
_("Unexpected error during uninstall"), 3000
)
self.signals.show_warning_dialog.emit(
_("Error"),
_("Unexpected error during uninstall: {0}").format(str(e))
)
if self.parent.statusBar():
self.parent.statusBar().showMessage(
_("Uninstalling '{0}'...").format(game_name), 0
)
logger.debug("Direct status message: Uninstalling '%s'", game_name)
else:
logger.warning("Status bar not available when uninstalling '%s'", game_name)
threading.Thread(target=run_uninstall, daemon=True).start()
def toggle_favorite(self, game_card, add: bool): def toggle_favorite(self, game_card, add: bool):
""" """
Toggle the favorite status of a game and update its icon. Toggle the favorite status of a game and update its icon.
@@ -439,7 +369,7 @@ class ContextMenuManager:
def _check_portproton(self): def _check_portproton(self):
"""Check if PortProton is available.""" """Check if PortProton is available."""
if self.portproton_location is None: if self.portproton_location is None:
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("PortProton is not found.") _("PortProton is not found.")
) )
@@ -474,7 +404,7 @@ class ContextMenuManager:
return False return False
if not os.path.exists(self.legendary_path): if not os.path.exists(self.legendary_path):
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Legendary executable not found at {0}").format(self.legendary_path) _("Legendary executable not found at {0}").format(self.legendary_path)
) )
@@ -486,7 +416,7 @@ class ContextMenuManager:
if self.portproton_location and ".var" not in self.portproton_location: if self.portproton_location and ".var" not in self.portproton_location:
wrapper = start_sh_path wrapper = start_sh_path
if not os.path.exists(start_sh_path): if not os.path.exists(start_sh_path):
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("start.sh not found at {0}").format(start_sh_path) _("start.sh not found at {0}").format(start_sh_path)
) )
@@ -509,10 +439,10 @@ class ContextMenuManager:
desktop_entry = f"""[Desktop Entry] desktop_entry = f"""[Desktop Entry]
Type=Application Type=Application
Name={game_name} Name={game_name}
Exec="{self.legendary_path}" launch {app_name} --no-wine --wrapper "env START_FROM_STEAM=1 {wrapper}" "$@" Exec="{self.legendary_path}" launch {app_name} --no-wine --wrapper "env START_FROM_STEAM=1 {wrapper}"
Icon={icon_path} Icon={icon_path}
Terminal=false Terminal=false
Categories=Game; Categories=Game
""" """
try: try:
with open(desktop_path, "w", encoding="utf-8") as f: with open(desktop_path, "w", encoding="utf-8") as f:
@@ -521,7 +451,7 @@ Categories=Game;
logger.info(f"Created .desktop file for EGS game: {desktop_path}") logger.info(f"Created .desktop file for EGS game: {desktop_path}")
return True return True
except Exception as e: except Exception as e:
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Failed to create .desktop file: {0}").format(str(e)) _("Failed to create .desktop file: {0}").format(str(e))
) )
@@ -555,13 +485,13 @@ Categories=Game;
self.parent.statusBar().showMessage( self.parent.statusBar().showMessage(
_("Game '{0}' added to desktop").format(game_name), 3000 _("Game '{0}' added to desktop").format(game_name), 3000
) )
logger.debug("Direct status message: Game '%s' added to desktop", game_name) logger.debug("Direct status message: Game '{0}' added to desktop", game_name)
else: else:
logger.warning("Status bar not available when adding '%s' to desktop", game_name) logger.warning("Status bar not available when adding '{0}' to desktop", game_name)
except OSError as e: except OSError as e:
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Failed to add game to desktop: {0}").format(str(e)) _("Failed to add game to desktop: {0}").format(game_name, str(e))
) )
def remove_egs_from_desktop(self, game_name: str): def remove_egs_from_desktop(self, game_name: str):
@@ -575,8 +505,8 @@ Categories=Game;
desktop_path = os.path.join(desktop_dir, f"{game_name}.desktop") desktop_path = os.path.join(desktop_dir, f"{game_name}.desktop")
self._remove_file( self._remove_file(
desktop_path, desktop_path,
_("Failed to remove game from Desktop: {0}"), _("Failed to remove game '{0}' from Desktop: {{0}}").format(game_name),
_("Game '{0}' removed from Desktop"), _("Successfully removed game '{0}' from Desktop").format(game_name),
game_name game_name
) )
@@ -608,13 +538,13 @@ Categories=Game;
self.parent.statusBar().showMessage( self.parent.statusBar().showMessage(
_("Game '{0}' added to menu").format(game_name), 3000 _("Game '{0}' added to menu").format(game_name), 3000
) )
logger.debug("Direct status message: Game '%s' added to menu", game_name) logger.debug("Direct status message: Game '{0}' added to menu", game_name)
else: else:
logger.warning("Status bar not available when adding '%s' to menu", game_name) logger.warning("Status bar not available when adding '{0}' to menu", game_name)
except OSError as e: except OSError as e:
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Failed to add game to menu: {0}").format(str(e)) _("Failed to add game '{0}' to menu: {1}").format(game_name, str(e))
) )
def remove_egs_from_menu(self, game_name: str): def remove_egs_from_menu(self, game_name: str):
@@ -628,8 +558,8 @@ Categories=Game;
desktop_path = os.path.join(applications_dir, f"{game_name}.desktop") desktop_path = os.path.join(applications_dir, f"{game_name}.desktop")
self._remove_file( self._remove_file(
desktop_path, desktop_path,
_("Failed to remove game from menu: {0}"), _("Failed to remove game '{0}' from menu: {{0}}").format(game_name),
_("Game '{0}' removed from menu"), _("Successfully removed game '{0}' from menu").format(game_name),
game_name game_name
) )
@@ -645,21 +575,21 @@ Categories=Game;
if entry: if entry:
exec_line = entry.get("Exec", entry.get("exec", "")).strip() exec_line = entry.get("Exec", entry.get("exec", "")).strip()
if not exec_line: if not exec_line:
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("No executable command found in .desktop for game: {0}").format(game_name) _("No executable command found in .desktop file for game: {0}").format(game_name)
) )
return None return None
else: else:
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Failed to parse .desktop file for game: {0}").format(game_name) _("Failed to parse .desktop file for game: {0}").format(game_name)
) )
return None return None
except Exception as e: except Exception as e:
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Error reading .desktop file: {0}").format(e) _("Failed to read .desktop file: {0}").format(str(e))
) )
return None return None
else: else:
@@ -669,7 +599,7 @@ Categories=Game;
exec_line = entry.get("Exec", entry.get("exec", "")).strip() exec_line = entry.get("Exec", entry.get("exec", "")).strip()
if exec_line: if exec_line:
return exec_line return exec_line
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_(".desktop file not found for game: {0}").format(game_name) _(".desktop file not found for game: {0}").format(game_name)
) )
@@ -681,7 +611,7 @@ Categories=Game;
try: try:
entry_exec_split = shlex.split(exec_line) entry_exec_split = shlex.split(exec_line)
if not entry_exec_split: if not entry_exec_split:
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Invalid executable command: {0}").format(exec_line) _("Invalid executable command: {0}").format(exec_line)
) )
@@ -693,16 +623,16 @@ Categories=Game;
else: else:
exe_path = entry_exec_split[-1] exe_path = entry_exec_split[-1]
if not exe_path or not os.path.exists(exe_path): if not exe_path or not os.path.exists(exe_path):
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Executable file not found: {0}").format(exe_path or "None") _("Executable file not found: {0}").format(exe_path or "None")
) )
return None return None
return exe_path return exe_path
except Exception as e: except Exception as e:
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Failed to parse executable command: {0}").format(e) _("Failed to parse executable command: {0}").format(str(e))
) )
return None return None
@@ -717,9 +647,9 @@ Categories=Game;
logger.warning("Status bar not available when removing file for '%s'", game_name) logger.warning("Status bar not available when removing file for '%s'", game_name)
return True return True
except OSError as e: except OSError as e:
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
error_message.format(e) error_message.format(str(e))
) )
return False return False
@@ -741,9 +671,9 @@ Categories=Game;
desktop_path = self._get_desktop_path(game_name) desktop_path = self._get_desktop_path(game_name)
if not os.path.exists(desktop_path): if not os.path.exists(desktop_path):
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Could not locate .desktop file for '{0}'").format(game_name) _("Could not locate .desktop file for game: {0}").format(game_name)
) )
return return
@@ -772,9 +702,9 @@ Categories=Game;
try: try:
shutil.rmtree(custom_folder) shutil.rmtree(custom_folder)
except OSError as e: except OSError as e:
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Failed to delete custom data: {0}").format(e) _("Failed to delete custom data: {0}").format(str(e))
) )
def add_to_menu(self, game_name, exec_line): def add_to_menu(self, game_name, exec_line):
@@ -784,9 +714,9 @@ Categories=Game;
desktop_path = self._get_desktop_path(game_name) desktop_path = self._get_desktop_path(game_name)
if not os.path.exists(desktop_path): if not os.path.exists(desktop_path):
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Could not locate .desktop file for '{0}'").format(game_name) _("Could not locate .desktop file for game: {0}").format(game_name)
) )
return return
@@ -801,13 +731,13 @@ Categories=Game;
self.parent.statusBar().showMessage( self.parent.statusBar().showMessage(
_("Game '{0}' added to menu").format(game_name), 3000 _("Game '{0}' added to menu").format(game_name), 3000
) )
logger.debug("Direct status message: Game '%s' added to menu", game_name) logger.debug("Direct status message: Game '{0}' added to menu", game_name)
else: else:
logger.warning("Status bar not available when adding '%s' to menu", game_name) logger.warning("Status bar not available when adding '{0}' to menu", game_name)
except OSError as e: except OSError as e:
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Failed to add game to menu: {0}").format(str(e)) _("Failed to add game '{0}' to menu: {1}").format(game_name, str(e))
) )
def remove_from_menu(self, game_name): def remove_from_menu(self, game_name):
@@ -816,8 +746,8 @@ Categories=Game;
desktop_path = os.path.join(applications_dir, f"{game_name}.desktop") desktop_path = os.path.join(applications_dir, f"{game_name}.desktop")
self._remove_file( self._remove_file(
desktop_path, desktop_path,
_("Failed to remove game from menu: {0}"), _("Failed to remove game '{0}' from menu: {{0}}").format(game_name),
_("Game '{0}' removed from menu"), _("Successfully removed game '{0}' from menu").format(game_name),
game_name game_name
) )
@@ -828,9 +758,9 @@ Categories=Game;
desktop_path = self._get_desktop_path(game_name) desktop_path = self._get_desktop_path(game_name)
if not os.path.exists(desktop_path): if not os.path.exists(desktop_path):
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Could not locate .desktop file for '{0}'").format(game_name) _("Could not locate .desktop file for game: {0}").format(game_name)
) )
return return
@@ -845,13 +775,13 @@ Categories=Game;
self.parent.statusBar().showMessage( self.parent.statusBar().showMessage(
_("Game '{0}' added to desktop").format(game_name), 3000 _("Game '{0}' added to desktop").format(game_name), 3000
) )
logger.debug("Direct status message: Game '%s' added to desktop", game_name) logger.debug("Direct status message: Game '{0}' added to desktop", game_name)
else: else:
logger.warning("Status bar not available when adding '%s' to desktop", game_name) logger.warning("Status bar not available when adding '{0}' to desktop", game_name)
except OSError as e: except OSError as e:
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Failed to add game to desktop: {0}").format(str(e)) _("Failed to add game '{0}' to desktop: {1}").format(game_name, str(e))
) )
def remove_from_desktop(self, game_name): def remove_from_desktop(self, game_name):
@@ -860,8 +790,8 @@ Categories=Game;
desktop_path = os.path.join(desktop_dir, f"{game_name}.desktop") desktop_path = os.path.join(desktop_dir, f"{game_name}.desktop")
self._remove_file( self._remove_file(
desktop_path, desktop_path,
_("Failed to remove game from Desktop: {0}"), _("Failed to remove game '{0}' from Desktop: {{0}}").format(game_name),
_("Game '{0}' removed from Desktop"), _("Successfully removed game '{0}' from Desktop").format(game_name),
game_name game_name
) )
@@ -893,7 +823,7 @@ Categories=Game;
new_cover_path = dialog.coverEdit.text().strip() new_cover_path = dialog.coverEdit.text().strip()
if not new_name or not new_exe_path: if not new_name or not new_exe_path:
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Game name and executable path are required.") _("Game name and executable path are required.")
) )
@@ -901,7 +831,7 @@ Categories=Game;
desktop_entry, new_desktop_path = dialog.getDesktopEntryData() desktop_entry, new_desktop_path = dialog.getDesktopEntryData()
if not desktop_entry or not new_desktop_path: if not desktop_entry or not new_desktop_path:
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Failed to generate .desktop file data.") _("Failed to generate .desktop file data.")
) )
@@ -921,9 +851,9 @@ Categories=Game;
f.write(desktop_entry) f.write(desktop_entry)
os.chmod(new_desktop_path, 0o755) os.chmod(new_desktop_path, 0o755)
except OSError as e: except OSError as e:
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Failed to save .desktop file: {0}").format(e) _("Failed to save .desktop file: {0}").format(str(e))
) )
return return
@@ -941,9 +871,9 @@ Categories=Game;
try: try:
shutil.copyfile(new_cover_path, os.path.join(custom_folder, f"cover{ext}")) shutil.copyfile(new_cover_path, os.path.join(custom_folder, f"cover{ext}"))
except OSError as e: except OSError as e:
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Failed to copy cover image: {0}").format(e) _("Failed to copy cover image: {0}").format(str(e))
) )
return return
@@ -960,23 +890,19 @@ Categories=Game;
if not exe_path: if not exe_path:
return return
def on_add_to_steam_result(result: tuple[bool, str]): logger.debug("Adding '{0}' to Steam", game_name)
success, message = result
if success:
self.signals.show_status_message.emit(
_("The game was added successfully. Please restart Steam for changes to take effect."), 5000
)
else:
self.signals.show_warning_dialog.emit(_("Error"), message)
if self.parent.statusBar(): try:
self.parent.statusBar().showMessage( add_to_steam(game_name, exec_line, cover_path)
_("Adding '{0}' to Steam...").format(game_name), 0 self.signals.show_info_dialog.emit(
_("Success"),
_("'{0}' was added to Steam. Please restart Steam for changes to take effect.").format(game_name)
)
except Exception as e:
self.signals.show_warning_dialog.emit(
_("Error"),
_("Failed to add game '{0}' to Steam: {1}").format(game_name, str(e))
) )
logger.debug("Direct status message: Adding '%s' to Steam", game_name)
else:
logger.warning("Status bar not available when adding '%s' to Steam", game_name)
add_to_steam(game_name, exec_line, cover_path)
def remove_from_steam(self, game_name, exec_line, game_source): def remove_from_steam(self, game_name, exec_line, game_source):
"""Handle removing a game from Steam via steam_api, supporting both EGS and non-EGS games.""" """Handle removing a game from Steam via steam_api, supporting both EGS and non-EGS games."""
@@ -986,8 +912,9 @@ Categories=Game;
def on_remove_from_steam_result(result: tuple[bool, str]): def on_remove_from_steam_result(result: tuple[bool, str]):
success, message = result success, message = result
if success: if success:
self.signals.show_status_message.emit( self.signals.show_info_dialog.emit(
_("The game was removed successfully. Please restart Steam for changes to take effect."), 5000 _("Success"),
_("'{0}' was removed from Steam. Please restart Steam for changes to take effect.").format(game_name)
) )
else: else:
self.signals.show_warning_dialog.emit(_("Error"), message) self.signals.show_warning_dialog.emit(_("Error"), message)
@@ -995,7 +922,7 @@ Categories=Game;
if game_source == "epic": if game_source == "epic":
# For EGS games, construct the script path used in Steam shortcuts.vdf # For EGS games, construct the script path used in Steam shortcuts.vdf
if not self.portproton_location: if not self.portproton_location:
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("PortProton directory not found") _("PortProton directory not found")
) )
@@ -1007,15 +934,14 @@ Categories=Game;
# Directly remove the shortcut by matching AppName and Exe # Directly remove the shortcut by matching AppName and Exe
try: try:
from portprotonqt.steam_api import get_steam_home, get_last_steam_user, convert_steam_id
steam_home = get_steam_home() steam_home = get_steam_home()
if not steam_home: if not steam_home:
self._show_warning_dialog(_("Error"), _("Steam directory not found")) self.signals.show_warning_dialog.emit(_("Error"), _("Steam directory not found"))
return return
last_user = get_last_steam_user(steam_home) last_user = get_last_steam_user(steam_home)
if not last_user or 'SteamID' not in last_user: if not last_user or 'SteamID' not in last_user:
self._show_warning_dialog(_("Error"), _("Failed to get Steam user ID")) self.signals.show_warning_dialog.emit(_("Error"), _("Failed to get Steam user ID"))
return return
userdata_dir = os.path.join(steam_home, "userdata") userdata_dir = os.path.join(steam_home, "userdata")
@@ -1026,7 +952,7 @@ Categories=Game;
backup_path = f"{steam_shortcuts_path}.backup" backup_path = f"{steam_shortcuts_path}.backup"
if not os.path.exists(steam_shortcuts_path): if not os.path.exists(steam_shortcuts_path):
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Steam shortcuts file not found") _("Steam shortcuts file not found")
) )
@@ -1037,9 +963,9 @@ Categories=Game;
shutil.copy2(steam_shortcuts_path, backup_path) shutil.copy2(steam_shortcuts_path, backup_path)
logger.info(f"Created backup of shortcuts.vdf at {backup_path}") logger.info(f"Created backup of shortcuts.vdf at {backup_path}")
except Exception as e: except Exception as e:
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Failed to create backup of shortcuts.vdf: {0}").format(e) _("Failed to create backup of shortcuts.vdf: {0}").format(str(e))
) )
return return
@@ -1048,9 +974,9 @@ Categories=Game;
with open(steam_shortcuts_path, 'rb') as f: with open(steam_shortcuts_path, 'rb') as f:
shortcuts_data = vdf.binary_load(f) shortcuts_data = vdf.binary_load(f)
except Exception as e: except Exception as e:
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Failed to load shortcuts.vdf: {0}").format(e) _("Failed to load shortcuts.vdf: {0}").format(str(e))
) )
return return
@@ -1068,7 +994,7 @@ Categories=Game;
index += 1 index += 1
if not modified: if not modified:
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Game '{0}' not found in Steam shortcuts").format(game_name) _("Game '{0}' not found in Steam shortcuts").format(game_name)
) )
@@ -1081,9 +1007,9 @@ Categories=Game;
logger.info(f"Updated shortcuts.vdf, removed '{game_name}'") logger.info(f"Updated shortcuts.vdf, removed '{game_name}'")
on_remove_from_steam_result((True, f"Game '{game_name}' removed from Steam")) on_remove_from_steam_result((True, f"Game '{game_name}' removed from Steam"))
except Exception as e: except Exception as e:
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Failed to update shortcuts.vdf: {0}").format(e) _("Failed to update shortcuts.vdf: {0}").format(str(e))
) )
if os.path.exists(backup_path): if os.path.exists(backup_path):
try: try:
@@ -1098,20 +1024,20 @@ Categories=Game;
if os.path.exists(script_path): if os.path.exists(script_path):
try: try:
os.remove(script_path) os.remove(script_path)
logger.info(f"Removed EGS script file: {script_path}") logger.info(f"Removed EGS script: {script_path}")
except Exception as e: except Exception as e:
logger.warning(f"Failed to remove EGS script file {script_path}: {e}") logger.warning(f"Failed to remove EGS script {script_path}: {e}")
except Exception as e: except Exception as e:
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Failed to remove EGS game from Steam: {0}").format(e) _("Failed to remove EGS game '{0}' from Steam: {1}").format(game_name, str(e))
) )
on_remove_from_steam_result((False, f"Failed to remove EGS game from Steam: {e}")) on_remove_from_steam_result((False, f"Failed to remove EGS game '{game_name}' from Steam: {str(e)}"))
return return
else: else:
# For non-EGS games, use the existing logic # For non-EGS games, use the existing logic without callback
exec_line = self._get_exec_line(game_name, exec_line) exec_line = self._get_exec_line(game_name, exec_line)
if not exec_line: if not exec_line:
return return
@@ -1121,13 +1047,21 @@ Categories=Game;
return return
if self.parent.statusBar(): if self.parent.statusBar():
self.parent.statusBar().showMessage( logger.debug("Direct status message: Removing '{0}' from Steam", game_name)
_("Removing '{0}' from Steam...").format(game_name), 0
)
logger.debug("Direct status message: Removing '%s' from Steam", game_name)
else: else:
logger.warning("Status bar not available when removing '%s' from Steam", game_name) logger.warning("Status bar not available when removing '{0}' from Steam", game_name)
remove_from_steam(game_name, exec_line)
try:
remove_from_steam(game_name, exec_line)
self.signals.show_info_dialog.emit(
_("Success"),
_("'{0}' was removed from Steam. Please restart Steam for changes to take effect.").format(game_name)
)
except Exception as e:
self.signals.show_warning_dialog.emit(
_("Error"),
_("Failed to remove game '{0}' from Steam: {1}").format(game_name, str(e))
)
def open_game_folder(self, game_name, exec_line): def open_game_folder(self, game_name, exec_line):
"""Open the folder containing the game's executable.""" """Open the folder containing the game's executable."""
@@ -1147,13 +1081,13 @@ Categories=Game;
QDesktopServices.openUrl(QUrl.fromLocalFile(folder_path)) QDesktopServices.openUrl(QUrl.fromLocalFile(folder_path))
if self.parent.statusBar(): if self.parent.statusBar():
self.parent.statusBar().showMessage( self.parent.statusBar().showMessage(
_("Opened folder for '{0}'").format(game_name), 3000 _("Successfully opened folder for '{0}'").format(game_name), 3000
) )
logger.debug("Direct status message: Opened folder for '%s'", game_name) logger.debug("Direct status message: Opened folder for '{0}'", game_name)
else: else:
logger.warning("Status bar not available when opening folder for '%s'", game_name) logger.warning("Status bar not available when opening folder for '{0}'", game_name)
except Exception as e: except Exception as e:
self._show_warning_dialog( self.signals.show_warning_dialog.emit(
_("Error"), _("Error"),
_("Failed to open game folder: {0}").format(str(e)) _("Failed to open game folder: {0}").format(str(e))
) )

View File

@@ -9,7 +9,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2025-06-14 10:37+0500\n" "POT-Creation-Date: 2025-06-22 18:23+0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: de_DE\n" "Language: de_DE\n"
@@ -26,31 +26,70 @@ msgstr ""
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "" msgstr ""
msgid "Import to Legendary"
msgstr ""
msgid "Remove from Steam"
msgstr ""
msgid "Add to Steam"
msgstr ""
msgid "Open Game Folder"
msgstr ""
msgid "Remove from Desktop" msgid "Remove from Desktop"
msgstr "" msgstr ""
msgid "Add to Desktop" msgid "Add to Desktop"
msgstr "" msgstr ""
msgid "Edit Shortcut"
msgstr ""
msgid "Delete from PortProton"
msgstr ""
msgid "Open Game Folder"
msgstr ""
msgid "Remove from Menu" msgid "Remove from Menu"
msgstr "" msgstr ""
msgid "Add to Menu" msgid "Add to Menu"
msgstr "" msgstr ""
msgid "Remove from Steam" msgid "Edit Shortcut"
msgstr "" msgstr ""
msgid "Add to Steam" msgid "Delete from PortProton"
msgstr ""
msgid "Error"
msgstr ""
#, python-brace-format
msgid "Legendary executable not found at {0}"
msgstr ""
msgid "Success"
msgstr ""
#, python-brace-format
msgid "'{0}' was added to Steam. Please restart Steam for changes to take effect."
msgstr ""
#, python-brace-format
msgid "Executable file not found for game: {0}"
msgstr ""
#, python-brace-format
msgid "Opened folder for EGS game '{0}'"
msgstr ""
#, python-brace-format
msgid "Failed to open game folder: {0}"
msgstr ""
msgid "Select Game Installation Folder"
msgstr ""
msgid "No folder selected"
msgstr ""
#, python-brace-format
msgid "Importing '{0}' to Legendary..."
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
@@ -61,14 +100,51 @@ msgstr ""
msgid "Removed '{0}' from favorites" msgid "Removed '{0}' from favorites"
msgstr "" msgstr ""
msgid "Error"
msgstr ""
msgid "PortProton is not found." msgid "PortProton is not found."
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
msgid "No executable command found in .desktop for game: {0}" msgid "start.sh not found at {0}"
msgstr ""
#, python-brace-format
msgid "Failed to create .desktop file: {0}"
msgstr ""
#, python-brace-format
msgid "Game '{0}' added to desktop"
msgstr ""
#, python-brace-format
msgid "Failed to add game to desktop: {0}"
msgstr ""
#, python-brace-format
msgid "Failed to remove game '{0}' from Desktop: {{0}}"
msgstr ""
#, python-brace-format
msgid "Successfully removed game '{0}' from Desktop"
msgstr ""
#, python-brace-format
msgid "Game '{0}' added to menu"
msgstr ""
#, python-brace-format
msgid "Failed to add game '{0}' to menu: {1}"
msgstr ""
#, python-brace-format
msgid "Failed to remove game '{0}' from menu: {{0}}"
msgstr ""
#, python-brace-format
msgid "Successfully removed game '{0}' from menu"
msgstr ""
#, python-brace-format
msgid "No executable command found in .desktop file for game: {0}"
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
@@ -76,7 +152,7 @@ msgid "Failed to parse .desktop file for game: {0}"
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
msgid "Error reading .desktop file: {0}" msgid "Failed to read .desktop file: {0}"
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
@@ -105,7 +181,7 @@ msgid ""
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
msgid "Could not locate .desktop file for '{0}'" msgid "Could not locate .desktop file for game: {0}"
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
@@ -121,35 +197,7 @@ msgid "Failed to delete custom data: {0}"
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
msgid "Game '{0}' added to menu" msgid "Failed to add game '{0}' to desktop: {1}"
msgstr ""
#, python-brace-format
msgid "Failed to add game to menu: {0}"
msgstr ""
#, python-brace-format
msgid "Failed to remove game from menu: {0}"
msgstr ""
#, python-brace-format
msgid "Game '{0}' removed from menu"
msgstr ""
#, python-brace-format
msgid "Game '{0}' added to desktop"
msgstr ""
#, python-brace-format
msgid "Failed to add game to desktop: {0}"
msgstr ""
#, python-brace-format
msgid "Failed to remove game from Desktop: {0}"
msgstr ""
#, python-brace-format
msgid "Game '{0}' removed from Desktop"
msgstr "" msgstr ""
msgid "Game name and executable path are required." msgid "Game name and executable path are required."
@@ -174,25 +222,54 @@ msgstr ""
msgid "Failed to copy cover image: {0}" msgid "Failed to copy cover image: {0}"
msgstr "" msgstr ""
msgid "Restart Steam" #, python-brace-format
msgstr "" msgid "Failed to add game '{0}' to Steam: {1}"
msgid ""
"The game was added successfully.\n"
"Please restart Steam for changes to take effect."
msgstr ""
msgid ""
"The game was removed successfully.\n"
"Please restart Steam for changes to take effect."
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
msgid "Opened folder for '{0}'" msgid ""
"'{0}' was removed from Steam. Please restart Steam for changes to take "
"effect."
msgstr ""
msgid "PortProton directory not found"
msgstr ""
msgid "Steam directory not found"
msgstr ""
msgid "Failed to get Steam user ID"
msgstr ""
msgid "Steam shortcuts file not found"
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
msgid "Failed to open game folder: {0}" msgid "Failed to create backup of shortcuts.vdf: {0}"
msgstr ""
#, python-brace-format
msgid "Failed to load shortcuts.vdf: {0}"
msgstr ""
#, python-brace-format
msgid "Game '{0}' not found in Steam shortcuts"
msgstr ""
#, python-brace-format
msgid "Failed to update shortcuts.vdf: {0}"
msgstr ""
#, python-brace-format
msgid "Failed to remove EGS game '{0}' from Steam: {1}"
msgstr ""
#, python-brace-format
msgid "Failed to remove game '{0}' from Steam: {1}"
msgstr ""
#, python-brace-format
msgid "Successfully opened folder for '{0}'"
msgstr "" msgstr ""
msgid "Edit Game" msgid "Edit Game"
@@ -235,10 +312,10 @@ msgstr ""
msgid "Loading Epic Games Store games..." msgid "Loading Epic Games Store games..."
msgstr "" msgstr ""
msgid "No description available" msgid "Never"
msgstr "" msgstr ""
msgid "Never" msgid "No description available"
msgstr "" msgstr ""
msgid "Supported" msgid "Supported"
@@ -382,6 +459,21 @@ msgstr ""
msgid "Gamepad haptic feedback:" msgid "Gamepad haptic feedback:"
msgstr "" msgstr ""
msgid "Open Legendary Login"
msgstr ""
msgid "Legendary Authentication:"
msgstr ""
msgid "Enter Legendary Authorization Code"
msgstr ""
msgid "Authorization Code:"
msgstr ""
msgid "Submit Code"
msgstr ""
msgid "Save Settings" msgid "Save Settings"
msgstr "" msgstr ""
@@ -397,6 +489,22 @@ msgstr ""
msgid "Failed to open Legendary login page" msgid "Failed to open Legendary login page"
msgstr "" msgstr ""
msgid "Please enter an authorization code"
msgstr ""
msgid "Successfully authenticated with Legendary"
msgstr ""
#, python-brace-format
msgid "Legendary authentication failed: {0}"
msgstr ""
msgid "Legendary executable not found"
msgstr ""
msgid "Unexpected error during authentication"
msgstr ""
msgid "Confirm Reset" msgid "Confirm Reset"
msgstr "" msgstr ""
@@ -478,6 +586,20 @@ msgstr ""
msgid "Play" msgid "Play"
msgstr "" msgstr ""
#, python-brace-format
msgid "Executable not found for EGS game: {0}"
msgstr ""
msgid "Cannot launch game while another game is running"
msgstr ""
msgid "Launching"
msgstr ""
#, python-brace-format
msgid "Failed to launch game: {0}"
msgstr ""
msgid "Invalid command format (native)" msgid "Invalid command format (native)"
msgstr "" msgstr ""
@@ -488,12 +610,6 @@ msgstr ""
msgid "File not found: {0}" msgid "File not found: {0}"
msgstr "" msgstr ""
msgid "Cannot launch game while another game is running"
msgstr ""
msgid "Launching"
msgstr ""
msgid "Reboot" msgid "Reboot"
msgstr "" msgstr ""

View File

@@ -9,7 +9,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2025-06-14 10:37+0500\n" "POT-Creation-Date: 2025-06-22 18:23+0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: es_ES\n" "Language: es_ES\n"
@@ -26,31 +26,70 @@ msgstr ""
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "" msgstr ""
msgid "Import to Legendary"
msgstr ""
msgid "Remove from Steam"
msgstr ""
msgid "Add to Steam"
msgstr ""
msgid "Open Game Folder"
msgstr ""
msgid "Remove from Desktop" msgid "Remove from Desktop"
msgstr "" msgstr ""
msgid "Add to Desktop" msgid "Add to Desktop"
msgstr "" msgstr ""
msgid "Edit Shortcut"
msgstr ""
msgid "Delete from PortProton"
msgstr ""
msgid "Open Game Folder"
msgstr ""
msgid "Remove from Menu" msgid "Remove from Menu"
msgstr "" msgstr ""
msgid "Add to Menu" msgid "Add to Menu"
msgstr "" msgstr ""
msgid "Remove from Steam" msgid "Edit Shortcut"
msgstr "" msgstr ""
msgid "Add to Steam" msgid "Delete from PortProton"
msgstr ""
msgid "Error"
msgstr ""
#, python-brace-format
msgid "Legendary executable not found at {0}"
msgstr ""
msgid "Success"
msgstr ""
#, python-brace-format
msgid "'{0}' was added to Steam. Please restart Steam for changes to take effect."
msgstr ""
#, python-brace-format
msgid "Executable file not found for game: {0}"
msgstr ""
#, python-brace-format
msgid "Opened folder for EGS game '{0}'"
msgstr ""
#, python-brace-format
msgid "Failed to open game folder: {0}"
msgstr ""
msgid "Select Game Installation Folder"
msgstr ""
msgid "No folder selected"
msgstr ""
#, python-brace-format
msgid "Importing '{0}' to Legendary..."
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
@@ -61,14 +100,51 @@ msgstr ""
msgid "Removed '{0}' from favorites" msgid "Removed '{0}' from favorites"
msgstr "" msgstr ""
msgid "Error"
msgstr ""
msgid "PortProton is not found." msgid "PortProton is not found."
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
msgid "No executable command found in .desktop for game: {0}" msgid "start.sh not found at {0}"
msgstr ""
#, python-brace-format
msgid "Failed to create .desktop file: {0}"
msgstr ""
#, python-brace-format
msgid "Game '{0}' added to desktop"
msgstr ""
#, python-brace-format
msgid "Failed to add game to desktop: {0}"
msgstr ""
#, python-brace-format
msgid "Failed to remove game '{0}' from Desktop: {{0}}"
msgstr ""
#, python-brace-format
msgid "Successfully removed game '{0}' from Desktop"
msgstr ""
#, python-brace-format
msgid "Game '{0}' added to menu"
msgstr ""
#, python-brace-format
msgid "Failed to add game '{0}' to menu: {1}"
msgstr ""
#, python-brace-format
msgid "Failed to remove game '{0}' from menu: {{0}}"
msgstr ""
#, python-brace-format
msgid "Successfully removed game '{0}' from menu"
msgstr ""
#, python-brace-format
msgid "No executable command found in .desktop file for game: {0}"
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
@@ -76,7 +152,7 @@ msgid "Failed to parse .desktop file for game: {0}"
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
msgid "Error reading .desktop file: {0}" msgid "Failed to read .desktop file: {0}"
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
@@ -105,7 +181,7 @@ msgid ""
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
msgid "Could not locate .desktop file for '{0}'" msgid "Could not locate .desktop file for game: {0}"
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
@@ -121,35 +197,7 @@ msgid "Failed to delete custom data: {0}"
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
msgid "Game '{0}' added to menu" msgid "Failed to add game '{0}' to desktop: {1}"
msgstr ""
#, python-brace-format
msgid "Failed to add game to menu: {0}"
msgstr ""
#, python-brace-format
msgid "Failed to remove game from menu: {0}"
msgstr ""
#, python-brace-format
msgid "Game '{0}' removed from menu"
msgstr ""
#, python-brace-format
msgid "Game '{0}' added to desktop"
msgstr ""
#, python-brace-format
msgid "Failed to add game to desktop: {0}"
msgstr ""
#, python-brace-format
msgid "Failed to remove game from Desktop: {0}"
msgstr ""
#, python-brace-format
msgid "Game '{0}' removed from Desktop"
msgstr "" msgstr ""
msgid "Game name and executable path are required." msgid "Game name and executable path are required."
@@ -174,25 +222,54 @@ msgstr ""
msgid "Failed to copy cover image: {0}" msgid "Failed to copy cover image: {0}"
msgstr "" msgstr ""
msgid "Restart Steam" #, python-brace-format
msgstr "" msgid "Failed to add game '{0}' to Steam: {1}"
msgid ""
"The game was added successfully.\n"
"Please restart Steam for changes to take effect."
msgstr ""
msgid ""
"The game was removed successfully.\n"
"Please restart Steam for changes to take effect."
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
msgid "Opened folder for '{0}'" msgid ""
"'{0}' was removed from Steam. Please restart Steam for changes to take "
"effect."
msgstr ""
msgid "PortProton directory not found"
msgstr ""
msgid "Steam directory not found"
msgstr ""
msgid "Failed to get Steam user ID"
msgstr ""
msgid "Steam shortcuts file not found"
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
msgid "Failed to open game folder: {0}" msgid "Failed to create backup of shortcuts.vdf: {0}"
msgstr ""
#, python-brace-format
msgid "Failed to load shortcuts.vdf: {0}"
msgstr ""
#, python-brace-format
msgid "Game '{0}' not found in Steam shortcuts"
msgstr ""
#, python-brace-format
msgid "Failed to update shortcuts.vdf: {0}"
msgstr ""
#, python-brace-format
msgid "Failed to remove EGS game '{0}' from Steam: {1}"
msgstr ""
#, python-brace-format
msgid "Failed to remove game '{0}' from Steam: {1}"
msgstr ""
#, python-brace-format
msgid "Successfully opened folder for '{0}'"
msgstr "" msgstr ""
msgid "Edit Game" msgid "Edit Game"
@@ -235,10 +312,10 @@ msgstr ""
msgid "Loading Epic Games Store games..." msgid "Loading Epic Games Store games..."
msgstr "" msgstr ""
msgid "No description available" msgid "Never"
msgstr "" msgstr ""
msgid "Never" msgid "No description available"
msgstr "" msgstr ""
msgid "Supported" msgid "Supported"
@@ -382,6 +459,21 @@ msgstr ""
msgid "Gamepad haptic feedback:" msgid "Gamepad haptic feedback:"
msgstr "" msgstr ""
msgid "Open Legendary Login"
msgstr ""
msgid "Legendary Authentication:"
msgstr ""
msgid "Enter Legendary Authorization Code"
msgstr ""
msgid "Authorization Code:"
msgstr ""
msgid "Submit Code"
msgstr ""
msgid "Save Settings" msgid "Save Settings"
msgstr "" msgstr ""
@@ -397,6 +489,22 @@ msgstr ""
msgid "Failed to open Legendary login page" msgid "Failed to open Legendary login page"
msgstr "" msgstr ""
msgid "Please enter an authorization code"
msgstr ""
msgid "Successfully authenticated with Legendary"
msgstr ""
#, python-brace-format
msgid "Legendary authentication failed: {0}"
msgstr ""
msgid "Legendary executable not found"
msgstr ""
msgid "Unexpected error during authentication"
msgstr ""
msgid "Confirm Reset" msgid "Confirm Reset"
msgstr "" msgstr ""
@@ -478,6 +586,20 @@ msgstr ""
msgid "Play" msgid "Play"
msgstr "" msgstr ""
#, python-brace-format
msgid "Executable not found for EGS game: {0}"
msgstr ""
msgid "Cannot launch game while another game is running"
msgstr ""
msgid "Launching"
msgstr ""
#, python-brace-format
msgid "Failed to launch game: {0}"
msgstr ""
msgid "Invalid command format (native)" msgid "Invalid command format (native)"
msgstr "" msgstr ""
@@ -488,12 +610,6 @@ msgstr ""
msgid "File not found: {0}" msgid "File not found: {0}"
msgstr "" msgstr ""
msgid "Cannot launch game while another game is running"
msgstr ""
msgid "Launching"
msgstr ""
msgid "Reboot" msgid "Reboot"
msgstr "" msgstr ""

View File

@@ -9,7 +9,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PortProtonQt 0.1.1\n" "Project-Id-Version: PortProtonQt 0.1.1\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2025-06-14 10:37+0500\n" "POT-Creation-Date: 2025-06-22 18:23+0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -24,31 +24,70 @@ msgstr ""
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "" msgstr ""
msgid "Import to Legendary"
msgstr ""
msgid "Remove from Steam"
msgstr ""
msgid "Add to Steam"
msgstr ""
msgid "Open Game Folder"
msgstr ""
msgid "Remove from Desktop" msgid "Remove from Desktop"
msgstr "" msgstr ""
msgid "Add to Desktop" msgid "Add to Desktop"
msgstr "" msgstr ""
msgid "Edit Shortcut"
msgstr ""
msgid "Delete from PortProton"
msgstr ""
msgid "Open Game Folder"
msgstr ""
msgid "Remove from Menu" msgid "Remove from Menu"
msgstr "" msgstr ""
msgid "Add to Menu" msgid "Add to Menu"
msgstr "" msgstr ""
msgid "Remove from Steam" msgid "Edit Shortcut"
msgstr "" msgstr ""
msgid "Add to Steam" msgid "Delete from PortProton"
msgstr ""
msgid "Error"
msgstr ""
#, python-brace-format
msgid "Legendary executable not found at {0}"
msgstr ""
msgid "Success"
msgstr ""
#, python-brace-format
msgid "'{0}' was added to Steam. Please restart Steam for changes to take effect."
msgstr ""
#, python-brace-format
msgid "Executable file not found for game: {0}"
msgstr ""
#, python-brace-format
msgid "Opened folder for EGS game '{0}'"
msgstr ""
#, python-brace-format
msgid "Failed to open game folder: {0}"
msgstr ""
msgid "Select Game Installation Folder"
msgstr ""
msgid "No folder selected"
msgstr ""
#, python-brace-format
msgid "Importing '{0}' to Legendary..."
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
@@ -59,14 +98,51 @@ msgstr ""
msgid "Removed '{0}' from favorites" msgid "Removed '{0}' from favorites"
msgstr "" msgstr ""
msgid "Error"
msgstr ""
msgid "PortProton is not found." msgid "PortProton is not found."
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
msgid "No executable command found in .desktop for game: {0}" msgid "start.sh not found at {0}"
msgstr ""
#, python-brace-format
msgid "Failed to create .desktop file: {0}"
msgstr ""
#, python-brace-format
msgid "Game '{0}' added to desktop"
msgstr ""
#, python-brace-format
msgid "Failed to add game to desktop: {0}"
msgstr ""
#, python-brace-format
msgid "Failed to remove game '{0}' from Desktop: {{0}}"
msgstr ""
#, python-brace-format
msgid "Successfully removed game '{0}' from Desktop"
msgstr ""
#, python-brace-format
msgid "Game '{0}' added to menu"
msgstr ""
#, python-brace-format
msgid "Failed to add game '{0}' to menu: {1}"
msgstr ""
#, python-brace-format
msgid "Failed to remove game '{0}' from menu: {{0}}"
msgstr ""
#, python-brace-format
msgid "Successfully removed game '{0}' from menu"
msgstr ""
#, python-brace-format
msgid "No executable command found in .desktop file for game: {0}"
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
@@ -74,7 +150,7 @@ msgid "Failed to parse .desktop file for game: {0}"
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
msgid "Error reading .desktop file: {0}" msgid "Failed to read .desktop file: {0}"
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
@@ -103,7 +179,7 @@ msgid ""
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
msgid "Could not locate .desktop file for '{0}'" msgid "Could not locate .desktop file for game: {0}"
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
@@ -119,35 +195,7 @@ msgid "Failed to delete custom data: {0}"
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
msgid "Game '{0}' added to menu" msgid "Failed to add game '{0}' to desktop: {1}"
msgstr ""
#, python-brace-format
msgid "Failed to add game to menu: {0}"
msgstr ""
#, python-brace-format
msgid "Failed to remove game from menu: {0}"
msgstr ""
#, python-brace-format
msgid "Game '{0}' removed from menu"
msgstr ""
#, python-brace-format
msgid "Game '{0}' added to desktop"
msgstr ""
#, python-brace-format
msgid "Failed to add game to desktop: {0}"
msgstr ""
#, python-brace-format
msgid "Failed to remove game from Desktop: {0}"
msgstr ""
#, python-brace-format
msgid "Game '{0}' removed from Desktop"
msgstr "" msgstr ""
msgid "Game name and executable path are required." msgid "Game name and executable path are required."
@@ -172,25 +220,54 @@ msgstr ""
msgid "Failed to copy cover image: {0}" msgid "Failed to copy cover image: {0}"
msgstr "" msgstr ""
msgid "Restart Steam" #, python-brace-format
msgstr "" msgid "Failed to add game '{0}' to Steam: {1}"
msgid ""
"The game was added successfully.\n"
"Please restart Steam for changes to take effect."
msgstr ""
msgid ""
"The game was removed successfully.\n"
"Please restart Steam for changes to take effect."
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
msgid "Opened folder for '{0}'" msgid ""
"'{0}' was removed from Steam. Please restart Steam for changes to take "
"effect."
msgstr ""
msgid "PortProton directory not found"
msgstr ""
msgid "Steam directory not found"
msgstr ""
msgid "Failed to get Steam user ID"
msgstr ""
msgid "Steam shortcuts file not found"
msgstr "" msgstr ""
#, python-brace-format #, python-brace-format
msgid "Failed to open game folder: {0}" msgid "Failed to create backup of shortcuts.vdf: {0}"
msgstr ""
#, python-brace-format
msgid "Failed to load shortcuts.vdf: {0}"
msgstr ""
#, python-brace-format
msgid "Game '{0}' not found in Steam shortcuts"
msgstr ""
#, python-brace-format
msgid "Failed to update shortcuts.vdf: {0}"
msgstr ""
#, python-brace-format
msgid "Failed to remove EGS game '{0}' from Steam: {1}"
msgstr ""
#, python-brace-format
msgid "Failed to remove game '{0}' from Steam: {1}"
msgstr ""
#, python-brace-format
msgid "Successfully opened folder for '{0}'"
msgstr "" msgstr ""
msgid "Edit Game" msgid "Edit Game"
@@ -233,10 +310,10 @@ msgstr ""
msgid "Loading Epic Games Store games..." msgid "Loading Epic Games Store games..."
msgstr "" msgstr ""
msgid "No description available" msgid "Never"
msgstr "" msgstr ""
msgid "Never" msgid "No description available"
msgstr "" msgstr ""
msgid "Supported" msgid "Supported"
@@ -380,6 +457,21 @@ msgstr ""
msgid "Gamepad haptic feedback:" msgid "Gamepad haptic feedback:"
msgstr "" msgstr ""
msgid "Open Legendary Login"
msgstr ""
msgid "Legendary Authentication:"
msgstr ""
msgid "Enter Legendary Authorization Code"
msgstr ""
msgid "Authorization Code:"
msgstr ""
msgid "Submit Code"
msgstr ""
msgid "Save Settings" msgid "Save Settings"
msgstr "" msgstr ""
@@ -395,6 +487,22 @@ msgstr ""
msgid "Failed to open Legendary login page" msgid "Failed to open Legendary login page"
msgstr "" msgstr ""
msgid "Please enter an authorization code"
msgstr ""
msgid "Successfully authenticated with Legendary"
msgstr ""
#, python-brace-format
msgid "Legendary authentication failed: {0}"
msgstr ""
msgid "Legendary executable not found"
msgstr ""
msgid "Unexpected error during authentication"
msgstr ""
msgid "Confirm Reset" msgid "Confirm Reset"
msgstr "" msgstr ""
@@ -476,6 +584,20 @@ msgstr ""
msgid "Play" msgid "Play"
msgstr "" msgstr ""
#, python-brace-format
msgid "Executable not found for EGS game: {0}"
msgstr ""
msgid "Cannot launch game while another game is running"
msgstr ""
msgid "Launching"
msgstr ""
#, python-brace-format
msgid "Failed to launch game: {0}"
msgstr ""
msgid "Invalid command format (native)" msgid "Invalid command format (native)"
msgstr "" msgstr ""
@@ -486,12 +608,6 @@ msgstr ""
msgid "File not found: {0}" msgid "File not found: {0}"
msgstr "" msgstr ""
msgid "Cannot launch game while another game is running"
msgstr ""
msgid "Launching"
msgstr ""
msgid "Reboot" msgid "Reboot"
msgstr "" msgstr ""

View File

@@ -9,8 +9,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2025-06-14 10:37+0500\n" "POT-Creation-Date: 2025-06-22 18:23+0500\n"
"PO-Revision-Date: 2025-06-14 10:37+0500\n" "PO-Revision-Date: 2025-06-22 18:22+0500\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language: ru_RU\n" "Language: ru_RU\n"
"Language-Team: ru_RU <LL@li.org>\n" "Language-Team: ru_RU <LL@li.org>\n"
@@ -27,32 +27,73 @@ msgstr "Удалить из Избранного"
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Добавить в Избранное" msgstr "Добавить в Избранное"
msgid "Import to Legendary"
msgstr "Импортировать игру"
msgid "Remove from Steam"
msgstr "Удалить из Steam"
msgid "Add to Steam"
msgstr "Добавить в Steam"
msgid "Open Game Folder"
msgstr "Открыть папку с игрой"
msgid "Remove from Desktop" msgid "Remove from Desktop"
msgstr "Удалить с рабочего стола" msgstr "Удалить с рабочего стола"
msgid "Add to Desktop" msgid "Add to Desktop"
msgstr "Добавить на рабочий стол" msgstr "Добавить на рабочий стол"
msgid "Edit Shortcut"
msgstr "Редактировать"
msgid "Delete from PortProton"
msgstr "Удалить из PortProton"
msgid "Open Game Folder"
msgstr "Открыть папку с игрой"
msgid "Remove from Menu" msgid "Remove from Menu"
msgstr "Удалить из меню" msgstr "Удалить из меню"
msgid "Add to Menu" msgid "Add to Menu"
msgstr "Добавить в меню" msgstr "Добавить в меню"
msgid "Remove from Steam" msgid "Edit Shortcut"
msgstr "Удалить из Steam" msgstr "Редактировать"
msgid "Add to Steam" msgid "Delete from PortProton"
msgstr "Добавить в Steam" msgstr "Удалить из PortProton"
msgid "Error"
msgstr "Ошибка"
#, python-brace-format
msgid "Legendary executable not found at {0}"
msgstr "Legendary не найден по пути {0}"
msgid "Success"
msgstr "Успешно"
#, python-brace-format
msgid "'{0}' was added to Steam. Please restart Steam for changes to take effect."
msgstr ""
"'{0}' был добавлен в Steam. Пожалуйста, перезапустите Steam, чтобы "
"изменения вступили в силу."
#, python-brace-format
msgid "Executable file not found for game: {0}"
msgstr "Не найден исполняемый файл для игры: {0}"
#, python-brace-format
msgid "Opened folder for EGS game '{0}'"
msgstr "Открытие папки для игры EGS '{0}'"
#, python-brace-format
msgid "Failed to open game folder: {0}"
msgstr "Не удалось открыть папку для игры: {0}"
msgid "Select Game Installation Folder"
msgstr "Выберите папку установки игры"
msgid "No folder selected"
msgstr "Не выбрана ни одна папка"
#, python-brace-format
msgid "Importing '{0}' to Legendary..."
msgstr "Игра '{0}' импортирована"
#, python-brace-format #, python-brace-format
msgid "Added '{0}' to favorites" msgid "Added '{0}' to favorites"
@@ -62,23 +103,60 @@ msgstr "Добавление '{0}' в избранное"
msgid "Removed '{0}' from favorites" msgid "Removed '{0}' from favorites"
msgstr "Удаление '{0}' из избранного" msgstr "Удаление '{0}' из избранного"
msgid "Error"
msgstr "Ошибка"
msgid "PortProton is not found." msgid "PortProton is not found."
msgstr "PortProton не найден." msgstr "PortProton не найден."
#, python-brace-format #, python-brace-format
msgid "No executable command found in .desktop for game: {0}" msgid "start.sh not found at {0}"
msgstr "Не найдено ни одной исполняемой команды для игры: {0}" msgstr "start.sh не найден по адресу {0}"
#, python-brace-format
msgid "Failed to create .desktop file: {0}"
msgstr "Не удалось создать файл .desktop: {0}"
#, python-brace-format
msgid "Game '{0}' added to desktop"
msgstr "Игра '{0}' добавлена на рабочий стол"
#, python-brace-format
msgid "Failed to add game to desktop: {0}"
msgstr "Не удалось добавить игру на рабочий стол: {0}"
#, python-brace-format
msgid "Failed to remove game '{0}' from Desktop: {{0}}"
msgstr "Не удалось удалить игру '{0}' с рабочего стола: {{0}}"
#, python-brace-format
msgid "Successfully removed game '{0}' from Desktop"
msgstr "Успешно удалена игра '{0}' с рабочего стола"
#, python-brace-format
msgid "Game '{0}' added to menu"
msgstr "Игра '{0}' добавлена в меню"
#, python-brace-format
msgid "Failed to add game '{0}' to menu: {1}"
msgstr "Не удалось добавить игру в меню: '{0}' в меню: {1}"
#, python-brace-format
msgid "Failed to remove game '{0}' from menu: {{0}}"
msgstr "Не удалось удалить игру '{0}' из меню: {{0}}"
#, python-brace-format
msgid "Successfully removed game '{0}' from menu"
msgstr "Успешно удалена игра '{0}' из меню"
#, python-brace-format
msgid "No executable command found in .desktop file for game: {0}"
msgstr "В файле .desktop для игры не найдено ни одной исполняемой команды: {0}"
#, python-brace-format #, python-brace-format
msgid "Failed to parse .desktop file for game: {0}" msgid "Failed to parse .desktop file for game: {0}"
msgstr "Не удалось удалить файл .desktop: {0}" msgstr "Не удалось удалить файл .desktop: {0}"
#, python-brace-format #, python-brace-format
msgid "Error reading .desktop file: {0}" msgid "Failed to read .desktop file: {0}"
msgstr "Не удалось удалить файл .desktop: {0}" msgstr "Не удалось прочитать файл .desktop: {0}"
#, python-brace-format #, python-brace-format
msgid ".desktop file not found for game: {0}" msgid ".desktop file not found for game: {0}"
@@ -108,8 +186,8 @@ msgstr ""
".desktop и настраиваемых данных." ".desktop и настраиваемых данных."
#, python-brace-format #, python-brace-format
msgid "Could not locate .desktop file for '{0}'" msgid "Could not locate .desktop file for game: {0}"
msgstr "Не удалось найти файл .desktop для '{0}'" msgstr "Не удалось найти файл .desktop для игры: {0}"
#, python-brace-format #, python-brace-format
msgid "Failed to delete .desktop file: {0}" msgid "Failed to delete .desktop file: {0}"
@@ -124,36 +202,8 @@ msgid "Failed to delete custom data: {0}"
msgstr "Не удалось удалить настраиваемые данные: {0}" msgstr "Не удалось удалить настраиваемые данные: {0}"
#, python-brace-format #, python-brace-format
msgid "Game '{0}' added to menu" msgid "Failed to add game '{0}' to desktop: {1}"
msgstr "Игра '{0}' добавлена в меню" msgstr "Не удалось добавить игру '{0}' на рабочий стол: {1}"
#, python-brace-format
msgid "Failed to add game to menu: {0}"
msgstr "Не удалось добавить игру в меню: {0}"
#, python-brace-format
msgid "Failed to remove game from menu: {0}"
msgstr "Не удалось удалить игру из меню: {0}"
#, python-brace-format
msgid "Game '{0}' removed from menu"
msgstr "Игра '{0}' удалена из меню"
#, python-brace-format
msgid "Game '{0}' added to desktop"
msgstr "Игра '{0}' добавлена на рабочий стол"
#, python-brace-format
msgid "Failed to add game to desktop: {0}"
msgstr "Не удалось добавить игру на рабочий стол: {0}"
#, python-brace-format
msgid "Failed to remove game from Desktop: {0}"
msgstr "Не удалось удалить игру с рабочего стола: {0}"
#, python-brace-format
msgid "Game '{0}' removed from Desktop"
msgstr "Игра '{0}' удалена с рабочего стола"
msgid "Game name and executable path are required." msgid "Game name and executable path are required."
msgstr "Необходимо указать название игры и путь к исполняемому файлу." msgstr "Необходимо указать название игры и путь к исполняемому файлу."
@@ -177,30 +227,57 @@ msgstr "Не удалось удалить файл .desktop: {0}"
msgid "Failed to copy cover image: {0}" msgid "Failed to copy cover image: {0}"
msgstr "Не удалось удалить игру из меню: {0}" msgstr "Не удалось удалить игру из меню: {0}"
msgid "Restart Steam" #, python-brace-format
msgstr "Перезапустите Steam" msgid "Failed to add game '{0}' to Steam: {1}"
msgstr "Не удалось добавить игру '{0}' в Steam: {1}"
msgid ""
"The game was added successfully.\n"
"Please restart Steam for changes to take effect."
msgstr ""
"Игра была успешно добавлена.\n"
"Пожалуйста, перезапустите Steam, чтобы изменения вступили в силу."
msgid ""
"The game was removed successfully.\n"
"Please restart Steam for changes to take effect."
msgstr ""
"Игра была успешно удалена..\n"
"Пожалуйста, перезапустите Steam, чтобы изменения вступили в силу."
#, python-brace-format #, python-brace-format
msgid "Opened folder for '{0}'" msgid ""
msgstr "Открытие папки для '{0}'" "'{0}' was removed from Steam. Please restart Steam for changes to take "
"effect."
msgstr ""
"'{0}' был удалён из Steam. Пожалуйста, перезапустите Steam, чтобы "
"изменения вступили в силу."
msgid "PortProton directory not found"
msgstr "PortProton не найден."
msgid "Steam directory not found"
msgstr "Каталог Steam не найден"
msgid "Failed to get Steam user ID"
msgstr "Не удалось получить ID пользователя Steam"
msgid "Steam shortcuts file not found"
msgstr "Файл ярлыков Steam не найден"
#, python-brace-format #, python-brace-format
msgid "Failed to open game folder: {0}" msgid "Failed to create backup of shortcuts.vdf: {0}"
msgstr "Не удалось открыть папку для игры: {0}" msgstr "Не удалось создать резервную копию shortcuts.vdf: {0}"
#, python-brace-format
msgid "Failed to load shortcuts.vdf: {0}"
msgstr "Не удалось загрузить shortcuts.vdf: {0}"
#, python-brace-format
msgid "Game '{0}' not found in Steam shortcuts"
msgstr "Игра '{0}' не найдена в ярлыках Steam"
#, python-brace-format
msgid "Failed to update shortcuts.vdf: {0}"
msgstr "Не удалось обновить shortcuts.vdf: {0}"
#, python-brace-format
msgid "Failed to remove EGS game '{0}' from Steam: {1}"
msgstr "Не удалось удалить игру EGS '{0}' из Steam: {1}"
#, python-brace-format
msgid "Failed to remove game '{0}' from Steam: {1}"
msgstr "Не удалось удалить игру '{0}' из Steam: {1}"
#, python-brace-format
msgid "Successfully opened folder for '{0}'"
msgstr "Успешно открыта папка для '{0}'"
msgid "Edit Game" msgid "Edit Game"
msgstr "Редактировать игру" msgstr "Редактировать игру"
@@ -242,12 +319,12 @@ msgstr "Запустить игру \"{name}\" с помощью PortProton"
msgid "Loading Epic Games Store games..." msgid "Loading Epic Games Store games..."
msgstr "Загрузка игр из Epic Games Store..." msgstr "Загрузка игр из Epic Games Store..."
msgid "No description available"
msgstr "Описание не найдено"
msgid "Never" msgid "Never"
msgstr "Никогда" msgstr "Никогда"
msgid "No description available"
msgstr "Описание не найдено"
msgid "Supported" msgid "Supported"
msgstr "Поддерживается" msgstr "Поддерживается"
@@ -389,6 +466,21 @@ msgstr "Тактильная отдача на геймпаде"
msgid "Gamepad haptic feedback:" msgid "Gamepad haptic feedback:"
msgstr "Тактильная отдача на геймпаде:" msgstr "Тактильная отдача на геймпаде:"
msgid "Open Legendary Login"
msgstr "Открыть браузер для входа в Legendary"
msgid "Legendary Authentication:"
msgstr "Авторизация в Legendary:"
msgid "Enter Legendary Authorization Code"
msgstr "Введите код авторизации Legendary"
msgid "Authorization Code:"
msgstr "Код авторизации;"
msgid "Submit Code"
msgstr "Отправить код"
msgid "Save Settings" msgid "Save Settings"
msgstr "Сохранить настройки" msgstr "Сохранить настройки"
@@ -404,6 +496,22 @@ msgstr "Открытие страницы входа в Legendary в брауз
msgid "Failed to open Legendary login page" msgid "Failed to open Legendary login page"
msgstr "Не удалось открыть страницу входа в Legendary" msgstr "Не удалось открыть страницу входа в Legendary"
msgid "Please enter an authorization code"
msgstr "Пожалуйста, введите код авторизации"
msgid "Successfully authenticated with Legendary"
msgstr "Успешная аутентификация в Legendary"
#, python-brace-format
msgid "Legendary authentication failed: {0}"
msgstr "Не удалось выполнить аутентификацию Legendary: {0}"
msgid "Legendary executable not found"
msgstr "Не найден исполняемый файл Legendary"
msgid "Unexpected error during authentication"
msgstr "Неожиданная ошибка при аутентификации"
msgid "Confirm Reset" msgid "Confirm Reset"
msgstr "Подтвердите удаление" msgstr "Подтвердите удаление"
@@ -487,6 +595,20 @@ msgstr "Остановить"
msgid "Play" msgid "Play"
msgstr "Играть" msgstr "Играть"
#, python-brace-format
msgid "Executable not found for EGS game: {0}"
msgstr "Не найден исполняемый файл для игры EGS: {0}"
msgid "Cannot launch game while another game is running"
msgstr "Невозможно запустить игру пока запущена другая"
msgid "Launching"
msgstr "Идёт запуск"
#, python-brace-format
msgid "Failed to launch game: {0}"
msgstr "Не удалось запустить игру: {0}"
msgid "Invalid command format (native)" msgid "Invalid command format (native)"
msgstr "Неправильный формат команды (нативная версия)" msgstr "Неправильный формат команды (нативная версия)"
@@ -497,12 +619,6 @@ msgstr "Неправильный формат команды (flatpak)"
msgid "File not found: {0}" msgid "File not found: {0}"
msgstr "Файл не найден: {0}" msgstr "Файл не найден: {0}"
msgid "Cannot launch game while another game is running"
msgstr "Невозможно запустить игру пока запущена другая"
msgid "Launching"
msgstr "Идёт запуск"
msgid "Reboot" msgid "Reboot"
msgstr "Перезагрузить" msgstr "Перезагрузить"