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

View File

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

View File

@@ -20,9 +20,9 @@ Current translation status:
| Locale | Progress | Translated |
| :----- | -------: | ---------: |
| [de_DE](./de_DE/LC_MESSAGES/messages.po) | 0% | 0 of 161 |
| [es_ES](./es_ES/LC_MESSAGES/messages.po) | 0% | 0 of 161 |
| [ru_RU](./ru_RU/LC_MESSAGES/messages.po) | 100% | 161 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 194 |
| [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 |
| [es_ES](./es_ES/LC_MESSAGES/messages.po) | 0% | 0 из 161 |
| [ru_RU](./ru_RU/LC_MESSAGES/messages.po) | 100% | 161 из 161 |
| [de_DE](./de_DE/LC_MESSAGES/messages.po) | 0% | 0 из 194 |
| [es_ES](./es_ES/LC_MESSAGES/messages.po) | 0% | 0 из 194 |
| [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 portprotonqt.config_utils import parse_desktop_entry, read_favorites, save_favorites
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.egs_api import add_egs_to_steam, get_egs_executable
import vdf
@@ -23,6 +23,7 @@ class ContextMenuSignals(QObject):
"""Signals for thread-safe UI updates from worker threads."""
show_status_message = Signal(str, int)
show_warning_dialog = Signal(str, str)
show_info_dialog = Signal(str, str)
class ContextMenuManager:
"""Manages context menu actions for game management in PortProtonQt."""
@@ -65,12 +66,21 @@ class ContextMenuManager:
self._show_warning_dialog,
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):
"""Show a warning dialog in the main thread."""
logger.debug("Showing warning dialog: %s - %s", 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:
"""
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
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)
if is_in_steam:
remove_steam_action = menu.addAction(_("Remove from Steam"))
@@ -227,23 +233,22 @@ class ContextMenuManager:
return
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
def on_add_to_steam_result(result: tuple[bool, str]):
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
self.signals.show_info_dialog.emit(
_("Success"),
_("'{0}' was added to Steam. Please restart Steam for changes to take effect.").format(game_name)
)
else:
self.signals.show_warning_dialog.emit(_("Error"), message)
if self.parent.statusBar():
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)
logger.debug("Adding '%s' to Steam", game_name)
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):
@@ -258,7 +263,7 @@ class ContextMenuManager:
exe_path = get_egs_executable(app_name, self.legendary_config_path)
if not exe_path or not os.path.exists(exe_path):
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("Error"),
_("Executable file not found for game: {0}").format(app_name)
)
@@ -275,7 +280,7 @@ class ContextMenuManager:
else:
logger.warning("Status bar not available when opening folder for '%s'", app_name)
except Exception as e:
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("Error"),
_("Failed to open game folder: {0}").format(str(e))
)
@@ -305,7 +310,7 @@ class ContextMenuManager:
return
if not os.path.exists(self.legendary_path):
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("Error"),
_("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)
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):
"""
Toggle the favorite status of a game and update its icon.
@@ -439,7 +369,7 @@ class ContextMenuManager:
def _check_portproton(self):
"""Check if PortProton is available."""
if self.portproton_location is None:
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("Error"),
_("PortProton is not found.")
)
@@ -474,7 +404,7 @@ class ContextMenuManager:
return False
if not os.path.exists(self.legendary_path):
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("Error"),
_("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:
wrapper = start_sh_path
if not os.path.exists(start_sh_path):
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("Error"),
_("start.sh not found at {0}").format(start_sh_path)
)
@@ -509,10 +439,10 @@ class ContextMenuManager:
desktop_entry = f"""[Desktop Entry]
Type=Application
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}
Terminal=false
Categories=Game;
Categories=Game
"""
try:
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}")
return True
except Exception as e:
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("Error"),
_("Failed to create .desktop file: {0}").format(str(e))
)
@@ -555,13 +485,13 @@ Categories=Game;
self.parent.statusBar().showMessage(
_("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:
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:
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("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):
@@ -575,8 +505,8 @@ Categories=Game;
desktop_path = os.path.join(desktop_dir, f"{game_name}.desktop")
self._remove_file(
desktop_path,
_("Failed to remove game from Desktop: {0}"),
_("Game '{0}' removed from Desktop"),
_("Failed to remove game '{0}' from Desktop: {{0}}").format(game_name),
_("Successfully removed game '{0}' from Desktop").format(game_name),
game_name
)
@@ -608,13 +538,13 @@ Categories=Game;
self.parent.statusBar().showMessage(
_("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:
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:
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("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):
@@ -628,8 +558,8 @@ Categories=Game;
desktop_path = os.path.join(applications_dir, f"{game_name}.desktop")
self._remove_file(
desktop_path,
_("Failed to remove game from menu: {0}"),
_("Game '{0}' removed from menu"),
_("Failed to remove game '{0}' from menu: {{0}}").format(game_name),
_("Successfully removed game '{0}' from menu").format(game_name),
game_name
)
@@ -645,21 +575,21 @@ Categories=Game;
if entry:
exec_line = entry.get("Exec", entry.get("exec", "")).strip()
if not exec_line:
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("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
else:
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("Error"),
_("Failed to parse .desktop file for game: {0}").format(game_name)
)
return None
except Exception as e:
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("Error"),
_("Error reading .desktop file: {0}").format(e)
_("Failed to read .desktop file: {0}").format(str(e))
)
return None
else:
@@ -669,7 +599,7 @@ Categories=Game;
exec_line = entry.get("Exec", entry.get("exec", "")).strip()
if exec_line:
return exec_line
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("Error"),
_(".desktop file not found for game: {0}").format(game_name)
)
@@ -681,7 +611,7 @@ Categories=Game;
try:
entry_exec_split = shlex.split(exec_line)
if not entry_exec_split:
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("Error"),
_("Invalid executable command: {0}").format(exec_line)
)
@@ -693,16 +623,16 @@ Categories=Game;
else:
exe_path = entry_exec_split[-1]
if not exe_path or not os.path.exists(exe_path):
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("Error"),
_("Executable file not found: {0}").format(exe_path or "None")
)
return None
return exe_path
except Exception as e:
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("Error"),
_("Failed to parse executable command: {0}").format(e)
_("Failed to parse executable command: {0}").format(str(e))
)
return None
@@ -717,9 +647,9 @@ Categories=Game;
logger.warning("Status bar not available when removing file for '%s'", game_name)
return True
except OSError as e:
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("Error"),
error_message.format(e)
error_message.format(str(e))
)
return False
@@ -741,9 +671,9 @@ Categories=Game;
desktop_path = self._get_desktop_path(game_name)
if not os.path.exists(desktop_path):
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("Error"),
_("Could not locate .desktop file for '{0}'").format(game_name)
_("Could not locate .desktop file for game: {0}").format(game_name)
)
return
@@ -772,9 +702,9 @@ Categories=Game;
try:
shutil.rmtree(custom_folder)
except OSError as e:
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("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):
@@ -784,9 +714,9 @@ Categories=Game;
desktop_path = self._get_desktop_path(game_name)
if not os.path.exists(desktop_path):
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("Error"),
_("Could not locate .desktop file for '{0}'").format(game_name)
_("Could not locate .desktop file for game: {0}").format(game_name)
)
return
@@ -801,13 +731,13 @@ Categories=Game;
self.parent.statusBar().showMessage(
_("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:
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:
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("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):
@@ -816,8 +746,8 @@ Categories=Game;
desktop_path = os.path.join(applications_dir, f"{game_name}.desktop")
self._remove_file(
desktop_path,
_("Failed to remove game from menu: {0}"),
_("Game '{0}' removed from menu"),
_("Failed to remove game '{0}' from menu: {{0}}").format(game_name),
_("Successfully removed game '{0}' from menu").format(game_name),
game_name
)
@@ -828,9 +758,9 @@ Categories=Game;
desktop_path = self._get_desktop_path(game_name)
if not os.path.exists(desktop_path):
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("Error"),
_("Could not locate .desktop file for '{0}'").format(game_name)
_("Could not locate .desktop file for game: {0}").format(game_name)
)
return
@@ -845,13 +775,13 @@ Categories=Game;
self.parent.statusBar().showMessage(
_("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:
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:
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("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):
@@ -860,8 +790,8 @@ Categories=Game;
desktop_path = os.path.join(desktop_dir, f"{game_name}.desktop")
self._remove_file(
desktop_path,
_("Failed to remove game from Desktop: {0}"),
_("Game '{0}' removed from Desktop"),
_("Failed to remove game '{0}' from Desktop: {{0}}").format(game_name),
_("Successfully removed game '{0}' from Desktop").format(game_name),
game_name
)
@@ -893,7 +823,7 @@ Categories=Game;
new_cover_path = dialog.coverEdit.text().strip()
if not new_name or not new_exe_path:
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("Error"),
_("Game name and executable path are required.")
)
@@ -901,7 +831,7 @@ Categories=Game;
desktop_entry, new_desktop_path = dialog.getDesktopEntryData()
if not desktop_entry or not new_desktop_path:
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("Error"),
_("Failed to generate .desktop file data.")
)
@@ -921,9 +851,9 @@ Categories=Game;
f.write(desktop_entry)
os.chmod(new_desktop_path, 0o755)
except OSError as e:
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("Error"),
_("Failed to save .desktop file: {0}").format(e)
_("Failed to save .desktop file: {0}").format(str(e))
)
return
@@ -941,9 +871,9 @@ Categories=Game;
try:
shutil.copyfile(new_cover_path, os.path.join(custom_folder, f"cover{ext}"))
except OSError as e:
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("Error"),
_("Failed to copy cover image: {0}").format(e)
_("Failed to copy cover image: {0}").format(str(e))
)
return
@@ -960,23 +890,19 @@ Categories=Game;
if not exe_path:
return
def on_add_to_steam_result(result: tuple[bool, str]):
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)
logger.debug("Adding '{0}' to Steam", game_name)
if self.parent.statusBar():
self.parent.statusBar().showMessage(
_("Adding '{0}' to Steam...").format(game_name), 0
try:
add_to_steam(game_name, exec_line, cover_path)
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):
"""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]):
success, message = result
if success:
self.signals.show_status_message.emit(
_("The game was removed successfully. Please restart Steam for changes to take effect."), 5000
self.signals.show_info_dialog.emit(
_("Success"),
_("'{0}' was removed from Steam. Please restart Steam for changes to take effect.").format(game_name)
)
else:
self.signals.show_warning_dialog.emit(_("Error"), message)
@@ -995,7 +922,7 @@ Categories=Game;
if game_source == "epic":
# For EGS games, construct the script path used in Steam shortcuts.vdf
if not self.portproton_location:
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("Error"),
_("PortProton directory not found")
)
@@ -1007,15 +934,14 @@ Categories=Game;
# Directly remove the shortcut by matching AppName and Exe
try:
from portprotonqt.steam_api import get_steam_home, get_last_steam_user, convert_steam_id
steam_home = get_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
last_user = get_last_steam_user(steam_home)
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
userdata_dir = os.path.join(steam_home, "userdata")
@@ -1026,7 +952,7 @@ Categories=Game;
backup_path = f"{steam_shortcuts_path}.backup"
if not os.path.exists(steam_shortcuts_path):
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("Error"),
_("Steam shortcuts file not found")
)
@@ -1037,9 +963,9 @@ Categories=Game;
shutil.copy2(steam_shortcuts_path, backup_path)
logger.info(f"Created backup of shortcuts.vdf at {backup_path}")
except Exception as e:
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("Error"),
_("Failed to create backup of shortcuts.vdf: {0}").format(e)
_("Failed to create backup of shortcuts.vdf: {0}").format(str(e))
)
return
@@ -1048,9 +974,9 @@ Categories=Game;
with open(steam_shortcuts_path, 'rb') as f:
shortcuts_data = vdf.binary_load(f)
except Exception as e:
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("Error"),
_("Failed to load shortcuts.vdf: {0}").format(e)
_("Failed to load shortcuts.vdf: {0}").format(str(e))
)
return
@@ -1068,7 +994,7 @@ Categories=Game;
index += 1
if not modified:
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("Error"),
_("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}'")
on_remove_from_steam_result((True, f"Game '{game_name}' removed from Steam"))
except Exception as e:
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("Error"),
_("Failed to update shortcuts.vdf: {0}").format(e)
_("Failed to update shortcuts.vdf: {0}").format(str(e))
)
if os.path.exists(backup_path):
try:
@@ -1098,20 +1024,20 @@ Categories=Game;
if os.path.exists(script_path):
try:
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:
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:
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("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
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)
if not exec_line:
return
@@ -1121,13 +1047,21 @@ Categories=Game;
return
if self.parent.statusBar():
self.parent.statusBar().showMessage(
_("Removing '{0}' from Steam...").format(game_name), 0
)
logger.debug("Direct status message: Removing '%s' from Steam", game_name)
logger.debug("Direct status message: Removing '{0}' from Steam", game_name)
else:
logger.warning("Status bar not available when removing '%s' from Steam", game_name)
remove_from_steam(game_name, exec_line)
logger.warning("Status bar not available when removing '{0}' from Steam", game_name)
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):
"""Open the folder containing the game's executable."""
@@ -1147,13 +1081,13 @@ Categories=Game;
QDesktopServices.openUrl(QUrl.fromLocalFile(folder_path))
if self.parent.statusBar():
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:
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:
self._show_warning_dialog(
self.signals.show_warning_dialog.emit(
_("Error"),
_("Failed to open game folder: {0}").format(str(e))
)

View File

@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: de_DE\n"
@@ -26,31 +26,70 @@ msgstr ""
msgid "Add to Favorites"
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"
msgstr ""
msgid "Add to Desktop"
msgstr ""
msgid "Edit Shortcut"
msgstr ""
msgid "Delete from PortProton"
msgstr ""
msgid "Open Game Folder"
msgstr ""
msgid "Remove from Menu"
msgstr ""
msgid "Add to Menu"
msgstr ""
msgid "Remove from Steam"
msgid "Edit Shortcut"
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 ""
#, python-brace-format
@@ -61,14 +100,51 @@ msgstr ""
msgid "Removed '{0}' from favorites"
msgstr ""
msgid "Error"
msgstr ""
msgid "PortProton is not found."
msgstr ""
#, 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 ""
#, python-brace-format
@@ -76,7 +152,7 @@ msgid "Failed to parse .desktop file for game: {0}"
msgstr ""
#, python-brace-format
msgid "Error reading .desktop file: {0}"
msgid "Failed to read .desktop file: {0}"
msgstr ""
#, python-brace-format
@@ -105,7 +181,7 @@ msgid ""
msgstr ""
#, python-brace-format
msgid "Could not locate .desktop file for '{0}'"
msgid "Could not locate .desktop file for game: {0}"
msgstr ""
#, python-brace-format
@@ -121,35 +197,7 @@ msgid "Failed to delete custom data: {0}"
msgstr ""
#, python-brace-format
msgid "Game '{0}' added to menu"
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"
msgid "Failed to add game '{0}' to desktop: {1}"
msgstr ""
msgid "Game name and executable path are required."
@@ -174,25 +222,54 @@ msgstr ""
msgid "Failed to copy cover image: {0}"
msgstr ""
msgid "Restart Steam"
msgstr ""
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."
#, python-brace-format
msgid "Failed to add game '{0}' to Steam: {1}"
msgstr ""
#, 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 ""
#, 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 ""
msgid "Edit Game"
@@ -235,10 +312,10 @@ msgstr ""
msgid "Loading Epic Games Store games..."
msgstr ""
msgid "No description available"
msgid "Never"
msgstr ""
msgid "Never"
msgid "No description available"
msgstr ""
msgid "Supported"
@@ -382,6 +459,21 @@ msgstr ""
msgid "Gamepad haptic feedback:"
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"
msgstr ""
@@ -397,6 +489,22 @@ msgstr ""
msgid "Failed to open Legendary login page"
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"
msgstr ""
@@ -478,6 +586,20 @@ msgstr ""
msgid "Play"
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)"
msgstr ""
@@ -488,12 +610,6 @@ msgstr ""
msgid "File not found: {0}"
msgstr ""
msgid "Cannot launch game while another game is running"
msgstr ""
msgid "Launching"
msgstr ""
msgid "Reboot"
msgstr ""

