From 05ee989e22999c5e2e8ff5c71d8f020a7babe855 Mon Sep 17 00:00:00 2001 From: Jann Stute Date: Mon, 23 Dec 2024 21:33:09 +0100 Subject: [PATCH] feat: translations for most of the remaining stuff --- tagstudio/resources/translations/en.json | 43 +++++- tagstudio/src/qt/translations.py | 4 +- tagstudio/src/qt/ts_qt.py | 2 +- tagstudio/src/qt/widgets/migration_modal.py | 156 +++++++++++--------- tagstudio/src/qt/widgets/panel.py | 8 +- tagstudio/src/qt/widgets/preview_panel.py | 18 ++- tagstudio/src/qt/widgets/tag.py | 11 +- tagstudio/src/qt/widgets/tag_box.py | 9 +- tagstudio/src/qt/widgets/video_player.py | 8 +- 9 files changed, 166 insertions(+), 93 deletions(-) diff --git a/tagstudio/resources/translations/en.json b/tagstudio/resources/translations/en.json index 95a1d3a3..71fdfb6a 100644 --- a/tagstudio/resources/translations/en.json +++ b/tagstudio/resources/translations/en.json @@ -69,11 +69,14 @@ "generic.close": "Close", "generic.copy": "Copy", "generic.cut": "Cut", + "generic.save": "Save", "generic.delete": "Delete", "generic.delete_alt": "&Delete", + "generic.continue": "Continue", "generic.done": "Done", "generic.done_alt": "&Done", "generic.edit": "Edit", + "generic.edit_alt": "&Edit", "generic.rename": "Rename", "generic.rename_alt": "&Rename", "generic.overwrite": "Overwrite", @@ -102,7 +105,7 @@ "ignore_list.mode.label": "List Mode:", "ignore_list.title": "File Extensions", "library.field.add": "Add Field", - "library.field.confirm_remove": "Are you sure you want to remove this \"%{self.lib.get_field_attr(field, \"name\")}\" field?", + "library.field.confirm_remove": "Are you sure you want to remove this \"{name}\" field?", "library.field.mixed_data": "Mixed Data", "library.field.remove": "Remove Field", "library.missing": "Library Location is Missing", @@ -118,7 +121,7 @@ "menu.edit.manage_file_extensions": "Manage File Extensions", "menu.edit.manage_tags": "Manage Tags", "menu.edit.new_tag": "New &Tag", - "menu.edit": "&Edit", + "menu.edit": "Edit", "menu.file.close_library": "&Close Library", "menu.file.new_library": "New Library", "menu.file.open_create_library": "&Open/Create Library", @@ -156,6 +159,7 @@ "tag.add_to_search": "Add to Search", "tag.edit": "Edit Tag", "tag.add": "Add Tag", + "tag.add.plural": "Add Tags", "tag.create": "Create Tag", "tag.remove": "Remove Tag", "tag.aliases": "Aliases", @@ -185,5 +189,38 @@ "drop_import.progress.window_title": "Import Files", "drop_import.duplicates_choice.singular": "The following file has a filename that already exists in the library.", "drop_import.duplicates_choice.plural": "The following {count} files have filenames that already exist in the library.", - "landing.open_create_library": "Open/Create Library {shortcut}" + "landing.open_create_library": "Open/Create Library {shortcut}", + "video_player.autoplay": "Autoplay", + "json_migration.title": "Save Format Migration: \"{path}\"", + "json_migration.info.description": "Library save files created with TagStudio versions 9.4 and below will need to be migrated to the new v9.5+ format.

What you need to know:

", + "json_migration.title.old_lib": "

v9.4 Library

", + "json_migration.title.new_lib": "

v9.5+ Library

