From 80089a81d57425c5a14e169ad5040d47b43829d3 Mon Sep 17 00:00:00 2001 From: dervart Date: Wed, 2 Jul 2025 21:25:53 +0700 Subject: [PATCH 1/5] feat(context_menu_manager): add class CustomLineEdit --- portprotonqt/context_menu_manager.py | 68 ++++++++++++++++++- portprotonqt/main_window.py | 12 ++-- .../themes/standart/images/icons/copy.svg | 1 + .../themes/standart/images/icons/cut.svg | 1 + .../themes/standart/images/icons/delete.svg | 2 +- .../themes/standart/images/icons/paste.svg | 1 + .../themes/standart/images/icons/redo.svg | 1 + .../standart/images/icons/select_all.svg | 1 + .../themes/standart/images/icons/undo.svg | 1 + portprotonqt/themes/standart/styles.py | 24 +++---- 10 files changed, 90 insertions(+), 22 deletions(-) create mode 100644 portprotonqt/themes/standart/images/icons/copy.svg create mode 100644 portprotonqt/themes/standart/images/icons/cut.svg create mode 100644 portprotonqt/themes/standart/images/icons/paste.svg create mode 100644 portprotonqt/themes/standart/images/icons/redo.svg create mode 100644 portprotonqt/themes/standart/images/icons/select_all.svg create mode 100644 portprotonqt/themes/standart/images/icons/undo.svg diff --git a/portprotonqt/context_menu_manager.py b/portprotonqt/context_menu_manager.py index 2c84b74..04c7f8f 100644 --- a/portprotonqt/context_menu_manager.py +++ b/portprotonqt/context_menu_manager.py @@ -8,7 +8,7 @@ import logging import orjson import psutil import signal -from PySide6.QtWidgets import QMessageBox, QDialog, QMenu +from PySide6.QtWidgets import QMessageBox, QDialog, QMenu, QLineEdit, QApplication from PySide6.QtCore import QUrl, QPoint, QObject, Signal, Qt from PySide6.QtGui import QDesktopServices, QIcon from portprotonqt.localization import _ @@ -1080,3 +1080,69 @@ Icon={icon_path} _("Error"), _("Failed to open folder: {error}").format(error=str(e)) ) + +class CustomLineEdit(QLineEdit): + + def __init__(self, *args, theme=None, **kwargs): + super().__init__(*args, **kwargs) + self.theme = theme + self.theme_manager = ThemeManager() + + def contextMenuEvent(self, event): + def get_safe_icon(icon_name: str) -> QIcon: + icon = self.theme_manager.get_icon(icon_name) + if isinstance(icon, QIcon): + return icon + elif isinstance(icon, str) and os.path.exists(icon): + return QIcon(icon) + return QIcon() + + menu = QMenu(self) + if self.theme and hasattr(self.theme, "CONTEXT_MENU_STYLE"): + menu.setStyleSheet(self.theme.CONTEXT_MENU_STYLE) + + # Undo + undo = menu.addAction(get_safe_icon("undo"), _("Undo\tCtrl+Z")) + undo.triggered.connect(self.undo) + undo.setEnabled(self.isUndoAvailable()) + + # Redo + redo = menu.addAction(get_safe_icon("redo"), _("Redo\tCtrl+Y")) + redo.triggered.connect(self.redo) + redo.setEnabled(self.isRedoAvailable()) + + menu.addSeparator() + + # Cut + cut = menu.addAction(get_safe_icon("cut"), _("Cut\tCtrl+X")) + cut.triggered.connect(self.cut) + cut.setEnabled(self.hasSelectedText()) + + # Copy + copy = menu.addAction(get_safe_icon("copy"), _("Copy\tCtrl+C")) + copy.triggered.connect(self.copy) + copy.setEnabled(self.hasSelectedText()) + + # Paste + paste = menu.addAction(get_safe_icon("paste"), _("Paste\tCtrl+V")) + paste.triggered.connect(self.paste) + paste.setEnabled(QApplication.clipboard().mimeData().hasText()) + + # Delete + delete = menu.addAction(get_safe_icon("delete"), _("Delete\tDel")) + delete.triggered.connect(self._delete_selected_text) + delete.setEnabled(self.hasSelectedText()) + + menu.addSeparator() + + # Select All + select_all = menu.addAction(get_safe_icon("select_all"), _("Select All\tCtrl+A")) + select_all.triggered.connect(self.selectAll) + select_all.setEnabled(bool(self.text())) + + menu.exec(event.globalPos()) + + def _delete_selected_text(self): + cursor_pos = self.cursorPosition() + self.backspace() + self.setCursorPosition(cursor_pos) diff --git a/portprotonqt/main_window.py b/portprotonqt/main_window.py index 16584d9..211132a 100644 --- a/portprotonqt/main_window.py +++ b/portprotonqt/main_window.py @@ -12,7 +12,7 @@ from portprotonqt.dialogs import AddGameDialog, FileExplorer from portprotonqt.game_card import GameCard from portprotonqt.custom_widgets import FlowLayout, ClickableLabel, AutoSizeButton, NavLabel from portprotonqt.input_manager import InputManager -from portprotonqt.context_menu_manager import ContextMenuManager +from portprotonqt.context_menu_manager import ContextMenuManager, CustomLineEdit from portprotonqt.system_overlay import SystemOverlay from portprotonqt.image_utils import load_pixmap_async, round_corners, ImageCarousel @@ -589,7 +589,7 @@ class MainWindow(QMainWindow): self.addGameButton.clicked.connect(self.openAddGameDialog) layout.addWidget(self.addGameButton, alignment=Qt.AlignmentFlag.AlignRight) - self.searchEdit = QLineEdit() + self.searchEdit = CustomLineEdit(self, theme=self.theme) icon: QIcon = cast(QIcon, self.theme_manager.get_icon("search")) action_pos = cast(QLineEdit.ActionPosition, QLineEdit.ActionPosition.LeadingPosition) self.search_action = self.searchEdit.addAction(icon, action_pos) @@ -1039,7 +1039,7 @@ class MainWindow(QMainWindow): formLayout.addRow(self.gamesDisplayTitle, self.gamesDisplayCombo) # 4. Proxy settings - self.proxyUrlEdit = QLineEdit() + self.proxyUrlEdit = CustomLineEdit(self, theme=self.theme) self.proxyUrlEdit.setPlaceholderText(_("Proxy URL")) self.proxyUrlEdit.setStyleSheet(self.theme.PROXY_INPUT_STYLE) self.proxyUrlEdit.setFocusPolicy(Qt.FocusPolicy.StrongFocus) @@ -1051,7 +1051,7 @@ class MainWindow(QMainWindow): self.proxyUrlEdit.setText(proxy_cfg["http"]) formLayout.addRow(self.proxyUrlTitle, self.proxyUrlEdit) - self.proxyUserEdit = QLineEdit() + self.proxyUserEdit = CustomLineEdit(self, theme=self.theme) self.proxyUserEdit.setPlaceholderText(_("Proxy Username")) self.proxyUserEdit.setStyleSheet(self.theme.PROXY_INPUT_STYLE) self.proxyUserEdit.setFocusPolicy(Qt.FocusPolicy.StrongFocus) @@ -1060,7 +1060,7 @@ class MainWindow(QMainWindow): self.proxyUserTitle.setFocusPolicy(Qt.FocusPolicy.NoFocus) formLayout.addRow(self.proxyUserTitle, self.proxyUserEdit) - self.proxyPasswordEdit = QLineEdit() + self.proxyPasswordEdit = CustomLineEdit(self, theme=self.theme) self.proxyPasswordEdit.setPlaceholderText(_("Proxy Password")) self.proxyPasswordEdit.setEchoMode(QLineEdit.EchoMode.Password) self.proxyPasswordEdit.setStyleSheet(self.theme.PROXY_INPUT_STYLE) @@ -1359,7 +1359,7 @@ class MainWindow(QMainWindow): self.themeMetainfoLabel.setWordWrap(True) self.themeInfoLayout.addWidget(self.themeMetainfoLabel) - self.applyButton = AutoSizeButton(_("Apply Theme"), icon=self.theme_manager.get_icon("update")) + self.applyButton = AutoSizeButton(_("Apply Theme"), icon=self.theme_manager.get_icon("apply")) self.applyButton.setStyleSheet(self.theme.ACTION_BUTTON_STYLE) self.applyButton.setObjectName("actionButton") self.themeInfoLayout.addWidget(self.applyButton) diff --git a/portprotonqt/themes/standart/images/icons/copy.svg b/portprotonqt/themes/standart/images/icons/copy.svg new file mode 100644 index 0000000..3f23b76 --- /dev/null +++ b/portprotonqt/themes/standart/images/icons/copy.svg @@ -0,0 +1 @@ + diff --git a/portprotonqt/themes/standart/images/icons/cut.svg b/portprotonqt/themes/standart/images/icons/cut.svg new file mode 100644 index 0000000..55df7a9 --- /dev/null +++ b/portprotonqt/themes/standart/images/icons/cut.svg @@ -0,0 +1 @@ + diff --git a/portprotonqt/themes/standart/images/icons/delete.svg b/portprotonqt/themes/standart/images/icons/delete.svg index 0a7ef6d..0d44f54 100644 --- a/portprotonqt/themes/standart/images/icons/delete.svg +++ b/portprotonqt/themes/standart/images/icons/delete.svg @@ -1 +1 @@ - + diff --git a/portprotonqt/themes/standart/images/icons/paste.svg b/portprotonqt/themes/standart/images/icons/paste.svg new file mode 100644 index 0000000..e15aea0 --- /dev/null +++ b/portprotonqt/themes/standart/images/icons/paste.svg @@ -0,0 +1 @@ + diff --git a/portprotonqt/themes/standart/images/icons/redo.svg b/portprotonqt/themes/standart/images/icons/redo.svg new file mode 100644 index 0000000..18110bc --- /dev/null +++ b/portprotonqt/themes/standart/images/icons/redo.svg @@ -0,0 +1 @@ + diff --git a/portprotonqt/themes/standart/images/icons/select_all.svg b/portprotonqt/themes/standart/images/icons/select_all.svg new file mode 100644 index 0000000..fae609b --- /dev/null +++ b/portprotonqt/themes/standart/images/icons/select_all.svg @@ -0,0 +1 @@ + diff --git a/portprotonqt/themes/standart/images/icons/undo.svg b/portprotonqt/themes/standart/images/icons/undo.svg new file mode 100644 index 0000000..706fd9d --- /dev/null +++ b/portprotonqt/themes/standart/images/icons/undo.svg @@ -0,0 +1 @@ + diff --git a/portprotonqt/themes/standart/styles.py b/portprotonqt/themes/standart/styles.py index d885cf5..a103820 100644 --- a/portprotonqt/themes/standart/styles.py +++ b/portprotonqt/themes/standart/styles.py @@ -103,9 +103,10 @@ CONTEXT_MENU_STYLE = f""" font-family: '{font_family}'; font-size: {font_size_a}; padding: 5px; + min-width: 150px; }} QMenu::icon {{ - margin-left: 15px; + margin-left: 15px; }} QMenu::item {{ padding: 8px 20px 8px 10px; @@ -117,6 +118,9 @@ CONTEXT_MENU_STYLE = f""" background: {color_a}; color: {color_f}; }} + QMenu::item:disabled {{ + color: #7f7f7f; + }} QMenu::item:hover {{ background: {color_a}; color: {color_f}; @@ -127,6 +131,11 @@ CONTEXT_MENU_STYLE = f""" border: {border_b} rgba(255, 255, 255, 0.3); border-radius: {border_radius_a}; }} + QMenu::separator {{ + height: 1px; + background-color: #7f7f7f; + margin: 4px 8px; + }} """ # ГЛОБАЛЬНЫЙ СТИЛЬ ДЛЯ ОКНА (ФОН), ЛЭЙБЛОВ, КНОПОК @@ -742,19 +751,6 @@ PROXY_INPUT_STYLE = f""" border: {border_c} {color_a}; background-color: {color_e}; }} - QMenu {{ - border: {border_b} rgba(255, 255, 255, 0.2); - padding: 5px 10px; - background: {color_d}; - }} - QMenu::item {{ - padding: 0px 10px; - border: 10px solid {color_h}; /* reserve space for selection border */ - }} - QMenu::item:selected {{ - background: {color_c}; - border-radius: {border_radius_a}; - }} """ SETTINGS_COMBO_STYLE = f""" -- 2.49.0 From 0ee25a7bf6c7c2797e56c14ac7fae23ba6fac1d8 Mon Sep 17 00:00:00 2001 From: dervart Date: Wed, 2 Jul 2025 22:25:31 +0700 Subject: [PATCH 2/5] feat(dialogs): add CustomLineEdit to AddGameDialog --- portprotonqt/dialogs.py | 9 +++++---- portprotonqt/main_window.py | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/portprotonqt/dialogs.py b/portprotonqt/dialogs.py index 59a5899..9713dd4 100644 --- a/portprotonqt/dialogs.py +++ b/portprotonqt/dialogs.py @@ -3,7 +3,7 @@ import tempfile from typing import cast, TYPE_CHECKING from PySide6.QtGui import QPixmap, QIcon from PySide6.QtWidgets import ( - QDialog, QLineEdit, QFormLayout, QHBoxLayout, QLabel, QVBoxLayout, QListWidget, QScrollArea, QWidget, QListWidgetItem, QSizePolicy, QApplication + QDialog, QFormLayout, QHBoxLayout, QLabel, QVBoxLayout, QListWidget, QScrollArea, QWidget, QListWidgetItem, QSizePolicy, QApplication ) from PySide6.QtCore import Qt, QObject, Signal, QMimeDatabase, QTimer from icoextract import IconExtractor, IconExtractorError @@ -442,6 +442,7 @@ class FileExplorer(QDialog): class AddGameDialog(QDialog): def __init__(self, parent=None, theme=None, edit_mode=False, game_name=None, exe_path=None, cover_path=None): super().__init__(parent) + from portprotonqt.context_menu_manager import CustomLineEdit # Локальный импорт self.theme = theme if theme else default_styles self.theme_manager = ThemeManager() self.edit_mode = edit_mode @@ -461,7 +462,7 @@ class AddGameDialog(QDialog): layout.setFieldGrowthPolicy(QFormLayout.FieldGrowthPolicy.ExpandingFieldsGrow) # Game name - self.nameEdit = QLineEdit(self) + self.nameEdit = CustomLineEdit(self, theme=self.theme) self.nameEdit.setStyleSheet(self.theme.ADDGAME_INPUT_STYLE) if game_name: self.nameEdit.setText(game_name) @@ -474,7 +475,7 @@ class AddGameDialog(QDialog): exe_label.setStyleSheet( self.theme.PARAMS_TITLE_STYLE) - self.exeEdit = QLineEdit(self) + self.exeEdit = CustomLineEdit(self, theme=self.theme) self.exeEdit.setStyleSheet(self.theme.ADDGAME_INPUT_STYLE) if exe_path: self.exeEdit.setText(exe_path) @@ -496,7 +497,7 @@ class AddGameDialog(QDialog): cover_label = QLabel(_("Custom Cover:")) cover_label.setStyleSheet(self.theme.PARAMS_TITLE_STYLE) - self.coverEdit = QLineEdit(self) + self.coverEdit = CustomLineEdit(self, theme=self.theme) self.coverEdit.setStyleSheet(self.theme.ADDGAME_INPUT_STYLE) if cover_path: self.coverEdit.setText(cover_path) diff --git a/portprotonqt/main_window.py b/portprotonqt/main_window.py index 211132a..556a59c 100644 --- a/portprotonqt/main_window.py +++ b/portprotonqt/main_window.py @@ -1117,7 +1117,7 @@ class MainWindow(QMainWindow): self.legendaryAuthTitle.setFocusPolicy(Qt.FocusPolicy.NoFocus) formLayout.addRow(self.legendaryAuthTitle, self.legendaryAuthButton) - self.legendaryCodeEdit = QLineEdit() + self.legendaryCodeEdit = CustomLineEdit(self, theme=self.theme) self.legendaryCodeEdit.setPlaceholderText(_("Enter Legendary Authorization Code")) self.legendaryCodeEdit.setStyleSheet(self.theme.PROXY_INPUT_STYLE) self.legendaryCodeEdit.setFocusPolicy(Qt.FocusPolicy.StrongFocus) -- 2.49.0 From d2ed759acc9286d1f9816f95c5afde54b9743a80 Mon Sep 17 00:00:00 2001 From: dervart Date: Wed, 2 Jul 2025 22:33:10 +0700 Subject: [PATCH 3/5] fix styles for ADDGAME_INPUT_STYLE --- portprotonqt/themes/standart/styles.py | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/portprotonqt/themes/standart/styles.py b/portprotonqt/themes/standart/styles.py index a103820..f51218c 100644 --- a/portprotonqt/themes/standart/styles.py +++ b/portprotonqt/themes/standart/styles.py @@ -583,19 +583,6 @@ ADDGAME_INPUT_STYLE = f""" border: {border_c} {color_a}; background-color: {color_e}; }} - QMenu {{ - border: {border_b} {color_g}; - padding: 5px 10px; - background: {color_d}; - }} - QMenu::item {{ - padding: 0px 10px; - border: 10px solid {color_h}; /* reserve space for selection border */ - }} - QMenu::item:selected {{ - background: {color_c}; - border-radius: {border_radius_a}; - }} """ # СТИЛЬ КАРТОЧКИ ИГРЫ (GAMECARD) -- 2.49.0 From 74f2149fb56b17ba9addeca3d6781240bff30f18 Mon Sep 17 00:00:00 2001 From: dervart Date: Wed, 2 Jul 2025 22:53:46 +0700 Subject: [PATCH 4/5] chore(localization): update --- dev-scripts/.spellignore | 1 + documentation/localization_guide/README.md | 6 +- documentation/localization_guide/README.ru.md | 6 +- .../locales/de_DE/LC_MESSAGES/messages.mo | Bin 451 -> 451 bytes .../locales/de_DE/LC_MESSAGES/messages.po | 23 ++++++- .../locales/es_ES/LC_MESSAGES/messages.mo | Bin 451 -> 451 bytes .../locales/es_ES/LC_MESSAGES/messages.po | 23 ++++++- portprotonqt/locales/messages.pot | 23 ++++++- .../locales/ru_RU/LC_MESSAGES/messages.mo | Bin 16263 -> 16630 bytes .../locales/ru_RU/LC_MESSAGES/messages.po | 56 ++++++++++++------ 10 files changed, 111 insertions(+), 27 deletions(-) diff --git a/dev-scripts/.spellignore b/dev-scripts/.spellignore index d3ae991..61d707c 100644 --- a/dev-scripts/.spellignore +++ b/dev-scripts/.spellignore @@ -16,3 +16,4 @@ Content-Transfer-Encoding: Generated-By: start.sh EGS +Stop Game diff --git a/documentation/localization_guide/README.md b/documentation/localization_guide/README.md index dfbf6ae..c20b14b 100644 --- a/documentation/localization_guide/README.md +++ b/documentation/localization_guide/README.md @@ -20,9 +20,9 @@ Current translation status: | Locale | Progress | Translated | | :----- | -------: | ---------: | -| [de_DE](./de_DE/LC_MESSAGES/messages.po) | 0% | 0 of 185 | -| [es_ES](./es_ES/LC_MESSAGES/messages.po) | 0% | 0 of 185 | -| [ru_RU](./ru_RU/LC_MESSAGES/messages.po) | 100% | 185 of 185 | +| [de_DE](./de_DE/LC_MESSAGES/messages.po) | 0% | 0 of 192 | +| [es_ES](./es_ES/LC_MESSAGES/messages.po) | 0% | 0 of 192 | +| [ru_RU](./ru_RU/LC_MESSAGES/messages.po) | 100% | 192 of 192 | --- diff --git a/documentation/localization_guide/README.ru.md b/documentation/localization_guide/README.ru.md index fe64ed1..96684ab 100644 --- a/documentation/localization_guide/README.ru.md +++ b/documentation/localization_guide/README.ru.md @@ -20,9 +20,9 @@ | Локаль | Прогресс | Переведено | | :----- | -------: | ---------: | -| [de_DE](./de_DE/LC_MESSAGES/messages.po) | 0% | 0 из 185 | -| [es_ES](./es_ES/LC_MESSAGES/messages.po) | 0% | 0 из 185 | -| [ru_RU](./ru_RU/LC_MESSAGES/messages.po) | 100% | 185 из 185 | +| [de_DE](./de_DE/LC_MESSAGES/messages.po) | 0% | 0 из 192 | +| [es_ES](./es_ES/LC_MESSAGES/messages.po) | 0% | 0 из 192 | +| [ru_RU](./ru_RU/LC_MESSAGES/messages.po) | 100% | 192 из 192 | --- diff --git a/portprotonqt/locales/de_DE/LC_MESSAGES/messages.mo b/portprotonqt/locales/de_DE/LC_MESSAGES/messages.mo index 41e584f9f0c0932f6458341aec2c18fad59cfed6..e0ae7224d6e43bf4ae12c48b5f9670cd513c9917 100644 GIT binary patch delta 19 acmX@ie3*H{WDX-ED-%;~1M`iuH5dUuO9jRN delta 19 acmX@ie3*H{WDY|ED-&aF1JjMOH5dUu4+Xyf diff --git a/portprotonqt/locales/de_DE/LC_MESSAGES/messages.po b/portprotonqt/locales/de_DE/LC_MESSAGES/messages.po index 0e21c4b..8a2258b 100644 --- a/portprotonqt/locales/de_DE/LC_MESSAGES/messages.po +++ b/portprotonqt/locales/de_DE/LC_MESSAGES/messages.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2025-07-02 10:43+0500\n" +"POT-Creation-Date: 2025-07-02 22:45+0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: de_DE\n" @@ -239,6 +239,27 @@ msgstr "" msgid "Failed to remove game '{game_name}' from Steam: {error}" msgstr "" +msgid "Undo\tCtrl+Z" +msgstr "" + +msgid "Redo\tCtrl+Y" +msgstr "" + +msgid "Cut\tCtrl+X" +msgstr "" + +msgid "Copy\tCtrl+C" +msgstr "" + +msgid "Paste\tCtrl+V" +msgstr "" + +msgid "Delete\tDel" +msgstr "" + +msgid "Select All\tCtrl+A" +msgstr "" + msgid "Select" msgstr "" diff --git a/portprotonqt/locales/es_ES/LC_MESSAGES/messages.mo b/portprotonqt/locales/es_ES/LC_MESSAGES/messages.mo index 9ec8c699f555f90cc5d5ed301b0a44a82662b67d..f77422dbdcc8b66750ce87ae106867e4ad74b665 100644 GIT binary patch delta 19 acmX@ie3*H{WDX-ED-%;~1M`iuH5dUuO9jRN delta 19 acmX@ie3*H{WDY|ED-&aF1JjMOH5dUu4+Xyf diff --git a/portprotonqt/locales/es_ES/LC_MESSAGES/messages.po b/portprotonqt/locales/es_ES/LC_MESSAGES/messages.po index 518a581..230eb61 100644 --- a/portprotonqt/locales/es_ES/LC_MESSAGES/messages.po +++ b/portprotonqt/locales/es_ES/LC_MESSAGES/messages.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2025-07-02 10:43+0500\n" +"POT-Creation-Date: 2025-07-02 22:45+0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: es_ES\n" @@ -239,6 +239,27 @@ msgstr "" msgid "Failed to remove game '{game_name}' from Steam: {error}" msgstr "" +msgid "Undo\tCtrl+Z" +msgstr "" + +msgid "Redo\tCtrl+Y" +msgstr "" + +msgid "Cut\tCtrl+X" +msgstr "" + +msgid "Copy\tCtrl+C" +msgstr "" + +msgid "Paste\tCtrl+V" +msgstr "" + +msgid "Delete\tDel" +msgstr "" + +msgid "Select All\tCtrl+A" +msgstr "" + msgid "Select" msgstr "" diff --git a/portprotonqt/locales/messages.pot b/portprotonqt/locales/messages.pot index a1bf5dd..e9efd0a 100644 --- a/portprotonqt/locales/messages.pot +++ b/portprotonqt/locales/messages.pot @@ -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-07-02 10:43+0500\n" +"POT-Creation-Date: 2025-07-02 22:52+0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -237,6 +237,27 @@ msgstr "" msgid "Failed to remove game '{game_name}' from Steam: {error}" msgstr "" +msgid "Undo\tCtrl+Z" +msgstr "" + +msgid "Redo\tCtrl+Y" +msgstr "" + +msgid "Cut\tCtrl+X" +msgstr "" + +msgid "Copy\tCtrl+C" +msgstr "" + +msgid "Paste\tCtrl+V" +msgstr "" + +msgid "Delete\tDel" +msgstr "" + +msgid "Select All\tCtrl+A" +msgstr "" + msgid "Select" msgstr "" diff --git a/portprotonqt/locales/ru_RU/LC_MESSAGES/messages.mo b/portprotonqt/locales/ru_RU/LC_MESSAGES/messages.mo index c5a6149c09bc786e9cb39ba667d666c902dc185c..f59903788ec10c7a2f63a593250ee804a491db74 100644 GIT binary patch delta 3462 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\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Language: ru_RU\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 " +"&& (n%100<10 || n%100>=20) ? 1 : 2);\n" "Generated-By: Babel 2.17.0\n" +"X-Generator: Poedit 3.6\n" msgid "Error" msgstr "Ошибка" @@ -86,11 +87,11 @@ msgstr "Успешно" #, python-brace-format msgid "" -"'{game_name}' was added to Steam. Please restart Steam for changes to " -"take effect." +"'{game_name}' was added to Steam. Please restart Steam for changes to take " +"effect." msgstr "" -"'{game_name}' был(а) добавлен(а) в Steam. Пожалуйста, перезапустите " -"Steam, чтобы изменения вступили в силу." +"'{game_name}' был(а) добавлен(а) в Steam. Пожалуйста, перезапустите Steam, " +"чтобы изменения вступили в силу." #, python-brace-format msgid "Executable not found for game: {game_name}" @@ -190,8 +191,8 @@ msgstr "Подтвердите удаление" #, python-brace-format msgid "" -"Are you sure you want to delete '{game_name}'? This will remove the " -".desktop file and custom data." +"Are you sure you want to delete '{game_name}'? This will remove the .desktop " +"file and custom data." msgstr "" "Вы уверены, что хотите удалить '{game_name}'? Это приведёт к удалению " "файла .desktop и пользовательских данных." @@ -236,16 +237,37 @@ msgstr "Не удалось добавить '{game_name}' в Steam: {error}" #, python-brace-format msgid "" -"'{game_name}' was removed from Steam. Please restart Steam for changes to" -" take effect." +"'{game_name}' was removed from Steam. Please restart Steam for changes to take " +"effect." msgstr "" -"'{game_name}' был(а) удалён(а) из Steam. Пожалуйста, перезапустите Steam," -" чтобы изменения вступили в силу." +"'{game_name}' был(а) удалён(а) из Steam. Пожалуйста, перезапустите Steam, чтобы " +"изменения вступили в силу." #, python-brace-format msgid "Failed to remove game '{game_name}' from Steam: {error}" msgstr "Не удалось удалить игру '{game_name}' из Steam: {error}" +msgid "Undo\tCtrl+Z" +msgstr "Отмена\tCtrl+Z" + +msgid "Redo\tCtrl+Y" +msgstr "Повтор\tCtrl+Y" + +msgid "Cut\tCtrl+X" +msgstr "Вырезать\tCtrl+X" + +msgid "Copy\tCtrl+C" +msgstr "Копировать\tCtrl+C" + +msgid "Paste\tCtrl+V" +msgstr "Вставить\tCtrl+V" + +msgid "Delete\tDel" +msgstr "Удалить\tDel" + +msgid "Select All\tCtrl+A" +msgstr "Выделить всё\tCtrl+A" + msgid "Select" msgstr "Выбрать" @@ -486,8 +508,7 @@ msgstr "Подтвердите удаление" msgid "Are you sure you want to reset all settings? This action cannot be undone." msgstr "" -"Вы уверены, что хотите сбросить все настройки? Это действие нельзя " -"отменить." +"Вы уверены, что хотите сбросить все настройки? Это действие нельзя отменить." msgid "Settings reset. Restarting..." msgstr "Настройки сброшены. Перезапуск..." @@ -632,4 +653,3 @@ msgstr "мин." msgid "sec." msgstr "сек." - -- 2.49.0 From 6b455e4dd17d0b925accac98c655abd05dd9a2a5 Mon Sep 17 00:00:00 2001 From: dervart Date: Wed, 2 Jul 2025 23:00:29 +0700 Subject: [PATCH 5/5] add to spellignore --- dev-scripts/.spellignore | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-scripts/.spellignore b/dev-scripts/.spellignore index 61d707c..8fd336a 100644 --- a/dev-scripts/.spellignore +++ b/dev-scripts/.spellignore @@ -17,3 +17,4 @@ Generated-By: start.sh EGS Stop Game +\t -- 2.49.0