View File

@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: es_ES\n"
@@ -26,31 +26,70 @@ msgstr ""
msgid "Add to Favorites"
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"
msgstr ""
msgid "Add to Desktop"
msgstr ""
msgid "Edit Shortcut"
msgstr ""
msgid "Delete from PortProton"
msgstr ""
msgid "Open Game Folder"
msgstr ""
msgid "Remove from Menu"
msgstr ""
msgid "Add to Menu"
msgstr ""
msgid "Remove from Steam"
msgid "Edit Shortcut"
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 ""
#, python-brace-format
@@ -61,14 +100,51 @@ msgstr ""
msgid "Removed '{0}' from favorites"
msgstr ""
msgid "Error"
msgstr ""
msgid "PortProton is not found."
msgstr ""
#, 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 ""
#, python-brace-format
@@ -76,7 +152,7 @@ msgid "Failed to parse .desktop file for game: {0}"
msgstr ""
#, python-brace-format
msgid "Error reading .desktop file: {0}"
msgid "Failed to read .desktop file: {0}"
msgstr ""
#, python-brace-format
@@ -105,7 +181,7 @@ msgid ""
msgstr ""
#, python-brace-format
msgid "Could not locate .desktop file for '{0}'"
msgid "Could not locate .desktop file for game: {0}"
msgstr ""
#, python-brace-format
@@ -121,35 +197,7 @@ msgid "Failed to delete custom data: {0}"
msgstr ""
#, python-brace-format
msgid "Game '{0}' added to menu"
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"
msgid "Failed to add game '{0}' to desktop: {1}"
msgstr ""
msgid "Game name and executable path are required."
@@ -174,25 +222,54 @@ msgstr ""
msgid "Failed to copy cover image: {0}"
msgstr ""
msgid "Restart Steam"
msgstr ""
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."
#, python-brace-format
msgid "Failed to add game '{0}' to Steam: {1}"
msgstr ""
#, 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 ""
#, 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 ""
msgid "Edit Game"
@@ -235,10 +312,10 @@ msgstr ""
msgid "Loading Epic Games Store games..."
msgstr ""
msgid "No description available"
msgid "Never"
msgstr ""
msgid "Never"
msgid "No description available"
msgstr ""
msgid "Supported"
@@ -382,6 +459,21 @@ msgstr ""
msgid "Gamepad haptic feedback:"
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"
msgstr ""
@@ -397,6 +489,22 @@ msgstr ""
msgid "Failed to open Legendary login page"
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"
msgstr ""
@@ -478,6 +586,20 @@ msgstr ""
msgid "Play"
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)"
msgstr ""
@@ -488,12 +610,6 @@ msgstr ""
msgid "File not found: {0}"
msgstr ""
msgid "Cannot launch game while another game is running"
msgstr ""
msgid "Launching"
msgstr ""
msgid "Reboot"
msgstr ""