", + "json_migration.start_and_preview": "Start and Preview", + "json_migration.finish_migration": "Finish Migration", + "json_migration.checking_for_parity": "Checking for Parity...", + "json_migration.creating_database_tables": "Creating SQL Database Tables...", + "json_migration.migrating_files_entries": "Migrating {entries:,d} File Entries...", + "json_migration.migration_complete": "Migration Complete!", + "json_migration.migration_complete_with_discrepancies": "Migration Complete, Discrepancies Found", + "json_migration.discrepancies_found": "Library Discrepancies Found", + "json_migration.discrepancies_found.description": "Discrepancies were found between the original and converted library formats. Please review and choose to whether continue with the migration or to cancel.", + "json_migration.discrepancies.sql_entry_id_missing": "[Field Comparison]:\nNEW (SQL): SQL Entry ID not found: {id}", + "json_migration.discrepancies.fields": "[Field Comparison]:\nOLD (JSON):{json_fields}\nNEW (SQL):{sql_fields}", + "json_migration.discrepancies.subtag": "[Subtag Parity]:\nOLD (JSON):{json_subtags}\nNEW (SQL):{sql_subtags}", + "json_migration.discrepancies.alias": "[Alias Parity]:\nOLD (JSON):{json_aliases}\nNEW (SQL):{sql_aliases}", + "json_migration.discrepancies.shorthand": "[Shorthand Parity]:\nOLD (JSON):{json_shorthand}\nNEW (SQL):{sql_shorthand}", + "json_migration.discrepancies.color": "[Color Parity]:\nOLD (JSON):{json_color}\nNEW (SQL):{sql_color}", + "json_migration.heading.match": "Matched", + "json_migration.heading.differ": "Discrepancy", + "json_migration.heading.entires": "Entries:", + "json_migration.heading.tags": "Tags:", + "json_migration.heading.shorthands": "Shorthands:", + "json_migration.heading.parent_tags": "Parent Tags:", + "json_migration.heading.aliases": "Aliases:", + "json_migration.heading.colors": "Colors:", + "json_migration.heading.file_extension_list": "File Extension List:", + "json_migration.heading.extension_list_type": "Extension List Type:", + "json_migration.heading.paths": "Paths:", + "json_migration.heading.fields": "Fields:", + "json_migration.description": "
Start and preview the results of the library migration process. The converted library will not be used unless you click \"Finish Migration\".

Library data should either have matching values or a feature a \"Matched\" label. Values that do not match will be displayed in red and feature a \"(!)\" symbol next to them.
This process may take up to several minutes for larger libraries.
" } \ No newline at end of file diff --git a/tagstudio/src/qt/translations.py b/tagstudio/src/qt/translations.py index 882c3712..553cf562 100644 --- a/tagstudio/src/qt/translations.py +++ b/tagstudio/src/qt/translations.py @@ -6,6 +6,8 @@ from PySide6.QtCore import QObject, Signal from PySide6.QtGui import QAction from PySide6.QtWidgets import QLabel, QMenu, QMessageBox, QPushButton +from .helpers.qbutton_wrapper import QPushButtonWrapper + DEFAULT_TRANSLATION = "de" @@ -49,7 +51,7 @@ class Translator: def translate_qobject(self, widget: QObject, key: str, **kwargs): """Translates the text of the QObject using :func:`translate_with_setter`.""" - if isinstance(widget, (QLabel, QAction, QPushButton, QMessageBox)): + if isinstance(widget, (QLabel, QAction, QPushButton, QMessageBox, QPushButtonWrapper)): self.translate_with_setter(widget.setText, key, **kwargs) elif isinstance(widget, (QMenu)): self.translate_with_setter(widget.setTitle, key, **kwargs) diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index 948608d2..530eda3f 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -259,7 +259,7 @@ class QtDriver(DriverMixin, QObject): file_menu = QMenu(menu_bar) Translations.translate_qobject(file_menu, "menu.file") edit_menu = QMenu(menu_bar) - Translations.translate_qobject(edit_menu, "menu.edit") + Translations.translate_qobject(edit_menu, "generic.edit_alt") view_menu = QMenu(menu_bar) Translations.translate_qobject(view_menu, "menu.view") tools_menu = QMenu(menu_bar) diff --git a/tagstudio/src/qt/widgets/migration_modal.py b/tagstudio/src/qt/widgets/migration_modal.py index 2bf13a95..eeb5d4d2 100644 --- a/tagstudio/src/qt/widgets/migration_modal.py +++ b/tagstudio/src/qt/widgets/migration_modal.py @@ -34,6 +34,8 @@ from src.qt.widgets.paged_panel.paged_body_wrapper import PagedBodyWrapper from src.qt.widgets.paged_panel.paged_panel import PagedPanel from src.qt.widgets.paged_panel.paged_panel_state import PagedPanelState +from ..translations import Translations + logger = structlog.get_logger(__name__) @@ -54,7 +56,7 @@ class JsonMigrationModal(QObject): self.is_migration_initialized: bool = False self.discrepancies: list[str] = [] - self.title: str = f'Save Format Migration: "{self.path}"' # TODO translate + self.title: str = Translations.translate_formatted("json_migration.title", path=self.path) self.warning: str = "(!)" self.old_entry_count: int = 0 @@ -77,24 +79,17 @@ class JsonMigrationModal(QObject): def init_page_info(self) -> None: """Initialize the migration info page.""" body_wrapper: PagedBodyWrapper = PagedBodyWrapper() - body_label: QLabel = QLabel( # TODO translate - "Library save files created with TagStudio versions 9.4 and below will " - "need to be migrated to the new v9.5+ format." - "
" - "

What you need to know:

" - "" - ) + body_label = QLabel() + Translations.translate_qobject(body_label, "json_migration.info.description") body_label.setWordWrap(True) body_label.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) body_wrapper.layout().addWidget(body_label) body_wrapper.layout().setContentsMargins(0, 36, 0, 0) - cancel_button: QPushButtonWrapper = QPushButtonWrapper("Cancel") # TODO translate - next_button: QPushButtonWrapper = QPushButtonWrapper("Continue") # TODO translate + cancel_button = QPushButtonWrapper() + Translations.translate_qobject(cancel_button, "generic.cancel") + next_button = QPushButtonWrapper() + Translations.translate_qobject(next_button, "generic.continue") cancel_button.clicked.connect(self.migration_cancelled.emit) self.stack.append( @@ -115,30 +110,20 @@ class JsonMigrationModal(QObject): body_container_layout.setContentsMargins(0, 0, 0, 0) tab: str = " " - self.match_text: str = "Matched" # TODO translate - self.differ_text: str = "Discrepancy" # TODO translate + self.match_text: str = Translations["json_migration.heading.match"] + self.differ_text: str = Translations["json_migration.heading.differ"] - entries_text: str = "Entries:" # TODO translate - tags_text: str = "Tags:" # TODO translate - shorthand_text: str = tab + "Shorthands:" # TODO translate - subtags_text: str = tab + "Parent Tags:" # TODO translate - aliases_text: str = tab + "Aliases:" # TODO translate - colors_text: str = tab + "Colors:" # TODO translate - ext_text: str = "File Extension List:" # TODO translate - ext_type_text: str = "Extension List Type:" # TODO translate - desc_text: str = ( # TODO translate - "
Start and preview the results of the library migration process. " - 'The converted library will not be used unless you click "Finish Migration". ' - "

" - 'Library data should either have matching values or a feature a "Matched" label. ' - 'Values that do not match will be displayed in red and feature a "(!)" ' - "symbol next to them." - "
" - "This process may take up to several minutes for larger libraries." - "
" - ) - path_parity_text: str = tab + "Paths:" # TODO translate - field_parity_text: str = tab + "Fields:" # TODO translate + entries_text: str = Translations["json_migration.heading.entires"] + tags_text: str = Translations["json_migration.heading.tags"] + shorthand_text: str = tab + Translations["json_migration.heading.shorthands"] + subtags_text: str = tab + Translations["json_migration.heading.parent_tags"] + aliases_text: str = tab + Translations["json_migration.heading.aliases"] + colors_text: str = tab + Translations["json_migration.heading.colors"] + ext_text: str = Translations["json_migration.heading.file_extension_list"] + ext_type_text: str = Translations["json_migration.heading.extension_list_type"] + desc_text: str = Translations["json_migration.description"] + path_parity_text: str = tab + Translations["json_migration.heading.paths"] + field_parity_text: str = tab + Translations["json_migration.heading.fields"] self.entries_row: int = 0 self.path_row: int = 1 @@ -153,7 +138,8 @@ class JsonMigrationModal(QObject): old_lib_container: QWidget = QWidget() old_lib_layout: QVBoxLayout = QVBoxLayout(old_lib_container) - old_lib_title: QLabel = QLabel("

v9.4 Library

") # TODO translate + old_lib_title = QLabel() + Translations.translate_qobject(old_lib_title, "json_migration.title.old_lib") old_lib_title.setAlignment(Qt.AlignmentFlag.AlignCenter) old_lib_layout.addWidget(old_lib_title) @@ -215,7 +201,8 @@ class JsonMigrationModal(QObject): new_lib_container: QWidget = QWidget() new_lib_layout: QVBoxLayout = QVBoxLayout(new_lib_container) - new_lib_title: QLabel = QLabel("

v9.5+ Library

") # TODO translate + new_lib_title = QLabel() + Translations.translate_qobject(new_lib_title, "json_migration.title.new_lib") new_lib_title.setAlignment(Qt.AlignmentFlag.AlignCenter) new_lib_layout.addWidget(new_lib_title) @@ -291,13 +278,16 @@ class JsonMigrationModal(QObject): self.body_wrapper_01.layout().addWidget(desc_label) self.body_wrapper_01.layout().setSpacing(12) - back_button: QPushButtonWrapper = QPushButtonWrapper("Back") # TODO translate - start_button: QPushButtonWrapper = QPushButtonWrapper("Start and Preview") # TODO translate + back_button = QPushButtonWrapper() + Translations.translate_qobject(back_button, "generic.navigation.back") + start_button = QPushButtonWrapper() + Translations.translate_qobject(start_button, "json_migration.start_and_preview") start_button.setMinimumWidth(120) start_button.clicked.connect(self.migrate) start_button.clicked.connect(lambda: finish_button.setDisabled(False)) start_button.clicked.connect(lambda: start_button.setDisabled(True)) - finish_button: QPushButtonWrapper = QPushButtonWrapper("Finish Migration") # TODO translate + finish_button: QPushButtonWrapper = QPushButtonWrapper() + Translations.translate_qobject(finish_button, "json_migration.finish_migration") finish_button.setMinimumWidth(120) finish_button.setDisabled(True) finish_button.clicked.connect(self.finish_migration) @@ -348,9 +338,11 @@ class JsonMigrationModal(QObject): lambda x: ( pb.setLabelText(f"

{x}

"), self.update_sql_value_ui(show_msg_box=False) - if x == "Checking for Parity..." # TODO translate + if x == Translations["json_migration.checking_for_parity"] + else (), + self.update_parity_ui() + if x == Translations["json_migration.checking_for_parity"] else (), - self.update_parity_ui() if x == "Checking for Parity..." else (), # TODO translate ) ) r = CustomRunnable(iterator.run) @@ -367,23 +359,23 @@ class JsonMigrationModal(QObject): """Iterate over the library migration process.""" try: # Convert JSON Library to SQLite - yield "Creating SQL Database Tables..." # TODO translate + yield Translations["json_migration.creating_database_tables"] self.sql_lib = SqliteLibrary() self.temp_path: Path = ( self.json_lib.library_dir / TS_FOLDER_NAME / "migration_ts_library.sqlite" ) self.sql_lib.storage_path = self.temp_path if self.temp_path.exists(): - logger.info( - 'Temporary migration file "temp_path" already exists. Removing...' - ) # TODO translate + logger.info('Temporary migration file "temp_path" already exists. Removing...') self.temp_path.unlink() self.sql_lib.open_sqlite_library( self.json_lib.library_dir, is_new=True, add_default_data=False ) - yield f"Migrating {len(self.json_lib.entries):,d} File Entries..." # TODO translate + yield Translations.translate_formatted( + "json_migration.migrating_files_entries", entries=len(self.json_lib.entries) + ) self.sql_lib.migrate_json_to_sqlite(self.json_lib) - yield "Checking for Parity..." # TODO translate + yield Translations["json_migration.checking_for_parity"] check_set = set() check_set.add(self.check_field_parity()) check_set.add(self.check_path_parity()) @@ -393,9 +385,9 @@ class JsonMigrationModal(QObject): check_set.add(self.check_color_parity()) self.update_parity_ui() if False not in check_set: - yield "Migration Complete!" # TODO translate + yield Translations["json_migration.migration_complete"] else: - yield "Migration Complete, Discrepancies Found" # TODO translate + yield Translations["json_migration.migration_complete_with_discrepancies"] self.done = True except Exception as e: @@ -434,18 +426,19 @@ class JsonMigrationModal(QObject): self.sql_lib.prefs(LibraryPrefs.IS_EXCLUDE_LIST), self.old_ext_type, ) - logger.info("Parity check complete!") # TODO translate + logger.info("Parity check complete!") if self.discrepancies: - logger.warning("Discrepancies found:") # TODO translate + logger.warning("Discrepancies found:") logger.warning("\n".join(self.discrepancies)) QApplication.beep() if not show_msg_box: return msg_box = QMessageBox() - msg_box.setWindowTitle("Library Discrepancies Found") # TODO translate - msg_box.setText( # TODO translate - "Discrepancies were found between the original and converted library formats. " - "Please review and choose to whether continue with the migration or to cancel." + Translations.translate_with_setter( + msg_box.setWindowTitle, "json_migration.discrepancies_found" + ) + Translations.translate_qobject( + msg_box, "json_migration.discrepancies_found.description" ) msg_box.setDetailedText("\n".join(self.discrepancies)) msg_box.setIcon(QMessageBox.Icon.Warning) @@ -548,8 +541,11 @@ class JsonMigrationModal(QObject): "[Field Comparison]", message=f"NEW (SQL): SQL Entry ID mismatch: {json_entry.id+1}", ) - self.discrepancies.append( # TODO translate - f"[Field Comparison]:\nNEW (SQL): SQL Entry ID not found: {json_entry.id+1}" + self.discrepancies.append( + Translations.translate_formatted( + "json_migration.discrepancies.sql_entry_id_missing", + id=json_entry.id + 1, + ) ) self.field_parity = False return self.field_parity @@ -626,8 +622,12 @@ class JsonMigrationModal(QObject): and sql_fields is not None and (json_fields == sql_fields) ): - self.discrepancies.append( # TODO translate - f"[Field Comparison]:\nOLD (JSON):{json_fields}\nNEW (SQL):{sql_fields}" + self.discrepancies.append( + Translations.translate_formatted( + "json_migration.discrepancies.fields", + json_fields=json_fields, + sql_fields=sql_fields, + ) ) self.field_parity = False return self.field_parity @@ -678,8 +678,12 @@ class JsonMigrationModal(QObject): and json_subtags is not None and (sql_subtags == json_subtags) ): - self.discrepancies.append( # TODO translate - f"[Subtag Parity]:\nOLD (JSON):{json_subtags}\nNEW (SQL):{sql_subtags}" + self.discrepancies.append( + Translations.translate_formatted( + "json_migration.discrepancies.subtag", + json_subtags=json_subtags, + sql_subtags=sql_subtags, + ) ) self.subtag_parity = False return self.subtag_parity @@ -714,8 +718,12 @@ class JsonMigrationModal(QObject): and json_aliases is not None and (sql_aliases == json_aliases) ): - self.discrepancies.append( # TODO translate - f"[Alias Parity]:\nOLD (JSON):{json_aliases}\nNEW (SQL):{sql_aliases}" + self.discrepancies.append( + Translations.translate_formatted( + "json_migration.discrepancies.alias", + json_aliases=json_aliases, + sql_aliases=sql_aliases, + ) ) self.alias_parity = False return self.alias_parity @@ -745,8 +753,12 @@ class JsonMigrationModal(QObject): and json_shorthand is not None and (sql_shorthand == json_shorthand) ): - self.discrepancies.append( # TODO translate - f"[Shorthand Parity]:\nOLD (JSON):{json_shorthand}\nNEW (SQL):{sql_shorthand}" + self.discrepancies.append( + Translations.translate_formatted( + "json_migration.discrepancies.shorthand", + json_shorthand=json_shorthand, + sql_shorthand=sql_shorthand, + ) ) self.shorthand_parity = False return self.shorthand_parity @@ -776,8 +788,12 @@ class JsonMigrationModal(QObject): ) if not (sql_color is not None and json_color is not None and (sql_color == json_color)): - self.discrepancies.append( # TODO translate - f"[Color Parity]:\nOLD (JSON):{json_color}\nNEW (SQL):{sql_color}" + self.discrepancies.append( + Translations.translate_formatted( + "json_migration.discrepancies.color", + json_color=json_color, + sql_color=sql_color, + ) ) self.color_parity = False return self.color_parity diff --git a/tagstudio/src/qt/widgets/panel.py b/tagstudio/src/qt/widgets/panel.py index 59e2234c..8f11a5be 100755 --- a/tagstudio/src/qt/widgets/panel.py +++ b/tagstudio/src/qt/widgets/panel.py @@ -7,6 +7,8 @@ from typing import Callable from PySide6.QtCore import Qt, Signal from PySide6.QtWidgets import QHBoxLayout, QLabel, QPushButton, QVBoxLayout, QWidget +from ..translations import Translations + class PanelModal(QWidget): saved = Signal() @@ -49,7 +51,7 @@ class PanelModal(QWidget): if not (save_callback or has_save): self.done_button = QPushButton() - self.done_button.setText("Done") # TODO translate + Translations.translate_qobject(self.done_button, "generic.done") self.done_button.setAutoDefault(True) self.done_button.clicked.connect(self.hide) if done_callback: @@ -59,7 +61,7 @@ class PanelModal(QWidget): if save_callback or has_save: self.cancel_button = QPushButton() - self.cancel_button.setText("Cancel") # TODO translate + Translations.translate_qobject(self.cancel_button, "generic.cancel") self.cancel_button.clicked.connect(self.hide) self.cancel_button.clicked.connect(widget.reset) # self.cancel_button.clicked.connect(cancel_callback) @@ -67,7 +69,7 @@ class PanelModal(QWidget): self.button_layout.addWidget(self.cancel_button) self.save_button = QPushButton() - self.save_button.setText("Save") # TODO translate + Translations.translate_qobject(self.save_button, "generic.save") self.save_button.setAutoDefault(True) self.save_button.clicked.connect(self.hide) self.save_button.clicked.connect(self.saved.emit) diff --git a/tagstudio/src/qt/widgets/preview_panel.py b/tagstudio/src/qt/widgets/preview_panel.py index 50ed0842..051ed28e 100644 --- a/tagstudio/src/qt/widgets/preview_panel.py +++ b/tagstudio/src/qt/widgets/preview_panel.py @@ -62,6 +62,8 @@ from src.qt.widgets.text_line_edit import EditTextLine from src.qt.widgets.thumb_renderer import ThumbRenderer from src.qt.widgets.video_player import VideoPlayer +from ..translations import Translations + if typing.TYPE_CHECKING: from src.qt.ts_qt import QtDriver @@ -119,7 +121,8 @@ class PreviewPanel(QWidget): ) date_style = "font-size:12px;" - self.open_file_action = QAction("Open file", self) # TODO translate + self.open_file_action = QAction(self) + Translations.translate_qobject(self.open_file_action, "file.open_file") self.open_explorer_action = QAction(PlatformStrings.open_file_str, self) self.preview_img = QPushButtonWrapper() @@ -279,7 +282,7 @@ class PreviewPanel(QWidget): self.add_field_button.setCursor(Qt.CursorShape.PointingHandCursor) self.add_field_button.setMinimumSize(96, 28) self.add_field_button.setMaximumSize(96, 28) - self.add_field_button.setText("Add Field") # TODO translate + Translations.translate_qobject(self.add_field_button, "library.field.add") self.afb_layout.addWidget(self.add_field_button) self.add_field_modal = AddFieldModal(self.lib) self.place_add_field_button() @@ -303,7 +306,7 @@ class PreviewPanel(QWidget): self.driver.frame_content[grid_idx] = result def remove_field_prompt(self, name: str) -> str: - return f'Are you sure you want to remove field "{name}"?' # TODO translate + return Translations.translate_formatted("library.field.confirm_remove", name=name) def fill_libs_widget(self, layout: QVBoxLayout): settings = self.driver.settings @@ -341,7 +344,8 @@ class PreviewPanel(QWidget): # remove any potential previous items clear_layout(layout) - label = QLabel("Recent Libraries") # TODO translate + label = QLabel() + Translations.translate_qobject(label, "generic.recent_libraries") label.setAlignment(Qt.AlignmentFlag.AlignCenter) row_layout = QHBoxLayout() @@ -379,7 +383,7 @@ class PreviewPanel(QWidget): lib = Path(full_val) if not lib.exists() or not (lib / TS_FOLDER_NAME).exists(): button.setDisabled(True) - button.setToolTip("Location is missing") # TODO translate + Translations.translate_with_setter(button.setToolTip, "library.missing") def open_library_button_clicked(path): return lambda: self.driver.open_library(Path(path)) @@ -1096,8 +1100,8 @@ class PreviewPanel(QWidget): remove_mb.setWindowTitle("Remove Field") # TODO translate remove_mb.setIcon(QMessageBox.Icon.Warning) cancel_button = remove_mb.addButton( - "&Cancel", QMessageBox.ButtonRole.DestructiveRole - ) # TODO translate + Translations["generic.cancel_alt"], QMessageBox.ButtonRole.DestructiveRole + ) remove_mb.addButton("&Remove", QMessageBox.ButtonRole.RejectRole) # TODO translate # remove_mb.setStandardButtons(QMessageBox.StandardButton.Cancel) remove_mb.setDefaultButton(cancel_button) diff --git a/tagstudio/src/qt/widgets/tag.py b/tagstudio/src/qt/widgets/tag.py index 21bb4f6d..7cd7f697 100644 --- a/tagstudio/src/qt/widgets/tag.py +++ b/tagstudio/src/qt/widgets/tag.py @@ -21,6 +21,8 @@ from src.core.library import Tag from src.core.library.alchemy.enums import TagColor from src.core.palette import ColorType, get_tag_color +from ..translations import Translations + class TagAliasWidget(QWidget): on_remove = Signal() @@ -126,17 +128,20 @@ class TagWidget(QWidget): self.bg_button.setFlat(True) self.bg_button.setText(tag.name) if has_edit: - edit_action = QAction("Edit", self) # TODO translate + edit_action = QAction(self) + Translations.translate_qobject(edit_action, "generic.edit") edit_action.triggered.connect(on_edit_callback) edit_action.triggered.connect(self.on_edit.emit) self.bg_button.addAction(edit_action) # if on_click_callback: self.bg_button.setContextMenuPolicy(Qt.ContextMenuPolicy.ActionsContextMenu) - search_for_tag_action = QAction("Search for Tag", self) # TODO translate + search_for_tag_action = QAction(self) + Translations.translate_qobject(search_for_tag_action, "tag.search_for_tag") search_for_tag_action.triggered.connect(self.on_click.emit) self.bg_button.addAction(search_for_tag_action) - add_to_search_action = QAction("Add to Search", self) # TODO translate + add_to_search_action = QAction(self) + Translations.translate_qobject(add_to_search_action, "tag.add_to_search") self.bg_button.addAction(add_to_search_action) self.inner_layout = QHBoxLayout() diff --git a/tagstudio/src/qt/widgets/tag_box.py b/tagstudio/src/qt/widgets/tag_box.py index 5a59b25a..26f666a6 100755 --- a/tagstudio/src/qt/widgets/tag_box.py +++ b/tagstudio/src/qt/widgets/tag_box.py @@ -20,6 +20,8 @@ from src.qt.widgets.fields import FieldWidget from src.qt.widgets.panel import PanelModal from src.qt.widgets.tag import TagWidget +from ..translations import Translations + if typing.TYPE_CHECKING: from src.qt.ts_qt import QtDriver @@ -75,7 +77,8 @@ class TagBoxWidget(FieldWidget): ) tsp = TagSearchPanel(self.driver.lib) tsp.tag_chosen.connect(lambda x: self.add_tag_callback(x)) - self.add_modal = PanelModal(tsp, title, "Add Tags") # TODO translate + self.add_modal = PanelModal(tsp, title) + Translations.translate_with_setter(self.add_modal.setWindowTitle, "tag.add.plural") self.add_button.clicked.connect( lambda: ( tsp.update_tags(), @@ -130,11 +133,11 @@ class TagBoxWidget(FieldWidget): self.edit_modal = PanelModal( build_tag_panel, - tag.name, # TODO - display name including subtags - "Edit Tag", # TODO translate + title=tag.name, # TODO - display name including subtags done_callback=self.driver.preview_panel.update_widgets, has_save=True, ) + Translations.translate_with_setter(self.edit_modal.setWindowTitle, "tag.edit") # TODO - this was update_tag() self.edit_modal.saved.connect( lambda: self.driver.lib.update_tag( diff --git a/tagstudio/src/qt/widgets/video_player.py b/tagstudio/src/qt/widgets/video_player.py index 27d06b2b..187140e9 100644 --- a/tagstudio/src/qt/widgets/video_player.py +++ b/tagstudio/src/qt/widgets/video_player.py @@ -32,6 +32,8 @@ from src.core.enums import SettingItems from src.qt.helpers.file_opener import FileOpenerHelper from src.qt.platform_strings import PlatformStrings +from ..translations import Translations + if typing.TYPE_CHECKING: from src.qt.ts_qt import QtDriver @@ -115,7 +117,8 @@ class VideoPlayer(QGraphicsView): self.setContextMenuPolicy(Qt.ContextMenuPolicy.ActionsContextMenu) self.opener = FileOpenerHelper(filepath=self.filepath) - autoplay_action = QAction("Autoplay", self) # TODO translate + autoplay_action = QAction(self) + Translations.translate_qobject(autoplay_action, "video_player.autoplay") autoplay_action.setCheckable(True) self.addAction(autoplay_action) autoplay_action.setChecked( @@ -124,7 +127,8 @@ class VideoPlayer(QGraphicsView): autoplay_action.triggered.connect(lambda: self.toggle_autoplay()) self.autoplay = autoplay_action - open_file_action = QAction("Open file", self) # TODO translate + open_file_action = QAction(self) + Translations.translate_qobject(open_file_action, "file.open_file") open_file_action.triggered.connect(self.opener.open_file) open_explorer_action = QAction(PlatformStrings.open_file_str, self)