View File

@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PortProtonQt 0.1.1\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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -24,31 +24,70 @@ msgstr ""
msgid "Add to Favorites"
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"
msgstr ""
msgid "Add to Desktop"
msgstr ""
msgid "Edit Shortcut"
msgstr ""
msgid "Delete from PortProton"
msgstr ""
msgid "Open Game Folder"
msgstr ""
msgid "Remove from Menu"
msgstr ""
msgid "Add to Menu"
msgstr ""
msgid "Remove from Steam"
msgid "Edit Shortcut"
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 ""
#, python-brace-format
@@ -59,14 +98,51 @@ msgstr ""
msgid "Removed '{0}' from favorites"
msgstr ""
msgid "Error"
msgstr ""
msgid "PortProton is not found."
msgstr ""
#, 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 ""
#, python-brace-format
@@ -74,7 +150,7 @@ msgid "Failed to parse .desktop file for game: {0}"
msgstr ""
#, python-brace-format
msgid "Error reading .desktop file: {0}"
msgid "Failed to read .desktop file: {0}"
msgstr ""
#, python-brace-format
@@ -103,7 +179,7 @@ msgid ""
msgstr ""
#, python-brace-format
msgid "Could not locate .desktop file for '{0}'"
msgid "Could not locate .desktop file for game: {0}"
msgstr ""
#, python-brace-format
@@ -119,35 +195,7 @@ msgid "Failed to delete custom data: {0}"
msgstr ""
#, python-brace-format
msgid "Game '{0}' added to menu"
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"
msgid "Failed to add game '{0}' to desktop: {1}"
msgstr ""
msgid "Game name and executable path are required."
@@ -172,25 +220,54 @@ msgstr ""
msgid "Failed to copy cover image: {0}"
msgstr ""
msgid "Restart Steam"
msgstr ""
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."
#, python-brace-format
msgid "Failed to add game '{0}' to Steam: {1}"
msgstr ""
#, 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 ""
#, 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 ""
msgid "Edit Game"
@@ -233,10 +310,10 @@ msgstr ""
msgid "Loading Epic Games Store games..."
msgstr ""
msgid "No description available"
msgid "Never"
msgstr ""
msgid "Never"
msgid "No description available"
msgstr ""
msgid "Supported"
@@ -380,6 +457,21 @@ msgstr ""
msgid "Gamepad haptic feedback:"
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"
msgstr ""
@@ -395,6 +487,22 @@ msgstr ""
msgid "Failed to open Legendary login page"
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"
msgstr ""
@@ -476,6 +584,20 @@ msgstr ""
msgid "Play"
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)"
msgstr ""
@@ -486,12 +608,6 @@ msgstr ""
msgid "File not found: {0}"
msgstr ""
msgid "Cannot launch game while another game is running"
msgstr ""
msgid "Launching"
msgstr ""
msgid "Reboot"
msgstr ""

View File

@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2025-06-14 10:37+0500\n"
"PO-Revision-Date: 2025-06-14 10:37+0500\n"
"POT-Creation-Date: 2025-06-22 18:23+0500\n"
"PO-Revision-Date: 2025-06-22 18:22+0500\n"
"Last-Translator: \n"
"Language: ru_RU\n"
"Language-Team: ru_RU <LL@li.org>\n"
@@ -27,32 +27,73 @@ msgstr "Удалить из Избранного"
msgid "Add to Favorites"
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"
msgstr "Удалить с рабочего стола"
msgid "Add to Desktop"
msgstr "Добавить на рабочий стол"
msgid "Edit Shortcut"
msgstr "Редактировать"
msgid "Delete from PortProton"
msgstr "Удалить из PortProton"
msgid "Open Game Folder"
msgstr "Открыть папку с игрой"
msgid "Remove from Menu"
msgstr "Удалить из меню"
msgid "Add to Menu"
msgstr "Добавить в меню"
msgid "Remove from Steam"
msgstr "Удалить из Steam"
msgid "Edit Shortcut"
msgstr "Редактировать"
msgid "Add to Steam"
msgstr "Добавить в Steam"
msgid "Delete from PortProton"
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
msgid "Added '{0}' to favorites"
@@ -62,23 +103,60 @@ msgstr "Добавление '{0}' в избранное"
msgid "Removed '{0}' from favorites"
msgstr "Удаление '{0}' из избранного"
msgid "Error"
msgstr "Ошибка"
msgid "PortProton is not found."
msgstr "PortProton не найден."
#, python-brace-format
msgid "No executable command found in .desktop for game: {0}"
msgstr "Не найдено ни одной исполняемой команды для игры: {0}"
msgid "start.sh not found at {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
msgid "Failed to parse .desktop file for game: {0}"
msgstr "Не удалось удалить файл .desktop: {0}"
#, python-brace-format
msgid "Error reading .desktop file: {0}"
msgstr "Не удалось удалить файл .desktop: {0}"
msgid "Failed to read .desktop file: {0}"
msgstr "Не удалось прочитать файл .desktop: {0}"
#, python-brace-format
msgid ".desktop file not found for game: {0}"
@@ -108,8 +186,8 @@ msgstr ""
".desktop и настраиваемых данных."
#, python-brace-format
msgid "Could not locate .desktop file for '{0}'"
msgstr "Не удалось найти файл .desktop для '{0}'"
msgid "Could not locate .desktop file for game: {0}"
msgstr "Не удалось найти файл .desktop для игры: {0}"
#, python-brace-format
msgid "Failed to delete .desktop file: {0}"
@@ -124,36 +202,8 @@ msgid "Failed to delete custom data: {0}"
msgstr "Не удалось удалить настраиваемые данные: {0}"
#, python-brace-format
msgid "Game '{0}' added to menu"
msgstr "Игра '{0}' добавлена в меню"
#, 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 "Failed to add game '{0}' to desktop: {1}"
msgstr "Не удалось добавить игру '{0}' на рабочий стол: {1}"
msgid "Game name and executable path are required."
msgstr "Необходимо указать название игры и путь к исполняемому файлу."
@@ -177,30 +227,57 @@ msgstr "Не удалось удалить файл .desktop: {0}"
msgid "Failed to copy cover image: {0}"
msgstr "Не удалось удалить игру из меню: {0}"
msgid "Restart Steam"
msgstr "Перезапустите Steam"
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
msgid "Failed to add game '{0}' to Steam: {1}"
msgstr "Не удалось добавить игру '{0}' в Steam: {1}"
#, python-brace-format
msgid "Opened folder for '{0}'"
msgstr "Открытие папки для '{0}'"
msgid ""
"'{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
msgid "Failed to open game folder: {0}"
msgstr "Не удалось открыть папку для игры: {0}"
msgid "Failed to create backup of shortcuts.vdf: {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"
msgstr "Редактировать игру"
@@ -242,12 +319,12 @@ msgstr "Запустить игру \"{name}\" с помощью PortProton"
msgid "Loading Epic Games Store games..."
msgstr "Загрузка игр из Epic Games Store..."
msgid "No description available"
msgstr "Описание не найдено"
msgid "Never"
msgstr "Никогда"
msgid "No description available"
msgstr "Описание не найдено"
msgid "Supported"
msgstr "Поддерживается"
@@ -389,6 +466,21 @@ msgstr "Тактильная отдача на геймпаде"
msgid "Gamepad haptic feedback:"
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"
msgstr "Сохранить настройки"
@@ -404,6 +496,22 @@ msgstr "Открытие страницы входа в Legendary в брауз
msgid "Failed to open Legendary login page"
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"
msgstr "Подтвердите удаление"
@@ -487,6 +595,20 @@ msgstr "Остановить"
msgid "Play"
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)"
msgstr "Неправильный формат команды (нативная версия)"
@@ -497,12 +619,6 @@ msgstr "Неправильный формат команды (flatpak)"
msgid "File not found: {0}"
msgstr "Файл не найден: {0}"
msgid "Cannot launch game while another game is running"
msgstr "Невозможно запустить игру пока запущена другая"
msgid "Launching"
msgstr "Идёт запуск"
msgid "Reboot"
msgstr "Перезагрузить"