From 4cd70d2c4fe7099b2fac509fbd1be1ebe5b6fedb Mon Sep 17 00:00:00 2001 From: Bamowen <12665915+Bamowen@users.noreply.github.com> Date: Mon, 23 Sep 2024 05:18:34 +0200 Subject: [PATCH 01/82] add string tokens for en.json (#507) * Add en.json with strings found in code * remove unused, internal, and logging strings This removes any string tokens for unused/unfinished features, internally facing code, and log outputs. --------- Co-authored-by: Travis Abendshien --- tagstudio/resources/translations/en.json | 144 +++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 tagstudio/resources/translations/en.json diff --git a/tagstudio/resources/translations/en.json b/tagstudio/resources/translations/en.json new file mode 100644 index 00000000..016aa323 --- /dev/null +++ b/tagstudio/resources/translations/en.json @@ -0,0 +1,144 @@ +{ + "home.base_title": "TagStudio Alpha", + "home.main_window": "Main Window", + "home.include_all_tags": "And (Includes All Tags)", + "home.include_any_tag": "Or (Includes Any Tag)", + "home.thumbnail_size": "Thumbnail Size", + "home.search_entries": "Search Entries", + "home.search": "Search", + "menu.file": "File", + "menu.edit": "Edit", + "menu.tools": "Tools", + "menu.macros": "Macros", + "menu.window": "Window", + "menu.help": "Help", + "tag.new": "New Tag", + "tag.add": "Add Tag", + "tag.library": "Library Tags", + "merge.window_title": "Merging Duplicate Entries", + "merge.merge_dupe_entries": "Merging Duplicate Entries", + "preview.dimensions": "Dimensions", + "preview.recent": "Recent Libraries", + "library.title": "Title", + "library.author": "Author", + "library.Artist": "Artist", + "library.url": "URL", + "library.description": "Description", + "library.notes": "Notes", + "library.tags": "Tags", + "library.content_tags": "Content Tags", + "library.meta_tags": "Meta Tags", + "library.collation": "Collation", + "library.date": "Date", + "library.date_created": "Date Created", + "library.date_modified": "Date Modified", + "library.date_taken": "Date Taken", + "library.date_published": "Date Published", + "library.archived": "Date Archived", + "library.favorite": "Favorite", + "library.book": "Book", + "library.comic": "Comic", + "library.series": "Series", + "library.manga": "Manga", + "library.source": "Source", + "library.date_uploaded": "Date Uploaded", + "library.date_released": "Date Released", + "library.volume": "Volume", + "library.anthology": "Anthology", + "library.magazine": "Magazine", + "library.publisher": "Publisher", + "library.guest_artist": "Guest Artist", + "library.composer": "Composer", + "library.comments": "Comments", + "open_library.no_tagstudio_library_found": "No existing TagStudio library found at '%{path}'. Creating one.", + "open_library.library_creation_return_code": "Library Creation Return Code:", + "open_library.title": "Library", + "dialog.open_create_library": "Open/Create Library", + "splash.open_library": "Opening Library", + "status.save_success": "Library Saved and Closed!", + "status.backup_success": "Library Backup Saved at:", + "status.search_library_query": "Searching Library for", + "status.enumerate_query": "Query:%{query}, Frame: %{i}, Length: %{len(f)}", + "status.number_results_found": "%{len(all_items)} Results Found for \"%{query}\" (%{format_timespan(end_time - start_time)})", + "status.results_found": "Results", + "dialog.save_library": "Save Library", + "dialog.refresh_directories": "Refreshing Directories", + "dialog.scan_directories": "Scanning Directories for New Files...\nPreparing...", + "dialog.scan_directories.new_files": "Scanning Directories for New Files...\n%{x + 1} File%{\"s\" if x + 1 != 1 else \"\"} Searched, %{len(self.lib.files_not_in_library)} New Files Found", + "tooltip.open_library": "Ctrl+O", + "tooltip.save_library": "Ctrl+S", + "progression.running_macros.new_entries": "Running Macros on New Entries", + "progression.running_macros.one_new_entry": "Running Configured Macros on 1/%{len(new_ids)} New Entries", + "progression.running_macros.several_new_entry": "Running Configured Macros on %{x + 1}/%{len(new_ids)} New Entries", + "file_opener.open_file": "Opening file:}", + "file_opener.not_found": "File not found:", + "file_opener.command_not_found": "Could not find %{command_name} on system PATH", + "add_field.add": "Add Field", + "generic.remove_field": "Remove Field", + "generic.file_extension": "File Extensions", + "generic.open_file": "Open file", + "generic.open_file_explorer": "Open file in explorer", + "generic.cancel": "Cancel", + "generic.add": "Add", + "generic.name": "Name", + "generic.shorthand": "Shorthand", + "generic.aliases": "Aliases", + "generic.color": "Color", + "generic.delete": "Delete", + "generic.exclude": "Exclude", + "generic.include": "Include", + "generic.done": "Done", + "generic.open_all": "Open All", + "generic.close_all": "Close All", + "generic.refresh_all": "Refresh_All", + "generic.apply": "Apply", + "generic.mirror": "Mirror", + "generic.search_tags": "Search Tags", + "build_tags.parent_tags": "Parent Tags", + "build_tags.add_parent_tags": "Add Parent Tags", + "delete_unlinked.delete_unlinked": "Delete Unlinked Entries", + "delete_unlinked.confirm": "Are you sure you want to delete the following %{len(self.lib.missing_files)} entries?", + "delete_unlinked.delete_entries": "Deleting Entries", + "delete_unlinked.deleting_number_entries": "Deleting %{x[0]+1}/{len(self.lib.missing_files)} Unlinked Entries", + "file_extension.add_extension": "Add Extension", + "file_extension.list_mode": "List Mode:", + "fix_dupes.fix_dupes": "Fix Duplicate Files", + "fix_dupes.no_file_selected": "No DupeGuru File Selected", + "fix_dupes.load_file": "Load DupeGuru File", + "fix_dupes.mirror_entries": "Mirror Entries", + "fix_dupes.mirror_description": "Mirror the Entry data across each duplicate match set, combining all data while not removing or duplicating fields. This operation will not delete any files or data.", + "fix_dupes.advice_label": "After mirroring, you're free to use DupeGuru to delete the unwanted files. Afterwards, use TagStudio's \"Fix Unlinked Entries\" feature in the Tools menu in order to delete the unlinked Entries.", + "fix_dupes.open_result_files": "Open DupeGuru Results File", + "fix_dupes.name_filter": "DupeGuru Files (*.dupeguru)", + "fix_dupes.no_file_match": "Duplicate File Matches: N/A", + "fix_dupes.number_file_match": "Duplicate File Matches: %{count}", + "fix_unlinked.fix_unlinked": "Fix Unlinked Entries", + "fix_unlinked.description": "Each library entry is linked to a file in one of your directories. If a file linked to an entry is moved or deleted outside of TagStudio, it is then considered unlinked. Unlinked entries may be automatically relinked via searching your directories, manually relinked by the user, or deleted if desired.", + "fix_unlinked.duplicate_description": "Duplicate entries are defined as multiple entries which point to the same file on disk. Merging these will combine the tags and metadata from all duplicates into a single consolidated entry. These are not to be confused with \"duplicate files\", which are duplicates of your files themselves outside of TagStudio.", + "fix_unlinked.search_and_relink": "Search && Relink", + "fix_unlinked.refresh_dupes": "Refresh Duplicate Entries", + "fix_unlinked.merge_dupes": "Merge Duplicate Entries", + "fix_unlinked.manual_relink": "Manual Relink", + "fix_unlinked.delete_unlinked": "Delete Unlinked Entries", + "fix_unlinked.scan_library.title": "Scanning Library", + "fix_unlinked.scan_library.label": "Scanning Library for Unlinked Entries...", + "folders_to_tags.folders_to_tags": "Converting folders to Tags", + "folders_to_tags.title": "Create Tags From Folders", + "folders_to_tags.description": "Creates tags based on your folder structure and applies them to your entries.\n The structure below shows all the tags that will be created and what entries they will be applied to.", + "mirror_entities.are_you_sure": "Are you sure you want to mirror the following %{len(self.lib.dupe_files)} Entries?", + "mirror_entities.title": "Mirroring Entries", + "mirror_entities.label": "Mirroring 1/%{count} Entries...", + "relink_unlinked.title": "Relinking Entries", + "relink_unlinked.attempt_relink": "Attempting to Relink %{x[0]+1}/%{len(self.lib.missing_files)} Entries, %{self.fixed} Successfully Relinked", + "landing.open_button": "Open/Create Library %{open_shortcut_text}", + "preview_panel.missing_location": "Location is missing", + "preview_panel.update_widgets": "[ENTRY PANEL] UPDATE WIDGETS (%{self.driver.selected})", + "preview_panel.no_items_selected": "No Items Selected", + "preview_panel.confirm_remove": "Are you sure you want to remove this \"%{self.lib.get_field_attr(field, \"name\")}\" field?", + "preview_panel.mixed_data": "Mixed Data", + "preview_panel.edit_name": "Edit", + "preview_panel.unknown_field_type": "Unknown Field Type", + "tag.search_for_tag": "Search for Tag", + "tag.add_search": "Add to Search", + "text_line_edit.unknown_event_type": "unknown event type: %{event}" +} \ No newline at end of file From 49d071cf2b2955c3a5dfb96e7df0661d9cac0b44 Mon Sep 17 00:00:00 2001 From: Travis Abendshien Date: Sun, 22 Sep 2024 20:27:40 -0700 Subject: [PATCH 02/82] docs: add weblate link to readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 49b18077..eafecdb9 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,8 @@ TagStudio is a photo & file organization application with an underlying system t If you're interested in contributing to TagStudio, please take a look at the [contribution guidelines](/CONTRIBUTING.md) for how to get started! +Translation services provided via [Weblate](https://hosted.weblate.org/projects/tagstudio/). + ## Installation To download TagStudio, visit the [Releases](https://github.com/TagStudioDev/TagStudio/releases) section of the GitHub repository and download the latest release for your system under the "Assets" section. TagStudio is available for **Windows**, **macOS** _(Apple Silicon & Intel)_, and **Linux**. Windows and Linux builds are also available in portable versions if you want a more self-contained executable to move around. From c37c4a95a700920272f00a859c03ef154ecf268e Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Sat, 28 Sep 2024 00:21:51 +0200 Subject: [PATCH 03/82] translations: update from Hosted Weblate (#526) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added translation using Weblate (Russian) * Translated using Weblate (Russian) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/ru/ * Added translation using Weblate (Portuguese) * Added translation using Weblate (Portuguese (Brazil)) * Translated using Weblate (Portuguese (Brazil)) Currently translated at 46.4% (66 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 46.4% (66 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/pt_BR/ * Added translation using Weblate (Tamil) * Translated using Weblate (Portuguese (Brazil)) Currently translated at 74.6% (106 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 74.6% (106 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/pt_BR/ * Translated using Weblate (Tamil) Currently translated at 51.4% (73 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/ta/ * Added translation using Weblate (Spanish) * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/pt_BR/ * Translated using Weblate (Tamil) Currently translated at 88.0% (125 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/ta/ * Translated using Weblate (Spanish) Currently translated at 11.2% (16 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 11.2% (16 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 19.7% (28 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 19.7% (28 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Russian) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/ru/ * Translated using Weblate (Spanish) Currently translated at 29.5% (42 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 29.5% (42 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 49.2% (70 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 49.2% (70 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 52.1% (74 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Added translation using Weblate (Norwegian Bokmål) * Translated using Weblate (Tamil) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/ta/ * Translated using Weblate (Norwegian Bokmål) Currently translated at 55.6% (79 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/nb_NO/ * Added translation using Weblate (French) * Translated using Weblate (Russian) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/ru/ * Translated using Weblate (Spanish) Currently translated at 56.3% (80 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 56.3% (80 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Norwegian Bokmål) Currently translated at 68.3% (97 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/nb_NO/ * Translated using Weblate (French) Currently translated at 40.1% (57 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/fr/ * Translated using Weblate (Spanish) Currently translated at 65.4% (93 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 65.4% (93 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 74.6% (106 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 83.8% (119 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 83.8% (119 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 83.8% (119 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 83.8% (119 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 93.6% (133 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 93.6% (133 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (English) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/en/ * Translated using Weblate (Spanish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Added translation using Weblate (Danish) * Added translation using Weblate (German) * Translated using Weblate (Danish) Currently translated at 1.4% (2 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/da/ * Added translation using Weblate (Cantonese (Traditional Han script)) * Translated using Weblate (Tamil) Currently translated at 99.2% (141 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/ta/ * Translated using Weblate (German) Currently translated at 2.8% (4 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/de/ * Added translation using Weblate (Hungarian) * Translated using Weblate (German) Currently translated at 14.0% (20 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/de/ * Translated using Weblate (Hungarian) Currently translated at 99.2% (141 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/hu/ * Translated using Weblate (German) Currently translated at 14.7% (21 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/de/ * Added translation using Weblate (Swedish) * Translated using Weblate (German) Currently translated at 71.8% (102 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/de/ * Translated using Weblate (Swedish) Currently translated at 78.8% (112 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/sv/ * Added translation using Weblate (Toki Pona) * Translated using Weblate (Tamil) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/ta/ * Translated using Weblate (Danish) Currently translated at 2.8% (4 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/da/ * Translated using Weblate (Toki Pona) Currently translated at 83.0% (118 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/tok/ * Added translation using Weblate (Italian) * Translated using Weblate (French) Currently translated at 64.0% (91 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/fr/ * Translated using Weblate (German) Currently translated at 76.0% (108 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/de/ * Translated using Weblate (Hungarian) Currently translated at 99.2% (141 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/hu/ * Translated using Weblate (Toki Pona) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/tok/ * Translated using Weblate (Italian) Currently translated at 11.2% (16 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/it/ * Added translation using Weblate (Turkish) * Translated using Weblate (Turkish) Currently translated at 88.7% (126 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/tr/ * Translated using Weblate (Turkish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/tr/ * Translated using Weblate (English) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/en/ * Translated using Weblate (French) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/fr/ * Translated using Weblate (English) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/en/ * fix: remove unused strings and sort lists * chore: update .git-blame-ignore-revs --------- Co-authored-by: Artyom Ognev Co-authored-by: Space_Fox Co-authored-by: Lobo Metalúrgico Co-authored-by: Vasi Co-authored-by: Nginearing Co-authored-by: gallegonovato Co-authored-by: Allan Nordhøy Co-authored-by: Bamowen Co-authored-by: Ryussei Co-authored-by: Szíjártó Levente Pál Co-authored-by: Zoinx Co-authored-by: gold Co-authored-by: William de Castro Co-authored-by: Jann Stute Co-authored-by: Nyghl Co-authored-by: Travis Abendshien --- .git-blame-ignore-revs | 3 + tagstudio/resources/translations/da.json | 5 + tagstudio/resources/translations/de.json | 121 +++++++++ tagstudio/resources/translations/en.json | 280 ++++++++++---------- tagstudio/resources/translations/es.json | 137 ++++++++++ tagstudio/resources/translations/fr.json | 137 ++++++++++ tagstudio/resources/translations/hu.json | 137 ++++++++++ tagstudio/resources/translations/it.json | 18 ++ tagstudio/resources/translations/nb_NO.json | 100 +++++++ tagstudio/resources/translations/pt.json | 1 + tagstudio/resources/translations/pt_BR.json | 137 ++++++++++ tagstudio/resources/translations/ru.json | 137 ++++++++++ tagstudio/resources/translations/sv.json | 111 ++++++++ tagstudio/resources/translations/ta.json | 137 ++++++++++ tagstudio/resources/translations/tok.json | 137 ++++++++++ tagstudio/resources/translations/tr.json | 137 ++++++++++ 16 files changed, 1592 insertions(+), 143 deletions(-) create mode 100644 tagstudio/resources/translations/da.json create mode 100644 tagstudio/resources/translations/de.json create mode 100644 tagstudio/resources/translations/es.json create mode 100644 tagstudio/resources/translations/fr.json create mode 100644 tagstudio/resources/translations/hu.json create mode 100644 tagstudio/resources/translations/it.json create mode 100644 tagstudio/resources/translations/nb_NO.json create mode 100644 tagstudio/resources/translations/pt.json create mode 100644 tagstudio/resources/translations/pt_BR.json create mode 100644 tagstudio/resources/translations/ru.json create mode 100644 tagstudio/resources/translations/sv.json create mode 100644 tagstudio/resources/translations/ta.json create mode 100644 tagstudio/resources/translations/tok.json create mode 100644 tagstudio/resources/translations/tr.json diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index 5fe6e499..37a45d84 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -1,3 +1,6 @@ # Date: Fri, 13 Sep 2024 00:28:00 -0700 # ci(ruff)!: update ruff linter config, refactor to comply b6e216760557c5507b12f210e1e48c531f49ffa3 + +# fix: remove unused strings and sort lists +30988b7095bc38c49bf96907bf379105ba00ed47 diff --git a/tagstudio/resources/translations/da.json b/tagstudio/resources/translations/da.json new file mode 100644 index 00000000..bdbcc033 --- /dev/null +++ b/tagstudio/resources/translations/da.json @@ -0,0 +1,5 @@ +{ + "home.include_all_tags": "Og (inkluderer alle tags)", + "home.include_any_tag": "Og (inkluderer envher tag)", + "home.main_window": "Hovedvindue" +} diff --git a/tagstudio/resources/translations/de.json b/tagstudio/resources/translations/de.json new file mode 100644 index 00000000..f24817f7 --- /dev/null +++ b/tagstudio/resources/translations/de.json @@ -0,0 +1,121 @@ +{ + "add_field.add": "Feld hinzufügen", + "build_tags.add_parent_tags": "Übergeordnete Tags hinzufügen", + "build_tags.parent_tags": "Übergeordnete Tags", + "delete_unlinked.confirm": "Sind Sie sicher, dass Sie die folgenden %{len(self.lib.missing_files)}-Einträge löschen wollen?", + "delete_unlinked.delete_entries": "Einträge am Löschen", + "delete_unlinked.delete_unlinked": "Unverknüpfte Einträge löschen", + "delete_unlinked.deleting_number_entries": "Löschen von %{x[0]+1}/{len(self.lib.missing_files)} Unverknüpften Einträgen", + "dialog.open_create_library": "Bibliothek öffnen/erstellen", + "dialog.refresh_directories": "Verzeichnisse werden aktualisiert", + "dialog.save_library": "Bibliothek speichern", + "dialog.scan_directories.new_files": "Verzeichnisse nach neuen Dateien durchsuchen...\n%{x + 1} Datei%{„s“ if x + 1 != 1 else „“} Gesucht, %{len(self.lib.files_not_in_library)} Neue Dateien gefunden", + "dialog.scan_directories": "Überprüfe Verzeichnisse auf neue Dateien...\nBereite vor...", + "file_extension.add_extension": "Erweiterung hinzufügen", + "file_opener.command_not_found": "Konnte %{command_name} nicht im System PATH finden", + "file_opener.not_found": "Datei nicht gefunden:", + "file_opener.open_file": "Datei öffnen:}", + "fix_dupes.advice_label": "Nach der Spiegelung können Sie DupeGuru verwenden, um die unerwünschten Dateien zu löschen. Verwenden Sie anschliessend die Funktion „Unverknüpfte Einträge reparieren“ im Menü „Extras“ von TagStudio, um die unverknüpften Einträge zu löschen.", + "fix_dupes.fix_dupes": "Doppelte Dateien korrigieren", + "fix_dupes.load_file": "DupeGuru-Datei laden", + "fix_dupes.mirror_description": "Spiegeln die Eingabedaten für jeden doppelten Abgleichsatz, indem Sie alle Daten kombinieren, ohne Felder zu entfernen oder zu duplizieren. Bei diesem Vorgang werden keine Dateien oder Daten gelöscht.", + "fix_dupes.mirror_entries": "Spiegelnde Einträge", + "fix_dupes.name_filter": "DupeGuru-Dateien (*.dupeguru)", + "fix_dupes.no_file_match": "Übereinstimmungen mit doppelten Dateien: N/A", + "fix_dupes.no_file_selected": "Keine DupeGuru-Datei ausgewählt", + "fix_dupes.number_file_match": "Übereinstimmungen mit doppelten Dateien: %{count}", + "fix_dupes.open_result_files": "DupeGuru Ergebnisdatei öffnen", + "fix_unlinked.delete_unlinked": "Nicht verknüpfte Einträge löschen", + "fix_unlinked.description": "Jeder Bibliothekseintrag ist mit einer Datei in einem Ihrer Verzeichnisse verknüpft. Wenn eine Datei, die mit einem Eintrag verknüpft ist, ausserhalb von TagStudio verschoben oder gelöscht wird, gilt sie als nicht verknüpft. Nicht verknüpfte Einträge können durch Durchsuchen Ihrer Verzeichnisse automatisch neu verknüpft, vom Benutzer manuell neu verknüpft oder auf Wunsch gelöscht werden.", + "fix_unlinked.duplicate_description": "Doppelte Einträge sind definiert als mehrere Einträge, die auf dieselbe Datei auf der Festplatte verweisen. Durch das Zusammenführen dieser Einträge werden die Tags und Metadaten aller Duplikate zu einem einzigen konsolidierten Eintrag zusammengefasst. Diese sind nicht zu verwechseln mit „doppelten Dateien“, die Duplikate Ihrer Dateien selbst außerhalb von TagStudio sind.", + "fix_unlinked.fix_unlinked": "Unverknüpfte Einträge reparieren", + "fix_unlinked.manual_relink": "Manuelle Neuverknüpfung", + "fix_unlinked.merge_dupes": "Doppelte Einträge zusammenführen", + "fix_unlinked.refresh_dupes": "Doppelte Einträge aktualisieren", + "fix_unlinked.scan_library.label": "Bibliothek nach nicht verknüpften Einträgen durchsuchen...", + "fix_unlinked.scan_library.title": "Bibliothek wird scannen", + "fix_unlinked.search_and_relink": "Suche && Neuverbindung", + "generic.add": "hinzufügen", + "generic.aliases": "Aliase", + "generic.apply": "anwenden", + "generic.cancel": "Abbrechen", + "generic.close_all": "Alle schliessen", + "generic.color": "Farbe", + "generic.delete": "Löschen", + "generic.done": "Fertig", + "generic.exclude": "ausschliessen", + "generic.file_extension": "Dateierweiterungen", + "generic.include": "einschliessen", + "generic.mirror": "Spiegel", + "generic.name": "Name", + "generic.open_all": "Alle öffnen", + "generic.open_file_explorer": "Datei im Explorer öffnen", + "generic.open_file": "Datei öffnen", + "generic.refresh_all": "Alle aktualisieren", + "generic.remove_field": "Feld entfernen", + "generic.search_tags": "Tags suchen", + "generic.shorthand": "Kürzel", + "home.include_all_tags": "Und (enthält alle Tags)", + "home.include_any_tag": "Oder (enthält alle Tags)", + "home.main_window": "Hauptfenster", + "home.search_entries": "Nach Einträgen suchen", + "home.search": "Suchen", + "home.thumbnail_size": "Grösse des Vorschaubildes", + "library.anthology": "Anthologie", + "library.archived": "Archivierungsdatum", + "library.Artist": "Künstler", + "library.author": "Autor", + "library.book": "Buch", + "library.collation": "Zusammenstellung", + "library.comic": "Comicheft", + "library.comments": "Kommentare", + "library.composer": "Komponist", + "library.content_tags": "Inhalt Tags", + "library.date_created": "Erstellungsdatum", + "library.date_modified": "Datum geändert", + "library.date_published": "Datum des Publizierten", + "library.date_released": "Veröffentlichungsdatum", + "library.date_taken": "Aufnahmedatum", + "library.date_uploaded": "Hochladedatum", + "library.date": "Datum", + "library.description": "Beschreibung", + "library.favorite": "Favoriten", + "library.guest_artist": "Gastkünstler", + "library.magazine": "Zeitschrift", + "library.manga": "Manga", + "library.meta_tags": "Meta Tags", + "library.notes": "Notizen", + "library.publisher": "Herausgeber", + "library.series": "Serie", + "library.source": "Quelle", + "library.tags": "Tags", + "library.title": "Titel", + "library.url": "URL", + "library.volume": "Band", + "menu.edit": "Bearbeiten", + "menu.file": "Datei", + "menu.help": "Hilfe", + "menu.macros": "Makros", + "menu.tools": "Werkzeuge", + "menu.window": "Fenster", + "merge.merge_dupe_entries": "Zusammenführen von doppelten Einträgen", + "merge.window_title": "Zusammenführen von doppelten Einträgen", + "open_library.library_creation_return_code": "Bibliothekserstellung Rückgabecode:", + "open_library.no_tagstudio_library_found": "Keine vorhandene TagStudio-Bibliothek unter '%{Pfad}' gefunden. Eine wird erstellt.", + "open_library.title": "Bibliothek", + "preview.dimensions": "Abmessungen", + "preview.recent": "Aktuelle Bibliotheken", + "progression.running_macros.new_entries": "Ausführen von Makros bei neuen Einträgen", + "progression.running_macros.one_new_entry": "Ausführen konfigurierter Makros für 1/%{len(new_ids)} neue Einträge", + "progression.running_macros.several_new_entry": "Ausführen konfigurierter Makros für %{x + 1}/%{len(new_ids)} neue Einträge", + "relink_unlinked.title": "Einträge werden neuverknüpft", + "splash.open_library": "Die Bibliothek wird geöffnet", + "status.backup_success": "Bibliotheks-Backup gespeichert unter:", + "status.number_results_found": "%{len(all_items)} Ergebnisse gefunden für „%{query}“ (%{format_timespan(end_time - start_time)})", + "status.results_found": "Ergebnisse", + "status.save_success": "Bibliothek gespeichert und geschlossen!", + "status.search_library_query": "Suche in der Bibliothek nach", + "tag.add": "Hinzufüge Tag", + "tag.library": "Bibliothek Tags", + "tag.new": "Neuer Tag" +} diff --git a/tagstudio/resources/translations/en.json b/tagstudio/resources/translations/en.json index 016aa323..6e8a630d 100644 --- a/tagstudio/resources/translations/en.json +++ b/tagstudio/resources/translations/en.json @@ -1,144 +1,138 @@ { - "home.base_title": "TagStudio Alpha", - "home.main_window": "Main Window", - "home.include_all_tags": "And (Includes All Tags)", - "home.include_any_tag": "Or (Includes Any Tag)", - "home.thumbnail_size": "Thumbnail Size", - "home.search_entries": "Search Entries", - "home.search": "Search", - "menu.file": "File", - "menu.edit": "Edit", - "menu.tools": "Tools", - "menu.macros": "Macros", - "menu.window": "Window", - "menu.help": "Help", - "tag.new": "New Tag", - "tag.add": "Add Tag", - "tag.library": "Library Tags", - "merge.window_title": "Merging Duplicate Entries", - "merge.merge_dupe_entries": "Merging Duplicate Entries", - "preview.dimensions": "Dimensions", - "preview.recent": "Recent Libraries", - "library.title": "Title", - "library.author": "Author", - "library.Artist": "Artist", - "library.url": "URL", - "library.description": "Description", - "library.notes": "Notes", - "library.tags": "Tags", - "library.content_tags": "Content Tags", - "library.meta_tags": "Meta Tags", - "library.collation": "Collation", - "library.date": "Date", - "library.date_created": "Date Created", - "library.date_modified": "Date Modified", - "library.date_taken": "Date Taken", - "library.date_published": "Date Published", - "library.archived": "Date Archived", - "library.favorite": "Favorite", - "library.book": "Book", - "library.comic": "Comic", - "library.series": "Series", - "library.manga": "Manga", - "library.source": "Source", - "library.date_uploaded": "Date Uploaded", - "library.date_released": "Date Released", - "library.volume": "Volume", - "library.anthology": "Anthology", - "library.magazine": "Magazine", - "library.publisher": "Publisher", - "library.guest_artist": "Guest Artist", - "library.composer": "Composer", - "library.comments": "Comments", - "open_library.no_tagstudio_library_found": "No existing TagStudio library found at '%{path}'. Creating one.", - "open_library.library_creation_return_code": "Library Creation Return Code:", - "open_library.title": "Library", - "dialog.open_create_library": "Open/Create Library", - "splash.open_library": "Opening Library", - "status.save_success": "Library Saved and Closed!", - "status.backup_success": "Library Backup Saved at:", - "status.search_library_query": "Searching Library for", - "status.enumerate_query": "Query:%{query}, Frame: %{i}, Length: %{len(f)}", - "status.number_results_found": "%{len(all_items)} Results Found for \"%{query}\" (%{format_timespan(end_time - start_time)})", - "status.results_found": "Results", - "dialog.save_library": "Save Library", - "dialog.refresh_directories": "Refreshing Directories", - "dialog.scan_directories": "Scanning Directories for New Files...\nPreparing...", - "dialog.scan_directories.new_files": "Scanning Directories for New Files...\n%{x + 1} File%{\"s\" if x + 1 != 1 else \"\"} Searched, %{len(self.lib.files_not_in_library)} New Files Found", - "tooltip.open_library": "Ctrl+O", - "tooltip.save_library": "Ctrl+S", - "progression.running_macros.new_entries": "Running Macros on New Entries", - "progression.running_macros.one_new_entry": "Running Configured Macros on 1/%{len(new_ids)} New Entries", - "progression.running_macros.several_new_entry": "Running Configured Macros on %{x + 1}/%{len(new_ids)} New Entries", - "file_opener.open_file": "Opening file:}", - "file_opener.not_found": "File not found:", - "file_opener.command_not_found": "Could not find %{command_name} on system PATH", - "add_field.add": "Add Field", - "generic.remove_field": "Remove Field", - "generic.file_extension": "File Extensions", - "generic.open_file": "Open file", - "generic.open_file_explorer": "Open file in explorer", - "generic.cancel": "Cancel", - "generic.add": "Add", - "generic.name": "Name", - "generic.shorthand": "Shorthand", - "generic.aliases": "Aliases", - "generic.color": "Color", - "generic.delete": "Delete", - "generic.exclude": "Exclude", - "generic.include": "Include", - "generic.done": "Done", - "generic.open_all": "Open All", - "generic.close_all": "Close All", - "generic.refresh_all": "Refresh_All", - "generic.apply": "Apply", - "generic.mirror": "Mirror", - "generic.search_tags": "Search Tags", - "build_tags.parent_tags": "Parent Tags", - "build_tags.add_parent_tags": "Add Parent Tags", - "delete_unlinked.delete_unlinked": "Delete Unlinked Entries", - "delete_unlinked.confirm": "Are you sure you want to delete the following %{len(self.lib.missing_files)} entries?", - "delete_unlinked.delete_entries": "Deleting Entries", - "delete_unlinked.deleting_number_entries": "Deleting %{x[0]+1}/{len(self.lib.missing_files)} Unlinked Entries", - "file_extension.add_extension": "Add Extension", - "file_extension.list_mode": "List Mode:", - "fix_dupes.fix_dupes": "Fix Duplicate Files", - "fix_dupes.no_file_selected": "No DupeGuru File Selected", - "fix_dupes.load_file": "Load DupeGuru File", - "fix_dupes.mirror_entries": "Mirror Entries", - "fix_dupes.mirror_description": "Mirror the Entry data across each duplicate match set, combining all data while not removing or duplicating fields. This operation will not delete any files or data.", - "fix_dupes.advice_label": "After mirroring, you're free to use DupeGuru to delete the unwanted files. Afterwards, use TagStudio's \"Fix Unlinked Entries\" feature in the Tools menu in order to delete the unlinked Entries.", - "fix_dupes.open_result_files": "Open DupeGuru Results File", - "fix_dupes.name_filter": "DupeGuru Files (*.dupeguru)", - "fix_dupes.no_file_match": "Duplicate File Matches: N/A", - "fix_dupes.number_file_match": "Duplicate File Matches: %{count}", - "fix_unlinked.fix_unlinked": "Fix Unlinked Entries", - "fix_unlinked.description": "Each library entry is linked to a file in one of your directories. If a file linked to an entry is moved or deleted outside of TagStudio, it is then considered unlinked. Unlinked entries may be automatically relinked via searching your directories, manually relinked by the user, or deleted if desired.", - "fix_unlinked.duplicate_description": "Duplicate entries are defined as multiple entries which point to the same file on disk. Merging these will combine the tags and metadata from all duplicates into a single consolidated entry. These are not to be confused with \"duplicate files\", which are duplicates of your files themselves outside of TagStudio.", - "fix_unlinked.search_and_relink": "Search && Relink", - "fix_unlinked.refresh_dupes": "Refresh Duplicate Entries", - "fix_unlinked.merge_dupes": "Merge Duplicate Entries", - "fix_unlinked.manual_relink": "Manual Relink", - "fix_unlinked.delete_unlinked": "Delete Unlinked Entries", - "fix_unlinked.scan_library.title": "Scanning Library", - "fix_unlinked.scan_library.label": "Scanning Library for Unlinked Entries...", - "folders_to_tags.folders_to_tags": "Converting folders to Tags", - "folders_to_tags.title": "Create Tags From Folders", - "folders_to_tags.description": "Creates tags based on your folder structure and applies them to your entries.\n The structure below shows all the tags that will be created and what entries they will be applied to.", - "mirror_entities.are_you_sure": "Are you sure you want to mirror the following %{len(self.lib.dupe_files)} Entries?", - "mirror_entities.title": "Mirroring Entries", - "mirror_entities.label": "Mirroring 1/%{count} Entries...", - "relink_unlinked.title": "Relinking Entries", - "relink_unlinked.attempt_relink": "Attempting to Relink %{x[0]+1}/%{len(self.lib.missing_files)} Entries, %{self.fixed} Successfully Relinked", - "landing.open_button": "Open/Create Library %{open_shortcut_text}", - "preview_panel.missing_location": "Location is missing", - "preview_panel.update_widgets": "[ENTRY PANEL] UPDATE WIDGETS (%{self.driver.selected})", - "preview_panel.no_items_selected": "No Items Selected", - "preview_panel.confirm_remove": "Are you sure you want to remove this \"%{self.lib.get_field_attr(field, \"name\")}\" field?", - "preview_panel.mixed_data": "Mixed Data", - "preview_panel.edit_name": "Edit", - "preview_panel.unknown_field_type": "Unknown Field Type", - "tag.search_for_tag": "Search for Tag", - "tag.add_search": "Add to Search", - "text_line_edit.unknown_event_type": "unknown event type: %{event}" -} \ No newline at end of file + "add_field.add": "Add Field", + "build_tags.add_parent_tags": "Add Parent Tags", + "build_tags.parent_tags": "Parent Tags", + "delete_unlinked.confirm": "Are you sure you want to delete the following %{len(self.lib.missing_files)} entries?", + "delete_unlinked.delete_entries": "Deleting Entries", + "delete_unlinked.delete_unlinked": "Delete Unlinked Entries", + "delete_unlinked.deleting_number_entries": "Deleting %{x[0]+1}/{len(self.lib.missing_files)} Unlinked Entries", + "dialog.open_create_library": "Open/Create Library", + "dialog.refresh_directories": "Refreshing Directories", + "dialog.save_library": "Save Library", + "dialog.scan_directories.new_files": "Scanning Directories for New Files...\n%{x + 1} File%{\"s\" if x + 1 != 1 else \"\"} Searched, %{len(self.lib.files_not_in_library)} New Files Found", + "dialog.scan_directories": "Scanning Directories for New Files...\nPreparing...", + "file_extension.add_extension": "Add Extension", + "file_extension.list_mode": "List Mode:", + "file_opener.command_not_found": "Could not find %{command_name} on system PATH", + "file_opener.not_found": "File not found:", + "file_opener.open_file": "Opening file:", + "fix_dupes.advice_label": "After mirroring, you're free to use DupeGuru to delete the unwanted files. Afterwards, use TagStudio's \"Fix Unlinked Entries\" feature in the Tools menu in order to delete the unlinked Entries.", + "fix_dupes.fix_dupes": "Fix Duplicate Files", + "fix_dupes.load_file": "Load DupeGuru File", + "fix_dupes.mirror_description": "Mirror the Entry data across each duplicate match set, combining all data while not removing or duplicating fields. This operation will not delete any files or data.", + "fix_dupes.mirror_entries": "Mirror Entries", + "fix_dupes.name_filter": "DupeGuru Files (*.dupeguru)", + "fix_dupes.no_file_match": "Duplicate File Matches: N/A", + "fix_dupes.no_file_selected": "No DupeGuru File Selected", + "fix_dupes.number_file_match": "Duplicate File Matches: %{count}", + "fix_dupes.open_result_files": "Open DupeGuru Results File", + "fix_unlinked.delete_unlinked": "Delete Unlinked Entries", + "fix_unlinked.description": "Each library entry is linked to a file in one of your directories. If a file linked to an entry is moved or deleted outside of TagStudio, it is then considered unlinked. Unlinked entries may be automatically relinked via searching your directories, manually relinked by the user, or deleted if desired.", + "fix_unlinked.duplicate_description": "Duplicate entries are defined as multiple entries which point to the same file on disk. Merging these will combine the tags and metadata from all duplicates into a single consolidated entry. These are not to be confused with \"duplicate files\", which are duplicates of your files themselves outside of TagStudio.", + "fix_unlinked.fix_unlinked": "Fix Unlinked Entries", + "fix_unlinked.manual_relink": "Manual Relink", + "fix_unlinked.merge_dupes": "Merge Duplicate Entries", + "fix_unlinked.refresh_dupes": "Refresh Duplicate Entries", + "fix_unlinked.scan_library.label": "Scanning Library for Unlinked Entries...", + "fix_unlinked.scan_library.title": "Scanning Library", + "fix_unlinked.search_and_relink": "Search and Relink", + "folders_to_tags.description": "Creates tags based on your folder structure and applies them to your entries.\n The structure below shows all the tags that will be created and what entries they will be applied to.", + "folders_to_tags.title": "Create Tags From Folders", + "generic.add": "Add", + "generic.aliases": "Aliases", + "generic.apply": "Apply", + "generic.cancel": "Cancel", + "generic.close_all": "Close All", + "generic.color": "Color", + "generic.delete": "Delete", + "generic.done": "Done", + "generic.exclude": "Exclude", + "generic.file_extension": "File Extensions", + "generic.include": "Include", + "generic.mirror": "Mirror", + "generic.name": "Name", + "generic.open_all": "Open All", + "generic.open_file_explorer": "Open file in explorer", + "generic.open_file": "Open file", + "generic.refresh_all": "Refresh All", + "generic.remove_field": "Remove Field", + "generic.search_tags": "Search Tags", + "generic.shorthand": "Shorthand", + "home.include_all_tags": "And (Includes All Tags)", + "home.include_any_tag": "Or (Includes Any Tag)", + "home.main_window": "Main Window", + "home.pre_release": "Pre-Release", + "home.search_entries": "Search Entries", + "home.search": "Search", + "home.thumbnail_size": "Thumbnail Size", + "landing.open_button": "Open/Create Library %{open_shortcut_text}", + "library.anthology": "Anthology", + "library.archived": "Date Archived", + "library.Artist": "Artist", + "library.author": "Author", + "library.book": "Book", + "library.collation": "Collation", + "library.comic": "Comic", + "library.comments": "Comments", + "library.composer": "Composer", + "library.content_tags": "Content Tags", + "library.date_created": "Date Created", + "library.date_modified": "Date Modified", + "library.date_published": "Date Published", + "library.date_released": "Date Released", + "library.date_taken": "Date Taken", + "library.date_uploaded": "Date Uploaded", + "library.date": "Date", + "library.description": "Description", + "library.favorite": "Favorite", + "library.guest_artist": "Guest Artist", + "library.magazine": "Magazine", + "library.manga": "Manga", + "library.meta_tags": "Meta Tags", + "library.notes": "Notes", + "library.publisher": "Publisher", + "library.series": "Series", + "library.source": "Source", + "library.tags": "Tags", + "library.title": "Title", + "library.url": "URL", + "library.volume": "Volume", + "menu.edit": "Edit", + "menu.file": "File", + "menu.help": "Help", + "menu.macros": "Macros", + "menu.tools": "Tools", + "menu.window": "Window", + "merge.merge_dupe_entries": "Merging Duplicate Entries", + "merge.window_title": "Merging Duplicate Entries", + "mirror_entities.are_you_sure": "Are you sure you want to mirror the following %{len(self.lib.dupe_files)} Entries?", + "mirror_entities.label": "Mirroring 1/%{count} Entries...", + "mirror_entities.title": "Mirroring Entries", + "open_library.library_creation_return_code": "Library Creation Return Code:", + "open_library.no_tagstudio_library_found": "No existing TagStudio library found at '%{path}'. Creating one.", + "open_library.title": "Library", + "preview_panel.confirm_remove": "Are you sure you want to remove this \"%{self.lib.get_field_attr(field, \"name\")}\" field?", + "preview_panel.edit_name": "Edit", + "preview_panel.missing_location": "Location is missing", + "preview_panel.mixed_data": "Mixed Data", + "preview_panel.no_items_selected": "No Items Selected", + "preview_panel.unknown_field_type": "Unknown Field Type", + "preview.dimensions": "Dimensions", + "preview.recent": "Recent Libraries", + "progression.running_macros.new_entries": "Running Macros on New Entries", + "progression.running_macros.one_new_entry": "Running Configured Macros on 1/%{len(new_ids)} New Entries", + "progression.running_macros.several_new_entry": "Running Configured Macros on %{x + 1}/%{len(new_ids)} New Entries", + "relink_unlinked.attempt_relink": "Attempting to Relink %{x[0]+1}/%{len(self.lib.missing_files)} Entries, %{self.fixed} Successfully Relinked", + "relink_unlinked.title": "Relinking Entries", + "splash.open_library": "Opening Library", + "status.backup_success": "Library Backup Saved at:", + "status.number_results_found": "%{len(all_items)} Results Found for \"%{query}\" (%{format_timespan(end_time - start_time)})", + "status.results_found": "Results", + "status.save_success": "Library Saved and Closed!", + "status.search_library_query": "Searching Library for", + "tag.add_search": "Add to Search", + "tag.add": "Add Tag", + "tag.library": "Library Tags", + "tag.new": "New Tag", + "tag.search_for_tag": "Search for Tag" +} diff --git a/tagstudio/resources/translations/es.json b/tagstudio/resources/translations/es.json new file mode 100644 index 00000000..92df9068 --- /dev/null +++ b/tagstudio/resources/translations/es.json @@ -0,0 +1,137 @@ +{ + "add_field.add": "Añadir campo", + "build_tags.add_parent_tags": "Añadir etiquetas principales", + "build_tags.parent_tags": "Etiquetas principales", + "delete_unlinked.confirm": "¿Está seguro de que desea eliminar las siguientes %{len(self.lib.missing_files)} entradas?", + "delete_unlinked.delete_entries": "Eliminando entradas", + "delete_unlinked.delete_unlinked": "Eliminar entradas no vinculadas", + "delete_unlinked.deleting_number_entries": "Eliminando %{x[0]+1}/{len(self.lib.missing_files)} entradas no vinculadas", + "dialog.open_create_library": "Abrir/Crear biblioteca", + "dialog.refresh_directories": "Refrescar directorios", + "dialog.save_library": "Guardar la biblioteca", + "dialog.scan_directories.new_files": "Buscando archivos nuevos en los directorios...\n%{x + 1} Archivo%{\"s\" if x + 1 != 1 else \"\"} Buscado, %{len(self.lib.files_not_in_library)} Archivos nuevos encontrados", + "dialog.scan_directories": "Buscar archivos nuevos en los directorios...\nPreparando...", + "file_extension.add_extension": "Añadir extensión", + "file_extension.list_mode": "Modo de lista:", + "file_opener.command_not_found": "No se pudo encontrar %{command_name} en el PATH del sistema", + "file_opener.not_found": "Archivo no encontrado:", + "file_opener.open_file": "Abriendo archivo :", + "fix_dupes.advice_label": "Después de la duplicación, puede utilizar DupeGuru para eliminar los archivos no deseados. Luego, utilice la función \"Reparar entradas no vinculadas\" de TagStudio en el menú Herramientas para eliminar las entradas no vinculadas.", + "fix_dupes.fix_dupes": "Reparar archivos duplicados", + "fix_dupes.load_file": "Cargar archivo DupeGuru", + "fix_dupes.mirror_description": "Reflejar los datos de entrada en cada conjunto de coincidencias duplicadas, combinando todos los datos sin eliminar ni duplicar campos. Esta operación no eliminará ningún archivos ni dato.", + "fix_dupes.mirror_entries": "Reflejar entradas", + "fix_dupes.name_filter": "Archivos DupeGuru (*.dupeguru)", + "fix_dupes.no_file_match": "Coincidencias de archivos duplicados: N/D", + "fix_dupes.no_file_selected": "No se ha seleccionado ningún archivo DupeGuru", + "fix_dupes.number_file_match": "Coincidencias de archivos duplicados: %{count}", + "fix_dupes.open_result_files": "Abrir el archivo de resultados de DupeGuru", + "fix_unlinked.delete_unlinked": "Borrar entradas no vinculadas", + "fix_unlinked.description": "Cada entrada de la biblioteca está vinculada a un archivo en uno de sus directorios. Si un archivo vinculado a una entrada se mueve o se elimina fuera de TagStudio, se considerará desvinculado. Las entradas no vinculadas se pueden volver a vincular automáticamente mediante una búsqueda en sus directorios, el usuario puede volver a vincularlas manualmente o eliminarlas si así lo desea.", + "fix_unlinked.duplicate_description": "Las entradas duplicadas se definen como múltiples entradas que apuntan al mismo archivo en el disco. Al fusionarlas, se combinarán las etiquetas y los metadatos de todos los duplicados en una única entrada consolidada. No deben confundirse con los \"archivos duplicados\", que son duplicados de sus archivos fuera de TagStudio.", + "fix_unlinked.fix_unlinked": "Corregir entradas no vinculadas", + "fix_unlinked.manual_relink": "Reenlace manual", + "fix_unlinked.merge_dupes": "Fusionar entradas duplicadas", + "fix_unlinked.refresh_dupes": "Recargar entradas duplicadas", + "fix_unlinked.scan_library.label": "Buscando entradas no enlazadas en la biblioteca...", + "fix_unlinked.scan_library.title": "Escaneando la biblioteca", + "fix_unlinked.search_and_relink": "Buscar y volver a vincular", + "folders_to_tags.description": "Crea etiquetas basadas en su estructura de carpetas y las aplica a sus entradas.\n La siguiente estructura muestra todas las etiquetas que se crearán y a qué entradas se aplicarán.", + "folders_to_tags.title": "Crear etiquetas a partir de carpetas", + "generic.add": "Añadir", + "generic.aliases": "Alias", + "generic.apply": "Aplicar", + "generic.cancel": "Cancelar", + "generic.close_all": "Cerrar todo", + "generic.color": "Color", + "generic.delete": "Borrar", + "generic.done": "Donar", + "generic.exclude": "Excluir", + "generic.file_extension": "Extensiones del archivo", + "generic.include": "Incluir", + "generic.mirror": "Espejo", + "generic.name": "Nombre", + "generic.open_all": "Abrir todo", + "generic.open_file_explorer": "Abrir archivo en el explorador", + "generic.open_file": "Abrir archivo", + "generic.refresh_all": "Recargar todo", + "generic.remove_field": "Eliminar campo", + "generic.search_tags": "Buscar etiquetas", + "generic.shorthand": "Taquigrafía", + "home.include_all_tags": "Y (Incluye todas las etiquetas)", + "home.include_any_tag": "O (Incluye cualquier etiqueta)", + "home.main_window": "Ventana principal", + "home.search_entries": "Buscar entradas", + "home.search": "Buscar", + "home.thumbnail_size": "Tamaño de la miniatura", + "landing.open_button": "Abrir/Crear biblioteca %{open_shortcut_text}", + "library.anthology": "Antología", + "library.archived": "Fecha de archivo", + "library.Artist": "Artista", + "library.author": "Autor", + "library.book": "Libro", + "library.collation": "Recopilación", + "library.comic": "Tebeo", + "library.comments": "Comentarios", + "library.composer": "Compositor", + "library.content_tags": "Etiquetas del contenido", + "library.date_created": "Fecha de creación", + "library.date_modified": "Fecha de modificación", + "library.date_published": "Fecha de publicación", + "library.date_released": "Fecha de lanzamiento", + "library.date_taken": "Fecha de realización", + "library.date_uploaded": "Fecha de carga", + "library.date": "Fecha", + "library.description": "Descripción", + "library.favorite": "Favorito", + "library.guest_artist": "Artista invitado", + "library.magazine": "Revista", + "library.manga": "Manga", + "library.meta_tags": "Etiquetas de metadatos", + "library.notes": "Notas", + "library.publisher": "Editor", + "library.series": "Series", + "library.source": "Fuente", + "library.tags": "Etiquetas", + "library.title": "Título", + "library.url": "URL", + "library.volume": "Volumen", + "menu.edit": "Editar", + "menu.file": "Archivo", + "menu.help": "Ayuda", + "menu.macros": "Macro", + "menu.tools": "Herramientas", + "menu.window": "Ventana", + "merge.merge_dupe_entries": "Fusionando entradas duplicadas", + "merge.window_title": "Fusionando entradas duplicadas", + "mirror_entities.are_you_sure": "¿Estás seguro de que quieres reflejar las siguientes %{len(self.lib.dupe_files)} entradas?", + "mirror_entities.label": "Reflejando 1/%{count} Entradas...", + "mirror_entities.title": "Entradas reflejadas", + "open_library.library_creation_return_code": "Código de retorno de creación de biblioteca:", + "open_library.no_tagstudio_library_found": "No se encontró ninguna biblioteca TagStudio existente en '%{path}'. Se está creando una.", + "open_library.title": "Biblioteca", + "preview_panel.confirm_remove": "¿Está seguro de que desea eliminar este campo \"%{self.lib.get_field_attr(field, \"name\")}\"?", + "preview_panel.edit_name": "Editar", + "preview_panel.missing_location": "Falta la ubicación", + "preview_panel.mixed_data": "Datos variados", + "preview_panel.no_items_selected": "No hay elementos seleccionados", + "preview_panel.unknown_field_type": "Tipo de campo desconocido", + "preview.dimensions": "Dimensiones", + "preview.recent": "Bibliotecas recientes", + "progression.running_macros.new_entries": "Ejecución de macros en entradas nuevas", + "progression.running_macros.one_new_entry": "Ejecución de macros configurados en 1/%{len(new_ids)} entradas nuevas", + "progression.running_macros.several_new_entry": "Ejecución de macros configurados en %{x + 1}/%{len(new_ids)} entradas nuevas", + "relink_unlinked.attempt_relink": "Intentando volver a vincular %{x[0]+1}/%{len(self.lib.missing_files)} Entradas, %{self.fixed} Reenlazado correctamente", + "relink_unlinked.title": "Volver a vincular las entradas", + "splash.open_library": "Abriendo la biblioteca", + "status.backup_success": "Copia de seguridad de la biblioteca guardada en:", + "status.number_results_found": "%{len(all_items)} Resultados encontrados para \"%{query}\" (%{format_timespan(end_time - start_time)})", + "status.results_found": "Resultados", + "status.save_success": "¡Biblioteca guardada y cerrada!", + "status.search_library_query": "Buscando en la biblioteca", + "tag.add_search": "Añadir a la búsqueda", + "tag.add": "Añadir etiqueta", + "tag.library": "Etiquetas de la biblioteca", + "tag.new": "Nueva etiqueta", + "tag.search_for_tag": "Buscar por etiqueta" +} diff --git a/tagstudio/resources/translations/fr.json b/tagstudio/resources/translations/fr.json new file mode 100644 index 00000000..77702734 --- /dev/null +++ b/tagstudio/resources/translations/fr.json @@ -0,0 +1,137 @@ +{ + "add_field.add": "Ajouter un Champ", + "build_tags.add_parent_tags": "Ajouter des Labels Parents", + "build_tags.parent_tags": "Labels Parent", + "delete_unlinked.confirm": "Êtes-vous sûr de vouloir supprimer les entrées suivantes : %{len(self.lib.missing_files)} ?", + "delete_unlinked.delete_entries": "Suppression des Entrées", + "delete_unlinked.delete_unlinked": "Supprimer les Entrées non Liées", + "delete_unlinked.deleting_number_entries": "Suppressiuon des Entrées non Liées %{x[0]+1}/{len(self.lib.missing_files)}", + "dialog.open_create_library": "Ouvrir/Créer une Bibliothèque", + "dialog.refresh_directories": "Rafraichissement des Dossiers", + "dialog.save_library": "Sauvegarder la Bibliothèque", + "dialog.scan_directories.new_files": "Recherche de Nouveaux Fichiers dans les Dossiers...\n%{x + 1} Fichiers%{\"s\" if x + 1 != 1 else \"\"} Recherchés, %{len(self.lib.files_not_in_library)} Nouveaux Fichiers Trouvés", + "dialog.scan_directories": "Recherche de Nouveaux Fichiers dans les Dossiers...\nPréparation...", + "file_extension.add_extension": "Ajouter une Extension", + "file_extension.list_mode": "Mode Liste :", + "file_opener.command_not_found": "Impossible de trouver %{command_name} dans le CHEMIN système", + "file_opener.not_found": "Fichier non trouvé:", + "file_opener.open_file": "Ouverture du Fichier:", + "fix_dupes.advice_label": "Après réplication, vous êtes libre d'utiliser DupeGuru pour supprimer des fichiers non désirés. Ensuite, utilisez la fonctionnalité \"Réparation des Entrées non Liées\" de TagStudio dans le menu Outils pour supprimer les Entrées non liées.", + "fix_dupes.fix_dupes": "Réparer les Fichiers en Double", + "fix_dupes.load_file": "Charger un Fichier DupeGuru", + "fix_dupes.mirror_description": "Repliquer les données d'entrée dans chaque jeu de correspondances en double, en combinant toutes les données sans supprimer ni dupliquer de champs. Cette opération ne supprime aucun fichier ni aucune donnée.", + "fix_dupes.mirror_entries": "Répliquer les Entrées", + "fix_dupes.name_filter": "Fichiers DupeGuru (*.dupeguru)", + "fix_dupes.no_file_match": "Dupliquer les Correspondances de Fichier : N/A", + "fix_dupes.no_file_selected": "Aucun Fichier DupeGuru Sélectionné", + "fix_dupes.number_file_match": "Dupliquer les Correspondances de Fichier : %{count}", + "fix_dupes.open_result_files": "Ouvrire les Fichiers de Résultats de DupeGuru", + "fix_unlinked.delete_unlinked": "Supprimer les Entrées non Liées", + "fix_unlinked.description": "Chaque entrée dans la bibliothèque est liée à un fichier dans l'un de vos dossiers. Si un fichier lié à une entrée est déplacé ou supprimé en dehors de TagStudio, il est alors considéré non lié. Les entrées non liées peuvent être automatiquement reliées via la recherche dans vos dossiers, reliées manuellement par l'utilisateur, ou supprimées si désiré.", + "fix_unlinked.duplicate_description": "Les entrées dupliquées sont définies comme des entrées multiple qui pointent vers le même fichier sur le disque. Les fusionner va combiner les labels et metadatas de tous les duplicatas vers une seule entrée consolidée. Elles ne doivent pas être confondues avec les \"fichiers en doublon\", qui sont des doublons de vos fichiers en dehors de TagStudio.", + "fix_unlinked.fix_unlinked": "Réparation des Entrées non Liées", + "fix_unlinked.manual_relink": "Reliage Manuel", + "fix_unlinked.merge_dupes": "Fusionner les Entrées en Doublon", + "fix_unlinked.refresh_dupes": "Rafraichir les Entrées en Doublon", + "fix_unlinked.scan_library.label": "Balayage de la Bibliothèque pour trouver des Entrées non Liées...", + "fix_unlinked.scan_library.title": "Balayage de la Bibliothèque", + "fix_unlinked.search_and_relink": "Rechercher && Relier", + "folders_to_tags.description": "Créé des labels basés sur votre arborescence de dossier et les applique à vos entrées.\nLa structure ci-dessous affiche tous les labels qui seront créés et à quelles entrées ils seront appliqués.", + "folders_to_tags.title": "Créer un Label à partir d'un Dossier", + "generic.add": "Ajouter", + "generic.aliases": "Alias", + "generic.apply": "Appliquer", + "generic.cancel": "Annuler", + "generic.close_all": "Tout Fermer", + "generic.color": "Couleur", + "generic.delete": "Supprimer", + "generic.done": "Terminé", + "generic.exclude": "Exclure", + "generic.file_extension": "Extensions de Fichiers", + "generic.include": "Inclure", + "generic.mirror": "Refléter", + "generic.name": "Nom", + "generic.open_all": "Tout Ouvrir", + "generic.open_file_explorer": "Ouvrir un Fichier dans l'Explorateur", + "generic.open_file": "Ouvrir un Fichier", + "generic.refresh_all": "Tout Rafraichir", + "generic.remove_field": "Supprimer un Champ", + "generic.search_tags": "Rechercher les Labels", + "generic.shorthand": "Abrégé", + "home.include_all_tags": "Et (Inclus tous les Tags)", + "home.include_any_tag": "Ou (Inclure N'importe quel Label)", + "home.main_window": "Fenêtre Principale", + "home.search_entries": "Recherche", + "home.search": "Rechercher", + "home.thumbnail_size": "Taille de la miniature", + "landing.open_button": "Ouvrir/Créer une Bibliothèque %{open_shortcut_text}", + "library.anthology": "Anthologie", + "library.archived": "Date d'Archivage", + "library.Artist": "Artiste", + "library.author": "Auteur", + "library.book": "Livre", + "library.collation": "Collage", + "library.comic": "Bande Dessinée", + "library.comments": "Commentaires", + "library.composer": "Compositeur", + "library.content_tags": "Labels de Contenu", + "library.date_created": "Date de Création", + "library.date_modified": "Date de Modification", + "library.date_published": "Date de Publication", + "library.date_released": "Date de Sortie", + "library.date_taken": "Date de Capture", + "library.date_uploaded": "Date de Mise en Ligne", + "library.date": "Date", + "library.description": "Description", + "library.favorite": "Favori", + "library.guest_artist": "Artiste Invité", + "library.magazine": "Magazine", + "library.manga": "Manga", + "library.meta_tags": "Label Meta", + "library.notes": "Notes", + "library.publisher": "Éditeur", + "library.series": "Séries", + "library.source": "Source", + "library.tags": "Labels", + "library.title": "Titre", + "library.url": "URL", + "library.volume": "Volume", + "menu.edit": "Édition", + "menu.file": "Fichier", + "menu.help": "Aide", + "menu.macros": "Macros", + "menu.tools": "Outils", + "menu.window": "Fenêtre", + "merge.merge_dupe_entries": "Fusionner les duplicatas", + "merge.window_title": "Fusionner les duplicatas", + "mirror_entities.are_you_sure": "Êtes-vous sûr de vouloir répliquer les %{len(self.lib.dupe_files)} Entrées suivantes ?", + "mirror_entities.label": "Réplication de 1/%{count} Entrées...", + "mirror_entities.title": "Réplication des Entrées", + "open_library.library_creation_return_code": "Code de Création de bibliothèque:", + "open_library.no_tagstudio_library_found": "Aucune bibliothèque TagStudio trouvé au chemin '%{path}'. Création d'une bibliothèque.", + "open_library.title": "Bibliothèque", + "preview_panel.confirm_remove": "Êtes-vous sûr de vouloir supprimer le champ \"%{self.lib.get_field_attr(field, \"name\")}\" ?", + "preview_panel.edit_name": "Éditer", + "preview_panel.missing_location": "Emplacement Manquant", + "preview_panel.mixed_data": "Données Mélangées", + "preview_panel.no_items_selected": "Pas d'Objet Selectionné", + "preview_panel.unknown_field_type": "Type de Champ Inconnu", + "preview.dimensions": "Dimensions", + "preview.recent": "Bibliothèques Récentes", + "progression.running_macros.new_entries": "Exécution des Macros sur les Nouvelles Entrées", + "progression.running_macros.one_new_entry": "Éxecution des Macros Configurées sur 1/%{len(new_ids)} Nouvelles Entrées", + "progression.running_macros.several_new_entry": "Éxectution des Macros Configurées sur %{x + 1}/%{len(new_ids)} Nouvelles Entrées", + "relink_unlinked.attempt_relink": "Tentative de Reliage de %{x[0]+1}/%{len(self.lib.missing_files)} Entrées, %{self.fixed} ont été Reliées avec Succès", + "relink_unlinked.title": "Reliage des Entrées", + "splash.open_library": "Ouverture de Bilbliothèque", + "status.backup_success": "Chemin de la Sauvegarde de Bibliothèque :", + "status.number_results_found": "%{len(all_items)} Résultats Trouvés pour \"%{query}\" (%{format_timespan(end_time - start_time)})", + "status.results_found": "Résultats", + "status.save_success": "Bibliothèque Sauvegardée et Fermée !", + "status.search_library_query": "Recherche dans les Bibliothèque de", + "tag.add_search": "Ajouter à la Recherche", + "tag.add": "Ajouter un Label", + "tag.library": "Bibliothèque de Labels", + "tag.new": "Nouveau Label", + "tag.search_for_tag": "Recherche de Label" +} diff --git a/tagstudio/resources/translations/hu.json b/tagstudio/resources/translations/hu.json new file mode 100644 index 00000000..a592488b --- /dev/null +++ b/tagstudio/resources/translations/hu.json @@ -0,0 +1,137 @@ +{ + "add_field.add": "Új mező", + "build_tags.add_parent_tags": "Új szülőcímke", + "build_tags.parent_tags": "Szülőcímkék", + "delete_unlinked.confirm": "Biztosan törölni akarja az alábbi %{len(self.lib.missing_files)} elemet?", + "delete_unlinked.delete_entries": "Elemek törlése", + "delete_unlinked.delete_unlinked": "Kapcsolat nélküli elemek törlése", + "delete_unlinked.deleting_number_entries": "{len(self.lib.missing_files)}/%{x[0]+1}. kapcsolat nélküli elem törlése", + "dialog.open_create_library": "Könyvtár megnyitása/létrehozása", + "dialog.refresh_directories": "Mappák frissítése", + "dialog.save_library": "Könyvtár mentése", + "dialog.scan_directories.new_files": "Új fájlok keresése a mappákban…\n%{x + 1} fájl megvizsgálva; ebből %{len(self.lib.files_not_in_library)} új", + "dialog.scan_directories": "Új fájlok keresése a mappákban…\nElőkészítés…", + "file_extension.add_extension": "Kiterjesztés hozzáadása", + "file_extension.list_mode": "Listázott elemek módja:", + "file_opener.command_not_found": "A(z) „%{command_name}”-parancs nem szerepel a rendszer PATH-változójában.", + "file_opener.not_found": "Az alábbi fájl nem található:", + "file_opener.open_file": "Fájl megnyitása:", + "fix_dupes.advice_label": "A tükrözés befejezése után a DupeGuruval kitörölheti a nem kívánt fájlokat. Ezt követően, a TagStudio „Kapcsolat nélküli elemek javítása” funkciójával eltávolíthatja az árván maradt elemeket.", + "fix_dupes.fix_dupes": "Egyező fájlok egyesítése", + "fix_dupes.load_file": "DupeGuru fájl betöltése", + "fix_dupes.mirror_description": "Az összes adat átmásolása minden összetartozó fájl között, ezzel kiegészítve a hiányzó címkéket eltávolítás és duplikálás nélkül. Ez a folyamat nem fog adatokat vagy fájlokat törölni.", + "fix_dupes.mirror_entries": "Elemek tükrözése", + "fix_dupes.name_filter": "DupeGuru-fájlok (*.dupeguru)", + "fix_dupes.no_file_match": "Nincsenek egyező fájlok", + "fix_dupes.no_file_selected": "Nincs kiválasztott DupeGuru-fájl.", + "fix_dupes.number_file_match": "%{count} egyező fájl", + "fix_dupes.open_result_files": "DupeGuru-fájl megnyitása", + "fix_unlinked.delete_unlinked": "Kapcsolat nélküli elemek törlése", + "fix_unlinked.description": "A könyvtár minden eleme egy fájllal van összekapcsolva a számítógépen. Ha egy kapcsolt fájl a TagSudión kívül kerül áthelyezésre vagy törésre, akkor ez a kapcsolat megszakad. Ezeket a kapcsolat nélküli elemeket a program megpróbálhatja automatikusan megkeresni, de Ön is kézileg újra összekapcsolhatja vagy törölheti őket.", + "fix_unlinked.duplicate_description": "Ha több elem ugyanazzal a fájllal van összekapcsolva, akkor egyezőnek számítanak. Ha egyesíti őket, akkor egy olyan elem lesz létrehozva, ami az eredeti elemek összes adatát tartalmazza. Ezeket nem szabad összetéveszteni az „egyező fájlokkal”, amelyek a TagStudión kívüli azonos tartalmú fájlok.", + "fix_unlinked.fix_unlinked": "Kapcsolat nélküli elemek javítása", + "fix_unlinked.manual_relink": "Újra összekapcsolás kézileg", + "fix_unlinked.merge_dupes": "Egyező elemek egyesítése", + "fix_unlinked.refresh_dupes": "Egyező elemek frissítése", + "fix_unlinked.scan_library.label": "Kapcsolat nélküli elemek keresése a könyvtárban…", + "fix_unlinked.scan_library.title": "Könyvtár vizsgálata", + "fix_unlinked.search_and_relink": "Keresés és újra összekapcsolás", + "folders_to_tags.description": "Címkék automatikus létrehozása a létező mappastruktúra alapján.\nAz alábbi mappafán megtekintheti a létrehozandó címkéket, és hogy mely elemekre lesznek alkalmazva.", + "folders_to_tags.title": "Címkék létrehozása mappák alapján", + "generic.add": "Hozzáadás", + "generic.aliases": "Áljelek", + "generic.apply": "Alkalmaz", + "generic.cancel": "Mégse", + "generic.close_all": "Összes bezárása", + "generic.color": "Szín", + "generic.delete": "Törlés", + "generic.done": "Kész", + "generic.exclude": "Elrejtés", + "generic.file_extension": "Kiterjesztések", + "generic.include": "Mutatás", + "generic.mirror": "Tükrözés", + "generic.name": "Név", + "generic.open_all": "Összes megnyitása", + "generic.open_file_explorer": "Fájl megnyitása Intézőben", + "generic.open_file": "Fájl megnyitása", + "generic.refresh_all": "Összes frissítése", + "generic.remove_field": "Mező eltávolítása", + "generic.search_tags": "Címkék keresése", + "generic.shorthand": "Rövidítés", + "home.include_all_tags": "És (az összes keresett címkét tartalmazza)", + "home.include_any_tag": "Vagy (valamelyik keresett címkét tartalmazza)", + "home.main_window": "Fő ablak", + "home.search_entries": "Tételek keresése", + "home.search": "Keresés", + "home.thumbnail_size": "Indexkép mérete", + "landing.open_button": "Könyvtár megnyitása/létrehozása %{open_shortcut_text}", + "library.anthology": "Gyűjtemény", + "library.archived": "Archiválás dátuma", + "library.Artist": "Előadó", + "library.author": "Szerző", + "library.book": "Könyv", + "library.collation": "Rendezés", + "library.comic": "Képregény", + "library.comments": "Megjegyzés", + "library.composer": "Zeneszerző", + "library.content_tags": "Tartalomcímkék", + "library.date_created": "Létrehozás dátuma", + "library.date_modified": "Módosítás dátuma", + "library.date_published": "Közzététel dátuma", + "library.date_released": "Kiadás dátuma", + "library.date_taken": "Készítés dátuma", + "library.date_uploaded": "Feltöltés dátuma", + "library.date": "Dátum", + "library.description": "Leírás", + "library.favorite": "Kedvenc", + "library.guest_artist": "Társelőadó", + "library.magazine": "Magazin", + "library.manga": "Manga", + "library.meta_tags": "Metacímkék", + "library.notes": "Jegyzetek", + "library.publisher": "Kiadó", + "library.series": "Sorozat", + "library.source": "Forrás", + "library.tags": "Címkék", + "library.title": "Cím", + "library.url": "Hivatkozás", + "library.volume": "Kötet", + "menu.edit": "Szerkesztés", + "menu.file": "Fájl", + "menu.help": "Súgó", + "menu.macros": "Makrók", + "menu.tools": "Eszközök", + "menu.window": "Ablak", + "merge.merge_dupe_entries": "Egyező elemek egyesítése", + "merge.window_title": "Egyező elemek egyesítése", + "mirror_entities.are_you_sure": "Biztosan tükrözni akarja az alábbi adatokat %{len(self.lib.dupe_files)} különböző elemre?", + "mirror_entities.label": "%{count}/1 elem tükrözése folyamatban…", + "mirror_entities.title": "Elemek tükrözése", + "open_library.library_creation_return_code": "A könyvtárlétrehozási folyamat visszatérési kódja:", + "open_library.no_tagstudio_library_found": "A program nem talált létező TagStudio-könyvtárat az alábbi elérési úton: „%{path}”. Ezen a helyen egy új könyvtár lesz létrehozva.", + "open_library.title": "Könyvtár", + "preview_panel.confirm_remove": "Biztosan el akarja távolítani a(z) „%{self.lib.get_field_attr(field, \"name\")}”-mezőt?", + "preview_panel.edit_name": "Szerkesztés", + "preview_panel.missing_location": "Hiányzó hely", + "preview_panel.mixed_data": "Kevert adatok", + "preview_panel.no_items_selected": "Nincs kijelölt elem", + "preview_panel.unknown_field_type": "Ismeretlen mezőtípus", + "preview.dimensions": "Méret", + "preview.recent": "Legutóbbi könytárak", + "progression.running_macros.new_entries": "Makrók futtatása az új elemeken", + "progression.running_macros.one_new_entry": "Korábban beállított makrók futtatása %{len(new_ids)}/1 új elemen", + "progression.running_macros.several_new_entry": "Korábban beállított makrók futtatása %{len(new_ids)}/%{x + 1} új elemen", + "relink_unlinked.attempt_relink": "%{len(self.lib.missing_files)}/%{x[0]+1} elem újra összekapcsolásának megkísérlése; %{self.fixed} elem sikeresen újra összekapcsolva", + "relink_unlinked.title": "Elemek újra összekapcsolása", + "splash.open_library": "Könyvtár megnyitása", + "status.backup_success": "A biztonsági mentés létrehozása megtörtént az alábbi elérési úton:", + "status.number_results_found": "%{len(all_items)} találat az alábbi kifejezésre: „%{query}” (%{format_timespan(end_time - start_time)})", + "status.results_found": "találat", + "status.save_success": "A könyvtár mentése és bezárása sikeresen megtörtént.", + "status.search_library_query": "Az alábbi kifejezés keresése a könyvtárban:", + "tag.add_search": "Keresési kifejezés kiegészítése", + "tag.add": "Címke hozzáadása", + "tag.library": "Könyvtárcímkék", + "tag.new": "Új címke", + "tag.search_for_tag": "Címke keresése" +} diff --git a/tagstudio/resources/translations/it.json b/tagstudio/resources/translations/it.json new file mode 100644 index 00000000..309319d2 --- /dev/null +++ b/tagstudio/resources/translations/it.json @@ -0,0 +1,18 @@ +{ + "generic.add": "Aggiungi", + "generic.cancel": "Annulla", + "generic.color": "Colore", + "generic.delete": "Elimina", + "generic.name": "Nome", + "home.main_window": "Finestra principale", + "home.search": "Cerca", + "library.Artist": "Artista", + "library.book": "Libro", + "library.description": "Descrizione", + "library.title": "Titolo", + "menu.file": "File", + "menu.window": "Finestra", + "preview.recent": "Librerias Recenti", + "tag.add": "Aggiungi Tag", + "tag.new": "Nuovo Tag" +} diff --git a/tagstudio/resources/translations/nb_NO.json b/tagstudio/resources/translations/nb_NO.json new file mode 100644 index 00000000..4d6fa4b2 --- /dev/null +++ b/tagstudio/resources/translations/nb_NO.json @@ -0,0 +1,100 @@ +{ + "home.main_window": "Hovedvindu", + "home.thumbnail_size": "Miniatyrbildestørrelse", + "home.search_entries": "Søk etter oppføringer", + "home.search": "Søk", + "tag.new": "Ny etikett", + "tag.add": "Legg til etikett", + "tag.library": "Biblioteksetiketter", + "merge.merge_dupe_entries": "Fletter duplikatoppføringer …", + "preview.dimensions": "Dimensjoner", + "preview.recent": "Nylige bibliotek", + "library.url": "Nettadresse", + "library.description": "Beskrivelse", + "library.notes": "Notater", + "library.tags": "Etiketter", + "library.content_tags": "Innholdsetiketter", + "library.meta_tags": "Metaetiketter", + "library.date_published": "Publiseringsdato", + "library.archived": "Arkiveringsdato", + "library.date_uploaded": "Opplastingsdato", + "library.date_released": "Slippdato", + "library.comments": "Kommentarer", + "open_library.title": "Bibliotek", + "dialog.open_create_library": "Åpne/opprett bibliotek", + "library.guest_artist": "Gjesteartist", + "generic.add": "Legg til", + "generic.name": "Navn", + "generic.color": "Farge", + "generic.delete": "Slett", + "generic.done": "Ferdig", + "fix_dupes.fix_dupes": "Fiks duplikatfiler", + "fix_dupes.no_file_selected": "Ingen DupeGuru-fil valgt", + "fix_dupes.load_file": "Last inn DupeGuru-fil", + "fix_dupes.mirror_entries": "Speil oppføringer", + "preview_panel.edit_name": "Rediger", + "preview_panel.unknown_field_type": "Ukjent felttype", + "tag.search_for_tag": "Søk etter etikett", + "tag.add_search": "Legg til søk", + "menu.file": "Fil", + "menu.window": "Vindu", + "menu.edit": "Rediger", + "menu.macros": "Makroer", + "menu.tools": "Verktøy", + "library.magazine": "Magasin", + "menu.help": "Hjelp", + "library.date_modified": "Endringsdato", + "merge.window_title": "Fletter duplikatoppføringer …", + "library.manga": "Manga", + "library.source": "Kilde", + "tooltip.save_library": "Ctrl+S", + "library.date": "Dato", + "library.favorite": "Favoritt", + "library.comic": "Tegneserie", + "library.series": "Serie", + "library.date_created": "Dato opprettet", + "library.date_taken": "Dato knipset", + "library.book": "Bok", + "splash.open_library": "Åpner bibliotek …", + "preview_panel.no_items_selected": "Ingen elementer valgt", + "dialog.save_library": "Lagre bibliotek", + "tooltip.open_library": "Ctrl+O", + "generic.file_extension": "Filutvidelse", + "file_opener.not_found": "Fant ikke filen:", + "add_field.add": "Legg til felt", + "generic.remove_field": "Fjern felt", + "generic.include": "Inkluder", + "generic.open_file": "Åpne fil", + "generic.exclude": "Utelat", + "generic.open_file_explorer": "Åpne fil i utforsker", + "generic.cancel": "Avbryt", + "generic.open_all": "Åpne alle", + "generic.close_all": "Lukk alle", + "generic.mirror": "Speil", + "generic.refresh_all": "Gjenoppfrisk alle", + "generic.apply": "Bruk", + "generic.search_tags": "Søk etter etiketter", + "library.Artist": "Artist", + "library.publisher": "Utgiver", + "library.author": "Forfatter", + "status.save_success": "Bibliotek lagret og lukket.", + "status.backup_success": "Kopi av bibliotek lagret i:", + "status.search_library_query": "Søker i biblioteket etter", + "status.results_found": "Resultat", + "file_opener.open_file": "Åpner fil :", + "delete_unlinked.confirm": "Slett følgende %{len(self.lib.missing_files)} oppføringer?", + "delete_unlinked.delete_entries": "Sletting av oppføringer", + "file_extension.add_extension": "Legg til utvidelse", + "file_extension.list_mode": "Listemodus:", + "fix_dupes.name_filter": "DupeGuru-filer (*.dupeguru)", + "fix_unlinked.fix_unlinked": "Fiks ulenkede oppføringer", + "fix_dupes.open_result_files": "Åpne DupeGuru-resultatfil", + "fix_unlinked.scan_library.title": "Skanning av bibliotek", + "folders_to_tags.title": "Opprett etiketter fra mapper", + "preview_panel.mixed_data": "Blandet data", + "preview_panel.confirm_remove": "Fjern dette «%{self.lib.get_field_attr(field, \"name\")}»-feltet?", + "delete_unlinked.deleting_number_entries": "Sletter %{x[0]+1}/{len(self.lib.missing_files)} ulenkede oppføringer", + "fix_unlinked.scan_library.label": "Skanner bibliotek for ulenkede oppføringer …", + "preview_panel.missing_location": "Posisjon mangler", + "landing.open_button": "Åpne/opprett bibliotek %{open_shortcut_text}" +} diff --git a/tagstudio/resources/translations/pt.json b/tagstudio/resources/translations/pt.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/tagstudio/resources/translations/pt.json @@ -0,0 +1 @@ +{} diff --git a/tagstudio/resources/translations/pt_BR.json b/tagstudio/resources/translations/pt_BR.json new file mode 100644 index 00000000..a8255549 --- /dev/null +++ b/tagstudio/resources/translations/pt_BR.json @@ -0,0 +1,137 @@ +{ + "add_field.add": "Adicionar Campo", + "build_tags.add_parent_tags": "Adicionar Rótulo Pai", + "build_tags.parent_tags": "Rótulos Pai", + "delete_unlinked.confirm": "Tem certeza que deseja deletar as seguintes %{len(self.lib.missing_files)} entradas?", + "delete_unlinked.delete_entries": "Deletando Entradas", + "delete_unlinked.delete_unlinked": "Deletar Entradas Não Linkada", + "delete_unlinked.deleting_number_entries": "Deletando %{x[0]+1}/{len(self.lib.missing_files)} Entradas Não Linkadas", + "dialog.open_create_library": "Abrir/Criar Biblioteca", + "dialog.refresh_directories": "Atualizando Diretórios", + "dialog.save_library": "Salvar Biblioteca", + "dialog.scan_directories.new_files": "Escaneando Diretórios por Novos Arquivos...\n%{x + 1} Arquivo%{\"s\" if x + 1 != 1 else \"\"} Pesquisado%{\"s\" if x + 1 != 1 else \"\"}, %{len(self.lib.files_not_in_library)} Novo(s) Arquivo(s) Encontrado(s)", + "dialog.scan_directories": "Escaneando Diretórios por Novos Arquivos...\nPreparando...", + "file_extension.add_extension": "Adicionar Extensão", + "file_extension.list_mode": "Modo de Lista:", + "file_opener.command_not_found": "Não foi possível encontrar %{command_name} na PATH do sistema", + "file_opener.not_found": "Arquivo não encontrado:", + "file_opener.open_file": "Abrindo Arquivo:", + "fix_dupes.advice_label": "Após espelhagem, você estará livre para usar DupeGuru para deletar arquivos indesejados. Após, use a função \"Consertar Entradas Não Linkadas\" do TagStudio no menu de Ferramentas para deletar entradas não linkadas.", + "fix_dupes.fix_dupes": "Corrigir Arquivos Duplicados", + "fix_dupes.load_file": "Carregar Aquivo DupeGuru", + "fix_dupes.mirror_description": "Espelhe os ados de entrada em cada conjunto de correspondência duplicado, combinando todos os dados sem remover ou duplicar campos. Esta operação não excluirá nenhum arquivo ou dado.", + "fix_dupes.mirror_entries": "Entradas Espelhadas", + "fix_dupes.name_filter": "Arquivos DupeGuru (*.dupeguru)", + "fix_dupes.no_file_match": "Correspondências de Arquivos Duplicados: N/A", + "fix_dupes.no_file_selected": "Nenhum Arquivo DupeGuru Selecionado", + "fix_dupes.number_file_match": "Correspondências de Arquivos Duplicados: %{count}", + "fix_dupes.open_result_files": "Abrir Arquivo de Resultados do DupeGuru", + "fix_unlinked.delete_unlinked": "Escluir Entradas Não Linkadas", + "fix_unlinked.description": "Cada entrada na biblioteca está linkada a um arquivo em um dos seus diretórios. Se um arquivo linkado a uma entrada for movido ou deletado fora do TagStudio, ele é então considerado não linkado. Entradas não linkadas podem ser automaticamente re-linkadas por buscas nos seus diretórios, manualmente re-linkadas pelo usuário, ou deletada se for desejada.", + "fix_unlinked.duplicate_description": "Entradas duplicadas são definidas como multiplas entradas que levam ao mesmo arquivo no disco. Mergir essas entradas irá combinar as tags e metadados de todas as duplicatas em uma única entrada consolidada. Não confundir com \"Arquivos Duplicados\" que são duplicatas dos seus arquivos fora do TagStudio.", + "fix_unlinked.fix_unlinked": "Corrigir Entradas Não Linkadas", + "fix_unlinked.manual_relink": "Relink Manual", + "fix_unlinked.merge_dupes": "Mesclar Entradas Duplicadas", + "fix_unlinked.refresh_dupes": "Atualizar Entradas Duplicadas", + "fix_unlinked.scan_library.label": "Escaneando Bibliotecada para Entradas Não Linkadas...", + "fix_unlinked.scan_library.title": "Escaneando Biblioteca", + "fix_unlinked.search_and_relink": "Buscar && Relinkar", + "folders_to_tags.description": "Cria rótulos baseado na sua estrutura de arquivos e aplica elas nas suas entradas\nA estrutura abaixo mostra todos os rótulos que irão ser criados e a quais entradas eles serão aplicados.", + "folders_to_tags.title": "Criar rótulos a partir das pastas", + "generic.add": "Adicionar", + "generic.aliases": "Alias", + "generic.apply": "Aplicar", + "generic.cancel": "Cancelar", + "generic.close_all": "Fechar Tudo", + "generic.color": "Cor", + "generic.delete": "Deletar", + "generic.done": "Completo", + "generic.exclude": "Excluir", + "generic.file_extension": "Extensões de Arquivo", + "generic.include": "Incluir", + "generic.mirror": "Espelho", + "generic.name": "Nome", + "generic.open_all": "Abrir Tudo", + "generic.open_file_explorer": "Abrir no explorador de arquivos", + "generic.open_file": "Abrir arquivo", + "generic.refresh_all": "Atualizar_Tudo", + "generic.remove_field": "Remover Campo", + "generic.search_tags": "Buscar Rótulos", + "generic.shorthand": "Taquigrafia", + "home.include_all_tags": "E (Inclui todos os rótulos)", + "home.include_any_tag": "Ou (Inclui qualquer rótulo)", + "home.main_window": "Janela Principal", + "home.search_entries": "Buscar Entradas", + "home.search": "Buscar", + "home.thumbnail_size": "Tamanho de miniatura", + "landing.open_button": "Abrir/Criar Bliblioteca %{open_shortcut_text}", + "library.anthology": "Coletânea", + "library.archived": "Data de Arquivação", + "library.Artist": "Artista", + "library.author": "Autor", + "library.book": "Livro", + "library.collation": "Colagem", + "library.comic": "Quadrinho", + "library.comments": "Comentários", + "library.composer": "Compositor", + "library.content_tags": "Rótulos de conteúdo", + "library.date_created": "Data de Criação", + "library.date_modified": "Dada de Modificação", + "library.date_published": "Data de Publicação", + "library.date_released": "Data de Lançamento", + "library.date_taken": "Data de Criação", + "library.date_uploaded": "Data de Envio", + "library.date": "Data", + "library.description": "Descrição", + "library.favorite": "Favorito", + "library.guest_artist": "Artista Convidado", + "library.magazine": "Revista", + "library.manga": "Manga", + "library.meta_tags": "Meta Rótulos", + "library.notes": "Notas", + "library.publisher": "Editora", + "library.series": "Séries", + "library.source": "Fonte", + "library.tags": "Rótulos", + "library.title": "Título", + "library.url": "URL", + "library.volume": "Volume", + "menu.edit": "Editar", + "menu.file": "Arquivo", + "menu.help": "Ajuda", + "menu.macros": "Macros", + "menu.tools": "Ferramentas", + "menu.window": "Janela", + "merge.merge_dupe_entries": "Mesclando Entradas Duplicadas", + "merge.window_title": "Mesclando Entradas Duplicadas", + "mirror_entities.are_you_sure": "Tem certeza que você deseja espelhar os seguintes %{len(self.lib.dupe_files)} entradas?", + "mirror_entities.label": "Espelhando 1/%{count} Entradas...", + "mirror_entities.title": "Espelhando Entradas", + "open_library.library_creation_return_code": "Código de Retorno da Criação da Biblioteca:", + "open_library.no_tagstudio_library_found": "Nenhuma biblioteca do TagStudio existente foi encontrada em '%{path}'. Criando uma.", + "open_library.title": "Biblioteca", + "preview_panel.confirm_remove": "Você tem certeza de que quer remover o campo \"%{self.lib.get_field_attr(field, \"name\")}\"?", + "preview_panel.edit_name": "Editar", + "preview_panel.missing_location": "Localização Ausente", + "preview_panel.mixed_data": "Dados Mistos", + "preview_panel.no_items_selected": "Nenhum Item Selecionado", + "preview_panel.unknown_field_type": "Tipo de Campo Desconhecido", + "preview.dimensions": "Dimensões", + "preview.recent": "Bibliotecas recentes", + "progression.running_macros.new_entries": "Executando Macros nas Novas Entradas", + "progression.running_macros.one_new_entry": "Executando Macros Configurados em 1/%{len(new_ids)} Novas Entradas", + "progression.running_macros.several_new_entry": "Executando Macros Configurados em %{x + 1}/%{len(new_ids)} Novas Entradas", + "relink_unlinked.attempt_relink": "Tentando Relinkar %{x[0]+1}/%{len(self.lib.missing_files)} Entradas, %{self.fixed} Relinkadas com Sucesso", + "relink_unlinked.title": "Relinkando Entradas", + "splash.open_library": "Abrindo Biblioteca", + "status.backup_success": "Backup da Biblioteca Salvo em:", + "status.number_results_found": "%{len(all_items)} Resultados Encontrados para \"%{query}\" (%{format_timespan(end_time - start_time)})", + "status.results_found": "Resultados", + "status.save_success": "Biblioteca Salva e Fechada!", + "status.search_library_query": "Procurando na Biblioteca por", + "tag.add_search": "Adicionar a Pesquisa", + "tag.add": "Adicionar Rótulo", + "tag.library": "Rótulos da biblioteca", + "tag.new": "Novo Rótulo", + "tag.search_for_tag": "Procurar por Rótulo" +} diff --git a/tagstudio/resources/translations/ru.json b/tagstudio/resources/translations/ru.json new file mode 100644 index 00000000..1254adff --- /dev/null +++ b/tagstudio/resources/translations/ru.json @@ -0,0 +1,137 @@ +{ + "add_field.add": "Добавить Категорию", + "build_tags.add_parent_tags": "Добавить Теги-родители", + "build_tags.parent_tags": "Теги-родители", + "delete_unlinked.confirm": "Вы уверены в том, что желаете удалить %{len(self.lib.missing_files)} записи?", + "delete_unlinked.delete_entries": "Удаление записей", + "delete_unlinked.delete_unlinked": "Удалить откреплённые записи", + "delete_unlinked.deleting_number_entries": "Удалено %{x[0]+1}/{len(self.lib.missing_files)} откреплённых записей", + "dialog.open_create_library": "Открыть/Создать Библиотеку", + "dialog.refresh_directories": "Обновление Каталога", + "dialog.save_library": "Сохранить Библиотеку", + "dialog.scan_directories.new_files": "Сканирование на наличие новых файлов...\n%{x + 1} File%{\"s\" if x + 1 != 1 else \"\"} Searched, %{len(self.lib.files_not_in_library)} Найдены новые файлы", + "dialog.scan_directories": "Сканирование каталога на наличие новых файлов...\nПодготовка...", + "file_extension.add_extension": "Добавить расширение", + "file_extension.list_mode": "Список режимов:", + "file_opener.command_not_found": "Не смог найти %{command_name} в системе PATH", + "file_opener.not_found": "Файл не найден:", + "file_opener.open_file": "Открытие файла:", + "fix_dupes.advice_label": "После отзеркаливания, вы можете использовать DupeGuru, чтобы удалить ненужные файлы. После этого, используйте функцию \"Исправить откреплённые записи\" внутри панели \"Инструменты\" TagStudio, чтобы удалить откреплённые записи.", + "fix_dupes.fix_dupes": "Исправить дубликаты", + "fix_dupes.load_file": "Загрузить файл DupeGuru", + "fix_dupes.mirror_description": "Отзеркалить данные записи внутри каждого указанного набора дубликатов, объединяя все данные внутри без удаления или дублирования категорий. Эта операция не удалит какие-либо файлы или данные.", + "fix_dupes.mirror_entries": "Отзеркалить записи", + "fix_dupes.name_filter": "Файлы DupeGuru (*.dupeguru)", + "fix_dupes.no_file_match": "Совпадение файлов дубликатов: N/A", + "fix_dupes.no_file_selected": "Файл DupeGuru не выбран", + "fix_dupes.number_file_match": "Совпадения файлов дубликатов: %{count}", + "fix_dupes.open_result_files": "Открыть файл результатов DupeGuru", + "fix_unlinked.delete_unlinked": "Удалить откреплённые записи", + "fix_unlinked.description": "Каждая запись в библиотеке привязана к файлу, находящегося внутри той или иной папки. Если файл, к которому была привязана запись, был удалён или перемещён без использования TagStudio, то запись становиться \"откреплённой\". Откреплённые записи могут быть прикреплены обратно через автоматический рескан, вручную прикреплены обратно пользователем, либо же удалены если в них нет надобности.", + "fix_unlinked.duplicate_description": "Записи-дубликаты это несколько записей, которые одновременно привязаны к одному файлу. Объединение таких дубликатов соединит все теги и мета данные из этих записей в одну. Записи-дубликаты не стоит путать с несколькими копиями самого файла, которые могут существовать вне TagStudio.", + "fix_unlinked.fix_unlinked": "Исправить откреплённые записи", + "fix_unlinked.manual_relink": "Ручная привязка", + "fix_unlinked.merge_dupes": "Объединить записи дубликаты", + "fix_unlinked.refresh_dupes": "Обновить записи дубликаты", + "fix_unlinked.scan_library.label": "Сканирование Библиотеки на наличие откреплённых записей...", + "fix_unlinked.scan_library.title": "Сканирование Библиотеки", + "fix_unlinked.search_and_relink": "Поиск и Привязка", + "folders_to_tags.description": "Создаёт теги для записей согласно имеющейся иерархии папок.\nВнизу указаны все теги, которые будут созданы, а также записи к которым они будут применены.", + "folders_to_tags.title": "Создать теги из папок", + "generic.add": "Добавить", + "generic.aliases": "Псевдонимы", + "generic.apply": "Применить", + "generic.cancel": "Отмена", + "generic.close_all": "Закрыть Всё", + "generic.color": "Цвет", + "generic.delete": "Удалить", + "generic.done": "Завершено", + "generic.exclude": "Исключить", + "generic.file_extension": "Расширения Файлов", + "generic.include": "Включить", + "generic.mirror": "Отзеркалить", + "generic.name": "Имя", + "generic.open_all": "Открыть Всё", + "generic.open_file_explorer": "Открыть файл в проводнике", + "generic.open_file": "Открыть файл", + "generic.refresh_all": "Обновить Всё", + "generic.remove_field": "Удалить Категорию", + "generic.search_tags": "Поиск тегов", + "generic.shorthand": "Сокращённое название", + "home.include_all_tags": "И (Файл содержит все теги)", + "home.include_any_tag": "Или (Файл содержит любой из тегов)", + "home.main_window": "Основное Окно", + "home.search_entries": "Поисковые запросы", + "home.search": "Поиск", + "home.thumbnail_size": "Размер иконок", + "landing.open_button": "Открыть/Создать Библиотеку %{open_shortcut_text}", + "library.anthology": "Антология", + "library.archived": "Дата архивации", + "library.Artist": "Художник", + "library.author": "Автор", + "library.book": "Книги", + "library.collation": "Сопоставление", + "library.comic": "Комиксы", + "library.comments": "Комментарии", + "library.composer": "Композитор", + "library.content_tags": "Теги содержимого", + "library.date_created": "Дата создания", + "library.date_modified": "Дата изменения", + "library.date_published": "Дата публикации", + "library.date_released": "Дата выпуска", + "library.date_taken": "Дата съёмки", + "library.date_uploaded": "Дата загрузки", + "library.date": "Дата", + "library.description": "Описание", + "library.favorite": "Избранное", + "library.guest_artist": "Соавтор", + "library.magazine": "Журнал", + "library.manga": "Манга", + "library.meta_tags": "Мета Теги", + "library.notes": "Заметки", + "library.publisher": "Издатель", + "library.series": "Серии", + "library.source": "Источники", + "library.tags": "Теги", + "library.title": "Название", + "library.url": "URL", + "library.volume": "Том", + "menu.edit": "Редактировать", + "menu.file": "Файл", + "menu.help": "Помощь", + "menu.macros": "Макросы", + "menu.tools": "Инструменты", + "menu.window": "Окно", + "merge.merge_dupe_entries": "Объединить повторяющиеся записи", + "merge.window_title": "Объединить повторяющиеся записи", + "mirror_entities.are_you_sure": "Вы уверенны, что хотите отзеркалить следующие %{len(self.lib.dupe_files)} записи?", + "mirror_entities.label": "Отзеркаливание 1/%{count} записей...", + "mirror_entities.title": "Отзеркаливание записей", + "open_library.library_creation_return_code": "Возвратный код создания библиотеки:", + "open_library.no_tagstudio_library_found": "Существующая библиотека TagStudio не найдена внутри '%{path}'. Создаём новую.", + "open_library.title": "Библиотека", + "preview_panel.confirm_remove": "Вы уверенны, что хотите удалить эту категорию \"%{self.lib.get_field_attr(field, \"name\")}\"?", + "preview_panel.edit_name": "Редактировать", + "preview_panel.missing_location": "Путь не найден", + "preview_panel.mixed_data": "Смешанные данные", + "preview_panel.no_items_selected": "Ничего не выбрано", + "preview_panel.unknown_field_type": "Неизвестный тип категории", + "preview.dimensions": "Соотношения сторон", + "preview.recent": "Недавние библиотеки", + "progression.running_macros.new_entries": "Использование макросов на новых файлах", + "progression.running_macros.one_new_entry": "Запуск сконфигурированных макросов в 1/%{len(new_ids)} Новые файлы", + "progression.running_macros.several_new_entry": "Запуск сконфигурированных макросов в %{x + 1}/%{len(new_ids)} Новые файлы", + "relink_unlinked.attempt_relink": "Пытаемся вновь привязать %{x[0]+1}/%{len(self.lib.missing_files)} записей, %{self.fixed} Успешно привязано", + "relink_unlinked.title": "Привязка записей", + "splash.open_library": "Открытие Библиотеки", + "status.backup_success": "Резервная копия библиотеки сохранена по адресу:", + "status.number_results_found": "%{len(all_items)} Было найдено \"%{query}\" (%{format_timespan(end_time - start_time)})", + "status.results_found": "Результаты", + "status.save_success": "Библиотека сохранена и закрыта!", + "status.search_library_query": "Поиск по библиотеке", + "tag.add_search": "Добавить к поисковому запросу", + "tag.add": "Добавить тег", + "tag.library": "Библиотека тегов", + "tag.new": "Новый тег", + "tag.search_for_tag": "Поиск тега" +} diff --git a/tagstudio/resources/translations/sv.json b/tagstudio/resources/translations/sv.json new file mode 100644 index 00000000..c684f8ff --- /dev/null +++ b/tagstudio/resources/translations/sv.json @@ -0,0 +1,111 @@ +{ + "add_field.add": "Lägg till fält", + "build_tags.add_parent_tags": "Lägg till förälderetikett", + "build_tags.parent_tags": "Förälderetiketter", + "delete_unlinked.delete_entries": "Tar bort poster", + "dialog.open_create_library": "Öppna/skapa bibliotek", + "dialog.refresh_directories": "Uppdaterar kataloger", + "dialog.save_library": "Spara bibliotek", + "dialog.scan_directories": "Skannar kataloger efter nya filer...\nFörbereder...", + "file_extension.add_extension": "Lägg till tillägg", + "file_opener.not_found": "Kunde inte hitta filen:", + "file_opener.open_file": "Öppnar fil:", + "fix_dupes.fix_dupes": "Fixa dubbla filer", + "fix_dupes.mirror_entries": "Spegla poster", + "fix_unlinked.delete_unlinked": "Ta bort olänkade poster", + "fix_unlinked.description": "Varje post i biblioteket är länkad till en fil i en av dina kataloger. Om en fil länkad till en post är flyttad eller borttagen utanför TagStudio blir den olänkad. Olänkade poster kan automatiskt bli omlänkade genom att söka genom dina kataloger, manuellt omlänkade av användaren eller tas bort om så önskas.", + "fix_unlinked.duplicate_description": "Dubbla poster är definierade som flera poster som pekar på samma fil på datorn. Genom att slå ihop dessa poster kommer deras etiketter och metadata från dubbletterna att kombineras till en post. Dessa ska inte förväxlas med \"dubbla filer\", som är dubbletter av dina filer utanför TagStudio.", + "fix_unlinked.fix_unlinked": "Fixa olänkade poster", + "fix_unlinked.manual_relink": "Länka om manuellt", + "fix_unlinked.merge_dupes": "Slå ihop dubbla poster", + "fix_unlinked.refresh_dupes": "Uppdatera dubbla poster", + "fix_unlinked.scan_library.label": "Skannar bibliotek efter olänkade poster...", + "fix_unlinked.scan_library.title": "Skannar bibliotek", + "fix_unlinked.search_and_relink": "Sök && Länka om", + "folders_to_tags.description": "Skapar etiketter baserat på din mappstruktur och tillämpar dem till dina poster.\nStrukturen nedan visar vilka etiketter som kommer skapas och vilka filer de kommer tillämpas på.", + "folders_to_tags.title": "Skapa etiketter från mappar", + "generic.add": "Lägg till", + "generic.aliases": "Alias", + "generic.apply": "Tillämpa", + "generic.cancel": "Avbryt", + "generic.close_all": "Stäng alla", + "generic.color": "Färg", + "generic.delete": "Ta bort", + "generic.done": "Klar", + "generic.exclude": "Exkludera", + "generic.file_extension": "Filnamnstillägg", + "generic.include": "Inkludera", + "generic.mirror": "Spegla", + "generic.name": "Namn", + "generic.open_all": "Öppna alla", + "generic.open_file_explorer": "Öppna fil i utforskaren", + "generic.open_file": "Öppna fil", + "generic.refresh_all": "Uppdatera alla", + "generic.remove_field": "Ta bort fält", + "generic.search_tags": "Sök etikett", + "generic.shorthand": "Förkortning", + "home.include_all_tags": "Och (Inkluderar alla etiketter)", + "home.include_any_tag": "Eller (Inkluderar alla etiketter)", + "home.main_window": "Huvudfönster", + "home.search_entries": "Sök poster", + "home.search": "Sök", + "home.thumbnail_size": "Miniatyrbildsstorlek", + "library.anthology": "Antologi", + "library.archived": "Arkiveringsdatum", + "library.Artist": "Artist", + "library.author": "Författare", + "library.book": "Bok", + "library.collation": "Kollation", + "library.comic": "Serietidning", + "library.comments": "Kommentarer", + "library.composer": "Kompositör", + "library.content_tags": "Innehållsetiketter", + "library.date_created": "Skapad den", + "library.date_modified": "Senast ändrad", + "library.date_published": "Publiceringsdatum", + "library.date_released": "Utgivningsdatum", + "library.date_taken": "", + "library.date_uploaded": "Uppladdningsdatum", + "library.date": "Datum", + "library.description": "Beskrivning", + "library.favorite": "Favorit", + "library.guest_artist": "Gästartist", + "library.magazine": "Magasin", + "library.manga": "Manga", + "library.meta_tags": "Meta-etiketter", + "library.notes": "Anteckningar", + "library.publisher": "Utgivare", + "library.series": "Serie", + "library.source": "Källa", + "library.tags": "Etiketter", + "library.title": "Titel", + "library.url": "URL", + "library.volume": "Volym", + "menu.edit": "Redigera", + "menu.file": "Fil", + "menu.help": "Hjälp", + "menu.macros": "Makron", + "menu.tools": "Verktyg", + "menu.window": "Fönster", + "merge.merge_dupe_entries": "Slår ihop dubbla poster", + "merge.window_title": "Slår ihop dubbla poster", + "mirror_entities.title": "Speglar poster", + "open_library.title": "Bibliotek", + "preview_panel.edit_name": "Redigera", + "preview_panel.missing_location": "Platsen saknas", + "preview_panel.no_items_selected": "Inga valda objekt", + "preview.dimensions": "Dimensioner", + "preview.recent": "Senaste biblioteken", + "progression.running_macros.new_entries": "Kör makros på nya poster", + "relink_unlinked.title": "Länkar om poster", + "splash.open_library": "Öppnar bibliotek", + "status.backup_success": "Bibliotekets säkerhetskopia sparad i:", + "status.results_found": "Resultat", + "status.save_success": "Bibliotek sparat och stängt!", + "status.search_library_query": "Söker i biblioteket efter", + "tag.add_search": "Lägg till i Sök", + "tag.add": "Lägg till etikett", + "tag.library": "Biblioteksetiketter", + "tag.new": "Ny etikett", + "tag.search_for_tag": "Sök efter etikett" +} diff --git a/tagstudio/resources/translations/ta.json b/tagstudio/resources/translations/ta.json new file mode 100644 index 00000000..6386aa79 --- /dev/null +++ b/tagstudio/resources/translations/ta.json @@ -0,0 +1,137 @@ +{ + "add_field.add": "புலத்தைச் சேர்க்க", + "build_tags.add_parent_tags": "பெற்றோர் குறிச்சொற்களைச் சேர்க்க", + "build_tags.parent_tags": "பெற்றோர் குறிச்சொற்கள்", + "delete_unlinked.confirm": "பின்வரும் உள்ளீடுகளை நிச்சயமாக நீக்க விரும்புகிறீர்களா %{len(self.lib.missing_files)}?", + "delete_unlinked.delete_entries": "உள்ளீடுகள் நீக்கப்படுகிறது", + "delete_unlinked.delete_unlinked": "இணைக்கப்படாத உள்ளீடுகளை நீக்கு", + "delete_unlinked.deleting_number_entries": "%{x[0]+1}/{len(self.lib.missing_files)} இணைக்கப்படாத உள்ளீடுகள் நீக்கப்படுகிறது", + "dialog.open_create_library": "நூலகத்தைத் திற/உருவாக்கு", + "dialog.refresh_directories": "கோப்பகங்கள் புதுப்பிக்கப்படுகின்றன", + "dialog.save_library": "நூலகத்தைச் சேமி", + "dialog.scan_directories.new_files": "புதிய கோப்புகளுக்கான அடைவுகள் சோதனை செய்யப்படுகின்றது...\n%{x + 1} கோப்பு%{\"s\" if x + 1 != 1 else \"\"} தேடப்பட்டது, %{len(self.lib.files_not_in_library)} புதிய கோப்புகள் கிடைத்தன", + "dialog.scan_directories": "புதிய கோப்புகளுக்கான அடைவுகள் சோதனை செய்யப்படுகின்றது...\nதயாராகிறது...", + "file_extension.add_extension": "நீட்டிப்பைச் சேர்க்க", + "file_extension.list_mode": "பட்டியல் முறை:", + "file_opener.command_not_found": "%{command_name} ஐ system PATH இல் கண்டுபிடிக்க முடியவில்லை", + "file_opener.not_found": "கோப்பு கிடைக்கவில்லை:", + "file_opener.open_file": "கோப்பைத் திறக்கிறது:", + "fix_dupes.advice_label": "படிமம் முடிந்தவுடன், தேவையற்ற கோப்புகளை நீக்க DupeGuru ஐ பயன்படுத்தலாம். அதற்குப் பிறகு, இணைக்காத நுழைவுகளை நீக்க 'டாக் ஸ்டுடியோ' வின் 'இணைக்கப்படாத உள்ளீடுகளைச் சரிசெய்' அம்சத்தைக் கருவிகள் பட்டியில் பயன்படுத்தவும்.", + "fix_dupes.fix_dupes": "நகல் கோப்புகளைச் சரிசெய்", + "fix_dupes.load_file": "DupeGuru கோப்பை ஏற்றவும்", + "fix_dupes.mirror_description": "ஒவ்வொரு மறுநுழைவு பொருத்தத் தொகுப்பிலும் நுழைவு தரவுகளைப் பிரதிபலிக்கவும், அனைத்து தரவுகளையும் இணைக்கவும், எந்தத் தகவல்களையும் நீக்காமலும் மறு செய்யாமலும். இந்தச் செயலில் எந்தக் கோப்புகள் அல்லது தரவுகளும் நீக்கப்பட மாட்டாது.", + "fix_dupes.mirror_entries": "படிம நுழைவுகள்", + "fix_dupes.name_filter": "DupeGuru கோப்புகள் (*.dupeguru)", + "fix_dupes.no_file_match": "நகல் கோப்பு பொருத்தங்கள்: ஒன்றும் இல்லை", + "fix_dupes.no_file_selected": "DupeGuru கோப்பு எதுவும் தேர்ந்தெடுக்கப்படவில்லை", + "fix_dupes.number_file_match": "நகல் கோப்பு பொருத்தங்கள்: %{count}", + "fix_dupes.open_result_files": "DupeGuru முடிவுகள் கோப்பைத் திறக்க", + "fix_unlinked.delete_unlinked": "இணைக்கப்படாத உள்ளீடுகளை நீக்கு", + "fix_unlinked.description": "ஒவ்வொரு புத்தககல்லரி நுழைவும் உங்கள் அடைவுகளில் உள்ள ஒரு கோப்புடன் இணைக்கப்பட்டுள்ளது. டாக் ஸ்டுடியோ-வைத் தவிர கோப்புகள் நகர்த்தப்பட்டால் அல்லது நீக்கப்பட்டால், அவை இணைக்கப்படாதவையாகக் கருதப்படும். இணைக்கப்படாத நுழைவுகளை உங்கள் அடைவுகளில் தேடுவதன் மூலம் தானாகவே மீண்டும் இணைக்கலாம், பயனர் கைமுறையாக இணைக்கலாம் அல்லது விருப்பப்படி நீக்கலாம்.", + "fix_unlinked.duplicate_description": "மறுநுழைவுகள் என்பது, ஒரே கோப்பை குறிக்கும் பல நுழைவுகளை குறிக்கும். இவற்றை இணைப்பதால், அனைத்து மறுநுழைவுகளின் குறிச்சொற்களும் மெட்டாடேட்டாவும் ஒரே ஒட்டுமொத்த நுழைவாகச் சேர்க்கப்படும். இவற்றை 'மறுகோப்புகள்' என்பதுடன் குழப்பக் கூடாது, ஏனெனில் அவை டாக் ஸ்டுடியோவுக்கு வெளியேயுள்ள கோப்புகளின் நகல்களாகும்.", + "fix_unlinked.fix_unlinked": "இணைக்கப்படாத உள்ளீடுகளைச் சரிசெய்யவும்", + "fix_unlinked.manual_relink": "கைமுறை மறு இணைப்பு", + "fix_unlinked.merge_dupes": "நகல் உள்ளீடுகளை ஒன்றிணை", + "fix_unlinked.refresh_dupes": "நகல் உள்ளீடுகளைப் புதுப்பி", + "fix_unlinked.scan_library.label": "இணைக்கப்படாத நுழைவுகளை புத்தககல்லரியில் சோதனை செய்யப்படுகிறது...", + "fix_unlinked.scan_library.title": "புத்தககல்லரி சோதனை செய்யப்படுகிறது", + "fix_unlinked.search_and_relink": "தேடல் && மீண்டும் இணை", + "folders_to_tags.description": "உங்கள் அடைவு கட்டமைப்பின் அடிப்படையில் குறிச்சொற்களை உருவாக்கி, அவற்றை உங்கள் நுழைவுகளில் பயன்படுத்துகிறது.\nகீழே காணப்படும் கட்டமைப்பானது உருவாக்கப்படும் அனைத்து குறிச்சொற்களையும், அவை எந்த நுழைவுகளில் பயன்படுத்தப்படும் என்பதையும் காட்டுகிறது.", + "folders_to_tags.title": "கோப்புறைகளிலிருந்து குறிச்சொற்களை உருவாக்கு", + "generic.add": "சேர்", + "generic.aliases": "மாற்றுப்பெயர்கள்", + "generic.apply": "விண்ணப்பிக்க", + "generic.cancel": "ரத்து செய்", + "generic.close_all": "அனைத்தையும் மூடு", + "generic.color": "நிறம்", + "generic.delete": "நீக்கு", + "generic.done": "முடிந்தது", + "generic.exclude": "தவிர்", + "generic.file_extension": "கோப்பு நீட்டிப்புகள்", + "generic.include": "உள்ளடக்கு", + "generic.mirror": "படிமம்", + "generic.name": "பெயர்", + "generic.open_all": "அனைத்தையும் திற", + "generic.open_file_explorer": "Explorer இல் கோப்பைத் திறக்கவும்", + "generic.open_file": "கோப்பைத் திறக்கவும்", + "generic.refresh_all": "அனைத்தையும் புதுப்பி", + "generic.remove_field": "புலத்தை அகற்று", + "generic.search_tags": "குறிச்சொற்களைத் தேடு", + "generic.shorthand": "சுருக்கெழுத்து", + "home.include_all_tags": "மற்றும் (அனைத்து குறிச்சொற்களையும் உள்ளடக்கியது)", + "home.include_any_tag": "அல்லது (எந்தக் குறிச்சொல்லையும் உள்ளடக்கியது)", + "home.main_window": "பிரதான சாளரம்", + "home.search_entries": "தேடல் உள்ளீடுகள்", + "home.search": "தேடு", + "home.thumbnail_size": "சின்னப்பட அளவு", + "landing.open_button": "நூலகத்தைத் திற/உருவாக்கு %{open_shortcut_text}", + "library.anthology": "தொகுப்பியல்", + "library.archived": "காப்பகப்படுத்தப்பட்ட தேதி", + "library.Artist": "கலைஞர்", + "library.author": "ஆக்கியோன்", + "library.book": "புத்தகம்", + "library.collation": "தொகுத்தல்", + "library.comic": "நகைச்சுவை", + "library.comments": "கருத்துகள்", + "library.composer": "இசையமைப்பாளர்", + "library.content_tags": "உள்ளடக்கக் குறிச்சொற்கள்", + "library.date_created": "உருவாக்கப்பட்ட தேதி", + "library.date_modified": "மாற்றப்பட்ட தேதி", + "library.date_published": "வெளியிடப்பட்ட தேதி", + "library.date_released": "வெளியான தேதி", + "library.date_taken": "எடுக்கப்பட்ட தேதி", + "library.date_uploaded": "பதிவேற்றிய தேதி", + "library.date": "தேதி", + "library.description": "விளக்கம்", + "library.favorite": "பிடித்தது", + "library.guest_artist": "விருந்தினர் கலைஞர்", + "library.magazine": "இதழ்", + "library.manga": "மங்கா", + "library.meta_tags": "மெட்டா குறிச்சொற்கள்", + "library.notes": "குறிப்புகள்", + "library.publisher": "பதிப்பாளர்", + "library.series": "தொடர்", + "library.source": "ஆதாரம்", + "library.tags": "குறிச்சொற்கள்", + "library.title": "தலைப்பு", + "library.url": "இணைய முகவரி", + "library.volume": "தொகுப்பு", + "menu.edit": "திருத்து", + "menu.file": "கோப்பு", + "menu.help": "உதவி", + "menu.macros": "செயல்முறை", + "menu.tools": "கருவிகள்", + "menu.window": "சாளரம்", + "merge.merge_dupe_entries": "மறுநுழைவுகளை ஒன்றுசேர்த்தல்", + "merge.window_title": "மறுநுழைவுகளை ஒன்றுசேர்த்தல்", + "mirror_entities.are_you_sure": "பின்வரும் உள்ளீடுகளைப் பிரதிபலிக்க விரும்புகிறீர்களா %{len(self.lib.dupe_files)}?", + "mirror_entities.label": "1/%{count} உள்ளீடுகளைப் பிரதிபலிக்கப்படுகின்றது...", + "mirror_entities.title": "உள்ளீடுகள் பிரதிபழிக்கப்படுகின்றது", + "open_library.library_creation_return_code": "நூலக உருவாக்கம் திரும்பக் குறியீடு:", + "open_library.no_tagstudio_library_found": "'%{path}' இல் ஏற்கனவே உள்ள டாக் ஸ்டுடியோ புத்தககல்லரி காணப்படவில்லை. ஒன்று உருவாக்கப்படுகிறது.", + "open_library.title": "நூலகம்", + "preview_panel.confirm_remove": "இந்த \"%{self.lib.get_field_attr(field, \"name\")}\" புலத்தை நிச்சயமாக அகற்ற விரும்புகிறீர்களா?", + "preview_panel.edit_name": "திருத்து", + "preview_panel.missing_location": "இடம் காணவில்லை", + "preview_panel.mixed_data": "கலப்பு தரவு", + "preview_panel.no_items_selected": "உருப்படிகள் எதுவும் தேர்ந்தெடுக்கப்படவில்லை", + "preview_panel.unknown_field_type": "அறியப்படாத புல வகை", + "preview.dimensions": "பரிமாணங்கள்", + "preview.recent": "சமீபத்திய நூலகங்கள்", + "progression.running_macros.new_entries": "புதிய நுழைவுகளில் செயல்முறைகளை இயக்கப்படுகின்றது", + "progression.running_macros.one_new_entry": "1/ இல் கட்டமைக்கப்பட்ட செயல்முறைகளை இயக்கப்படுகிறது %{len(new_ids)} புதிய பதிவுகள்", + "progression.running_macros.several_new_entry": "%{x + 1} இல் கட்டமைக்கப்பட்ட செயல்முறைகளை இயக்கப்படுகிறது / %{len(new_ids)} புதிய பதிவுகள்", + "relink_unlinked.attempt_relink": "%{x[0]+1}/%{len(self.lib.missing_files)} உள்ளீடுகளை மீண்டும் இணைக்க முயற்சிக்கிறது, %{self.fixed} மீண்டும் இணைக்கப்பட்டது", + "relink_unlinked.title": "உள்ளீடுகள் மீண்டும் இணைக்கப்படுகின்றது", + "splash.open_library": "நூலகம் திறக்கப்படுகின்றது", + "status.backup_success": "நூலக காப்புப் பிரதி சேமிக்கப்பட்டது:", + "status.number_results_found": "\"%{query}\" இல் %{len(all_items)} முடிவுகள் கிடைத்தன (%{format_timespan(end_time - start_time)})", + "status.results_found": "முடிவுகள்", + "status.save_success": "நூலகம் சேமிக்கப்பட்டு மூடப்பட்டது!", + "status.search_library_query": "நூலகத்தைத் தேடுகிறது", + "tag.add_search": "தேடலில் சேர்", + "tag.add": "குறிச்சொல் சேர்க்க", + "tag.library": "நூலக குறிச்சொற்கள்", + "tag.new": "புதிய குறிச்சொல்", + "tag.search_for_tag": "குறிச்சொல்லைத் தேடு" +} diff --git a/tagstudio/resources/translations/tok.json b/tagstudio/resources/translations/tok.json new file mode 100644 index 00000000..3da017ac --- /dev/null +++ b/tagstudio/resources/translations/tok.json @@ -0,0 +1,137 @@ +{ + "add_field.add": "pana e sona", + "build_tags.add_parent_tags": "o pana e poki mama", + "build_tags.parent_tags": "poki mama", + "delete_unlinked.confirm": "mi weka e ijo %{len(self.lib.missing_files)}. ni li pona anu seme?", + "delete_unlinked.delete_entries": "mi weka e ijo", + "delete_unlinked.delete_unlinked": "o weka e ijo pi ijo lon ala", + "delete_unlinked.deleting_number_entries": "mi weka e ijo %{x[0]+1}/{len(self.lib.missing_files)} pi ijo lon ala", + "dialog.open_create_library": "open/sin e tomo", + "dialog.refresh_directories": "mi kama jo e sin lon tomo", + "dialog.save_library": "awen e tomo", + "dialog.scan_directories.new_files": "mi alasa e ijo sin lon tomo...\nmi lukin e ijo %{x + 1}. ijo %{len(self.lib.files_not_in_library)} li sin", + "dialog.scan_directories": "mi alasa e ijo sin lon tomo...\nmi kama pona...", + "file_extension.add_extension": "o pana e nimi anpa", + "file_extension.list_mode": "nasin kulupu:", + "file_opener.command_not_found": "mi ken ala alasa e toki lawa '%{command_name}' lon PATH", + "file_opener.not_found": "mi ken ala alasa e ijo:", + "file_opener.open_file": "mi open e ijo:", + "fix_dupes.advice_label": "jasima li pini la, sina ken kepeken ilo DupeGuru. ilo DupeGuru li ken weka e ijo ike. ni li pini la, o kepeken e nasin \"o pona e ijo pi ijo lon ala\" lon ilo TagStudio. ni li weka e ijo pi ijo lon ala.", + "fix_dupes.fix_dupes": "pona e ijo sama", + "fix_dupes.load_file": "o kama sona e ijo DupeGuru", + "fix_dupes.mirror_description": "o jasima e sona kama lon kulupu sama ale. sona ale li kama wan li weka ala li kama mute ala. ni li weka ala e sona e ijo.", + "fix_dupes.mirror_entries": "o jasima e ijo", + "fix_dupes.name_filter": "ijo DupeGuru (*.dupeguru)", + "fix_dupes.no_file_match": "ijo sama: ala", + "fix_dupes.no_file_selected": "sina o anu e ijo DupeGuru", + "fix_dupes.number_file_match": "ijo sama: %{count}", + "fix_dupes.open_result_files": "o open e sona pini tan ilo DupeGuru", + "fix_unlinked.delete_unlinked": "o weka e ijo pi ijo lon ala", + "fix_unlinked.description": "ijo ale li jo e ijo lon. ona li tawa anu weka, ona li jo ala e ijo lon. ijo pi ijo lon li ken alasa e tomo li ken kama jo e ijo lon. ante la sina ken pana ijo lon tawa ijo. ante la sina ken weka e ijo.", + "fix_unlinked.duplicate_description": "ken la, ijo mute li jo e ijo lon sama. ni li \"ijo sama\". sina wan e ona la, ijo sama li kama wan li jo e sona ale tan ijo sama ale.", + "fix_unlinked.fix_unlinked": "o pona e ijo pi ijo lon ala", + "fix_unlinked.manual_relink": "sina o pana e ijo lon tawa ijo", + "fix_unlinked.merge_dupes": "o kama wan e ijo sama", + "fix_unlinked.refresh_dupes": "o kama jo e sona tan ijo sama", + "fix_unlinked.scan_library.label": "mi o alasa e ijo pi ijo lon ala...", + "fix_unlinked.scan_library.title": "mi o lukin e tomo", + "fix_unlinked.search_and_relink": "o alasa o pana e ijo lon tawa ijo", + "folders_to_tags.description": "ni li pali e poki tan poki tona li pana e poki sin tawa ijo lon tomo.\n ilo ni li pali e anpa.", + "folders_to_tags.title": "o pali e poki tan poki tomo", + "generic.add": "o pana", + "generic.aliases": "nimi ante", + "generic.apply": "o pana", + "generic.cancel": "o ala", + "generic.close_all": "weka e ale", + "generic.color": "kule", + "generic.delete": "o weka", + "generic.done": "pona", + "generic.exclude": "o kepeken ala", + "generic.file_extension": "nimi lon nimi ijo anpa", + "generic.include": "o kepeken", + "generic.mirror": "jasima", + "generic.name": "nimi", + "generic.open_all": "open e ale", + "generic.open_file_explorer": "open e ijo lon ilo alasa", + "generic.open_file": "open e ijo", + "generic.refresh_all": "o kama jo sin tan ale", + "generic.remove_field": "weka e sona", + "generic.search_tags": "o alasa e poki", + "generic.shorthand": "nimi lili", + "home.include_all_tags": "AND (kepeken poki ale)", + "home.include_any_tag": "OR (kepeken poki wan. poki ale li ken)", + "home.main_window": "lipu suli", + "home.search_entries": "ijo alasa", + "home.search": "alasa", + "home.thumbnail_size": "suli sitelen", + "landing.open_button": "open/sin e tomo %{open_shortcut_text}", + "library.anthology": "kulupu toki", + "library.archived": "tenpo pi kama awen", + "library.Artist": "jan pali sitelen", + "library.author": "jan pali toki", + "library.book": "lipu toki", + "library.collation": "poki ijo", + "library.comic": "lipu sitelen", + "library.comments": "toki isipin", + "library.composer": "jan pali pi kalama musi", + "library.content_tags": "poki pi jo ijo", + "library.date_created": "tenpo pi kama sin", + "library.date_modified": "tenpo pi kama ante", + "library.date_published": "tenpo pana", + "library.date_released": "tenpo pi kama open", + "library.date_taken": "tenpo lanpan", + "library.date_uploaded": "tenpo pi kama lon lipu", + "library.date": "tenpo", + "library.description": "toki ni", + "library.favorite": "pona mute", + "library.guest_artist": "jan pali namako", + "library.magazine": "lipu sitelen toki", + "library.manga": "kulupu pi lipu sitelen", + "library.meta_tags": "poki pi sona ijo", + "library.notes": "toki sina", + "library.publisher": "jan esun", + "library.series": "kulupu", + "library.source": "tan", + "library.tags": "poki", + "library.title": "nimi", + "library.url": "nimi linluwi", + "library.volume": "nanpa", + "menu.edit": "ante", + "menu.file": "ijo", + "menu.help": "mi jo e toki seme", + "menu.macros": "ilo pali", + "menu.tools": "ilo", + "menu.window": "lipu", + "merge.merge_dupe_entries": "ijo sama li kama wan", + "merge.window_title": "ijo sama li kama wan", + "mirror_entities.are_you_sure": "mi jasima e ijo %{len(self.lib.dupe_files)}. ni li pona anu seme?", + "mirror_entities.label": "mi jasima e ijo 1/%{count}...", + "mirror_entities.title": "mi jasima e ijo", + "open_library.library_creation_return_code": "tomo li open li toki e ni:", + "open_library.no_tagstudio_library_found": "tomo lon '%{path}' li lon ala. mi pali e tomo.", + "open_library.title": "tomo", + "preview_panel.confirm_remove": "sina weka e sona poki \"%{self.lib.get_field_attr(field, \"name\")}\". ni li pona anu seme?", + "preview_panel.edit_name": "ante", + "preview_panel.missing_location": "ma li lon ala", + "preview_panel.mixed_data": "sona ante", + "preview_panel.no_items_selected": "ijo ala li anu", + "preview_panel.unknown_field_type": "mi sona ala e kule pi sona poki", + "preview.dimensions": "suli", + "preview.recent": "tomo pi tenpo poka", + "progression.running_macros.new_entries": "mi pali lon ijo sin", + "progression.running_macros.one_new_entry": "mi pali lon ijo sin 1/%{len(new_ids)}", + "progression.running_macros.several_new_entry": "mi pali lon ijo sin %{x + 1}/%{len(new_ids)}", + "relink_unlinked.attempt_relink": "mi o pana e ijo lon tawa ijo %{x[0]+1}/%{len(self.lib.missing_files)}. mi pana e ijo lon tawa ijo %{self.fixed}", + "relink_unlinked.title": "mi pana e ijo lon tawa ijo", + "splash.open_library": "mi open e tomo", + "status.backup_success": "tomo sama li lon:", + "status.number_results_found": "%{len(all_items)} mi jo e ijo \"%{query}\" (%{format_timespan(end_time - start_time)})", + "status.results_found": "jo", + "status.save_success": "tomo li awen li weka!", + "status.search_library_query": "mi alasa e", + "tag.add_search": "pana tawa alasa", + "tag.add": "o pana e poki", + "tag.library": "poki tomo", + "tag.new": "poki sin", + "tag.search_for_tag": "o alasa e poki" +} diff --git a/tagstudio/resources/translations/tr.json b/tagstudio/resources/translations/tr.json new file mode 100644 index 00000000..49010506 --- /dev/null +++ b/tagstudio/resources/translations/tr.json @@ -0,0 +1,137 @@ +{ + "add_field.add": "Alan Ekle", + "build_tags.add_parent_tags": "Üst Etiketler Ekle", + "build_tags.parent_tags": "Üst Etiketler", + "delete_unlinked.confirm": "%{len(self.lib.missing_files) tane kayıtları silmek istediğinden emin misin?", + "delete_unlinked.delete_entries": "Kayıtlar Siliniyor", + "delete_unlinked.delete_unlinked": "Kopuk Kayıtları Sil", + "delete_unlinked.deleting_number_entries": "%{x[0]+1}/{len(self.lib.missing_files)} Kopuk Kayıt Siliniyor", + "dialog.open_create_library": "Kütüphane Aç/Oluştur", + "dialog.refresh_directories": "Dizinler Yenileniyor", + "dialog.save_library": "Kütüphaneyi Kaydet", + "dialog.scan_directories.new_files": "Yeni Dosyalar için Dizinler Taranıyor...\n%{x + 1} File%{\"s\" if x + 1 != 1 else \"\"} Arandı, %{len(self.lib.files_not_in_library)} Yeni Dosya Bulundu", + "dialog.scan_directories": "Yeni Dosyalar için Dizinler Taranıyor...\nHazırlanıyor...", + "file_extension.add_extension": "Dosya Uzantısı Ekle", + "file_extension.list_mode": "Listeleme Modu:", + "file_opener.command_not_found": "Sistem PATH'inde %{command_name} komutu bulunamadı", + "file_opener.not_found": "Dosya bulunamadı:", + "file_opener.open_file": "Dosya açılıyor:", + "fix_dupes.advice_label": "Yansıtma işleminden sonra, DupeGuru'yu kullanarak istenmeyen dosyaları silebilirsin. İşlem sonrasında, kopuk kayıtları silmek için TagStudio'nun Araçlar menüsünden \"Kopuk Kayıtları Düzelt\" özelliğini kullanabilirsin.", + "fix_dupes.fix_dupes": "Yinelenen Dosyaları Düzelt", + "fix_dupes.load_file": "DupeGuru Dosyasını Yükle", + "fix_dupes.mirror_description": "Kayıt verilerini bulunan her bir yinelemeye yansıtır, alanları kopyalamadan veya silmeden tüm verileri birleştirir. Bu operasyon herhangi bir dosya veya veri silmeyecek.", + "fix_dupes.mirror_entries": "Kayıtları Yansıt", + "fix_dupes.name_filter": "DupeGuru Dosyaları (*.dupeguru)", + "fix_dupes.no_file_match": "Bulunan Yinelenen Dosyalar: Yok", + "fix_dupes.no_file_selected": "Seçili DupeGuru Dosyası Yok", + "fix_dupes.number_file_match": "Bulunan Yinelenen Dosyalar: %{count}", + "fix_dupes.open_result_files": "DupeGuru Sonuçlar Dosyasını Aç", + "fix_unlinked.delete_unlinked": "Kopuk Kayıtları Sil", + "fix_unlinked.description": "Kütüphanenizdeki her bir kayıt, dizinlerinizden bir tane dosya ile eşleştirilmektedir. Eğer bir kayıta bağlı dosya TagStudio dışında taşınır veya silinirse, o dosya artık kopuk olarak sayılır. Kopuk kayıtlar dizinlerinizde arama yapılırken otomatik olarak tekrar eşleştirilebilir, manuel olarak sizin tarafınızdan eşleştirilebilir veya isteğiniz üzere silinebilir.", + "fix_unlinked.duplicate_description": "Yinelenen kayıtlar, diskinizde aynı dosyaya işaret eden birden fazla kayıt olarak tanımlanmaktadır. Bu kayıtları birleştirdiğinizde, yinelenen tüm kayıtların içerisindeki etiketler ve metadata bilgisi tek bir tane kayıt üzerinde birleştirilecektir. Bu, \"yinelenen dosyalar\" ile karıştırılmamalıdır. Yinelenen dosyalar, TagStudio'nun dışında birden fazla kere bulunan dosyalarınızdır.", + "fix_unlinked.fix_unlinked": "Kopuk Kayıtları Düzelt", + "fix_unlinked.manual_relink": "Manuel Yeniden Eşleştirme", + "fix_unlinked.merge_dupes": "Yinelenen Kayıtları Birleştir", + "fix_unlinked.refresh_dupes": "Yinelenen Kayıtları Yenile", + "fix_unlinked.scan_library.label": "Kütüphane Kopuk Kayıtlar için Taranıyor...", + "fix_unlinked.scan_library.title": "Kütüphane Taranıyor", + "fix_unlinked.search_and_relink": "Ara && Yeniden Eşleştir", + "folders_to_tags.description": "Klasörlerinin yapısına bakarak etiketler oluşturur ve bu etiketleri kayıtlarına uygular.\nAşağıdaki yapı, oluşturulacak tüm etiketleri ve o etiketlerin hangi kayıtlarına uygulanacağını göstermektedir.", + "folders_to_tags.title": "Klasörlerden Etiketler Oluştur", + "generic.add": "Ekle", + "generic.aliases": "Takma Adlar", + "generic.apply": "Uygula", + "generic.cancel": "İptal", + "generic.close_all": "Tümünü Kapat", + "generic.color": "Renk", + "generic.delete": "Sil", + "generic.done": "Tamamlandı", + "generic.exclude": "Hariç Tut", + "generic.file_extension": "Dosya Uzantıları", + "generic.include": "Dahil Et", + "generic.mirror": "Yansıt", + "generic.name": "İsim", + "generic.open_all": "Tümünü Aç", + "generic.open_file_explorer": "Dosyayı Dosya Gezgininde Aç", + "generic.open_file": "Dosya aç", + "generic.refresh_all": "Tümünü Yenile", + "generic.remove_field": "Alan Kaldır", + "generic.search_tags": "Etiketleri Araştır", + "generic.shorthand": "Kısaltma", + "home.include_all_tags": "Ve (Tüm Etiketleri Dikkate Alır)", + "home.include_any_tag": "Veya (Herhangi Bir Etiketi Dikkate Alır)", + "home.main_window": "Ana Pencere", + "home.search_entries": "library", + "home.search": "Ara", + "home.thumbnail_size": "Küçük Resim Boyutu", + "landing.open_button": "Kütüphane Aç/Oluştur %{open_shortcut_text}", + "library.anthology": "Antoloji", + "library.archived": "Arşivlenme Tarihi", + "library.Artist": "Sanatçı", + "library.author": "Sahibi", + "library.book": "Kitap", + "library.collation": "Sıralama", + "library.comic": "Dergi", + "library.comments": "Yorumlar", + "library.composer": "Besteci", + "library.content_tags": "İçerik Etiketleri", + "library.date_created": "Oluşturulma Tarihi", + "library.date_modified": "Değiştirilme Tarihi", + "library.date_published": "Yayınlanma Tarihi", + "library.date_released": "Çıkış Tarihi", + "library.date_taken": "Alınma Tarihi", + "library.date_uploaded": "Yüklenme Tarihi", + "library.date": "Tarih", + "library.description": "Açıklama", + "library.favorite": "Favori", + "library.guest_artist": "Konuk Sanatçı", + "library.magazine": "Magazin", + "library.manga": "Manga", + "library.meta_tags": "Meta Etiketler", + "library.notes": "Notlar", + "library.publisher": "Yayımcı", + "library.series": "Dizi", + "library.source": "Kaynak", + "library.tags": "Etiketler", + "library.title": "Başlık", + "library.url": "URL", + "library.volume": "Ses Seviyesi", + "menu.edit": "Düzenle", + "menu.file": "Dosya", + "menu.help": "Yardım", + "menu.macros": "Makrolar", + "menu.tools": "Araçlar", + "menu.window": "Pencere", + "merge.merge_dupe_entries": "Yinelenen Kayıtlar Birleştiriliyor", + "merge.window_title": "Yinelenen Kayıtlar Birleştiriliyor", + "mirror_entities.are_you_sure": "%{len(self.lib.dupe_files)} kaydı yansıtmak istediğinden emin misin?", + "mirror_entities.label": "1/%{count} Kayıt Yansıtılıyor...", + "mirror_entities.title": "Kayıtlar Yansıtılıyor", + "open_library.library_creation_return_code": "Kütüphane Oluşturmaktan Dönen Kod:", + "open_library.no_tagstudio_library_found": "'%{path}' konumunda herhangi bir TagStudio kütüphanesi bulunamadı. Yeni bir tane oluşturuluyor.", + "open_library.title": "Kütüphane", + "preview_panel.confirm_remove": "Bu \"%{self.lib.get_field_attr(field, \"name\")}\" alanını silmek istediğinden emin misin?", + "preview_panel.edit_name": "Düzenle", + "preview_panel.missing_location": "Lokasyon bulunamadı", + "preview_panel.mixed_data": "Karışık Veri", + "preview_panel.no_items_selected": "Hiçbir Öğe Seçilmedi", + "preview_panel.unknown_field_type": "Bilinmeyen Alan Türü", + "preview.dimensions": "Ölçüler", + "preview.recent": "Son Kütüphaneler", + "progression.running_macros.new_entries": "Yeni Kayıtlar Üzerinde Makrolar Çalıştırılıyor", + "progression.running_macros.one_new_entry": "1/%{len(new_ids)} Tane Yeni Kayıtlarda Yapılandırılmış Makrolar Çalıştırılıyor", + "progression.running_macros.several_new_entry": "%{x + 1}/%{len(new_ids)} Tane Yeni Kayıt Üzerinde Yapılandırılmış Makrolar Çalıştırılıyor", + "relink_unlinked.attempt_relink": "%{x[0]+1}/%{len(self.lib.missing_files)} Kayıt Yeniden Eşleştirilmeye Çalışılıyor, %{self.fixed} Başarıyla Yeniden Eşleştirildi", + "relink_unlinked.title": "Kayıtlar Yeniden Eşleştiriliyor", + "splash.open_library": "Kütüphane Açılıyor", + "status.backup_success": "Kütüphane Yedeklemesi Şuraya Kaydedildi:", + "status.number_results_found": "\"%{query}\" (%{format_timespan(end_time - start_time)}) Sorgusu için %{len(all_items)} Sonuç Bulundu", + "status.results_found": "Sonuçlar", + "status.save_success": "Kütüphane Kaydedildi ve Çıkış Yapıldı!", + "status.search_library_query": "Kütüphane Aranıyor", + "tag.add_search": "Aramaya Ekle", + "tag.add": "Etiket Ekle", + "tag.library": "Kütüphane Etiketleri", + "tag.new": "Yeni Etiket", + "tag.search_for_tag": "Etiket Ara" +} From 02ac69978d2665e4010c45356fed6d27eadba8d8 Mon Sep 17 00:00:00 2001 From: Travis Abendshien Date: Tue, 1 Oct 2024 17:07:01 -0700 Subject: [PATCH 04/82] Revert "translations: update from Hosted Weblate (#526)" This reverts commit c37c4a95a700920272f00a859c03ef154ecf268e. --- .git-blame-ignore-revs | 3 - tagstudio/resources/translations/da.json | 5 - tagstudio/resources/translations/de.json | 121 --------- tagstudio/resources/translations/en.json | 280 ++++++++++---------- tagstudio/resources/translations/es.json | 137 ---------- tagstudio/resources/translations/fr.json | 137 ---------- tagstudio/resources/translations/hu.json | 137 ---------- tagstudio/resources/translations/it.json | 18 -- tagstudio/resources/translations/nb_NO.json | 100 ------- tagstudio/resources/translations/pt.json | 1 - tagstudio/resources/translations/pt_BR.json | 137 ---------- tagstudio/resources/translations/ru.json | 137 ---------- tagstudio/resources/translations/sv.json | 111 -------- tagstudio/resources/translations/ta.json | 137 ---------- tagstudio/resources/translations/tok.json | 137 ---------- tagstudio/resources/translations/tr.json | 137 ---------- 16 files changed, 143 insertions(+), 1592 deletions(-) delete mode 100644 tagstudio/resources/translations/da.json delete mode 100644 tagstudio/resources/translations/de.json delete mode 100644 tagstudio/resources/translations/es.json delete mode 100644 tagstudio/resources/translations/fr.json delete mode 100644 tagstudio/resources/translations/hu.json delete mode 100644 tagstudio/resources/translations/it.json delete mode 100644 tagstudio/resources/translations/nb_NO.json delete mode 100644 tagstudio/resources/translations/pt.json delete mode 100644 tagstudio/resources/translations/pt_BR.json delete mode 100644 tagstudio/resources/translations/ru.json delete mode 100644 tagstudio/resources/translations/sv.json delete mode 100644 tagstudio/resources/translations/ta.json delete mode 100644 tagstudio/resources/translations/tok.json delete mode 100644 tagstudio/resources/translations/tr.json diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index 37a45d84..5fe6e499 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -1,6 +1,3 @@ # Date: Fri, 13 Sep 2024 00:28:00 -0700 # ci(ruff)!: update ruff linter config, refactor to comply b6e216760557c5507b12f210e1e48c531f49ffa3 - -# fix: remove unused strings and sort lists -30988b7095bc38c49bf96907bf379105ba00ed47 diff --git a/tagstudio/resources/translations/da.json b/tagstudio/resources/translations/da.json deleted file mode 100644 index bdbcc033..00000000 --- a/tagstudio/resources/translations/da.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "home.include_all_tags": "Og (inkluderer alle tags)", - "home.include_any_tag": "Og (inkluderer envher tag)", - "home.main_window": "Hovedvindue" -} diff --git a/tagstudio/resources/translations/de.json b/tagstudio/resources/translations/de.json deleted file mode 100644 index f24817f7..00000000 --- a/tagstudio/resources/translations/de.json +++ /dev/null @@ -1,121 +0,0 @@ -{ - "add_field.add": "Feld hinzufügen", - "build_tags.add_parent_tags": "Übergeordnete Tags hinzufügen", - "build_tags.parent_tags": "Übergeordnete Tags", - "delete_unlinked.confirm": "Sind Sie sicher, dass Sie die folgenden %{len(self.lib.missing_files)}-Einträge löschen wollen?", - "delete_unlinked.delete_entries": "Einträge am Löschen", - "delete_unlinked.delete_unlinked": "Unverknüpfte Einträge löschen", - "delete_unlinked.deleting_number_entries": "Löschen von %{x[0]+1}/{len(self.lib.missing_files)} Unverknüpften Einträgen", - "dialog.open_create_library": "Bibliothek öffnen/erstellen", - "dialog.refresh_directories": "Verzeichnisse werden aktualisiert", - "dialog.save_library": "Bibliothek speichern", - "dialog.scan_directories.new_files": "Verzeichnisse nach neuen Dateien durchsuchen...\n%{x + 1} Datei%{„s“ if x + 1 != 1 else „“} Gesucht, %{len(self.lib.files_not_in_library)} Neue Dateien gefunden", - "dialog.scan_directories": "Überprüfe Verzeichnisse auf neue Dateien...\nBereite vor...", - "file_extension.add_extension": "Erweiterung hinzufügen", - "file_opener.command_not_found": "Konnte %{command_name} nicht im System PATH finden", - "file_opener.not_found": "Datei nicht gefunden:", - "file_opener.open_file": "Datei öffnen:}", - "fix_dupes.advice_label": "Nach der Spiegelung können Sie DupeGuru verwenden, um die unerwünschten Dateien zu löschen. Verwenden Sie anschliessend die Funktion „Unverknüpfte Einträge reparieren“ im Menü „Extras“ von TagStudio, um die unverknüpften Einträge zu löschen.", - "fix_dupes.fix_dupes": "Doppelte Dateien korrigieren", - "fix_dupes.load_file": "DupeGuru-Datei laden", - "fix_dupes.mirror_description": "Spiegeln die Eingabedaten für jeden doppelten Abgleichsatz, indem Sie alle Daten kombinieren, ohne Felder zu entfernen oder zu duplizieren. Bei diesem Vorgang werden keine Dateien oder Daten gelöscht.", - "fix_dupes.mirror_entries": "Spiegelnde Einträge", - "fix_dupes.name_filter": "DupeGuru-Dateien (*.dupeguru)", - "fix_dupes.no_file_match": "Übereinstimmungen mit doppelten Dateien: N/A", - "fix_dupes.no_file_selected": "Keine DupeGuru-Datei ausgewählt", - "fix_dupes.number_file_match": "Übereinstimmungen mit doppelten Dateien: %{count}", - "fix_dupes.open_result_files": "DupeGuru Ergebnisdatei öffnen", - "fix_unlinked.delete_unlinked": "Nicht verknüpfte Einträge löschen", - "fix_unlinked.description": "Jeder Bibliothekseintrag ist mit einer Datei in einem Ihrer Verzeichnisse verknüpft. Wenn eine Datei, die mit einem Eintrag verknüpft ist, ausserhalb von TagStudio verschoben oder gelöscht wird, gilt sie als nicht verknüpft. Nicht verknüpfte Einträge können durch Durchsuchen Ihrer Verzeichnisse automatisch neu verknüpft, vom Benutzer manuell neu verknüpft oder auf Wunsch gelöscht werden.", - "fix_unlinked.duplicate_description": "Doppelte Einträge sind definiert als mehrere Einträge, die auf dieselbe Datei auf der Festplatte verweisen. Durch das Zusammenführen dieser Einträge werden die Tags und Metadaten aller Duplikate zu einem einzigen konsolidierten Eintrag zusammengefasst. Diese sind nicht zu verwechseln mit „doppelten Dateien“, die Duplikate Ihrer Dateien selbst außerhalb von TagStudio sind.", - "fix_unlinked.fix_unlinked": "Unverknüpfte Einträge reparieren", - "fix_unlinked.manual_relink": "Manuelle Neuverknüpfung", - "fix_unlinked.merge_dupes": "Doppelte Einträge zusammenführen", - "fix_unlinked.refresh_dupes": "Doppelte Einträge aktualisieren", - "fix_unlinked.scan_library.label": "Bibliothek nach nicht verknüpften Einträgen durchsuchen...", - "fix_unlinked.scan_library.title": "Bibliothek wird scannen", - "fix_unlinked.search_and_relink": "Suche && Neuverbindung", - "generic.add": "hinzufügen", - "generic.aliases": "Aliase", - "generic.apply": "anwenden", - "generic.cancel": "Abbrechen", - "generic.close_all": "Alle schliessen", - "generic.color": "Farbe", - "generic.delete": "Löschen", - "generic.done": "Fertig", - "generic.exclude": "ausschliessen", - "generic.file_extension": "Dateierweiterungen", - "generic.include": "einschliessen", - "generic.mirror": "Spiegel", - "generic.name": "Name", - "generic.open_all": "Alle öffnen", - "generic.open_file_explorer": "Datei im Explorer öffnen", - "generic.open_file": "Datei öffnen", - "generic.refresh_all": "Alle aktualisieren", - "generic.remove_field": "Feld entfernen", - "generic.search_tags": "Tags suchen", - "generic.shorthand": "Kürzel", - "home.include_all_tags": "Und (enthält alle Tags)", - "home.include_any_tag": "Oder (enthält alle Tags)", - "home.main_window": "Hauptfenster", - "home.search_entries": "Nach Einträgen suchen", - "home.search": "Suchen", - "home.thumbnail_size": "Grösse des Vorschaubildes", - "library.anthology": "Anthologie", - "library.archived": "Archivierungsdatum", - "library.Artist": "Künstler", - "library.author": "Autor", - "library.book": "Buch", - "library.collation": "Zusammenstellung", - "library.comic": "Comicheft", - "library.comments": "Kommentare", - "library.composer": "Komponist", - "library.content_tags": "Inhalt Tags", - "library.date_created": "Erstellungsdatum", - "library.date_modified": "Datum geändert", - "library.date_published": "Datum des Publizierten", - "library.date_released": "Veröffentlichungsdatum", - "library.date_taken": "Aufnahmedatum", - "library.date_uploaded": "Hochladedatum", - "library.date": "Datum", - "library.description": "Beschreibung", - "library.favorite": "Favoriten", - "library.guest_artist": "Gastkünstler", - "library.magazine": "Zeitschrift", - "library.manga": "Manga", - "library.meta_tags": "Meta Tags", - "library.notes": "Notizen", - "library.publisher": "Herausgeber", - "library.series": "Serie", - "library.source": "Quelle", - "library.tags": "Tags", - "library.title": "Titel", - "library.url": "URL", - "library.volume": "Band", - "menu.edit": "Bearbeiten", - "menu.file": "Datei", - "menu.help": "Hilfe", - "menu.macros": "Makros", - "menu.tools": "Werkzeuge", - "menu.window": "Fenster", - "merge.merge_dupe_entries": "Zusammenführen von doppelten Einträgen", - "merge.window_title": "Zusammenführen von doppelten Einträgen", - "open_library.library_creation_return_code": "Bibliothekserstellung Rückgabecode:", - "open_library.no_tagstudio_library_found": "Keine vorhandene TagStudio-Bibliothek unter '%{Pfad}' gefunden. Eine wird erstellt.", - "open_library.title": "Bibliothek", - "preview.dimensions": "Abmessungen", - "preview.recent": "Aktuelle Bibliotheken", - "progression.running_macros.new_entries": "Ausführen von Makros bei neuen Einträgen", - "progression.running_macros.one_new_entry": "Ausführen konfigurierter Makros für 1/%{len(new_ids)} neue Einträge", - "progression.running_macros.several_new_entry": "Ausführen konfigurierter Makros für %{x + 1}/%{len(new_ids)} neue Einträge", - "relink_unlinked.title": "Einträge werden neuverknüpft", - "splash.open_library": "Die Bibliothek wird geöffnet", - "status.backup_success": "Bibliotheks-Backup gespeichert unter:", - "status.number_results_found": "%{len(all_items)} Ergebnisse gefunden für „%{query}“ (%{format_timespan(end_time - start_time)})", - "status.results_found": "Ergebnisse", - "status.save_success": "Bibliothek gespeichert und geschlossen!", - "status.search_library_query": "Suche in der Bibliothek nach", - "tag.add": "Hinzufüge Tag", - "tag.library": "Bibliothek Tags", - "tag.new": "Neuer Tag" -} diff --git a/tagstudio/resources/translations/en.json b/tagstudio/resources/translations/en.json index 6e8a630d..016aa323 100644 --- a/tagstudio/resources/translations/en.json +++ b/tagstudio/resources/translations/en.json @@ -1,138 +1,144 @@ { - "add_field.add": "Add Field", - "build_tags.add_parent_tags": "Add Parent Tags", - "build_tags.parent_tags": "Parent Tags", - "delete_unlinked.confirm": "Are you sure you want to delete the following %{len(self.lib.missing_files)} entries?", - "delete_unlinked.delete_entries": "Deleting Entries", - "delete_unlinked.delete_unlinked": "Delete Unlinked Entries", - "delete_unlinked.deleting_number_entries": "Deleting %{x[0]+1}/{len(self.lib.missing_files)} Unlinked Entries", - "dialog.open_create_library": "Open/Create Library", - "dialog.refresh_directories": "Refreshing Directories", - "dialog.save_library": "Save Library", - "dialog.scan_directories.new_files": "Scanning Directories for New Files...\n%{x + 1} File%{\"s\" if x + 1 != 1 else \"\"} Searched, %{len(self.lib.files_not_in_library)} New Files Found", - "dialog.scan_directories": "Scanning Directories for New Files...\nPreparing...", - "file_extension.add_extension": "Add Extension", - "file_extension.list_mode": "List Mode:", - "file_opener.command_not_found": "Could not find %{command_name} on system PATH", - "file_opener.not_found": "File not found:", - "file_opener.open_file": "Opening file:", - "fix_dupes.advice_label": "After mirroring, you're free to use DupeGuru to delete the unwanted files. Afterwards, use TagStudio's \"Fix Unlinked Entries\" feature in the Tools menu in order to delete the unlinked Entries.", - "fix_dupes.fix_dupes": "Fix Duplicate Files", - "fix_dupes.load_file": "Load DupeGuru File", - "fix_dupes.mirror_description": "Mirror the Entry data across each duplicate match set, combining all data while not removing or duplicating fields. This operation will not delete any files or data.", - "fix_dupes.mirror_entries": "Mirror Entries", - "fix_dupes.name_filter": "DupeGuru Files (*.dupeguru)", - "fix_dupes.no_file_match": "Duplicate File Matches: N/A", - "fix_dupes.no_file_selected": "No DupeGuru File Selected", - "fix_dupes.number_file_match": "Duplicate File Matches: %{count}", - "fix_dupes.open_result_files": "Open DupeGuru Results File", - "fix_unlinked.delete_unlinked": "Delete Unlinked Entries", - "fix_unlinked.description": "Each library entry is linked to a file in one of your directories. If a file linked to an entry is moved or deleted outside of TagStudio, it is then considered unlinked. Unlinked entries may be automatically relinked via searching your directories, manually relinked by the user, or deleted if desired.", - "fix_unlinked.duplicate_description": "Duplicate entries are defined as multiple entries which point to the same file on disk. Merging these will combine the tags and metadata from all duplicates into a single consolidated entry. These are not to be confused with \"duplicate files\", which are duplicates of your files themselves outside of TagStudio.", - "fix_unlinked.fix_unlinked": "Fix Unlinked Entries", - "fix_unlinked.manual_relink": "Manual Relink", - "fix_unlinked.merge_dupes": "Merge Duplicate Entries", - "fix_unlinked.refresh_dupes": "Refresh Duplicate Entries", - "fix_unlinked.scan_library.label": "Scanning Library for Unlinked Entries...", - "fix_unlinked.scan_library.title": "Scanning Library", - "fix_unlinked.search_and_relink": "Search and Relink", - "folders_to_tags.description": "Creates tags based on your folder structure and applies them to your entries.\n The structure below shows all the tags that will be created and what entries they will be applied to.", - "folders_to_tags.title": "Create Tags From Folders", - "generic.add": "Add", - "generic.aliases": "Aliases", - "generic.apply": "Apply", - "generic.cancel": "Cancel", - "generic.close_all": "Close All", - "generic.color": "Color", - "generic.delete": "Delete", - "generic.done": "Done", - "generic.exclude": "Exclude", - "generic.file_extension": "File Extensions", - "generic.include": "Include", - "generic.mirror": "Mirror", - "generic.name": "Name", - "generic.open_all": "Open All", - "generic.open_file_explorer": "Open file in explorer", - "generic.open_file": "Open file", - "generic.refresh_all": "Refresh All", - "generic.remove_field": "Remove Field", - "generic.search_tags": "Search Tags", - "generic.shorthand": "Shorthand", - "home.include_all_tags": "And (Includes All Tags)", - "home.include_any_tag": "Or (Includes Any Tag)", - "home.main_window": "Main Window", - "home.pre_release": "Pre-Release", - "home.search_entries": "Search Entries", - "home.search": "Search", - "home.thumbnail_size": "Thumbnail Size", - "landing.open_button": "Open/Create Library %{open_shortcut_text}", - "library.anthology": "Anthology", - "library.archived": "Date Archived", - "library.Artist": "Artist", - "library.author": "Author", - "library.book": "Book", - "library.collation": "Collation", - "library.comic": "Comic", - "library.comments": "Comments", - "library.composer": "Composer", - "library.content_tags": "Content Tags", - "library.date_created": "Date Created", - "library.date_modified": "Date Modified", - "library.date_published": "Date Published", - "library.date_released": "Date Released", - "library.date_taken": "Date Taken", - "library.date_uploaded": "Date Uploaded", - "library.date": "Date", - "library.description": "Description", - "library.favorite": "Favorite", - "library.guest_artist": "Guest Artist", - "library.magazine": "Magazine", - "library.manga": "Manga", - "library.meta_tags": "Meta Tags", - "library.notes": "Notes", - "library.publisher": "Publisher", - "library.series": "Series", - "library.source": "Source", - "library.tags": "Tags", - "library.title": "Title", - "library.url": "URL", - "library.volume": "Volume", - "menu.edit": "Edit", - "menu.file": "File", - "menu.help": "Help", - "menu.macros": "Macros", - "menu.tools": "Tools", - "menu.window": "Window", - "merge.merge_dupe_entries": "Merging Duplicate Entries", - "merge.window_title": "Merging Duplicate Entries", - "mirror_entities.are_you_sure": "Are you sure you want to mirror the following %{len(self.lib.dupe_files)} Entries?", - "mirror_entities.label": "Mirroring 1/%{count} Entries...", - "mirror_entities.title": "Mirroring Entries", - "open_library.library_creation_return_code": "Library Creation Return Code:", - "open_library.no_tagstudio_library_found": "No existing TagStudio library found at '%{path}'. Creating one.", - "open_library.title": "Library", - "preview_panel.confirm_remove": "Are you sure you want to remove this \"%{self.lib.get_field_attr(field, \"name\")}\" field?", - "preview_panel.edit_name": "Edit", - "preview_panel.missing_location": "Location is missing", - "preview_panel.mixed_data": "Mixed Data", - "preview_panel.no_items_selected": "No Items Selected", - "preview_panel.unknown_field_type": "Unknown Field Type", - "preview.dimensions": "Dimensions", - "preview.recent": "Recent Libraries", - "progression.running_macros.new_entries": "Running Macros on New Entries", - "progression.running_macros.one_new_entry": "Running Configured Macros on 1/%{len(new_ids)} New Entries", - "progression.running_macros.several_new_entry": "Running Configured Macros on %{x + 1}/%{len(new_ids)} New Entries", - "relink_unlinked.attempt_relink": "Attempting to Relink %{x[0]+1}/%{len(self.lib.missing_files)} Entries, %{self.fixed} Successfully Relinked", - "relink_unlinked.title": "Relinking Entries", - "splash.open_library": "Opening Library", - "status.backup_success": "Library Backup Saved at:", - "status.number_results_found": "%{len(all_items)} Results Found for \"%{query}\" (%{format_timespan(end_time - start_time)})", - "status.results_found": "Results", - "status.save_success": "Library Saved and Closed!", - "status.search_library_query": "Searching Library for", - "tag.add_search": "Add to Search", - "tag.add": "Add Tag", - "tag.library": "Library Tags", - "tag.new": "New Tag", - "tag.search_for_tag": "Search for Tag" -} + "home.base_title": "TagStudio Alpha", + "home.main_window": "Main Window", + "home.include_all_tags": "And (Includes All Tags)", + "home.include_any_tag": "Or (Includes Any Tag)", + "home.thumbnail_size": "Thumbnail Size", + "home.search_entries": "Search Entries", + "home.search": "Search", + "menu.file": "File", + "menu.edit": "Edit", + "menu.tools": "Tools", + "menu.macros": "Macros", + "menu.window": "Window", + "menu.help": "Help", + "tag.new": "New Tag", + "tag.add": "Add Tag", + "tag.library": "Library Tags", + "merge.window_title": "Merging Duplicate Entries", + "merge.merge_dupe_entries": "Merging Duplicate Entries", + "preview.dimensions": "Dimensions", + "preview.recent": "Recent Libraries", + "library.title": "Title", + "library.author": "Author", + "library.Artist": "Artist", + "library.url": "URL", + "library.description": "Description", + "library.notes": "Notes", + "library.tags": "Tags", + "library.content_tags": "Content Tags", + "library.meta_tags": "Meta Tags", + "library.collation": "Collation", + "library.date": "Date", + "library.date_created": "Date Created", + "library.date_modified": "Date Modified", + "library.date_taken": "Date Taken", + "library.date_published": "Date Published", + "library.archived": "Date Archived", + "library.favorite": "Favorite", + "library.book": "Book", + "library.comic": "Comic", + "library.series": "Series", + "library.manga": "Manga", + "library.source": "Source", + "library.date_uploaded": "Date Uploaded", + "library.date_released": "Date Released", + "library.volume": "Volume", + "library.anthology": "Anthology", + "library.magazine": "Magazine", + "library.publisher": "Publisher", + "library.guest_artist": "Guest Artist", + "library.composer": "Composer", + "library.comments": "Comments", + "open_library.no_tagstudio_library_found": "No existing TagStudio library found at '%{path}'. Creating one.", + "open_library.library_creation_return_code": "Library Creation Return Code:", + "open_library.title": "Library", + "dialog.open_create_library": "Open/Create Library", + "splash.open_library": "Opening Library", + "status.save_success": "Library Saved and Closed!", + "status.backup_success": "Library Backup Saved at:", + "status.search_library_query": "Searching Library for", + "status.enumerate_query": "Query:%{query}, Frame: %{i}, Length: %{len(f)}", + "status.number_results_found": "%{len(all_items)} Results Found for \"%{query}\" (%{format_timespan(end_time - start_time)})", + "status.results_found": "Results", + "dialog.save_library": "Save Library", + "dialog.refresh_directories": "Refreshing Directories", + "dialog.scan_directories": "Scanning Directories for New Files...\nPreparing...", + "dialog.scan_directories.new_files": "Scanning Directories for New Files...\n%{x + 1} File%{\"s\" if x + 1 != 1 else \"\"} Searched, %{len(self.lib.files_not_in_library)} New Files Found", + "tooltip.open_library": "Ctrl+O", + "tooltip.save_library": "Ctrl+S", + "progression.running_macros.new_entries": "Running Macros on New Entries", + "progression.running_macros.one_new_entry": "Running Configured Macros on 1/%{len(new_ids)} New Entries", + "progression.running_macros.several_new_entry": "Running Configured Macros on %{x + 1}/%{len(new_ids)} New Entries", + "file_opener.open_file": "Opening file:}", + "file_opener.not_found": "File not found:", + "file_opener.command_not_found": "Could not find %{command_name} on system PATH", + "add_field.add": "Add Field", + "generic.remove_field": "Remove Field", + "generic.file_extension": "File Extensions", + "generic.open_file": "Open file", + "generic.open_file_explorer": "Open file in explorer", + "generic.cancel": "Cancel", + "generic.add": "Add", + "generic.name": "Name", + "generic.shorthand": "Shorthand", + "generic.aliases": "Aliases", + "generic.color": "Color", + "generic.delete": "Delete", + "generic.exclude": "Exclude", + "generic.include": "Include", + "generic.done": "Done", + "generic.open_all": "Open All", + "generic.close_all": "Close All", + "generic.refresh_all": "Refresh_All", + "generic.apply": "Apply", + "generic.mirror": "Mirror", + "generic.search_tags": "Search Tags", + "build_tags.parent_tags": "Parent Tags", + "build_tags.add_parent_tags": "Add Parent Tags", + "delete_unlinked.delete_unlinked": "Delete Unlinked Entries", + "delete_unlinked.confirm": "Are you sure you want to delete the following %{len(self.lib.missing_files)} entries?", + "delete_unlinked.delete_entries": "Deleting Entries", + "delete_unlinked.deleting_number_entries": "Deleting %{x[0]+1}/{len(self.lib.missing_files)} Unlinked Entries", + "file_extension.add_extension": "Add Extension", + "file_extension.list_mode": "List Mode:", + "fix_dupes.fix_dupes": "Fix Duplicate Files", + "fix_dupes.no_file_selected": "No DupeGuru File Selected", + "fix_dupes.load_file": "Load DupeGuru File", + "fix_dupes.mirror_entries": "Mirror Entries", + "fix_dupes.mirror_description": "Mirror the Entry data across each duplicate match set, combining all data while not removing or duplicating fields. This operation will not delete any files or data.", + "fix_dupes.advice_label": "After mirroring, you're free to use DupeGuru to delete the unwanted files. Afterwards, use TagStudio's \"Fix Unlinked Entries\" feature in the Tools menu in order to delete the unlinked Entries.", + "fix_dupes.open_result_files": "Open DupeGuru Results File", + "fix_dupes.name_filter": "DupeGuru Files (*.dupeguru)", + "fix_dupes.no_file_match": "Duplicate File Matches: N/A", + "fix_dupes.number_file_match": "Duplicate File Matches: %{count}", + "fix_unlinked.fix_unlinked": "Fix Unlinked Entries", + "fix_unlinked.description": "Each library entry is linked to a file in one of your directories. If a file linked to an entry is moved or deleted outside of TagStudio, it is then considered unlinked. Unlinked entries may be automatically relinked via searching your directories, manually relinked by the user, or deleted if desired.", + "fix_unlinked.duplicate_description": "Duplicate entries are defined as multiple entries which point to the same file on disk. Merging these will combine the tags and metadata from all duplicates into a single consolidated entry. These are not to be confused with \"duplicate files\", which are duplicates of your files themselves outside of TagStudio.", + "fix_unlinked.search_and_relink": "Search && Relink", + "fix_unlinked.refresh_dupes": "Refresh Duplicate Entries", + "fix_unlinked.merge_dupes": "Merge Duplicate Entries", + "fix_unlinked.manual_relink": "Manual Relink", + "fix_unlinked.delete_unlinked": "Delete Unlinked Entries", + "fix_unlinked.scan_library.title": "Scanning Library", + "fix_unlinked.scan_library.label": "Scanning Library for Unlinked Entries...", + "folders_to_tags.folders_to_tags": "Converting folders to Tags", + "folders_to_tags.title": "Create Tags From Folders", + "folders_to_tags.description": "Creates tags based on your folder structure and applies them to your entries.\n The structure below shows all the tags that will be created and what entries they will be applied to.", + "mirror_entities.are_you_sure": "Are you sure you want to mirror the following %{len(self.lib.dupe_files)} Entries?", + "mirror_entities.title": "Mirroring Entries", + "mirror_entities.label": "Mirroring 1/%{count} Entries...", + "relink_unlinked.title": "Relinking Entries", + "relink_unlinked.attempt_relink": "Attempting to Relink %{x[0]+1}/%{len(self.lib.missing_files)} Entries, %{self.fixed} Successfully Relinked", + "landing.open_button": "Open/Create Library %{open_shortcut_text}", + "preview_panel.missing_location": "Location is missing", + "preview_panel.update_widgets": "[ENTRY PANEL] UPDATE WIDGETS (%{self.driver.selected})", + "preview_panel.no_items_selected": "No Items Selected", + "preview_panel.confirm_remove": "Are you sure you want to remove this \"%{self.lib.get_field_attr(field, \"name\")}\" field?", + "preview_panel.mixed_data": "Mixed Data", + "preview_panel.edit_name": "Edit", + "preview_panel.unknown_field_type": "Unknown Field Type", + "tag.search_for_tag": "Search for Tag", + "tag.add_search": "Add to Search", + "text_line_edit.unknown_event_type": "unknown event type: %{event}" +} \ No newline at end of file diff --git a/tagstudio/resources/translations/es.json b/tagstudio/resources/translations/es.json deleted file mode 100644 index 92df9068..00000000 --- a/tagstudio/resources/translations/es.json +++ /dev/null @@ -1,137 +0,0 @@ -{ - "add_field.add": "Añadir campo", - "build_tags.add_parent_tags": "Añadir etiquetas principales", - "build_tags.parent_tags": "Etiquetas principales", - "delete_unlinked.confirm": "¿Está seguro de que desea eliminar las siguientes %{len(self.lib.missing_files)} entradas?", - "delete_unlinked.delete_entries": "Eliminando entradas", - "delete_unlinked.delete_unlinked": "Eliminar entradas no vinculadas", - "delete_unlinked.deleting_number_entries": "Eliminando %{x[0]+1}/{len(self.lib.missing_files)} entradas no vinculadas", - "dialog.open_create_library": "Abrir/Crear biblioteca", - "dialog.refresh_directories": "Refrescar directorios", - "dialog.save_library": "Guardar la biblioteca", - "dialog.scan_directories.new_files": "Buscando archivos nuevos en los directorios...\n%{x + 1} Archivo%{\"s\" if x + 1 != 1 else \"\"} Buscado, %{len(self.lib.files_not_in_library)} Archivos nuevos encontrados", - "dialog.scan_directories": "Buscar archivos nuevos en los directorios...\nPreparando...", - "file_extension.add_extension": "Añadir extensión", - "file_extension.list_mode": "Modo de lista:", - "file_opener.command_not_found": "No se pudo encontrar %{command_name} en el PATH del sistema", - "file_opener.not_found": "Archivo no encontrado:", - "file_opener.open_file": "Abriendo archivo :", - "fix_dupes.advice_label": "Después de la duplicación, puede utilizar DupeGuru para eliminar los archivos no deseados. Luego, utilice la función \"Reparar entradas no vinculadas\" de TagStudio en el menú Herramientas para eliminar las entradas no vinculadas.", - "fix_dupes.fix_dupes": "Reparar archivos duplicados", - "fix_dupes.load_file": "Cargar archivo DupeGuru", - "fix_dupes.mirror_description": "Reflejar los datos de entrada en cada conjunto de coincidencias duplicadas, combinando todos los datos sin eliminar ni duplicar campos. Esta operación no eliminará ningún archivos ni dato.", - "fix_dupes.mirror_entries": "Reflejar entradas", - "fix_dupes.name_filter": "Archivos DupeGuru (*.dupeguru)", - "fix_dupes.no_file_match": "Coincidencias de archivos duplicados: N/D", - "fix_dupes.no_file_selected": "No se ha seleccionado ningún archivo DupeGuru", - "fix_dupes.number_file_match": "Coincidencias de archivos duplicados: %{count}", - "fix_dupes.open_result_files": "Abrir el archivo de resultados de DupeGuru", - "fix_unlinked.delete_unlinked": "Borrar entradas no vinculadas", - "fix_unlinked.description": "Cada entrada de la biblioteca está vinculada a un archivo en uno de sus directorios. Si un archivo vinculado a una entrada se mueve o se elimina fuera de TagStudio, se considerará desvinculado. Las entradas no vinculadas se pueden volver a vincular automáticamente mediante una búsqueda en sus directorios, el usuario puede volver a vincularlas manualmente o eliminarlas si así lo desea.", - "fix_unlinked.duplicate_description": "Las entradas duplicadas se definen como múltiples entradas que apuntan al mismo archivo en el disco. Al fusionarlas, se combinarán las etiquetas y los metadatos de todos los duplicados en una única entrada consolidada. No deben confundirse con los \"archivos duplicados\", que son duplicados de sus archivos fuera de TagStudio.", - "fix_unlinked.fix_unlinked": "Corregir entradas no vinculadas", - "fix_unlinked.manual_relink": "Reenlace manual", - "fix_unlinked.merge_dupes": "Fusionar entradas duplicadas", - "fix_unlinked.refresh_dupes": "Recargar entradas duplicadas", - "fix_unlinked.scan_library.label": "Buscando entradas no enlazadas en la biblioteca...", - "fix_unlinked.scan_library.title": "Escaneando la biblioteca", - "fix_unlinked.search_and_relink": "Buscar y volver a vincular", - "folders_to_tags.description": "Crea etiquetas basadas en su estructura de carpetas y las aplica a sus entradas.\n La siguiente estructura muestra todas las etiquetas que se crearán y a qué entradas se aplicarán.", - "folders_to_tags.title": "Crear etiquetas a partir de carpetas", - "generic.add": "Añadir", - "generic.aliases": "Alias", - "generic.apply": "Aplicar", - "generic.cancel": "Cancelar", - "generic.close_all": "Cerrar todo", - "generic.color": "Color", - "generic.delete": "Borrar", - "generic.done": "Donar", - "generic.exclude": "Excluir", - "generic.file_extension": "Extensiones del archivo", - "generic.include": "Incluir", - "generic.mirror": "Espejo", - "generic.name": "Nombre", - "generic.open_all": "Abrir todo", - "generic.open_file_explorer": "Abrir archivo en el explorador", - "generic.open_file": "Abrir archivo", - "generic.refresh_all": "Recargar todo", - "generic.remove_field": "Eliminar campo", - "generic.search_tags": "Buscar etiquetas", - "generic.shorthand": "Taquigrafía", - "home.include_all_tags": "Y (Incluye todas las etiquetas)", - "home.include_any_tag": "O (Incluye cualquier etiqueta)", - "home.main_window": "Ventana principal", - "home.search_entries": "Buscar entradas", - "home.search": "Buscar", - "home.thumbnail_size": "Tamaño de la miniatura", - "landing.open_button": "Abrir/Crear biblioteca %{open_shortcut_text}", - "library.anthology": "Antología", - "library.archived": "Fecha de archivo", - "library.Artist": "Artista", - "library.author": "Autor", - "library.book": "Libro", - "library.collation": "Recopilación", - "library.comic": "Tebeo", - "library.comments": "Comentarios", - "library.composer": "Compositor", - "library.content_tags": "Etiquetas del contenido", - "library.date_created": "Fecha de creación", - "library.date_modified": "Fecha de modificación", - "library.date_published": "Fecha de publicación", - "library.date_released": "Fecha de lanzamiento", - "library.date_taken": "Fecha de realización", - "library.date_uploaded": "Fecha de carga", - "library.date": "Fecha", - "library.description": "Descripción", - "library.favorite": "Favorito", - "library.guest_artist": "Artista invitado", - "library.magazine": "Revista", - "library.manga": "Manga", - "library.meta_tags": "Etiquetas de metadatos", - "library.notes": "Notas", - "library.publisher": "Editor", - "library.series": "Series", - "library.source": "Fuente", - "library.tags": "Etiquetas", - "library.title": "Título", - "library.url": "URL", - "library.volume": "Volumen", - "menu.edit": "Editar", - "menu.file": "Archivo", - "menu.help": "Ayuda", - "menu.macros": "Macro", - "menu.tools": "Herramientas", - "menu.window": "Ventana", - "merge.merge_dupe_entries": "Fusionando entradas duplicadas", - "merge.window_title": "Fusionando entradas duplicadas", - "mirror_entities.are_you_sure": "¿Estás seguro de que quieres reflejar las siguientes %{len(self.lib.dupe_files)} entradas?", - "mirror_entities.label": "Reflejando 1/%{count} Entradas...", - "mirror_entities.title": "Entradas reflejadas", - "open_library.library_creation_return_code": "Código de retorno de creación de biblioteca:", - "open_library.no_tagstudio_library_found": "No se encontró ninguna biblioteca TagStudio existente en '%{path}'. Se está creando una.", - "open_library.title": "Biblioteca", - "preview_panel.confirm_remove": "¿Está seguro de que desea eliminar este campo \"%{self.lib.get_field_attr(field, \"name\")}\"?", - "preview_panel.edit_name": "Editar", - "preview_panel.missing_location": "Falta la ubicación", - "preview_panel.mixed_data": "Datos variados", - "preview_panel.no_items_selected": "No hay elementos seleccionados", - "preview_panel.unknown_field_type": "Tipo de campo desconocido", - "preview.dimensions": "Dimensiones", - "preview.recent": "Bibliotecas recientes", - "progression.running_macros.new_entries": "Ejecución de macros en entradas nuevas", - "progression.running_macros.one_new_entry": "Ejecución de macros configurados en 1/%{len(new_ids)} entradas nuevas", - "progression.running_macros.several_new_entry": "Ejecución de macros configurados en %{x + 1}/%{len(new_ids)} entradas nuevas", - "relink_unlinked.attempt_relink": "Intentando volver a vincular %{x[0]+1}/%{len(self.lib.missing_files)} Entradas, %{self.fixed} Reenlazado correctamente", - "relink_unlinked.title": "Volver a vincular las entradas", - "splash.open_library": "Abriendo la biblioteca", - "status.backup_success": "Copia de seguridad de la biblioteca guardada en:", - "status.number_results_found": "%{len(all_items)} Resultados encontrados para \"%{query}\" (%{format_timespan(end_time - start_time)})", - "status.results_found": "Resultados", - "status.save_success": "¡Biblioteca guardada y cerrada!", - "status.search_library_query": "Buscando en la biblioteca", - "tag.add_search": "Añadir a la búsqueda", - "tag.add": "Añadir etiqueta", - "tag.library": "Etiquetas de la biblioteca", - "tag.new": "Nueva etiqueta", - "tag.search_for_tag": "Buscar por etiqueta" -} diff --git a/tagstudio/resources/translations/fr.json b/tagstudio/resources/translations/fr.json deleted file mode 100644 index 77702734..00000000 --- a/tagstudio/resources/translations/fr.json +++ /dev/null @@ -1,137 +0,0 @@ -{ - "add_field.add": "Ajouter un Champ", - "build_tags.add_parent_tags": "Ajouter des Labels Parents", - "build_tags.parent_tags": "Labels Parent", - "delete_unlinked.confirm": "Êtes-vous sûr de vouloir supprimer les entrées suivantes : %{len(self.lib.missing_files)} ?", - "delete_unlinked.delete_entries": "Suppression des Entrées", - "delete_unlinked.delete_unlinked": "Supprimer les Entrées non Liées", - "delete_unlinked.deleting_number_entries": "Suppressiuon des Entrées non Liées %{x[0]+1}/{len(self.lib.missing_files)}", - "dialog.open_create_library": "Ouvrir/Créer une Bibliothèque", - "dialog.refresh_directories": "Rafraichissement des Dossiers", - "dialog.save_library": "Sauvegarder la Bibliothèque", - "dialog.scan_directories.new_files": "Recherche de Nouveaux Fichiers dans les Dossiers...\n%{x + 1} Fichiers%{\"s\" if x + 1 != 1 else \"\"} Recherchés, %{len(self.lib.files_not_in_library)} Nouveaux Fichiers Trouvés", - "dialog.scan_directories": "Recherche de Nouveaux Fichiers dans les Dossiers...\nPréparation...", - "file_extension.add_extension": "Ajouter une Extension", - "file_extension.list_mode": "Mode Liste :", - "file_opener.command_not_found": "Impossible de trouver %{command_name} dans le CHEMIN système", - "file_opener.not_found": "Fichier non trouvé:", - "file_opener.open_file": "Ouverture du Fichier:", - "fix_dupes.advice_label": "Après réplication, vous êtes libre d'utiliser DupeGuru pour supprimer des fichiers non désirés. Ensuite, utilisez la fonctionnalité \"Réparation des Entrées non Liées\" de TagStudio dans le menu Outils pour supprimer les Entrées non liées.", - "fix_dupes.fix_dupes": "Réparer les Fichiers en Double", - "fix_dupes.load_file": "Charger un Fichier DupeGuru", - "fix_dupes.mirror_description": "Repliquer les données d'entrée dans chaque jeu de correspondances en double, en combinant toutes les données sans supprimer ni dupliquer de champs. Cette opération ne supprime aucun fichier ni aucune donnée.", - "fix_dupes.mirror_entries": "Répliquer les Entrées", - "fix_dupes.name_filter": "Fichiers DupeGuru (*.dupeguru)", - "fix_dupes.no_file_match": "Dupliquer les Correspondances de Fichier : N/A", - "fix_dupes.no_file_selected": "Aucun Fichier DupeGuru Sélectionné", - "fix_dupes.number_file_match": "Dupliquer les Correspondances de Fichier : %{count}", - "fix_dupes.open_result_files": "Ouvrire les Fichiers de Résultats de DupeGuru", - "fix_unlinked.delete_unlinked": "Supprimer les Entrées non Liées", - "fix_unlinked.description": "Chaque entrée dans la bibliothèque est liée à un fichier dans l'un de vos dossiers. Si un fichier lié à une entrée est déplacé ou supprimé en dehors de TagStudio, il est alors considéré non lié. Les entrées non liées peuvent être automatiquement reliées via la recherche dans vos dossiers, reliées manuellement par l'utilisateur, ou supprimées si désiré.", - "fix_unlinked.duplicate_description": "Les entrées dupliquées sont définies comme des entrées multiple qui pointent vers le même fichier sur le disque. Les fusionner va combiner les labels et metadatas de tous les duplicatas vers une seule entrée consolidée. Elles ne doivent pas être confondues avec les \"fichiers en doublon\", qui sont des doublons de vos fichiers en dehors de TagStudio.", - "fix_unlinked.fix_unlinked": "Réparation des Entrées non Liées", - "fix_unlinked.manual_relink": "Reliage Manuel", - "fix_unlinked.merge_dupes": "Fusionner les Entrées en Doublon", - "fix_unlinked.refresh_dupes": "Rafraichir les Entrées en Doublon", - "fix_unlinked.scan_library.label": "Balayage de la Bibliothèque pour trouver des Entrées non Liées...", - "fix_unlinked.scan_library.title": "Balayage de la Bibliothèque", - "fix_unlinked.search_and_relink": "Rechercher && Relier", - "folders_to_tags.description": "Créé des labels basés sur votre arborescence de dossier et les applique à vos entrées.\nLa structure ci-dessous affiche tous les labels qui seront créés et à quelles entrées ils seront appliqués.", - "folders_to_tags.title": "Créer un Label à partir d'un Dossier", - "generic.add": "Ajouter", - "generic.aliases": "Alias", - "generic.apply": "Appliquer", - "generic.cancel": "Annuler", - "generic.close_all": "Tout Fermer", - "generic.color": "Couleur", - "generic.delete": "Supprimer", - "generic.done": "Terminé", - "generic.exclude": "Exclure", - "generic.file_extension": "Extensions de Fichiers", - "generic.include": "Inclure", - "generic.mirror": "Refléter", - "generic.name": "Nom", - "generic.open_all": "Tout Ouvrir", - "generic.open_file_explorer": "Ouvrir un Fichier dans l'Explorateur", - "generic.open_file": "Ouvrir un Fichier", - "generic.refresh_all": "Tout Rafraichir", - "generic.remove_field": "Supprimer un Champ", - "generic.search_tags": "Rechercher les Labels", - "generic.shorthand": "Abrégé", - "home.include_all_tags": "Et (Inclus tous les Tags)", - "home.include_any_tag": "Ou (Inclure N'importe quel Label)", - "home.main_window": "Fenêtre Principale", - "home.search_entries": "Recherche", - "home.search": "Rechercher", - "home.thumbnail_size": "Taille de la miniature", - "landing.open_button": "Ouvrir/Créer une Bibliothèque %{open_shortcut_text}", - "library.anthology": "Anthologie", - "library.archived": "Date d'Archivage", - "library.Artist": "Artiste", - "library.author": "Auteur", - "library.book": "Livre", - "library.collation": "Collage", - "library.comic": "Bande Dessinée", - "library.comments": "Commentaires", - "library.composer": "Compositeur", - "library.content_tags": "Labels de Contenu", - "library.date_created": "Date de Création", - "library.date_modified": "Date de Modification", - "library.date_published": "Date de Publication", - "library.date_released": "Date de Sortie", - "library.date_taken": "Date de Capture", - "library.date_uploaded": "Date de Mise en Ligne", - "library.date": "Date", - "library.description": "Description", - "library.favorite": "Favori", - "library.guest_artist": "Artiste Invité", - "library.magazine": "Magazine", - "library.manga": "Manga", - "library.meta_tags": "Label Meta", - "library.notes": "Notes", - "library.publisher": "Éditeur", - "library.series": "Séries", - "library.source": "Source", - "library.tags": "Labels", - "library.title": "Titre", - "library.url": "URL", - "library.volume": "Volume", - "menu.edit": "Édition", - "menu.file": "Fichier", - "menu.help": "Aide", - "menu.macros": "Macros", - "menu.tools": "Outils", - "menu.window": "Fenêtre", - "merge.merge_dupe_entries": "Fusionner les duplicatas", - "merge.window_title": "Fusionner les duplicatas", - "mirror_entities.are_you_sure": "Êtes-vous sûr de vouloir répliquer les %{len(self.lib.dupe_files)} Entrées suivantes ?", - "mirror_entities.label": "Réplication de 1/%{count} Entrées...", - "mirror_entities.title": "Réplication des Entrées", - "open_library.library_creation_return_code": "Code de Création de bibliothèque:", - "open_library.no_tagstudio_library_found": "Aucune bibliothèque TagStudio trouvé au chemin '%{path}'. Création d'une bibliothèque.", - "open_library.title": "Bibliothèque", - "preview_panel.confirm_remove": "Êtes-vous sûr de vouloir supprimer le champ \"%{self.lib.get_field_attr(field, \"name\")}\" ?", - "preview_panel.edit_name": "Éditer", - "preview_panel.missing_location": "Emplacement Manquant", - "preview_panel.mixed_data": "Données Mélangées", - "preview_panel.no_items_selected": "Pas d'Objet Selectionné", - "preview_panel.unknown_field_type": "Type de Champ Inconnu", - "preview.dimensions": "Dimensions", - "preview.recent": "Bibliothèques Récentes", - "progression.running_macros.new_entries": "Exécution des Macros sur les Nouvelles Entrées", - "progression.running_macros.one_new_entry": "Éxecution des Macros Configurées sur 1/%{len(new_ids)} Nouvelles Entrées", - "progression.running_macros.several_new_entry": "Éxectution des Macros Configurées sur %{x + 1}/%{len(new_ids)} Nouvelles Entrées", - "relink_unlinked.attempt_relink": "Tentative de Reliage de %{x[0]+1}/%{len(self.lib.missing_files)} Entrées, %{self.fixed} ont été Reliées avec Succès", - "relink_unlinked.title": "Reliage des Entrées", - "splash.open_library": "Ouverture de Bilbliothèque", - "status.backup_success": "Chemin de la Sauvegarde de Bibliothèque :", - "status.number_results_found": "%{len(all_items)} Résultats Trouvés pour \"%{query}\" (%{format_timespan(end_time - start_time)})", - "status.results_found": "Résultats", - "status.save_success": "Bibliothèque Sauvegardée et Fermée !", - "status.search_library_query": "Recherche dans les Bibliothèque de", - "tag.add_search": "Ajouter à la Recherche", - "tag.add": "Ajouter un Label", - "tag.library": "Bibliothèque de Labels", - "tag.new": "Nouveau Label", - "tag.search_for_tag": "Recherche de Label" -} diff --git a/tagstudio/resources/translations/hu.json b/tagstudio/resources/translations/hu.json deleted file mode 100644 index a592488b..00000000 --- a/tagstudio/resources/translations/hu.json +++ /dev/null @@ -1,137 +0,0 @@ -{ - "add_field.add": "Új mező", - "build_tags.add_parent_tags": "Új szülőcímke", - "build_tags.parent_tags": "Szülőcímkék", - "delete_unlinked.confirm": "Biztosan törölni akarja az alábbi %{len(self.lib.missing_files)} elemet?", - "delete_unlinked.delete_entries": "Elemek törlése", - "delete_unlinked.delete_unlinked": "Kapcsolat nélküli elemek törlése", - "delete_unlinked.deleting_number_entries": "{len(self.lib.missing_files)}/%{x[0]+1}. kapcsolat nélküli elem törlése", - "dialog.open_create_library": "Könyvtár megnyitása/létrehozása", - "dialog.refresh_directories": "Mappák frissítése", - "dialog.save_library": "Könyvtár mentése", - "dialog.scan_directories.new_files": "Új fájlok keresése a mappákban…\n%{x + 1} fájl megvizsgálva; ebből %{len(self.lib.files_not_in_library)} új", - "dialog.scan_directories": "Új fájlok keresése a mappákban…\nElőkészítés…", - "file_extension.add_extension": "Kiterjesztés hozzáadása", - "file_extension.list_mode": "Listázott elemek módja:", - "file_opener.command_not_found": "A(z) „%{command_name}”-parancs nem szerepel a rendszer PATH-változójában.", - "file_opener.not_found": "Az alábbi fájl nem található:", - "file_opener.open_file": "Fájl megnyitása:", - "fix_dupes.advice_label": "A tükrözés befejezése után a DupeGuruval kitörölheti a nem kívánt fájlokat. Ezt követően, a TagStudio „Kapcsolat nélküli elemek javítása” funkciójával eltávolíthatja az árván maradt elemeket.", - "fix_dupes.fix_dupes": "Egyező fájlok egyesítése", - "fix_dupes.load_file": "DupeGuru fájl betöltése", - "fix_dupes.mirror_description": "Az összes adat átmásolása minden összetartozó fájl között, ezzel kiegészítve a hiányzó címkéket eltávolítás és duplikálás nélkül. Ez a folyamat nem fog adatokat vagy fájlokat törölni.", - "fix_dupes.mirror_entries": "Elemek tükrözése", - "fix_dupes.name_filter": "DupeGuru-fájlok (*.dupeguru)", - "fix_dupes.no_file_match": "Nincsenek egyező fájlok", - "fix_dupes.no_file_selected": "Nincs kiválasztott DupeGuru-fájl.", - "fix_dupes.number_file_match": "%{count} egyező fájl", - "fix_dupes.open_result_files": "DupeGuru-fájl megnyitása", - "fix_unlinked.delete_unlinked": "Kapcsolat nélküli elemek törlése", - "fix_unlinked.description": "A könyvtár minden eleme egy fájllal van összekapcsolva a számítógépen. Ha egy kapcsolt fájl a TagSudión kívül kerül áthelyezésre vagy törésre, akkor ez a kapcsolat megszakad. Ezeket a kapcsolat nélküli elemeket a program megpróbálhatja automatikusan megkeresni, de Ön is kézileg újra összekapcsolhatja vagy törölheti őket.", - "fix_unlinked.duplicate_description": "Ha több elem ugyanazzal a fájllal van összekapcsolva, akkor egyezőnek számítanak. Ha egyesíti őket, akkor egy olyan elem lesz létrehozva, ami az eredeti elemek összes adatát tartalmazza. Ezeket nem szabad összetéveszteni az „egyező fájlokkal”, amelyek a TagStudión kívüli azonos tartalmú fájlok.", - "fix_unlinked.fix_unlinked": "Kapcsolat nélküli elemek javítása", - "fix_unlinked.manual_relink": "Újra összekapcsolás kézileg", - "fix_unlinked.merge_dupes": "Egyező elemek egyesítése", - "fix_unlinked.refresh_dupes": "Egyező elemek frissítése", - "fix_unlinked.scan_library.label": "Kapcsolat nélküli elemek keresése a könyvtárban…", - "fix_unlinked.scan_library.title": "Könyvtár vizsgálata", - "fix_unlinked.search_and_relink": "Keresés és újra összekapcsolás", - "folders_to_tags.description": "Címkék automatikus létrehozása a létező mappastruktúra alapján.\nAz alábbi mappafán megtekintheti a létrehozandó címkéket, és hogy mely elemekre lesznek alkalmazva.", - "folders_to_tags.title": "Címkék létrehozása mappák alapján", - "generic.add": "Hozzáadás", - "generic.aliases": "Áljelek", - "generic.apply": "Alkalmaz", - "generic.cancel": "Mégse", - "generic.close_all": "Összes bezárása", - "generic.color": "Szín", - "generic.delete": "Törlés", - "generic.done": "Kész", - "generic.exclude": "Elrejtés", - "generic.file_extension": "Kiterjesztések", - "generic.include": "Mutatás", - "generic.mirror": "Tükrözés", - "generic.name": "Név", - "generic.open_all": "Összes megnyitása", - "generic.open_file_explorer": "Fájl megnyitása Intézőben", - "generic.open_file": "Fájl megnyitása", - "generic.refresh_all": "Összes frissítése", - "generic.remove_field": "Mező eltávolítása", - "generic.search_tags": "Címkék keresése", - "generic.shorthand": "Rövidítés", - "home.include_all_tags": "És (az összes keresett címkét tartalmazza)", - "home.include_any_tag": "Vagy (valamelyik keresett címkét tartalmazza)", - "home.main_window": "Fő ablak", - "home.search_entries": "Tételek keresése", - "home.search": "Keresés", - "home.thumbnail_size": "Indexkép mérete", - "landing.open_button": "Könyvtár megnyitása/létrehozása %{open_shortcut_text}", - "library.anthology": "Gyűjtemény", - "library.archived": "Archiválás dátuma", - "library.Artist": "Előadó", - "library.author": "Szerző", - "library.book": "Könyv", - "library.collation": "Rendezés", - "library.comic": "Képregény", - "library.comments": "Megjegyzés", - "library.composer": "Zeneszerző", - "library.content_tags": "Tartalomcímkék", - "library.date_created": "Létrehozás dátuma", - "library.date_modified": "Módosítás dátuma", - "library.date_published": "Közzététel dátuma", - "library.date_released": "Kiadás dátuma", - "library.date_taken": "Készítés dátuma", - "library.date_uploaded": "Feltöltés dátuma", - "library.date": "Dátum", - "library.description": "Leírás", - "library.favorite": "Kedvenc", - "library.guest_artist": "Társelőadó", - "library.magazine": "Magazin", - "library.manga": "Manga", - "library.meta_tags": "Metacímkék", - "library.notes": "Jegyzetek", - "library.publisher": "Kiadó", - "library.series": "Sorozat", - "library.source": "Forrás", - "library.tags": "Címkék", - "library.title": "Cím", - "library.url": "Hivatkozás", - "library.volume": "Kötet", - "menu.edit": "Szerkesztés", - "menu.file": "Fájl", - "menu.help": "Súgó", - "menu.macros": "Makrók", - "menu.tools": "Eszközök", - "menu.window": "Ablak", - "merge.merge_dupe_entries": "Egyező elemek egyesítése", - "merge.window_title": "Egyező elemek egyesítése", - "mirror_entities.are_you_sure": "Biztosan tükrözni akarja az alábbi adatokat %{len(self.lib.dupe_files)} különböző elemre?", - "mirror_entities.label": "%{count}/1 elem tükrözése folyamatban…", - "mirror_entities.title": "Elemek tükrözése", - "open_library.library_creation_return_code": "A könyvtárlétrehozási folyamat visszatérési kódja:", - "open_library.no_tagstudio_library_found": "A program nem talált létező TagStudio-könyvtárat az alábbi elérési úton: „%{path}”. Ezen a helyen egy új könyvtár lesz létrehozva.", - "open_library.title": "Könyvtár", - "preview_panel.confirm_remove": "Biztosan el akarja távolítani a(z) „%{self.lib.get_field_attr(field, \"name\")}”-mezőt?", - "preview_panel.edit_name": "Szerkesztés", - "preview_panel.missing_location": "Hiányzó hely", - "preview_panel.mixed_data": "Kevert adatok", - "preview_panel.no_items_selected": "Nincs kijelölt elem", - "preview_panel.unknown_field_type": "Ismeretlen mezőtípus", - "preview.dimensions": "Méret", - "preview.recent": "Legutóbbi könytárak", - "progression.running_macros.new_entries": "Makrók futtatása az új elemeken", - "progression.running_macros.one_new_entry": "Korábban beállított makrók futtatása %{len(new_ids)}/1 új elemen", - "progression.running_macros.several_new_entry": "Korábban beállított makrók futtatása %{len(new_ids)}/%{x + 1} új elemen", - "relink_unlinked.attempt_relink": "%{len(self.lib.missing_files)}/%{x[0]+1} elem újra összekapcsolásának megkísérlése; %{self.fixed} elem sikeresen újra összekapcsolva", - "relink_unlinked.title": "Elemek újra összekapcsolása", - "splash.open_library": "Könyvtár megnyitása", - "status.backup_success": "A biztonsági mentés létrehozása megtörtént az alábbi elérési úton:", - "status.number_results_found": "%{len(all_items)} találat az alábbi kifejezésre: „%{query}” (%{format_timespan(end_time - start_time)})", - "status.results_found": "találat", - "status.save_success": "A könyvtár mentése és bezárása sikeresen megtörtént.", - "status.search_library_query": "Az alábbi kifejezés keresése a könyvtárban:", - "tag.add_search": "Keresési kifejezés kiegészítése", - "tag.add": "Címke hozzáadása", - "tag.library": "Könyvtárcímkék", - "tag.new": "Új címke", - "tag.search_for_tag": "Címke keresése" -} diff --git a/tagstudio/resources/translations/it.json b/tagstudio/resources/translations/it.json deleted file mode 100644 index 309319d2..00000000 --- a/tagstudio/resources/translations/it.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "generic.add": "Aggiungi", - "generic.cancel": "Annulla", - "generic.color": "Colore", - "generic.delete": "Elimina", - "generic.name": "Nome", - "home.main_window": "Finestra principale", - "home.search": "Cerca", - "library.Artist": "Artista", - "library.book": "Libro", - "library.description": "Descrizione", - "library.title": "Titolo", - "menu.file": "File", - "menu.window": "Finestra", - "preview.recent": "Librerias Recenti", - "tag.add": "Aggiungi Tag", - "tag.new": "Nuovo Tag" -} diff --git a/tagstudio/resources/translations/nb_NO.json b/tagstudio/resources/translations/nb_NO.json deleted file mode 100644 index 4d6fa4b2..00000000 --- a/tagstudio/resources/translations/nb_NO.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "home.main_window": "Hovedvindu", - "home.thumbnail_size": "Miniatyrbildestørrelse", - "home.search_entries": "Søk etter oppføringer", - "home.search": "Søk", - "tag.new": "Ny etikett", - "tag.add": "Legg til etikett", - "tag.library": "Biblioteksetiketter", - "merge.merge_dupe_entries": "Fletter duplikatoppføringer …", - "preview.dimensions": "Dimensjoner", - "preview.recent": "Nylige bibliotek", - "library.url": "Nettadresse", - "library.description": "Beskrivelse", - "library.notes": "Notater", - "library.tags": "Etiketter", - "library.content_tags": "Innholdsetiketter", - "library.meta_tags": "Metaetiketter", - "library.date_published": "Publiseringsdato", - "library.archived": "Arkiveringsdato", - "library.date_uploaded": "Opplastingsdato", - "library.date_released": "Slippdato", - "library.comments": "Kommentarer", - "open_library.title": "Bibliotek", - "dialog.open_create_library": "Åpne/opprett bibliotek", - "library.guest_artist": "Gjesteartist", - "generic.add": "Legg til", - "generic.name": "Navn", - "generic.color": "Farge", - "generic.delete": "Slett", - "generic.done": "Ferdig", - "fix_dupes.fix_dupes": "Fiks duplikatfiler", - "fix_dupes.no_file_selected": "Ingen DupeGuru-fil valgt", - "fix_dupes.load_file": "Last inn DupeGuru-fil", - "fix_dupes.mirror_entries": "Speil oppføringer", - "preview_panel.edit_name": "Rediger", - "preview_panel.unknown_field_type": "Ukjent felttype", - "tag.search_for_tag": "Søk etter etikett", - "tag.add_search": "Legg til søk", - "menu.file": "Fil", - "menu.window": "Vindu", - "menu.edit": "Rediger", - "menu.macros": "Makroer", - "menu.tools": "Verktøy", - "library.magazine": "Magasin", - "menu.help": "Hjelp", - "library.date_modified": "Endringsdato", - "merge.window_title": "Fletter duplikatoppføringer …", - "library.manga": "Manga", - "library.source": "Kilde", - "tooltip.save_library": "Ctrl+S", - "library.date": "Dato", - "library.favorite": "Favoritt", - "library.comic": "Tegneserie", - "library.series": "Serie", - "library.date_created": "Dato opprettet", - "library.date_taken": "Dato knipset", - "library.book": "Bok", - "splash.open_library": "Åpner bibliotek …", - "preview_panel.no_items_selected": "Ingen elementer valgt", - "dialog.save_library": "Lagre bibliotek", - "tooltip.open_library": "Ctrl+O", - "generic.file_extension": "Filutvidelse", - "file_opener.not_found": "Fant ikke filen:", - "add_field.add": "Legg til felt", - "generic.remove_field": "Fjern felt", - "generic.include": "Inkluder", - "generic.open_file": "Åpne fil", - "generic.exclude": "Utelat", - "generic.open_file_explorer": "Åpne fil i utforsker", - "generic.cancel": "Avbryt", - "generic.open_all": "Åpne alle", - "generic.close_all": "Lukk alle", - "generic.mirror": "Speil", - "generic.refresh_all": "Gjenoppfrisk alle", - "generic.apply": "Bruk", - "generic.search_tags": "Søk etter etiketter", - "library.Artist": "Artist", - "library.publisher": "Utgiver", - "library.author": "Forfatter", - "status.save_success": "Bibliotek lagret og lukket.", - "status.backup_success": "Kopi av bibliotek lagret i:", - "status.search_library_query": "Søker i biblioteket etter", - "status.results_found": "Resultat", - "file_opener.open_file": "Åpner fil :", - "delete_unlinked.confirm": "Slett følgende %{len(self.lib.missing_files)} oppføringer?", - "delete_unlinked.delete_entries": "Sletting av oppføringer", - "file_extension.add_extension": "Legg til utvidelse", - "file_extension.list_mode": "Listemodus:", - "fix_dupes.name_filter": "DupeGuru-filer (*.dupeguru)", - "fix_unlinked.fix_unlinked": "Fiks ulenkede oppføringer", - "fix_dupes.open_result_files": "Åpne DupeGuru-resultatfil", - "fix_unlinked.scan_library.title": "Skanning av bibliotek", - "folders_to_tags.title": "Opprett etiketter fra mapper", - "preview_panel.mixed_data": "Blandet data", - "preview_panel.confirm_remove": "Fjern dette «%{self.lib.get_field_attr(field, \"name\")}»-feltet?", - "delete_unlinked.deleting_number_entries": "Sletter %{x[0]+1}/{len(self.lib.missing_files)} ulenkede oppføringer", - "fix_unlinked.scan_library.label": "Skanner bibliotek for ulenkede oppføringer …", - "preview_panel.missing_location": "Posisjon mangler", - "landing.open_button": "Åpne/opprett bibliotek %{open_shortcut_text}" -} diff --git a/tagstudio/resources/translations/pt.json b/tagstudio/resources/translations/pt.json deleted file mode 100644 index 0967ef42..00000000 --- a/tagstudio/resources/translations/pt.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/tagstudio/resources/translations/pt_BR.json b/tagstudio/resources/translations/pt_BR.json deleted file mode 100644 index a8255549..00000000 --- a/tagstudio/resources/translations/pt_BR.json +++ /dev/null @@ -1,137 +0,0 @@ -{ - "add_field.add": "Adicionar Campo", - "build_tags.add_parent_tags": "Adicionar Rótulo Pai", - "build_tags.parent_tags": "Rótulos Pai", - "delete_unlinked.confirm": "Tem certeza que deseja deletar as seguintes %{len(self.lib.missing_files)} entradas?", - "delete_unlinked.delete_entries": "Deletando Entradas", - "delete_unlinked.delete_unlinked": "Deletar Entradas Não Linkada", - "delete_unlinked.deleting_number_entries": "Deletando %{x[0]+1}/{len(self.lib.missing_files)} Entradas Não Linkadas", - "dialog.open_create_library": "Abrir/Criar Biblioteca", - "dialog.refresh_directories": "Atualizando Diretórios", - "dialog.save_library": "Salvar Biblioteca", - "dialog.scan_directories.new_files": "Escaneando Diretórios por Novos Arquivos...\n%{x + 1} Arquivo%{\"s\" if x + 1 != 1 else \"\"} Pesquisado%{\"s\" if x + 1 != 1 else \"\"}, %{len(self.lib.files_not_in_library)} Novo(s) Arquivo(s) Encontrado(s)", - "dialog.scan_directories": "Escaneando Diretórios por Novos Arquivos...\nPreparando...", - "file_extension.add_extension": "Adicionar Extensão", - "file_extension.list_mode": "Modo de Lista:", - "file_opener.command_not_found": "Não foi possível encontrar %{command_name} na PATH do sistema", - "file_opener.not_found": "Arquivo não encontrado:", - "file_opener.open_file": "Abrindo Arquivo:", - "fix_dupes.advice_label": "Após espelhagem, você estará livre para usar DupeGuru para deletar arquivos indesejados. Após, use a função \"Consertar Entradas Não Linkadas\" do TagStudio no menu de Ferramentas para deletar entradas não linkadas.", - "fix_dupes.fix_dupes": "Corrigir Arquivos Duplicados", - "fix_dupes.load_file": "Carregar Aquivo DupeGuru", - "fix_dupes.mirror_description": "Espelhe os ados de entrada em cada conjunto de correspondência duplicado, combinando todos os dados sem remover ou duplicar campos. Esta operação não excluirá nenhum arquivo ou dado.", - "fix_dupes.mirror_entries": "Entradas Espelhadas", - "fix_dupes.name_filter": "Arquivos DupeGuru (*.dupeguru)", - "fix_dupes.no_file_match": "Correspondências de Arquivos Duplicados: N/A", - "fix_dupes.no_file_selected": "Nenhum Arquivo DupeGuru Selecionado", - "fix_dupes.number_file_match": "Correspondências de Arquivos Duplicados: %{count}", - "fix_dupes.open_result_files": "Abrir Arquivo de Resultados do DupeGuru", - "fix_unlinked.delete_unlinked": "Escluir Entradas Não Linkadas", - "fix_unlinked.description": "Cada entrada na biblioteca está linkada a um arquivo em um dos seus diretórios. Se um arquivo linkado a uma entrada for movido ou deletado fora do TagStudio, ele é então considerado não linkado. Entradas não linkadas podem ser automaticamente re-linkadas por buscas nos seus diretórios, manualmente re-linkadas pelo usuário, ou deletada se for desejada.", - "fix_unlinked.duplicate_description": "Entradas duplicadas são definidas como multiplas entradas que levam ao mesmo arquivo no disco. Mergir essas entradas irá combinar as tags e metadados de todas as duplicatas em uma única entrada consolidada. Não confundir com \"Arquivos Duplicados\" que são duplicatas dos seus arquivos fora do TagStudio.", - "fix_unlinked.fix_unlinked": "Corrigir Entradas Não Linkadas", - "fix_unlinked.manual_relink": "Relink Manual", - "fix_unlinked.merge_dupes": "Mesclar Entradas Duplicadas", - "fix_unlinked.refresh_dupes": "Atualizar Entradas Duplicadas", - "fix_unlinked.scan_library.label": "Escaneando Bibliotecada para Entradas Não Linkadas...", - "fix_unlinked.scan_library.title": "Escaneando Biblioteca", - "fix_unlinked.search_and_relink": "Buscar && Relinkar", - "folders_to_tags.description": "Cria rótulos baseado na sua estrutura de arquivos e aplica elas nas suas entradas\nA estrutura abaixo mostra todos os rótulos que irão ser criados e a quais entradas eles serão aplicados.", - "folders_to_tags.title": "Criar rótulos a partir das pastas", - "generic.add": "Adicionar", - "generic.aliases": "Alias", - "generic.apply": "Aplicar", - "generic.cancel": "Cancelar", - "generic.close_all": "Fechar Tudo", - "generic.color": "Cor", - "generic.delete": "Deletar", - "generic.done": "Completo", - "generic.exclude": "Excluir", - "generic.file_extension": "Extensões de Arquivo", - "generic.include": "Incluir", - "generic.mirror": "Espelho", - "generic.name": "Nome", - "generic.open_all": "Abrir Tudo", - "generic.open_file_explorer": "Abrir no explorador de arquivos", - "generic.open_file": "Abrir arquivo", - "generic.refresh_all": "Atualizar_Tudo", - "generic.remove_field": "Remover Campo", - "generic.search_tags": "Buscar Rótulos", - "generic.shorthand": "Taquigrafia", - "home.include_all_tags": "E (Inclui todos os rótulos)", - "home.include_any_tag": "Ou (Inclui qualquer rótulo)", - "home.main_window": "Janela Principal", - "home.search_entries": "Buscar Entradas", - "home.search": "Buscar", - "home.thumbnail_size": "Tamanho de miniatura", - "landing.open_button": "Abrir/Criar Bliblioteca %{open_shortcut_text}", - "library.anthology": "Coletânea", - "library.archived": "Data de Arquivação", - "library.Artist": "Artista", - "library.author": "Autor", - "library.book": "Livro", - "library.collation": "Colagem", - "library.comic": "Quadrinho", - "library.comments": "Comentários", - "library.composer": "Compositor", - "library.content_tags": "Rótulos de conteúdo", - "library.date_created": "Data de Criação", - "library.date_modified": "Dada de Modificação", - "library.date_published": "Data de Publicação", - "library.date_released": "Data de Lançamento", - "library.date_taken": "Data de Criação", - "library.date_uploaded": "Data de Envio", - "library.date": "Data", - "library.description": "Descrição", - "library.favorite": "Favorito", - "library.guest_artist": "Artista Convidado", - "library.magazine": "Revista", - "library.manga": "Manga", - "library.meta_tags": "Meta Rótulos", - "library.notes": "Notas", - "library.publisher": "Editora", - "library.series": "Séries", - "library.source": "Fonte", - "library.tags": "Rótulos", - "library.title": "Título", - "library.url": "URL", - "library.volume": "Volume", - "menu.edit": "Editar", - "menu.file": "Arquivo", - "menu.help": "Ajuda", - "menu.macros": "Macros", - "menu.tools": "Ferramentas", - "menu.window": "Janela", - "merge.merge_dupe_entries": "Mesclando Entradas Duplicadas", - "merge.window_title": "Mesclando Entradas Duplicadas", - "mirror_entities.are_you_sure": "Tem certeza que você deseja espelhar os seguintes %{len(self.lib.dupe_files)} entradas?", - "mirror_entities.label": "Espelhando 1/%{count} Entradas...", - "mirror_entities.title": "Espelhando Entradas", - "open_library.library_creation_return_code": "Código de Retorno da Criação da Biblioteca:", - "open_library.no_tagstudio_library_found": "Nenhuma biblioteca do TagStudio existente foi encontrada em '%{path}'. Criando uma.", - "open_library.title": "Biblioteca", - "preview_panel.confirm_remove": "Você tem certeza de que quer remover o campo \"%{self.lib.get_field_attr(field, \"name\")}\"?", - "preview_panel.edit_name": "Editar", - "preview_panel.missing_location": "Localização Ausente", - "preview_panel.mixed_data": "Dados Mistos", - "preview_panel.no_items_selected": "Nenhum Item Selecionado", - "preview_panel.unknown_field_type": "Tipo de Campo Desconhecido", - "preview.dimensions": "Dimensões", - "preview.recent": "Bibliotecas recentes", - "progression.running_macros.new_entries": "Executando Macros nas Novas Entradas", - "progression.running_macros.one_new_entry": "Executando Macros Configurados em 1/%{len(new_ids)} Novas Entradas", - "progression.running_macros.several_new_entry": "Executando Macros Configurados em %{x + 1}/%{len(new_ids)} Novas Entradas", - "relink_unlinked.attempt_relink": "Tentando Relinkar %{x[0]+1}/%{len(self.lib.missing_files)} Entradas, %{self.fixed} Relinkadas com Sucesso", - "relink_unlinked.title": "Relinkando Entradas", - "splash.open_library": "Abrindo Biblioteca", - "status.backup_success": "Backup da Biblioteca Salvo em:", - "status.number_results_found": "%{len(all_items)} Resultados Encontrados para \"%{query}\" (%{format_timespan(end_time - start_time)})", - "status.results_found": "Resultados", - "status.save_success": "Biblioteca Salva e Fechada!", - "status.search_library_query": "Procurando na Biblioteca por", - "tag.add_search": "Adicionar a Pesquisa", - "tag.add": "Adicionar Rótulo", - "tag.library": "Rótulos da biblioteca", - "tag.new": "Novo Rótulo", - "tag.search_for_tag": "Procurar por Rótulo" -} diff --git a/tagstudio/resources/translations/ru.json b/tagstudio/resources/translations/ru.json deleted file mode 100644 index 1254adff..00000000 --- a/tagstudio/resources/translations/ru.json +++ /dev/null @@ -1,137 +0,0 @@ -{ - "add_field.add": "Добавить Категорию", - "build_tags.add_parent_tags": "Добавить Теги-родители", - "build_tags.parent_tags": "Теги-родители", - "delete_unlinked.confirm": "Вы уверены в том, что желаете удалить %{len(self.lib.missing_files)} записи?", - "delete_unlinked.delete_entries": "Удаление записей", - "delete_unlinked.delete_unlinked": "Удалить откреплённые записи", - "delete_unlinked.deleting_number_entries": "Удалено %{x[0]+1}/{len(self.lib.missing_files)} откреплённых записей", - "dialog.open_create_library": "Открыть/Создать Библиотеку", - "dialog.refresh_directories": "Обновление Каталога", - "dialog.save_library": "Сохранить Библиотеку", - "dialog.scan_directories.new_files": "Сканирование на наличие новых файлов...\n%{x + 1} File%{\"s\" if x + 1 != 1 else \"\"} Searched, %{len(self.lib.files_not_in_library)} Найдены новые файлы", - "dialog.scan_directories": "Сканирование каталога на наличие новых файлов...\nПодготовка...", - "file_extension.add_extension": "Добавить расширение", - "file_extension.list_mode": "Список режимов:", - "file_opener.command_not_found": "Не смог найти %{command_name} в системе PATH", - "file_opener.not_found": "Файл не найден:", - "file_opener.open_file": "Открытие файла:", - "fix_dupes.advice_label": "После отзеркаливания, вы можете использовать DupeGuru, чтобы удалить ненужные файлы. После этого, используйте функцию \"Исправить откреплённые записи\" внутри панели \"Инструменты\" TagStudio, чтобы удалить откреплённые записи.", - "fix_dupes.fix_dupes": "Исправить дубликаты", - "fix_dupes.load_file": "Загрузить файл DupeGuru", - "fix_dupes.mirror_description": "Отзеркалить данные записи внутри каждого указанного набора дубликатов, объединяя все данные внутри без удаления или дублирования категорий. Эта операция не удалит какие-либо файлы или данные.", - "fix_dupes.mirror_entries": "Отзеркалить записи", - "fix_dupes.name_filter": "Файлы DupeGuru (*.dupeguru)", - "fix_dupes.no_file_match": "Совпадение файлов дубликатов: N/A", - "fix_dupes.no_file_selected": "Файл DupeGuru не выбран", - "fix_dupes.number_file_match": "Совпадения файлов дубликатов: %{count}", - "fix_dupes.open_result_files": "Открыть файл результатов DupeGuru", - "fix_unlinked.delete_unlinked": "Удалить откреплённые записи", - "fix_unlinked.description": "Каждая запись в библиотеке привязана к файлу, находящегося внутри той или иной папки. Если файл, к которому была привязана запись, был удалён или перемещён без использования TagStudio, то запись становиться \"откреплённой\". Откреплённые записи могут быть прикреплены обратно через автоматический рескан, вручную прикреплены обратно пользователем, либо же удалены если в них нет надобности.", - "fix_unlinked.duplicate_description": "Записи-дубликаты это несколько записей, которые одновременно привязаны к одному файлу. Объединение таких дубликатов соединит все теги и мета данные из этих записей в одну. Записи-дубликаты не стоит путать с несколькими копиями самого файла, которые могут существовать вне TagStudio.", - "fix_unlinked.fix_unlinked": "Исправить откреплённые записи", - "fix_unlinked.manual_relink": "Ручная привязка", - "fix_unlinked.merge_dupes": "Объединить записи дубликаты", - "fix_unlinked.refresh_dupes": "Обновить записи дубликаты", - "fix_unlinked.scan_library.label": "Сканирование Библиотеки на наличие откреплённых записей...", - "fix_unlinked.scan_library.title": "Сканирование Библиотеки", - "fix_unlinked.search_and_relink": "Поиск и Привязка", - "folders_to_tags.description": "Создаёт теги для записей согласно имеющейся иерархии папок.\nВнизу указаны все теги, которые будут созданы, а также записи к которым они будут применены.", - "folders_to_tags.title": "Создать теги из папок", - "generic.add": "Добавить", - "generic.aliases": "Псевдонимы", - "generic.apply": "Применить", - "generic.cancel": "Отмена", - "generic.close_all": "Закрыть Всё", - "generic.color": "Цвет", - "generic.delete": "Удалить", - "generic.done": "Завершено", - "generic.exclude": "Исключить", - "generic.file_extension": "Расширения Файлов", - "generic.include": "Включить", - "generic.mirror": "Отзеркалить", - "generic.name": "Имя", - "generic.open_all": "Открыть Всё", - "generic.open_file_explorer": "Открыть файл в проводнике", - "generic.open_file": "Открыть файл", - "generic.refresh_all": "Обновить Всё", - "generic.remove_field": "Удалить Категорию", - "generic.search_tags": "Поиск тегов", - "generic.shorthand": "Сокращённое название", - "home.include_all_tags": "И (Файл содержит все теги)", - "home.include_any_tag": "Или (Файл содержит любой из тегов)", - "home.main_window": "Основное Окно", - "home.search_entries": "Поисковые запросы", - "home.search": "Поиск", - "home.thumbnail_size": "Размер иконок", - "landing.open_button": "Открыть/Создать Библиотеку %{open_shortcut_text}", - "library.anthology": "Антология", - "library.archived": "Дата архивации", - "library.Artist": "Художник", - "library.author": "Автор", - "library.book": "Книги", - "library.collation": "Сопоставление", - "library.comic": "Комиксы", - "library.comments": "Комментарии", - "library.composer": "Композитор", - "library.content_tags": "Теги содержимого", - "library.date_created": "Дата создания", - "library.date_modified": "Дата изменения", - "library.date_published": "Дата публикации", - "library.date_released": "Дата выпуска", - "library.date_taken": "Дата съёмки", - "library.date_uploaded": "Дата загрузки", - "library.date": "Дата", - "library.description": "Описание", - "library.favorite": "Избранное", - "library.guest_artist": "Соавтор", - "library.magazine": "Журнал", - "library.manga": "Манга", - "library.meta_tags": "Мета Теги", - "library.notes": "Заметки", - "library.publisher": "Издатель", - "library.series": "Серии", - "library.source": "Источники", - "library.tags": "Теги", - "library.title": "Название", - "library.url": "URL", - "library.volume": "Том", - "menu.edit": "Редактировать", - "menu.file": "Файл", - "menu.help": "Помощь", - "menu.macros": "Макросы", - "menu.tools": "Инструменты", - "menu.window": "Окно", - "merge.merge_dupe_entries": "Объединить повторяющиеся записи", - "merge.window_title": "Объединить повторяющиеся записи", - "mirror_entities.are_you_sure": "Вы уверенны, что хотите отзеркалить следующие %{len(self.lib.dupe_files)} записи?", - "mirror_entities.label": "Отзеркаливание 1/%{count} записей...", - "mirror_entities.title": "Отзеркаливание записей", - "open_library.library_creation_return_code": "Возвратный код создания библиотеки:", - "open_library.no_tagstudio_library_found": "Существующая библиотека TagStudio не найдена внутри '%{path}'. Создаём новую.", - "open_library.title": "Библиотека", - "preview_panel.confirm_remove": "Вы уверенны, что хотите удалить эту категорию \"%{self.lib.get_field_attr(field, \"name\")}\"?", - "preview_panel.edit_name": "Редактировать", - "preview_panel.missing_location": "Путь не найден", - "preview_panel.mixed_data": "Смешанные данные", - "preview_panel.no_items_selected": "Ничего не выбрано", - "preview_panel.unknown_field_type": "Неизвестный тип категории", - "preview.dimensions": "Соотношения сторон", - "preview.recent": "Недавние библиотеки", - "progression.running_macros.new_entries": "Использование макросов на новых файлах", - "progression.running_macros.one_new_entry": "Запуск сконфигурированных макросов в 1/%{len(new_ids)} Новые файлы", - "progression.running_macros.several_new_entry": "Запуск сконфигурированных макросов в %{x + 1}/%{len(new_ids)} Новые файлы", - "relink_unlinked.attempt_relink": "Пытаемся вновь привязать %{x[0]+1}/%{len(self.lib.missing_files)} записей, %{self.fixed} Успешно привязано", - "relink_unlinked.title": "Привязка записей", - "splash.open_library": "Открытие Библиотеки", - "status.backup_success": "Резервная копия библиотеки сохранена по адресу:", - "status.number_results_found": "%{len(all_items)} Было найдено \"%{query}\" (%{format_timespan(end_time - start_time)})", - "status.results_found": "Результаты", - "status.save_success": "Библиотека сохранена и закрыта!", - "status.search_library_query": "Поиск по библиотеке", - "tag.add_search": "Добавить к поисковому запросу", - "tag.add": "Добавить тег", - "tag.library": "Библиотека тегов", - "tag.new": "Новый тег", - "tag.search_for_tag": "Поиск тега" -} diff --git a/tagstudio/resources/translations/sv.json b/tagstudio/resources/translations/sv.json deleted file mode 100644 index c684f8ff..00000000 --- a/tagstudio/resources/translations/sv.json +++ /dev/null @@ -1,111 +0,0 @@ -{ - "add_field.add": "Lägg till fält", - "build_tags.add_parent_tags": "Lägg till förälderetikett", - "build_tags.parent_tags": "Förälderetiketter", - "delete_unlinked.delete_entries": "Tar bort poster", - "dialog.open_create_library": "Öppna/skapa bibliotek", - "dialog.refresh_directories": "Uppdaterar kataloger", - "dialog.save_library": "Spara bibliotek", - "dialog.scan_directories": "Skannar kataloger efter nya filer...\nFörbereder...", - "file_extension.add_extension": "Lägg till tillägg", - "file_opener.not_found": "Kunde inte hitta filen:", - "file_opener.open_file": "Öppnar fil:", - "fix_dupes.fix_dupes": "Fixa dubbla filer", - "fix_dupes.mirror_entries": "Spegla poster", - "fix_unlinked.delete_unlinked": "Ta bort olänkade poster", - "fix_unlinked.description": "Varje post i biblioteket är länkad till en fil i en av dina kataloger. Om en fil länkad till en post är flyttad eller borttagen utanför TagStudio blir den olänkad. Olänkade poster kan automatiskt bli omlänkade genom att söka genom dina kataloger, manuellt omlänkade av användaren eller tas bort om så önskas.", - "fix_unlinked.duplicate_description": "Dubbla poster är definierade som flera poster som pekar på samma fil på datorn. Genom att slå ihop dessa poster kommer deras etiketter och metadata från dubbletterna att kombineras till en post. Dessa ska inte förväxlas med \"dubbla filer\", som är dubbletter av dina filer utanför TagStudio.", - "fix_unlinked.fix_unlinked": "Fixa olänkade poster", - "fix_unlinked.manual_relink": "Länka om manuellt", - "fix_unlinked.merge_dupes": "Slå ihop dubbla poster", - "fix_unlinked.refresh_dupes": "Uppdatera dubbla poster", - "fix_unlinked.scan_library.label": "Skannar bibliotek efter olänkade poster...", - "fix_unlinked.scan_library.title": "Skannar bibliotek", - "fix_unlinked.search_and_relink": "Sök && Länka om", - "folders_to_tags.description": "Skapar etiketter baserat på din mappstruktur och tillämpar dem till dina poster.\nStrukturen nedan visar vilka etiketter som kommer skapas och vilka filer de kommer tillämpas på.", - "folders_to_tags.title": "Skapa etiketter från mappar", - "generic.add": "Lägg till", - "generic.aliases": "Alias", - "generic.apply": "Tillämpa", - "generic.cancel": "Avbryt", - "generic.close_all": "Stäng alla", - "generic.color": "Färg", - "generic.delete": "Ta bort", - "generic.done": "Klar", - "generic.exclude": "Exkludera", - "generic.file_extension": "Filnamnstillägg", - "generic.include": "Inkludera", - "generic.mirror": "Spegla", - "generic.name": "Namn", - "generic.open_all": "Öppna alla", - "generic.open_file_explorer": "Öppna fil i utforskaren", - "generic.open_file": "Öppna fil", - "generic.refresh_all": "Uppdatera alla", - "generic.remove_field": "Ta bort fält", - "generic.search_tags": "Sök etikett", - "generic.shorthand": "Förkortning", - "home.include_all_tags": "Och (Inkluderar alla etiketter)", - "home.include_any_tag": "Eller (Inkluderar alla etiketter)", - "home.main_window": "Huvudfönster", - "home.search_entries": "Sök poster", - "home.search": "Sök", - "home.thumbnail_size": "Miniatyrbildsstorlek", - "library.anthology": "Antologi", - "library.archived": "Arkiveringsdatum", - "library.Artist": "Artist", - "library.author": "Författare", - "library.book": "Bok", - "library.collation": "Kollation", - "library.comic": "Serietidning", - "library.comments": "Kommentarer", - "library.composer": "Kompositör", - "library.content_tags": "Innehållsetiketter", - "library.date_created": "Skapad den", - "library.date_modified": "Senast ändrad", - "library.date_published": "Publiceringsdatum", - "library.date_released": "Utgivningsdatum", - "library.date_taken": "", - "library.date_uploaded": "Uppladdningsdatum", - "library.date": "Datum", - "library.description": "Beskrivning", - "library.favorite": "Favorit", - "library.guest_artist": "Gästartist", - "library.magazine": "Magasin", - "library.manga": "Manga", - "library.meta_tags": "Meta-etiketter", - "library.notes": "Anteckningar", - "library.publisher": "Utgivare", - "library.series": "Serie", - "library.source": "Källa", - "library.tags": "Etiketter", - "library.title": "Titel", - "library.url": "URL", - "library.volume": "Volym", - "menu.edit": "Redigera", - "menu.file": "Fil", - "menu.help": "Hjälp", - "menu.macros": "Makron", - "menu.tools": "Verktyg", - "menu.window": "Fönster", - "merge.merge_dupe_entries": "Slår ihop dubbla poster", - "merge.window_title": "Slår ihop dubbla poster", - "mirror_entities.title": "Speglar poster", - "open_library.title": "Bibliotek", - "preview_panel.edit_name": "Redigera", - "preview_panel.missing_location": "Platsen saknas", - "preview_panel.no_items_selected": "Inga valda objekt", - "preview.dimensions": "Dimensioner", - "preview.recent": "Senaste biblioteken", - "progression.running_macros.new_entries": "Kör makros på nya poster", - "relink_unlinked.title": "Länkar om poster", - "splash.open_library": "Öppnar bibliotek", - "status.backup_success": "Bibliotekets säkerhetskopia sparad i:", - "status.results_found": "Resultat", - "status.save_success": "Bibliotek sparat och stängt!", - "status.search_library_query": "Söker i biblioteket efter", - "tag.add_search": "Lägg till i Sök", - "tag.add": "Lägg till etikett", - "tag.library": "Biblioteksetiketter", - "tag.new": "Ny etikett", - "tag.search_for_tag": "Sök efter etikett" -} diff --git a/tagstudio/resources/translations/ta.json b/tagstudio/resources/translations/ta.json deleted file mode 100644 index 6386aa79..00000000 --- a/tagstudio/resources/translations/ta.json +++ /dev/null @@ -1,137 +0,0 @@ -{ - "add_field.add": "புலத்தைச் சேர்க்க", - "build_tags.add_parent_tags": "பெற்றோர் குறிச்சொற்களைச் சேர்க்க", - "build_tags.parent_tags": "பெற்றோர் குறிச்சொற்கள்", - "delete_unlinked.confirm": "பின்வரும் உள்ளீடுகளை நிச்சயமாக நீக்க விரும்புகிறீர்களா %{len(self.lib.missing_files)}?", - "delete_unlinked.delete_entries": "உள்ளீடுகள் நீக்கப்படுகிறது", - "delete_unlinked.delete_unlinked": "இணைக்கப்படாத உள்ளீடுகளை நீக்கு", - "delete_unlinked.deleting_number_entries": "%{x[0]+1}/{len(self.lib.missing_files)} இணைக்கப்படாத உள்ளீடுகள் நீக்கப்படுகிறது", - "dialog.open_create_library": "நூலகத்தைத் திற/உருவாக்கு", - "dialog.refresh_directories": "கோப்பகங்கள் புதுப்பிக்கப்படுகின்றன", - "dialog.save_library": "நூலகத்தைச் சேமி", - "dialog.scan_directories.new_files": "புதிய கோப்புகளுக்கான அடைவுகள் சோதனை செய்யப்படுகின்றது...\n%{x + 1} கோப்பு%{\"s\" if x + 1 != 1 else \"\"} தேடப்பட்டது, %{len(self.lib.files_not_in_library)} புதிய கோப்புகள் கிடைத்தன", - "dialog.scan_directories": "புதிய கோப்புகளுக்கான அடைவுகள் சோதனை செய்யப்படுகின்றது...\nதயாராகிறது...", - "file_extension.add_extension": "நீட்டிப்பைச் சேர்க்க", - "file_extension.list_mode": "பட்டியல் முறை:", - "file_opener.command_not_found": "%{command_name} ஐ system PATH இல் கண்டுபிடிக்க முடியவில்லை", - "file_opener.not_found": "கோப்பு கிடைக்கவில்லை:", - "file_opener.open_file": "கோப்பைத் திறக்கிறது:", - "fix_dupes.advice_label": "படிமம் முடிந்தவுடன், தேவையற்ற கோப்புகளை நீக்க DupeGuru ஐ பயன்படுத்தலாம். அதற்குப் பிறகு, இணைக்காத நுழைவுகளை நீக்க 'டாக் ஸ்டுடியோ' வின் 'இணைக்கப்படாத உள்ளீடுகளைச் சரிசெய்' அம்சத்தைக் கருவிகள் பட்டியில் பயன்படுத்தவும்.", - "fix_dupes.fix_dupes": "நகல் கோப்புகளைச் சரிசெய்", - "fix_dupes.load_file": "DupeGuru கோப்பை ஏற்றவும்", - "fix_dupes.mirror_description": "ஒவ்வொரு மறுநுழைவு பொருத்தத் தொகுப்பிலும் நுழைவு தரவுகளைப் பிரதிபலிக்கவும், அனைத்து தரவுகளையும் இணைக்கவும், எந்தத் தகவல்களையும் நீக்காமலும் மறு செய்யாமலும். இந்தச் செயலில் எந்தக் கோப்புகள் அல்லது தரவுகளும் நீக்கப்பட மாட்டாது.", - "fix_dupes.mirror_entries": "படிம நுழைவுகள்", - "fix_dupes.name_filter": "DupeGuru கோப்புகள் (*.dupeguru)", - "fix_dupes.no_file_match": "நகல் கோப்பு பொருத்தங்கள்: ஒன்றும் இல்லை", - "fix_dupes.no_file_selected": "DupeGuru கோப்பு எதுவும் தேர்ந்தெடுக்கப்படவில்லை", - "fix_dupes.number_file_match": "நகல் கோப்பு பொருத்தங்கள்: %{count}", - "fix_dupes.open_result_files": "DupeGuru முடிவுகள் கோப்பைத் திறக்க", - "fix_unlinked.delete_unlinked": "இணைக்கப்படாத உள்ளீடுகளை நீக்கு", - "fix_unlinked.description": "ஒவ்வொரு புத்தககல்லரி நுழைவும் உங்கள் அடைவுகளில் உள்ள ஒரு கோப்புடன் இணைக்கப்பட்டுள்ளது. டாக் ஸ்டுடியோ-வைத் தவிர கோப்புகள் நகர்த்தப்பட்டால் அல்லது நீக்கப்பட்டால், அவை இணைக்கப்படாதவையாகக் கருதப்படும். இணைக்கப்படாத நுழைவுகளை உங்கள் அடைவுகளில் தேடுவதன் மூலம் தானாகவே மீண்டும் இணைக்கலாம், பயனர் கைமுறையாக இணைக்கலாம் அல்லது விருப்பப்படி நீக்கலாம்.", - "fix_unlinked.duplicate_description": "மறுநுழைவுகள் என்பது, ஒரே கோப்பை குறிக்கும் பல நுழைவுகளை குறிக்கும். இவற்றை இணைப்பதால், அனைத்து மறுநுழைவுகளின் குறிச்சொற்களும் மெட்டாடேட்டாவும் ஒரே ஒட்டுமொத்த நுழைவாகச் சேர்க்கப்படும். இவற்றை 'மறுகோப்புகள்' என்பதுடன் குழப்பக் கூடாது, ஏனெனில் அவை டாக் ஸ்டுடியோவுக்கு வெளியேயுள்ள கோப்புகளின் நகல்களாகும்.", - "fix_unlinked.fix_unlinked": "இணைக்கப்படாத உள்ளீடுகளைச் சரிசெய்யவும்", - "fix_unlinked.manual_relink": "கைமுறை மறு இணைப்பு", - "fix_unlinked.merge_dupes": "நகல் உள்ளீடுகளை ஒன்றிணை", - "fix_unlinked.refresh_dupes": "நகல் உள்ளீடுகளைப் புதுப்பி", - "fix_unlinked.scan_library.label": "இணைக்கப்படாத நுழைவுகளை புத்தககல்லரியில் சோதனை செய்யப்படுகிறது...", - "fix_unlinked.scan_library.title": "புத்தககல்லரி சோதனை செய்யப்படுகிறது", - "fix_unlinked.search_and_relink": "தேடல் && மீண்டும் இணை", - "folders_to_tags.description": "உங்கள் அடைவு கட்டமைப்பின் அடிப்படையில் குறிச்சொற்களை உருவாக்கி, அவற்றை உங்கள் நுழைவுகளில் பயன்படுத்துகிறது.\nகீழே காணப்படும் கட்டமைப்பானது உருவாக்கப்படும் அனைத்து குறிச்சொற்களையும், அவை எந்த நுழைவுகளில் பயன்படுத்தப்படும் என்பதையும் காட்டுகிறது.", - "folders_to_tags.title": "கோப்புறைகளிலிருந்து குறிச்சொற்களை உருவாக்கு", - "generic.add": "சேர்", - "generic.aliases": "மாற்றுப்பெயர்கள்", - "generic.apply": "விண்ணப்பிக்க", - "generic.cancel": "ரத்து செய்", - "generic.close_all": "அனைத்தையும் மூடு", - "generic.color": "நிறம்", - "generic.delete": "நீக்கு", - "generic.done": "முடிந்தது", - "generic.exclude": "தவிர்", - "generic.file_extension": "கோப்பு நீட்டிப்புகள்", - "generic.include": "உள்ளடக்கு", - "generic.mirror": "படிமம்", - "generic.name": "பெயர்", - "generic.open_all": "அனைத்தையும் திற", - "generic.open_file_explorer": "Explorer இல் கோப்பைத் திறக்கவும்", - "generic.open_file": "கோப்பைத் திறக்கவும்", - "generic.refresh_all": "அனைத்தையும் புதுப்பி", - "generic.remove_field": "புலத்தை அகற்று", - "generic.search_tags": "குறிச்சொற்களைத் தேடு", - "generic.shorthand": "சுருக்கெழுத்து", - "home.include_all_tags": "மற்றும் (அனைத்து குறிச்சொற்களையும் உள்ளடக்கியது)", - "home.include_any_tag": "அல்லது (எந்தக் குறிச்சொல்லையும் உள்ளடக்கியது)", - "home.main_window": "பிரதான சாளரம்", - "home.search_entries": "தேடல் உள்ளீடுகள்", - "home.search": "தேடு", - "home.thumbnail_size": "சின்னப்பட அளவு", - "landing.open_button": "நூலகத்தைத் திற/உருவாக்கு %{open_shortcut_text}", - "library.anthology": "தொகுப்பியல்", - "library.archived": "காப்பகப்படுத்தப்பட்ட தேதி", - "library.Artist": "கலைஞர்", - "library.author": "ஆக்கியோன்", - "library.book": "புத்தகம்", - "library.collation": "தொகுத்தல்", - "library.comic": "நகைச்சுவை", - "library.comments": "கருத்துகள்", - "library.composer": "இசையமைப்பாளர்", - "library.content_tags": "உள்ளடக்கக் குறிச்சொற்கள்", - "library.date_created": "உருவாக்கப்பட்ட தேதி", - "library.date_modified": "மாற்றப்பட்ட தேதி", - "library.date_published": "வெளியிடப்பட்ட தேதி", - "library.date_released": "வெளியான தேதி", - "library.date_taken": "எடுக்கப்பட்ட தேதி", - "library.date_uploaded": "பதிவேற்றிய தேதி", - "library.date": "தேதி", - "library.description": "விளக்கம்", - "library.favorite": "பிடித்தது", - "library.guest_artist": "விருந்தினர் கலைஞர்", - "library.magazine": "இதழ்", - "library.manga": "மங்கா", - "library.meta_tags": "மெட்டா குறிச்சொற்கள்", - "library.notes": "குறிப்புகள்", - "library.publisher": "பதிப்பாளர்", - "library.series": "தொடர்", - "library.source": "ஆதாரம்", - "library.tags": "குறிச்சொற்கள்", - "library.title": "தலைப்பு", - "library.url": "இணைய முகவரி", - "library.volume": "தொகுப்பு", - "menu.edit": "திருத்து", - "menu.file": "கோப்பு", - "menu.help": "உதவி", - "menu.macros": "செயல்முறை", - "menu.tools": "கருவிகள்", - "menu.window": "சாளரம்", - "merge.merge_dupe_entries": "மறுநுழைவுகளை ஒன்றுசேர்த்தல்", - "merge.window_title": "மறுநுழைவுகளை ஒன்றுசேர்த்தல்", - "mirror_entities.are_you_sure": "பின்வரும் உள்ளீடுகளைப் பிரதிபலிக்க விரும்புகிறீர்களா %{len(self.lib.dupe_files)}?", - "mirror_entities.label": "1/%{count} உள்ளீடுகளைப் பிரதிபலிக்கப்படுகின்றது...", - "mirror_entities.title": "உள்ளீடுகள் பிரதிபழிக்கப்படுகின்றது", - "open_library.library_creation_return_code": "நூலக உருவாக்கம் திரும்பக் குறியீடு:", - "open_library.no_tagstudio_library_found": "'%{path}' இல் ஏற்கனவே உள்ள டாக் ஸ்டுடியோ புத்தககல்லரி காணப்படவில்லை. ஒன்று உருவாக்கப்படுகிறது.", - "open_library.title": "நூலகம்", - "preview_panel.confirm_remove": "இந்த \"%{self.lib.get_field_attr(field, \"name\")}\" புலத்தை நிச்சயமாக அகற்ற விரும்புகிறீர்களா?", - "preview_panel.edit_name": "திருத்து", - "preview_panel.missing_location": "இடம் காணவில்லை", - "preview_panel.mixed_data": "கலப்பு தரவு", - "preview_panel.no_items_selected": "உருப்படிகள் எதுவும் தேர்ந்தெடுக்கப்படவில்லை", - "preview_panel.unknown_field_type": "அறியப்படாத புல வகை", - "preview.dimensions": "பரிமாணங்கள்", - "preview.recent": "சமீபத்திய நூலகங்கள்", - "progression.running_macros.new_entries": "புதிய நுழைவுகளில் செயல்முறைகளை இயக்கப்படுகின்றது", - "progression.running_macros.one_new_entry": "1/ இல் கட்டமைக்கப்பட்ட செயல்முறைகளை இயக்கப்படுகிறது %{len(new_ids)} புதிய பதிவுகள்", - "progression.running_macros.several_new_entry": "%{x + 1} இல் கட்டமைக்கப்பட்ட செயல்முறைகளை இயக்கப்படுகிறது / %{len(new_ids)} புதிய பதிவுகள்", - "relink_unlinked.attempt_relink": "%{x[0]+1}/%{len(self.lib.missing_files)} உள்ளீடுகளை மீண்டும் இணைக்க முயற்சிக்கிறது, %{self.fixed} மீண்டும் இணைக்கப்பட்டது", - "relink_unlinked.title": "உள்ளீடுகள் மீண்டும் இணைக்கப்படுகின்றது", - "splash.open_library": "நூலகம் திறக்கப்படுகின்றது", - "status.backup_success": "நூலக காப்புப் பிரதி சேமிக்கப்பட்டது:", - "status.number_results_found": "\"%{query}\" இல் %{len(all_items)} முடிவுகள் கிடைத்தன (%{format_timespan(end_time - start_time)})", - "status.results_found": "முடிவுகள்", - "status.save_success": "நூலகம் சேமிக்கப்பட்டு மூடப்பட்டது!", - "status.search_library_query": "நூலகத்தைத் தேடுகிறது", - "tag.add_search": "தேடலில் சேர்", - "tag.add": "குறிச்சொல் சேர்க்க", - "tag.library": "நூலக குறிச்சொற்கள்", - "tag.new": "புதிய குறிச்சொல்", - "tag.search_for_tag": "குறிச்சொல்லைத் தேடு" -} diff --git a/tagstudio/resources/translations/tok.json b/tagstudio/resources/translations/tok.json deleted file mode 100644 index 3da017ac..00000000 --- a/tagstudio/resources/translations/tok.json +++ /dev/null @@ -1,137 +0,0 @@ -{ - "add_field.add": "pana e sona", - "build_tags.add_parent_tags": "o pana e poki mama", - "build_tags.parent_tags": "poki mama", - "delete_unlinked.confirm": "mi weka e ijo %{len(self.lib.missing_files)}. ni li pona anu seme?", - "delete_unlinked.delete_entries": "mi weka e ijo", - "delete_unlinked.delete_unlinked": "o weka e ijo pi ijo lon ala", - "delete_unlinked.deleting_number_entries": "mi weka e ijo %{x[0]+1}/{len(self.lib.missing_files)} pi ijo lon ala", - "dialog.open_create_library": "open/sin e tomo", - "dialog.refresh_directories": "mi kama jo e sin lon tomo", - "dialog.save_library": "awen e tomo", - "dialog.scan_directories.new_files": "mi alasa e ijo sin lon tomo...\nmi lukin e ijo %{x + 1}. ijo %{len(self.lib.files_not_in_library)} li sin", - "dialog.scan_directories": "mi alasa e ijo sin lon tomo...\nmi kama pona...", - "file_extension.add_extension": "o pana e nimi anpa", - "file_extension.list_mode": "nasin kulupu:", - "file_opener.command_not_found": "mi ken ala alasa e toki lawa '%{command_name}' lon PATH", - "file_opener.not_found": "mi ken ala alasa e ijo:", - "file_opener.open_file": "mi open e ijo:", - "fix_dupes.advice_label": "jasima li pini la, sina ken kepeken ilo DupeGuru. ilo DupeGuru li ken weka e ijo ike. ni li pini la, o kepeken e nasin \"o pona e ijo pi ijo lon ala\" lon ilo TagStudio. ni li weka e ijo pi ijo lon ala.", - "fix_dupes.fix_dupes": "pona e ijo sama", - "fix_dupes.load_file": "o kama sona e ijo DupeGuru", - "fix_dupes.mirror_description": "o jasima e sona kama lon kulupu sama ale. sona ale li kama wan li weka ala li kama mute ala. ni li weka ala e sona e ijo.", - "fix_dupes.mirror_entries": "o jasima e ijo", - "fix_dupes.name_filter": "ijo DupeGuru (*.dupeguru)", - "fix_dupes.no_file_match": "ijo sama: ala", - "fix_dupes.no_file_selected": "sina o anu e ijo DupeGuru", - "fix_dupes.number_file_match": "ijo sama: %{count}", - "fix_dupes.open_result_files": "o open e sona pini tan ilo DupeGuru", - "fix_unlinked.delete_unlinked": "o weka e ijo pi ijo lon ala", - "fix_unlinked.description": "ijo ale li jo e ijo lon. ona li tawa anu weka, ona li jo ala e ijo lon. ijo pi ijo lon li ken alasa e tomo li ken kama jo e ijo lon. ante la sina ken pana ijo lon tawa ijo. ante la sina ken weka e ijo.", - "fix_unlinked.duplicate_description": "ken la, ijo mute li jo e ijo lon sama. ni li \"ijo sama\". sina wan e ona la, ijo sama li kama wan li jo e sona ale tan ijo sama ale.", - "fix_unlinked.fix_unlinked": "o pona e ijo pi ijo lon ala", - "fix_unlinked.manual_relink": "sina o pana e ijo lon tawa ijo", - "fix_unlinked.merge_dupes": "o kama wan e ijo sama", - "fix_unlinked.refresh_dupes": "o kama jo e sona tan ijo sama", - "fix_unlinked.scan_library.label": "mi o alasa e ijo pi ijo lon ala...", - "fix_unlinked.scan_library.title": "mi o lukin e tomo", - "fix_unlinked.search_and_relink": "o alasa o pana e ijo lon tawa ijo", - "folders_to_tags.description": "ni li pali e poki tan poki tona li pana e poki sin tawa ijo lon tomo.\n ilo ni li pali e anpa.", - "folders_to_tags.title": "o pali e poki tan poki tomo", - "generic.add": "o pana", - "generic.aliases": "nimi ante", - "generic.apply": "o pana", - "generic.cancel": "o ala", - "generic.close_all": "weka e ale", - "generic.color": "kule", - "generic.delete": "o weka", - "generic.done": "pona", - "generic.exclude": "o kepeken ala", - "generic.file_extension": "nimi lon nimi ijo anpa", - "generic.include": "o kepeken", - "generic.mirror": "jasima", - "generic.name": "nimi", - "generic.open_all": "open e ale", - "generic.open_file_explorer": "open e ijo lon ilo alasa", - "generic.open_file": "open e ijo", - "generic.refresh_all": "o kama jo sin tan ale", - "generic.remove_field": "weka e sona", - "generic.search_tags": "o alasa e poki", - "generic.shorthand": "nimi lili", - "home.include_all_tags": "AND (kepeken poki ale)", - "home.include_any_tag": "OR (kepeken poki wan. poki ale li ken)", - "home.main_window": "lipu suli", - "home.search_entries": "ijo alasa", - "home.search": "alasa", - "home.thumbnail_size": "suli sitelen", - "landing.open_button": "open/sin e tomo %{open_shortcut_text}", - "library.anthology": "kulupu toki", - "library.archived": "tenpo pi kama awen", - "library.Artist": "jan pali sitelen", - "library.author": "jan pali toki", - "library.book": "lipu toki", - "library.collation": "poki ijo", - "library.comic": "lipu sitelen", - "library.comments": "toki isipin", - "library.composer": "jan pali pi kalama musi", - "library.content_tags": "poki pi jo ijo", - "library.date_created": "tenpo pi kama sin", - "library.date_modified": "tenpo pi kama ante", - "library.date_published": "tenpo pana", - "library.date_released": "tenpo pi kama open", - "library.date_taken": "tenpo lanpan", - "library.date_uploaded": "tenpo pi kama lon lipu", - "library.date": "tenpo", - "library.description": "toki ni", - "library.favorite": "pona mute", - "library.guest_artist": "jan pali namako", - "library.magazine": "lipu sitelen toki", - "library.manga": "kulupu pi lipu sitelen", - "library.meta_tags": "poki pi sona ijo", - "library.notes": "toki sina", - "library.publisher": "jan esun", - "library.series": "kulupu", - "library.source": "tan", - "library.tags": "poki", - "library.title": "nimi", - "library.url": "nimi linluwi", - "library.volume": "nanpa", - "menu.edit": "ante", - "menu.file": "ijo", - "menu.help": "mi jo e toki seme", - "menu.macros": "ilo pali", - "menu.tools": "ilo", - "menu.window": "lipu", - "merge.merge_dupe_entries": "ijo sama li kama wan", - "merge.window_title": "ijo sama li kama wan", - "mirror_entities.are_you_sure": "mi jasima e ijo %{len(self.lib.dupe_files)}. ni li pona anu seme?", - "mirror_entities.label": "mi jasima e ijo 1/%{count}...", - "mirror_entities.title": "mi jasima e ijo", - "open_library.library_creation_return_code": "tomo li open li toki e ni:", - "open_library.no_tagstudio_library_found": "tomo lon '%{path}' li lon ala. mi pali e tomo.", - "open_library.title": "tomo", - "preview_panel.confirm_remove": "sina weka e sona poki \"%{self.lib.get_field_attr(field, \"name\")}\". ni li pona anu seme?", - "preview_panel.edit_name": "ante", - "preview_panel.missing_location": "ma li lon ala", - "preview_panel.mixed_data": "sona ante", - "preview_panel.no_items_selected": "ijo ala li anu", - "preview_panel.unknown_field_type": "mi sona ala e kule pi sona poki", - "preview.dimensions": "suli", - "preview.recent": "tomo pi tenpo poka", - "progression.running_macros.new_entries": "mi pali lon ijo sin", - "progression.running_macros.one_new_entry": "mi pali lon ijo sin 1/%{len(new_ids)}", - "progression.running_macros.several_new_entry": "mi pali lon ijo sin %{x + 1}/%{len(new_ids)}", - "relink_unlinked.attempt_relink": "mi o pana e ijo lon tawa ijo %{x[0]+1}/%{len(self.lib.missing_files)}. mi pana e ijo lon tawa ijo %{self.fixed}", - "relink_unlinked.title": "mi pana e ijo lon tawa ijo", - "splash.open_library": "mi open e tomo", - "status.backup_success": "tomo sama li lon:", - "status.number_results_found": "%{len(all_items)} mi jo e ijo \"%{query}\" (%{format_timespan(end_time - start_time)})", - "status.results_found": "jo", - "status.save_success": "tomo li awen li weka!", - "status.search_library_query": "mi alasa e", - "tag.add_search": "pana tawa alasa", - "tag.add": "o pana e poki", - "tag.library": "poki tomo", - "tag.new": "poki sin", - "tag.search_for_tag": "o alasa e poki" -} diff --git a/tagstudio/resources/translations/tr.json b/tagstudio/resources/translations/tr.json deleted file mode 100644 index 49010506..00000000 --- a/tagstudio/resources/translations/tr.json +++ /dev/null @@ -1,137 +0,0 @@ -{ - "add_field.add": "Alan Ekle", - "build_tags.add_parent_tags": "Üst Etiketler Ekle", - "build_tags.parent_tags": "Üst Etiketler", - "delete_unlinked.confirm": "%{len(self.lib.missing_files) tane kayıtları silmek istediğinden emin misin?", - "delete_unlinked.delete_entries": "Kayıtlar Siliniyor", - "delete_unlinked.delete_unlinked": "Kopuk Kayıtları Sil", - "delete_unlinked.deleting_number_entries": "%{x[0]+1}/{len(self.lib.missing_files)} Kopuk Kayıt Siliniyor", - "dialog.open_create_library": "Kütüphane Aç/Oluştur", - "dialog.refresh_directories": "Dizinler Yenileniyor", - "dialog.save_library": "Kütüphaneyi Kaydet", - "dialog.scan_directories.new_files": "Yeni Dosyalar için Dizinler Taranıyor...\n%{x + 1} File%{\"s\" if x + 1 != 1 else \"\"} Arandı, %{len(self.lib.files_not_in_library)} Yeni Dosya Bulundu", - "dialog.scan_directories": "Yeni Dosyalar için Dizinler Taranıyor...\nHazırlanıyor...", - "file_extension.add_extension": "Dosya Uzantısı Ekle", - "file_extension.list_mode": "Listeleme Modu:", - "file_opener.command_not_found": "Sistem PATH'inde %{command_name} komutu bulunamadı", - "file_opener.not_found": "Dosya bulunamadı:", - "file_opener.open_file": "Dosya açılıyor:", - "fix_dupes.advice_label": "Yansıtma işleminden sonra, DupeGuru'yu kullanarak istenmeyen dosyaları silebilirsin. İşlem sonrasında, kopuk kayıtları silmek için TagStudio'nun Araçlar menüsünden \"Kopuk Kayıtları Düzelt\" özelliğini kullanabilirsin.", - "fix_dupes.fix_dupes": "Yinelenen Dosyaları Düzelt", - "fix_dupes.load_file": "DupeGuru Dosyasını Yükle", - "fix_dupes.mirror_description": "Kayıt verilerini bulunan her bir yinelemeye yansıtır, alanları kopyalamadan veya silmeden tüm verileri birleştirir. Bu operasyon herhangi bir dosya veya veri silmeyecek.", - "fix_dupes.mirror_entries": "Kayıtları Yansıt", - "fix_dupes.name_filter": "DupeGuru Dosyaları (*.dupeguru)", - "fix_dupes.no_file_match": "Bulunan Yinelenen Dosyalar: Yok", - "fix_dupes.no_file_selected": "Seçili DupeGuru Dosyası Yok", - "fix_dupes.number_file_match": "Bulunan Yinelenen Dosyalar: %{count}", - "fix_dupes.open_result_files": "DupeGuru Sonuçlar Dosyasını Aç", - "fix_unlinked.delete_unlinked": "Kopuk Kayıtları Sil", - "fix_unlinked.description": "Kütüphanenizdeki her bir kayıt, dizinlerinizden bir tane dosya ile eşleştirilmektedir. Eğer bir kayıta bağlı dosya TagStudio dışında taşınır veya silinirse, o dosya artık kopuk olarak sayılır. Kopuk kayıtlar dizinlerinizde arama yapılırken otomatik olarak tekrar eşleştirilebilir, manuel olarak sizin tarafınızdan eşleştirilebilir veya isteğiniz üzere silinebilir.", - "fix_unlinked.duplicate_description": "Yinelenen kayıtlar, diskinizde aynı dosyaya işaret eden birden fazla kayıt olarak tanımlanmaktadır. Bu kayıtları birleştirdiğinizde, yinelenen tüm kayıtların içerisindeki etiketler ve metadata bilgisi tek bir tane kayıt üzerinde birleştirilecektir. Bu, \"yinelenen dosyalar\" ile karıştırılmamalıdır. Yinelenen dosyalar, TagStudio'nun dışında birden fazla kere bulunan dosyalarınızdır.", - "fix_unlinked.fix_unlinked": "Kopuk Kayıtları Düzelt", - "fix_unlinked.manual_relink": "Manuel Yeniden Eşleştirme", - "fix_unlinked.merge_dupes": "Yinelenen Kayıtları Birleştir", - "fix_unlinked.refresh_dupes": "Yinelenen Kayıtları Yenile", - "fix_unlinked.scan_library.label": "Kütüphane Kopuk Kayıtlar için Taranıyor...", - "fix_unlinked.scan_library.title": "Kütüphane Taranıyor", - "fix_unlinked.search_and_relink": "Ara && Yeniden Eşleştir", - "folders_to_tags.description": "Klasörlerinin yapısına bakarak etiketler oluşturur ve bu etiketleri kayıtlarına uygular.\nAşağıdaki yapı, oluşturulacak tüm etiketleri ve o etiketlerin hangi kayıtlarına uygulanacağını göstermektedir.", - "folders_to_tags.title": "Klasörlerden Etiketler Oluştur", - "generic.add": "Ekle", - "generic.aliases": "Takma Adlar", - "generic.apply": "Uygula", - "generic.cancel": "İptal", - "generic.close_all": "Tümünü Kapat", - "generic.color": "Renk", - "generic.delete": "Sil", - "generic.done": "Tamamlandı", - "generic.exclude": "Hariç Tut", - "generic.file_extension": "Dosya Uzantıları", - "generic.include": "Dahil Et", - "generic.mirror": "Yansıt", - "generic.name": "İsim", - "generic.open_all": "Tümünü Aç", - "generic.open_file_explorer": "Dosyayı Dosya Gezgininde Aç", - "generic.open_file": "Dosya aç", - "generic.refresh_all": "Tümünü Yenile", - "generic.remove_field": "Alan Kaldır", - "generic.search_tags": "Etiketleri Araştır", - "generic.shorthand": "Kısaltma", - "home.include_all_tags": "Ve (Tüm Etiketleri Dikkate Alır)", - "home.include_any_tag": "Veya (Herhangi Bir Etiketi Dikkate Alır)", - "home.main_window": "Ana Pencere", - "home.search_entries": "library", - "home.search": "Ara", - "home.thumbnail_size": "Küçük Resim Boyutu", - "landing.open_button": "Kütüphane Aç/Oluştur %{open_shortcut_text}", - "library.anthology": "Antoloji", - "library.archived": "Arşivlenme Tarihi", - "library.Artist": "Sanatçı", - "library.author": "Sahibi", - "library.book": "Kitap", - "library.collation": "Sıralama", - "library.comic": "Dergi", - "library.comments": "Yorumlar", - "library.composer": "Besteci", - "library.content_tags": "İçerik Etiketleri", - "library.date_created": "Oluşturulma Tarihi", - "library.date_modified": "Değiştirilme Tarihi", - "library.date_published": "Yayınlanma Tarihi", - "library.date_released": "Çıkış Tarihi", - "library.date_taken": "Alınma Tarihi", - "library.date_uploaded": "Yüklenme Tarihi", - "library.date": "Tarih", - "library.description": "Açıklama", - "library.favorite": "Favori", - "library.guest_artist": "Konuk Sanatçı", - "library.magazine": "Magazin", - "library.manga": "Manga", - "library.meta_tags": "Meta Etiketler", - "library.notes": "Notlar", - "library.publisher": "Yayımcı", - "library.series": "Dizi", - "library.source": "Kaynak", - "library.tags": "Etiketler", - "library.title": "Başlık", - "library.url": "URL", - "library.volume": "Ses Seviyesi", - "menu.edit": "Düzenle", - "menu.file": "Dosya", - "menu.help": "Yardım", - "menu.macros": "Makrolar", - "menu.tools": "Araçlar", - "menu.window": "Pencere", - "merge.merge_dupe_entries": "Yinelenen Kayıtlar Birleştiriliyor", - "merge.window_title": "Yinelenen Kayıtlar Birleştiriliyor", - "mirror_entities.are_you_sure": "%{len(self.lib.dupe_files)} kaydı yansıtmak istediğinden emin misin?", - "mirror_entities.label": "1/%{count} Kayıt Yansıtılıyor...", - "mirror_entities.title": "Kayıtlar Yansıtılıyor", - "open_library.library_creation_return_code": "Kütüphane Oluşturmaktan Dönen Kod:", - "open_library.no_tagstudio_library_found": "'%{path}' konumunda herhangi bir TagStudio kütüphanesi bulunamadı. Yeni bir tane oluşturuluyor.", - "open_library.title": "Kütüphane", - "preview_panel.confirm_remove": "Bu \"%{self.lib.get_field_attr(field, \"name\")}\" alanını silmek istediğinden emin misin?", - "preview_panel.edit_name": "Düzenle", - "preview_panel.missing_location": "Lokasyon bulunamadı", - "preview_panel.mixed_data": "Karışık Veri", - "preview_panel.no_items_selected": "Hiçbir Öğe Seçilmedi", - "preview_panel.unknown_field_type": "Bilinmeyen Alan Türü", - "preview.dimensions": "Ölçüler", - "preview.recent": "Son Kütüphaneler", - "progression.running_macros.new_entries": "Yeni Kayıtlar Üzerinde Makrolar Çalıştırılıyor", - "progression.running_macros.one_new_entry": "1/%{len(new_ids)} Tane Yeni Kayıtlarda Yapılandırılmış Makrolar Çalıştırılıyor", - "progression.running_macros.several_new_entry": "%{x + 1}/%{len(new_ids)} Tane Yeni Kayıt Üzerinde Yapılandırılmış Makrolar Çalıştırılıyor", - "relink_unlinked.attempt_relink": "%{x[0]+1}/%{len(self.lib.missing_files)} Kayıt Yeniden Eşleştirilmeye Çalışılıyor, %{self.fixed} Başarıyla Yeniden Eşleştirildi", - "relink_unlinked.title": "Kayıtlar Yeniden Eşleştiriliyor", - "splash.open_library": "Kütüphane Açılıyor", - "status.backup_success": "Kütüphane Yedeklemesi Şuraya Kaydedildi:", - "status.number_results_found": "\"%{query}\" (%{format_timespan(end_time - start_time)}) Sorgusu için %{len(all_items)} Sonuç Bulundu", - "status.results_found": "Sonuçlar", - "status.save_success": "Kütüphane Kaydedildi ve Çıkış Yapıldı!", - "status.search_library_query": "Kütüphane Aranıyor", - "tag.add_search": "Aramaya Ekle", - "tag.add": "Etiket Ekle", - "tag.library": "Kütüphane Etiketleri", - "tag.new": "Yeni Etiket", - "tag.search_for_tag": "Etiket Ara" -} From fe207062d5344f3159434880ac85acb816f01068 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Wed, 2 Oct 2024 02:12:07 +0200 Subject: [PATCH 05/82] translations: update from Hosted Weblate (#530) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added translation using Weblate (Russian) * Translated using Weblate (Russian) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/ru/ * Added translation using Weblate (Portuguese) * Added translation using Weblate (Portuguese (Brazil)) * Translated using Weblate (Portuguese (Brazil)) Currently translated at 46.4% (66 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 46.4% (66 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/pt_BR/ * Added translation using Weblate (Tamil) * Translated using Weblate (Portuguese (Brazil)) Currently translated at 74.6% (106 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 74.6% (106 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/pt_BR/ * Translated using Weblate (Tamil) Currently translated at 51.4% (73 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/ta/ * Added translation using Weblate (Spanish) * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/pt_BR/ * Translated using Weblate (Tamil) Currently translated at 88.0% (125 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/ta/ * Translated using Weblate (Spanish) Currently translated at 11.2% (16 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 11.2% (16 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 19.7% (28 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 19.7% (28 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Russian) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/ru/ * Translated using Weblate (Spanish) Currently translated at 29.5% (42 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 29.5% (42 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 49.2% (70 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 49.2% (70 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 52.1% (74 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Added translation using Weblate (Norwegian Bokmål) * Translated using Weblate (Tamil) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/ta/ * Translated using Weblate (Norwegian Bokmål) Currently translated at 55.6% (79 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/nb_NO/ * Added translation using Weblate (French) * Translated using Weblate (Russian) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/ru/ * Translated using Weblate (Spanish) Currently translated at 56.3% (80 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 56.3% (80 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Norwegian Bokmål) Currently translated at 68.3% (97 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/nb_NO/ * Translated using Weblate (French) Currently translated at 40.1% (57 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/fr/ * Translated using Weblate (Spanish) Currently translated at 65.4% (93 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 65.4% (93 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 74.6% (106 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 83.8% (119 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 83.8% (119 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 83.8% (119 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 83.8% (119 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 93.6% (133 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 93.6% (133 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (English) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/en/ * Translated using Weblate (Spanish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Added translation using Weblate (Danish) * Added translation using Weblate (German) * Translated using Weblate (Danish) Currently translated at 1.4% (2 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/da/ * Added translation using Weblate (Cantonese (Traditional Han script)) * Translated using Weblate (Tamil) Currently translated at 99.2% (141 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/ta/ * Translated using Weblate (German) Currently translated at 2.8% (4 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/de/ * Added translation using Weblate (Hungarian) * Translated using Weblate (German) Currently translated at 14.0% (20 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/de/ * Translated using Weblate (Hungarian) Currently translated at 99.2% (141 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/hu/ * Translated using Weblate (German) Currently translated at 14.7% (21 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/de/ * Added translation using Weblate (Swedish) * Translated using Weblate (German) Currently translated at 71.8% (102 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/de/ * Translated using Weblate (Swedish) Currently translated at 78.8% (112 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/sv/ * Added translation using Weblate (Toki Pona) * Translated using Weblate (Tamil) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/ta/ * Translated using Weblate (Danish) Currently translated at 2.8% (4 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/da/ * Translated using Weblate (Toki Pona) Currently translated at 83.0% (118 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/tok/ * Added translation using Weblate (Italian) * Translated using Weblate (French) Currently translated at 64.0% (91 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/fr/ * Translated using Weblate (German) Currently translated at 76.0% (108 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/de/ * Translated using Weblate (Hungarian) Currently translated at 99.2% (141 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/hu/ * Translated using Weblate (Toki Pona) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/tok/ * Translated using Weblate (Italian) Currently translated at 11.2% (16 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/it/ * Added translation using Weblate (Turkish) * Translated using Weblate (Turkish) Currently translated at 88.7% (126 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/tr/ * Translated using Weblate (Turkish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/tr/ * Translated using Weblate (English) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/en/ * Translated using Weblate (French) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/fr/ * Translated using Weblate (English) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/en/ * Translated using Weblate (French) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/fr/ --------- Co-authored-by: Artyom Ognev Co-authored-by: Space_Fox Co-authored-by: Lobo Metalúrgico Co-authored-by: Vasi Co-authored-by: Nginearing Co-authored-by: gallegonovato Co-authored-by: Allan Nordhøy Co-authored-by: Bamowen Co-authored-by: Ryussei Co-authored-by: Szíjártó Levente Pál Co-authored-by: Zoinx Co-authored-by: gold Co-authored-by: William de Castro Co-authored-by: Jann Stute Co-authored-by: Nyghl Co-authored-by: Obscaeris --- tagstudio/resources/translations/da.json | 6 + tagstudio/resources/translations/de.json | 125 ++++++++ tagstudio/resources/translations/en.json | 286 +++++++++--------- tagstudio/resources/translations/es.json | 144 +++++++++ tagstudio/resources/translations/fr.json | 144 +++++++++ tagstudio/resources/translations/hu.json | 144 +++++++++ tagstudio/resources/translations/it.json | 19 ++ tagstudio/resources/translations/nb_NO.json | 102 +++++++ tagstudio/resources/translations/pt.json | 1 + tagstudio/resources/translations/pt_BR.json | 144 +++++++++ tagstudio/resources/translations/ru.json | 144 +++++++++ tagstudio/resources/translations/sv.json | 115 +++++++ tagstudio/resources/translations/ta.json | 144 +++++++++ tagstudio/resources/translations/tok.json | 144 +++++++++ tagstudio/resources/translations/tr.json | 144 +++++++++ .../resources/translations/yue_Hant.json | 1 + 16 files changed, 1664 insertions(+), 143 deletions(-) create mode 100644 tagstudio/resources/translations/da.json create mode 100644 tagstudio/resources/translations/de.json create mode 100644 tagstudio/resources/translations/es.json create mode 100644 tagstudio/resources/translations/fr.json create mode 100644 tagstudio/resources/translations/hu.json create mode 100644 tagstudio/resources/translations/it.json create mode 100644 tagstudio/resources/translations/nb_NO.json create mode 100644 tagstudio/resources/translations/pt.json create mode 100644 tagstudio/resources/translations/pt_BR.json create mode 100644 tagstudio/resources/translations/ru.json create mode 100644 tagstudio/resources/translations/sv.json create mode 100644 tagstudio/resources/translations/ta.json create mode 100644 tagstudio/resources/translations/tok.json create mode 100644 tagstudio/resources/translations/tr.json create mode 100644 tagstudio/resources/translations/yue_Hant.json diff --git a/tagstudio/resources/translations/da.json b/tagstudio/resources/translations/da.json new file mode 100644 index 00000000..870e71a8 --- /dev/null +++ b/tagstudio/resources/translations/da.json @@ -0,0 +1,6 @@ +{ + "home.base_title": "TagStudio Alfa", + "home.main_window": "Hovedvindue", + "home.include_all_tags": "Og (inkluderer alle tags)", + "home.include_any_tag": "Og (inkluderer envher tag)" +} diff --git a/tagstudio/resources/translations/de.json b/tagstudio/resources/translations/de.json new file mode 100644 index 00000000..d98cdee7 --- /dev/null +++ b/tagstudio/resources/translations/de.json @@ -0,0 +1,125 @@ +{ + "home.main_window": "Hauptfenster", + "home.include_all_tags": "Und (enthält alle Tags)", + "home.include_any_tag": "Oder (enthält alle Tags)", + "home.base_title": "TagStudio Alpha", + "menu.file": "Datei", + "menu.edit": "Bearbeiten", + "menu.macros": "Makros", + "tag.add": "Hinzufüge Tag", + "preview.dimensions": "Abmessungen", + "preview.recent": "Aktuelle Bibliotheken", + "library.title": "Titel", + "library.Artist": "Künstler", + "menu.tools": "Werkzeuge", + "menu.window": "Fenster", + "menu.help": "Hilfe", + "tag.new": "Neuer Tag", + "merge.window_title": "Zusammenführen von doppelten Einträgen", + "merge.merge_dupe_entries": "Zusammenführen von doppelten Einträgen", + "library.author": "Autor", + "library.url": "URL", + "library.date_modified": "Datum geändert", + "home.thumbnail_size": "Grösse des Vorschaubildes", + "home.search_entries": "Nach Einträgen suchen", + "home.search": "Suchen", + "tag.library": "Bibliothek Tags", + "library.description": "Beschreibung", + "library.notes": "Notizen", + "library.tags": "Tags", + "library.date_taken": "Aufnahmedatum", + "library.date": "Datum", + "library.date_created": "Erstellungsdatum", + "library.book": "Buch", + "library.comic": "Comicheft", + "library.manga": "Manga", + "library.source": "Quelle", + "library.date_uploaded": "Hochladedatum", + "library.date_released": "Veröffentlichungsdatum", + "library.volume": "Band", + "library.anthology": "Anthologie", + "library.magazine": "Zeitschrift", + "library.composer": "Komponist", + "open_library.library_creation_return_code": "Bibliothekserstellung Rückgabecode:", + "open_library.title": "Bibliothek", + "dialog.open_create_library": "Bibliothek öffnen/erstellen", + "splash.open_library": "Die Bibliothek wird geöffnet", + "status.save_success": "Bibliothek gespeichert und geschlossen!", + "status.search_library_query": "Suche in der Bibliothek nach", + "status.enumerate_query": "Abfrage:%{Abfrage}, Rahmen: %{i}, Länge: %{len(f)}", + "status.number_results_found": "%{len(all_items)} Ergebnisse gefunden für „%{query}“ (%{format_timespan(end_time - start_time)})", + "status.results_found": "Ergebnisse", + "progression.running_macros.new_entries": "Ausführen von Makros bei neuen Einträgen", + "progression.running_macros.one_new_entry": "Ausführen konfigurierter Makros für 1/%{len(new_ids)} neue Einträge", + "file_opener.open_file": "Datei öffnen:}", + "file_opener.not_found": "Datei nicht gefunden:", + "file_opener.command_not_found": "Konnte %{command_name} nicht im System PATH finden", + "add_field.add": "Feld hinzufügen", + "generic.remove_field": "Feld entfernen", + "generic.file_extension": "Dateierweiterungen", + "generic.open_file": "Datei öffnen", + "generic.open_file_explorer": "Datei im Explorer öffnen", + "generic.cancel": "Abbrechen", + "generic.add": "hinzufügen", + "generic.name": "Name", + "generic.color": "Farbe", + "generic.delete": "Löschen", + "generic.exclude": "ausschliessen", + "generic.include": "einschliessen", + "generic.done": "Fertig", + "generic.close_all": "Alle schliessen", + "generic.refresh_all": "Alle aktualisieren", + "generic.apply": "anwenden", + "generic.mirror": "Spiegel", + "generic.search_tags": "Tags suchen", + "build_tags.add_parent_tags": "Übergeordnete Tags hinzufügen", + "build_tags.parent_tags": "Übergeordnete Tags", + "delete_unlinked.delete_entries": "Einträge am Löschen", + "delete_unlinked.deleting_number_entries": "Löschen von %{x[0]+1}/{len(self.lib.missing_files)} Unverknüpften Einträgen", + "file_extension.add_extension": "Erweiterung hinzufügen", + "fix_dupes.no_file_selected": "Keine DupeGuru-Datei ausgewählt", + "fix_dupes.advice_label": "Nach der Spiegelung können Sie DupeGuru verwenden, um die unerwünschten Dateien zu löschen. Verwenden Sie anschliessend die Funktion „Unverknüpfte Einträge reparieren“ im Menü „Extras“ von TagStudio, um die unverknüpften Einträge zu löschen.", + "fix_dupes.no_file_match": "Übereinstimmungen mit doppelten Dateien: N/A", + "fix_dupes.number_file_match": "Übereinstimmungen mit doppelten Dateien: %{count}", + "fix_unlinked.fix_unlinked": "Unverknüpfte Einträge reparieren", + "fix_unlinked.search_and_relink": "Suche && Neuverbindung", + "fix_unlinked.refresh_dupes": "Doppelte Einträge aktualisieren", + "fix_unlinked.merge_dupes": "Doppelte Einträge zusammenführen", + "fix_unlinked.manual_relink": "Manuelle Neuverknüpfung", + "fix_unlinked.delete_unlinked": "Nicht verknüpfte Einträge löschen", + "fix_unlinked.scan_library.title": "Bibliothek wird scannen", + "fix_unlinked.scan_library.label": "Bibliothek nach nicht verknüpften Einträgen durchsuchen...", + "library.date_published": "Datum des Publizierten", + "library.archived": "Archivierungsdatum", + "library.favorite": "Favoriten", + "library.series": "Serie", + "library.publisher": "Herausgeber", + "library.guest_artist": "Gastkünstler", + "library.comments": "Kommentare", + "open_library.no_tagstudio_library_found": "Keine vorhandene TagStudio-Bibliothek unter '%{Pfad}' gefunden. Eine wird erstellt.", + "generic.shorthand": "Kürzel", + "generic.aliases": "Aliase", + "generic.open_all": "Alle öffnen", + "delete_unlinked.delete_unlinked": "Unverknüpfte Einträge löschen", + "delete_unlinked.confirm": "Sind Sie sicher, dass Sie die folgenden %{len(self.lib.missing_files)}-Einträge löschen wollen?", + "fix_dupes.fix_dupes": "Doppelte Dateien korrigieren", + "fix_dupes.load_file": "DupeGuru-Datei laden", + "fix_dupes.mirror_entries": "Spiegelnde Einträge", + "fix_dupes.mirror_description": "Spiegeln die Eingabedaten für jeden doppelten Abgleichsatz, indem Sie alle Daten kombinieren, ohne Felder zu entfernen oder zu duplizieren. Bei diesem Vorgang werden keine Dateien oder Daten gelöscht.", + "fix_dupes.open_result_files": "DupeGuru Ergebnisdatei öffnen", + "fix_dupes.name_filter": "DupeGuru-Dateien (*.dupeguru)", + "fix_unlinked.description": "Jeder Bibliothekseintrag ist mit einer Datei in einem Ihrer Verzeichnisse verknüpft. Wenn eine Datei, die mit einem Eintrag verknüpft ist, ausserhalb von TagStudio verschoben oder gelöscht wird, gilt sie als nicht verknüpft. Nicht verknüpfte Einträge können durch Durchsuchen Ihrer Verzeichnisse automatisch neu verknüpft, vom Benutzer manuell neu verknüpft oder auf Wunsch gelöscht werden.", + "fix_unlinked.duplicate_description": "Doppelte Einträge sind definiert als mehrere Einträge, die auf dieselbe Datei auf der Festplatte verweisen. Durch das Zusammenführen dieser Einträge werden die Tags und Metadaten aller Duplikate zu einem einzigen konsolidierten Eintrag zusammengefasst. Diese sind nicht zu verwechseln mit „doppelten Dateien“, die Duplikate Ihrer Dateien selbst außerhalb von TagStudio sind.", + "library.content_tags": "Inhalt Tags", + "library.collation": "Zusammenstellung", + "library.meta_tags": "Meta Tags", + "status.backup_success": "Bibliotheks-Backup gespeichert unter:", + "dialog.scan_directories.new_files": "Verzeichnisse nach neuen Dateien durchsuchen...\n%{x + 1} Datei%{„s“ if x + 1 != 1 else „“} Gesucht, %{len(self.lib.files_not_in_library)} Neue Dateien gefunden", + "tooltip.open_library": "Ctrl+O", + "tooltip.save_library": "Ctrl+S", + "progression.running_macros.several_new_entry": "Ausführen konfigurierter Makros für %{x + 1}/%{len(new_ids)} neue Einträge", + "dialog.save_library": "Bibliothek speichern", + "dialog.refresh_directories": "Verzeichnisse werden aktualisiert", + "dialog.scan_directories": "Überprüfe Verzeichnisse auf neue Dateien...\nBereite vor...", + "relink_unlinked.title": "Einträge werden neuverknüpft" +} diff --git a/tagstudio/resources/translations/en.json b/tagstudio/resources/translations/en.json index 016aa323..0f9b61e0 100644 --- a/tagstudio/resources/translations/en.json +++ b/tagstudio/resources/translations/en.json @@ -1,144 +1,144 @@ { - "home.base_title": "TagStudio Alpha", - "home.main_window": "Main Window", - "home.include_all_tags": "And (Includes All Tags)", - "home.include_any_tag": "Or (Includes Any Tag)", - "home.thumbnail_size": "Thumbnail Size", - "home.search_entries": "Search Entries", - "home.search": "Search", - "menu.file": "File", - "menu.edit": "Edit", - "menu.tools": "Tools", - "menu.macros": "Macros", - "menu.window": "Window", - "menu.help": "Help", - "tag.new": "New Tag", - "tag.add": "Add Tag", - "tag.library": "Library Tags", - "merge.window_title": "Merging Duplicate Entries", - "merge.merge_dupe_entries": "Merging Duplicate Entries", - "preview.dimensions": "Dimensions", - "preview.recent": "Recent Libraries", - "library.title": "Title", - "library.author": "Author", - "library.Artist": "Artist", - "library.url": "URL", - "library.description": "Description", - "library.notes": "Notes", - "library.tags": "Tags", - "library.content_tags": "Content Tags", - "library.meta_tags": "Meta Tags", - "library.collation": "Collation", - "library.date": "Date", - "library.date_created": "Date Created", - "library.date_modified": "Date Modified", - "library.date_taken": "Date Taken", - "library.date_published": "Date Published", - "library.archived": "Date Archived", - "library.favorite": "Favorite", - "library.book": "Book", - "library.comic": "Comic", - "library.series": "Series", - "library.manga": "Manga", - "library.source": "Source", - "library.date_uploaded": "Date Uploaded", - "library.date_released": "Date Released", - "library.volume": "Volume", - "library.anthology": "Anthology", - "library.magazine": "Magazine", - "library.publisher": "Publisher", - "library.guest_artist": "Guest Artist", - "library.composer": "Composer", - "library.comments": "Comments", - "open_library.no_tagstudio_library_found": "No existing TagStudio library found at '%{path}'. Creating one.", - "open_library.library_creation_return_code": "Library Creation Return Code:", - "open_library.title": "Library", - "dialog.open_create_library": "Open/Create Library", - "splash.open_library": "Opening Library", - "status.save_success": "Library Saved and Closed!", - "status.backup_success": "Library Backup Saved at:", - "status.search_library_query": "Searching Library for", - "status.enumerate_query": "Query:%{query}, Frame: %{i}, Length: %{len(f)}", - "status.number_results_found": "%{len(all_items)} Results Found for \"%{query}\" (%{format_timespan(end_time - start_time)})", - "status.results_found": "Results", - "dialog.save_library": "Save Library", - "dialog.refresh_directories": "Refreshing Directories", - "dialog.scan_directories": "Scanning Directories for New Files...\nPreparing...", - "dialog.scan_directories.new_files": "Scanning Directories for New Files...\n%{x + 1} File%{\"s\" if x + 1 != 1 else \"\"} Searched, %{len(self.lib.files_not_in_library)} New Files Found", - "tooltip.open_library": "Ctrl+O", - "tooltip.save_library": "Ctrl+S", - "progression.running_macros.new_entries": "Running Macros on New Entries", - "progression.running_macros.one_new_entry": "Running Configured Macros on 1/%{len(new_ids)} New Entries", - "progression.running_macros.several_new_entry": "Running Configured Macros on %{x + 1}/%{len(new_ids)} New Entries", - "file_opener.open_file": "Opening file:}", - "file_opener.not_found": "File not found:", - "file_opener.command_not_found": "Could not find %{command_name} on system PATH", - "add_field.add": "Add Field", - "generic.remove_field": "Remove Field", - "generic.file_extension": "File Extensions", - "generic.open_file": "Open file", - "generic.open_file_explorer": "Open file in explorer", - "generic.cancel": "Cancel", - "generic.add": "Add", - "generic.name": "Name", - "generic.shorthand": "Shorthand", - "generic.aliases": "Aliases", - "generic.color": "Color", - "generic.delete": "Delete", - "generic.exclude": "Exclude", - "generic.include": "Include", - "generic.done": "Done", - "generic.open_all": "Open All", - "generic.close_all": "Close All", - "generic.refresh_all": "Refresh_All", - "generic.apply": "Apply", - "generic.mirror": "Mirror", - "generic.search_tags": "Search Tags", - "build_tags.parent_tags": "Parent Tags", - "build_tags.add_parent_tags": "Add Parent Tags", - "delete_unlinked.delete_unlinked": "Delete Unlinked Entries", - "delete_unlinked.confirm": "Are you sure you want to delete the following %{len(self.lib.missing_files)} entries?", - "delete_unlinked.delete_entries": "Deleting Entries", - "delete_unlinked.deleting_number_entries": "Deleting %{x[0]+1}/{len(self.lib.missing_files)} Unlinked Entries", - "file_extension.add_extension": "Add Extension", - "file_extension.list_mode": "List Mode:", - "fix_dupes.fix_dupes": "Fix Duplicate Files", - "fix_dupes.no_file_selected": "No DupeGuru File Selected", - "fix_dupes.load_file": "Load DupeGuru File", - "fix_dupes.mirror_entries": "Mirror Entries", - "fix_dupes.mirror_description": "Mirror the Entry data across each duplicate match set, combining all data while not removing or duplicating fields. This operation will not delete any files or data.", - "fix_dupes.advice_label": "After mirroring, you're free to use DupeGuru to delete the unwanted files. Afterwards, use TagStudio's \"Fix Unlinked Entries\" feature in the Tools menu in order to delete the unlinked Entries.", - "fix_dupes.open_result_files": "Open DupeGuru Results File", - "fix_dupes.name_filter": "DupeGuru Files (*.dupeguru)", - "fix_dupes.no_file_match": "Duplicate File Matches: N/A", - "fix_dupes.number_file_match": "Duplicate File Matches: %{count}", - "fix_unlinked.fix_unlinked": "Fix Unlinked Entries", - "fix_unlinked.description": "Each library entry is linked to a file in one of your directories. If a file linked to an entry is moved or deleted outside of TagStudio, it is then considered unlinked. Unlinked entries may be automatically relinked via searching your directories, manually relinked by the user, or deleted if desired.", - "fix_unlinked.duplicate_description": "Duplicate entries are defined as multiple entries which point to the same file on disk. Merging these will combine the tags and metadata from all duplicates into a single consolidated entry. These are not to be confused with \"duplicate files\", which are duplicates of your files themselves outside of TagStudio.", - "fix_unlinked.search_and_relink": "Search && Relink", - "fix_unlinked.refresh_dupes": "Refresh Duplicate Entries", - "fix_unlinked.merge_dupes": "Merge Duplicate Entries", - "fix_unlinked.manual_relink": "Manual Relink", - "fix_unlinked.delete_unlinked": "Delete Unlinked Entries", - "fix_unlinked.scan_library.title": "Scanning Library", - "fix_unlinked.scan_library.label": "Scanning Library for Unlinked Entries...", - "folders_to_tags.folders_to_tags": "Converting folders to Tags", - "folders_to_tags.title": "Create Tags From Folders", - "folders_to_tags.description": "Creates tags based on your folder structure and applies them to your entries.\n The structure below shows all the tags that will be created and what entries they will be applied to.", - "mirror_entities.are_you_sure": "Are you sure you want to mirror the following %{len(self.lib.dupe_files)} Entries?", - "mirror_entities.title": "Mirroring Entries", - "mirror_entities.label": "Mirroring 1/%{count} Entries...", - "relink_unlinked.title": "Relinking Entries", - "relink_unlinked.attempt_relink": "Attempting to Relink %{x[0]+1}/%{len(self.lib.missing_files)} Entries, %{self.fixed} Successfully Relinked", - "landing.open_button": "Open/Create Library %{open_shortcut_text}", - "preview_panel.missing_location": "Location is missing", - "preview_panel.update_widgets": "[ENTRY PANEL] UPDATE WIDGETS (%{self.driver.selected})", - "preview_panel.no_items_selected": "No Items Selected", - "preview_panel.confirm_remove": "Are you sure you want to remove this \"%{self.lib.get_field_attr(field, \"name\")}\" field?", - "preview_panel.mixed_data": "Mixed Data", - "preview_panel.edit_name": "Edit", - "preview_panel.unknown_field_type": "Unknown Field Type", - "tag.search_for_tag": "Search for Tag", - "tag.add_search": "Add to Search", - "text_line_edit.unknown_event_type": "unknown event type: %{event}" -} \ No newline at end of file + "home.base_title": "TagStudio Alpha", + "home.main_window": "Main Window", + "home.include_all_tags": "And (Includes All Tags)", + "home.include_any_tag": "Or (Includes Any Tag)", + "home.thumbnail_size": "Thumbnail Size", + "home.search_entries": "Search Entries", + "home.search": "Search", + "menu.file": "File", + "menu.edit": "Edit", + "menu.tools": "Tools", + "menu.macros": "Macros", + "menu.window": "Window", + "menu.help": "Help", + "tag.new": "New Tag", + "tag.add": "Add Tag", + "tag.library": "Library Tags", + "merge.window_title": "Merging Duplicate Entries", + "merge.merge_dupe_entries": "Merging Duplicate Entries", + "preview.dimensions": "Dimensions", + "preview.recent": "Recent Libraries", + "library.title": "Title", + "library.author": "Author", + "library.Artist": "Artist", + "library.url": "URL", + "library.description": "Description", + "library.notes": "Notes", + "library.tags": "Tags", + "library.content_tags": "Content Tags", + "library.meta_tags": "Meta Tags", + "library.collation": "Collation", + "library.date": "Date", + "library.date_created": "Date Created", + "library.date_modified": "Date Modified", + "library.date_taken": "Date Taken", + "library.date_published": "Date Published", + "library.archived": "Date Archived", + "library.favorite": "Favorite", + "library.book": "Book", + "library.comic": "Comic", + "library.series": "Series", + "library.manga": "Manga", + "library.source": "Source", + "library.date_uploaded": "Date Uploaded", + "library.date_released": "Date Released", + "library.volume": "Volume", + "library.anthology": "Anthology", + "library.magazine": "Magazine", + "library.publisher": "Publisher", + "library.guest_artist": "Guest Artist", + "library.composer": "Composer", + "library.comments": "Comments", + "open_library.no_tagstudio_library_found": "No existing TagStudio library found at '%{path}'. Creating one.", + "open_library.library_creation_return_code": "Library Creation Return Code:", + "open_library.title": "Library", + "dialog.open_create_library": "Open/Create Library", + "splash.open_library": "Opening Library", + "status.save_success": "Library Saved and Closed!", + "status.backup_success": "Library Backup Saved at:", + "status.search_library_query": "Searching Library for", + "status.enumerate_query": "Query:%{query}, Frame: %{i}, Length: %{len(f)}", + "status.number_results_found": "%{len(all_items)} Results Found for \"%{query}\" (%{format_timespan(end_time - start_time)})", + "status.results_found": "Results", + "dialog.save_library": "Save Library", + "dialog.refresh_directories": "Refreshing Directories", + "dialog.scan_directories": "Scanning Directories for New Files...\nPreparing...", + "dialog.scan_directories.new_files": "Scanning Directories for New Files...\n%{x + 1} File%{\"s\" if x + 1 != 1 else \"\"} Searched, %{len(self.lib.files_not_in_library)} New Files Found", + "tooltip.open_library": "Ctrl+O", + "tooltip.save_library": "Ctrl+S", + "progression.running_macros.new_entries": "Running Macros on New Entries", + "progression.running_macros.one_new_entry": "Running Configured Macros on 1/%{len(new_ids)} New Entries", + "progression.running_macros.several_new_entry": "Running Configured Macros on %{x + 1}/%{len(new_ids)} New Entries", + "file_opener.open_file": "Opening file:}", + "file_opener.not_found": "File not found:", + "file_opener.command_not_found": "Could not find %{command_name} on system PATH", + "add_field.add": "Add Field", + "generic.remove_field": "Remove Field", + "generic.file_extension": "File Extensions", + "generic.open_file": "Open file", + "generic.open_file_explorer": "Open file in explorer", + "generic.cancel": "Cancel", + "generic.add": "Add", + "generic.name": "Name", + "generic.shorthand": "Shorthand", + "generic.aliases": "Aliases", + "generic.color": "Color", + "generic.delete": "Delete", + "generic.exclude": "Exclude", + "generic.include": "Include", + "generic.done": "Done", + "generic.open_all": "Open All", + "generic.close_all": "Close All", + "generic.refresh_all": "Refresh All", + "generic.apply": "Apply", + "generic.mirror": "Mirror", + "generic.search_tags": "Search Tags", + "build_tags.parent_tags": "Parent Tags", + "build_tags.add_parent_tags": "Add Parent Tags", + "delete_unlinked.delete_unlinked": "Delete Unlinked Entries", + "delete_unlinked.confirm": "Are you sure you want to delete the following %{len(self.lib.missing_files)} entries?", + "delete_unlinked.delete_entries": "Deleting Entries", + "delete_unlinked.deleting_number_entries": "Deleting %{x[0]+1}/{len(self.lib.missing_files)} Unlinked Entries", + "file_extension.add_extension": "Add Extension", + "file_extension.list_mode": "List Mode:", + "fix_dupes.fix_dupes": "Fix Duplicate Files", + "fix_dupes.no_file_selected": "No DupeGuru File Selected", + "fix_dupes.load_file": "Load DupeGuru File", + "fix_dupes.mirror_entries": "Mirror Entries", + "fix_dupes.mirror_description": "Mirror the Entry data across each duplicate match set, combining all data while not removing or duplicating fields. This operation will not delete any files or data.", + "fix_dupes.advice_label": "After mirroring, you're free to use DupeGuru to delete the unwanted files. Afterwards, use TagStudio's \"Fix Unlinked Entries\" feature in the Tools menu in order to delete the unlinked Entries.", + "fix_dupes.open_result_files": "Open DupeGuru Results File", + "fix_dupes.name_filter": "DupeGuru Files (*.dupeguru)", + "fix_dupes.no_file_match": "Duplicate File Matches: N/A", + "fix_dupes.number_file_match": "Duplicate File Matches: %{count}", + "fix_unlinked.fix_unlinked": "Fix Unlinked Entries", + "fix_unlinked.description": "Each library entry is linked to a file in one of your directories. If a file linked to an entry is moved or deleted outside of TagStudio, it is then considered unlinked. Unlinked entries may be automatically relinked via searching your directories, manually relinked by the user, or deleted if desired.", + "fix_unlinked.duplicate_description": "Duplicate entries are defined as multiple entries which point to the same file on disk. Merging these will combine the tags and metadata from all duplicates into a single consolidated entry. These are not to be confused with \"duplicate files\", which are duplicates of your files themselves outside of TagStudio.", + "fix_unlinked.search_and_relink": "Search && Relink", + "fix_unlinked.refresh_dupes": "Refresh Duplicate Entries", + "fix_unlinked.merge_dupes": "Merge Duplicate Entries", + "fix_unlinked.manual_relink": "Manual Relink", + "fix_unlinked.delete_unlinked": "Delete Unlinked Entries", + "fix_unlinked.scan_library.title": "Scanning Library", + "fix_unlinked.scan_library.label": "Scanning Library for Unlinked Entries...", + "folders_to_tags.folders_to_tags": "Converting folders to Tags", + "folders_to_tags.title": "Create Tags From Folders", + "folders_to_tags.description": "Creates tags based on your folder structure and applies them to your entries.\n The structure below shows all the tags that will be created and what entries they will be applied to.", + "mirror_entities.are_you_sure": "Are you sure you want to mirror the following %{len(self.lib.dupe_files)} Entries?", + "mirror_entities.title": "Mirroring Entries", + "mirror_entities.label": "Mirroring 1/%{count} Entries...", + "relink_unlinked.title": "Relinking Entries", + "relink_unlinked.attempt_relink": "Attempting to Relink %{x[0]+1}/%{len(self.lib.missing_files)} Entries, %{self.fixed} Successfully Relinked", + "landing.open_button": "Open/Create Library %{open_shortcut_text}", + "preview_panel.missing_location": "Location is missing", + "preview_panel.update_widgets": "[ENTRY PANEL] UPDATE WIDGETS (%{self.driver.selected})", + "preview_panel.no_items_selected": "No Items Selected", + "preview_panel.confirm_remove": "Are you sure you want to remove this \"%{self.lib.get_field_attr(field, \"name\")}\" field?", + "preview_panel.mixed_data": "Mixed Data", + "preview_panel.edit_name": "Edit", + "preview_panel.unknown_field_type": "Unknown Field Type", + "tag.search_for_tag": "Search for Tag", + "tag.add_search": "Add to Search", + "text_line_edit.unknown_event_type": "unknown event type: %{event}" +} diff --git a/tagstudio/resources/translations/es.json b/tagstudio/resources/translations/es.json new file mode 100644 index 00000000..968ec0cf --- /dev/null +++ b/tagstudio/resources/translations/es.json @@ -0,0 +1,144 @@ +{ + "home.main_window": "Ventana principal", + "tag.library": "Etiquetas de la biblioteca", + "home.base_title": "TagStudio Alfa", + "home.include_all_tags": "Y (Incluye todas las etiquetas)", + "home.thumbnail_size": "Tamaño de la miniatura", + "home.search_entries": "Buscar entradas", + "home.search": "Buscar", + "menu.file": "Archivo", + "menu.edit": "Editar", + "menu.tools": "Herramientas", + "menu.macros": "Macro", + "menu.window": "Ventana", + "menu.help": "Ayuda", + "tag.new": "Nueva etiqueta", + "tag.add": "Añadir etiqueta", + "home.include_any_tag": "O (Incluye cualquier etiqueta)", + "merge.merge_dupe_entries": "Fusionando entradas duplicadas", + "preview.recent": "Bibliotecas recientes", + "library.author": "Autor", + "library.Artist": "Artista", + "library.url": "URL", + "library.description": "Descripción", + "library.notes": "Notas", + "library.tags": "Etiquetas", + "library.title": "Título", + "merge.window_title": "Fusionando entradas duplicadas", + "preview.dimensions": "Dimensiones", + "library.content_tags": "Etiquetas del contenido", + "library.meta_tags": "Etiquetas de metadatos", + "library.collation": "Recopilación", + "library.date": "Fecha", + "library.date_created": "Fecha de creación", + "library.date_modified": "Fecha de modificación", + "library.date_taken": "Fecha de realización", + "library.archived": "Fecha de archivo", + "library.source": "Fuente", + "library.date_published": "Fecha de publicación", + "library.series": "Series", + "library.favorite": "Favorito", + "library.book": "Libro", + "library.comic": "Tebeo", + "library.manga": "Manga", + "library.date_uploaded": "Fecha de carga", + "library.date_released": "Fecha de lanzamiento", + "library.volume": "Volumen", + "library.anthology": "Antología", + "library.magazine": "Revista", + "library.publisher": "Editor", + "library.composer": "Compositor", + "library.comments": "Comentarios", + "open_library.no_tagstudio_library_found": "No se encontró ninguna biblioteca TagStudio existente en '%{path}'. Se está creando una.", + "open_library.library_creation_return_code": "Código de retorno de creación de biblioteca:", + "open_library.title": "Biblioteca", + "dialog.open_create_library": "Abrir/Crear biblioteca", + "splash.open_library": "Abriendo la biblioteca", + "status.search_library_query": "Buscando en la biblioteca", + "status.enumerate_query": "Consulta:%{query}, Cuadro: %{i}, Longitud: %{len(f)}", + "dialog.scan_directories.new_files": "Buscando archivos nuevos en los directorios...\n%{x + 1} Archivo%{\"s\" if x + 1 != 1 else \"\"} Buscado, %{len(self.lib.files_not_in_library)} Archivos nuevos encontrados", + "tooltip.open_library": "Ctrl+O", + "tooltip.save_library": "Ctrl+S", + "progression.running_macros.new_entries": "Ejecución de macros en entradas nuevas", + "progression.running_macros.one_new_entry": "Ejecución de macros configurados en 1/%{len(new_ids)} entradas nuevas", + "library.guest_artist": "Artista invitado", + "status.save_success": "¡Biblioteca guardada y cerrada!", + "status.backup_success": "Copia de seguridad de la biblioteca guardada en:", + "status.number_results_found": "%{len(all_items)} Resultados encontrados para \"%{query}\" (%{format_timespan(end_time - start_time)})", + "status.results_found": "Resultados", + "dialog.save_library": "Guardar la biblioteca", + "dialog.refresh_directories": "Refrescar directorios", + "dialog.scan_directories": "Buscar archivos nuevos en los directorios...\nPreparando...", + "progression.running_macros.several_new_entry": "Ejecución de macros configurados en %{x + 1}/%{len(new_ids)} entradas nuevas", + "file_opener.open_file": "Abriendo archivo :}", + "file_opener.not_found": "Archivo no encontrado:", + "file_opener.command_not_found": "No se pudo encontrar %{command_name} en el PATH del sistema", + "add_field.add": "Añadir campo", + "generic.remove_field": "Eliminar campo", + "generic.file_extension": "Extensiones del archivo", + "generic.open_file": "Abrir archivo", + "generic.open_file_explorer": "Abrir archivo en el explorador", + "generic.cancel": "Cancelar", + "generic.exclude": "Excluir", + "generic.include": "Incluir", + "generic.done": "Donar", + "generic.open_all": "Abrir todo", + "generic.close_all": "Cerrar todo", + "generic.add": "Añadir", + "generic.name": "Nombre", + "generic.shorthand": "Taquigrafía", + "generic.aliases": "Alias", + "generic.color": "Color", + "generic.delete": "Borrar", + "generic.refresh_all": "Recargar todo", + "generic.apply": "Aplicar", + "generic.mirror": "Espejo", + "build_tags.parent_tags": "Etiquetas principales", + "build_tags.add_parent_tags": "Añadir etiquetas principales", + "delete_unlinked.confirm": "¿Está seguro de que desea eliminar las siguientes %{len(self.lib.missing_files)} entradas?", + "delete_unlinked.delete_entries": "Eliminando entradas", + "delete_unlinked.deleting_number_entries": "Eliminando %{x[0]+1}/{len(self.lib.missing_files)} entradas no vinculadas", + "file_extension.add_extension": "Añadir extensión", + "file_extension.list_mode": "Modo de lista:", + "fix_dupes.fix_dupes": "Reparar archivos duplicados", + "fix_dupes.no_file_selected": "No se ha seleccionado ningún archivo DupeGuru", + "fix_dupes.load_file": "Cargar archivo DupeGuru", + "generic.search_tags": "Buscar etiquetas", + "delete_unlinked.delete_unlinked": "Eliminar entradas no vinculadas", + "fix_dupes.mirror_description": "Reflejar los datos de entrada en cada conjunto de coincidencias duplicadas, combinando todos los datos sin eliminar ni duplicar campos. Esta operación no eliminará ningún archivos ni dato.", + "fix_dupes.name_filter": "Archivos DupeGuru (*.dupeguru)", + "fix_dupes.no_file_match": "Coincidencias de archivos duplicados: N/D", + "fix_unlinked.search_and_relink": "Buscar y volver a vincular", + "fix_unlinked.refresh_dupes": "Recargar entradas duplicadas", + "fix_unlinked.merge_dupes": "Fusionar entradas duplicadas", + "fix_dupes.mirror_entries": "Reflejar entradas", + "fix_dupes.open_result_files": "Abrir el archivo de resultados de DupeGuru", + "fix_dupes.number_file_match": "Coincidencias de archivos duplicados: %{count}", + "fix_dupes.advice_label": "Después de la duplicación, puede utilizar DupeGuru para eliminar los archivos no deseados. Luego, utilice la función \"Reparar entradas no vinculadas\" de TagStudio en el menú Herramientas para eliminar las entradas no vinculadas.", + "fix_unlinked.fix_unlinked": "Corregir entradas no vinculadas", + "fix_unlinked.description": "Cada entrada de la biblioteca está vinculada a un archivo en uno de sus directorios. Si un archivo vinculado a una entrada se mueve o se elimina fuera de TagStudio, se considerará desvinculado. Las entradas no vinculadas se pueden volver a vincular automáticamente mediante una búsqueda en sus directorios, el usuario puede volver a vincularlas manualmente o eliminarlas si así lo desea.", + "fix_unlinked.duplicate_description": "Las entradas duplicadas se definen como múltiples entradas que apuntan al mismo archivo en el disco. Al fusionarlas, se combinarán las etiquetas y los metadatos de todos los duplicados en una única entrada consolidada. No deben confundirse con los \"archivos duplicados\", que son duplicados de sus archivos fuera de TagStudio.", + "fix_unlinked.manual_relink": "Reenlace manual", + "fix_unlinked.delete_unlinked": "Borrar entradas no vinculadas", + "fix_unlinked.scan_library.title": "Escaneando la biblioteca", + "fix_unlinked.scan_library.label": "Buscando entradas no enlazadas en la biblioteca...", + "folders_to_tags.folders_to_tags": "Convertir carpetas en etiquetas", + "mirror_entities.are_you_sure": "¿Estás seguro de que quieres reflejar las siguientes %{len(self.lib.dupe_files)} entradas?", + "mirror_entities.title": "Entradas reflejadas", + "preview_panel.missing_location": "Falta la ubicación", + "folders_to_tags.title": "Crear etiquetas a partir de carpetas", + "folders_to_tags.description": "Crea etiquetas basadas en su estructura de carpetas y las aplica a sus entradas.\n La siguiente estructura muestra todas las etiquetas que se crearán y a qué entradas se aplicarán.", + "landing.open_button": "Abrir/Crear biblioteca %{open_shortcut_text}", + "relink_unlinked.title": "Volver a vincular las entradas", + "mirror_entities.label": "Reflejando 1/%{count} Entradas...", + "relink_unlinked.attempt_relink": "Intentando volver a vincular %{x[0]+1}/%{len(self.lib.missing_files)} Entradas, %{self.fixed} Reenlazado correctamente", + "preview_panel.update_widgets": "[PANEL DE ENTRADA] ACTUALIZAR WIDGETS (%{self.driver.selected})", + "preview_panel.no_items_selected": "No hay elementos seleccionados", + "preview_panel.confirm_remove": "¿Está seguro de que desea eliminar este campo \"%{self.lib.get_field_attr(field, \"name\")}\"?", + "preview_panel.mixed_data": "Datos variados", + "text_line_edit.unknown_event_type": "tipo de suceso desconocido: %{event}", + "preview_panel.edit_name": "Editar", + "tag.add_search": "Añadir a la búsqueda", + "preview_panel.unknown_field_type": "Tipo de campo desconocido", + "tag.search_for_tag": "Buscar por etiqueta" +} diff --git a/tagstudio/resources/translations/fr.json b/tagstudio/resources/translations/fr.json new file mode 100644 index 00000000..0c24bc19 --- /dev/null +++ b/tagstudio/resources/translations/fr.json @@ -0,0 +1,144 @@ +{ + "home.include_all_tags": "Et (Inclus tous les Labels)", + "home.base_title": "TagStudio Alpha", + "home.main_window": "Fenêtre Principale", + "home.thumbnail_size": "Taille de la miniature", + "home.search_entries": "Recherche", + "home.search": "Rechercher", + "menu.file": "Fichier", + "menu.edit": "Édition", + "menu.tools": "Outils", + "menu.window": "Fenêtre", + "tag.new": "Nouveau Label", + "tag.add": "Ajouter un Label", + "tag.library": "Labels de la Bibliothèque", + "merge.merge_dupe_entries": "Fusionner les duplicatas", + "merge.window_title": "Fusionner les duplicatas", + "library.content_tags": "Labels de Contenu", + "library.url": "URL", + "preview.dimensions": "Dimensions", + "library.description": "Description", + "library.notes": "Notes", + "library.date_created": "Date de Création", + "library.date_published": "Date de Publication", + "library.archived": "Date d'Archivage", + "library.book": "Livre", + "library.comic": "Bande Dessinée", + "library.series": "Séries", + "library.date_uploaded": "Date de Mise en Ligne", + "library.anthology": "Anthologie", + "library.publisher": "Éditeur", + "library.guest_artist": "Artiste Invité", + "library.composer": "Compositeur", + "library.comments": "Commentaires", + "open_library.no_tagstudio_library_found": "Aucune bibliothèque TagStudio trouvé au chemin '%{path}'. Création d'une bibliothèque.", + "dialog.open_create_library": "Ouvrir/Créer une Bibliothèque", + "splash.open_library": "Ouverture de la Bilbliothèque", + "status.save_success": "Bibliothèque Sauvegardée et Fermée !", + "status.backup_success": "Bibliothèque sauvegardée au chemin  :", + "status.search_library_query": "Recherche dans la Bibliothèque pour", + "library.manga": "Manga", + "library.source": "Source", + "library.volume": "Volume", + "library.magazine": "Magazine", + "menu.help": "Aide", + "library.Artist": "Artiste", + "preview.recent": "Bibliothèques Récentes", + "library.author": "Auteur", + "library.tags": "Labels", + "library.meta_tags": "Label Meta", + "library.title": "Titre", + "library.date_modified": "Date de Modification", + "library.date_taken": "Date de Capture", + "library.favorite": "Favori", + "library.date_released": "Date de Sortie", + "open_library.title": "Bibliothèque", + "open_library.library_creation_return_code": "Code de Retour de la Création de bibliothèque:", + "status.results_found": "Résultats", + "dialog.save_library": "Sauvegarder la Bibliothèque", + "add_field.add": "Ajouter un Champ", + "generic.remove_field": "Supprimer un Champ", + "generic.file_extension": "Extensions de Fichiers", + "generic.open_file": "Ouvrir un Fichier", + "generic.open_file_explorer": "Ouvrir un Fichier dans l'Explorateur", + "generic.name": "Nom", + "generic.shorthand": "Abrégé", + "generic.aliases": "Alias", + "generic.color": "Couleur", + "generic.delete": "Supprimer", + "generic.exclude": "Exclure", + "generic.include": "Inclure", + "generic.done": "Terminé", + "generic.open_all": "Tout Ouvrir", + "generic.close_all": "Tout Fermer", + "generic.refresh_all": "Tout Rafraîchir", + "generic.apply": "Appliquer", + "generic.search_tags": "Recherche de Labels", + "build_tags.parent_tags": "Labels Parent", + "generic.mirror": "Refléter", + "build_tags.add_parent_tags": "Ajouter des Labels Parents", + "delete_unlinked.delete_unlinked": "Supprimer les Entrées non Liées", + "delete_unlinked.confirm": "Êtes-vous sûr de vouloir supprimer les %{len(self.lib.missing_files)} entrées suivantes  ?", + "delete_unlinked.delete_entries": "Suppression des Entrées", + "file_extension.add_extension": "Ajouter une Extension", + "file_extension.list_mode": "Mode Liste :", + "fix_dupes.fix_dupes": "Réparer les Fichiers en Double", + "fix_dupes.no_file_selected": "Aucun Fichier DupeGuru Sélectionné", + "fix_dupes.mirror_entries": "Répliquer les Entrées", + "generic.cancel": "Annuler", + "generic.add": "Ajouter", + "delete_unlinked.deleting_number_entries": "Suppression des Entrées non Liées %{x[0]+1}/{len(self.lib.missing_files)}", + "fix_dupes.load_file": "Charger un Fichier DupeGuru", + "fix_dupes.mirror_description": "Repliquer les données d'entrée dans chaque jeu de correspondances en double, en combinant toutes les données sans supprimer ni dupliquer de champs. Cette opération ne supprime aucun fichier ni aucune donnée.", + "home.include_any_tag": "Ou (Inclus N'importe quel Label)", + "menu.macros": "Macros", + "library.collation": "Collage", + "library.date": "Date", + "status.enumerate_query": "Requête:%{query}, Image: %{i}, Longueur: %{len(f)}", + "status.number_results_found": "%{len(all_items)} Résultats Trouvés pour \"%{query}\" (%{format_timespan(end_time - start_time)})", + "dialog.refresh_directories": "Rafraîchissement des Dossiers", + "dialog.scan_directories": "Recherche de Nouveaux Fichiers dans les Dossiers...\nPréparation...", + "dialog.scan_directories.new_files": "Recherche de Nouveaux Fichiers dans les Dossiers...\n%{x + 1} Fichiers%{\"s\" if x + 1 != 1 else \"\"} Recherchés, %{len(self.lib.files_not_in_library)} Nouveaux Fichiers Trouvés", + "tooltip.open_library": "Ctrl+O", + "tooltip.save_library": "Ctrl+S", + "progression.running_macros.new_entries": "Exécution des Macros sur les Nouvelles Entrées", + "progression.running_macros.one_new_entry": "Éxecution des Macros Configurées sur 1/%{len(new_ids)} Nouvelles Entrées", + "progression.running_macros.several_new_entry": "Éxectution des Macros Configurées sur %{x + 1}/%{len(new_ids)} Nouvelles Entrées", + "file_opener.open_file": "Ouverture du Fichier:}", + "file_opener.not_found": "Fichier non trouvé:", + "file_opener.command_not_found": "Impossible de trouver %{command_name} dans le CHEMIN système", + "fix_dupes.advice_label": "Après réplication, vous êtes libre d'utiliser DupeGuru pour supprimer des fichiers non désirés. Ensuite, utilisez la fonctionnalité \"Réparation des Entrées non Liées\" de TagStudio dans le menu Outils pour supprimer les Entrées non liées.", + "fix_dupes.open_result_files": "Ouvrire les Fichiers de Résultats de DupeGuru", + "fix_dupes.name_filter": "Fichiers DupeGuru (*.dupeguru)", + "fix_dupes.number_file_match": "Dupliquer les Correspondances de Fichier : %{count}", + "fix_dupes.no_file_match": "Dupliquer les Correspondances de Fichier : N/A", + "fix_unlinked.fix_unlinked": "Réparation des Entrées non Liées", + "fix_unlinked.search_and_relink": "Rechercher && Relier", + "fix_unlinked.refresh_dupes": "Rafraichir les Entrées en Doublon", + "fix_unlinked.merge_dupes": "Fusionner les Entrées en Doublon", + "fix_unlinked.manual_relink": "Reliage Manuel", + "fix_unlinked.delete_unlinked": "Supprimer les Entrées non Liées", + "fix_unlinked.scan_library.title": "Balayage de la Bibliothèque", + "folders_to_tags.folders_to_tags": "Conversion des dossiers en Labels", + "folders_to_tags.title": "Créer un Label à partir d'un Dossier", + "mirror_entities.are_you_sure": "Êtes-vous sûr de vouloir répliquer les %{len(self.lib.dupe_files)} Entrées suivantes ?", + "relink_unlinked.attempt_relink": "Tentative de Reliage de %{x[0]+1}/%{len(self.lib.missing_files)} Entrées, %{self.fixed} ont été Reliées avec Succès", + "preview_panel.missing_location": "Emplacement Manquant", + "preview_panel.update_widgets": "[PANEL D'ENTRÉE] MISE À JOUR DES WIDGETS (%{self.driver.selected})", + "preview_panel.confirm_remove": "Êtes-vous sûr de vouloir supprimer le champ \"%{self.lib.get_field_attr(field, \"name\")}\" ?", + "preview_panel.edit_name": "Éditer", + "preview_panel.unknown_field_type": "Type de Champ Inconnu", + "text_line_edit.unknown_event_type": "Type d'évenement inconnu : %{event}", + "fix_unlinked.description": "Chaque entrée dans la bibliothèque est liée à un fichier dans l'un de vos dossiers. Si un fichier lié à une entrée est déplacé ou supprimé en dehors de TagStudio, il est alors considéré non lié. Les entrées non liées peuvent être automatiquement reliées via la recherche dans vos dossiers, reliées manuellement par l'utilisateur, ou supprimées si désiré.", + "fix_unlinked.duplicate_description": "Les entrées dupliquées sont définies comme des entrées multiple qui pointent vers le même fichier sur le disque. Les fusionner va combiner les labels et metadatas de tous les duplicatas vers une seule entrée consolidée. Elles ne doivent pas être confondues avec les \"fichiers en doublon\", qui sont des doublons de vos fichiers en dehors de TagStudio.", + "fix_unlinked.scan_library.label": "Balayage de la Bibliothèque pour trouver des Entrées non Liées...", + "relink_unlinked.title": "Reliage des Entrées", + "mirror_entities.title": "Réplication des Entrées", + "mirror_entities.label": "Réplication de 1/%{count} Entrées...", + "landing.open_button": "Ouvrir/Créer une Bibliothèque %{open_shortcut_text}", + "preview_panel.no_items_selected": "Pas d'Objet Selectionné", + "tag.add_search": "Ajouter à la Recherche", + "preview_panel.mixed_data": "Données Mélangées", + "tag.search_for_tag": "Recherche de Label", + "folders_to_tags.description": "Créé des labels basés sur votre arborescence de dossier et les applique à vos entrées.\nLa structure ci-dessous affiche tous les labels qui seront créés et à quelles entrées ils seront appliqués." +} diff --git a/tagstudio/resources/translations/hu.json b/tagstudio/resources/translations/hu.json new file mode 100644 index 00000000..f6f7144c --- /dev/null +++ b/tagstudio/resources/translations/hu.json @@ -0,0 +1,144 @@ +{ + "fix_dupes.mirror_description": "Az összes adat átmásolása minden összetartozó fájl között, ezzel kiegészítve a hiányzó címkéket eltávolítás és duplikálás nélkül. Ez a folyamat nem fog adatokat vagy fájlokat törölni.", + "fix_unlinked.fix_unlinked": "Kapcsolat nélküli elemek javítása", + "fix_dupes.advice_label": "A tükrözés befejezése után a DupeGuruval kitörölheti a nem kívánt fájlokat. Ezt követően, a TagStudio „Kapcsolat nélküli elemek javítása” funkciójával eltávolíthatja az árván maradt elemeket.", + "home.include_all_tags": "És (az összes keresett címkét tartalmazza)", + "home.include_any_tag": "Vagy (valamelyik keresett címkét tartalmazza)", + "home.thumbnail_size": "Indexkép mérete", + "menu.tools": "Eszközök", + "menu.macros": "Makrók", + "tag.new": "Új címke", + "tag.add": "Címke hozzáadása", + "merge.window_title": "Egyező elemek egyesítése", + "merge.merge_dupe_entries": "Egyező elemek egyesítése", + "preview.dimensions": "Méret", + "library.title": "Cím", + "library.url": "Hivatkozás", + "library.tags": "Címkék", + "library.collation": "Rendezés", + "library.notes": "Jegyzetek", + "library.date_taken": "Készítés dátuma", + "library.date_published": "Közzététel dátuma", + "library.archived": "Archiválás dátuma", + "library.favorite": "Kedvenc", + "library.book": "Könyv", + "library.comic": "Képregény", + "library.anthology": "Gyűjtemény", + "library.magazine": "Magazin", + "library.guest_artist": "Társelőadó", + "library.composer": "Zeneszerző", + "library.comments": "Megjegyzés", + "open_library.library_creation_return_code": "A könyvtárlétrehozási folyamat visszatérési kódja:", + "status.save_success": "A könyvtár mentése és bezárása sikeresen megtörtént.", + "status.backup_success": "A biztonsági mentés létrehozása megtörtént az alábbi elérési úton:", + "status.number_results_found": "%{len(all_items)} találat az alábbi kifejezésre: „%{query}” (%{format_timespan(end_time - start_time)})", + "status.results_found": "találat", + "dialog.save_library": "Könyvtár mentése", + "dialog.refresh_directories": "Mappák frissítése", + "dialog.scan_directories.new_files": "Új fájlok keresése a mappákban…\n%{x + 1} fájl megvizsgálva; ebből %{len(self.lib.files_not_in_library)} új", + "tooltip.open_library": "Ctrl+O", + "tooltip.save_library": "Ctrl+S", + "progression.running_macros.new_entries": "Makrók futtatása az új elemeken", + "file_opener.open_file": "Fájl megnyitása:", + "file_opener.not_found": "Az alábbi fájl nem található:", + "file_opener.command_not_found": "A(z) „%{command_name}”-parancs nem szerepel a rendszer PATH-változójában.", + "add_field.add": "Új mező", + "generic.remove_field": "Mező eltávolítása", + "generic.file_extension": "Kiterjesztések", + "generic.open_file": "Fájl megnyitása", + "generic.open_file_explorer": "Fájl megnyitása Intézőben", + "generic.cancel": "Mégse", + "generic.add": "Hozzáadás", + "generic.name": "Név", + "generic.aliases": "Áljelek", + "generic.color": "Szín", + "generic.delete": "Törlés", + "generic.done": "Kész", + "generic.include": "Mutatás", + "generic.exclude": "Elrejtés", + "build_tags.add_parent_tags": "Új szülőcímke", + "delete_unlinked.delete_unlinked": "Kapcsolat nélküli elemek törlése", + "delete_unlinked.confirm": "Biztosan törölni akarja az alábbi %{len(self.lib.missing_files)} elemet?", + "file_extension.add_extension": "Kiterjesztés hozzáadása", + "file_extension.list_mode": "Listázott elemek módja:", + "fix_dupes.fix_dupes": "Egyező fájlok egyesítése", + "fix_dupes.no_file_selected": "Nincs kiválasztott DupeGuru-fájl.", + "fix_dupes.load_file": "DupeGuru fájl betöltése", + "fix_dupes.mirror_entries": "Elemek tükrözése", + "fix_dupes.open_result_files": "DupeGuru-fájl megnyitása", + "fix_dupes.name_filter": "DupeGuru-fájlok (*.dupeguru)", + "fix_unlinked.search_and_relink": "Keresés és újra összekapcsolás", + "fix_unlinked.refresh_dupes": "Egyező elemek frissítése", + "fix_unlinked.merge_dupes": "Egyező elemek egyesítése", + "fix_unlinked.manual_relink": "Újra összekapcsolás kézileg", + "fix_unlinked.delete_unlinked": "Kapcsolat nélküli elemek törlése", + "fix_unlinked.scan_library.title": "Könyvtár vizsgálata", + "fix_unlinked.scan_library.label": "Kapcsolat nélküli elemek keresése a könyvtárban…", + "folders_to_tags.folders_to_tags": "Mappák címkékké alakítása", + "folders_to_tags.title": "Címkék létrehozása mappák alapján", + "mirror_entities.are_you_sure": "Biztosan tükrözni akarja az alábbi adatokat %{len(self.lib.dupe_files)} különböző elemre?", + "mirror_entities.title": "Elemek tükrözése", + "mirror_entities.label": "%{count}/1 elem tükrözése folyamatban…", + "landing.open_button": "Könyvtár megnyitása/létrehozása %{open_shortcut_text}", + "preview_panel.missing_location": "Hiányzó hely", + "preview_panel.no_items_selected": "Nincs kijelölt elem", + "preview_panel.confirm_remove": "Biztosan el akarja távolítani a(z) „%{self.lib.get_field_attr(field, \"name\")}”-mezőt?", + "preview_panel.mixed_data": "Kevert adatok", + "preview_panel.edit_name": "Szerkesztés", + "text_line_edit.unknown_event_type": "Ismeretlen eseménytípus: %{event}", + "tag.search_for_tag": "Címke keresése", + "tag.add_search": "Keresési kifejezés kiegészítése", + "home.base_title": "TagStudio Alfa", + "home.main_window": "Fő ablak", + "home.search_entries": "Tételek keresése", + "home.search": "Keresés", + "menu.file": "Fájl", + "menu.edit": "Szerkesztés", + "menu.window": "Ablak", + "menu.help": "Súgó", + "tag.library": "Könyvtárcímkék", + "library.author": "Szerző", + "library.meta_tags": "Metacímkék", + "library.Artist": "Előadó", + "library.description": "Leírás", + "preview.recent": "Legutóbbi könytárak", + "library.content_tags": "Tartalomcímkék", + "library.publisher": "Kiadó", + "library.date": "Dátum", + "library.date_created": "Létrehozás dátuma", + "library.manga": "Manga", + "library.date_modified": "Módosítás dátuma", + "library.series": "Sorozat", + "library.date_uploaded": "Feltöltés dátuma", + "library.source": "Forrás", + "library.date_released": "Kiadás dátuma", + "library.volume": "Kötet", + "dialog.open_create_library": "Könyvtár megnyitása/létrehozása", + "open_library.no_tagstudio_library_found": "A program nem talált létező TagStudio-könyvtárat az alábbi elérési úton: „%{path}”. Ezen a helyen egy új könyvtár lesz létrehozva.", + "open_library.title": "Könyvtár", + "splash.open_library": "Könyvtár megnyitása", + "status.search_library_query": "Az alábbi kifejezés keresése a könyvtárban:", + "status.enumerate_query": "Keresési kifejezés: %{query}; %{i}. képokcka; Hossz: %{len(f)}", + "dialog.scan_directories": "Új fájlok keresése a mappákban…\nElőkészítés…", + "progression.running_macros.one_new_entry": "Korábban beállított makrók futtatása %{len(new_ids)}/1 új elemen", + "progression.running_macros.several_new_entry": "Korábban beállított makrók futtatása %{len(new_ids)}/%{x + 1} új elemen", + "generic.mirror": "Tükrözés", + "generic.shorthand": "Rövidítés", + "generic.open_all": "Összes megnyitása", + "generic.refresh_all": "Összes frissítése", + "generic.close_all": "Összes bezárása", + "generic.apply": "Alkalmaz", + "delete_unlinked.deleting_number_entries": "{len(self.lib.missing_files)}/%{x[0]+1}. kapcsolat nélküli elem törlése", + "generic.search_tags": "Címkék keresése", + "build_tags.parent_tags": "Szülőcímkék", + "delete_unlinked.delete_entries": "Elemek törlése", + "folders_to_tags.description": "Címkék automatikus létrehozása a létező mappastruktúra alapján.\nAz alábbi mappafán megtekintheti a létrehozandó címkéket, és hogy mely elemekre lesznek alkalmazva.", + "relink_unlinked.title": "Elemek újra összekapcsolása", + "relink_unlinked.attempt_relink": "%{len(self.lib.missing_files)}/%{x[0]+1} elem újra összekapcsolásának megkísérlése; %{self.fixed} elem sikeresen újra összekapcsolva", + "preview_panel.unknown_field_type": "Ismeretlen mezőtípus", + "fix_dupes.no_file_match": "Nincsenek egyező fájlok", + "fix_dupes.number_file_match": "%{count} egyező fájl", + "fix_unlinked.description": "A könyvtár minden eleme egy fájllal van összekapcsolva a számítógépen. Ha egy kapcsolt fájl a TagSudión kívül kerül áthelyezésre vagy törésre, akkor ez a kapcsolat megszakad. Ezeket a kapcsolat nélküli elemeket a program megpróbálhatja automatikusan megkeresni, de Ön is kézileg újra összekapcsolhatja vagy törölheti őket.", + "fix_unlinked.duplicate_description": "Ha több elem ugyanazzal a fájllal van összekapcsolva, akkor egyezőnek számítanak. Ha egyesíti őket, akkor egy olyan elem lesz létrehozva, ami az eredeti elemek összes adatát tartalmazza. Ezeket nem szabad összetéveszteni az „egyező fájlokkal”, amelyek a TagStudión kívüli azonos tartalmú fájlok.", + "preview_panel.update_widgets": "[ENTRY PANEL] UPDATE WIDGETS (%{self.driver.selected})" +} diff --git a/tagstudio/resources/translations/it.json b/tagstudio/resources/translations/it.json new file mode 100644 index 00000000..cbed769a --- /dev/null +++ b/tagstudio/resources/translations/it.json @@ -0,0 +1,19 @@ +{ + "generic.color": "Colore", + "generic.cancel": "Annulla", + "home.search": "Cerca", + "library.Artist": "Artista", + "home.base_title": "TagStudio Alfa", + "library.title": "Titolo", + "menu.file": "File", + "library.book": "Libro", + "menu.window": "Finestra", + "home.main_window": "Finestra principale", + "tag.new": "Nuovo Tag", + "library.description": "Descrizione", + "generic.name": "Nome", + "generic.add": "Aggiungi", + "generic.delete": "Elimina", + "tag.add": "Aggiungi Tag", + "preview.recent": "Librerias Recenti" +} diff --git a/tagstudio/resources/translations/nb_NO.json b/tagstudio/resources/translations/nb_NO.json new file mode 100644 index 00000000..8c5cccfb --- /dev/null +++ b/tagstudio/resources/translations/nb_NO.json @@ -0,0 +1,102 @@ +{ + "home.main_window": "Hovedvindu", + "home.thumbnail_size": "Miniatyrbildestørrelse", + "home.search_entries": "Søk etter oppføringer", + "home.search": "Søk", + "tag.new": "Ny etikett", + "tag.add": "Legg til etikett", + "tag.library": "Biblioteksetiketter", + "merge.merge_dupe_entries": "Fletter duplikatoppføringer …", + "preview.dimensions": "Dimensjoner", + "preview.recent": "Nylige bibliotek", + "library.url": "Nettadresse", + "library.description": "Beskrivelse", + "library.notes": "Notater", + "library.tags": "Etiketter", + "library.content_tags": "Innholdsetiketter", + "library.meta_tags": "Metaetiketter", + "library.date_published": "Publiseringsdato", + "library.archived": "Arkiveringsdato", + "library.date_uploaded": "Opplastingsdato", + "library.date_released": "Slippdato", + "library.comments": "Kommentarer", + "open_library.title": "Bibliotek", + "dialog.open_create_library": "Åpne/opprett bibliotek", + "library.guest_artist": "Gjesteartist", + "generic.add": "Legg til", + "generic.name": "Navn", + "generic.color": "Farge", + "generic.delete": "Slett", + "generic.done": "Ferdig", + "fix_dupes.fix_dupes": "Fiks duplikatfiler", + "fix_dupes.no_file_selected": "Ingen DupeGuru-fil valgt", + "fix_dupes.load_file": "Last inn DupeGuru-fil", + "fix_dupes.mirror_entries": "Speil oppføringer", + "preview_panel.edit_name": "Rediger", + "preview_panel.unknown_field_type": "Ukjent felttype", + "tag.search_for_tag": "Søk etter etikett", + "tag.add_search": "Legg til søk", + "menu.file": "Fil", + "menu.window": "Vindu", + "menu.edit": "Rediger", + "menu.macros": "Makroer", + "menu.tools": "Verktøy", + "library.magazine": "Magasin", + "menu.help": "Hjelp", + "library.date_modified": "Endringsdato", + "merge.window_title": "Fletter duplikatoppføringer …", + "library.manga": "Manga", + "library.source": "Kilde", + "tooltip.save_library": "Ctrl+S", + "library.date": "Dato", + "library.favorite": "Favoritt", + "library.comic": "Tegneserie", + "library.series": "Serie", + "library.date_created": "Dato opprettet", + "library.date_taken": "Dato knipset", + "library.book": "Bok", + "splash.open_library": "Åpner bibliotek …", + "preview_panel.no_items_selected": "Ingen elementer valgt", + "dialog.save_library": "Lagre bibliotek", + "tooltip.open_library": "Ctrl+O", + "generic.file_extension": "Filutvidelse", + "file_opener.not_found": "Fant ikke filen:", + "add_field.add": "Legg til felt", + "generic.remove_field": "Fjern felt", + "generic.include": "Inkluder", + "generic.open_file": "Åpne fil", + "generic.exclude": "Utelat", + "generic.open_file_explorer": "Åpne fil i utforsker", + "generic.cancel": "Avbryt", + "generic.open_all": "Åpne alle", + "generic.close_all": "Lukk alle", + "generic.mirror": "Speil", + "generic.refresh_all": "Gjenoppfrisk alle", + "generic.apply": "Bruk", + "generic.search_tags": "Søk etter etiketter", + "text_line_edit.unknown_event_type": "ukjent begivenhetstype: %{event}", + "library.Artist": "Artist", + "library.publisher": "Utgiver", + "library.author": "Forfatter", + "status.save_success": "Bibliotek lagret og lukket.", + "status.backup_success": "Kopi av bibliotek lagret i:", + "status.search_library_query": "Søker i biblioteket etter", + "status.results_found": "Resultat", + "file_opener.open_file": "Åpner fil :}", + "delete_unlinked.confirm": "Slett følgende %{len(self.lib.missing_files)} oppføringer?", + "delete_unlinked.delete_entries": "Sletting av oppføringer", + "file_extension.add_extension": "Legg til utvidelse", + "file_extension.list_mode": "Listemodus:", + "fix_dupes.name_filter": "DupeGuru-filer (*.dupeguru)", + "fix_unlinked.fix_unlinked": "Fiks ulenkede oppføringer", + "fix_dupes.open_result_files": "Åpne DupeGuru-resultatfil", + "fix_unlinked.scan_library.title": "Skanning av bibliotek", + "folders_to_tags.title": "Opprett etiketter fra mapper", + "preview_panel.mixed_data": "Blandet data", + "preview_panel.confirm_remove": "Fjern dette «%{self.lib.get_field_attr(field, \"name\")}»-feltet?", + "delete_unlinked.deleting_number_entries": "Sletter %{x[0]+1}/{len(self.lib.missing_files)} ulenkede oppføringer", + "fix_unlinked.scan_library.label": "Skanner bibliotek for ulenkede oppføringer …", + "folders_to_tags.folders_to_tags": "Konverterer mapper til etiketter", + "preview_panel.missing_location": "Posisjon mangler", + "landing.open_button": "Åpne/opprett bibliotek %{open_shortcut_text}" +} diff --git a/tagstudio/resources/translations/pt.json b/tagstudio/resources/translations/pt.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/tagstudio/resources/translations/pt.json @@ -0,0 +1 @@ +{} diff --git a/tagstudio/resources/translations/pt_BR.json b/tagstudio/resources/translations/pt_BR.json new file mode 100644 index 00000000..c4a1d438 --- /dev/null +++ b/tagstudio/resources/translations/pt_BR.json @@ -0,0 +1,144 @@ +{ + "home.main_window": "Janela Principal", + "home.include_any_tag": "Ou (Inclui qualquer rótulo)", + "home.thumbnail_size": "Tamanho de miniatura", + "home.search_entries": "Buscar Entradas", + "home.search": "Buscar", + "menu.file": "Arquivo", + "tag.library": "Rótulos da biblioteca", + "preview.recent": "Bibliotecas recentes", + "library.content_tags": "Rótulos de conteúdo", + "home.base_title": "TagStudio Alfa", + "home.include_all_tags": "E (Inclui todos os rótulos)", + "menu.edit": "Editar", + "menu.tools": "Ferramentas", + "menu.macros": "Macros", + "menu.window": "Janela", + "menu.help": "Ajuda", + "tag.new": "Novo Rótulo", + "preview.dimensions": "Dimensões", + "library.url": "URL", + "library.tags": "Rótulos", + "library.date": "Data", + "library.date_modified": "Dada de Modificação", + "library.favorite": "Favorito", + "library.book": "Livro", + "library.magazine": "Revista", + "library.comic": "Quadrinho", + "library.series": "Séries", + "library.manga": "Manga", + "library.composer": "Compositor", + "open_library.title": "Biblioteca", + "dialog.open_create_library": "Abrir/Criar Biblioteca", + "library.publisher": "Editora", + "library.guest_artist": "Artista Convidado", + "tooltip.open_library": "Ctrl+O", + "tooltip.save_library": "Ctrl+S", + "generic.file_extension": "Extensões de Arquivo", + "generic.open_all": "Abrir Tudo", + "generic.delete": "Deletar", + "mirror_entities.title": "Espelhando Entradas", + "text_line_edit.unknown_event_type": "tipo de evento desconhecido: %{event}", + "merge.window_title": "Mesclando Entradas Duplicadas", + "tag.add": "Adicionar Rótulo", + "merge.merge_dupe_entries": "Mesclando Entradas Duplicadas", + "library.title": "Título", + "library.author": "Autor", + "library.Artist": "Artista", + "library.description": "Descrição", + "library.notes": "Notas", + "library.date_created": "Data de Criação", + "library.date_published": "Data de Publicação", + "library.comments": "Comentários", + "library.source": "Fonte", + "library.date_uploaded": "Data de Envio", + "library.date_released": "Data de Lançamento", + "generic.color": "Cor", + "generic.add": "Adicionar", + "generic.open_file_explorer": "Abrir no explorador de arquivos", + "library.volume": "Volume", + "generic.close_all": "Fechar Tudo", + "generic.apply": "Aplicar", + "generic.cancel": "Cancelar", + "generic.name": "Nome", + "generic.open_file": "Abrir arquivo", + "generic.mirror": "Espelho", + "preview_panel.edit_name": "Editar", + "preview_panel.no_items_selected": "Nenhum Item Selecionado", + "library.meta_tags": "Meta Rótulos", + "open_library.no_tagstudio_library_found": "Nenhuma biblioteca do TagStudio existente foi encontrada em '%{path}'. Criando uma.", + "open_library.library_creation_return_code": "Código de Retorno da Criação da Biblioteca:", + "status.results_found": "Resultados", + "dialog.save_library": "Salvar Biblioteca", + "dialog.refresh_directories": "Atualizando Diretórios", + "splash.open_library": "Abrindo Biblioteca", + "status.save_success": "Biblioteca Salva e Fechada!", + "status.backup_success": "Backup da Biblioteca Salvo em:", + "status.search_library_query": "Procurando na Biblioteca por", + "status.enumerate_query": "Busca:%{query}, Quadro: %{i}, Tamanho: %{len(f)}", + "dialog.scan_directories": "Escaneando Diretórios por Novos Arquivos...\nPreparando...", + "progression.running_macros.new_entries": "Executando Macros nas Novas Entradas", + "progression.running_macros.one_new_entry": "Executando Macros Configurados em 1/%{len(new_ids)} Novas Entradas", + "generic.done": "Completo", + "generic.refresh_all": "Atualizar_Tudo", + "generic.aliases": "Alias", + "file_extension.add_extension": "Adicionar Extensão", + "fix_dupes.mirror_entries": "Entradas Espelhadas", + "fix_dupes.fix_dupes": "Corrigir Arquivos Duplicados", + "file_extension.list_mode": "Modo de Lista:", + "fix_dupes.name_filter": "Arquivos DupeGuru (*.dupeguru)", + "folders_to_tags.folders_to_tags": "Convertendo pastas para Rótulos", + "preview_panel.unknown_field_type": "Tipo de Campo Desconhecido", + "tag.search_for_tag": "Procurar por Rótulo", + "tag.add_search": "Adicionar a Pesquisa", + "generic.exclude": "Excluir", + "generic.include": "Incluir", + "progression.running_macros.several_new_entry": "Executando Macros Configurados em %{x + 1}/%{len(new_ids)} Novas Entradas", + "landing.open_button": "Abrir/Criar Bliblioteca %{open_shortcut_text}", + "dialog.scan_directories.new_files": "Escaneando Diretórios por Novos Arquivos...\n%{x + 1} Arquivo%{\"s\" if x + 1 != 1 else \"\"} Pesquisado%{\"s\" if x + 1 != 1 else \"\"}, %{len(self.lib.files_not_in_library)} Novo(s) Arquivo(s) Encontrado(s)", + "status.number_results_found": "%{len(all_items)} Resultados Encontrados para \"%{query}\" (%{format_timespan(end_time - start_time)})", + "fix_dupes.no_file_match": "Correspondências de Arquivos Duplicados: N/A", + "fix_dupes.number_file_match": "Correspondências de Arquivos Duplicados: %{count}", + "fix_unlinked.scan_library.title": "Escaneando Biblioteca", + "file_opener.command_not_found": "Não foi possível encontrar %{command_name} na PATH do sistema", + "file_opener.not_found": "Arquivo não encontrado:", + "folders_to_tags.title": "Criar rótulos a partir das pastas", + "mirror_entities.are_you_sure": "Tem certeza que você deseja espelhar os seguintes %{len(self.lib.dupe_files)} entradas?", + "folders_to_tags.description": "Cria rótulos baseado na sua estrutura de arquivos e aplica elas nas suas entradas\nA estrutura abaixo mostra todos os rótulos que irão ser criados e a quais entradas eles serão aplicados.", + "library.date_taken": "Data de Criação", + "library.archived": "Data de Arquivação", + "file_opener.open_file": "Abrindo Arquivo:", + "generic.shorthand": "Taquigrafia", + "fix_dupes.load_file": "Carregar Aquivo DupeGuru", + "fix_dupes.no_file_selected": "Nenhum Arquivo DupeGuru Selecionado", + "fix_unlinked.fix_unlinked": "Corrigir Entradas Não Linkadas", + "fix_dupes.open_result_files": "Abrir Arquivo de Resultados do DupeGuru", + "fix_unlinked.refresh_dupes": "Atualizar Entradas Duplicadas", + "fix_unlinked.merge_dupes": "Mesclar Entradas Duplicadas", + "fix_unlinked.manual_relink": "Relink Manual", + "fix_unlinked.scan_library.label": "Escaneando Bibliotecada para Entradas Não Linkadas...", + "fix_unlinked.search_and_relink": "Buscar && Relinkar", + "mirror_entities.label": "Espelhando 1/%{count} Entradas...", + "relink_unlinked.attempt_relink": "Tentando Relinkar %{x[0]+1}/%{len(self.lib.missing_files)} Entradas, %{self.fixed} Relinkadas com Sucesso", + "preview_panel.missing_location": "Localização Ausente", + "preview_panel.update_widgets": "[ENTRY PANEL] ATULIZAR WIDGETS (%{self.driver.selected})", + "preview_panel.mixed_data": "Dados Mistos", + "fix_unlinked.delete_unlinked": "Escluir Entradas Não Linkadas", + "fix_dupes.mirror_description": "Espelhe os ados de entrada em cada conjunto de correspondência duplicado, combinando todos os dados sem remover ou duplicar campos. Esta operação não excluirá nenhum arquivo ou dado.", + "relink_unlinked.title": "Relinkando Entradas", + "preview_panel.confirm_remove": "Você tem certeza de que quer remover o campo \"%{self.lib.get_field_attr(field, \"name\")}\"?", + "library.collation": "Colagem", + "library.anthology": "Coletânea", + "generic.remove_field": "Remover Campo", + "add_field.add": "Adicionar Campo", + "generic.search_tags": "Buscar Rótulos", + "build_tags.parent_tags": "Rótulos Pai", + "build_tags.add_parent_tags": "Adicionar Rótulo Pai", + "delete_unlinked.delete_unlinked": "Deletar Entradas Não Linkada", + "delete_unlinked.confirm": "Tem certeza que deseja deletar as seguintes %{len(self.lib.missing_files)} entradas?", + "delete_unlinked.delete_entries": "Deletando Entradas", + "delete_unlinked.deleting_number_entries": "Deletando %{x[0]+1}/{len(self.lib.missing_files)} Entradas Não Linkadas", + "fix_dupes.advice_label": "Após espelhagem, você estará livre para usar DupeGuru para deletar arquivos indesejados. Após, use a função \"Consertar Entradas Não Linkadas\" do TagStudio no menu de Ferramentas para deletar entradas não linkadas.", + "fix_unlinked.duplicate_description": "Entradas duplicadas são definidas como multiplas entradas que levam ao mesmo arquivo no disco. Mergir essas entradas irá combinar as tags e metadados de todas as duplicatas em uma única entrada consolidada. Não confundir com \"Arquivos Duplicados\" que são duplicatas dos seus arquivos fora do TagStudio.", + "fix_unlinked.description": "Cada entrada na biblioteca está linkada a um arquivo em um dos seus diretórios. Se um arquivo linkado a uma entrada for movido ou deletado fora do TagStudio, ele é então considerado não linkado. Entradas não linkadas podem ser automaticamente re-linkadas por buscas nos seus diretórios, manualmente re-linkadas pelo usuário, ou deletada se for desejada." +} diff --git a/tagstudio/resources/translations/ru.json b/tagstudio/resources/translations/ru.json new file mode 100644 index 00000000..02a27768 --- /dev/null +++ b/tagstudio/resources/translations/ru.json @@ -0,0 +1,144 @@ +{ + "home.main_window": "Основное Окно", + "home.thumbnail_size": "Размер иконок", + "home.search_entries": "Поисковые запросы", + "home.search": "Поиск", + "menu.file": "Файл", + "tag.new": "Новый тег", + "tag.add": "Добавить тег", + "tag.library": "Библиотека тегов", + "merge.window_title": "Объединить повторяющиеся записи", + "preview.dimensions": "Соотношения сторон", + "library.collation": "Сопоставление", + "library.date_created": "Дата создания", + "library.date_taken": "Дата съёмки", + "library.series": "Серии", + "library.date_uploaded": "Дата загрузки", + "library.volume": "Том", + "library.anthology": "Антология", + "library.guest_artist": "Соавтор", + "open_library.no_tagstudio_library_found": "Существующая библиотека TagStudio не найдена внутри '%{path}'. Создаём новую.", + "open_library.library_creation_return_code": "Возвратный код создания библиотеки:", + "status.search_library_query": "Поиск по библиотеке", + "status.number_results_found": "%{len(all_items)} Было найдено \"%{query}\" (%{format_timespan(end_time - start_time)})", + "dialog.refresh_directories": "Обновление Каталога", + "tooltip.save_library": "Ctrl+S", + "file_opener.open_file": "Открытие файла:}", + "file_opener.not_found": "Файл не найден:", + "add_field.add": "Добавить Категорию", + "generic.remove_field": "Удалить Категорию", + "generic.file_extension": "Расширения Файлов", + "generic.cancel": "Отмена", + "generic.shorthand": "Сокращённое название", + "generic.aliases": "Псевдонимы", + "generic.color": "Цвет", + "generic.close_all": "Закрыть Всё", + "generic.refresh_all": "Обновить Всё", + "generic.apply": "Применить", + "generic.mirror": "Отзеркалить", + "build_tags.parent_tags": "Теги-родители", + "build_tags.add_parent_tags": "Добавить Теги-родители", + "delete_unlinked.confirm": "Вы уверены в том, что желаете удалить %{len(self.lib.missing_files)} записи?", + "delete_unlinked.delete_entries": "Удаление записей", + "file_extension.list_mode": "Список режимов:", + "fix_dupes.fix_dupes": "Исправить дубликаты", + "fix_dupes.no_file_selected": "Файл DupeGuru не выбран", + "fix_dupes.load_file": "Загрузить файл DupeGuru", + "fix_dupes.mirror_entries": "Отзеркалить записи", + "fix_dupes.mirror_description": "Отзеркалить данные записи внутри каждого указанного набора дубликатов, объединяя все данные внутри без удаления или дублирования категорий. Эта операция не удалит какие-либо файлы или данные.", + "fix_dupes.open_result_files": "Открыть файл результатов DupeGuru", + "fix_dupes.name_filter": "Файлы DupeGuru (*.dupeguru)", + "fix_unlinked.manual_relink": "Ручная привязка", + "folders_to_tags.title": "Создать теги из папок", + "landing.open_button": "Открыть/Создать Библиотеку %{open_shortcut_text}", + "preview_panel.no_items_selected": "Ничего не выбрано", + "preview_panel.unknown_field_type": "Неизвестный тип категории", + "tag.search_for_tag": "Поиск тега", + "home.base_title": "TagStudio Альфа Версия", + "home.include_any_tag": "Или (Файл содержит любой из тегов)", + "home.include_all_tags": "И (Файл содержит все теги)", + "menu.edit": "Редактировать", + "menu.tools": "Инструменты", + "menu.window": "Окно", + "menu.help": "Помощь", + "menu.macros": "Макросы", + "preview.recent": "Недавние библиотеки", + "merge.merge_dupe_entries": "Объединить повторяющиеся записи", + "library.title": "Название", + "library.author": "Автор", + "library.url": "URL", + "library.description": "Описание", + "library.Artist": "Художник", + "library.notes": "Заметки", + "library.date_released": "Дата выпуска", + "library.date_modified": "Дата изменения", + "library.tags": "Теги", + "library.content_tags": "Теги содержимого", + "library.meta_tags": "Мета Теги", + "library.date": "Дата", + "library.date_published": "Дата публикации", + "library.archived": "Дата архивации", + "library.manga": "Манга", + "library.favorite": "Избранное", + "library.comic": "Комиксы", + "library.book": "Книги", + "library.publisher": "Издатель", + "library.source": "Источники", + "library.magazine": "Журнал", + "library.composer": "Композитор", + "library.comments": "Комментарии", + "splash.open_library": "Открытие Библиотеки", + "open_library.title": "Библиотека", + "dialog.open_create_library": "Открыть/Создать Библиотеку", + "status.save_success": "Библиотека сохранена и закрыта!", + "status.backup_success": "Резервная копия библиотеки сохранена по адресу:", + "status.enumerate_query": "Query:%{query}, Frame: %{i}, Length: %{len(f)}", + "status.results_found": "Результаты", + "dialog.scan_directories": "Сканирование каталога на наличие новых файлов...\nПодготовка...", + "dialog.save_library": "Сохранить Библиотеку", + "tooltip.open_library": "Ctrl+O", + "dialog.scan_directories.new_files": "Сканирование на наличие новых файлов...\n%{x + 1} File%{\"s\" if x + 1 != 1 else \"\"} Searched, %{len(self.lib.files_not_in_library)} Найдены новые файлы", + "progression.running_macros.new_entries": "Использование макросов на новых файлах", + "progression.running_macros.one_new_entry": "Запуск сконфигурированных макросов в 1/%{len(new_ids)} Новые файлы", + "progression.running_macros.several_new_entry": "Запуск сконфигурированных макросов в %{x + 1}/%{len(new_ids)} Новые файлы", + "file_opener.command_not_found": "Не смог найти %{command_name} в системе PATH", + "generic.open_file_explorer": "Открыть файл в проводнике", + "generic.open_file": "Открыть файл", + "generic.add": "Добавить", + "generic.name": "Имя", + "generic.delete": "Удалить", + "generic.exclude": "Исключить", + "generic.done": "Завершено", + "generic.open_all": "Открыть Всё", + "generic.search_tags": "Поиск тегов", + "delete_unlinked.delete_unlinked": "Удалить откреплённые записи", + "file_extension.add_extension": "Добавить расширение", + "delete_unlinked.deleting_number_entries": "Удалено %{x[0]+1}/{len(self.lib.missing_files)} откреплённых записей", + "fix_dupes.advice_label": "После отзеркаливания, вы можете использовать DupeGuru, чтобы удалить ненужные файлы. После этого, используйте функцию \"Исправить откреплённые записи\" внутри панели \"Инструменты\" TagStudio, чтобы удалить откреплённые записи.", + "fix_dupes.no_file_match": "Совпадение файлов дубликатов: N/A", + "fix_dupes.number_file_match": "Совпадения файлов дубликатов: %{count}", + "fix_unlinked.fix_unlinked": "Исправить откреплённые записи", + "fix_unlinked.description": "Каждая запись в библиотеке привязана к файлу, находящегося внутри той или иной папки. Если файл, к которому была привязана запись, был удалён или перемещён без использования TagStudio, то запись становиться \"откреплённой\". Откреплённые записи могут быть прикреплены обратно через автоматический рескан, вручную прикреплены обратно пользователем, либо же удалены если в них нет надобности.", + "fix_unlinked.duplicate_description": "Записи-дубликаты это несколько записей, которые одновременно привязаны к одному файлу. Объединение таких дубликатов соединит все теги и мета данные из этих записей в одну. Записи-дубликаты не стоит путать с несколькими копиями самого файла, которые могут существовать вне TagStudio.", + "fix_unlinked.search_and_relink": "Поиск и Привязка", + "fix_unlinked.refresh_dupes": "Обновить записи дубликаты", + "fix_unlinked.merge_dupes": "Объединить записи дубликаты", + "fix_unlinked.delete_unlinked": "Удалить откреплённые записи", + "fix_unlinked.scan_library.title": "Сканирование Библиотеки", + "folders_to_tags.folders_to_tags": "Конвертировать папки в теги", + "fix_unlinked.scan_library.label": "Сканирование Библиотеки на наличие откреплённых записей...", + "mirror_entities.are_you_sure": "Вы уверенны, что хотите отзеркалить следующие %{len(self.lib.dupe_files)} записи?", + "mirror_entities.title": "Отзеркаливание записей", + "preview_panel.missing_location": "Путь не найден", + "mirror_entities.label": "Отзеркаливание 1/%{count} записей...", + "preview_panel.update_widgets": "[ENTRY PANEL] ОБНОВИТЬ ВИДЖЕТЫ (%{self.driver.selected})", + "relink_unlinked.title": "Привязка записей", + "folders_to_tags.description": "Создаёт теги для записей согласно имеющейся иерархии папок.\nВнизу указаны все теги, которые будут созданы, а также записи к которым они будут применены.", + "relink_unlinked.attempt_relink": "Пытаемся вновь привязать %{x[0]+1}/%{len(self.lib.missing_files)} записей, %{self.fixed} Успешно привязано", + "preview_panel.confirm_remove": "Вы уверенны, что хотите удалить эту категорию \"%{self.lib.get_field_attr(field, \"name\")}\"?", + "preview_panel.edit_name": "Редактировать", + "text_line_edit.unknown_event_type": "unknown event type: %{event}", + "preview_panel.mixed_data": "Смешанные данные", + "tag.add_search": "Добавить к поисковому запросу", + "generic.include": "Включить" +} diff --git a/tagstudio/resources/translations/sv.json b/tagstudio/resources/translations/sv.json new file mode 100644 index 00000000..4dc5d911 --- /dev/null +++ b/tagstudio/resources/translations/sv.json @@ -0,0 +1,115 @@ +{ + "home.main_window": "Huvudfönster", + "home.thumbnail_size": "Miniatyrbildsstorlek", + "home.search": "Sök", + "menu.file": "Fil", + "menu.tools": "Verktyg", + "menu.macros": "Makron", + "menu.window": "Fönster", + "menu.help": "Hjälp", + "tag.add": "Lägg till etikett", + "home.include_any_tag": "Eller (Inkluderar alla etiketter)", + "tag.new": "Ny etikett", + "home.search_entries": "Sök poster", + "tag.library": "Biblioteksetiketter", + "merge.window_title": "Slår ihop dubbla poster", + "merge.merge_dupe_entries": "Slår ihop dubbla poster", + "preview.recent": "Senaste biblioteken", + "library.title": "Titel", + "library.author": "Författare", + "library.description": "Beskrivning", + "library.notes": "Anteckningar", + "library.content_tags": "Innehållsetiketter", + "library.meta_tags": "Meta-etiketter", + "library.collation": "Kollation", + "library.date": "Datum", + "library.date_created": "Skapad den", + "library.date_modified": "Senast ändrad", + "library.favorite": "Favorit", + "library.date_taken": "", + "library.archived": "Arkiveringsdatum", + "library.date_published": "Publiceringsdatum", + "library.series": "Serie", + "library.manga": "Manga", + "library.source": "Källa", + "library.date_released": "Utgivningsdatum", + "library.volume": "Volym", + "library.anthology": "Antologi", + "library.magazine": "Magasin", + "library.composer": "Kompositör", + "open_library.title": "Bibliotek", + "dialog.open_create_library": "Öppna/skapa bibliotek", + "splash.open_library": "Öppnar bibliotek", + "status.save_success": "Bibliotek sparat och stängt!", + "status.backup_success": "Bibliotekets säkerhetskopia sparad i:", + "status.search_library_query": "Söker i biblioteket efter", + "status.results_found": "Resultat", + "dialog.save_library": "Spara bibliotek", + "dialog.refresh_directories": "Uppdaterar kataloger", + "dialog.scan_directories": "Skannar kataloger efter nya filer...\nFörbereder...", + "tooltip.open_library": "Ctrl+O", + "tooltip.save_library": "Ctrl+S", + "add_field.add": "Lägg till fält", + "generic.remove_field": "Ta bort fält", + "generic.file_extension": "Filnamnstillägg", + "generic.open_file": "Öppna fil", + "generic.add": "Lägg till", + "generic.name": "Namn", + "generic.shorthand": "Förkortning", + "generic.aliases": "Alias", + "generic.done": "Klar", + "generic.open_all": "Öppna alla", + "generic.close_all": "Stäng alla", + "generic.refresh_all": "Uppdatera alla", + "generic.apply": "Tillämpa", + "build_tags.parent_tags": "Förälderetiketter", + "build_tags.add_parent_tags": "Lägg till förälderetikett", + "delete_unlinked.delete_entries": "Tar bort poster", + "fix_dupes.fix_dupes": "Fixa dubbla filer", + "fix_dupes.mirror_entries": "Spegla poster", + "fix_unlinked.search_and_relink": "Sök && Länka om", + "fix_unlinked.refresh_dupes": "Uppdatera dubbla poster", + "fix_unlinked.merge_dupes": "Slå ihop dubbla poster", + "fix_unlinked.manual_relink": "Länka om manuellt", + "fix_unlinked.delete_unlinked": "Ta bort olänkade poster", + "fix_unlinked.scan_library.title": "Skannar bibliotek", + "fix_unlinked.scan_library.label": "Skannar bibliotek efter olänkade poster...", + "folders_to_tags.title": "Skapa etiketter från mappar", + "preview_panel.missing_location": "Platsen saknas", + "preview_panel.edit_name": "Redigera", + "home.base_title": "TagStudio Alfa", + "home.include_all_tags": "Och (Inkluderar alla etiketter)", + "menu.edit": "Redigera", + "library.Artist": "Artist", + "preview.dimensions": "Dimensioner", + "library.url": "URL", + "library.tags": "Etiketter", + "library.book": "Bok", + "library.comic": "Serietidning", + "folders_to_tags.description": "Skapar etiketter baserat på din mappstruktur och tillämpar dem till dina poster.\nStrukturen nedan visar vilka etiketter som kommer skapas och vilka filer de kommer tillämpas på.", + "fix_unlinked.duplicate_description": "Dubbla poster är definierade som flera poster som pekar på samma fil på datorn. Genom att slå ihop dessa poster kommer deras etiketter och metadata från dubbletterna att kombineras till en post. Dessa ska inte förväxlas med \"dubbla filer\", som är dubbletter av dina filer utanför TagStudio.", + "fix_unlinked.description": "Varje post i biblioteket är länkad till en fil i en av dina kataloger. Om en fil länkad till en post är flyttad eller borttagen utanför TagStudio blir den olänkad. Olänkade poster kan automatiskt bli omlänkade genom att söka genom dina kataloger, manuellt omlänkade av användaren eller tas bort om så önskas.", + "mirror_entities.title": "Speglar poster", + "tag.search_for_tag": "Sök efter etikett", + "relink_unlinked.title": "Länkar om poster", + "preview_panel.no_items_selected": "Inga valda objekt", + "tag.add_search": "Lägg till i Sök", + "library.date_uploaded": "Uppladdningsdatum", + "library.publisher": "Utgivare", + "library.guest_artist": "Gästartist", + "library.comments": "Kommentarer", + "progression.running_macros.new_entries": "Kör makros på nya poster", + "file_opener.open_file": "Öppnar fil:}", + "file_opener.not_found": "Kunde inte hitta filen:", + "generic.open_file_explorer": "Öppna fil i utforskaren", + "generic.delete": "Ta bort", + "generic.cancel": "Avbryt", + "generic.exclude": "Exkludera", + "generic.include": "Inkludera", + "generic.mirror": "Spegla", + "generic.color": "Färg", + "generic.search_tags": "Sök etikett", + "file_extension.add_extension": "Lägg till tillägg", + "fix_unlinked.fix_unlinked": "Fixa olänkade poster", + "folders_to_tags.folders_to_tags": "Konverterar mappar till etiketter" +} diff --git a/tagstudio/resources/translations/ta.json b/tagstudio/resources/translations/ta.json new file mode 100644 index 00000000..ce028824 --- /dev/null +++ b/tagstudio/resources/translations/ta.json @@ -0,0 +1,144 @@ +{ + "home.base_title": "TagStudio ஆல்பா", + "home.main_window": "பிரதான சாளரம்", + "home.include_all_tags": "மற்றும் (அனைத்து குறிச்சொற்களையும் உள்ளடக்கியது)", + "home.thumbnail_size": "சின்னப்பட அளவு", + "home.search": "தேடு", + "menu.file": "கோப்பு", + "menu.edit": "திருத்து", + "menu.tools": "கருவிகள்", + "menu.help": "உதவி", + "tag.new": "புதிய குறிச்சொல்", + "tag.add": "குறிச்சொல் சேர்க்க", + "merge.merge_dupe_entries": "மறுநுழைவுகளை ஒன்றுசேர்த்தல்", + "preview.recent": "சமீபத்திய நூலகங்கள்", + "library.url": "இணைய முகவரி", + "library.notes": "குறிப்புகள்", + "library.content_tags": "உள்ளடக்கக் குறிச்சொற்கள்", + "library.meta_tags": "மெட்டா குறிச்சொற்கள்", + "library.collation": "தொகுத்தல்", + "library.date_modified": "மாற்றப்பட்ட தேதி", + "library.date_taken": "எடுக்கப்பட்ட தேதி", + "library.archived": "காப்பகப்படுத்தப்பட்ட தேதி", + "library.favorite": "பிடித்தது", + "library.book": "புத்தகம்", + "library.series": "தொடர்", + "library.manga": "மங்கா", + "library.source": "ஆதாரம்", + "library.date_uploaded": "பதிவேற்றிய தேதி", + "library.date_released": "வெளியான தேதி", + "library.volume": "தொகுப்பு", + "library.anthology": "தொகுப்பியல்", + "open_library.title": "நூலகம்", + "splash.open_library": "நூலகம் திறக்கப்படுகின்றது", + "status.save_success": "நூலகம் சேமிக்கப்பட்டு மூடப்பட்டது!", + "status.backup_success": "நூலக காப்புப் பிரதி சேமிக்கப்பட்டது:", + "status.search_library_query": "நூலகத்தைத் தேடுகிறது", + "status.enumerate_query": "வினவு:%{query}, சட்டகம்: %{i}, நீளம்: %{len(f)}", + "status.results_found": "முடிவுகள்", + "dialog.save_library": "நூலகத்தைச் சேமி", + "dialog.refresh_directories": "கோப்பகங்கள் புதுப்பிக்கப்படுகின்றன", + "tooltip.open_library": "Ctrl+O", + "tooltip.save_library": "Ctrl+S", + "progression.running_macros.new_entries": "புதிய நுழைவுகளில் செயல்முறைகளை இயக்கப்படுகின்றது", + "file_opener.open_file": "கோப்பைத் திறக்கிறது:}", + "file_opener.not_found": "கோப்பு கிடைக்கவில்லை:", + "home.search_entries": "தேடல் உள்ளீடுகள்", + "home.include_any_tag": "அல்லது (எந்தக் குறிச்சொல்லையும் உள்ளடக்கியது)", + "menu.macros": "செயல்முறை", + "menu.window": "சாளரம்", + "tag.library": "நூலக குறிச்சொற்கள்", + "merge.window_title": "மறுநுழைவுகளை ஒன்றுசேர்த்தல்", + "preview.dimensions": "பரிமாணங்கள்", + "library.title": "தலைப்பு", + "library.author": "ஆக்கியோன்", + "library.Artist": "கலைஞர்", + "library.description": "விளக்கம்", + "library.tags": "குறிச்சொற்கள்", + "library.magazine": "இதழ்", + "library.guest_artist": "விருந்தினர் கலைஞர்", + "library.composer": "இசையமைப்பாளர்", + "library.date": "தேதி", + "library.date_created": "உருவாக்கப்பட்ட தேதி", + "library.date_published": "வெளியிடப்பட்ட தேதி", + "library.comic": "நகைச்சுவை", + "library.publisher": "பதிப்பாளர்", + "library.comments": "கருத்துகள்", + "open_library.library_creation_return_code": "நூலக உருவாக்கம் திரும்பக் குறியீடு:", + "open_library.no_tagstudio_library_found": "'%{path}' இல் ஏற்கனவே உள்ள டாக் ஸ்டுடியோ புத்தககல்லரி காணப்படவில்லை. ஒன்று உருவாக்கப்படுகிறது.", + "dialog.open_create_library": "நூலகத்தைத் திற/உருவாக்கு", + "status.number_results_found": "\"%{query}\" இல் %{len(all_items)} முடிவுகள் கிடைத்தன (%{format_timespan(end_time - start_time)})", + "dialog.scan_directories": "புதிய கோப்புகளுக்கான அடைவுகள் சோதனை செய்யப்படுகின்றது...\nதயாராகிறது...", + "dialog.scan_directories.new_files": "புதிய கோப்புகளுக்கான அடைவுகள் சோதனை செய்யப்படுகின்றது...\n%{x + 1} கோப்பு%{\"s\" if x + 1 != 1 else \"\"} தேடப்பட்டது, %{len(self.lib.files_not_in_library)} புதிய கோப்புகள் கிடைத்தன", + "progression.running_macros.one_new_entry": "1/ இல் கட்டமைக்கப்பட்ட செயல்முறைகளை இயக்கப்படுகிறது %{len(new_ids)} புதிய பதிவுகள்", + "progression.running_macros.several_new_entry": "%{x + 1} இல் கட்டமைக்கப்பட்ட செயல்முறைகளை இயக்கப்படுகிறது / %{len(new_ids)} புதிய பதிவுகள்", + "file_opener.command_not_found": "%{command_name} ஐ system PATH இல் கண்டுபிடிக்க முடியவில்லை", + "add_field.add": "புலத்தைச் சேர்க்க", + "generic.remove_field": "புலத்தை அகற்று", + "generic.file_extension": "கோப்பு நீட்டிப்புகள்", + "generic.open_file": "கோப்பைத் திறக்கவும்", + "generic.cancel": "ரத்து செய்", + "generic.name": "பெயர்", + "generic.shorthand": "சுருக்கெழுத்து", + "generic.aliases": "மாற்றுப்பெயர்கள்", + "generic.delete": "நீக்கு", + "generic.include": "உள்ளடக்கு", + "generic.exclude": "தவிர்", + "generic.done": "முடிந்தது", + "generic.open_all": "அனைத்தையும் திற", + "generic.refresh_all": "அனைத்தையும் புதுப்பி", + "generic.apply": "விண்ணப்பிக்க", + "build_tags.parent_tags": "பெற்றோர் குறிச்சொற்கள்", + "build_tags.add_parent_tags": "பெற்றோர் குறிச்சொற்களைச் சேர்க்க", + "delete_unlinked.delete_entries": "உள்ளீடுகள் நீக்கப்படுகிறது", + "delete_unlinked.deleting_number_entries": "%{x[0]+1}/{len(self.lib.missing_files)} இணைக்கப்படாத உள்ளீடுகள் நீக்கப்படுகிறது", + "file_extension.add_extension": "நீட்டிப்பைச் சேர்க்க", + "file_extension.list_mode": "பட்டியல் முறை:", + "generic.mirror": "படிமம்", + "fix_dupes.load_file": "DupeGuru கோப்பை ஏற்றவும்", + "fix_dupes.mirror_entries": "படிம நுழைவுகள்", + "fix_dupes.open_result_files": "DupeGuru முடிவுகள் கோப்பைத் திறக்க", + "fix_dupes.name_filter": "DupeGuru கோப்புகள் (*.dupeguru)", + "fix_dupes.no_file_match": "நகல் கோப்பு பொருத்தங்கள்: ஒன்றும் இல்லை", + "fix_dupes.number_file_match": "நகல் கோப்பு பொருத்தங்கள்: %{count}", + "fix_unlinked.fix_unlinked": "இணைக்கப்படாத உள்ளீடுகளைச் சரிசெய்யவும்", + "fix_unlinked.search_and_relink": "தேடல் && மீண்டும் இணை", + "fix_unlinked.refresh_dupes": "நகல் உள்ளீடுகளைப் புதுப்பி", + "fix_unlinked.merge_dupes": "நகல் உள்ளீடுகளை ஒன்றிணை", + "fix_unlinked.manual_relink": "கைமுறை மறு இணைப்பு", + "fix_unlinked.scan_library.title": "புத்தககல்லரி சோதனை செய்யப்படுகிறது", + "folders_to_tags.folders_to_tags": "கோப்புறைகளை குறிச்சொற்களாக மாற்றப்படுகிறது", + "folders_to_tags.title": "கோப்புறைகளிலிருந்து குறிச்சொற்களை உருவாக்கு", + "generic.open_file_explorer": "Explorer இல் கோப்பைத் திறக்கவும்", + "generic.add": "சேர்", + "generic.color": "நிறம்", + "generic.close_all": "அனைத்தையும் மூடு", + "delete_unlinked.delete_unlinked": "இணைக்கப்படாத உள்ளீடுகளை நீக்கு", + "generic.search_tags": "குறிச்சொற்களைத் தேடு", + "delete_unlinked.confirm": "பின்வரும் உள்ளீடுகளை நிச்சயமாக நீக்க விரும்புகிறீர்களா %{len(self.lib.missing_files)}?", + "fix_dupes.fix_dupes": "நகல் கோப்புகளைச் சரிசெய்", + "fix_dupes.no_file_selected": "DupeGuru கோப்பு எதுவும் தேர்ந்தெடுக்கப்படவில்லை", + "fix_dupes.mirror_description": "ஒவ்வொரு மறுநுழைவு பொருத்தத் தொகுப்பிலும் நுழைவு தரவுகளைப் பிரதிபலிக்கவும், அனைத்து தரவுகளையும் இணைக்கவும், எந்தத் தகவல்களையும் நீக்காமலும் மறு செய்யாமலும். இந்தச் செயலில் எந்தக் கோப்புகள் அல்லது தரவுகளும் நீக்கப்பட மாட்டாது.", + "fix_dupes.advice_label": "படிமம் முடிந்தவுடன், தேவையற்ற கோப்புகளை நீக்க DupeGuru ஐ பயன்படுத்தலாம். அதற்குப் பிறகு, இணைக்காத நுழைவுகளை நீக்க 'டாக் ஸ்டுடியோ' வின் 'இணைக்கப்படாத உள்ளீடுகளைச் சரிசெய்' அம்சத்தைக் கருவிகள் பட்டியில் பயன்படுத்தவும்.", + "fix_unlinked.description": "ஒவ்வொரு புத்தககல்லரி நுழைவும் உங்கள் அடைவுகளில் உள்ள ஒரு கோப்புடன் இணைக்கப்பட்டுள்ளது. டாக் ஸ்டுடியோ-வைத் தவிர கோப்புகள் நகர்த்தப்பட்டால் அல்லது நீக்கப்பட்டால், அவை இணைக்கப்படாதவையாகக் கருதப்படும். இணைக்கப்படாத நுழைவுகளை உங்கள் அடைவுகளில் தேடுவதன் மூலம் தானாகவே மீண்டும் இணைக்கலாம், பயனர் கைமுறையாக இணைக்கலாம் அல்லது விருப்பப்படி நீக்கலாம்.", + "fix_unlinked.duplicate_description": "மறுநுழைவுகள் என்பது, ஒரே கோப்பை குறிக்கும் பல நுழைவுகளை குறிக்கும். இவற்றை இணைப்பதால், அனைத்து மறுநுழைவுகளின் குறிச்சொற்களும் மெட்டாடேட்டாவும் ஒரே ஒட்டுமொத்த நுழைவாகச் சேர்க்கப்படும். இவற்றை 'மறுகோப்புகள்' என்பதுடன் குழப்பக் கூடாது, ஏனெனில் அவை டாக் ஸ்டுடியோவுக்கு வெளியேயுள்ள கோப்புகளின் நகல்களாகும்.", + "fix_unlinked.delete_unlinked": "இணைக்கப்படாத உள்ளீடுகளை நீக்கு", + "fix_unlinked.scan_library.label": "இணைக்கப்படாத நுழைவுகளை புத்தககல்லரியில் சோதனை செய்யப்படுகிறது...", + "mirror_entities.are_you_sure": "பின்வரும் உள்ளீடுகளைப் பிரதிபலிக்க விரும்புகிறீர்களா %{len(self.lib.dupe_files)}?", + "mirror_entities.title": "உள்ளீடுகள் பிரதிபழிக்கப்படுகின்றது", + "mirror_entities.label": "1/%{count} உள்ளீடுகளைப் பிரதிபலிக்கப்படுகின்றது...", + "landing.open_button": "நூலகத்தைத் திற/உருவாக்கு %{open_shortcut_text}", + "preview_panel.missing_location": "இடம் காணவில்லை", + "preview_panel.update_widgets": "[நுழைவு குழு] விட்ஜெட்டுகளை புதுப்பிக்கவும் (%{self.driver.selected})", + "relink_unlinked.title": "உள்ளீடுகள் மீண்டும் இணைக்கப்படுகின்றது", + "preview_panel.confirm_remove": "இந்த \"%{self.lib.get_field_attr(field, \"name\")}\" புலத்தை நிச்சயமாக அகற்ற விரும்புகிறீர்களா?", + "preview_panel.mixed_data": "கலப்பு தரவு", + "preview_panel.edit_name": "திருத்து", + "preview_panel.unknown_field_type": "அறியப்படாத புல வகை", + "tag.add_search": "தேடலில் சேர்", + "text_line_edit.unknown_event_type": "அறியப்படாத நிகழ்வு வகை: %{event}", + "preview_panel.no_items_selected": "உருப்படிகள் எதுவும் தேர்ந்தெடுக்கப்படவில்லை", + "tag.search_for_tag": "குறிச்சொல்லைத் தேடு", + "folders_to_tags.description": "உங்கள் அடைவு கட்டமைப்பின் அடிப்படையில் குறிச்சொற்களை உருவாக்கி, அவற்றை உங்கள் நுழைவுகளில் பயன்படுத்துகிறது.\nகீழே காணப்படும் கட்டமைப்பானது உருவாக்கப்படும் அனைத்து குறிச்சொற்களையும், அவை எந்த நுழைவுகளில் பயன்படுத்தப்படும் என்பதையும் காட்டுகிறது.", + "relink_unlinked.attempt_relink": "%{x[0]+1}/%{len(self.lib.missing_files)} உள்ளீடுகளை மீண்டும் இணைக்க முயற்சிக்கிறது, %{self.fixed} மீண்டும் இணைக்கப்பட்டது" +} diff --git a/tagstudio/resources/translations/tok.json b/tagstudio/resources/translations/tok.json new file mode 100644 index 00000000..457bd66a --- /dev/null +++ b/tagstudio/resources/translations/tok.json @@ -0,0 +1,144 @@ +{ + "home.main_window": "lipu suli", + "home.include_all_tags": "AND (kepeken poki ale)", + "home.thumbnail_size": "suli sitelen", + "home.search": "alasa", + "home.search_entries": "ijo alasa", + "menu.file": "ijo", + "menu.edit": "ante", + "menu.tools": "ilo", + "menu.macros": "ilo pali", + "menu.window": "lipu", + "menu.help": "mi jo e toki seme", + "tag.new": "poki sin", + "tag.add": "o pana e poki", + "tag.library": "poki tomo", + "merge.merge_dupe_entries": "ijo sama li kama wan", + "preview.dimensions": "suli", + "preview.recent": "tomo pi tenpo poka", + "library.title": "nimi", + "library.author": "jan pali toki", + "library.Artist": "jan pali sitelen", + "library.url": "nimi linluwi", + "library.description": "toki ni", + "library.notes": "toki sina", + "library.tags": "poki", + "library.content_tags": "poki pi jo ijo", + "library.collation": "poki ijo", + "library.date_modified": "tenpo pi kama ante", + "library.date_created": "tenpo pi kama sin", + "library.date": "tenpo", + "library.date_taken": "tenpo lanpan", + "library.date_published": "tenpo pana", + "library.favorite": "pona mute", + "library.book": "lipu toki", + "library.comic": "lipu sitelen", + "library.series": "kulupu", + "library.manga": "kulupu pi lipu sitelen", + "library.date_uploaded": "tenpo pi kama lon lipu", + "library.date_released": "tenpo pi kama open", + "library.volume": "nanpa", + "library.anthology": "kulupu toki", + "library.publisher": "jan esun", + "library.guest_artist": "jan pali namako", + "library.comments": "toki isipin", + "open_library.no_tagstudio_library_found": "tomo lon '%{path}' li lon ala. mi pali e tomo.", + "dialog.open_create_library": "open/sin e tomo", + "splash.open_library": "mi open e tomo", + "status.save_success": "tomo li awen li weka!", + "status.backup_success": "tomo sama li lon:", + "status.number_results_found": "%{len(all_items)} mi jo e ijo \"%{query}\" (%{format_timespan(end_time - start_time)})", + "status.results_found": "jo", + "dialog.save_library": "awen e tomo", + "dialog.refresh_directories": "mi kama jo e sin lon tomo", + "dialog.scan_directories": "mi alasa e ijo sin lon tomo...\nmi kama pona...", + "tooltip.open_library": "Ctrl+O", + "tooltip.save_library": "Ctrl+S", + "progression.running_macros.new_entries": "mi pali lon ijo sin", + "progression.running_macros.one_new_entry": "mi pali lon ijo sin 1/%{len(new_ids)}", + "progression.running_macros.several_new_entry": "mi pali lon ijo sin %{x + 1}/%{len(new_ids)}", + "file_opener.not_found": "mi ken ala alasa e ijo:", + "generic.remove_field": "weka e sona", + "add_field.add": "pana e sona", + "generic.file_extension": "nimi lon nimi ijo anpa", + "generic.open_file": "open e ijo", + "generic.cancel": "o ala", + "generic.name": "nimi", + "generic.shorthand": "nimi lili", + "generic.aliases": "nimi ante", + "generic.color": "kule", + "generic.delete": "o weka", + "generic.add": "o pana", + "generic.exclude": "o kepeken ala", + "generic.include": "o kepeken", + "generic.done": "pona", + "generic.open_all": "open e ale", + "generic.close_all": "weka e ale", + "generic.apply": "o pana", + "generic.mirror": "jasima", + "generic.search_tags": "o alasa e poki", + "build_tags.parent_tags": "poki mama", + "build_tags.add_parent_tags": "o pana e poki mama", + "delete_unlinked.delete_unlinked": "o weka e ijo pi ijo lon ala", + "delete_unlinked.confirm": "mi weka e ijo %{len(self.lib.missing_files)}. ni li pona anu seme?", + "file_extension.list_mode": "nasin kulupu:", + "fix_dupes.no_file_selected": "sina o anu e ijo DupeGuru", + "fix_dupes.load_file": "o kama sona e ijo DupeGuru", + "fix_dupes.mirror_entries": "o jasima e ijo", + "fix_dupes.advice_label": "jasima li pini la, sina ken kepeken ilo DupeGuru. ilo DupeGuru li ken weka e ijo ike. ni li pini la, o kepeken e nasin \"o pona e ijo pi ijo lon ala\" lon ilo TagStudio. ni li weka e ijo pi ijo lon ala.", + "fix_dupes.name_filter": "ijo DupeGuru (*.dupeguru)", + "fix_dupes.no_file_match": "ijo sama: ala", + "fix_dupes.number_file_match": "ijo sama: %{count}", + "fix_unlinked.fix_unlinked": "o pona e ijo pi ijo lon ala", + "fix_unlinked.duplicate_description": "ken la, ijo mute li jo e ijo lon sama. ni li \"ijo sama\". sina wan e ona la, ijo sama li kama wan li jo e sona ale tan ijo sama ale.", + "fix_unlinked.search_and_relink": "o alasa o pana e ijo lon tawa ijo", + "fix_unlinked.refresh_dupes": "o kama jo e sona tan ijo sama", + "fix_unlinked.merge_dupes": "o kama wan e ijo sama", + "fix_unlinked.manual_relink": "sina o pana e ijo lon tawa ijo", + "fix_unlinked.delete_unlinked": "o weka e ijo pi ijo lon ala", + "fix_unlinked.scan_library.title": "mi o lukin e tomo", + "fix_unlinked.scan_library.label": "mi o alasa e ijo pi ijo lon ala...", + "folders_to_tags.title": "o pali e poki tan poki tomo", + "folders_to_tags.folders_to_tags": "mi o pali e poki tan poki tomo", + "home.base_title": "ilo TagStudio pi pini ala", + "home.include_any_tag": "OR (kepeken poki wan. poki ale li ken)", + "merge.window_title": "ijo sama li kama wan", + "library.meta_tags": "poki pi sona ijo", + "library.archived": "tenpo pi kama awen", + "library.magazine": "lipu sitelen toki", + "library.composer": "jan pali pi kalama musi", + "status.search_library_query": "mi alasa e", + "dialog.scan_directories.new_files": "mi alasa e ijo sin lon tomo...\nmi lukin e ijo %{x + 1}. ijo %{len(self.lib.files_not_in_library)} li sin", + "file_opener.open_file": "mi open e ijo:}", + "file_opener.command_not_found": "mi ken ala alasa e toki lawa '%{command_name}' lon PATH", + "generic.open_file_explorer": "open e ijo lon ilo alasa", + "generic.refresh_all": "o kama jo sin tan ale", + "delete_unlinked.delete_entries": "mi weka e ijo", + "delete_unlinked.deleting_number_entries": "mi weka e ijo %{x[0]+1}/{len(self.lib.missing_files)} pi ijo lon ala", + "file_extension.add_extension": "o pana e nimi anpa", + "fix_dupes.mirror_description": "o jasima e sona kama lon kulupu sama ale. sona ale li kama wan li weka ala li kama mute ala. ni li weka ala e sona e ijo.", + "fix_dupes.open_result_files": "o open e sona pini tan ilo DupeGuru", + "fix_unlinked.description": "ijo ale li jo e ijo lon. ona li tawa anu weka, ona li jo ala e ijo lon. ijo pi ijo lon li ken alasa e tomo li ken kama jo e ijo lon. ante la sina ken pana ijo lon tawa ijo. ante la sina ken weka e ijo.", + "library.source": "tan", + "open_library.title": "tomo", + "status.enumerate_query": "seme: %{query}. sitelen: %{i}. nanpa: %{len(f)}", + "open_library.library_creation_return_code": "tomo li open li toki e ni:", + "folders_to_tags.description": "ni li pali e poki tan poki tona li pana e poki sin tawa ijo lon tomo.\n ilo ni li pali e anpa.", + "mirror_entities.are_you_sure": "mi jasima e ijo %{len(self.lib.dupe_files)}. ni li pona anu seme?", + "mirror_entities.title": "mi jasima e ijo", + "mirror_entities.label": "mi jasima e ijo 1/%{count}...", + "relink_unlinked.title": "mi pana e ijo lon tawa ijo", + "relink_unlinked.attempt_relink": "mi o pana e ijo lon tawa ijo %{x[0]+1}/%{len(self.lib.missing_files)}. mi pana e ijo lon tawa ijo %{self.fixed}", + "fix_dupes.fix_dupes": "pona e ijo sama", + "landing.open_button": "open/sin e tomo %{open_shortcut_text}", + "preview_panel.missing_location": "ma li lon ala", + "preview_panel.no_items_selected": "ijo ala li anu", + "preview_panel.confirm_remove": "sina weka e sona poki \"%{self.lib.get_field_attr(field, \"name\")}\". ni li pona anu seme?", + "preview_panel.mixed_data": "sona ante", + "preview_panel.edit_name": "ante", + "preview_panel.unknown_field_type": "mi sona ala e kule pi sona poki", + "tag.search_for_tag": "o alasa e poki", + "tag.add_search": "pana tawa alasa", + "text_line_edit.unknown_event_type": "mi sona ala e ni: %{event}", + "preview_panel.update_widgets": "[LIPU OPEN] O SIN E LIPU LILI (%{self.driver.selected})" +} diff --git a/tagstudio/resources/translations/tr.json b/tagstudio/resources/translations/tr.json new file mode 100644 index 00000000..b7a4cdf1 --- /dev/null +++ b/tagstudio/resources/translations/tr.json @@ -0,0 +1,144 @@ +{ + "home.main_window": "Ana Pencere", + "home.include_any_tag": "Veya (Herhangi Bir Etiketi Dikkate Alır)", + "home.thumbnail_size": "Küçük Resim Boyutu", + "home.search": "Ara", + "menu.file": "Dosya", + "menu.edit": "Düzenle", + "menu.tools": "Araçlar", + "menu.window": "Pencere", + "menu.help": "Yardım", + "tag.new": "Yeni Etiket", + "tag.add": "Etiket Ekle", + "tag.library": "Kütüphane Etiketleri", + "preview.dimensions": "Ölçüler", + "preview.recent": "Son Kütüphaneler", + "library.title": "Başlık", + "library.author": "Sahibi", + "library.Artist": "Sanatçı", + "library.notes": "Notlar", + "library.tags": "Etiketler", + "library.meta_tags": "Meta Etiketler", + "library.date": "Tarih", + "library.date_created": "Oluşturulma Tarihi", + "library.date_modified": "Değiştirilme Tarihi", + "library.archived": "Arşivlenme Tarihi", + "library.favorite": "Favori", + "library.book": "Kitap", + "library.comic": "Dergi", + "library.series": "Dizi", + "library.manga": "Manga", + "library.source": "Kaynak", + "library.date_released": "Çıkış Tarihi", + "library.volume": "Ses Seviyesi", + "library.anthology": "Antoloji", + "library.magazine": "Magazin", + "library.publisher": "Yayımcı", + "library.guest_artist": "Konuk Sanatçı", + "library.composer": "Besteci", + "library.comments": "Yorumlar", + "open_library.no_tagstudio_library_found": "'%{path}' konumunda herhangi bir TagStudio kütüphanesi bulunamadı. Yeni bir tane oluşturuluyor.", + "open_library.library_creation_return_code": "Kütüphane Oluşturmaktan Dönen Kod:", + "library.content_tags": "İçerik Etiketleri", + "library.collation": "Sıralama", + "library.date_taken": "Alınma Tarihi", + "home.search_entries": "library", + "merge.window_title": "Yinelenen Kayıtlar Birleştiriliyor", + "merge.merge_dupe_entries": "Yinelenen Kayıtlar Birleştiriliyor", + "status.backup_success": "Kütüphane Yedeklemesi Şuraya Kaydedildi:", + "status.search_library_query": "Kütüphane Aranıyor", + "status.enumerate_query": "Sorgu:%{query}, Kare: %{i}, Uzunluk: %{len(f)}", + "status.results_found": "Sonuçlar", + "progression.running_macros.new_entries": "Yeni Kayıtlar Üzerinde Makrolar Çalıştırılıyor", + "dialog.save_library": "Kütüphaneyi Kaydet", + "dialog.refresh_directories": "Dizinler Yenileniyor", + "dialog.scan_directories": "Yeni Dosyalar için Dizinler Taranıyor...\nHazırlanıyor...", + "tooltip.open_library": "Ctrl+O", + "tooltip.save_library": "Ctrl+S", + "file_opener.open_file": "Dosya açılıyor:}", + "file_opener.not_found": "Dosya bulunamadı:", + "add_field.add": "Alan Ekle", + "generic.remove_field": "Alan Kaldır", + "generic.file_extension": "Dosya Uzantıları", + "generic.open_file": "Dosya aç", + "generic.open_file_explorer": "Dosyayı Dosya Gezgininde Aç", + "generic.cancel": "İptal", + "generic.add": "Ekle", + "generic.name": "İsim", + "generic.shorthand": "Kısaltma", + "generic.aliases": "Takma Adlar", + "generic.color": "Renk", + "generic.delete": "Sil", + "generic.exclude": "Hariç Tut", + "generic.done": "Tamamlandı", + "generic.open_all": "Tümünü Aç", + "generic.close_all": "Tümünü Kapat", + "generic.refresh_all": "Tümünü Yenile", + "generic.apply": "Uygula", + "build_tags.parent_tags": "Üst Etiketler", + "build_tags.add_parent_tags": "Üst Etiketler Ekle", + "file_extension.add_extension": "Dosya Uzantısı Ekle", + "status.number_results_found": "\"%{query}\" (%{format_timespan(end_time - start_time)}) Sorgusu için %{len(all_items)} Sonuç Bulundu", + "progression.running_macros.one_new_entry": "1/%{len(new_ids)} Tane Yeni Kayıtlarda Yapılandırılmış Makrolar Çalıştırılıyor", + "progression.running_macros.several_new_entry": "%{x + 1}/%{len(new_ids)} Tane Yeni Kayıt Üzerinde Yapılandırılmış Makrolar Çalıştırılıyor", + "delete_unlinked.confirm": "%{len(self.lib.missing_files) tane kayıtları silmek istediğinden emin misin?", + "generic.mirror": "Yansıt", + "delete_unlinked.delete_unlinked": "Kopuk Kayıtları Sil", + "delete_unlinked.deleting_number_entries": "%{x[0]+1}/{len(self.lib.missing_files)} Kopuk Kayıt Siliniyor", + "fix_dupes.no_file_selected": "Seçili DupeGuru Dosyası Yok", + "fix_dupes.mirror_entries": "Kayıtları Yansıt", + "fix_dupes.open_result_files": "DupeGuru Sonuçlar Dosyasını Aç", + "fix_dupes.name_filter": "DupeGuru Dosyaları (*.dupeguru)", + "fix_dupes.no_file_match": "Bulunan Yinelenen Dosyalar: Yok", + "fix_dupes.number_file_match": "Bulunan Yinelenen Dosyalar: %{count}", + "fix_unlinked.fix_unlinked": "Kopuk Kayıtları Düzelt", + "fix_unlinked.search_and_relink": "Ara && Yeniden Eşleştir", + "fix_unlinked.refresh_dupes": "Yinelenen Kayıtları Yenile", + "fix_unlinked.merge_dupes": "Yinelenen Kayıtları Birleştir", + "fix_unlinked.manual_relink": "Manuel Yeniden Eşleştirme", + "fix_unlinked.delete_unlinked": "Kopuk Kayıtları Sil", + "fix_unlinked.scan_library.title": "Kütüphane Taranıyor", + "fix_unlinked.scan_library.label": "Kütüphane Kopuk Kayıtlar için Taranıyor...", + "folders_to_tags.folders_to_tags": "Klasörler Etiketlere Dönüştürülüyor", + "folders_to_tags.title": "Klasörlerden Etiketler Oluştur", + "folders_to_tags.description": "Klasörlerinin yapısına bakarak etiketler oluşturur ve bu etiketleri kayıtlarına uygular.\nAşağıdaki yapı, oluşturulacak tüm etiketleri ve o etiketlerin hangi kayıtlarına uygulanacağını göstermektedir.", + "home.base_title": "TagStudio Alpha", + "home.include_all_tags": "Ve (Tüm Etiketleri Dikkate Alır)", + "menu.macros": "Makrolar", + "library.url": "URL", + "library.description": "Açıklama", + "library.date_published": "Yayınlanma Tarihi", + "library.date_uploaded": "Yüklenme Tarihi", + "open_library.title": "Kütüphane", + "dialog.open_create_library": "Kütüphane Aç/Oluştur", + "splash.open_library": "Kütüphane Açılıyor", + "status.save_success": "Kütüphane Kaydedildi ve Çıkış Yapıldı!", + "dialog.scan_directories.new_files": "Yeni Dosyalar için Dizinler Taranıyor...\n%{x + 1} File%{\"s\" if x + 1 != 1 else \"\"} Arandı, %{len(self.lib.files_not_in_library)} Yeni Dosya Bulundu", + "file_opener.command_not_found": "Sistem PATH'inde %{command_name} komutu bulunamadı", + "generic.include": "Dahil Et", + "delete_unlinked.delete_entries": "Kayıtlar Siliniyor", + "generic.search_tags": "Etiketleri Araştır", + "file_extension.list_mode": "Listeleme Modu:", + "fix_dupes.mirror_description": "Kayıt verilerini bulunan her bir yinelemeye yansıtır, alanları kopyalamadan veya silmeden tüm verileri birleştirir. Bu operasyon herhangi bir dosya veya veri silmeyecek.", + "fix_dupes.fix_dupes": "Yinelenen Dosyaları Düzelt", + "fix_dupes.advice_label": "Yansıtma işleminden sonra, DupeGuru'yu kullanarak istenmeyen dosyaları silebilirsin. İşlem sonrasında, kopuk kayıtları silmek için TagStudio'nun Araçlar menüsünden \"Kopuk Kayıtları Düzelt\" özelliğini kullanabilirsin.", + "fix_dupes.load_file": "DupeGuru Dosyasını Yükle", + "fix_unlinked.duplicate_description": "Yinelenen kayıtlar, diskinizde aynı dosyaya işaret eden birden fazla kayıt olarak tanımlanmaktadır. Bu kayıtları birleştirdiğinizde, yinelenen tüm kayıtların içerisindeki etiketler ve metadata bilgisi tek bir tane kayıt üzerinde birleştirilecektir. Bu, \"yinelenen dosyalar\" ile karıştırılmamalıdır. Yinelenen dosyalar, TagStudio'nun dışında birden fazla kere bulunan dosyalarınızdır.", + "fix_unlinked.description": "Kütüphanenizdeki her bir kayıt, dizinlerinizden bir tane dosya ile eşleştirilmektedir. Eğer bir kayıta bağlı dosya TagStudio dışında taşınır veya silinirse, o dosya artık kopuk olarak sayılır. Kopuk kayıtlar dizinlerinizde arama yapılırken otomatik olarak tekrar eşleştirilebilir, manuel olarak sizin tarafınızdan eşleştirilebilir veya isteğiniz üzere silinebilir.", + "mirror_entities.title": "Kayıtlar Yansıtılıyor", + "mirror_entities.label": "1/%{count} Kayıt Yansıtılıyor...", + "relink_unlinked.title": "Kayıtlar Yeniden Eşleştiriliyor", + "relink_unlinked.attempt_relink": "%{x[0]+1}/%{len(self.lib.missing_files)} Kayıt Yeniden Eşleştirilmeye Çalışılıyor, %{self.fixed} Başarıyla Yeniden Eşleştirildi", + "landing.open_button": "Kütüphane Aç/Oluştur %{open_shortcut_text}", + "preview_panel.missing_location": "Lokasyon bulunamadı", + "preview_panel.update_widgets": "[KAYIT PANELİ] WIDGET'LARI GÜNCELLE (%{self.driver.selected})", + "preview_panel.no_items_selected": "Hiçbir Öğe Seçilmedi", + "preview_panel.confirm_remove": "Bu \"%{self.lib.get_field_attr(field, \"name\")}\" alanını silmek istediğinden emin misin?", + "preview_panel.mixed_data": "Karışık Veri", + "preview_panel.edit_name": "Düzenle", + "preview_panel.unknown_field_type": "Bilinmeyen Alan Türü", + "tag.search_for_tag": "Etiket Ara", + "tag.add_search": "Aramaya Ekle", + "text_line_edit.unknown_event_type": "bilinmeyen event türü: %{event}", + "mirror_entities.are_you_sure": "%{len(self.lib.dupe_files)} kaydı yansıtmak istediğinden emin misin?" +} diff --git a/tagstudio/resources/translations/yue_Hant.json b/tagstudio/resources/translations/yue_Hant.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/tagstudio/resources/translations/yue_Hant.json @@ -0,0 +1 @@ +{} From 1c7aaf0a16c272d777899679b3c2822f4bab9798 Mon Sep 17 00:00:00 2001 From: Travis Abendshien Date: Wed, 2 Oct 2024 14:48:01 -0700 Subject: [PATCH 06/82] Revert "translations: update from Hosted Weblate (#530)" This reverts commit fe207062d5344f3159434880ac85acb816f01068. --- tagstudio/resources/translations/da.json | 6 - tagstudio/resources/translations/de.json | 125 -------- tagstudio/resources/translations/en.json | 286 +++++++++--------- tagstudio/resources/translations/es.json | 144 --------- tagstudio/resources/translations/fr.json | 144 --------- tagstudio/resources/translations/hu.json | 144 --------- tagstudio/resources/translations/it.json | 19 -- tagstudio/resources/translations/nb_NO.json | 102 ------- tagstudio/resources/translations/pt.json | 1 - tagstudio/resources/translations/pt_BR.json | 144 --------- tagstudio/resources/translations/ru.json | 144 --------- tagstudio/resources/translations/sv.json | 115 ------- tagstudio/resources/translations/ta.json | 144 --------- tagstudio/resources/translations/tok.json | 144 --------- tagstudio/resources/translations/tr.json | 144 --------- .../resources/translations/yue_Hant.json | 1 - 16 files changed, 143 insertions(+), 1664 deletions(-) delete mode 100644 tagstudio/resources/translations/da.json delete mode 100644 tagstudio/resources/translations/de.json delete mode 100644 tagstudio/resources/translations/es.json delete mode 100644 tagstudio/resources/translations/fr.json delete mode 100644 tagstudio/resources/translations/hu.json delete mode 100644 tagstudio/resources/translations/it.json delete mode 100644 tagstudio/resources/translations/nb_NO.json delete mode 100644 tagstudio/resources/translations/pt.json delete mode 100644 tagstudio/resources/translations/pt_BR.json delete mode 100644 tagstudio/resources/translations/ru.json delete mode 100644 tagstudio/resources/translations/sv.json delete mode 100644 tagstudio/resources/translations/ta.json delete mode 100644 tagstudio/resources/translations/tok.json delete mode 100644 tagstudio/resources/translations/tr.json delete mode 100644 tagstudio/resources/translations/yue_Hant.json diff --git a/tagstudio/resources/translations/da.json b/tagstudio/resources/translations/da.json deleted file mode 100644 index 870e71a8..00000000 --- a/tagstudio/resources/translations/da.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "home.base_title": "TagStudio Alfa", - "home.main_window": "Hovedvindue", - "home.include_all_tags": "Og (inkluderer alle tags)", - "home.include_any_tag": "Og (inkluderer envher tag)" -} diff --git a/tagstudio/resources/translations/de.json b/tagstudio/resources/translations/de.json deleted file mode 100644 index d98cdee7..00000000 --- a/tagstudio/resources/translations/de.json +++ /dev/null @@ -1,125 +0,0 @@ -{ - "home.main_window": "Hauptfenster", - "home.include_all_tags": "Und (enthält alle Tags)", - "home.include_any_tag": "Oder (enthält alle Tags)", - "home.base_title": "TagStudio Alpha", - "menu.file": "Datei", - "menu.edit": "Bearbeiten", - "menu.macros": "Makros", - "tag.add": "Hinzufüge Tag", - "preview.dimensions": "Abmessungen", - "preview.recent": "Aktuelle Bibliotheken", - "library.title": "Titel", - "library.Artist": "Künstler", - "menu.tools": "Werkzeuge", - "menu.window": "Fenster", - "menu.help": "Hilfe", - "tag.new": "Neuer Tag", - "merge.window_title": "Zusammenführen von doppelten Einträgen", - "merge.merge_dupe_entries": "Zusammenführen von doppelten Einträgen", - "library.author": "Autor", - "library.url": "URL", - "library.date_modified": "Datum geändert", - "home.thumbnail_size": "Grösse des Vorschaubildes", - "home.search_entries": "Nach Einträgen suchen", - "home.search": "Suchen", - "tag.library": "Bibliothek Tags", - "library.description": "Beschreibung", - "library.notes": "Notizen", - "library.tags": "Tags", - "library.date_taken": "Aufnahmedatum", - "library.date": "Datum", - "library.date_created": "Erstellungsdatum", - "library.book": "Buch", - "library.comic": "Comicheft", - "library.manga": "Manga", - "library.source": "Quelle", - "library.date_uploaded": "Hochladedatum", - "library.date_released": "Veröffentlichungsdatum", - "library.volume": "Band", - "library.anthology": "Anthologie", - "library.magazine": "Zeitschrift", - "library.composer": "Komponist", - "open_library.library_creation_return_code": "Bibliothekserstellung Rückgabecode:", - "open_library.title": "Bibliothek", - "dialog.open_create_library": "Bibliothek öffnen/erstellen", - "splash.open_library": "Die Bibliothek wird geöffnet", - "status.save_success": "Bibliothek gespeichert und geschlossen!", - "status.search_library_query": "Suche in der Bibliothek nach", - "status.enumerate_query": "Abfrage:%{Abfrage}, Rahmen: %{i}, Länge: %{len(f)}", - "status.number_results_found": "%{len(all_items)} Ergebnisse gefunden für „%{query}“ (%{format_timespan(end_time - start_time)})", - "status.results_found": "Ergebnisse", - "progression.running_macros.new_entries": "Ausführen von Makros bei neuen Einträgen", - "progression.running_macros.one_new_entry": "Ausführen konfigurierter Makros für 1/%{len(new_ids)} neue Einträge", - "file_opener.open_file": "Datei öffnen:}", - "file_opener.not_found": "Datei nicht gefunden:", - "file_opener.command_not_found": "Konnte %{command_name} nicht im System PATH finden", - "add_field.add": "Feld hinzufügen", - "generic.remove_field": "Feld entfernen", - "generic.file_extension": "Dateierweiterungen", - "generic.open_file": "Datei öffnen", - "generic.open_file_explorer": "Datei im Explorer öffnen", - "generic.cancel": "Abbrechen", - "generic.add": "hinzufügen", - "generic.name": "Name", - "generic.color": "Farbe", - "generic.delete": "Löschen", - "generic.exclude": "ausschliessen", - "generic.include": "einschliessen", - "generic.done": "Fertig", - "generic.close_all": "Alle schliessen", - "generic.refresh_all": "Alle aktualisieren", - "generic.apply": "anwenden", - "generic.mirror": "Spiegel", - "generic.search_tags": "Tags suchen", - "build_tags.add_parent_tags": "Übergeordnete Tags hinzufügen", - "build_tags.parent_tags": "Übergeordnete Tags", - "delete_unlinked.delete_entries": "Einträge am Löschen", - "delete_unlinked.deleting_number_entries": "Löschen von %{x[0]+1}/{len(self.lib.missing_files)} Unverknüpften Einträgen", - "file_extension.add_extension": "Erweiterung hinzufügen", - "fix_dupes.no_file_selected": "Keine DupeGuru-Datei ausgewählt", - "fix_dupes.advice_label": "Nach der Spiegelung können Sie DupeGuru verwenden, um die unerwünschten Dateien zu löschen. Verwenden Sie anschliessend die Funktion „Unverknüpfte Einträge reparieren“ im Menü „Extras“ von TagStudio, um die unverknüpften Einträge zu löschen.", - "fix_dupes.no_file_match": "Übereinstimmungen mit doppelten Dateien: N/A", - "fix_dupes.number_file_match": "Übereinstimmungen mit doppelten Dateien: %{count}", - "fix_unlinked.fix_unlinked": "Unverknüpfte Einträge reparieren", - "fix_unlinked.search_and_relink": "Suche && Neuverbindung", - "fix_unlinked.refresh_dupes": "Doppelte Einträge aktualisieren", - "fix_unlinked.merge_dupes": "Doppelte Einträge zusammenführen", - "fix_unlinked.manual_relink": "Manuelle Neuverknüpfung", - "fix_unlinked.delete_unlinked": "Nicht verknüpfte Einträge löschen", - "fix_unlinked.scan_library.title": "Bibliothek wird scannen", - "fix_unlinked.scan_library.label": "Bibliothek nach nicht verknüpften Einträgen durchsuchen...", - "library.date_published": "Datum des Publizierten", - "library.archived": "Archivierungsdatum", - "library.favorite": "Favoriten", - "library.series": "Serie", - "library.publisher": "Herausgeber", - "library.guest_artist": "Gastkünstler", - "library.comments": "Kommentare", - "open_library.no_tagstudio_library_found": "Keine vorhandene TagStudio-Bibliothek unter '%{Pfad}' gefunden. Eine wird erstellt.", - "generic.shorthand": "Kürzel", - "generic.aliases": "Aliase", - "generic.open_all": "Alle öffnen", - "delete_unlinked.delete_unlinked": "Unverknüpfte Einträge löschen", - "delete_unlinked.confirm": "Sind Sie sicher, dass Sie die folgenden %{len(self.lib.missing_files)}-Einträge löschen wollen?", - "fix_dupes.fix_dupes": "Doppelte Dateien korrigieren", - "fix_dupes.load_file": "DupeGuru-Datei laden", - "fix_dupes.mirror_entries": "Spiegelnde Einträge", - "fix_dupes.mirror_description": "Spiegeln die Eingabedaten für jeden doppelten Abgleichsatz, indem Sie alle Daten kombinieren, ohne Felder zu entfernen oder zu duplizieren. Bei diesem Vorgang werden keine Dateien oder Daten gelöscht.", - "fix_dupes.open_result_files": "DupeGuru Ergebnisdatei öffnen", - "fix_dupes.name_filter": "DupeGuru-Dateien (*.dupeguru)", - "fix_unlinked.description": "Jeder Bibliothekseintrag ist mit einer Datei in einem Ihrer Verzeichnisse verknüpft. Wenn eine Datei, die mit einem Eintrag verknüpft ist, ausserhalb von TagStudio verschoben oder gelöscht wird, gilt sie als nicht verknüpft. Nicht verknüpfte Einträge können durch Durchsuchen Ihrer Verzeichnisse automatisch neu verknüpft, vom Benutzer manuell neu verknüpft oder auf Wunsch gelöscht werden.", - "fix_unlinked.duplicate_description": "Doppelte Einträge sind definiert als mehrere Einträge, die auf dieselbe Datei auf der Festplatte verweisen. Durch das Zusammenführen dieser Einträge werden die Tags und Metadaten aller Duplikate zu einem einzigen konsolidierten Eintrag zusammengefasst. Diese sind nicht zu verwechseln mit „doppelten Dateien“, die Duplikate Ihrer Dateien selbst außerhalb von TagStudio sind.", - "library.content_tags": "Inhalt Tags", - "library.collation": "Zusammenstellung", - "library.meta_tags": "Meta Tags", - "status.backup_success": "Bibliotheks-Backup gespeichert unter:", - "dialog.scan_directories.new_files": "Verzeichnisse nach neuen Dateien durchsuchen...\n%{x + 1} Datei%{„s“ if x + 1 != 1 else „“} Gesucht, %{len(self.lib.files_not_in_library)} Neue Dateien gefunden", - "tooltip.open_library": "Ctrl+O", - "tooltip.save_library": "Ctrl+S", - "progression.running_macros.several_new_entry": "Ausführen konfigurierter Makros für %{x + 1}/%{len(new_ids)} neue Einträge", - "dialog.save_library": "Bibliothek speichern", - "dialog.refresh_directories": "Verzeichnisse werden aktualisiert", - "dialog.scan_directories": "Überprüfe Verzeichnisse auf neue Dateien...\nBereite vor...", - "relink_unlinked.title": "Einträge werden neuverknüpft" -} diff --git a/tagstudio/resources/translations/en.json b/tagstudio/resources/translations/en.json index 0f9b61e0..016aa323 100644 --- a/tagstudio/resources/translations/en.json +++ b/tagstudio/resources/translations/en.json @@ -1,144 +1,144 @@ { - "home.base_title": "TagStudio Alpha", - "home.main_window": "Main Window", - "home.include_all_tags": "And (Includes All Tags)", - "home.include_any_tag": "Or (Includes Any Tag)", - "home.thumbnail_size": "Thumbnail Size", - "home.search_entries": "Search Entries", - "home.search": "Search", - "menu.file": "File", - "menu.edit": "Edit", - "menu.tools": "Tools", - "menu.macros": "Macros", - "menu.window": "Window", - "menu.help": "Help", - "tag.new": "New Tag", - "tag.add": "Add Tag", - "tag.library": "Library Tags", - "merge.window_title": "Merging Duplicate Entries", - "merge.merge_dupe_entries": "Merging Duplicate Entries", - "preview.dimensions": "Dimensions", - "preview.recent": "Recent Libraries", - "library.title": "Title", - "library.author": "Author", - "library.Artist": "Artist", - "library.url": "URL", - "library.description": "Description", - "library.notes": "Notes", - "library.tags": "Tags", - "library.content_tags": "Content Tags", - "library.meta_tags": "Meta Tags", - "library.collation": "Collation", - "library.date": "Date", - "library.date_created": "Date Created", - "library.date_modified": "Date Modified", - "library.date_taken": "Date Taken", - "library.date_published": "Date Published", - "library.archived": "Date Archived", - "library.favorite": "Favorite", - "library.book": "Book", - "library.comic": "Comic", - "library.series": "Series", - "library.manga": "Manga", - "library.source": "Source", - "library.date_uploaded": "Date Uploaded", - "library.date_released": "Date Released", - "library.volume": "Volume", - "library.anthology": "Anthology", - "library.magazine": "Magazine", - "library.publisher": "Publisher", - "library.guest_artist": "Guest Artist", - "library.composer": "Composer", - "library.comments": "Comments", - "open_library.no_tagstudio_library_found": "No existing TagStudio library found at '%{path}'. Creating one.", - "open_library.library_creation_return_code": "Library Creation Return Code:", - "open_library.title": "Library", - "dialog.open_create_library": "Open/Create Library", - "splash.open_library": "Opening Library", - "status.save_success": "Library Saved and Closed!", - "status.backup_success": "Library Backup Saved at:", - "status.search_library_query": "Searching Library for", - "status.enumerate_query": "Query:%{query}, Frame: %{i}, Length: %{len(f)}", - "status.number_results_found": "%{len(all_items)} Results Found for \"%{query}\" (%{format_timespan(end_time - start_time)})", - "status.results_found": "Results", - "dialog.save_library": "Save Library", - "dialog.refresh_directories": "Refreshing Directories", - "dialog.scan_directories": "Scanning Directories for New Files...\nPreparing...", - "dialog.scan_directories.new_files": "Scanning Directories for New Files...\n%{x + 1} File%{\"s\" if x + 1 != 1 else \"\"} Searched, %{len(self.lib.files_not_in_library)} New Files Found", - "tooltip.open_library": "Ctrl+O", - "tooltip.save_library": "Ctrl+S", - "progression.running_macros.new_entries": "Running Macros on New Entries", - "progression.running_macros.one_new_entry": "Running Configured Macros on 1/%{len(new_ids)} New Entries", - "progression.running_macros.several_new_entry": "Running Configured Macros on %{x + 1}/%{len(new_ids)} New Entries", - "file_opener.open_file": "Opening file:}", - "file_opener.not_found": "File not found:", - "file_opener.command_not_found": "Could not find %{command_name} on system PATH", - "add_field.add": "Add Field", - "generic.remove_field": "Remove Field", - "generic.file_extension": "File Extensions", - "generic.open_file": "Open file", - "generic.open_file_explorer": "Open file in explorer", - "generic.cancel": "Cancel", - "generic.add": "Add", - "generic.name": "Name", - "generic.shorthand": "Shorthand", - "generic.aliases": "Aliases", - "generic.color": "Color", - "generic.delete": "Delete", - "generic.exclude": "Exclude", - "generic.include": "Include", - "generic.done": "Done", - "generic.open_all": "Open All", - "generic.close_all": "Close All", - "generic.refresh_all": "Refresh All", - "generic.apply": "Apply", - "generic.mirror": "Mirror", - "generic.search_tags": "Search Tags", - "build_tags.parent_tags": "Parent Tags", - "build_tags.add_parent_tags": "Add Parent Tags", - "delete_unlinked.delete_unlinked": "Delete Unlinked Entries", - "delete_unlinked.confirm": "Are you sure you want to delete the following %{len(self.lib.missing_files)} entries?", - "delete_unlinked.delete_entries": "Deleting Entries", - "delete_unlinked.deleting_number_entries": "Deleting %{x[0]+1}/{len(self.lib.missing_files)} Unlinked Entries", - "file_extension.add_extension": "Add Extension", - "file_extension.list_mode": "List Mode:", - "fix_dupes.fix_dupes": "Fix Duplicate Files", - "fix_dupes.no_file_selected": "No DupeGuru File Selected", - "fix_dupes.load_file": "Load DupeGuru File", - "fix_dupes.mirror_entries": "Mirror Entries", - "fix_dupes.mirror_description": "Mirror the Entry data across each duplicate match set, combining all data while not removing or duplicating fields. This operation will not delete any files or data.", - "fix_dupes.advice_label": "After mirroring, you're free to use DupeGuru to delete the unwanted files. Afterwards, use TagStudio's \"Fix Unlinked Entries\" feature in the Tools menu in order to delete the unlinked Entries.", - "fix_dupes.open_result_files": "Open DupeGuru Results File", - "fix_dupes.name_filter": "DupeGuru Files (*.dupeguru)", - "fix_dupes.no_file_match": "Duplicate File Matches: N/A", - "fix_dupes.number_file_match": "Duplicate File Matches: %{count}", - "fix_unlinked.fix_unlinked": "Fix Unlinked Entries", - "fix_unlinked.description": "Each library entry is linked to a file in one of your directories. If a file linked to an entry is moved or deleted outside of TagStudio, it is then considered unlinked. Unlinked entries may be automatically relinked via searching your directories, manually relinked by the user, or deleted if desired.", - "fix_unlinked.duplicate_description": "Duplicate entries are defined as multiple entries which point to the same file on disk. Merging these will combine the tags and metadata from all duplicates into a single consolidated entry. These are not to be confused with \"duplicate files\", which are duplicates of your files themselves outside of TagStudio.", - "fix_unlinked.search_and_relink": "Search && Relink", - "fix_unlinked.refresh_dupes": "Refresh Duplicate Entries", - "fix_unlinked.merge_dupes": "Merge Duplicate Entries", - "fix_unlinked.manual_relink": "Manual Relink", - "fix_unlinked.delete_unlinked": "Delete Unlinked Entries", - "fix_unlinked.scan_library.title": "Scanning Library", - "fix_unlinked.scan_library.label": "Scanning Library for Unlinked Entries...", - "folders_to_tags.folders_to_tags": "Converting folders to Tags", - "folders_to_tags.title": "Create Tags From Folders", - "folders_to_tags.description": "Creates tags based on your folder structure and applies them to your entries.\n The structure below shows all the tags that will be created and what entries they will be applied to.", - "mirror_entities.are_you_sure": "Are you sure you want to mirror the following %{len(self.lib.dupe_files)} Entries?", - "mirror_entities.title": "Mirroring Entries", - "mirror_entities.label": "Mirroring 1/%{count} Entries...", - "relink_unlinked.title": "Relinking Entries", - "relink_unlinked.attempt_relink": "Attempting to Relink %{x[0]+1}/%{len(self.lib.missing_files)} Entries, %{self.fixed} Successfully Relinked", - "landing.open_button": "Open/Create Library %{open_shortcut_text}", - "preview_panel.missing_location": "Location is missing", - "preview_panel.update_widgets": "[ENTRY PANEL] UPDATE WIDGETS (%{self.driver.selected})", - "preview_panel.no_items_selected": "No Items Selected", - "preview_panel.confirm_remove": "Are you sure you want to remove this \"%{self.lib.get_field_attr(field, \"name\")}\" field?", - "preview_panel.mixed_data": "Mixed Data", - "preview_panel.edit_name": "Edit", - "preview_panel.unknown_field_type": "Unknown Field Type", - "tag.search_for_tag": "Search for Tag", - "tag.add_search": "Add to Search", - "text_line_edit.unknown_event_type": "unknown event type: %{event}" -} + "home.base_title": "TagStudio Alpha", + "home.main_window": "Main Window", + "home.include_all_tags": "And (Includes All Tags)", + "home.include_any_tag": "Or (Includes Any Tag)", + "home.thumbnail_size": "Thumbnail Size", + "home.search_entries": "Search Entries", + "home.search": "Search", + "menu.file": "File", + "menu.edit": "Edit", + "menu.tools": "Tools", + "menu.macros": "Macros", + "menu.window": "Window", + "menu.help": "Help", + "tag.new": "New Tag", + "tag.add": "Add Tag", + "tag.library": "Library Tags", + "merge.window_title": "Merging Duplicate Entries", + "merge.merge_dupe_entries": "Merging Duplicate Entries", + "preview.dimensions": "Dimensions", + "preview.recent": "Recent Libraries", + "library.title": "Title", + "library.author": "Author", + "library.Artist": "Artist", + "library.url": "URL", + "library.description": "Description", + "library.notes": "Notes", + "library.tags": "Tags", + "library.content_tags": "Content Tags", + "library.meta_tags": "Meta Tags", + "library.collation": "Collation", + "library.date": "Date", + "library.date_created": "Date Created", + "library.date_modified": "Date Modified", + "library.date_taken": "Date Taken", + "library.date_published": "Date Published", + "library.archived": "Date Archived", + "library.favorite": "Favorite", + "library.book": "Book", + "library.comic": "Comic", + "library.series": "Series", + "library.manga": "Manga", + "library.source": "Source", + "library.date_uploaded": "Date Uploaded", + "library.date_released": "Date Released", + "library.volume": "Volume", + "library.anthology": "Anthology", + "library.magazine": "Magazine", + "library.publisher": "Publisher", + "library.guest_artist": "Guest Artist", + "library.composer": "Composer", + "library.comments": "Comments", + "open_library.no_tagstudio_library_found": "No existing TagStudio library found at '%{path}'. Creating one.", + "open_library.library_creation_return_code": "Library Creation Return Code:", + "open_library.title": "Library", + "dialog.open_create_library": "Open/Create Library", + "splash.open_library": "Opening Library", + "status.save_success": "Library Saved and Closed!", + "status.backup_success": "Library Backup Saved at:", + "status.search_library_query": "Searching Library for", + "status.enumerate_query": "Query:%{query}, Frame: %{i}, Length: %{len(f)}", + "status.number_results_found": "%{len(all_items)} Results Found for \"%{query}\" (%{format_timespan(end_time - start_time)})", + "status.results_found": "Results", + "dialog.save_library": "Save Library", + "dialog.refresh_directories": "Refreshing Directories", + "dialog.scan_directories": "Scanning Directories for New Files...\nPreparing...", + "dialog.scan_directories.new_files": "Scanning Directories for New Files...\n%{x + 1} File%{\"s\" if x + 1 != 1 else \"\"} Searched, %{len(self.lib.files_not_in_library)} New Files Found", + "tooltip.open_library": "Ctrl+O", + "tooltip.save_library": "Ctrl+S", + "progression.running_macros.new_entries": "Running Macros on New Entries", + "progression.running_macros.one_new_entry": "Running Configured Macros on 1/%{len(new_ids)} New Entries", + "progression.running_macros.several_new_entry": "Running Configured Macros on %{x + 1}/%{len(new_ids)} New Entries", + "file_opener.open_file": "Opening file:}", + "file_opener.not_found": "File not found:", + "file_opener.command_not_found": "Could not find %{command_name} on system PATH", + "add_field.add": "Add Field", + "generic.remove_field": "Remove Field", + "generic.file_extension": "File Extensions", + "generic.open_file": "Open file", + "generic.open_file_explorer": "Open file in explorer", + "generic.cancel": "Cancel", + "generic.add": "Add", + "generic.name": "Name", + "generic.shorthand": "Shorthand", + "generic.aliases": "Aliases", + "generic.color": "Color", + "generic.delete": "Delete", + "generic.exclude": "Exclude", + "generic.include": "Include", + "generic.done": "Done", + "generic.open_all": "Open All", + "generic.close_all": "Close All", + "generic.refresh_all": "Refresh_All", + "generic.apply": "Apply", + "generic.mirror": "Mirror", + "generic.search_tags": "Search Tags", + "build_tags.parent_tags": "Parent Tags", + "build_tags.add_parent_tags": "Add Parent Tags", + "delete_unlinked.delete_unlinked": "Delete Unlinked Entries", + "delete_unlinked.confirm": "Are you sure you want to delete the following %{len(self.lib.missing_files)} entries?", + "delete_unlinked.delete_entries": "Deleting Entries", + "delete_unlinked.deleting_number_entries": "Deleting %{x[0]+1}/{len(self.lib.missing_files)} Unlinked Entries", + "file_extension.add_extension": "Add Extension", + "file_extension.list_mode": "List Mode:", + "fix_dupes.fix_dupes": "Fix Duplicate Files", + "fix_dupes.no_file_selected": "No DupeGuru File Selected", + "fix_dupes.load_file": "Load DupeGuru File", + "fix_dupes.mirror_entries": "Mirror Entries", + "fix_dupes.mirror_description": "Mirror the Entry data across each duplicate match set, combining all data while not removing or duplicating fields. This operation will not delete any files or data.", + "fix_dupes.advice_label": "After mirroring, you're free to use DupeGuru to delete the unwanted files. Afterwards, use TagStudio's \"Fix Unlinked Entries\" feature in the Tools menu in order to delete the unlinked Entries.", + "fix_dupes.open_result_files": "Open DupeGuru Results File", + "fix_dupes.name_filter": "DupeGuru Files (*.dupeguru)", + "fix_dupes.no_file_match": "Duplicate File Matches: N/A", + "fix_dupes.number_file_match": "Duplicate File Matches: %{count}", + "fix_unlinked.fix_unlinked": "Fix Unlinked Entries", + "fix_unlinked.description": "Each library entry is linked to a file in one of your directories. If a file linked to an entry is moved or deleted outside of TagStudio, it is then considered unlinked. Unlinked entries may be automatically relinked via searching your directories, manually relinked by the user, or deleted if desired.", + "fix_unlinked.duplicate_description": "Duplicate entries are defined as multiple entries which point to the same file on disk. Merging these will combine the tags and metadata from all duplicates into a single consolidated entry. These are not to be confused with \"duplicate files\", which are duplicates of your files themselves outside of TagStudio.", + "fix_unlinked.search_and_relink": "Search && Relink", + "fix_unlinked.refresh_dupes": "Refresh Duplicate Entries", + "fix_unlinked.merge_dupes": "Merge Duplicate Entries", + "fix_unlinked.manual_relink": "Manual Relink", + "fix_unlinked.delete_unlinked": "Delete Unlinked Entries", + "fix_unlinked.scan_library.title": "Scanning Library", + "fix_unlinked.scan_library.label": "Scanning Library for Unlinked Entries...", + "folders_to_tags.folders_to_tags": "Converting folders to Tags", + "folders_to_tags.title": "Create Tags From Folders", + "folders_to_tags.description": "Creates tags based on your folder structure and applies them to your entries.\n The structure below shows all the tags that will be created and what entries they will be applied to.", + "mirror_entities.are_you_sure": "Are you sure you want to mirror the following %{len(self.lib.dupe_files)} Entries?", + "mirror_entities.title": "Mirroring Entries", + "mirror_entities.label": "Mirroring 1/%{count} Entries...", + "relink_unlinked.title": "Relinking Entries", + "relink_unlinked.attempt_relink": "Attempting to Relink %{x[0]+1}/%{len(self.lib.missing_files)} Entries, %{self.fixed} Successfully Relinked", + "landing.open_button": "Open/Create Library %{open_shortcut_text}", + "preview_panel.missing_location": "Location is missing", + "preview_panel.update_widgets": "[ENTRY PANEL] UPDATE WIDGETS (%{self.driver.selected})", + "preview_panel.no_items_selected": "No Items Selected", + "preview_panel.confirm_remove": "Are you sure you want to remove this \"%{self.lib.get_field_attr(field, \"name\")}\" field?", + "preview_panel.mixed_data": "Mixed Data", + "preview_panel.edit_name": "Edit", + "preview_panel.unknown_field_type": "Unknown Field Type", + "tag.search_for_tag": "Search for Tag", + "tag.add_search": "Add to Search", + "text_line_edit.unknown_event_type": "unknown event type: %{event}" +} \ No newline at end of file diff --git a/tagstudio/resources/translations/es.json b/tagstudio/resources/translations/es.json deleted file mode 100644 index 968ec0cf..00000000 --- a/tagstudio/resources/translations/es.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "home.main_window": "Ventana principal", - "tag.library": "Etiquetas de la biblioteca", - "home.base_title": "TagStudio Alfa", - "home.include_all_tags": "Y (Incluye todas las etiquetas)", - "home.thumbnail_size": "Tamaño de la miniatura", - "home.search_entries": "Buscar entradas", - "home.search": "Buscar", - "menu.file": "Archivo", - "menu.edit": "Editar", - "menu.tools": "Herramientas", - "menu.macros": "Macro", - "menu.window": "Ventana", - "menu.help": "Ayuda", - "tag.new": "Nueva etiqueta", - "tag.add": "Añadir etiqueta", - "home.include_any_tag": "O (Incluye cualquier etiqueta)", - "merge.merge_dupe_entries": "Fusionando entradas duplicadas", - "preview.recent": "Bibliotecas recientes", - "library.author": "Autor", - "library.Artist": "Artista", - "library.url": "URL", - "library.description": "Descripción", - "library.notes": "Notas", - "library.tags": "Etiquetas", - "library.title": "Título", - "merge.window_title": "Fusionando entradas duplicadas", - "preview.dimensions": "Dimensiones", - "library.content_tags": "Etiquetas del contenido", - "library.meta_tags": "Etiquetas de metadatos", - "library.collation": "Recopilación", - "library.date": "Fecha", - "library.date_created": "Fecha de creación", - "library.date_modified": "Fecha de modificación", - "library.date_taken": "Fecha de realización", - "library.archived": "Fecha de archivo", - "library.source": "Fuente", - "library.date_published": "Fecha de publicación", - "library.series": "Series", - "library.favorite": "Favorito", - "library.book": "Libro", - "library.comic": "Tebeo", - "library.manga": "Manga", - "library.date_uploaded": "Fecha de carga", - "library.date_released": "Fecha de lanzamiento", - "library.volume": "Volumen", - "library.anthology": "Antología", - "library.magazine": "Revista", - "library.publisher": "Editor", - "library.composer": "Compositor", - "library.comments": "Comentarios", - "open_library.no_tagstudio_library_found": "No se encontró ninguna biblioteca TagStudio existente en '%{path}'. Se está creando una.", - "open_library.library_creation_return_code": "Código de retorno de creación de biblioteca:", - "open_library.title": "Biblioteca", - "dialog.open_create_library": "Abrir/Crear biblioteca", - "splash.open_library": "Abriendo la biblioteca", - "status.search_library_query": "Buscando en la biblioteca", - "status.enumerate_query": "Consulta:%{query}, Cuadro: %{i}, Longitud: %{len(f)}", - "dialog.scan_directories.new_files": "Buscando archivos nuevos en los directorios...\n%{x + 1} Archivo%{\"s\" if x + 1 != 1 else \"\"} Buscado, %{len(self.lib.files_not_in_library)} Archivos nuevos encontrados", - "tooltip.open_library": "Ctrl+O", - "tooltip.save_library": "Ctrl+S", - "progression.running_macros.new_entries": "Ejecución de macros en entradas nuevas", - "progression.running_macros.one_new_entry": "Ejecución de macros configurados en 1/%{len(new_ids)} entradas nuevas", - "library.guest_artist": "Artista invitado", - "status.save_success": "¡Biblioteca guardada y cerrada!", - "status.backup_success": "Copia de seguridad de la biblioteca guardada en:", - "status.number_results_found": "%{len(all_items)} Resultados encontrados para \"%{query}\" (%{format_timespan(end_time - start_time)})", - "status.results_found": "Resultados", - "dialog.save_library": "Guardar la biblioteca", - "dialog.refresh_directories": "Refrescar directorios", - "dialog.scan_directories": "Buscar archivos nuevos en los directorios...\nPreparando...", - "progression.running_macros.several_new_entry": "Ejecución de macros configurados en %{x + 1}/%{len(new_ids)} entradas nuevas", - "file_opener.open_file": "Abriendo archivo :}", - "file_opener.not_found": "Archivo no encontrado:", - "file_opener.command_not_found": "No se pudo encontrar %{command_name} en el PATH del sistema", - "add_field.add": "Añadir campo", - "generic.remove_field": "Eliminar campo", - "generic.file_extension": "Extensiones del archivo", - "generic.open_file": "Abrir archivo", - "generic.open_file_explorer": "Abrir archivo en el explorador", - "generic.cancel": "Cancelar", - "generic.exclude": "Excluir", - "generic.include": "Incluir", - "generic.done": "Donar", - "generic.open_all": "Abrir todo", - "generic.close_all": "Cerrar todo", - "generic.add": "Añadir", - "generic.name": "Nombre", - "generic.shorthand": "Taquigrafía", - "generic.aliases": "Alias", - "generic.color": "Color", - "generic.delete": "Borrar", - "generic.refresh_all": "Recargar todo", - "generic.apply": "Aplicar", - "generic.mirror": "Espejo", - "build_tags.parent_tags": "Etiquetas principales", - "build_tags.add_parent_tags": "Añadir etiquetas principales", - "delete_unlinked.confirm": "¿Está seguro de que desea eliminar las siguientes %{len(self.lib.missing_files)} entradas?", - "delete_unlinked.delete_entries": "Eliminando entradas", - "delete_unlinked.deleting_number_entries": "Eliminando %{x[0]+1}/{len(self.lib.missing_files)} entradas no vinculadas", - "file_extension.add_extension": "Añadir extensión", - "file_extension.list_mode": "Modo de lista:", - "fix_dupes.fix_dupes": "Reparar archivos duplicados", - "fix_dupes.no_file_selected": "No se ha seleccionado ningún archivo DupeGuru", - "fix_dupes.load_file": "Cargar archivo DupeGuru", - "generic.search_tags": "Buscar etiquetas", - "delete_unlinked.delete_unlinked": "Eliminar entradas no vinculadas", - "fix_dupes.mirror_description": "Reflejar los datos de entrada en cada conjunto de coincidencias duplicadas, combinando todos los datos sin eliminar ni duplicar campos. Esta operación no eliminará ningún archivos ni dato.", - "fix_dupes.name_filter": "Archivos DupeGuru (*.dupeguru)", - "fix_dupes.no_file_match": "Coincidencias de archivos duplicados: N/D", - "fix_unlinked.search_and_relink": "Buscar y volver a vincular", - "fix_unlinked.refresh_dupes": "Recargar entradas duplicadas", - "fix_unlinked.merge_dupes": "Fusionar entradas duplicadas", - "fix_dupes.mirror_entries": "Reflejar entradas", - "fix_dupes.open_result_files": "Abrir el archivo de resultados de DupeGuru", - "fix_dupes.number_file_match": "Coincidencias de archivos duplicados: %{count}", - "fix_dupes.advice_label": "Después de la duplicación, puede utilizar DupeGuru para eliminar los archivos no deseados. Luego, utilice la función \"Reparar entradas no vinculadas\" de TagStudio en el menú Herramientas para eliminar las entradas no vinculadas.", - "fix_unlinked.fix_unlinked": "Corregir entradas no vinculadas", - "fix_unlinked.description": "Cada entrada de la biblioteca está vinculada a un archivo en uno de sus directorios. Si un archivo vinculado a una entrada se mueve o se elimina fuera de TagStudio, se considerará desvinculado. Las entradas no vinculadas se pueden volver a vincular automáticamente mediante una búsqueda en sus directorios, el usuario puede volver a vincularlas manualmente o eliminarlas si así lo desea.", - "fix_unlinked.duplicate_description": "Las entradas duplicadas se definen como múltiples entradas que apuntan al mismo archivo en el disco. Al fusionarlas, se combinarán las etiquetas y los metadatos de todos los duplicados en una única entrada consolidada. No deben confundirse con los \"archivos duplicados\", que son duplicados de sus archivos fuera de TagStudio.", - "fix_unlinked.manual_relink": "Reenlace manual", - "fix_unlinked.delete_unlinked": "Borrar entradas no vinculadas", - "fix_unlinked.scan_library.title": "Escaneando la biblioteca", - "fix_unlinked.scan_library.label": "Buscando entradas no enlazadas en la biblioteca...", - "folders_to_tags.folders_to_tags": "Convertir carpetas en etiquetas", - "mirror_entities.are_you_sure": "¿Estás seguro de que quieres reflejar las siguientes %{len(self.lib.dupe_files)} entradas?", - "mirror_entities.title": "Entradas reflejadas", - "preview_panel.missing_location": "Falta la ubicación", - "folders_to_tags.title": "Crear etiquetas a partir de carpetas", - "folders_to_tags.description": "Crea etiquetas basadas en su estructura de carpetas y las aplica a sus entradas.\n La siguiente estructura muestra todas las etiquetas que se crearán y a qué entradas se aplicarán.", - "landing.open_button": "Abrir/Crear biblioteca %{open_shortcut_text}", - "relink_unlinked.title": "Volver a vincular las entradas", - "mirror_entities.label": "Reflejando 1/%{count} Entradas...", - "relink_unlinked.attempt_relink": "Intentando volver a vincular %{x[0]+1}/%{len(self.lib.missing_files)} Entradas, %{self.fixed} Reenlazado correctamente", - "preview_panel.update_widgets": "[PANEL DE ENTRADA] ACTUALIZAR WIDGETS (%{self.driver.selected})", - "preview_panel.no_items_selected": "No hay elementos seleccionados", - "preview_panel.confirm_remove": "¿Está seguro de que desea eliminar este campo \"%{self.lib.get_field_attr(field, \"name\")}\"?", - "preview_panel.mixed_data": "Datos variados", - "text_line_edit.unknown_event_type": "tipo de suceso desconocido: %{event}", - "preview_panel.edit_name": "Editar", - "tag.add_search": "Añadir a la búsqueda", - "preview_panel.unknown_field_type": "Tipo de campo desconocido", - "tag.search_for_tag": "Buscar por etiqueta" -} diff --git a/tagstudio/resources/translations/fr.json b/tagstudio/resources/translations/fr.json deleted file mode 100644 index 0c24bc19..00000000 --- a/tagstudio/resources/translations/fr.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "home.include_all_tags": "Et (Inclus tous les Labels)", - "home.base_title": "TagStudio Alpha", - "home.main_window": "Fenêtre Principale", - "home.thumbnail_size": "Taille de la miniature", - "home.search_entries": "Recherche", - "home.search": "Rechercher", - "menu.file": "Fichier", - "menu.edit": "Édition", - "menu.tools": "Outils", - "menu.window": "Fenêtre", - "tag.new": "Nouveau Label", - "tag.add": "Ajouter un Label", - "tag.library": "Labels de la Bibliothèque", - "merge.merge_dupe_entries": "Fusionner les duplicatas", - "merge.window_title": "Fusionner les duplicatas", - "library.content_tags": "Labels de Contenu", - "library.url": "URL", - "preview.dimensions": "Dimensions", - "library.description": "Description", - "library.notes": "Notes", - "library.date_created": "Date de Création", - "library.date_published": "Date de Publication", - "library.archived": "Date d'Archivage", - "library.book": "Livre", - "library.comic": "Bande Dessinée", - "library.series": "Séries", - "library.date_uploaded": "Date de Mise en Ligne", - "library.anthology": "Anthologie", - "library.publisher": "Éditeur", - "library.guest_artist": "Artiste Invité", - "library.composer": "Compositeur", - "library.comments": "Commentaires", - "open_library.no_tagstudio_library_found": "Aucune bibliothèque TagStudio trouvé au chemin '%{path}'. Création d'une bibliothèque.", - "dialog.open_create_library": "Ouvrir/Créer une Bibliothèque", - "splash.open_library": "Ouverture de la Bilbliothèque", - "status.save_success": "Bibliothèque Sauvegardée et Fermée !", - "status.backup_success": "Bibliothèque sauvegardée au chemin  :", - "status.search_library_query": "Recherche dans la Bibliothèque pour", - "library.manga": "Manga", - "library.source": "Source", - "library.volume": "Volume", - "library.magazine": "Magazine", - "menu.help": "Aide", - "library.Artist": "Artiste", - "preview.recent": "Bibliothèques Récentes", - "library.author": "Auteur", - "library.tags": "Labels", - "library.meta_tags": "Label Meta", - "library.title": "Titre", - "library.date_modified": "Date de Modification", - "library.date_taken": "Date de Capture", - "library.favorite": "Favori", - "library.date_released": "Date de Sortie", - "open_library.title": "Bibliothèque", - "open_library.library_creation_return_code": "Code de Retour de la Création de bibliothèque:", - "status.results_found": "Résultats", - "dialog.save_library": "Sauvegarder la Bibliothèque", - "add_field.add": "Ajouter un Champ", - "generic.remove_field": "Supprimer un Champ", - "generic.file_extension": "Extensions de Fichiers", - "generic.open_file": "Ouvrir un Fichier", - "generic.open_file_explorer": "Ouvrir un Fichier dans l'Explorateur", - "generic.name": "Nom", - "generic.shorthand": "Abrégé", - "generic.aliases": "Alias", - "generic.color": "Couleur", - "generic.delete": "Supprimer", - "generic.exclude": "Exclure", - "generic.include": "Inclure", - "generic.done": "Terminé", - "generic.open_all": "Tout Ouvrir", - "generic.close_all": "Tout Fermer", - "generic.refresh_all": "Tout Rafraîchir", - "generic.apply": "Appliquer", - "generic.search_tags": "Recherche de Labels", - "build_tags.parent_tags": "Labels Parent", - "generic.mirror": "Refléter", - "build_tags.add_parent_tags": "Ajouter des Labels Parents", - "delete_unlinked.delete_unlinked": "Supprimer les Entrées non Liées", - "delete_unlinked.confirm": "Êtes-vous sûr de vouloir supprimer les %{len(self.lib.missing_files)} entrées suivantes  ?", - "delete_unlinked.delete_entries": "Suppression des Entrées", - "file_extension.add_extension": "Ajouter une Extension", - "file_extension.list_mode": "Mode Liste :", - "fix_dupes.fix_dupes": "Réparer les Fichiers en Double", - "fix_dupes.no_file_selected": "Aucun Fichier DupeGuru Sélectionné", - "fix_dupes.mirror_entries": "Répliquer les Entrées", - "generic.cancel": "Annuler", - "generic.add": "Ajouter", - "delete_unlinked.deleting_number_entries": "Suppression des Entrées non Liées %{x[0]+1}/{len(self.lib.missing_files)}", - "fix_dupes.load_file": "Charger un Fichier DupeGuru", - "fix_dupes.mirror_description": "Repliquer les données d'entrée dans chaque jeu de correspondances en double, en combinant toutes les données sans supprimer ni dupliquer de champs. Cette opération ne supprime aucun fichier ni aucune donnée.", - "home.include_any_tag": "Ou (Inclus N'importe quel Label)", - "menu.macros": "Macros", - "library.collation": "Collage", - "library.date": "Date", - "status.enumerate_query": "Requête:%{query}, Image: %{i}, Longueur: %{len(f)}", - "status.number_results_found": "%{len(all_items)} Résultats Trouvés pour \"%{query}\" (%{format_timespan(end_time - start_time)})", - "dialog.refresh_directories": "Rafraîchissement des Dossiers", - "dialog.scan_directories": "Recherche de Nouveaux Fichiers dans les Dossiers...\nPréparation...", - "dialog.scan_directories.new_files": "Recherche de Nouveaux Fichiers dans les Dossiers...\n%{x + 1} Fichiers%{\"s\" if x + 1 != 1 else \"\"} Recherchés, %{len(self.lib.files_not_in_library)} Nouveaux Fichiers Trouvés", - "tooltip.open_library": "Ctrl+O", - "tooltip.save_library": "Ctrl+S", - "progression.running_macros.new_entries": "Exécution des Macros sur les Nouvelles Entrées", - "progression.running_macros.one_new_entry": "Éxecution des Macros Configurées sur 1/%{len(new_ids)} Nouvelles Entrées", - "progression.running_macros.several_new_entry": "Éxectution des Macros Configurées sur %{x + 1}/%{len(new_ids)} Nouvelles Entrées", - "file_opener.open_file": "Ouverture du Fichier:}", - "file_opener.not_found": "Fichier non trouvé:", - "file_opener.command_not_found": "Impossible de trouver %{command_name} dans le CHEMIN système", - "fix_dupes.advice_label": "Après réplication, vous êtes libre d'utiliser DupeGuru pour supprimer des fichiers non désirés. Ensuite, utilisez la fonctionnalité \"Réparation des Entrées non Liées\" de TagStudio dans le menu Outils pour supprimer les Entrées non liées.", - "fix_dupes.open_result_files": "Ouvrire les Fichiers de Résultats de DupeGuru", - "fix_dupes.name_filter": "Fichiers DupeGuru (*.dupeguru)", - "fix_dupes.number_file_match": "Dupliquer les Correspondances de Fichier : %{count}", - "fix_dupes.no_file_match": "Dupliquer les Correspondances de Fichier : N/A", - "fix_unlinked.fix_unlinked": "Réparation des Entrées non Liées", - "fix_unlinked.search_and_relink": "Rechercher && Relier", - "fix_unlinked.refresh_dupes": "Rafraichir les Entrées en Doublon", - "fix_unlinked.merge_dupes": "Fusionner les Entrées en Doublon", - "fix_unlinked.manual_relink": "Reliage Manuel", - "fix_unlinked.delete_unlinked": "Supprimer les Entrées non Liées", - "fix_unlinked.scan_library.title": "Balayage de la Bibliothèque", - "folders_to_tags.folders_to_tags": "Conversion des dossiers en Labels", - "folders_to_tags.title": "Créer un Label à partir d'un Dossier", - "mirror_entities.are_you_sure": "Êtes-vous sûr de vouloir répliquer les %{len(self.lib.dupe_files)} Entrées suivantes ?", - "relink_unlinked.attempt_relink": "Tentative de Reliage de %{x[0]+1}/%{len(self.lib.missing_files)} Entrées, %{self.fixed} ont été Reliées avec Succès", - "preview_panel.missing_location": "Emplacement Manquant", - "preview_panel.update_widgets": "[PANEL D'ENTRÉE] MISE À JOUR DES WIDGETS (%{self.driver.selected})", - "preview_panel.confirm_remove": "Êtes-vous sûr de vouloir supprimer le champ \"%{self.lib.get_field_attr(field, \"name\")}\" ?", - "preview_panel.edit_name": "Éditer", - "preview_panel.unknown_field_type": "Type de Champ Inconnu", - "text_line_edit.unknown_event_type": "Type d'évenement inconnu : %{event}", - "fix_unlinked.description": "Chaque entrée dans la bibliothèque est liée à un fichier dans l'un de vos dossiers. Si un fichier lié à une entrée est déplacé ou supprimé en dehors de TagStudio, il est alors considéré non lié. Les entrées non liées peuvent être automatiquement reliées via la recherche dans vos dossiers, reliées manuellement par l'utilisateur, ou supprimées si désiré.", - "fix_unlinked.duplicate_description": "Les entrées dupliquées sont définies comme des entrées multiple qui pointent vers le même fichier sur le disque. Les fusionner va combiner les labels et metadatas de tous les duplicatas vers une seule entrée consolidée. Elles ne doivent pas être confondues avec les \"fichiers en doublon\", qui sont des doublons de vos fichiers en dehors de TagStudio.", - "fix_unlinked.scan_library.label": "Balayage de la Bibliothèque pour trouver des Entrées non Liées...", - "relink_unlinked.title": "Reliage des Entrées", - "mirror_entities.title": "Réplication des Entrées", - "mirror_entities.label": "Réplication de 1/%{count} Entrées...", - "landing.open_button": "Ouvrir/Créer une Bibliothèque %{open_shortcut_text}", - "preview_panel.no_items_selected": "Pas d'Objet Selectionné", - "tag.add_search": "Ajouter à la Recherche", - "preview_panel.mixed_data": "Données Mélangées", - "tag.search_for_tag": "Recherche de Label", - "folders_to_tags.description": "Créé des labels basés sur votre arborescence de dossier et les applique à vos entrées.\nLa structure ci-dessous affiche tous les labels qui seront créés et à quelles entrées ils seront appliqués." -} diff --git a/tagstudio/resources/translations/hu.json b/tagstudio/resources/translations/hu.json deleted file mode 100644 index f6f7144c..00000000 --- a/tagstudio/resources/translations/hu.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "fix_dupes.mirror_description": "Az összes adat átmásolása minden összetartozó fájl között, ezzel kiegészítve a hiányzó címkéket eltávolítás és duplikálás nélkül. Ez a folyamat nem fog adatokat vagy fájlokat törölni.", - "fix_unlinked.fix_unlinked": "Kapcsolat nélküli elemek javítása", - "fix_dupes.advice_label": "A tükrözés befejezése után a DupeGuruval kitörölheti a nem kívánt fájlokat. Ezt követően, a TagStudio „Kapcsolat nélküli elemek javítása” funkciójával eltávolíthatja az árván maradt elemeket.", - "home.include_all_tags": "És (az összes keresett címkét tartalmazza)", - "home.include_any_tag": "Vagy (valamelyik keresett címkét tartalmazza)", - "home.thumbnail_size": "Indexkép mérete", - "menu.tools": "Eszközök", - "menu.macros": "Makrók", - "tag.new": "Új címke", - "tag.add": "Címke hozzáadása", - "merge.window_title": "Egyező elemek egyesítése", - "merge.merge_dupe_entries": "Egyező elemek egyesítése", - "preview.dimensions": "Méret", - "library.title": "Cím", - "library.url": "Hivatkozás", - "library.tags": "Címkék", - "library.collation": "Rendezés", - "library.notes": "Jegyzetek", - "library.date_taken": "Készítés dátuma", - "library.date_published": "Közzététel dátuma", - "library.archived": "Archiválás dátuma", - "library.favorite": "Kedvenc", - "library.book": "Könyv", - "library.comic": "Képregény", - "library.anthology": "Gyűjtemény", - "library.magazine": "Magazin", - "library.guest_artist": "Társelőadó", - "library.composer": "Zeneszerző", - "library.comments": "Megjegyzés", - "open_library.library_creation_return_code": "A könyvtárlétrehozási folyamat visszatérési kódja:", - "status.save_success": "A könyvtár mentése és bezárása sikeresen megtörtént.", - "status.backup_success": "A biztonsági mentés létrehozása megtörtént az alábbi elérési úton:", - "status.number_results_found": "%{len(all_items)} találat az alábbi kifejezésre: „%{query}” (%{format_timespan(end_time - start_time)})", - "status.results_found": "találat", - "dialog.save_library": "Könyvtár mentése", - "dialog.refresh_directories": "Mappák frissítése", - "dialog.scan_directories.new_files": "Új fájlok keresése a mappákban…\n%{x + 1} fájl megvizsgálva; ebből %{len(self.lib.files_not_in_library)} új", - "tooltip.open_library": "Ctrl+O", - "tooltip.save_library": "Ctrl+S", - "progression.running_macros.new_entries": "Makrók futtatása az új elemeken", - "file_opener.open_file": "Fájl megnyitása:", - "file_opener.not_found": "Az alábbi fájl nem található:", - "file_opener.command_not_found": "A(z) „%{command_name}”-parancs nem szerepel a rendszer PATH-változójában.", - "add_field.add": "Új mező", - "generic.remove_field": "Mező eltávolítása", - "generic.file_extension": "Kiterjesztések", - "generic.open_file": "Fájl megnyitása", - "generic.open_file_explorer": "Fájl megnyitása Intézőben", - "generic.cancel": "Mégse", - "generic.add": "Hozzáadás", - "generic.name": "Név", - "generic.aliases": "Áljelek", - "generic.color": "Szín", - "generic.delete": "Törlés", - "generic.done": "Kész", - "generic.include": "Mutatás", - "generic.exclude": "Elrejtés", - "build_tags.add_parent_tags": "Új szülőcímke", - "delete_unlinked.delete_unlinked": "Kapcsolat nélküli elemek törlése", - "delete_unlinked.confirm": "Biztosan törölni akarja az alábbi %{len(self.lib.missing_files)} elemet?", - "file_extension.add_extension": "Kiterjesztés hozzáadása", - "file_extension.list_mode": "Listázott elemek módja:", - "fix_dupes.fix_dupes": "Egyező fájlok egyesítése", - "fix_dupes.no_file_selected": "Nincs kiválasztott DupeGuru-fájl.", - "fix_dupes.load_file": "DupeGuru fájl betöltése", - "fix_dupes.mirror_entries": "Elemek tükrözése", - "fix_dupes.open_result_files": "DupeGuru-fájl megnyitása", - "fix_dupes.name_filter": "DupeGuru-fájlok (*.dupeguru)", - "fix_unlinked.search_and_relink": "Keresés és újra összekapcsolás", - "fix_unlinked.refresh_dupes": "Egyező elemek frissítése", - "fix_unlinked.merge_dupes": "Egyező elemek egyesítése", - "fix_unlinked.manual_relink": "Újra összekapcsolás kézileg", - "fix_unlinked.delete_unlinked": "Kapcsolat nélküli elemek törlése", - "fix_unlinked.scan_library.title": "Könyvtár vizsgálata", - "fix_unlinked.scan_library.label": "Kapcsolat nélküli elemek keresése a könyvtárban…", - "folders_to_tags.folders_to_tags": "Mappák címkékké alakítása", - "folders_to_tags.title": "Címkék létrehozása mappák alapján", - "mirror_entities.are_you_sure": "Biztosan tükrözni akarja az alábbi adatokat %{len(self.lib.dupe_files)} különböző elemre?", - "mirror_entities.title": "Elemek tükrözése", - "mirror_entities.label": "%{count}/1 elem tükrözése folyamatban…", - "landing.open_button": "Könyvtár megnyitása/létrehozása %{open_shortcut_text}", - "preview_panel.missing_location": "Hiányzó hely", - "preview_panel.no_items_selected": "Nincs kijelölt elem", - "preview_panel.confirm_remove": "Biztosan el akarja távolítani a(z) „%{self.lib.get_field_attr(field, \"name\")}”-mezőt?", - "preview_panel.mixed_data": "Kevert adatok", - "preview_panel.edit_name": "Szerkesztés", - "text_line_edit.unknown_event_type": "Ismeretlen eseménytípus: %{event}", - "tag.search_for_tag": "Címke keresése", - "tag.add_search": "Keresési kifejezés kiegészítése", - "home.base_title": "TagStudio Alfa", - "home.main_window": "Fő ablak", - "home.search_entries": "Tételek keresése", - "home.search": "Keresés", - "menu.file": "Fájl", - "menu.edit": "Szerkesztés", - "menu.window": "Ablak", - "menu.help": "Súgó", - "tag.library": "Könyvtárcímkék", - "library.author": "Szerző", - "library.meta_tags": "Metacímkék", - "library.Artist": "Előadó", - "library.description": "Leírás", - "preview.recent": "Legutóbbi könytárak", - "library.content_tags": "Tartalomcímkék", - "library.publisher": "Kiadó", - "library.date": "Dátum", - "library.date_created": "Létrehozás dátuma", - "library.manga": "Manga", - "library.date_modified": "Módosítás dátuma", - "library.series": "Sorozat", - "library.date_uploaded": "Feltöltés dátuma", - "library.source": "Forrás", - "library.date_released": "Kiadás dátuma", - "library.volume": "Kötet", - "dialog.open_create_library": "Könyvtár megnyitása/létrehozása", - "open_library.no_tagstudio_library_found": "A program nem talált létező TagStudio-könyvtárat az alábbi elérési úton: „%{path}”. Ezen a helyen egy új könyvtár lesz létrehozva.", - "open_library.title": "Könyvtár", - "splash.open_library": "Könyvtár megnyitása", - "status.search_library_query": "Az alábbi kifejezés keresése a könyvtárban:", - "status.enumerate_query": "Keresési kifejezés: %{query}; %{i}. képokcka; Hossz: %{len(f)}", - "dialog.scan_directories": "Új fájlok keresése a mappákban…\nElőkészítés…", - "progression.running_macros.one_new_entry": "Korábban beállított makrók futtatása %{len(new_ids)}/1 új elemen", - "progression.running_macros.several_new_entry": "Korábban beállított makrók futtatása %{len(new_ids)}/%{x + 1} új elemen", - "generic.mirror": "Tükrözés", - "generic.shorthand": "Rövidítés", - "generic.open_all": "Összes megnyitása", - "generic.refresh_all": "Összes frissítése", - "generic.close_all": "Összes bezárása", - "generic.apply": "Alkalmaz", - "delete_unlinked.deleting_number_entries": "{len(self.lib.missing_files)}/%{x[0]+1}. kapcsolat nélküli elem törlése", - "generic.search_tags": "Címkék keresése", - "build_tags.parent_tags": "Szülőcímkék", - "delete_unlinked.delete_entries": "Elemek törlése", - "folders_to_tags.description": "Címkék automatikus létrehozása a létező mappastruktúra alapján.\nAz alábbi mappafán megtekintheti a létrehozandó címkéket, és hogy mely elemekre lesznek alkalmazva.", - "relink_unlinked.title": "Elemek újra összekapcsolása", - "relink_unlinked.attempt_relink": "%{len(self.lib.missing_files)}/%{x[0]+1} elem újra összekapcsolásának megkísérlése; %{self.fixed} elem sikeresen újra összekapcsolva", - "preview_panel.unknown_field_type": "Ismeretlen mezőtípus", - "fix_dupes.no_file_match": "Nincsenek egyező fájlok", - "fix_dupes.number_file_match": "%{count} egyező fájl", - "fix_unlinked.description": "A könyvtár minden eleme egy fájllal van összekapcsolva a számítógépen. Ha egy kapcsolt fájl a TagSudión kívül kerül áthelyezésre vagy törésre, akkor ez a kapcsolat megszakad. Ezeket a kapcsolat nélküli elemeket a program megpróbálhatja automatikusan megkeresni, de Ön is kézileg újra összekapcsolhatja vagy törölheti őket.", - "fix_unlinked.duplicate_description": "Ha több elem ugyanazzal a fájllal van összekapcsolva, akkor egyezőnek számítanak. Ha egyesíti őket, akkor egy olyan elem lesz létrehozva, ami az eredeti elemek összes adatát tartalmazza. Ezeket nem szabad összetéveszteni az „egyező fájlokkal”, amelyek a TagStudión kívüli azonos tartalmú fájlok.", - "preview_panel.update_widgets": "[ENTRY PANEL] UPDATE WIDGETS (%{self.driver.selected})" -} diff --git a/tagstudio/resources/translations/it.json b/tagstudio/resources/translations/it.json deleted file mode 100644 index cbed769a..00000000 --- a/tagstudio/resources/translations/it.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "generic.color": "Colore", - "generic.cancel": "Annulla", - "home.search": "Cerca", - "library.Artist": "Artista", - "home.base_title": "TagStudio Alfa", - "library.title": "Titolo", - "menu.file": "File", - "library.book": "Libro", - "menu.window": "Finestra", - "home.main_window": "Finestra principale", - "tag.new": "Nuovo Tag", - "library.description": "Descrizione", - "generic.name": "Nome", - "generic.add": "Aggiungi", - "generic.delete": "Elimina", - "tag.add": "Aggiungi Tag", - "preview.recent": "Librerias Recenti" -} diff --git a/tagstudio/resources/translations/nb_NO.json b/tagstudio/resources/translations/nb_NO.json deleted file mode 100644 index 8c5cccfb..00000000 --- a/tagstudio/resources/translations/nb_NO.json +++ /dev/null @@ -1,102 +0,0 @@ -{ - "home.main_window": "Hovedvindu", - "home.thumbnail_size": "Miniatyrbildestørrelse", - "home.search_entries": "Søk etter oppføringer", - "home.search": "Søk", - "tag.new": "Ny etikett", - "tag.add": "Legg til etikett", - "tag.library": "Biblioteksetiketter", - "merge.merge_dupe_entries": "Fletter duplikatoppføringer …", - "preview.dimensions": "Dimensjoner", - "preview.recent": "Nylige bibliotek", - "library.url": "Nettadresse", - "library.description": "Beskrivelse", - "library.notes": "Notater", - "library.tags": "Etiketter", - "library.content_tags": "Innholdsetiketter", - "library.meta_tags": "Metaetiketter", - "library.date_published": "Publiseringsdato", - "library.archived": "Arkiveringsdato", - "library.date_uploaded": "Opplastingsdato", - "library.date_released": "Slippdato", - "library.comments": "Kommentarer", - "open_library.title": "Bibliotek", - "dialog.open_create_library": "Åpne/opprett bibliotek", - "library.guest_artist": "Gjesteartist", - "generic.add": "Legg til", - "generic.name": "Navn", - "generic.color": "Farge", - "generic.delete": "Slett", - "generic.done": "Ferdig", - "fix_dupes.fix_dupes": "Fiks duplikatfiler", - "fix_dupes.no_file_selected": "Ingen DupeGuru-fil valgt", - "fix_dupes.load_file": "Last inn DupeGuru-fil", - "fix_dupes.mirror_entries": "Speil oppføringer", - "preview_panel.edit_name": "Rediger", - "preview_panel.unknown_field_type": "Ukjent felttype", - "tag.search_for_tag": "Søk etter etikett", - "tag.add_search": "Legg til søk", - "menu.file": "Fil", - "menu.window": "Vindu", - "menu.edit": "Rediger", - "menu.macros": "Makroer", - "menu.tools": "Verktøy", - "library.magazine": "Magasin", - "menu.help": "Hjelp", - "library.date_modified": "Endringsdato", - "merge.window_title": "Fletter duplikatoppføringer …", - "library.manga": "Manga", - "library.source": "Kilde", - "tooltip.save_library": "Ctrl+S", - "library.date": "Dato", - "library.favorite": "Favoritt", - "library.comic": "Tegneserie", - "library.series": "Serie", - "library.date_created": "Dato opprettet", - "library.date_taken": "Dato knipset", - "library.book": "Bok", - "splash.open_library": "Åpner bibliotek …", - "preview_panel.no_items_selected": "Ingen elementer valgt", - "dialog.save_library": "Lagre bibliotek", - "tooltip.open_library": "Ctrl+O", - "generic.file_extension": "Filutvidelse", - "file_opener.not_found": "Fant ikke filen:", - "add_field.add": "Legg til felt", - "generic.remove_field": "Fjern felt", - "generic.include": "Inkluder", - "generic.open_file": "Åpne fil", - "generic.exclude": "Utelat", - "generic.open_file_explorer": "Åpne fil i utforsker", - "generic.cancel": "Avbryt", - "generic.open_all": "Åpne alle", - "generic.close_all": "Lukk alle", - "generic.mirror": "Speil", - "generic.refresh_all": "Gjenoppfrisk alle", - "generic.apply": "Bruk", - "generic.search_tags": "Søk etter etiketter", - "text_line_edit.unknown_event_type": "ukjent begivenhetstype: %{event}", - "library.Artist": "Artist", - "library.publisher": "Utgiver", - "library.author": "Forfatter", - "status.save_success": "Bibliotek lagret og lukket.", - "status.backup_success": "Kopi av bibliotek lagret i:", - "status.search_library_query": "Søker i biblioteket etter", - "status.results_found": "Resultat", - "file_opener.open_file": "Åpner fil :}", - "delete_unlinked.confirm": "Slett følgende %{len(self.lib.missing_files)} oppføringer?", - "delete_unlinked.delete_entries": "Sletting av oppføringer", - "file_extension.add_extension": "Legg til utvidelse", - "file_extension.list_mode": "Listemodus:", - "fix_dupes.name_filter": "DupeGuru-filer (*.dupeguru)", - "fix_unlinked.fix_unlinked": "Fiks ulenkede oppføringer", - "fix_dupes.open_result_files": "Åpne DupeGuru-resultatfil", - "fix_unlinked.scan_library.title": "Skanning av bibliotek", - "folders_to_tags.title": "Opprett etiketter fra mapper", - "preview_panel.mixed_data": "Blandet data", - "preview_panel.confirm_remove": "Fjern dette «%{self.lib.get_field_attr(field, \"name\")}»-feltet?", - "delete_unlinked.deleting_number_entries": "Sletter %{x[0]+1}/{len(self.lib.missing_files)} ulenkede oppføringer", - "fix_unlinked.scan_library.label": "Skanner bibliotek for ulenkede oppføringer …", - "folders_to_tags.folders_to_tags": "Konverterer mapper til etiketter", - "preview_panel.missing_location": "Posisjon mangler", - "landing.open_button": "Åpne/opprett bibliotek %{open_shortcut_text}" -} diff --git a/tagstudio/resources/translations/pt.json b/tagstudio/resources/translations/pt.json deleted file mode 100644 index 0967ef42..00000000 --- a/tagstudio/resources/translations/pt.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/tagstudio/resources/translations/pt_BR.json b/tagstudio/resources/translations/pt_BR.json deleted file mode 100644 index c4a1d438..00000000 --- a/tagstudio/resources/translations/pt_BR.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "home.main_window": "Janela Principal", - "home.include_any_tag": "Ou (Inclui qualquer rótulo)", - "home.thumbnail_size": "Tamanho de miniatura", - "home.search_entries": "Buscar Entradas", - "home.search": "Buscar", - "menu.file": "Arquivo", - "tag.library": "Rótulos da biblioteca", - "preview.recent": "Bibliotecas recentes", - "library.content_tags": "Rótulos de conteúdo", - "home.base_title": "TagStudio Alfa", - "home.include_all_tags": "E (Inclui todos os rótulos)", - "menu.edit": "Editar", - "menu.tools": "Ferramentas", - "menu.macros": "Macros", - "menu.window": "Janela", - "menu.help": "Ajuda", - "tag.new": "Novo Rótulo", - "preview.dimensions": "Dimensões", - "library.url": "URL", - "library.tags": "Rótulos", - "library.date": "Data", - "library.date_modified": "Dada de Modificação", - "library.favorite": "Favorito", - "library.book": "Livro", - "library.magazine": "Revista", - "library.comic": "Quadrinho", - "library.series": "Séries", - "library.manga": "Manga", - "library.composer": "Compositor", - "open_library.title": "Biblioteca", - "dialog.open_create_library": "Abrir/Criar Biblioteca", - "library.publisher": "Editora", - "library.guest_artist": "Artista Convidado", - "tooltip.open_library": "Ctrl+O", - "tooltip.save_library": "Ctrl+S", - "generic.file_extension": "Extensões de Arquivo", - "generic.open_all": "Abrir Tudo", - "generic.delete": "Deletar", - "mirror_entities.title": "Espelhando Entradas", - "text_line_edit.unknown_event_type": "tipo de evento desconhecido: %{event}", - "merge.window_title": "Mesclando Entradas Duplicadas", - "tag.add": "Adicionar Rótulo", - "merge.merge_dupe_entries": "Mesclando Entradas Duplicadas", - "library.title": "Título", - "library.author": "Autor", - "library.Artist": "Artista", - "library.description": "Descrição", - "library.notes": "Notas", - "library.date_created": "Data de Criação", - "library.date_published": "Data de Publicação", - "library.comments": "Comentários", - "library.source": "Fonte", - "library.date_uploaded": "Data de Envio", - "library.date_released": "Data de Lançamento", - "generic.color": "Cor", - "generic.add": "Adicionar", - "generic.open_file_explorer": "Abrir no explorador de arquivos", - "library.volume": "Volume", - "generic.close_all": "Fechar Tudo", - "generic.apply": "Aplicar", - "generic.cancel": "Cancelar", - "generic.name": "Nome", - "generic.open_file": "Abrir arquivo", - "generic.mirror": "Espelho", - "preview_panel.edit_name": "Editar", - "preview_panel.no_items_selected": "Nenhum Item Selecionado", - "library.meta_tags": "Meta Rótulos", - "open_library.no_tagstudio_library_found": "Nenhuma biblioteca do TagStudio existente foi encontrada em '%{path}'. Criando uma.", - "open_library.library_creation_return_code": "Código de Retorno da Criação da Biblioteca:", - "status.results_found": "Resultados", - "dialog.save_library": "Salvar Biblioteca", - "dialog.refresh_directories": "Atualizando Diretórios", - "splash.open_library": "Abrindo Biblioteca", - "status.save_success": "Biblioteca Salva e Fechada!", - "status.backup_success": "Backup da Biblioteca Salvo em:", - "status.search_library_query": "Procurando na Biblioteca por", - "status.enumerate_query": "Busca:%{query}, Quadro: %{i}, Tamanho: %{len(f)}", - "dialog.scan_directories": "Escaneando Diretórios por Novos Arquivos...\nPreparando...", - "progression.running_macros.new_entries": "Executando Macros nas Novas Entradas", - "progression.running_macros.one_new_entry": "Executando Macros Configurados em 1/%{len(new_ids)} Novas Entradas", - "generic.done": "Completo", - "generic.refresh_all": "Atualizar_Tudo", - "generic.aliases": "Alias", - "file_extension.add_extension": "Adicionar Extensão", - "fix_dupes.mirror_entries": "Entradas Espelhadas", - "fix_dupes.fix_dupes": "Corrigir Arquivos Duplicados", - "file_extension.list_mode": "Modo de Lista:", - "fix_dupes.name_filter": "Arquivos DupeGuru (*.dupeguru)", - "folders_to_tags.folders_to_tags": "Convertendo pastas para Rótulos", - "preview_panel.unknown_field_type": "Tipo de Campo Desconhecido", - "tag.search_for_tag": "Procurar por Rótulo", - "tag.add_search": "Adicionar a Pesquisa", - "generic.exclude": "Excluir", - "generic.include": "Incluir", - "progression.running_macros.several_new_entry": "Executando Macros Configurados em %{x + 1}/%{len(new_ids)} Novas Entradas", - "landing.open_button": "Abrir/Criar Bliblioteca %{open_shortcut_text}", - "dialog.scan_directories.new_files": "Escaneando Diretórios por Novos Arquivos...\n%{x + 1} Arquivo%{\"s\" if x + 1 != 1 else \"\"} Pesquisado%{\"s\" if x + 1 != 1 else \"\"}, %{len(self.lib.files_not_in_library)} Novo(s) Arquivo(s) Encontrado(s)", - "status.number_results_found": "%{len(all_items)} Resultados Encontrados para \"%{query}\" (%{format_timespan(end_time - start_time)})", - "fix_dupes.no_file_match": "Correspondências de Arquivos Duplicados: N/A", - "fix_dupes.number_file_match": "Correspondências de Arquivos Duplicados: %{count}", - "fix_unlinked.scan_library.title": "Escaneando Biblioteca", - "file_opener.command_not_found": "Não foi possível encontrar %{command_name} na PATH do sistema", - "file_opener.not_found": "Arquivo não encontrado:", - "folders_to_tags.title": "Criar rótulos a partir das pastas", - "mirror_entities.are_you_sure": "Tem certeza que você deseja espelhar os seguintes %{len(self.lib.dupe_files)} entradas?", - "folders_to_tags.description": "Cria rótulos baseado na sua estrutura de arquivos e aplica elas nas suas entradas\nA estrutura abaixo mostra todos os rótulos que irão ser criados e a quais entradas eles serão aplicados.", - "library.date_taken": "Data de Criação", - "library.archived": "Data de Arquivação", - "file_opener.open_file": "Abrindo Arquivo:", - "generic.shorthand": "Taquigrafia", - "fix_dupes.load_file": "Carregar Aquivo DupeGuru", - "fix_dupes.no_file_selected": "Nenhum Arquivo DupeGuru Selecionado", - "fix_unlinked.fix_unlinked": "Corrigir Entradas Não Linkadas", - "fix_dupes.open_result_files": "Abrir Arquivo de Resultados do DupeGuru", - "fix_unlinked.refresh_dupes": "Atualizar Entradas Duplicadas", - "fix_unlinked.merge_dupes": "Mesclar Entradas Duplicadas", - "fix_unlinked.manual_relink": "Relink Manual", - "fix_unlinked.scan_library.label": "Escaneando Bibliotecada para Entradas Não Linkadas...", - "fix_unlinked.search_and_relink": "Buscar && Relinkar", - "mirror_entities.label": "Espelhando 1/%{count} Entradas...", - "relink_unlinked.attempt_relink": "Tentando Relinkar %{x[0]+1}/%{len(self.lib.missing_files)} Entradas, %{self.fixed} Relinkadas com Sucesso", - "preview_panel.missing_location": "Localização Ausente", - "preview_panel.update_widgets": "[ENTRY PANEL] ATULIZAR WIDGETS (%{self.driver.selected})", - "preview_panel.mixed_data": "Dados Mistos", - "fix_unlinked.delete_unlinked": "Escluir Entradas Não Linkadas", - "fix_dupes.mirror_description": "Espelhe os ados de entrada em cada conjunto de correspondência duplicado, combinando todos os dados sem remover ou duplicar campos. Esta operação não excluirá nenhum arquivo ou dado.", - "relink_unlinked.title": "Relinkando Entradas", - "preview_panel.confirm_remove": "Você tem certeza de que quer remover o campo \"%{self.lib.get_field_attr(field, \"name\")}\"?", - "library.collation": "Colagem", - "library.anthology": "Coletânea", - "generic.remove_field": "Remover Campo", - "add_field.add": "Adicionar Campo", - "generic.search_tags": "Buscar Rótulos", - "build_tags.parent_tags": "Rótulos Pai", - "build_tags.add_parent_tags": "Adicionar Rótulo Pai", - "delete_unlinked.delete_unlinked": "Deletar Entradas Não Linkada", - "delete_unlinked.confirm": "Tem certeza que deseja deletar as seguintes %{len(self.lib.missing_files)} entradas?", - "delete_unlinked.delete_entries": "Deletando Entradas", - "delete_unlinked.deleting_number_entries": "Deletando %{x[0]+1}/{len(self.lib.missing_files)} Entradas Não Linkadas", - "fix_dupes.advice_label": "Após espelhagem, você estará livre para usar DupeGuru para deletar arquivos indesejados. Após, use a função \"Consertar Entradas Não Linkadas\" do TagStudio no menu de Ferramentas para deletar entradas não linkadas.", - "fix_unlinked.duplicate_description": "Entradas duplicadas são definidas como multiplas entradas que levam ao mesmo arquivo no disco. Mergir essas entradas irá combinar as tags e metadados de todas as duplicatas em uma única entrada consolidada. Não confundir com \"Arquivos Duplicados\" que são duplicatas dos seus arquivos fora do TagStudio.", - "fix_unlinked.description": "Cada entrada na biblioteca está linkada a um arquivo em um dos seus diretórios. Se um arquivo linkado a uma entrada for movido ou deletado fora do TagStudio, ele é então considerado não linkado. Entradas não linkadas podem ser automaticamente re-linkadas por buscas nos seus diretórios, manualmente re-linkadas pelo usuário, ou deletada se for desejada." -} diff --git a/tagstudio/resources/translations/ru.json b/tagstudio/resources/translations/ru.json deleted file mode 100644 index 02a27768..00000000 --- a/tagstudio/resources/translations/ru.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "home.main_window": "Основное Окно", - "home.thumbnail_size": "Размер иконок", - "home.search_entries": "Поисковые запросы", - "home.search": "Поиск", - "menu.file": "Файл", - "tag.new": "Новый тег", - "tag.add": "Добавить тег", - "tag.library": "Библиотека тегов", - "merge.window_title": "Объединить повторяющиеся записи", - "preview.dimensions": "Соотношения сторон", - "library.collation": "Сопоставление", - "library.date_created": "Дата создания", - "library.date_taken": "Дата съёмки", - "library.series": "Серии", - "library.date_uploaded": "Дата загрузки", - "library.volume": "Том", - "library.anthology": "Антология", - "library.guest_artist": "Соавтор", - "open_library.no_tagstudio_library_found": "Существующая библиотека TagStudio не найдена внутри '%{path}'. Создаём новую.", - "open_library.library_creation_return_code": "Возвратный код создания библиотеки:", - "status.search_library_query": "Поиск по библиотеке", - "status.number_results_found": "%{len(all_items)} Было найдено \"%{query}\" (%{format_timespan(end_time - start_time)})", - "dialog.refresh_directories": "Обновление Каталога", - "tooltip.save_library": "Ctrl+S", - "file_opener.open_file": "Открытие файла:}", - "file_opener.not_found": "Файл не найден:", - "add_field.add": "Добавить Категорию", - "generic.remove_field": "Удалить Категорию", - "generic.file_extension": "Расширения Файлов", - "generic.cancel": "Отмена", - "generic.shorthand": "Сокращённое название", - "generic.aliases": "Псевдонимы", - "generic.color": "Цвет", - "generic.close_all": "Закрыть Всё", - "generic.refresh_all": "Обновить Всё", - "generic.apply": "Применить", - "generic.mirror": "Отзеркалить", - "build_tags.parent_tags": "Теги-родители", - "build_tags.add_parent_tags": "Добавить Теги-родители", - "delete_unlinked.confirm": "Вы уверены в том, что желаете удалить %{len(self.lib.missing_files)} записи?", - "delete_unlinked.delete_entries": "Удаление записей", - "file_extension.list_mode": "Список режимов:", - "fix_dupes.fix_dupes": "Исправить дубликаты", - "fix_dupes.no_file_selected": "Файл DupeGuru не выбран", - "fix_dupes.load_file": "Загрузить файл DupeGuru", - "fix_dupes.mirror_entries": "Отзеркалить записи", - "fix_dupes.mirror_description": "Отзеркалить данные записи внутри каждого указанного набора дубликатов, объединяя все данные внутри без удаления или дублирования категорий. Эта операция не удалит какие-либо файлы или данные.", - "fix_dupes.open_result_files": "Открыть файл результатов DupeGuru", - "fix_dupes.name_filter": "Файлы DupeGuru (*.dupeguru)", - "fix_unlinked.manual_relink": "Ручная привязка", - "folders_to_tags.title": "Создать теги из папок", - "landing.open_button": "Открыть/Создать Библиотеку %{open_shortcut_text}", - "preview_panel.no_items_selected": "Ничего не выбрано", - "preview_panel.unknown_field_type": "Неизвестный тип категории", - "tag.search_for_tag": "Поиск тега", - "home.base_title": "TagStudio Альфа Версия", - "home.include_any_tag": "Или (Файл содержит любой из тегов)", - "home.include_all_tags": "И (Файл содержит все теги)", - "menu.edit": "Редактировать", - "menu.tools": "Инструменты", - "menu.window": "Окно", - "menu.help": "Помощь", - "menu.macros": "Макросы", - "preview.recent": "Недавние библиотеки", - "merge.merge_dupe_entries": "Объединить повторяющиеся записи", - "library.title": "Название", - "library.author": "Автор", - "library.url": "URL", - "library.description": "Описание", - "library.Artist": "Художник", - "library.notes": "Заметки", - "library.date_released": "Дата выпуска", - "library.date_modified": "Дата изменения", - "library.tags": "Теги", - "library.content_tags": "Теги содержимого", - "library.meta_tags": "Мета Теги", - "library.date": "Дата", - "library.date_published": "Дата публикации", - "library.archived": "Дата архивации", - "library.manga": "Манга", - "library.favorite": "Избранное", - "library.comic": "Комиксы", - "library.book": "Книги", - "library.publisher": "Издатель", - "library.source": "Источники", - "library.magazine": "Журнал", - "library.composer": "Композитор", - "library.comments": "Комментарии", - "splash.open_library": "Открытие Библиотеки", - "open_library.title": "Библиотека", - "dialog.open_create_library": "Открыть/Создать Библиотеку", - "status.save_success": "Библиотека сохранена и закрыта!", - "status.backup_success": "Резервная копия библиотеки сохранена по адресу:", - "status.enumerate_query": "Query:%{query}, Frame: %{i}, Length: %{len(f)}", - "status.results_found": "Результаты", - "dialog.scan_directories": "Сканирование каталога на наличие новых файлов...\nПодготовка...", - "dialog.save_library": "Сохранить Библиотеку", - "tooltip.open_library": "Ctrl+O", - "dialog.scan_directories.new_files": "Сканирование на наличие новых файлов...\n%{x + 1} File%{\"s\" if x + 1 != 1 else \"\"} Searched, %{len(self.lib.files_not_in_library)} Найдены новые файлы", - "progression.running_macros.new_entries": "Использование макросов на новых файлах", - "progression.running_macros.one_new_entry": "Запуск сконфигурированных макросов в 1/%{len(new_ids)} Новые файлы", - "progression.running_macros.several_new_entry": "Запуск сконфигурированных макросов в %{x + 1}/%{len(new_ids)} Новые файлы", - "file_opener.command_not_found": "Не смог найти %{command_name} в системе PATH", - "generic.open_file_explorer": "Открыть файл в проводнике", - "generic.open_file": "Открыть файл", - "generic.add": "Добавить", - "generic.name": "Имя", - "generic.delete": "Удалить", - "generic.exclude": "Исключить", - "generic.done": "Завершено", - "generic.open_all": "Открыть Всё", - "generic.search_tags": "Поиск тегов", - "delete_unlinked.delete_unlinked": "Удалить откреплённые записи", - "file_extension.add_extension": "Добавить расширение", - "delete_unlinked.deleting_number_entries": "Удалено %{x[0]+1}/{len(self.lib.missing_files)} откреплённых записей", - "fix_dupes.advice_label": "После отзеркаливания, вы можете использовать DupeGuru, чтобы удалить ненужные файлы. После этого, используйте функцию \"Исправить откреплённые записи\" внутри панели \"Инструменты\" TagStudio, чтобы удалить откреплённые записи.", - "fix_dupes.no_file_match": "Совпадение файлов дубликатов: N/A", - "fix_dupes.number_file_match": "Совпадения файлов дубликатов: %{count}", - "fix_unlinked.fix_unlinked": "Исправить откреплённые записи", - "fix_unlinked.description": "Каждая запись в библиотеке привязана к файлу, находящегося внутри той или иной папки. Если файл, к которому была привязана запись, был удалён или перемещён без использования TagStudio, то запись становиться \"откреплённой\". Откреплённые записи могут быть прикреплены обратно через автоматический рескан, вручную прикреплены обратно пользователем, либо же удалены если в них нет надобности.", - "fix_unlinked.duplicate_description": "Записи-дубликаты это несколько записей, которые одновременно привязаны к одному файлу. Объединение таких дубликатов соединит все теги и мета данные из этих записей в одну. Записи-дубликаты не стоит путать с несколькими копиями самого файла, которые могут существовать вне TagStudio.", - "fix_unlinked.search_and_relink": "Поиск и Привязка", - "fix_unlinked.refresh_dupes": "Обновить записи дубликаты", - "fix_unlinked.merge_dupes": "Объединить записи дубликаты", - "fix_unlinked.delete_unlinked": "Удалить откреплённые записи", - "fix_unlinked.scan_library.title": "Сканирование Библиотеки", - "folders_to_tags.folders_to_tags": "Конвертировать папки в теги", - "fix_unlinked.scan_library.label": "Сканирование Библиотеки на наличие откреплённых записей...", - "mirror_entities.are_you_sure": "Вы уверенны, что хотите отзеркалить следующие %{len(self.lib.dupe_files)} записи?", - "mirror_entities.title": "Отзеркаливание записей", - "preview_panel.missing_location": "Путь не найден", - "mirror_entities.label": "Отзеркаливание 1/%{count} записей...", - "preview_panel.update_widgets": "[ENTRY PANEL] ОБНОВИТЬ ВИДЖЕТЫ (%{self.driver.selected})", - "relink_unlinked.title": "Привязка записей", - "folders_to_tags.description": "Создаёт теги для записей согласно имеющейся иерархии папок.\nВнизу указаны все теги, которые будут созданы, а также записи к которым они будут применены.", - "relink_unlinked.attempt_relink": "Пытаемся вновь привязать %{x[0]+1}/%{len(self.lib.missing_files)} записей, %{self.fixed} Успешно привязано", - "preview_panel.confirm_remove": "Вы уверенны, что хотите удалить эту категорию \"%{self.lib.get_field_attr(field, \"name\")}\"?", - "preview_panel.edit_name": "Редактировать", - "text_line_edit.unknown_event_type": "unknown event type: %{event}", - "preview_panel.mixed_data": "Смешанные данные", - "tag.add_search": "Добавить к поисковому запросу", - "generic.include": "Включить" -} diff --git a/tagstudio/resources/translations/sv.json b/tagstudio/resources/translations/sv.json deleted file mode 100644 index 4dc5d911..00000000 --- a/tagstudio/resources/translations/sv.json +++ /dev/null @@ -1,115 +0,0 @@ -{ - "home.main_window": "Huvudfönster", - "home.thumbnail_size": "Miniatyrbildsstorlek", - "home.search": "Sök", - "menu.file": "Fil", - "menu.tools": "Verktyg", - "menu.macros": "Makron", - "menu.window": "Fönster", - "menu.help": "Hjälp", - "tag.add": "Lägg till etikett", - "home.include_any_tag": "Eller (Inkluderar alla etiketter)", - "tag.new": "Ny etikett", - "home.search_entries": "Sök poster", - "tag.library": "Biblioteksetiketter", - "merge.window_title": "Slår ihop dubbla poster", - "merge.merge_dupe_entries": "Slår ihop dubbla poster", - "preview.recent": "Senaste biblioteken", - "library.title": "Titel", - "library.author": "Författare", - "library.description": "Beskrivning", - "library.notes": "Anteckningar", - "library.content_tags": "Innehållsetiketter", - "library.meta_tags": "Meta-etiketter", - "library.collation": "Kollation", - "library.date": "Datum", - "library.date_created": "Skapad den", - "library.date_modified": "Senast ändrad", - "library.favorite": "Favorit", - "library.date_taken": "", - "library.archived": "Arkiveringsdatum", - "library.date_published": "Publiceringsdatum", - "library.series": "Serie", - "library.manga": "Manga", - "library.source": "Källa", - "library.date_released": "Utgivningsdatum", - "library.volume": "Volym", - "library.anthology": "Antologi", - "library.magazine": "Magasin", - "library.composer": "Kompositör", - "open_library.title": "Bibliotek", - "dialog.open_create_library": "Öppna/skapa bibliotek", - "splash.open_library": "Öppnar bibliotek", - "status.save_success": "Bibliotek sparat och stängt!", - "status.backup_success": "Bibliotekets säkerhetskopia sparad i:", - "status.search_library_query": "Söker i biblioteket efter", - "status.results_found": "Resultat", - "dialog.save_library": "Spara bibliotek", - "dialog.refresh_directories": "Uppdaterar kataloger", - "dialog.scan_directories": "Skannar kataloger efter nya filer...\nFörbereder...", - "tooltip.open_library": "Ctrl+O", - "tooltip.save_library": "Ctrl+S", - "add_field.add": "Lägg till fält", - "generic.remove_field": "Ta bort fält", - "generic.file_extension": "Filnamnstillägg", - "generic.open_file": "Öppna fil", - "generic.add": "Lägg till", - "generic.name": "Namn", - "generic.shorthand": "Förkortning", - "generic.aliases": "Alias", - "generic.done": "Klar", - "generic.open_all": "Öppna alla", - "generic.close_all": "Stäng alla", - "generic.refresh_all": "Uppdatera alla", - "generic.apply": "Tillämpa", - "build_tags.parent_tags": "Förälderetiketter", - "build_tags.add_parent_tags": "Lägg till förälderetikett", - "delete_unlinked.delete_entries": "Tar bort poster", - "fix_dupes.fix_dupes": "Fixa dubbla filer", - "fix_dupes.mirror_entries": "Spegla poster", - "fix_unlinked.search_and_relink": "Sök && Länka om", - "fix_unlinked.refresh_dupes": "Uppdatera dubbla poster", - "fix_unlinked.merge_dupes": "Slå ihop dubbla poster", - "fix_unlinked.manual_relink": "Länka om manuellt", - "fix_unlinked.delete_unlinked": "Ta bort olänkade poster", - "fix_unlinked.scan_library.title": "Skannar bibliotek", - "fix_unlinked.scan_library.label": "Skannar bibliotek efter olänkade poster...", - "folders_to_tags.title": "Skapa etiketter från mappar", - "preview_panel.missing_location": "Platsen saknas", - "preview_panel.edit_name": "Redigera", - "home.base_title": "TagStudio Alfa", - "home.include_all_tags": "Och (Inkluderar alla etiketter)", - "menu.edit": "Redigera", - "library.Artist": "Artist", - "preview.dimensions": "Dimensioner", - "library.url": "URL", - "library.tags": "Etiketter", - "library.book": "Bok", - "library.comic": "Serietidning", - "folders_to_tags.description": "Skapar etiketter baserat på din mappstruktur och tillämpar dem till dina poster.\nStrukturen nedan visar vilka etiketter som kommer skapas och vilka filer de kommer tillämpas på.", - "fix_unlinked.duplicate_description": "Dubbla poster är definierade som flera poster som pekar på samma fil på datorn. Genom att slå ihop dessa poster kommer deras etiketter och metadata från dubbletterna att kombineras till en post. Dessa ska inte förväxlas med \"dubbla filer\", som är dubbletter av dina filer utanför TagStudio.", - "fix_unlinked.description": "Varje post i biblioteket är länkad till en fil i en av dina kataloger. Om en fil länkad till en post är flyttad eller borttagen utanför TagStudio blir den olänkad. Olänkade poster kan automatiskt bli omlänkade genom att söka genom dina kataloger, manuellt omlänkade av användaren eller tas bort om så önskas.", - "mirror_entities.title": "Speglar poster", - "tag.search_for_tag": "Sök efter etikett", - "relink_unlinked.title": "Länkar om poster", - "preview_panel.no_items_selected": "Inga valda objekt", - "tag.add_search": "Lägg till i Sök", - "library.date_uploaded": "Uppladdningsdatum", - "library.publisher": "Utgivare", - "library.guest_artist": "Gästartist", - "library.comments": "Kommentarer", - "progression.running_macros.new_entries": "Kör makros på nya poster", - "file_opener.open_file": "Öppnar fil:}", - "file_opener.not_found": "Kunde inte hitta filen:", - "generic.open_file_explorer": "Öppna fil i utforskaren", - "generic.delete": "Ta bort", - "generic.cancel": "Avbryt", - "generic.exclude": "Exkludera", - "generic.include": "Inkludera", - "generic.mirror": "Spegla", - "generic.color": "Färg", - "generic.search_tags": "Sök etikett", - "file_extension.add_extension": "Lägg till tillägg", - "fix_unlinked.fix_unlinked": "Fixa olänkade poster", - "folders_to_tags.folders_to_tags": "Konverterar mappar till etiketter" -} diff --git a/tagstudio/resources/translations/ta.json b/tagstudio/resources/translations/ta.json deleted file mode 100644 index ce028824..00000000 --- a/tagstudio/resources/translations/ta.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "home.base_title": "TagStudio ஆல்பா", - "home.main_window": "பிரதான சாளரம்", - "home.include_all_tags": "மற்றும் (அனைத்து குறிச்சொற்களையும் உள்ளடக்கியது)", - "home.thumbnail_size": "சின்னப்பட அளவு", - "home.search": "தேடு", - "menu.file": "கோப்பு", - "menu.edit": "திருத்து", - "menu.tools": "கருவிகள்", - "menu.help": "உதவி", - "tag.new": "புதிய குறிச்சொல்", - "tag.add": "குறிச்சொல் சேர்க்க", - "merge.merge_dupe_entries": "மறுநுழைவுகளை ஒன்றுசேர்த்தல்", - "preview.recent": "சமீபத்திய நூலகங்கள்", - "library.url": "இணைய முகவரி", - "library.notes": "குறிப்புகள்", - "library.content_tags": "உள்ளடக்கக் குறிச்சொற்கள்", - "library.meta_tags": "மெட்டா குறிச்சொற்கள்", - "library.collation": "தொகுத்தல்", - "library.date_modified": "மாற்றப்பட்ட தேதி", - "library.date_taken": "எடுக்கப்பட்ட தேதி", - "library.archived": "காப்பகப்படுத்தப்பட்ட தேதி", - "library.favorite": "பிடித்தது", - "library.book": "புத்தகம்", - "library.series": "தொடர்", - "library.manga": "மங்கா", - "library.source": "ஆதாரம்", - "library.date_uploaded": "பதிவேற்றிய தேதி", - "library.date_released": "வெளியான தேதி", - "library.volume": "தொகுப்பு", - "library.anthology": "தொகுப்பியல்", - "open_library.title": "நூலகம்", - "splash.open_library": "நூலகம் திறக்கப்படுகின்றது", - "status.save_success": "நூலகம் சேமிக்கப்பட்டு மூடப்பட்டது!", - "status.backup_success": "நூலக காப்புப் பிரதி சேமிக்கப்பட்டது:", - "status.search_library_query": "நூலகத்தைத் தேடுகிறது", - "status.enumerate_query": "வினவு:%{query}, சட்டகம்: %{i}, நீளம்: %{len(f)}", - "status.results_found": "முடிவுகள்", - "dialog.save_library": "நூலகத்தைச் சேமி", - "dialog.refresh_directories": "கோப்பகங்கள் புதுப்பிக்கப்படுகின்றன", - "tooltip.open_library": "Ctrl+O", - "tooltip.save_library": "Ctrl+S", - "progression.running_macros.new_entries": "புதிய நுழைவுகளில் செயல்முறைகளை இயக்கப்படுகின்றது", - "file_opener.open_file": "கோப்பைத் திறக்கிறது:}", - "file_opener.not_found": "கோப்பு கிடைக்கவில்லை:", - "home.search_entries": "தேடல் உள்ளீடுகள்", - "home.include_any_tag": "அல்லது (எந்தக் குறிச்சொல்லையும் உள்ளடக்கியது)", - "menu.macros": "செயல்முறை", - "menu.window": "சாளரம்", - "tag.library": "நூலக குறிச்சொற்கள்", - "merge.window_title": "மறுநுழைவுகளை ஒன்றுசேர்த்தல்", - "preview.dimensions": "பரிமாணங்கள்", - "library.title": "தலைப்பு", - "library.author": "ஆக்கியோன்", - "library.Artist": "கலைஞர்", - "library.description": "விளக்கம்", - "library.tags": "குறிச்சொற்கள்", - "library.magazine": "இதழ்", - "library.guest_artist": "விருந்தினர் கலைஞர்", - "library.composer": "இசையமைப்பாளர்", - "library.date": "தேதி", - "library.date_created": "உருவாக்கப்பட்ட தேதி", - "library.date_published": "வெளியிடப்பட்ட தேதி", - "library.comic": "நகைச்சுவை", - "library.publisher": "பதிப்பாளர்", - "library.comments": "கருத்துகள்", - "open_library.library_creation_return_code": "நூலக உருவாக்கம் திரும்பக் குறியீடு:", - "open_library.no_tagstudio_library_found": "'%{path}' இல் ஏற்கனவே உள்ள டாக் ஸ்டுடியோ புத்தககல்லரி காணப்படவில்லை. ஒன்று உருவாக்கப்படுகிறது.", - "dialog.open_create_library": "நூலகத்தைத் திற/உருவாக்கு", - "status.number_results_found": "\"%{query}\" இல் %{len(all_items)} முடிவுகள் கிடைத்தன (%{format_timespan(end_time - start_time)})", - "dialog.scan_directories": "புதிய கோப்புகளுக்கான அடைவுகள் சோதனை செய்யப்படுகின்றது...\nதயாராகிறது...", - "dialog.scan_directories.new_files": "புதிய கோப்புகளுக்கான அடைவுகள் சோதனை செய்யப்படுகின்றது...\n%{x + 1} கோப்பு%{\"s\" if x + 1 != 1 else \"\"} தேடப்பட்டது, %{len(self.lib.files_not_in_library)} புதிய கோப்புகள் கிடைத்தன", - "progression.running_macros.one_new_entry": "1/ இல் கட்டமைக்கப்பட்ட செயல்முறைகளை இயக்கப்படுகிறது %{len(new_ids)} புதிய பதிவுகள்", - "progression.running_macros.several_new_entry": "%{x + 1} இல் கட்டமைக்கப்பட்ட செயல்முறைகளை இயக்கப்படுகிறது / %{len(new_ids)} புதிய பதிவுகள்", - "file_opener.command_not_found": "%{command_name} ஐ system PATH இல் கண்டுபிடிக்க முடியவில்லை", - "add_field.add": "புலத்தைச் சேர்க்க", - "generic.remove_field": "புலத்தை அகற்று", - "generic.file_extension": "கோப்பு நீட்டிப்புகள்", - "generic.open_file": "கோப்பைத் திறக்கவும்", - "generic.cancel": "ரத்து செய்", - "generic.name": "பெயர்", - "generic.shorthand": "சுருக்கெழுத்து", - "generic.aliases": "மாற்றுப்பெயர்கள்", - "generic.delete": "நீக்கு", - "generic.include": "உள்ளடக்கு", - "generic.exclude": "தவிர்", - "generic.done": "முடிந்தது", - "generic.open_all": "அனைத்தையும் திற", - "generic.refresh_all": "அனைத்தையும் புதுப்பி", - "generic.apply": "விண்ணப்பிக்க", - "build_tags.parent_tags": "பெற்றோர் குறிச்சொற்கள்", - "build_tags.add_parent_tags": "பெற்றோர் குறிச்சொற்களைச் சேர்க்க", - "delete_unlinked.delete_entries": "உள்ளீடுகள் நீக்கப்படுகிறது", - "delete_unlinked.deleting_number_entries": "%{x[0]+1}/{len(self.lib.missing_files)} இணைக்கப்படாத உள்ளீடுகள் நீக்கப்படுகிறது", - "file_extension.add_extension": "நீட்டிப்பைச் சேர்க்க", - "file_extension.list_mode": "பட்டியல் முறை:", - "generic.mirror": "படிமம்", - "fix_dupes.load_file": "DupeGuru கோப்பை ஏற்றவும்", - "fix_dupes.mirror_entries": "படிம நுழைவுகள்", - "fix_dupes.open_result_files": "DupeGuru முடிவுகள் கோப்பைத் திறக்க", - "fix_dupes.name_filter": "DupeGuru கோப்புகள் (*.dupeguru)", - "fix_dupes.no_file_match": "நகல் கோப்பு பொருத்தங்கள்: ஒன்றும் இல்லை", - "fix_dupes.number_file_match": "நகல் கோப்பு பொருத்தங்கள்: %{count}", - "fix_unlinked.fix_unlinked": "இணைக்கப்படாத உள்ளீடுகளைச் சரிசெய்யவும்", - "fix_unlinked.search_and_relink": "தேடல் && மீண்டும் இணை", - "fix_unlinked.refresh_dupes": "நகல் உள்ளீடுகளைப் புதுப்பி", - "fix_unlinked.merge_dupes": "நகல் உள்ளீடுகளை ஒன்றிணை", - "fix_unlinked.manual_relink": "கைமுறை மறு இணைப்பு", - "fix_unlinked.scan_library.title": "புத்தககல்லரி சோதனை செய்யப்படுகிறது", - "folders_to_tags.folders_to_tags": "கோப்புறைகளை குறிச்சொற்களாக மாற்றப்படுகிறது", - "folders_to_tags.title": "கோப்புறைகளிலிருந்து குறிச்சொற்களை உருவாக்கு", - "generic.open_file_explorer": "Explorer இல் கோப்பைத் திறக்கவும்", - "generic.add": "சேர்", - "generic.color": "நிறம்", - "generic.close_all": "அனைத்தையும் மூடு", - "delete_unlinked.delete_unlinked": "இணைக்கப்படாத உள்ளீடுகளை நீக்கு", - "generic.search_tags": "குறிச்சொற்களைத் தேடு", - "delete_unlinked.confirm": "பின்வரும் உள்ளீடுகளை நிச்சயமாக நீக்க விரும்புகிறீர்களா %{len(self.lib.missing_files)}?", - "fix_dupes.fix_dupes": "நகல் கோப்புகளைச் சரிசெய்", - "fix_dupes.no_file_selected": "DupeGuru கோப்பு எதுவும் தேர்ந்தெடுக்கப்படவில்லை", - "fix_dupes.mirror_description": "ஒவ்வொரு மறுநுழைவு பொருத்தத் தொகுப்பிலும் நுழைவு தரவுகளைப் பிரதிபலிக்கவும், அனைத்து தரவுகளையும் இணைக்கவும், எந்தத் தகவல்களையும் நீக்காமலும் மறு செய்யாமலும். இந்தச் செயலில் எந்தக் கோப்புகள் அல்லது தரவுகளும் நீக்கப்பட மாட்டாது.", - "fix_dupes.advice_label": "படிமம் முடிந்தவுடன், தேவையற்ற கோப்புகளை நீக்க DupeGuru ஐ பயன்படுத்தலாம். அதற்குப் பிறகு, இணைக்காத நுழைவுகளை நீக்க 'டாக் ஸ்டுடியோ' வின் 'இணைக்கப்படாத உள்ளீடுகளைச் சரிசெய்' அம்சத்தைக் கருவிகள் பட்டியில் பயன்படுத்தவும்.", - "fix_unlinked.description": "ஒவ்வொரு புத்தககல்லரி நுழைவும் உங்கள் அடைவுகளில் உள்ள ஒரு கோப்புடன் இணைக்கப்பட்டுள்ளது. டாக் ஸ்டுடியோ-வைத் தவிர கோப்புகள் நகர்த்தப்பட்டால் அல்லது நீக்கப்பட்டால், அவை இணைக்கப்படாதவையாகக் கருதப்படும். இணைக்கப்படாத நுழைவுகளை உங்கள் அடைவுகளில் தேடுவதன் மூலம் தானாகவே மீண்டும் இணைக்கலாம், பயனர் கைமுறையாக இணைக்கலாம் அல்லது விருப்பப்படி நீக்கலாம்.", - "fix_unlinked.duplicate_description": "மறுநுழைவுகள் என்பது, ஒரே கோப்பை குறிக்கும் பல நுழைவுகளை குறிக்கும். இவற்றை இணைப்பதால், அனைத்து மறுநுழைவுகளின் குறிச்சொற்களும் மெட்டாடேட்டாவும் ஒரே ஒட்டுமொத்த நுழைவாகச் சேர்க்கப்படும். இவற்றை 'மறுகோப்புகள்' என்பதுடன் குழப்பக் கூடாது, ஏனெனில் அவை டாக் ஸ்டுடியோவுக்கு வெளியேயுள்ள கோப்புகளின் நகல்களாகும்.", - "fix_unlinked.delete_unlinked": "இணைக்கப்படாத உள்ளீடுகளை நீக்கு", - "fix_unlinked.scan_library.label": "இணைக்கப்படாத நுழைவுகளை புத்தககல்லரியில் சோதனை செய்யப்படுகிறது...", - "mirror_entities.are_you_sure": "பின்வரும் உள்ளீடுகளைப் பிரதிபலிக்க விரும்புகிறீர்களா %{len(self.lib.dupe_files)}?", - "mirror_entities.title": "உள்ளீடுகள் பிரதிபழிக்கப்படுகின்றது", - "mirror_entities.label": "1/%{count} உள்ளீடுகளைப் பிரதிபலிக்கப்படுகின்றது...", - "landing.open_button": "நூலகத்தைத் திற/உருவாக்கு %{open_shortcut_text}", - "preview_panel.missing_location": "இடம் காணவில்லை", - "preview_panel.update_widgets": "[நுழைவு குழு] விட்ஜெட்டுகளை புதுப்பிக்கவும் (%{self.driver.selected})", - "relink_unlinked.title": "உள்ளீடுகள் மீண்டும் இணைக்கப்படுகின்றது", - "preview_panel.confirm_remove": "இந்த \"%{self.lib.get_field_attr(field, \"name\")}\" புலத்தை நிச்சயமாக அகற்ற விரும்புகிறீர்களா?", - "preview_panel.mixed_data": "கலப்பு தரவு", - "preview_panel.edit_name": "திருத்து", - "preview_panel.unknown_field_type": "அறியப்படாத புல வகை", - "tag.add_search": "தேடலில் சேர்", - "text_line_edit.unknown_event_type": "அறியப்படாத நிகழ்வு வகை: %{event}", - "preview_panel.no_items_selected": "உருப்படிகள் எதுவும் தேர்ந்தெடுக்கப்படவில்லை", - "tag.search_for_tag": "குறிச்சொல்லைத் தேடு", - "folders_to_tags.description": "உங்கள் அடைவு கட்டமைப்பின் அடிப்படையில் குறிச்சொற்களை உருவாக்கி, அவற்றை உங்கள் நுழைவுகளில் பயன்படுத்துகிறது.\nகீழே காணப்படும் கட்டமைப்பானது உருவாக்கப்படும் அனைத்து குறிச்சொற்களையும், அவை எந்த நுழைவுகளில் பயன்படுத்தப்படும் என்பதையும் காட்டுகிறது.", - "relink_unlinked.attempt_relink": "%{x[0]+1}/%{len(self.lib.missing_files)} உள்ளீடுகளை மீண்டும் இணைக்க முயற்சிக்கிறது, %{self.fixed} மீண்டும் இணைக்கப்பட்டது" -} diff --git a/tagstudio/resources/translations/tok.json b/tagstudio/resources/translations/tok.json deleted file mode 100644 index 457bd66a..00000000 --- a/tagstudio/resources/translations/tok.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "home.main_window": "lipu suli", - "home.include_all_tags": "AND (kepeken poki ale)", - "home.thumbnail_size": "suli sitelen", - "home.search": "alasa", - "home.search_entries": "ijo alasa", - "menu.file": "ijo", - "menu.edit": "ante", - "menu.tools": "ilo", - "menu.macros": "ilo pali", - "menu.window": "lipu", - "menu.help": "mi jo e toki seme", - "tag.new": "poki sin", - "tag.add": "o pana e poki", - "tag.library": "poki tomo", - "merge.merge_dupe_entries": "ijo sama li kama wan", - "preview.dimensions": "suli", - "preview.recent": "tomo pi tenpo poka", - "library.title": "nimi", - "library.author": "jan pali toki", - "library.Artist": "jan pali sitelen", - "library.url": "nimi linluwi", - "library.description": "toki ni", - "library.notes": "toki sina", - "library.tags": "poki", - "library.content_tags": "poki pi jo ijo", - "library.collation": "poki ijo", - "library.date_modified": "tenpo pi kama ante", - "library.date_created": "tenpo pi kama sin", - "library.date": "tenpo", - "library.date_taken": "tenpo lanpan", - "library.date_published": "tenpo pana", - "library.favorite": "pona mute", - "library.book": "lipu toki", - "library.comic": "lipu sitelen", - "library.series": "kulupu", - "library.manga": "kulupu pi lipu sitelen", - "library.date_uploaded": "tenpo pi kama lon lipu", - "library.date_released": "tenpo pi kama open", - "library.volume": "nanpa", - "library.anthology": "kulupu toki", - "library.publisher": "jan esun", - "library.guest_artist": "jan pali namako", - "library.comments": "toki isipin", - "open_library.no_tagstudio_library_found": "tomo lon '%{path}' li lon ala. mi pali e tomo.", - "dialog.open_create_library": "open/sin e tomo", - "splash.open_library": "mi open e tomo", - "status.save_success": "tomo li awen li weka!", - "status.backup_success": "tomo sama li lon:", - "status.number_results_found": "%{len(all_items)} mi jo e ijo \"%{query}\" (%{format_timespan(end_time - start_time)})", - "status.results_found": "jo", - "dialog.save_library": "awen e tomo", - "dialog.refresh_directories": "mi kama jo e sin lon tomo", - "dialog.scan_directories": "mi alasa e ijo sin lon tomo...\nmi kama pona...", - "tooltip.open_library": "Ctrl+O", - "tooltip.save_library": "Ctrl+S", - "progression.running_macros.new_entries": "mi pali lon ijo sin", - "progression.running_macros.one_new_entry": "mi pali lon ijo sin 1/%{len(new_ids)}", - "progression.running_macros.several_new_entry": "mi pali lon ijo sin %{x + 1}/%{len(new_ids)}", - "file_opener.not_found": "mi ken ala alasa e ijo:", - "generic.remove_field": "weka e sona", - "add_field.add": "pana e sona", - "generic.file_extension": "nimi lon nimi ijo anpa", - "generic.open_file": "open e ijo", - "generic.cancel": "o ala", - "generic.name": "nimi", - "generic.shorthand": "nimi lili", - "generic.aliases": "nimi ante", - "generic.color": "kule", - "generic.delete": "o weka", - "generic.add": "o pana", - "generic.exclude": "o kepeken ala", - "generic.include": "o kepeken", - "generic.done": "pona", - "generic.open_all": "open e ale", - "generic.close_all": "weka e ale", - "generic.apply": "o pana", - "generic.mirror": "jasima", - "generic.search_tags": "o alasa e poki", - "build_tags.parent_tags": "poki mama", - "build_tags.add_parent_tags": "o pana e poki mama", - "delete_unlinked.delete_unlinked": "o weka e ijo pi ijo lon ala", - "delete_unlinked.confirm": "mi weka e ijo %{len(self.lib.missing_files)}. ni li pona anu seme?", - "file_extension.list_mode": "nasin kulupu:", - "fix_dupes.no_file_selected": "sina o anu e ijo DupeGuru", - "fix_dupes.load_file": "o kama sona e ijo DupeGuru", - "fix_dupes.mirror_entries": "o jasima e ijo", - "fix_dupes.advice_label": "jasima li pini la, sina ken kepeken ilo DupeGuru. ilo DupeGuru li ken weka e ijo ike. ni li pini la, o kepeken e nasin \"o pona e ijo pi ijo lon ala\" lon ilo TagStudio. ni li weka e ijo pi ijo lon ala.", - "fix_dupes.name_filter": "ijo DupeGuru (*.dupeguru)", - "fix_dupes.no_file_match": "ijo sama: ala", - "fix_dupes.number_file_match": "ijo sama: %{count}", - "fix_unlinked.fix_unlinked": "o pona e ijo pi ijo lon ala", - "fix_unlinked.duplicate_description": "ken la, ijo mute li jo e ijo lon sama. ni li \"ijo sama\". sina wan e ona la, ijo sama li kama wan li jo e sona ale tan ijo sama ale.", - "fix_unlinked.search_and_relink": "o alasa o pana e ijo lon tawa ijo", - "fix_unlinked.refresh_dupes": "o kama jo e sona tan ijo sama", - "fix_unlinked.merge_dupes": "o kama wan e ijo sama", - "fix_unlinked.manual_relink": "sina o pana e ijo lon tawa ijo", - "fix_unlinked.delete_unlinked": "o weka e ijo pi ijo lon ala", - "fix_unlinked.scan_library.title": "mi o lukin e tomo", - "fix_unlinked.scan_library.label": "mi o alasa e ijo pi ijo lon ala...", - "folders_to_tags.title": "o pali e poki tan poki tomo", - "folders_to_tags.folders_to_tags": "mi o pali e poki tan poki tomo", - "home.base_title": "ilo TagStudio pi pini ala", - "home.include_any_tag": "OR (kepeken poki wan. poki ale li ken)", - "merge.window_title": "ijo sama li kama wan", - "library.meta_tags": "poki pi sona ijo", - "library.archived": "tenpo pi kama awen", - "library.magazine": "lipu sitelen toki", - "library.composer": "jan pali pi kalama musi", - "status.search_library_query": "mi alasa e", - "dialog.scan_directories.new_files": "mi alasa e ijo sin lon tomo...\nmi lukin e ijo %{x + 1}. ijo %{len(self.lib.files_not_in_library)} li sin", - "file_opener.open_file": "mi open e ijo:}", - "file_opener.command_not_found": "mi ken ala alasa e toki lawa '%{command_name}' lon PATH", - "generic.open_file_explorer": "open e ijo lon ilo alasa", - "generic.refresh_all": "o kama jo sin tan ale", - "delete_unlinked.delete_entries": "mi weka e ijo", - "delete_unlinked.deleting_number_entries": "mi weka e ijo %{x[0]+1}/{len(self.lib.missing_files)} pi ijo lon ala", - "file_extension.add_extension": "o pana e nimi anpa", - "fix_dupes.mirror_description": "o jasima e sona kama lon kulupu sama ale. sona ale li kama wan li weka ala li kama mute ala. ni li weka ala e sona e ijo.", - "fix_dupes.open_result_files": "o open e sona pini tan ilo DupeGuru", - "fix_unlinked.description": "ijo ale li jo e ijo lon. ona li tawa anu weka, ona li jo ala e ijo lon. ijo pi ijo lon li ken alasa e tomo li ken kama jo e ijo lon. ante la sina ken pana ijo lon tawa ijo. ante la sina ken weka e ijo.", - "library.source": "tan", - "open_library.title": "tomo", - "status.enumerate_query": "seme: %{query}. sitelen: %{i}. nanpa: %{len(f)}", - "open_library.library_creation_return_code": "tomo li open li toki e ni:", - "folders_to_tags.description": "ni li pali e poki tan poki tona li pana e poki sin tawa ijo lon tomo.\n ilo ni li pali e anpa.", - "mirror_entities.are_you_sure": "mi jasima e ijo %{len(self.lib.dupe_files)}. ni li pona anu seme?", - "mirror_entities.title": "mi jasima e ijo", - "mirror_entities.label": "mi jasima e ijo 1/%{count}...", - "relink_unlinked.title": "mi pana e ijo lon tawa ijo", - "relink_unlinked.attempt_relink": "mi o pana e ijo lon tawa ijo %{x[0]+1}/%{len(self.lib.missing_files)}. mi pana e ijo lon tawa ijo %{self.fixed}", - "fix_dupes.fix_dupes": "pona e ijo sama", - "landing.open_button": "open/sin e tomo %{open_shortcut_text}", - "preview_panel.missing_location": "ma li lon ala", - "preview_panel.no_items_selected": "ijo ala li anu", - "preview_panel.confirm_remove": "sina weka e sona poki \"%{self.lib.get_field_attr(field, \"name\")}\". ni li pona anu seme?", - "preview_panel.mixed_data": "sona ante", - "preview_panel.edit_name": "ante", - "preview_panel.unknown_field_type": "mi sona ala e kule pi sona poki", - "tag.search_for_tag": "o alasa e poki", - "tag.add_search": "pana tawa alasa", - "text_line_edit.unknown_event_type": "mi sona ala e ni: %{event}", - "preview_panel.update_widgets": "[LIPU OPEN] O SIN E LIPU LILI (%{self.driver.selected})" -} diff --git a/tagstudio/resources/translations/tr.json b/tagstudio/resources/translations/tr.json deleted file mode 100644 index b7a4cdf1..00000000 --- a/tagstudio/resources/translations/tr.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "home.main_window": "Ana Pencere", - "home.include_any_tag": "Veya (Herhangi Bir Etiketi Dikkate Alır)", - "home.thumbnail_size": "Küçük Resim Boyutu", - "home.search": "Ara", - "menu.file": "Dosya", - "menu.edit": "Düzenle", - "menu.tools": "Araçlar", - "menu.window": "Pencere", - "menu.help": "Yardım", - "tag.new": "Yeni Etiket", - "tag.add": "Etiket Ekle", - "tag.library": "Kütüphane Etiketleri", - "preview.dimensions": "Ölçüler", - "preview.recent": "Son Kütüphaneler", - "library.title": "Başlık", - "library.author": "Sahibi", - "library.Artist": "Sanatçı", - "library.notes": "Notlar", - "library.tags": "Etiketler", - "library.meta_tags": "Meta Etiketler", - "library.date": "Tarih", - "library.date_created": "Oluşturulma Tarihi", - "library.date_modified": "Değiştirilme Tarihi", - "library.archived": "Arşivlenme Tarihi", - "library.favorite": "Favori", - "library.book": "Kitap", - "library.comic": "Dergi", - "library.series": "Dizi", - "library.manga": "Manga", - "library.source": "Kaynak", - "library.date_released": "Çıkış Tarihi", - "library.volume": "Ses Seviyesi", - "library.anthology": "Antoloji", - "library.magazine": "Magazin", - "library.publisher": "Yayımcı", - "library.guest_artist": "Konuk Sanatçı", - "library.composer": "Besteci", - "library.comments": "Yorumlar", - "open_library.no_tagstudio_library_found": "'%{path}' konumunda herhangi bir TagStudio kütüphanesi bulunamadı. Yeni bir tane oluşturuluyor.", - "open_library.library_creation_return_code": "Kütüphane Oluşturmaktan Dönen Kod:", - "library.content_tags": "İçerik Etiketleri", - "library.collation": "Sıralama", - "library.date_taken": "Alınma Tarihi", - "home.search_entries": "library", - "merge.window_title": "Yinelenen Kayıtlar Birleştiriliyor", - "merge.merge_dupe_entries": "Yinelenen Kayıtlar Birleştiriliyor", - "status.backup_success": "Kütüphane Yedeklemesi Şuraya Kaydedildi:", - "status.search_library_query": "Kütüphane Aranıyor", - "status.enumerate_query": "Sorgu:%{query}, Kare: %{i}, Uzunluk: %{len(f)}", - "status.results_found": "Sonuçlar", - "progression.running_macros.new_entries": "Yeni Kayıtlar Üzerinde Makrolar Çalıştırılıyor", - "dialog.save_library": "Kütüphaneyi Kaydet", - "dialog.refresh_directories": "Dizinler Yenileniyor", - "dialog.scan_directories": "Yeni Dosyalar için Dizinler Taranıyor...\nHazırlanıyor...", - "tooltip.open_library": "Ctrl+O", - "tooltip.save_library": "Ctrl+S", - "file_opener.open_file": "Dosya açılıyor:}", - "file_opener.not_found": "Dosya bulunamadı:", - "add_field.add": "Alan Ekle", - "generic.remove_field": "Alan Kaldır", - "generic.file_extension": "Dosya Uzantıları", - "generic.open_file": "Dosya aç", - "generic.open_file_explorer": "Dosyayı Dosya Gezgininde Aç", - "generic.cancel": "İptal", - "generic.add": "Ekle", - "generic.name": "İsim", - "generic.shorthand": "Kısaltma", - "generic.aliases": "Takma Adlar", - "generic.color": "Renk", - "generic.delete": "Sil", - "generic.exclude": "Hariç Tut", - "generic.done": "Tamamlandı", - "generic.open_all": "Tümünü Aç", - "generic.close_all": "Tümünü Kapat", - "generic.refresh_all": "Tümünü Yenile", - "generic.apply": "Uygula", - "build_tags.parent_tags": "Üst Etiketler", - "build_tags.add_parent_tags": "Üst Etiketler Ekle", - "file_extension.add_extension": "Dosya Uzantısı Ekle", - "status.number_results_found": "\"%{query}\" (%{format_timespan(end_time - start_time)}) Sorgusu için %{len(all_items)} Sonuç Bulundu", - "progression.running_macros.one_new_entry": "1/%{len(new_ids)} Tane Yeni Kayıtlarda Yapılandırılmış Makrolar Çalıştırılıyor", - "progression.running_macros.several_new_entry": "%{x + 1}/%{len(new_ids)} Tane Yeni Kayıt Üzerinde Yapılandırılmış Makrolar Çalıştırılıyor", - "delete_unlinked.confirm": "%{len(self.lib.missing_files) tane kayıtları silmek istediğinden emin misin?", - "generic.mirror": "Yansıt", - "delete_unlinked.delete_unlinked": "Kopuk Kayıtları Sil", - "delete_unlinked.deleting_number_entries": "%{x[0]+1}/{len(self.lib.missing_files)} Kopuk Kayıt Siliniyor", - "fix_dupes.no_file_selected": "Seçili DupeGuru Dosyası Yok", - "fix_dupes.mirror_entries": "Kayıtları Yansıt", - "fix_dupes.open_result_files": "DupeGuru Sonuçlar Dosyasını Aç", - "fix_dupes.name_filter": "DupeGuru Dosyaları (*.dupeguru)", - "fix_dupes.no_file_match": "Bulunan Yinelenen Dosyalar: Yok", - "fix_dupes.number_file_match": "Bulunan Yinelenen Dosyalar: %{count}", - "fix_unlinked.fix_unlinked": "Kopuk Kayıtları Düzelt", - "fix_unlinked.search_and_relink": "Ara && Yeniden Eşleştir", - "fix_unlinked.refresh_dupes": "Yinelenen Kayıtları Yenile", - "fix_unlinked.merge_dupes": "Yinelenen Kayıtları Birleştir", - "fix_unlinked.manual_relink": "Manuel Yeniden Eşleştirme", - "fix_unlinked.delete_unlinked": "Kopuk Kayıtları Sil", - "fix_unlinked.scan_library.title": "Kütüphane Taranıyor", - "fix_unlinked.scan_library.label": "Kütüphane Kopuk Kayıtlar için Taranıyor...", - "folders_to_tags.folders_to_tags": "Klasörler Etiketlere Dönüştürülüyor", - "folders_to_tags.title": "Klasörlerden Etiketler Oluştur", - "folders_to_tags.description": "Klasörlerinin yapısına bakarak etiketler oluşturur ve bu etiketleri kayıtlarına uygular.\nAşağıdaki yapı, oluşturulacak tüm etiketleri ve o etiketlerin hangi kayıtlarına uygulanacağını göstermektedir.", - "home.base_title": "TagStudio Alpha", - "home.include_all_tags": "Ve (Tüm Etiketleri Dikkate Alır)", - "menu.macros": "Makrolar", - "library.url": "URL", - "library.description": "Açıklama", - "library.date_published": "Yayınlanma Tarihi", - "library.date_uploaded": "Yüklenme Tarihi", - "open_library.title": "Kütüphane", - "dialog.open_create_library": "Kütüphane Aç/Oluştur", - "splash.open_library": "Kütüphane Açılıyor", - "status.save_success": "Kütüphane Kaydedildi ve Çıkış Yapıldı!", - "dialog.scan_directories.new_files": "Yeni Dosyalar için Dizinler Taranıyor...\n%{x + 1} File%{\"s\" if x + 1 != 1 else \"\"} Arandı, %{len(self.lib.files_not_in_library)} Yeni Dosya Bulundu", - "file_opener.command_not_found": "Sistem PATH'inde %{command_name} komutu bulunamadı", - "generic.include": "Dahil Et", - "delete_unlinked.delete_entries": "Kayıtlar Siliniyor", - "generic.search_tags": "Etiketleri Araştır", - "file_extension.list_mode": "Listeleme Modu:", - "fix_dupes.mirror_description": "Kayıt verilerini bulunan her bir yinelemeye yansıtır, alanları kopyalamadan veya silmeden tüm verileri birleştirir. Bu operasyon herhangi bir dosya veya veri silmeyecek.", - "fix_dupes.fix_dupes": "Yinelenen Dosyaları Düzelt", - "fix_dupes.advice_label": "Yansıtma işleminden sonra, DupeGuru'yu kullanarak istenmeyen dosyaları silebilirsin. İşlem sonrasında, kopuk kayıtları silmek için TagStudio'nun Araçlar menüsünden \"Kopuk Kayıtları Düzelt\" özelliğini kullanabilirsin.", - "fix_dupes.load_file": "DupeGuru Dosyasını Yükle", - "fix_unlinked.duplicate_description": "Yinelenen kayıtlar, diskinizde aynı dosyaya işaret eden birden fazla kayıt olarak tanımlanmaktadır. Bu kayıtları birleştirdiğinizde, yinelenen tüm kayıtların içerisindeki etiketler ve metadata bilgisi tek bir tane kayıt üzerinde birleştirilecektir. Bu, \"yinelenen dosyalar\" ile karıştırılmamalıdır. Yinelenen dosyalar, TagStudio'nun dışında birden fazla kere bulunan dosyalarınızdır.", - "fix_unlinked.description": "Kütüphanenizdeki her bir kayıt, dizinlerinizden bir tane dosya ile eşleştirilmektedir. Eğer bir kayıta bağlı dosya TagStudio dışında taşınır veya silinirse, o dosya artık kopuk olarak sayılır. Kopuk kayıtlar dizinlerinizde arama yapılırken otomatik olarak tekrar eşleştirilebilir, manuel olarak sizin tarafınızdan eşleştirilebilir veya isteğiniz üzere silinebilir.", - "mirror_entities.title": "Kayıtlar Yansıtılıyor", - "mirror_entities.label": "1/%{count} Kayıt Yansıtılıyor...", - "relink_unlinked.title": "Kayıtlar Yeniden Eşleştiriliyor", - "relink_unlinked.attempt_relink": "%{x[0]+1}/%{len(self.lib.missing_files)} Kayıt Yeniden Eşleştirilmeye Çalışılıyor, %{self.fixed} Başarıyla Yeniden Eşleştirildi", - "landing.open_button": "Kütüphane Aç/Oluştur %{open_shortcut_text}", - "preview_panel.missing_location": "Lokasyon bulunamadı", - "preview_panel.update_widgets": "[KAYIT PANELİ] WIDGET'LARI GÜNCELLE (%{self.driver.selected})", - "preview_panel.no_items_selected": "Hiçbir Öğe Seçilmedi", - "preview_panel.confirm_remove": "Bu \"%{self.lib.get_field_attr(field, \"name\")}\" alanını silmek istediğinden emin misin?", - "preview_panel.mixed_data": "Karışık Veri", - "preview_panel.edit_name": "Düzenle", - "preview_panel.unknown_field_type": "Bilinmeyen Alan Türü", - "tag.search_for_tag": "Etiket Ara", - "tag.add_search": "Aramaya Ekle", - "text_line_edit.unknown_event_type": "bilinmeyen event türü: %{event}", - "mirror_entities.are_you_sure": "%{len(self.lib.dupe_files)} kaydı yansıtmak istediğinden emin misin?" -} diff --git a/tagstudio/resources/translations/yue_Hant.json b/tagstudio/resources/translations/yue_Hant.json deleted file mode 100644 index 0967ef42..00000000 --- a/tagstudio/resources/translations/yue_Hant.json +++ /dev/null @@ -1 +0,0 @@ -{} From e0752828dbb728bcc81dd2c58a63a2d15ec80791 Mon Sep 17 00:00:00 2001 From: yed Date: Tue, 8 Oct 2024 04:09:57 +0700 Subject: [PATCH 07/82] feat: store `Entry` suffix separately (#503) * feat: save entry suffix separately * change LibraryPrefs to allow identical values, add test --- tagstudio/src/core/constants.py | 11 --- tagstudio/src/core/driver.py | 40 ++++++++ tagstudio/src/core/enums.py | 30 ++++++ tagstudio/src/core/library/alchemy/fields.py | 16 ++-- tagstudio/src/core/library/alchemy/library.py | 91 ++++++++++++++----- tagstudio/src/core/library/alchemy/models.py | 3 + tagstudio/src/core/library/json/library.py | 2 + tagstudio/src/qt/modals/file_extension.py | 4 +- tagstudio/src/qt/ts_qt.py | 78 +++++++++------- tagstudio/src/qt/widgets/video_player.py | 1 + tagstudio/tests/conftest.py | 4 +- tagstudio/tests/macros/test_refresh_dir.py | 2 +- .../qt/{test_driver.py => test_qt_driver.py} | 0 tagstudio/tests/test_driver.py | 66 ++++++++++++++ tagstudio/tests/test_library.py | 63 +++++++------ 15 files changed, 302 insertions(+), 109 deletions(-) create mode 100644 tagstudio/src/core/driver.py rename tagstudio/tests/qt/{test_driver.py => test_qt_driver.py} (100%) create mode 100644 tagstudio/tests/test_driver.py diff --git a/tagstudio/src/core/constants.py b/tagstudio/src/core/constants.py index 64ff6214..aceac14a 100644 --- a/tagstudio/src/core/constants.py +++ b/tagstudio/src/core/constants.py @@ -1,5 +1,3 @@ -from enum import Enum - VERSION: str = "9.3.2" # Major.Minor.Patch VERSION_BRANCH: str = "" # Usually "" or "Pre-Release" @@ -7,7 +5,6 @@ VERSION_BRANCH: str = "" # Usually "" or "Pre-Release" TS_FOLDER_NAME: str = ".TagStudio" BACKUP_FOLDER_NAME: str = "backups" COLLAGE_FOLDER_NAME: str = "collages" -LIBRARY_FILENAME: str = "ts_library.json" # TODO: Turn this whitelist into a user-configurable blacklist. IMAGE_TYPES: list[str] = [ @@ -122,13 +119,5 @@ ALL_FILE_TYPES: list[str] = ( + SHORTCUT_TYPES ) - TAG_FAVORITE = 1 TAG_ARCHIVED = 0 - - -class LibraryPrefs(Enum): - IS_EXCLUDE_LIST = True - EXTENSION_LIST: list[str] = [".json", ".xmp", ".aae"] - PAGE_SIZE: int = 500 - DB_VERSION: int = 1 diff --git a/tagstudio/src/core/driver.py b/tagstudio/src/core/driver.py new file mode 100644 index 00000000..1561fbc9 --- /dev/null +++ b/tagstudio/src/core/driver.py @@ -0,0 +1,40 @@ +from pathlib import Path + +import structlog +from PySide6.QtCore import QSettings +from src.core.constants import TS_FOLDER_NAME +from src.core.enums import SettingItems +from src.core.library.alchemy.library import LibraryStatus + +logger = structlog.get_logger(__name__) + + +class DriverMixin: + settings: QSettings + + def evaluate_path(self, open_path: str | None) -> LibraryStatus: + """Check if the path of library is valid.""" + library_path: Path | None = None + if open_path: + library_path = Path(open_path) + if not library_path.exists(): + logger.error("Path does not exist.", open_path=open_path) + return LibraryStatus(success=False, message="Path does not exist.") + elif self.settings.value( + SettingItems.START_LOAD_LAST, defaultValue=True, type=bool + ) and self.settings.value(SettingItems.LAST_LIBRARY): + library_path = Path(str(self.settings.value(SettingItems.LAST_LIBRARY))) + if not (library_path / TS_FOLDER_NAME).exists(): + logger.error( + "TagStudio folder does not exist.", + library_path=library_path, + ts_folder=TS_FOLDER_NAME, + ) + self.settings.setValue(SettingItems.LAST_LIBRARY, "") + # dont consider this a fatal error, just skip opening the library + library_path = None + + return LibraryStatus( + success=True, + library_path=library_path, + ) diff --git a/tagstudio/src/core/enums.py b/tagstudio/src/core/enums.py index 8907ba17..d457f716 100644 --- a/tagstudio/src/core/enums.py +++ b/tagstudio/src/core/enums.py @@ -1,4 +1,6 @@ import enum +from typing import Any +from uuid import uuid4 class SettingItems(str, enum.Enum): @@ -31,3 +33,31 @@ class MacroID(enum.Enum): BUILD_URL = "build_url" MATCH = "match" CLEAN_URL = "clean_url" + + +class DefaultEnum(enum.Enum): + """Allow saving multiple identical values in property called .default.""" + + default: Any + + def __new__(cls, value): + # Create the enum instance + obj = object.__new__(cls) + # make value random + obj._value_ = uuid4() + # assign the actual value into .default property + obj.default = value + return obj + + @property + def value(self): + raise AttributeError("access the value via .default property instead") + + +class LibraryPrefs(DefaultEnum): + """Library preferences with default value accessible via .default property.""" + + IS_EXCLUDE_LIST = True + EXTENSION_LIST: list[str] = [".json", ".xmp", ".aae"] + PAGE_SIZE: int = 500 + DB_VERSION: int = 2 diff --git a/tagstudio/src/core/library/alchemy/fields.py b/tagstudio/src/core/library/alchemy/fields.py index 1b77c1e6..d0252ad9 100644 --- a/tagstudio/src/core/library/alchemy/fields.py +++ b/tagstudio/src/core/library/alchemy/fields.py @@ -18,27 +18,27 @@ class BaseField(Base): __abstract__ = True @declared_attr - def id(cls) -> Mapped[int]: # noqa: N805 + def id(self) -> Mapped[int]: return mapped_column(primary_key=True, autoincrement=True) @declared_attr - def type_key(cls) -> Mapped[str]: # noqa: N805 + def type_key(self) -> Mapped[str]: return mapped_column(ForeignKey("value_type.key")) @declared_attr - def type(cls) -> Mapped[ValueType]: # noqa: N805 - return relationship(foreign_keys=[cls.type_key], lazy=False) # type: ignore + def type(self) -> Mapped[ValueType]: + return relationship(foreign_keys=[self.type_key], lazy=False) # type: ignore @declared_attr - def entry_id(cls) -> Mapped[int]: # noqa: N805 + def entry_id(self) -> Mapped[int]: return mapped_column(ForeignKey("entries.id")) @declared_attr - def entry(cls) -> Mapped[Entry]: # noqa: N805 - return relationship(foreign_keys=[cls.entry_id]) # type: ignore + def entry(self) -> Mapped[Entry]: + return relationship(foreign_keys=[self.entry_id]) # type: ignore @declared_attr - def position(cls) -> Mapped[int]: # noqa: N805 + def position(self) -> Mapped[int]: return mapped_column(default=0) def __hash__(self): diff --git a/tagstudio/src/core/library/alchemy/library.py b/tagstudio/src/core/library/alchemy/library.py index 125c88c8..e2e973f6 100644 --- a/tagstudio/src/core/library/alchemy/library.py +++ b/tagstudio/src/core/library/alchemy/library.py @@ -1,5 +1,6 @@ import re import shutil +import sys import unicodedata from dataclasses import dataclass from datetime import UTC, datetime @@ -34,8 +35,8 @@ from ...constants import ( TAG_ARCHIVED, TAG_FAVORITE, TS_FOLDER_NAME, - LibraryPrefs, ) +from ...enums import LibraryPrefs from .db import make_tables from .enums import FieldTypeEnum, FilterState, TagColor from .fields import ( @@ -48,8 +49,6 @@ from .fields import ( from .joins import TagField, TagSubtag from .models import Entry, Folder, Preferences, Tag, TagAlias, ValueType -LIBRARY_FILENAME: str = "ts_library.sqlite" - logger = structlog.get_logger(__name__) @@ -115,6 +114,15 @@ class SearchResult: return self.items[index] +@dataclass +class LibraryStatus: + """Keep status of library opening operation.""" + + success: bool + library_path: Path | None = None + message: str | None = None + + class Library: """Class for the Library object, and all CRUD operations made upon it.""" @@ -123,6 +131,8 @@ class Library: engine: Engine | None folder: Folder | None + FILENAME: str = "ts_library.sqlite" + def close(self): if self.engine: self.engine.dispose() @@ -130,23 +140,19 @@ class Library: self.storage_path = None self.folder = None - def open_library(self, library_dir: Path | str, storage_path: str | None = None) -> None: - if isinstance(library_dir, str): - library_dir = Path(library_dir) - - self.library_dir = library_dir + def open_library(self, library_dir: Path, storage_path: str | None = None) -> LibraryStatus: if storage_path == ":memory:": self.storage_path = storage_path else: - self.verify_ts_folders(self.library_dir) - self.storage_path = self.library_dir / TS_FOLDER_NAME / LIBRARY_FILENAME + self.verify_ts_folders(library_dir) + self.storage_path = library_dir / TS_FOLDER_NAME / self.FILENAME connection_string = URL.create( drivername="sqlite", database=str(self.storage_path), ) - logger.info("opening library", connection_string=connection_string) + logger.info("opening library", library_dir=library_dir, connection_string=connection_string) self.engine = create_engine(connection_string) with Session(self.engine) as session: make_tables(self.engine) @@ -159,9 +165,24 @@ class Library: # default tags may exist already session.rollback() + if "pytest" not in sys.modules: + db_version = session.scalar( + select(Preferences).where(Preferences.key == LibraryPrefs.DB_VERSION.name) + ) + + if not db_version: + # TODO - remove after #503 is merged and LibraryPrefs.DB_VERSION increased again + return LibraryStatus( + success=False, + message=( + "Library version mismatch.\n" + f"Found: v0, expected: v{LibraryPrefs.DB_VERSION.default}" + ), + ) + for pref in LibraryPrefs: try: - session.add(Preferences(key=pref.name, value=pref.value)) + session.add(Preferences(key=pref.name, value=pref.default)) session.commit() except IntegrityError: logger.debug("preference already exists", pref=pref) @@ -183,11 +204,30 @@ class Library: logger.debug("ValueType already exists", field=field) session.rollback() + db_version = session.scalar( + select(Preferences).where(Preferences.key == LibraryPrefs.DB_VERSION.name) + ) + # if the db version is different, we cant proceed + if db_version.value != LibraryPrefs.DB_VERSION.default: + logger.error( + "DB version mismatch", + db_version=db_version.value, + expected=LibraryPrefs.DB_VERSION.default, + ) + # TODO - handle migration + return LibraryStatus( + success=False, + message=( + "Library version mismatch.\n" + f"Found: v{db_version.value}, expected: v{LibraryPrefs.DB_VERSION.default}" + ), + ) + # check if folder matching current path exists already - self.folder = session.scalar(select(Folder).where(Folder.path == self.library_dir)) + self.folder = session.scalar(select(Folder).where(Folder.path == library_dir)) if not self.folder: folder = Folder( - path=self.library_dir, + path=library_dir, uuid=str(uuid4()), ) session.add(folder) @@ -196,6 +236,10 @@ class Library: session.commit() self.folder = folder + # everything is fine, set the library path + self.library_dir = library_dir + return LibraryStatus(success=True, library_path=library_dir) + @property def default_fields(self) -> list[BaseField]: with Session(self.engine) as session: @@ -324,15 +368,18 @@ class Library: with Session(self.engine) as session: # add all items - session.add_all(items) - session.flush() + + try: + session.add_all(items) + session.commit() + except IntegrityError: + session.rollback() + logger.exception("IntegrityError") + return [] new_ids = [item.id for item in items] - session.expunge_all() - session.commit() - return new_ids def remove_entries(self, entry_ids: list[int]) -> None: @@ -396,9 +443,9 @@ class Library: if not search.id: # if `id` is set, we don't need to filter by extensions if extensions and is_exclude_list: - statement = statement.where(Entry.path.notilike(f"%.{','.join(extensions)}")) + statement = statement.where(Entry.suffix.notin_(extensions)) elif extensions: - statement = statement.where(Entry.path.ilike(f"%.{','.join(extensions)}")) + statement = statement.where(Entry.suffix.in_(extensions)) statement = statement.options( selectinload(Entry.text_fields), @@ -770,7 +817,7 @@ class Library: target_path = self.library_dir / TS_FOLDER_NAME / BACKUP_FOLDER_NAME / filename shutil.copy2( - self.library_dir / TS_FOLDER_NAME / LIBRARY_FILENAME, + self.library_dir / TS_FOLDER_NAME / self.FILENAME, target_path, ) diff --git a/tagstudio/src/core/library/alchemy/models.py b/tagstudio/src/core/library/alchemy/models.py index 303e9049..09b54e3e 100644 --- a/tagstudio/src/core/library/alchemy/models.py +++ b/tagstudio/src/core/library/alchemy/models.py @@ -120,6 +120,7 @@ class Entry(Base): folder: Mapped[Folder] = relationship("Folder") path: Mapped[Path] = mapped_column(PathType, unique=True) + suffix: Mapped[str] = mapped_column() text_fields: Mapped[list[TextField]] = relationship( back_populates="entry", @@ -177,6 +178,8 @@ class Entry(Base): self.path = path self.folder = folder + self.suffix = path.suffix.lstrip(".").lower() + for field in fields: if isinstance(field, TextField): self.text_fields.append(field) diff --git a/tagstudio/src/core/library/json/library.py b/tagstudio/src/core/library/json/library.py index 4322525c..0570c2f3 100644 --- a/tagstudio/src/core/library/json/library.py +++ b/tagstudio/src/core/library/json/library.py @@ -299,6 +299,8 @@ class Collation: class Library: """Class for the Library object, and all CRUD operations made upon it.""" + FILENAME: str = "ts_library.json" + def __init__(self) -> None: # Library Info ========================================================= self.library_dir: Path = None diff --git a/tagstudio/src/qt/modals/file_extension.py b/tagstudio/src/qt/modals/file_extension.py index 15403a88..224638ca 100644 --- a/tagstudio/src/qt/modals/file_extension.py +++ b/tagstudio/src/qt/modals/file_extension.py @@ -16,7 +16,7 @@ from PySide6.QtWidgets import ( QVBoxLayout, QWidget, ) -from src.core.constants import LibraryPrefs +from src.core.enums import LibraryPrefs from src.core.library import Library from src.qt.widgets.panel import PanelWidget @@ -104,7 +104,7 @@ class FileExtensionModal(PanelWidget): for i in range(self.table.rowCount()): ext = self.table.item(i, 0) if ext and ext.text().strip(): - extensions.append(ext.text().strip().lower()) + extensions.append(ext.text().strip().lstrip(".").lower()) # save preference self.lib.set_prefs(LibraryPrefs.EXTENSION_LIST, extensions) diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index 8ecd4e7a..9490e783 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -50,6 +50,7 @@ from PySide6.QtWidgets import ( QLineEdit, QMenu, QMenuBar, + QMessageBox, QPushButton, QScrollArea, QSplashScreen, @@ -58,12 +59,11 @@ from PySide6.QtWidgets import ( from src.core.constants import ( TAG_ARCHIVED, TAG_FAVORITE, - TS_FOLDER_NAME, VERSION, VERSION_BRANCH, - LibraryPrefs, ) -from src.core.enums import MacroID, SettingItems +from src.core.driver import DriverMixin +from src.core.enums import LibraryPrefs, MacroID, SettingItems from src.core.library.alchemy.enums import ( FieldTypeEnum, FilterState, @@ -71,6 +71,7 @@ from src.core.library.alchemy.enums import ( SearchMode, ) from src.core.library.alchemy.fields import _FieldID +from src.core.library.alchemy.library import LibraryStatus from src.core.ts_core import TagStudioCore from src.core.utils.refresh_dir import RefreshDirTracker from src.core.utils.web import strip_web_protocol @@ -120,7 +121,7 @@ class Consumer(QThread): pass -class QtDriver(QObject): +class QtDriver(DriverMixin, QObject): """A Qt GUI frontend driver for TagStudio.""" SIGTERM = Signal() @@ -173,16 +174,15 @@ class QtDriver(QObject): filename=self.settings.fileName(), ) - max_threads = os.cpu_count() - for i in range(max_threads): - # thread = threading.Thread( - # target=self.consumer, name=f"ThumbRenderer_{i}", args=(), daemon=True - # ) - # thread.start() - thread = Consumer(self.thumb_job_queue) - thread.setObjectName(f"ThumbRenderer_{i}") - self.thumb_threads.append(thread) - thread.start() + def init_workers(self): + """Init workers for rendering thumbnails.""" + if not self.thumb_threads: + max_threads = os.cpu_count() + for i in range(max_threads): + thread = Consumer(self.thumb_job_queue) + thread.setObjectName(f"ThumbRenderer_{i}") + self.thumb_threads.append(thread) + thread.start() def open_library_from_dialog(self): dir = QFileDialog.getExistingDirectory( @@ -457,33 +457,35 @@ class QtDriver(QObject): self.item_thumbs: list[ItemThumb] = [] self.thumb_renderers: list[ThumbRenderer] = [] self.filter = FilterState() - self.init_library_window() - lib: str | None = None - if self.args.open: - lib = self.args.open - elif self.settings.value(SettingItems.START_LOAD_LAST, defaultValue=True, type=bool): - lib = str(self.settings.value(SettingItems.LAST_LIBRARY)) - - # TODO: Remove this check if the library is no longer saved with files - if lib and not (Path(lib) / TS_FOLDER_NAME).exists(): - logger.error(f"[QT DRIVER] {TS_FOLDER_NAME} folder in {lib} does not exist.") - self.settings.setValue(SettingItems.LAST_LIBRARY, "") - lib = None - - if lib: + path_result = self.evaluate_path(self.args.open) + # check status of library path evaluating + if path_result.success and path_result.library_path: self.splash.showMessage( - f'Opening Library "{lib}"...', + f'Opening Library "{path_result.library_path}"...', int(Qt.AlignmentFlag.AlignBottom | Qt.AlignmentFlag.AlignHCenter), QColor("#9782ff"), ) - self.open_library(lib) + self.open_library(path_result.library_path) app.exec() - self.shutdown() + def show_error_message(self, message: str): + self.main_window.statusbar.showMessage(message, Qt.AlignmentFlag.AlignLeft) + self.main_window.landing_widget.set_status_label(message) + self.main_window.setWindowTitle(message) + + msg_box = QMessageBox() + msg_box.setIcon(QMessageBox.Icon.Critical) + msg_box.setText(message) + msg_box.setWindowTitle("Error") + msg_box.addButton("Close", QMessageBox.ButtonRole.AcceptRole) + + # Show the message box + msg_box.exec() + def init_library_window(self): # self._init_landing_page() # Taken care of inside the widget now self._init_thumb_grid() @@ -562,7 +564,7 @@ class QtDriver(QObject): self.main_window.statusbar.showMessage("Closing Library...") start_time = time.time() - self.settings.setValue(SettingItems.LAST_LIBRARY, self.lib.library_dir) + self.settings.setValue(SettingItems.LAST_LIBRARY, str(self.lib.library_dir)) self.settings.sync() self.lib.close() @@ -1061,14 +1063,19 @@ class QtDriver(QObject): self.settings.endGroup() self.settings.sync() - def open_library(self, path: Path | str): - """Opens a TagStudio library.""" + def open_library(self, path: Path) -> LibraryStatus: + """Open a TagStudio library.""" open_message: str = f'Opening Library "{str(path)}"...' self.main_window.landing_widget.set_status_label(open_message) self.main_window.statusbar.showMessage(open_message, 3) self.main_window.repaint() - self.lib.open_library(path) + open_status = self.lib.open_library(path) + if not open_status.success: + self.show_error_message(open_status.message or "Error opening library.") + return open_status + + self.init_workers() self.filter.page_size = self.lib.prefs(LibraryPrefs.PAGE_SIZE) @@ -1086,3 +1093,4 @@ class QtDriver(QObject): self.filter_items() self.main_window.toggle_landing_page(enabled=False) + return open_status diff --git a/tagstudio/src/qt/widgets/video_player.py b/tagstudio/src/qt/widgets/video_player.py index 0d5928f5..e1a4c141 100644 --- a/tagstudio/src/qt/widgets/video_player.py +++ b/tagstudio/src/qt/widgets/video_player.py @@ -41,6 +41,7 @@ class VideoPlayer(QGraphicsView): video_preview = None play_pause = None mute_button = None + filepath: str | None def __init__(self, driver: "QtDriver") -> None: super().__init__() diff --git a/tagstudio/tests/conftest.py b/tagstudio/tests/conftest.py index a7bff9bf..efcc2c66 100644 --- a/tagstudio/tests/conftest.py +++ b/tagstudio/tests/conftest.py @@ -32,8 +32,8 @@ def library(request): library_path = request.param lib = Library() - lib.open_library(library_path, ":memory:") - assert lib.folder + status = lib.open_library(pathlib.Path(library_path), ":memory:") + assert status.success tag = Tag( name="foo", diff --git a/tagstudio/tests/macros/test_refresh_dir.py b/tagstudio/tests/macros/test_refresh_dir.py index e0b1e8b6..4655d399 100644 --- a/tagstudio/tests/macros/test_refresh_dir.py +++ b/tagstudio/tests/macros/test_refresh_dir.py @@ -2,7 +2,7 @@ import pathlib from tempfile import TemporaryDirectory import pytest -from src.core.constants import LibraryPrefs +from src.core.enums import LibraryPrefs from src.core.utils.refresh_dir import RefreshDirTracker CWD = pathlib.Path(__file__).parent diff --git a/tagstudio/tests/qt/test_driver.py b/tagstudio/tests/qt/test_qt_driver.py similarity index 100% rename from tagstudio/tests/qt/test_driver.py rename to tagstudio/tests/qt/test_qt_driver.py diff --git a/tagstudio/tests/test_driver.py b/tagstudio/tests/test_driver.py new file mode 100644 index 00000000..65882d68 --- /dev/null +++ b/tagstudio/tests/test_driver.py @@ -0,0 +1,66 @@ +from os import makedirs +from pathlib import Path +from tempfile import TemporaryDirectory + +from PySide6.QtCore import QSettings +from src.core.constants import TS_FOLDER_NAME +from src.core.driver import DriverMixin +from src.core.enums import SettingItems +from src.core.library.alchemy.library import LibraryStatus + + +class TestDriver(DriverMixin): + def __init__(self, settings): + self.settings = settings + + +def test_evaluate_path_empty(): + # Given + settings = QSettings() + driver = TestDriver(settings) + + # When + result = driver.evaluate_path(None) + + # Then + assert result == LibraryStatus(success=True) + + +def test_evaluate_path_missing(): + # Given + settings = QSettings() + driver = TestDriver(settings) + + # When + result = driver.evaluate_path("/0/4/5/1/") + + # Then + assert result == LibraryStatus(success=False, message="Path does not exist.") + + +def test_evaluate_path_last_lib_not_exists(): + # Given + settings = QSettings() + settings.setValue(SettingItems.LAST_LIBRARY, "/0/4/5/1/") + driver = TestDriver(settings) + + # When + result = driver.evaluate_path(None) + + # Then + assert result == LibraryStatus(success=True, library_path=None, message=None) + + +def test_evaluate_path_last_lib_present(): + # Given + settings = QSettings() + with TemporaryDirectory() as tmpdir: + settings.setValue(SettingItems.LAST_LIBRARY, tmpdir) + makedirs(Path(tmpdir) / TS_FOLDER_NAME) + driver = TestDriver(settings) + + # When + result = driver.evaluate_path(None) + + # Then + assert result == LibraryStatus(success=True, library_path=Path(tmpdir)) diff --git a/tagstudio/tests/test_library.py b/tagstudio/tests/test_library.py index b61bef81..81f26690 100644 --- a/tagstudio/tests/test_library.py +++ b/tagstudio/tests/test_library.py @@ -2,40 +2,27 @@ from pathlib import Path, PureWindowsPath from tempfile import TemporaryDirectory import pytest -from src.core.constants import LibraryPrefs -from src.core.library.alchemy import Entry, Library +from src.core.enums import DefaultEnum, LibraryPrefs +from src.core.library.alchemy import Entry from src.core.library.alchemy.enums import FilterState from src.core.library.alchemy.fields import TextField, _FieldID -def test_library_bootstrap(): - with TemporaryDirectory() as tmp_dir: - lib = Library() - lib.open_library(tmp_dir) - assert lib.engine - - -def test_library_add_file(): +@pytest.mark.parametrize("library", [TemporaryDirectory()], indirect=True) +def test_library_add_file(library): """Check Entry.path handling for insert vs lookup""" - with TemporaryDirectory() as tmp_dir: - # create file in tmp_dir - file_path = Path(tmp_dir) / "bar.txt" - file_path.write_text("bar") - lib = Library() - lib.open_library(tmp_dir) + entry = Entry( + path=Path("bar.txt"), + folder=library.folder, + fields=library.default_fields, + ) - entry = Entry( - path=file_path, - folder=lib.folder, - fields=lib.default_fields, - ) + assert not library.has_path_entry(entry.path) - assert not lib.has_path_entry(entry.path) + assert library.add_entries([entry]) - assert lib.add_entries([entry]) - - assert lib.has_path_entry(entry.path) is True + assert library.has_path_entry(entry.path) def test_create_tag(library, generate_tag): @@ -99,7 +86,9 @@ def test_get_entry(library, entry_min): def test_entries_count(library): entries = [Entry(path=Path(f"{x}.txt"), folder=library.folder, fields=[]) for x in range(10)] - library.add_entries(entries) + new_ids = library.add_entries(entries) + assert len(new_ids) == 10 + results = library.search_library( FilterState( page_size=5, @@ -120,7 +109,7 @@ def test_add_field_to_entry(library): # meta tags + content tags assert len(entry.tag_box_fields) == 2 - library.add_entries([entry]) + assert library.add_entries([entry]) # When library.add_entry_field_type(entry.id, field_id=_FieldID.TAGS) @@ -208,7 +197,7 @@ def test_search_library_case_insensitive(library): def test_preferences(library): for pref in LibraryPrefs: - assert library.prefs(pref) == pref.value + assert library.prefs(pref) == pref.default def test_save_windows_path(library, generate_tag): @@ -394,3 +383,21 @@ def test_update_field_order(library, entry_full): assert entry.text_fields[0].value == "first" assert entry.text_fields[1].position == 1 assert entry.text_fields[1].value == "second" + + +def test_library_prefs_multiple_identical_vals(): + # check the preferences are inherited from DefaultEnum + assert issubclass(LibraryPrefs, DefaultEnum) + + # create custom settings with identical values + class TestPrefs(DefaultEnum): + FOO = 1 + BAR = 1 + + assert TestPrefs.FOO.default == 1 + assert TestPrefs.BAR.default == 1 + assert TestPrefs.BAR.name == "BAR" + + # accessing .value should raise exception + with pytest.raises(AttributeError): + assert TestPrefs.BAR.value From 7dd0f3dabbf597c293286d67252f0684a7d9a649 Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Mon, 7 Oct 2024 14:14:01 -0700 Subject: [PATCH 08/82] feat: port thumbnail (#390) and related features to v9.5 (#522) * feat: port v9.4 thumbnail + related feats to v9.5 Ports the following thumbnail and related PRs from the `Alpha-v9.4` branch to `main` (v9.5+): - (#273) Blender thumbnail support - (#307) Add font thumbnail preview support - (#331) refactor: move type constants to new media classes - (#390) feat(ui): expanded thumbnail and preview features - (#370) ui: "open in explorer" action follows os name - (#373) feat(ui): preview support for source engine files - (#274) Refactor video_player.py (Fix #270) - (#430) feat(ui): show file creation/modified dates + restyle path label - (#471) fix(ui): use default audio icon if ffmpeg is absent - (#472) fix(ui): use birthtime for creation time on mac & win Co-Authored-By: Ethnogeny <111099761+050011-code@users.noreply.github.com> Co-Authored-By: Theasacraft <91694323+Thesacraft@users.noreply.github.com> Co-Authored-By: SupKittyMeow <77246128+supkittymeow@users.noreply.github.com> Co-Authored-By: EJ Stinson <93455158+favroitegamers@users.noreply.github.com> Co-Authored-By: Sean Krueger <71362472+seakrueger@users.noreply.github.com> * remove vscode exceptions from `.gitignore` * delete .vscode directory * style: format for `ruff check` * fix(tests): update `test_update_widgets_not_selected` test * remove Send2Trash dependency * refactor: use dataclass for MediaCateogry * refactor: use enums for UI colors * docs: add file docstring for silent_Popen * refactor: replace logger with structlog * use early return inside `ResourceManager.get()` * add `is_ext_in_category()` method to `MediaCategory` Add method to check if an extension is a member of a given MediaCategory. * style: fix docstring style, missing type hints, rename `afm` * fix: use structlog vars in logging * refactor: move platform-dependent strings to PlatformStrings * refactor: move `parents[2]` path to variable * fix: undo logger regressions --------- Co-authored-by: Ethnogeny <111099761+050011-code@users.noreply.github.com> Co-authored-by: Theasacraft <91694323+Thesacraft@users.noreply.github.com> Co-authored-by: SupKittyMeow <77246128+supkittymeow@users.noreply.github.com> Co-authored-by: EJ Stinson <93455158+favroitegamers@users.noreply.github.com> Co-authored-by: Sean Krueger <71362472+seakrueger@users.noreply.github.com> --- .gitignore | 10 +- .vscode/launch.json | 17 - pyproject.toml | 1 + requirements.txt | 5 + .../resources/qt/images/broken_link_icon.png | Bin 0 -> 18571 bytes .../images/file_icons/adobe_illustrator.png | Bin 0 -> 10553 bytes .../qt/images/file_icons/adobe_photoshop.png | Bin 0 -> 12552 bytes .../qt/images/file_icons/affinity_photo.png | Bin 0 -> 11147 bytes .../resources/qt/images/file_icons/audio.png | Bin 0 -> 8860 bytes .../qt/images/file_icons/document.png | Bin 0 -> 9200 bytes .../qt/images/file_icons/file_generic.png | Bin 0 -> 5768 bytes .../resources/qt/images/file_icons/font.png | Bin 0 -> 9027 bytes .../resources/qt/images/file_icons/image.png | Bin 0 -> 8998 bytes .../qt/images/file_icons/image_vector.png | Bin 0 -> 10640 bytes .../qt/images/file_icons/material.png | Bin 0 -> 16977 bytes .../resources/qt/images/file_icons/model.png | Bin 0 -> 13247 bytes .../qt/images/file_icons/presentation.png | Bin 0 -> 11326 bytes .../qt/images/file_icons/program.png | Bin 0 -> 6748 bytes .../qt/images/file_icons/spreadsheet.png | Bin 0 -> 5721 bytes .../resources/qt/images/file_icons/text.png | Bin 0 -> 7126 bytes .../resources/qt/images/file_icons/video.png | Bin 0 -> 8448 bytes .../resources/qt/images/thumb_border_512.png | Bin 5649 -> 0 bytes .../resources/qt/images/thumb_broken_512.png | Bin 24707 -> 0 bytes .../qt/images/thumb_file_default_512.png | Bin 12661 -> 0 bytes .../resources/qt/images/thumb_loading.png | Bin 0 -> 18128 bytes .../resources/qt/images/thumb_loading_512.png | Bin 12467 -> 0 bytes .../qt/images/thumb_loading_dark_512.png | Bin 11270 -> 0 bytes .../resources/qt/images/thumb_mask_128.png | Bin 2245 -> 0 bytes .../resources/qt/images/thumb_mask_512.png | Bin 4902 -> 0 bytes .../resources/qt/images/thumb_mask_hl_512.png | Bin 5392 -> 0 bytes tagstudio/src/core/constants.py | 114 +- tagstudio/src/core/enums.py | 4 + tagstudio/src/core/media_types.py | 507 ++++++ tagstudio/src/core/palette.py | 77 +- .../src/qt/helpers/blender_thumbnailer.py | 111 ++ tagstudio/src/qt/helpers/color_overlay.py | 17 +- tagstudio/src/qt/helpers/file_tester.py | 32 + tagstudio/src/qt/helpers/gradient.py | 43 +- .../src/qt/helpers/rounded_pixmap_style.py | 29 + tagstudio/src/qt/helpers/silent_popen.py | 70 + tagstudio/src/qt/helpers/text_wrapper.py | 49 + tagstudio/src/qt/helpers/vendored/ffmpeg.py | 33 + .../helpers/vendored/pydub/audio_segment.py | 1444 +++++++++++++++++ .../src/qt/helpers/vendored/pydub/utils.py | 89 + tagstudio/src/qt/main_window.py | 25 +- tagstudio/src/qt/platform_strings.py | 16 + tagstudio/src/qt/resource_manager.py | 51 +- tagstudio/src/qt/resources.json | 80 + tagstudio/src/qt/resources_rc.py | 4 +- tagstudio/src/qt/ts_qt.py | 49 +- tagstudio/src/qt/widgets/collage_icon.py | 47 +- tagstudio/src/qt/widgets/item_thumb.py | 29 +- tagstudio/src/qt/widgets/preview_panel.py | 280 +++- tagstudio/src/qt/widgets/thumb_button.py | 59 +- tagstudio/src/qt/widgets/thumb_renderer.py | 1104 +++++++++++-- tagstudio/src/qt/widgets/video_player.py | 9 +- tagstudio/tests/qt/test_preview_panel.py | 2 +- 57 files changed, 3929 insertions(+), 478 deletions(-) delete mode 100644 .vscode/launch.json create mode 100644 tagstudio/resources/qt/images/broken_link_icon.png create mode 100644 tagstudio/resources/qt/images/file_icons/adobe_illustrator.png create mode 100644 tagstudio/resources/qt/images/file_icons/adobe_photoshop.png create mode 100644 tagstudio/resources/qt/images/file_icons/affinity_photo.png create mode 100644 tagstudio/resources/qt/images/file_icons/audio.png create mode 100644 tagstudio/resources/qt/images/file_icons/document.png create mode 100644 tagstudio/resources/qt/images/file_icons/file_generic.png create mode 100644 tagstudio/resources/qt/images/file_icons/font.png create mode 100644 tagstudio/resources/qt/images/file_icons/image.png create mode 100644 tagstudio/resources/qt/images/file_icons/image_vector.png create mode 100644 tagstudio/resources/qt/images/file_icons/material.png create mode 100644 tagstudio/resources/qt/images/file_icons/model.png create mode 100644 tagstudio/resources/qt/images/file_icons/presentation.png create mode 100644 tagstudio/resources/qt/images/file_icons/program.png create mode 100644 tagstudio/resources/qt/images/file_icons/spreadsheet.png create mode 100644 tagstudio/resources/qt/images/file_icons/text.png create mode 100644 tagstudio/resources/qt/images/file_icons/video.png delete mode 100644 tagstudio/resources/qt/images/thumb_border_512.png delete mode 100644 tagstudio/resources/qt/images/thumb_broken_512.png delete mode 100644 tagstudio/resources/qt/images/thumb_file_default_512.png create mode 100644 tagstudio/resources/qt/images/thumb_loading.png delete mode 100644 tagstudio/resources/qt/images/thumb_loading_512.png delete mode 100644 tagstudio/resources/qt/images/thumb_loading_dark_512.png delete mode 100644 tagstudio/resources/qt/images/thumb_mask_128.png delete mode 100644 tagstudio/resources/qt/images/thumb_mask_512.png delete mode 100644 tagstudio/resources/qt/images/thumb_mask_hl_512.png create mode 100644 tagstudio/src/core/media_types.py create mode 100644 tagstudio/src/qt/helpers/blender_thumbnailer.py create mode 100644 tagstudio/src/qt/helpers/file_tester.py create mode 100644 tagstudio/src/qt/helpers/rounded_pixmap_style.py create mode 100644 tagstudio/src/qt/helpers/silent_popen.py create mode 100644 tagstudio/src/qt/helpers/text_wrapper.py create mode 100644 tagstudio/src/qt/helpers/vendored/ffmpeg.py create mode 100644 tagstudio/src/qt/helpers/vendored/pydub/audio_segment.py create mode 100644 tagstudio/src/qt/helpers/vendored/pydub/utils.py create mode 100644 tagstudio/src/qt/platform_strings.py diff --git a/.gitignore b/.gitignore index 7b493926..c04f546f 100644 --- a/.gitignore +++ b/.gitignore @@ -232,11 +232,11 @@ compile_commands.json ### VisualStudioCode ### .vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -!.vscode/*.code-snippets +# !.vscode/settings.json +# !.vscode/tasks.json +# !.vscode/launch.json +# !.vscode/extensions.json +# !.vscode/*.code-snippets # Local History for Visual Studio Code .history/ diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 8838fbb3..00000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "TagStudio", - "type": "python", - "request": "launch", - "program": "${workspaceRoot}/tagstudio/tag_studio.py", - "console": "integratedTerminal", - "justMyCode": true, - "args": [] - } - ] -} diff --git a/pyproject.toml b/pyproject.toml index 023ee6f1..ca949c6b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,6 +4,7 @@ line-length = 100 [tool.ruff.lint.per-file-ignores] "tagstudio/tests/**" = ["D", "E402"] +"tagstudio/src/qt/helpers/vendored/**" = ["B", "E", "N", "UP", "SIM115"] [tool.ruff.lint.pydocstyle] convention = "google" diff --git a/requirements.txt b/requirements.txt index 18be43fa..f2b7a90c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,3 +12,8 @@ pillow-heif==0.16.0 chardet==5.2.0 structlog==24.4.0 SQLAlchemy==2.0.34 +pydub==0.25.1 +mutagen==1.47.0 +numpy==1.26.4 +ffmpeg-python==0.2.0 +vtf2img==0.1.0 diff --git a/tagstudio/resources/qt/images/broken_link_icon.png b/tagstudio/resources/qt/images/broken_link_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d431097084777d038020ea832bdbe5d5e16641f8 GIT binary patch literal 18571 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 literal 0 HcmV?d00001 diff --git a/tagstudio/resources/qt/images/file_icons/adobe_illustrator.png b/tagstudio/resources/qt/images/file_icons/adobe_illustrator.png new file mode 100644 index 0000000000000000000000000000000000000000..141ae6203951666eecbc4b120b03a5fea50ba389 GIT binary patch literal 10553 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 literal 0 HcmV?d00001 diff --git a/tagstudio/resources/qt/images/file_icons/affinity_photo.png b/tagstudio/resources/qt/images/file_icons/affinity_photo.png new file mode 100644 index 0000000000000000000000000000000000000000..f4305fb8c67c14e876d11bdd57ccf1eb28481cda GIT binary patch literal 11147 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 literal 0 HcmV?d00001 diff --git a/tagstudio/resources/qt/images/file_icons/document.png b/tagstudio/resources/qt/images/file_icons/document.png new file mode 100644 index 0000000000000000000000000000000000000000..a3dacb01efdab57f803bbe8ec4c9f911ca5f04e9 GIT binary patch literal 9200 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 CuDVJ9 literal 0 HcmV?d00001 diff --git a/tagstudio/resources/qt/images/file_icons/file_generic.png b/tagstudio/resources/qt/images/file_icons/file_generic.png new file mode 100644 index 0000000000000000000000000000000000000000..13685e3a60e24547d254059427ee09ec56b95cb2 GIT binary patch literal 5768 zcmeHKd03NI);|eB16m>ALJ>mxt=LzpU_nh-P%RTqJ z?R{-3X{IwC1h>&1roFJ7J8!y25G!}WVv6)Qb$Fs;A7KboGgnqmveqg4EwE0Hh zJ;W;vHcuQU;tM5wK^jSq8M{T0E@6?$h);SA&Xe-rqNj;phmR6L*K_DDGzR^*;u3zs zpNQ)@?}!VN1QLNbNg#X^!0$}FVZWn@()Y(I(pcdi35SII@8YSczY9Yw@!y6L@j9u$ z^Xb0^#A{_j9(^@WEJzo{@%*>((j>N1nb7Bj8P1pTQX<&=R9>1GWtT->?Be=AxEueB z>nBJNh}NL8;<3msQ%d^WF*&KRiM$Q`cuCS*w6~04URvTi9KClb>H6bcm&Ql&ymDbm zDdH`UMfPx||Hjb9KV-c*3+9x6A%b}1p4*grZ&@5azi^QtfuDkS;?)7mNgRJacNZ^r zcV}1HD+}o0m`InOAY;c$kd!OKb&)f}-I?LJ)`h`zabYfYab|ch8H_39DQR>c;$tPT z|ChYJs!85RBP4_w$QMflBH7f|t5RRX+xm)nMW*nlYMexxI%#HXoIXh`vQQ+5Pmklp zPZ>vWuef4Cf+QnW#9Nk#4w*$>mXN?l>6DSe_0>yqp}8<GOqqt^{2&-n+_tei6Yh)@8-`KMu?K@+&+>G6j^bk2d=k z?v0r-iLJZ7$$@N_oV;ac%}C$L{VfgESw2s*2EA@)(Y}h?xXz7*`9Wl8YiZ=@c3!;l ziQ779(&uwxA{Rd?Jh|V3_wdE6vIT;#A8xwW_98jGh_l9U!``8zU(7eWv+B;{gFDhj z>V%~gg>>U1#u*=qmfhLBIm~k+Mf|TjVU>F$B=}oCv34(t%$p-xEh>~vR?UZ^*5^Hn zYyPXx;mR6CC#`2U=Kwx-_IDNu1*R8fUb8w@Nn)Kl7My#ud?_bdwC-^FdY1@t$Zl-Z zFwkBW%oMqCv%2sFLm)aK?ADsXE`((IVFQO zb@nmohK*T2IOs0S=v`W$_@f)!avgeO7zqP6iUDSr>wg%isImYsdB|ZeTPv-4cw2Do zLdLSIkJ|?8_qtcRo256Wj>Y>qT-#ISh#$88di7S)PTyk+asiR;ziJuxFDAR~x3l`K z=X^pSq@EA{6t|c$FV?^KOQWK(fCc;A%RU>aCsv)TOw(O#^XkaC*pZ$SP5)|~^>yv@ z5zSSv!RJ*EB6X3TL1k3gItBW-OfiE~E1T$boc3tPs$6&VnZd2MPL+CBX)oQpu|2x1 zgs5EJ7C8JJrJf=SQ6!dB8=M;2%b8rHZY5wCMi@qQkYXZ9Q6E3D!H4npM5;`{hTyvs z{TRo`zfxXSX*2Gst#ACZ%vO`N!eskr=8)g8NG-5$a8uXM>cKiASzj0!tW-47)nO$> z>@GG~1;T)CH^rJWyr&7?B+Gv?1L!V<^&EhzV4RYP1&xFar^o=IVK}8F7PuZ{`8ovAXpV8J z0qER^=e8q=Nj4PO0nD<+Mo=&y^dzY6B6Iu#nClM^9Dq|=Ak|G|xj$09X^v?@s-E-7 z@{Oo`69aIJ&B#tlAtdO{vIwdHr2C60rezP3A`(<7deRKjvICJm1eFj$%_OM8(ZhpI$(d?=_<5)zd$|*#hhY`U61sHW(4JOEXZ$~VjPiCPiKOXjL4`0 z`9X9n11oW-w0e{L?VUf|#N!Yn4Ym7MrB?$`=I|5di zXntg?mg9kIM6_bbs|)0Yrl2zOW@N$=bBr4mmB8@Bf~P&^hag-_F+j=vZ!uSU7Izu1AYk0cda!6k z(3tnwm_t6J7+;P;wz@e^*)S*@xXqbN{noh{!TBP%ZP(HvBe-ryJ6pv?cy)eQRX02! zW2c#c>TJ$)%+*{^^@$Uf-#Qh@mm!Bz1fH7CBF?1r3!9eRcni&~evDg2j3PN;pM1`* zeUz7Hb!XdxL}7}=5Rd%B&ju+Ti6bjb5?dTWh0kv?9=cBvRDO&tP zFk;A>nO~WxwmmX{#0PgM9aLGrY9z9v)%>!fN%ZBahA`D9O;{)%JxytL{YFL%5hc5O z;I~|8GGo{vU&hQiY2_O4mj_#8@~ta1ku7ETa#U6;8lBW@ND*opn9O|zi z7NV9%Wp*T%Hqq2e?3vc+PR*i#+{?2}TW8ev^s^M7*r7g3O!-h#OA+1^6;iLYWNGoZMd$0YoGl@e>ECO%?s%oeg zQ++LTCZ!YC2)S)ViYA*%I`wOZNya9FjG5ks7-coc&*sw9-TR(BuQ{T9(iNF6Y&FlV zz0tSrl2bn3b31f~f+}L(`SIYFF(347^-+sUBLhWOG|p8$mpGHW(Simu=r#h2L2*~) zH+i~#8>M~E18m=;>nSwji7V}X+z=cnak|o`#cFH2hU}ra5r!CWQdcUnNtI9UZZ|+T zh96y_9V~5%A2p3|MZETZaD2*JbFh&uGqcbgS{=2&wd}>MgW7vL>-F7~dp}yCeZlD| z)pk!4Y`=meHf852@`8t_cV!;|CF&bLYqJ&Bp~H_U^>(rwonDL>T20rDYKZM3h75n2 za&gPE63WwAQ3j}Z>dZk&dwC!Pf2&4&9KnZUxl1tc;K?ATr&{}nV&Z*Ax2CH}1gGrv zqCe=iDDsDYB7L<~ZR z(#T5f*>=Ca>y8NQkoGnjag^tm{G!ftL_AJc@}})yZ3>+RX}Y zX6CgjnV}{=CV2RJq$d2hd3M+&b=X*Szba^WKg9#hX{z-Zb`AW|0=pr!>wQS8Lj#qD z-OR{Tt&VifRPDG`sr`b|%aTrqu!jpcxyhpipAF4brO`OUHIy?%7EX@lL`8?)_&@t? zf^1-0#ya;7gC^mqDJUq`-}mLbY%3w2qts$LZzn1yeBG_xFx=BwiYE7(i41!f8!1fr zcto(m1ha6ggA-lR8t1x1M9@t79MMK`YD!!4e4#{F&BZV7aSE$ zE^22^bgB0GSuxCgAm;Rxwa$A!vC&;{!4*x6b+oYI>y$HrqNrCxv~JJ#M(ERyaEQ_g o-8Yn{cCtM8dE+m7RZ*wLUjFRF8|KMI_5k|h_=mDuEdp%4&X0)NILUd{j@y4Qb?Bg4_g+R&34sO|1W_3+k?2n>dF z07xbg!S0@iycsGU-oE}pWYyvFDpeJKFS4q`W*eeSu(`LNzhxB7dv}!W9?z&lo(5j3 zCdNxi5r$Aepf|%^B_c2&h;A4`Ru#xKgk%0=f~txD!Z<`$b+oZpF{jeJRW@sH)+VYN zFI6GYynGCIZQJpM8P3S6ehfyiA%PGc9gJ6)|3cmWpQz^404i-a3`1|S>P7(*-*<*+ zpu4ZPgTEKU?@wue60E(0eE&h=TNe<@4~M-${%}2uCJ2}u|D=&s^>he-QMCWxlD_VR zp};;Hsuwg*S76?sB-Gs8o<{ZY4}diKE{m-y=yvlh8x6K>(bCag)Brcm5c2x_L~e6u zK$H$qXOk9DPfJI4&&Dl=I(l$yNF)lx3ZU@tc)2s&|5q?S{#8g`o`wv6Mu4|qws;=Q z0vL<4#c6;){}31kxCi-?RU@>#ynWn50~o5t40m5TBh<^E>c+R+&EJz6L?;pW2PnY* zi!{OP4{;>I-*l0np*A*#mi}}Gl@|FI^}D@8{;pnd4pmeH(PilF$=?{VYA}uJ73%5j zC0H|D$Rd?a^0`b(*A=#34dM3 zA9j%l|FC><*?-9+kZ~omD?2E zj?as>Ep0xQx#5_jvqqbre(#EPsy<1trzeVys)saNukPRMyJ==!GU3DdVEa@z$31HZ z`oTTdBf-U#c0azx-|Hpw#X$kF-i7vh}&=FbchVVRfZ$BUa$EF zv1z(9wwwNmHT%PErO~r!XGisbwJCV|emOdC+rJKE-AnR1Bz1UK*Jy9^lF^P7?y2Po z&KOAPY{FcwZ0TA9astSl31qTJ>DsYsC+PyOX6!!Rb{@nRByrQ4&G$eFqiKj;5Ltx1 z)F^)(>=kGB-LD)6K*JVDZUfdqS{w~0XtQD#i^$O5%tBvTNmufeqbhQ>o>_LKIqfp%TbEnTIO9i8{F#57hAh{6r7x$L+fUQrZ*v z!n%!_qH=&$UIEQLE-o0)dO*obWx+Cas3nj;Hqh&+6S}Jc1-e<^$r+ac+t*y=zQ{Y_ z=nWrDs+Hb^kB*l}7MKcA468b#0COwpo8VXxHls6xJJf6rR=SH(_|q_C`Za&L4y^La z8wXY&3Xr2IT&y_`@Px&I;KjTgvye;-i}BtQCo1*r2SUk>^7;Ox;bN30eu22-|_7bYYeP^Of|=y5nB*33=`rjxBL zFAhDT$y4 z^yFrt%&bDBD}&pMk?sy|So3HIX;GUVMI5NPm+v^?XDZj8*A}t0oZQqwJ~}kllATq4 zYU1fxlf(d>@0!Z=ITsg26csX(MUSlOxGUk;AB!YsM>m|Z%Z`>^xyo0oqbZ=F-S^7* zA^+lD=v%3_*;7bWbCkH__7nK&R7TZ-Th4L$&aBTdWr4OeJq1Xj74I~IfSZp+^lB#2 z`0<1jQ!Y4qlxvxMyWiY1SMQFCT;*%g-e^+oi$2%rp7B0g>z3@fmd2a;iFRYDxc9VO zm;a?t>K)Rzo4dwx%CzI< z4?2auVcjQooGq$Mp4p#mJt_fw!gmD(YI{`pU$PU@=ow?!Rn5gQ2;&_y{lTkSMzfB* zj7=r0c34Rj&)2wJ9M@w?-twcygH=AYCAU)Meiro! z-BFgETR4v^$n6(xGU2W)O5*yXN64IndkZsb>t<$1(%%!yGi+v+L0!qM(+=%kVfgE_ zowK%WN3{~&*P3)yOFZp9!^pSmnh|5)$xE*1QL2p-Y|T_q95twLa8U^bIZ7$8!i-(T^YOgl8Mv z_;`acY}PeX%=C6FZ>pHn)NCy6>r^iuZ<)34pPY$owHyG%E3??=p#F79kH-5vBv$ps zquRE-^}mipO^1QZpO-bw^O>s*`-LTS4UIX}>vJvhsx8IQ(f63Y<~@!UvA#1ulq*eq z+GoLPXH9eo$2)1~jXzQYS%pe^!nWNFPSU3Phf&@cM6XE6%gklThf{#ED(I2HJ?i!7 z$}RV3hq3s^idyzfSwNNrPrH*C`P7EkQd^F~fF-ZGuhWeZ-m`xO0a2Nw)WAa*iS42`J>DD;N*$RjnxZq$R=I!Y@2EppEUB6irMJy99#N2=Q<~Ufd z4iv6xVE6SogLz`9EWo#7pB_?rcU)$@8c@i|!D8IX6!#{-THjQG7ox8KPY;G;CRFkx zONsS018qn{9j%J?))OZAr6OQ7SeYH0*SNMNH;aHT-NfmDBG1-ZAIB`s!%xrlb(&LFr(N{2g1dDEP+Z-pWbizG7Q1iA zsc(+6rdVOR&eFFBpvo1Xz;HesJK7v|QleCnh{v(-2L(ZJj++h7BJV^BGh3)01;l*n zweln4xj&5~`F1qtelw+GYncWT;C<-Pq*=A?v2%xYIf_owBQhfFG!bw(SQ+G|OXEv( z$7N2afcFUa5H|}bo99@F+d=XpGtw506ErLpWJ-s@#~rMpUt^{3DRDu9E$uIa(8JoC zDnE!XktB-YOqB-!`{3;Fh(nQ5H-N7PDIunDD~|c9$cS^OsRGxU(uzxoTNF7yXM+_N zDtRaiQTV8cjVd?ZIq2MKnUeu@88G&4o)NxGIA?GOF@f*MiV`tCs#3Gs=p=45+5yXl zUam$_Td4ZZ3NZG2C49}rMW}G>ij_PF+QLsQ!E<>dU|&1SiYXeGQFK|7avo$7;2B8h zKs(!_PA(4vK5)tLYr&1*6Im`VqE3o4QzgKRhZy*{x>}nF{=lan!dyBdmP~>_L^j#s zBMaV*D5rWkSN9OKaHehpz|_VK<-IxUt6x4cl8iw`Lf~VRMNdz;BvBXwT!ffq#>w2K z<%z>P*sH|_S`L=yzPl~TmV`TTTNo5p5IBQp69!j&eb8|^Oi#ECml7*5o7v^ZXupdE z_%jBss|n10TZ1T5gWI*xdcWZI>*|7MD*naG-WoH%gX?JIU1T#yrtC3i#WgL5!R{5X ztI;=)RK0pzB1G9K1elc-x||tyEkj~)Hs_5cO2$|l36Po(pX&)5t8?1ewJrxCcKehi z_GSsGa{`f8{uE(l2S9x@n8g_^|ySoJ##t=#x_L}Zb2M}spf zMoPB=yJY~-Y&@5Y8vxd3P=aNKEzd!Ct<{%V|LP$5w_F4-$;iD93mC^u$+#Vs5a!pS zKFu?&T><3a5;WT&zXzh6>{t3S{tJP_$`8pjYiL> z9KFIdSL|n@N*|_s@-=aQZLe*|qxMd94civ8KBXcH8l1g-K}45~qxYitQl}4=u_m`m zk8~Z@?VwKRQ9n;Rptn$7DH5(lWAEf6W;lqQC2bhjycV5T=hXW&eWMD1LgOpN_!`nO z0G2{C?au+gJO;rl5dbn(aIlvo0dF;MIi_Z?&GcUa@w0+eVM^O=w7z|6v=ymE48G@( zQJCp8I9JfhBro5qt5+M~0P#p7%Bx1Tt!eW$U3MN07(uO6o3j_~yv!}yE-C(UT$+{Z zyx)$eOE*p`sI6ngsLmY@ge9Xenr{4dL2Sowu!irsOXiegpNo;MH$Al-m$)ZjNzTpg zUSogB&X_%Qe=|o>9#((I^mT;b^md~HU#oGp6eCSc%us4Q^l?q^h1dl8f@!Tg3lU0y2BVnGfNxWK9y68=ElB{(>w?JNNF$mN&Q!)(~E2-?AWwv%ds) zQy#}w;lm|Eg(<3FC%h8%=y0W&mj$<@9#x?5BLpS?EJSIk`DFt%M%z{NoS8UahOGV` z1T4tI_^o+d2Xw{xByAi~@GHdRBS!RfI3xV1U&#mcoDx>5vtd4#fP{$On6-C=?bD!S zX&jpZ)klbfCF>!|91somKdjl4g57%e;wYN ze1h~!$5`X|BK@czy5{Bda7j>W+aXyH22R681qRyiepyoc4d5G4lzy38@^y0Lmlq)& z0_lFeX^6@553P$VgP(hlLuV7T7WvcCxfY5_Zi2q#5O{7YJ9g@Q(2sMZlcNxS( zJ=M|9SdU@@e1q%5b>uqWBX{?&Qw6{ANs;@ot^o3*B?2=QYPxKBc(kZk$tzAEN3(eX zSuo@%Bd?nyk}66i3QG7_AIBdKp|0>vi;vvXvtR0wlqqyb=23ZMIuT9piaKX5BUsRp zTs2tiQ&HZfGYczn1md3hMwewzR2Xn}D>mpXpA^{bLw7A>&BM3Tovu5#1uIT@`l2tr zcHuKZ*vT6x>UnA-z)201APs2v!-Y;nUj20&3X6k&0h?2zCw+EBYbeA=(^E^j1=ytn!9IW1rB*$b%Ls?plbvk=kX?10WrM5o0|pl zOv&Y}frDg`K)5AQ?cgNL8&4)o;QCZ>OhFD&feC~r4fs!t0E{S@Xa1Ecrvjg3!a^pK zj05%!&CSBk(*d~Ad-BVmR_Y(@$pEHj(bqUrLDJ%nOGWtlo(Q0sd1$kfw3#y$n*}!@ zQwxe^)d{?ONyIdyh?#jb1Leu*olqz(L@d-_7d04u1PcKTv}a{*Li|min;k~y_x7*b z_tdFOuDLR{fXrFXO1r|%JsUbvW0>_It?too91In4 zXb{SC)7#fLDDHAWdr3Nr`x;H4>U0oYg!o5=F@*B66*cM=87fbOMe~Imy`PvocQVBGDWejOWa#UJtQPq z5CU^;Fsju`RXFmB4YUo5CoX>E71FRXyyvaLq5<9Q=edo@Z~*xUPMjZrY!7k@_gUYN zw1V7XK(C@YU=H}wqH&ez#dubzIe@w*ah>zTUaJVyRF@iXOkk0>WKnDNOb3$TN8UC7 zF2MBgQ(-!{wy9%HEB56i|AY+tk>acbW^d_CAJRJEyeQYN=MZZA^3#-Hho9HKQB-=P z#<$4SD8rifdPi;1V*caq}duBbnL0qC5Sjrzlt`d<&z%axbf#dKnheWD$I15Xg zftBhor~BSe#EF`^LmOg#DwAfD1&|T=`hY>hr`M`|d52j6P5vt(LxVNo@@Zq`Meci1 z(oo ztxv4Q-tdbfse=xfNt@#v7U{bV>X1BQpuxF~CcK`44K$d1S{=jHr%ljXHnam}T@$@$ z#rMG^B(N~gn0=D(zX`7f)t{(sH=5TAeDMrj#k>~rQX1ZO8{qAGs^Zy&GQ zqL{L>fc*j98dSlSNKNJoIWYE^T5(wf5ToFoOTRCW=LoLi;T40`sb0SB|B6f$6|k3x z6mUFoXVT$4=16}B_cqvJ2k&P13V|_De@Nq-KOVMJ=t%&9Q3gfumfyXIO=kVYT8L)s z!U|!3am{JvU1RQAoVgHXc4ra3G#j=j#XQBB#%tv83x}_?!Um11|KfSFuT=1o0rectZP3aNx`(cq_FHo0Z%CmHvas9}h=U1pL*oElk{+ zU91G&+C#(ji=mASS6C!VJ+{K>!v16UBcr#2hsYguxUM%*GECvy!tDF?Cs_-zxoVLf zumvr(176bcu*LI;w1w>lZ|39NX5lk1k?gPnL;}Cz0Ti_0ckF20d0sn|R>^XO%w zJ~+e9X`DyO2Kq&Jn|uV%pEo0JwzF~{?&O=Cjiv%?9l~>4o8dLTL}yo-|RlIlpaY4@4|q+ZhFR1Zr{0S){Au zDjFZoAmRLGwhAc7*SkJP{VnIdk~Q!1DHBCNWM*HFo-Av|bN0FwUyD9P0e(YM2n2C% z|2DG?(_+PVfSGP3Fj1Jq4aZ33<0{9~E^?nBN82N$!09%OtJgTM*L|};x#>6nlJ8TH zh4q7W$6mE;M(ZO_Hhcrdx~I{~3ln&g9OrO+r1^bVg)D;|)bOl1i3Y<@Wh9P-*xUe) zeIXs=u0_MH&7t*%V`b|(Fi*c@W}qNK+ya@7M(2IoGG6AsZnl8!&-4mmwn)7-Zy6e7 zGb@+!s$r%MF}cXS0G>Xv*^$%xiILwO9)ii^rz;~`YWEiEa%wS`^Fy0OCfc7!d^#t> z<~du1AD-&wSGvbaLUM2BXY)Jg%|$)HQynDLIbjypjNX~7fR0Rw)72{`cZ zv-Zj8M9NAy5dlw!A4UAWQ$ZAdZ?S-9e&3J7Y6>_w@r2)QG#*Z_I0KtRY06H|rMs+% zLhuvG5kE7N7{UW_aVBT&izwhIYf+>GtLmmtwm#1j%b^Z&rvCsuqPgP#Waxk~>L^>8 zOc8;qD`D<(l!YBuKKE2iKaL{WzA_mI%nGvPQTo?WI0s-qICDKvFV^MYouzSBL%+cT zc%|AIezyw4Pd{ijXJfFI3`K_yk;G(-K+_BbGvebu#-WvOqQo;j#VCf-$h0k%T&N_H z^mHxiy4nu+;|r*;T%8k%roW7maa7H>p~0G+X|o`o7Fv}1(j5OCfPd(A+ikbDQjYx( D6%`Z0 literal 0 HcmV?d00001 diff --git a/tagstudio/resources/qt/images/file_icons/image.png b/tagstudio/resources/qt/images/file_icons/image.png new file mode 100644 index 0000000000000000000000000000000000000000..94264aec02eec677d074ad7d623eb54b15429c98 GIT binary patch literal 8998 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 literal 0 HcmV?d00001 diff --git a/tagstudio/resources/qt/images/file_icons/image_vector.png b/tagstudio/resources/qt/images/file_icons/image_vector.png new file mode 100644 index 0000000000000000000000000000000000000000..f0e38a3d9c5c4ed1fdde54c3e3571cd8378e9661 GIT binary patch literal 10640 zcmb7q2{@GN|MxT26e&8PWTX))#!^JgD2lO%vXm`*VPxONOsCUGDj9>yUTHbmqLQLf zlVppdO|sS~OEC??81uaMGdkz|e(yQ|_r3n-y1LGNf0xg9xxe@Ke(rmuI@noAEnl}B zf*>h^rMV*n34x&yv`h^AZ#wQZ7lK4hgPmQYTy1TPe2Jl2K7Pa_{#tRN;eZc8#`w5! zAKzpCQOZaB1B1g%R3;xWRFs4LOjKNU*lOE`oB0O?TP8&KJ0;jT`z9RoHS|-#X?a&tF42w88O0Nd56{xEo~Lta%JNP zzW^gg^L;;+!OTP@C@L!42#bx4jn#_P(;`L$Vs#7+4YAs~SY2IBAfXu<9~R{krx_Nx z34vI`F!zu2jR+2p3MPgrBbYu%h|y6dDk^}l{1ea1O5j)2n|6$1OUs+(`jBG)L`}suqnEONlUv;&0w`*$e)YR2+*3mW6(KFhir>SjV zq^&K8Pase93l50?|4AcNt!xbBZEcM#gCnDe5%B`jQmH%nA77d+O+$hOHI7s{BJbmi zL}#KB9zpbr_VxD@m=^2-gd0f=h>G=z@ZTK>7TH8)cR)Ze$V0rc15)hDI$Ao~TKfO3 z5gX(W(3T?82f;b(XdCJ38-cC36dCqkeGydM|LDsS_kZKdlE#1f@^4xG>5DNI=>UJG z$r$^OL@o*ZN6P>)EYUzK0zD1;S5pI%zuKaI80du&py}a6rfMJvMF|FF`j7I2AoYys z42Jcd{cD==M~hweJDZuEG~W?SKk>S&h%Wl3NX$)>%dr?tZ%VYXJl45ojk)IHx-sm{ z9YHI9y|V1e``Vi&AEQ0RtXTEEiMZLs4#T`eE!Ry7s<#cK%=BG4_v~gI(|O3MatZI$ zc$I2!ePrx#+?GAe@5$+ncWadNTzna1i`JuiTpB*EDsXTvQ#RH#e&p$3+rN6^VAq`k zLwY_nn?;uoTuP{G`6bio0Drq%+HXSM-&VzxjP3MnvT|=--r73a5pbr3X!6KKhvPMk!L|3)-^(7! zyrSk8pnho){@`L_I93)woH3iK_NiM*A+3MhLj8W+Pu{D^JMq`n!Mrr=`~lmv$)}BLr;UHt(fqOLy`NhqADClyYJOn921oPd_ae3eR5-ZDMJ(SpASeR8p z^1{mq%6lEQZgE%WTr+k`!*fj3Iq%BMo^dJ7Elz7zVb2~(JLA`bQoQr#_ZjKDjh?2d zYgZjoJSlT}?JZGp?Ug4Eif<44XoFG6$a+51nGw1)-PzJ<0JuJnBuPv(v@R;Im^deFYIa?oOT|Om zy;}s+#?OMObI?n{bZ_?3)Vo;Y>|-qS!71rsX0 z_?8NLmcl6Yn<>QuAK5j0aqr_MQj2R-1XNecbTh`AA%@&I847qk)k%z>I|K`B*RG}} zw=&7tw=iVmcddAU%N|IZ!9z{jA3G;~5Q%WVP11`>OUT`{;(?AOffViO1w}s4>OEIH zFuO#%A*A!jhrn5wCm>^WKl??YuG=CFVDhZo->AvM8-BX*R&dn*hZPdec&H z^c}wV$ORC5p#~u3YXj2NXIylV56Bk78U(Y>53EF!0zVN51|dmPd$nZ3xgD&Dy}=tK z&YK8Ah29&18>TxX7dZ<4bCZn#N8OB3a8}^La_#ByR?DSG({!fC+k=+I)wV7x=$1jB=1uac+-8kc))%iS}@*8FCOrc zB#)CR_aqmSedj7bq~T|Z2gs7}F5g9I$@WgP8Wqk5F;GD!+{^fv?*6Z^8T!6K`xid$vk&QQg3!CamlHTi6 z;Y)xF(vfrZIU65Y3ZK}bz^yta34a4lI5RtQK0Rj-;DGdg>SLQ4e^u<%fSnEdifaY7c!B3LpW<(V@dcLtU$5DqDn?8fD zlr{6RYGUI-$(<PM6%5=Qkm8*~Qp<&)J2W0TLdNf5`J+ z0lQ*>Bi37WcsD?`Nsc|ynJy^<^yh#crE>d+7gq>V6)Fjjg2;rqJ#@z0>5%nIGRO*( z^3slTp3Z<$Lu8rc0)+5ba~O+L`S6Tg2&!27Vr1swT#g(%10<;sd!QWd*g}FvdS7K4 zUz^@ID4D#uS+8o{!Fz@o2Mp&Yy2K5st=4GB_3b>@Y;pqsLSlJ4G%9A?GFxFTw1$#>V1(TK}AdCY(LTH06=U1e^ zcqq?rMZ)5|z{Fld5W$iTBVolKXz_|NU-_Kv1r|s9LQ@HEuYjq0ho7=L&ypjqLH=X4 zp$U~-3xZUByloh}Q{_ezTY&w{jlkbNj5ShO(BTQtzt3oppR9hLJ|qC6MAGWEBJznk zyknMn<7BkBWYbhA0e5S9qcX0mW-X2@Cl>BW8+YOxtX$2Qe`OBg6 z6Y+$J1Kd@Tt+yA)S#RLZT6+TL4jm3PdwzC+H-2sgA2s3P#NV^Y_c^=5puG$}aW&q# z#Vg3KO`ad!bQ>;?WMp#W)+u1A`LKcC$&u80G;vT#ZDdGhg4wc>n#m(M#k|Yb2Yz=lSf{gWF7|C3JRO3 zWY9@c>`25GFK@rI^89b06pf+>Fywr|9>r71xd__?JB-!t0=qW`tki}CQ(CSgUuYAl ziA^-{D1}Li+P!_!0W)i$wnhu?{dNm@Pl^^H;!q1r-MILi$p41;JH0}Kd^`j6f|^1t zkWUX2mF906^8zSbenUjz-$Xv$E7>?2@i)_jf86W*~^YFQ2sm zflEFzH@hB$|Dp!uYA-i+Xn+WWH_ci_gtmCOUQ3tflMq)qiyGwp88{#e3V-C8U@OS| z5)6_7kH#!cexfM+F{@Tf9yRMUMvv~Iy3lcu_Bp|JAm6@l|C0fHyz3hm{@Nu@Ikgy0 zOU%KEq&?7RPOMJ2^JO73FY`?rzQbf@vcBr!19bFy77#z2&$`@|axqP)!BQ!k^~ehS ztJ~pB*31n~pqmsw_x{{KzGZ|DjhxM@wp(224&j$|u+gATM16E|OwLz-#rlD%u;FYV zC=~?fTXIG)_)I~n_RP!gX1*iJ4IPPd*^l3C_5~B~f`~qS z2+;QVqFRd^#$qBq*MFqEzally&;?^yJA`}27TE6=CE)15l%esYWdxtPu!_lW zMiB5>9J$qo#^hX=r#!*`AA7ekKB<+NWICll*-W0Q?N_j^8qFTQcw-uosMgSF-Kl}PJW zB2`kEYf-`@u8N53&u1y+PBfgDZ)co$h0U%e8w_KWBjO$(|5R_F#blh9tmUUDC4v2J z%3{}P78Dr1U{|Pl0{@IMSm!jzs0`-RHQU(1hJtL)Y+9-ASMER>6#QN`)A;`M#+|Ph zXuOzFGv|>GD>Mbu{Dx4jK|1ZY26B(qZMLW5L;|PBN|ReZmiNsr^R8`5%Amx*j6c%)m|d4 zQ+d1kp)}QB*fgzREt4Tykv>GeSX@XhZ(y&N7p1)IHE5m!}nKS2Fp&1phZir>Mh zLZ*p)Gn&0RY1#cNP~Q7P)@W~s``GDJ`!xAE{*DSha} zduxshuqrUT;akiQ0K4k8rUoJ93ZZt3A zeFUQ`#aq|Q4Xn_v)vCb~Z{hWM>Lh4w^g)_+W|GgrV?S1a*7f$3TfIWFlv{nu!i*bf z&--y&9jUn5M7{Y@W^ZEgWD_sUCgM14mlgV&VNAt} z9%P&&xzWTGIRhTEEeo+~wJOcGGwX0u9&O~ER5DSC&iaGUf0(PBRmCqXoWYwtw4eq0 z%^d3PHwT@`OONShkBMjg_Jy9n;Z-)@cI5L%O{70?`zb5)Y&e>3W$Z5r4jx&fg^!H! z&FGG}0FBI=-=dW+vwqMS08^_vtQ0iaez)T80U>Vd zRp#SK%lUxGqW!z0>-h_S=G1@j&Op-FLJat*noQ~UMK~LlI0f|M^}54E7!j{I ziWU$(K(-0brw(Y4Kcve5?AI;qfpi(=@rdYy~|xr-81?jk?sn=%D2w!&E`m#dt4QH@z8j7aKnd7nS|s`!^AHcz?zGe zU4%yqzViHfRnwK9&zIs#s$6nPc%jCQrSNErNfmc6ze~FG))kQ#PkQMrJ?Z{C8|EhH zj8F@3IC;eHYr)^VeqKgdJkp8#UIZ-C6*|M#;_M8*?}7b6vhD%y?j06%$nfGW8qd2Y z*=MjxZN87r&_pCW<}>JIhjs;3)3?JeuRa$pOFl|tSk8YSz6L&@TS4Q60_@KK8wA{w zP+f$z=M2#qef!P>@VJB)d{Oopgy(y3vcP4^N$88}{GHN*$LgfSbBZ8Y5qp7l_E{O_ zT+Z{?vl_q7zWDtbIE`x30eHq#)wM+__6{J(Y)~I z3>x|1eT=;o=V9vO{&_c(^rTU9uXLlni~}1VY`iTun$Mq$Qt#OWe;JzF0*W9NhaR$E=_E_zGxB7ARA|TiVh7%Rj89FO6t%|?c-_GmJ$(Y zK?}5F0ReR2E!Rb$x3KJfXl$yWOZ;Y@4CGtQFFY;eP&fdj#MDvRTH|o)oL&PLv@UV` z#nvHSs`A;!T-fG?SP`yf^Sl@68q0Da`Lr4Mw>1QTD&za4fL?x1uH2ySGc1= ztSI@N>ilI4?7&r)s*<4maDzL{Q9;aHnsM3m#&snkrXNb-z$?(*PcDLU3!yx!o0rbx zlwuOAoWk0pRF&Q8HxH(7ovSrZXg~BcBn0Y-bPExRxyO*0qoqDBu!Y)MiEt&=wqc@n z$Ez&Lv(2V{<;KPh?p6&G`-RNM&dC+?h0cYoS;Q^RKo;F5qL~U+0YGGxlo1?_`2EUC=>&lgrojjc*XZM zriI2EDtFn7o4SGP7Alw0=PRr1xEYLBt9s9>qg22>ioCl(Xr%ClaLkuc$TfQg-`23% zd$wET^fqumx|k|cnMj8+;(Zqx+V-fkjjvFTrlLSBT=ZIR*~-KaA@k4R;<3#fxM@Xs zarX`%aqSal$+cHi{1hROgmhcVi|xS8J#HRIT*Y@x4Hay|KLV0De?#U+AFWwOL%w%;*JXU%Q?xA+^mb4tzc=G*Y9W|=pMEcSm zzIG`WRp4f$&<~nYhnv*22ilU6$;yx|v|e&x=ng+HuCRcWf9W$S+L}hZIG41vT>4)O zPn;n6AM6;nUu;P5p~=b?I4!Aw%er3a4a~gj=fvwY zq`{cEADx@DkhrM^vbF^rI)S4@476%dfjUYTyh$k7-TG@90j5@ebB}`QKFvR|{O$sK zXM3n{GM$nDIWBk0ad9J;1?1dtu%|<#JBaoimQ7;Wi7oeZ zd9znVUdyVQCbT5dlB|=y8lMab{nM$t1=5)K09vH*$sq6^wB+dBi{OfYZ*CG5>jDpE zOMtX$ewBH-H7B3&QbPOdpJ11^qFcs< z6JM^l@a!*=ZVhHW6(c7yXF-L*$%jOGJ~w^y{CkX?=z|qZGHEGgNe)LEM$e_R<%SdfE>V3M%{hgi3wqa#96~_c=c>_U8@0pYR0_DEpA&GhK|g zrx9%85<%VE)B|tDZI~}g-#&}KMP5P#+6fVnv@dG&4>k>qf#i_$K`_l_ zgvWCu2J`!@8vfv9V6b+a29K~1Z*ZZS5CFO2Vlnf>n8F9IG$lj)=4w_8LTw$+A}G}^ z*scH3`Tt0Wk7d! z3GUIChnRs&tUN-Pq4y>xqe39M(;XZchJ=^7V`9Skdc1|Rf)Mn+WMl9dtY0OFYJ;n& z~|@OgQC+Eb{Uz_BIR+0E$*S@_MhjsiJC zy6WI_%s?iq0DMI@tdu0X0nvhKN1>mk@w8C1J7Wl&vKLs<%%Oas9nNNl6YX;ylJzsnl_5*6@$nf)k0O+axO}Ah}k@2 z=X^2;c=xg>w`s;cPp2SRU7r6LkgjV~8TQZ0II6(c^#@Rnzl$8sWgW`QGZ~r{+Z-_0 zs)$5KQymm0JjOQH$|mE%!!e^x0eIc!ArxlE;bG7QL$gr8k-1hGL{w3AP>SH0$2uXK z?BTtS%Gid8+IR@nJ&;~^WX?JjnDrZzfwniWb7(+5RR$8);gwJYi$_7p^BtW8JHWI_ zl6*@?up&ifRK{yXLAi9UW_r1wMwS#Bp$uU)ku+IB+uPVVYXut}TIV-s-MR!T1z=N_ zV8!J5T|Z$PCCQ^dVfRoO(@U@p0Cpb&8%E$G}f>MZ@^SqDT_tJFiie9Ty46QPBBUfpcS@`HJ)f#z2P9_na|S8Hd?lQpM?74 z2|~FIC#OVONVCTodaT=10T}z1ilCDL#vW-PxN)63m8Trs}2Jn`CQ#FqLlTKlxkU8L2Z*$v^u@!51Y9OCZIu8Z-JZ^B~&GYKL}k=M^)0n zE$Vj+85HUGEo6(Q34S3o9Y5~~$*4lv;dV588xBW;5g@HP__p*VT;3&qLP_x+gt3CQ z4LMaMlzQwMdKXeJV!Wey90Z(j#~Nixhg_eYx)ihG!renc1^Fxnc&`Y*Ar~;SM{)Hf z9Qfdh{rtUjdGh1XsnSbf!ty=k>nS9Cly)I_2{CNm6)@LR7J{gO4}6N!h8o0D+b9)N zacT6}J5M1=^2I;ah$@2%g4VmuwMow_ypBm|^LzrFexaC4Pz-stG_T9^iLVa=!63Sv z*cqFgngB!l_OVkbCCP6ORdYogi+sR0)^<1UWIxt6qR%`KZ`Gf}ijYc%`P4&NJ`t=rQ4WgE}LCoWQ8N8_;5V4`Qv8w(14(<_qF6C;BH zu2La+EKw-`dlcoxMEv2Fhp{xY9jE5fL?G9JhHgnBMu<3rk3YkN{=)d0D2wB}Y2-rI znNrWv*w=-_*_aC4%nmKrxvvfD)YkGmu{NAMQ3m?%gg>Fcle_9zUJlD^bNn8fbrrYm z*EGAu+|vHK5v~*LnF}6_BgQ|fiR!yoA(;vpzmF-*dvp5}YO}%cdQ>PgSM*7YCyn(E ztj)-~E+lb-HvL(w+^QZSsO^e5vRK`$>!k&U$VBkNFlp-nWZ73fG-(EFOH8J?Wo?5% zFJ1_<=SUHftEYEUbm&?F3KRYXbdgi0K&D}*B)RBj z&vMf%BAs|9TD|-^B03F3e|I>B80PxU3BS2ni)bxs^G^K!+7lS3{7~SVM!Ty60MkbR zz^ZHwSlJ>ID&C3C;gGa*MI!?H8o*xeJc_`M0oe8+0qhKby?$2! z%K=!1CIT!)COXIwivYM53`uXleFFj5)&v0F9zp;<2LgccJBVLXAR4V{cf_wz;Fm!H z5`04xz}i|b2mBhG1H)aL5LoY6D!volyYe&mD>zT&Zvjg7BkqPr0diReGORRVqDOjy z5W_q5z_9-`GVE?+i&M1)o`VlKajH%P;=_dBoUoZfJ>mluudOWVy;nj$XGmI-fO?QA zqpie5%V!IPyI3JP_6}O!(5Hb~)Z?8P(tyUnNSBAY0x9m37)c)jzrYHG?^G>9Q}GSK zYbbh7LOmcl#Ud!gLLvwNHr%P#ZZ6oKnXVe&(vv6yowt+-+5~=$&vX(RI}g|);9vpy z)ZV39R4&hlwt?>)gq`LDHW(yUA_8cVR$vFB0 z0fm!}|67H1^#br?uLZbue;|<1jk5xrokg<t8<>Dz7S#x**$Dz$iu=bAFDM)C zxg$n*UVkgll?@iSt9_@(8iCTgbq_J1UEL$#uDB)OR#tWiboW?gA;`-QJw${YQcDCv zS(hFOrnlt$3WmssXyp3A4iu#Lhg0>sZYL>tJd-!Imn;N%tL1EtcR7#e4P0P7Sy8wF z+DVP1CArXMheuAr_L)hI91Ah%dPEql!j7|oP~Q5v82*6)7t$n}tm?|;4Rwcmn_?Ik wxy`le&ER5i;ms7!Ajf#k&%f^2H4j@RPTm)7JP!Wq1cC^A?aa&fc>nr;0D5j^$^ZZW literal 0 HcmV?d00001 diff --git a/tagstudio/resources/qt/images/file_icons/material.png b/tagstudio/resources/qt/images/file_icons/material.png new file mode 100644 index 0000000000000000000000000000000000000000..0c0c10afd37a0f970cddb20a02cc4b9530788d94 GIT binary patch literal 16977 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 NOe~EbpY^)_{{X)gX8ZsE literal 0 HcmV?d00001 diff --git a/tagstudio/resources/qt/images/file_icons/model.png b/tagstudio/resources/qt/images/file_icons/model.png new file mode 100644 index 0000000000000000000000000000000000000000..631db6e9a9ab19037734fb22d14ec9fb469483f0 GIT binary patch literal 13247 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 Qj3z_)gZAd-2MA~W7s;GBIRF3v literal 0 HcmV?d00001 diff --git a/tagstudio/resources/qt/images/file_icons/presentation.png b/tagstudio/resources/qt/images/file_icons/presentation.png new file mode 100644 index 0000000000000000000000000000000000000000..86a3b37c9eb6cee6ae219c1e09028d526b081d9a GIT binary patch literal 11326 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 literal 0 HcmV?d00001 diff --git a/tagstudio/resources/qt/images/file_icons/program.png b/tagstudio/resources/qt/images/file_icons/program.png new file mode 100644 index 0000000000000000000000000000000000000000..f7d64c1a18fa8a470ea01be63627f60c90ffa238 GIT binary patch literal 6748 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 literal 0 HcmV?d00001 diff --git a/tagstudio/resources/qt/images/file_icons/spreadsheet.png b/tagstudio/resources/qt/images/file_icons/spreadsheet.png new file mode 100644 index 0000000000000000000000000000000000000000..fb1dbeac285d357ab0ba845488832201b204d5a1 GIT binary patch literal 5721 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 literal 0 HcmV?d00001 diff --git a/tagstudio/resources/qt/images/file_icons/text.png b/tagstudio/resources/qt/images/file_icons/text.png new file mode 100644 index 0000000000000000000000000000000000000000..79d7d91b03bfd02a16b927ef9ae3f8d72d117c17 GIT binary patch literal 7126 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 B5_$jt literal 0 HcmV?d00001 diff --git a/tagstudio/resources/qt/images/thumb_border_512.png b/tagstudio/resources/qt/images/thumb_border_512.png deleted file mode 100644 index 605717e3de726590cfadfeac82e232272c9c4638..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5649 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 diff --git a/tagstudio/resources/qt/images/thumb_broken_512.png b/tagstudio/resources/qt/images/thumb_broken_512.png deleted file mode 100644 index 5022f2eb32c9dcb353cca933f443f6a3337859aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24707 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 Ym$pBgQy!fa1rI=4YWjCdZaX~w541AvfdBvi diff --git a/tagstudio/resources/qt/images/thumb_file_default_512.png b/tagstudio/resources/qt/images/thumb_file_default_512.png deleted file mode 100644 index 28dfbd433568600ee6397a0baec5ad25791308ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12661 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 G-})bN^c95w diff --git a/tagstudio/resources/qt/images/thumb_loading.png b/tagstudio/resources/qt/images/thumb_loading.png new file mode 100644 index 0000000000000000000000000000000000000000..174a1879d211a7a98963b903087326172ee79056 GIT binary patch literal 18128 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
    @@ -19,11 +18,11 @@ TagStudio is a photo & file organization application with an underlying system t ## Goals -- To achieve a portable, privacy-oriented, open, extensible, and feature-rich system of organizing and rediscovering files. -- To provide powerful methods for organization, notably the concept of tag composition, or “taggable tags”. -- To create an implementation of such a system that is resilient against a user’s actions outside the program (modifying, moving, or renaming files) while also not burdening the user with mandatory sidecar files or otherwise requiring them to change their existing file structures and workflows. -- To support a wide range of users spanning across different platforms, multi-user setups, and those with large (several terabyte) libraries. -- To make the darn thing look like nice, too. It’s 2024, not 1994. +- To achieve a portable, privacy-oriented, open, extensible, and feature-rich system of organizing and rediscovering files. +- To provide powerful methods for organization, notably the concept of tag composition, or “taggable tags”. +- To create an implementation of such a system that is resilient against a user’s actions outside the program (modifying, moving, or renaming files) while also not burdening the user with mandatory sidecar files or otherwise requiring them to change their existing file structures and workflows. +- To support a wide range of users spanning across different platforms, multi-user setups, and those with large (several terabyte) libraries. +- To make the darn thing look like nice, too. It’s 2024, not 1994. ## Priorities @@ -34,14 +33,18 @@ TagStudio is a photo & file organization application with an underlying system t ## Current Features -- Create libraries/vaults centered around a system directory. Libraries contain a series of entries: the representations of your files combined with metadata fields. Each entry represents a file in your library’s directory, and is linked to its location. -- Add metadata to your library entries, including: - - Name, Author, Artist (Single-Line Text Fields) - - Description, Notes (Multiline Text Fields) - - Tags, Meta Tags, Content Tags (Tag Boxes) -- Create rich tags composed of a name, a list of aliases, and a list of “subtags” - being tags in which these tags inherit values from. -- Search for entries based on tags, ~~metadata~~ (TBA), or filenames/filetypes (using `filename: `) -- Special search conditions for entries that are: `untagged`/`no tags` and `empty`/`no fields`. +- Create libraries/vaults centered around a system directory. Libraries contain a series of entries: the representations of your files combined with metadata fields. Each entry represents a file in your library’s directory, and is linked to its location. +- Add metadata to your library entries, including: + - Name, Author, Artist (Single-Line Text Fields) + - Description, Notes (Multiline Text Fields) + - Tags, Meta Tags, Content Tags (Tag Boxes) +- Create rich tags composed of a name, a list of aliases, and a list of “subtags” - being tags in which these tags inherit values from. +- Search for entries based on tags, ~~metadata~~ (TBA), or filenames/filetypes (using `filename: `) +- Special search conditions for entries that are: `untagged`/`no tags` and `empty`/`no fields`. + +## Feature Roadmap + +The [feature roadmap](updates/roadmap.md) lists all of the planned core features for TagStudio to be considered "feature complete" along with estimated release milestones. The development and testing of these features takes priority over all other requested or submitted features unless they are later added to this roadmap. This helps ensure that TagStudio eventually sees a full release and becomes more usable by more people more quickly. ## Important Updates diff --git a/docs/updates/roadmap.md b/docs/updates/roadmap.md new file mode 100644 index 00000000..7b2fb6e9 --- /dev/null +++ b/docs/updates/roadmap.md @@ -0,0 +1,265 @@ +# TagStudio Roadmap + +This checklist details the current and remaining features required at a minimum for TagStudio to be considered “Feature Complete”. This list is _not_ a definitive list for additional feature requests and PRs as they come in, but rather an outline of my personal core feature set intended for TagStudio. + +## Priorities + +Features are broken up into the following priority levels, with nested priorities referencing their relative priority for the overall feature (i.e. A [LOW] priority feature can have a [HIGH] priority element but it otherwise still a [LOW] priority item overall): + +- HIGH - Core feature +- MEDIUM - Important but not necessary +- LOW - Just nice to have + +## Core Feature List + +- [ ] Tags [HIGH] + - [x] ID-based, not string based [HIGH] + - [x] Tag name [HIGH] + - [x] Tag alias list, aka alternate names [HIGH] + - [x] Tag shorthand (specific short alias for displaying) [HIGH] + - [x] Parent/Inheritance subtags [HIGH] + - [ ] Composition/HAS subtags [HIGH] + - [ ] Deleting Tags [HIGH] + - [ ] Merging Tags [HIGH] + - [ ] Tag Icons [HIGH] + - [ ] Small Icons [HIGH] + - [ ] Large Icons for Profiles [MEDIUM] + - [ ] Built-in Icon Packs (i.e. Boxicons) [HIGH] + - [ ] User Defined Icons [HIGH] + - [ ] Multiple Languages for Tag Strings [MEDIUM] + - [ ] User-defined tag colors [HIGH] + - [ ] ID based, not string or hex [HIGH] + - [ ] Color name [HIGH] + - [ ] Color value (hex) [HIGH] + - [ ] Existing colors are now a set of base colors [HIGH] + - [ ] Editable [MEDIUM] + - [ ] Non-removable [HIGH] + - [ ] [Tag Categories](../library/tag_categories.md) [HIGH] + - [ ] Property available for tags that allow the tag and any inheriting from it to be displayed separately in the preview panel under a title [HIGH] + - [ ] Title is tag name [HIGH] + - [ ] Title has tag color [MEDIUM] + - [ ] Tag marked as category does not display as a tag itself [HIGH] + - [ ] [Tag Overrides](../library/tag_overrides.md) [MEDIUM] + - [ ] Per-file overrides of subtags [HIGH] +- [ ] Tag Packs [MEDIUM] + - [ ] Human-readable (i.e. JSON) files containing tag data [HIGH] + - [ ] Importable [HIGH] + - [ ] Exportable [HIGH] + - [ ] Conflict resolution [HIGH] + - [ ] Color Packs [MEDIUM] + - [ ] Human-readable (i.e. JSON) files containing tag data [HIGH] + - [ ] Importable [HIGH] + - [ ] Exportable [HIGH] +- [ ] Exportable Library Data [HIGH] + - [ ] Standard notation format (i.e. JSON) contacting all library data [HIGH] +- [ ] [Macros](../utilities/macro.md) [HIGH] + - [ ] Sharable Macros [MEDIUM] + - [ ] Standard notation format (i.e. JSON) contacting macro instructions [HIGH] + - [ ] Exportable [HIGH] + - [ ] Importable [HIGH] + - [ ] Triggers [HIGH] + - [ ] On new file [HIGH] + - [ ] On library refresh [HIGH] + - [...] + - [ ] Actions [HIGH] + - [ ] Add tag(s) [HIGH] + - [ ] Add field(s) [HIGH] + - [ ] Set field content [HIGH] + - [ ] [...] +- [ ] Settings Menu [HIGH] + - [ ] Application Settings [HIGH] + - [ ] Stored in system user folder/designated folder [HIGH] + - [ ] Library Settings [HIGH] + - [ ] Stored in `.TagStudio` folder [HIGH] +- [ ] Multiple Root Directories per Library [HIGH] +- [ ] [Entry groups](../library/entry_groups.md) [HIGH] + - [ ] Groups for files/entries where the same entry can be in multiple groups [HIGH] + - [ ] Ability to number entries within group [HIGH] + - [ ] Ability to set sorting method for group [HIGH] + - [ ] Ability to set custom thumbnail for group [HIGH] + - [ ] Group is treated as entry with tags and metadata [HIGH] + - [ ] Nested groups [MEDIUM] +- [ ] Fields [HIGH] + - [x] Text Boxes [HIGH] + - [x] Text Lines [HIGH] + - [ ] Dates [HIGH] + - [ ] GPS Location [LOW] + - [ ] Custom field names [HIGH] +- [ ] Search engine [HIGH] + - [ ] Boolean operators [HIGH] + - [ ] Tag objects + autocomplete [HIGH] + - [ ] Filename search [HIGH] + - [ ] Filetype search [HIGH] + - [ ] Field content search [HIGH] + - [ ] HAS operator for composition tags [HIGH] + - [ ] OCR search [LOW] + - [ ] Sortable results [HIGH] + - [ ] Sort by relevance [HIGH] + - [ ] Sort by date created [HIGH] + - [ ] Sort by date modified [HIGH] + - [ ] Sort by date taken (photos) [MEDIUM] + - [ ] Sort by file size [HIGH] + - [ ] Sort by file dimension (images/video) [LOW] +- [ ] Automatic Entry Relinking [HIGH] + - [ ] Detect Renames [HIGH] + - [ ] Detect Moves [HIGH] + - [ ] Detect Deletions [HIGH] +- [ ] Image Collages [LOW] + - [ ] UI [HIGH] +- [ ] Tagging Panel [HIGH] + - [ ] Top Tags [HIGH] + - [ ] Recent Tags [HIGH] + - [ ] Tag Search [HIGH] + - [ ] Pinned Tags [HIGH] +- [ ] Configurable Thumbnails [MEDIUM] + - [ ] Toggle File Extension Label [MEDIUM] + - [ ] Toggle Duration Label [MEDIUM] + - [ ] Custom Tag Badges [LOW] +- [ ] Thumbnails [HIGH] + - [ ] File Duration Label [HIGH] + - [ ] 3D Model Previews [LOW] +- [ ] File Preview Panel [HIGH] + - [ ] Video Playback [HIGH] + - [x] Play/Pause [HIGH] + - [x] Loop [HIGH] + - [x] Toggle Autoplay [MEDIUM] + - [ ] Volume Control [HIGH] + - [x] Toggle Mute [HIGH] + - [ ] Timeline scrubber [HIGH] + - [ ] Fullscreen [MEDIUM] + - [ ] Audio Playback [HIGH] + - [ ] Play/Pause [HIGH] + - [ ] Loop [HIGH] + - [ ] Toggle Autoplay [MEDIUM] + - [ ] Volume Control [HIGH] + - [ ] Toggle Mute [HIGH] + - [x] Timeline scrubber [HIGH] + - [ ] Fullscreen [MEDIUM] +- [ ] Optimizations [HIGH] + - [ ] Thumbnail caching [HIGH] + - [ ] File property indexes [HIGH] + +## Version Milestones + +These version milestones are rough estimations for when the previous core features will be added. For a more definitive idea for when features are coming, please reference the current GitHub [milestones](https://github.com/TagStudioDev/TagStudio/milestones). + +### 9.5 + +- [ ] SQL backend [HIGH] +- [ ] Multiple Root Directories per Library [HIGH] +- [ ] Tags [HIGH] + - [ ] Deleting Tags [HIGH] + - [ ] Merging Tags [HIGH] + - [ ] User-defined tag colors [HIGH] + - [ ] ID based, not string or hex [HIGH] + - [ ] Color name [HIGH] + - [ ] Color value (hex) [HIGH] + - [ ] Existing colors are now a set of base colors [HIGH] + - [ ] Editable [MEDIUM] + - [ ] Non-removable [HIGH] +- [ ] Search engine [HIGH] + - [ ] Boolean operators [HIGH] + - [ ] Tag objects + autocomplete [HIGH] + - [ ] Filename search [HIGH] + - [ ] Filetype search [HIGH] + - [ ] Field content search [HIGH] + - [ ] Sortable results [HIGH] + - [ ] Sort by relevance [HIGH] + - [ ] Sort by date created [HIGH] + - [ ] Sort by date modified [HIGH] + - [ ] Sort by date taken (photos) [MEDIUM] + - [ ] Sort by file size [HIGH] + - [ ] Sort by file dimension (images/video) [LOW] +- [ ] Settings Menu [HIGH] + - [ ] Application Settings [HIGH] + - [ ] Stored in system user folder/designated folder [HIGH] + - [ ] Library Settings [HIGH] + - [ ] Stored in `.TagStudio` folder [HIGH] +- [ ] Optimizations [HIGH] + - [ ] Thumbnail caching [HIGH] + +### 9.6 + +- [ ] Tags [HIGH] + - [ ] Composition/HAS subtags [HIGH] + - [ ] Tag Icons [HIGH] + - [ ] Small Icons [HIGH] + - [ ] Large Icons for Profiles [MEDIUM] + - [ ] Built-in Icon Packs (i.e. Boxicons) [HIGH] + - [ ] User Defined Icons [HIGH] + - [ ] Multiple Languages for Tag Strings [MEDIUM] + - [ ] [Tag Categories](../library/tag_categories.md) [HIGH] + - [ ] Property available for tags that allow the tag and any inheriting from it to be displayed separately in the preview panel under a title [HIGH] + - [ ] Title is tag name [HIGH] + - [ ] Title has tag color [MEDIUM] + - [ ] Tag marked as category does not display as a tag itself [HIGH] + - [ ] [Tag Overrides](../library/tag_overrides.md) [MEDIUM] + - [ ] Per-file overrides of subtags [HIGH] +- [ ] Fields [HIGH] + - [ ] Dates [HIGH] + - [ ] Custom field names [HIGH] + +### 9.7 + +- [ ] Configurable Thumbnails [MEDIUM] + - [ ] Toggle File Extension Label [MEDIUM] + - [ ] Toggle Duration Label [MEDIUM] + - [ ] Custom Tag Badges [LOW] +- [ ] Thumbnails [HIGH] + - [ ] File Duration Label [HIGH] +- [ ] [Entry groups](../library/entry_groups.md) [HIGH] + - [ ] Groups for files/entries where the same entry can be in multiple groups [HIGH] + - [ ] Ability to number entries within group [HIGH] + - [ ] Ability to set sorting method for group [HIGH] + - [ ] Ability to set custom thumbnail for group [HIGH] + - [ ] Group is treated as entry with tags and metadata [HIGH] + - [ ] Nested groups [MEDIUM] +- [ ] Tagging Panel [HIGH] + - [ ] Top Tags [HIGH] + - [ ] Recent Tags [HIGH] + - [ ] Tag Search [HIGH] + - [ ] Pinned Tags [HIGH] + +### 9.8 (Possible Beta) + +- [ ] Automatic Entry Relinking [HIGH] + - [ ] Detect Renames [HIGH] + - [ ] Detect Moves [HIGH] + - [ ] Detect Deletions [HIGH] +- [ ] [Macros](../utilities/macro.md) [HIGH] + - [ ] Sharable Macros [MEDIUM] + - [ ] Standard notation format (i.e. JSON) contacting macro instructions [HIGH] + - [ ] Exportable [HIGH] + - [ ] Importable [HIGH] + - [ ] Triggers [HIGH] + - [ ] On new file [HIGH] + - [ ] On library refresh [HIGH] + - [...] + - [ ] Actions [HIGH] + - [ ] Add tag(s) [HIGH] + - [ ] Add field(s) [HIGH] + - [ ] Set field content [HIGH] + - [ ] [...] + +### 9.9 + +- [ ] Tag Packs [MEDIUM] + - [ ] Human-readable (i.e. JSON) files containing tag data [HIGH] + - [ ] Importable [HIGH] + - [ ] Exportable [HIGH] + - [ ] Conflict resolution [HIGH] + - [ ] Color Packs [MEDIUM] + - [ ] Human-readable (i.e. JSON) files containing tag data [HIGH] + - [ ] Importable [HIGH] + - [ ] Exportable [HIGH] +- [ ] Exportable Library Data [HIGH] + - [ ] Standard notation format (i.e. JSON) contacting all library data [HIGH] + +### 10.0 + +- [ ] All remaining [HIGH] and optional [MEDIUM] features + +### Post 10.0 + +- [ ] Core Library/API +- [ ] Plugin Support From 237638024507d31d98a054fa46c2e62ab73dff12 Mon Sep 17 00:00:00 2001 From: Travis Abendshien Date: Mon, 28 Oct 2024 13:02:05 -0700 Subject: [PATCH 19/82] docs: remove `planned_features.md` --- docs/updates/planned_features.md | 59 -------------------------------- 1 file changed, 59 deletions(-) delete mode 100644 docs/updates/planned_features.md diff --git a/docs/updates/planned_features.md b/docs/updates/planned_features.md deleted file mode 100644 index cf6da56d..00000000 --- a/docs/updates/planned_features.md +++ /dev/null @@ -1,59 +0,0 @@ -# Planned Features - -The following lists outline the planned major and minor features for TagStudio, in no particular order. - -# Major Features - -- [ ] [SQL Database Migration](../updates/db_migration.md) -- [ ] Multiple Directory Support -- [ ] [Tags Categories](../library/tag_categories.md) -- [ ] [Entry Groups](../library/entry_groups.md) -- [ ] [Tag Overrides](../library/tag_overrides.md) -- [ ] Tagging Panel - - [ ] Top Tags - - [ ] Recent Tags - - [ ] Tag Search - - [ ] Pinned Tags -- [ ] Configurable Default Fields (May be part of [Macros](../utilities/macro.md)) -- [ ] Deep File Extension Control -- [ ] Settings Menu -- [ ] Custom User Colors -- [ ] Search Engine Rework - - [ ] Boolean Search - - [ ] Tag Objects In Search - - [ ] Search For Fields - - [ ] Sortable Search Results -- [ ] Automatic Entry Relinking - - [ ] Detect Renames - - [ ] Detect Moves -- [ ] Thumbnail Caching -- [ ] User-Defined Fields -- [ ] Exportable Library/Tag Data - - [ ] Exportable Human-Readable Library - - [ ] Exportable/Importable Human-Readable “Tag Packs” - - [ ] Exportable/Importable Color Palettes -- [ ] Configurable Thumbnail Labels - - [ ] Toggle Extension Label - - [ ] Toggle File Size Label -- [ ] Configurable Thumbnail Tag Badges - - [ ] Customize tags that appear instead of just “Archive” and “Favorite” -- [ ] OCR Search - -## Minor Features - -- [ ] Deleting Tags -- [ ] Merging Tags -- [ ] Tag Icons -- [ ] Tag/Field Copy + Paste -- [ ] Collage UI -- [ ] Resizable Thumbnail Grid -- [ ] Draggable Files Outside The Program -- [ ] File Property Caching -- [ ] 3D Previews -- [ ] Audio Waveform Previews - - [ ] Toggle Between Waveform And Album Artwork -- [ ] PDF Previews -- [ ] SVG Previews -- [ ] Full Video Player -- [ ] Duration Properties For Video + Audio Files -- [ ] Optional Starter Tag Packs From 6e5a1a0e52fd40e0defdc95dbab501885bcb0550 Mon Sep 17 00:00:00 2001 From: Travis Abendshien Date: Mon, 28 Oct 2024 14:38:34 -0700 Subject: [PATCH 20/82] docs: add issues numbers to roadmap --- docs/index.md | 10 ++++---- docs/updates/roadmap.md | 56 +++++++++++++++++++++-------------------- 2 files changed, 34 insertions(+), 32 deletions(-) diff --git a/docs/index.md b/docs/index.md index eb22662a..16cefdec 100644 --- a/docs/index.md +++ b/docs/index.md @@ -5,7 +5,7 @@ title: Home # Welcome to the TagStudio Documentation! !!! warning -This documentation is still a work in progress, and is intended to aide with deconstructing and understanding of the core mechanics of TagStudio and how it operates. + This documentation is still a work in progress, and is intended to aide with deconstructing and understanding of the core mechanics of TagStudio and how it operates. ![TagStudio Alpha](assets/github_header.png) @@ -31,6 +31,10 @@ TagStudio is a photo & file organization application with an underlying system t 3. **The application.** If nothing else, TagStudio the application serves as the first (and so far only) implementation for this system of metadata management. This has the responsibility of doing the idea justice and showing just what’s possible when it comes to user file management. 4. (The name.) I think it’s fine for an app or client, but it doesn’t really make sense for a system or standard. I suppose this will evolve with time. +## Feature Roadmap + +The [feature roadmap](updates/roadmap.md) lists all of the planned core features for TagStudio to be considered "feature complete" along with estimated release milestones. The development and testing of these features takes priority over all other requested or submitted features unless they are later added to this roadmap. This helps ensure that TagStudio eventually sees a full release and becomes more usable by more people more quickly. + ## Current Features - Create libraries/vaults centered around a system directory. Libraries contain a series of entries: the representations of your files combined with metadata fields. Each entry represents a file in your library’s directory, and is linked to its location. @@ -42,10 +46,6 @@ TagStudio is a photo & file organization application with an underlying system t - Search for entries based on tags, ~~metadata~~ (TBA), or filenames/filetypes (using `filename: `) - Special search conditions for entries that are: `untagged`/`no tags` and `empty`/`no fields`. -## Feature Roadmap - -The [feature roadmap](updates/roadmap.md) lists all of the planned core features for TagStudio to be considered "feature complete" along with estimated release milestones. The development and testing of these features takes priority over all other requested or submitted features unless they are later added to this roadmap. This helps ensure that TagStudio eventually sees a full release and becomes more usable by more people more quickly. - ## Important Updates ### [Database Migration](updates/db_migration.md) diff --git a/docs/updates/roadmap.md b/docs/updates/roadmap.md index 7b2fb6e9..680f6a64 100644 --- a/docs/updates/roadmap.md +++ b/docs/updates/roadmap.md @@ -1,4 +1,4 @@ -# TagStudio Roadmap +# Roadmap This checklist details the current and remaining features required at a minimum for TagStudio to be considered “Feature Complete”. This list is _not_ a definitive list for additional feature requests and PRs as they come in, but rather an outline of my personal core feature set intended for TagStudio. @@ -6,9 +6,9 @@ This checklist details the current and remaining features required at a minimum Features are broken up into the following priority levels, with nested priorities referencing their relative priority for the overall feature (i.e. A [LOW] priority feature can have a [HIGH] priority element but it otherwise still a [LOW] priority item overall): -- HIGH - Core feature -- MEDIUM - Important but not necessary -- LOW - Just nice to have +- [HIGH] - Core feature +- [MEDIUM] - Important but not necessary +- [LOW] - Just nice to have ## Core Feature List @@ -19,15 +19,15 @@ Features are broken up into the following priority levels, with nested prioritie - [x] Tag shorthand (specific short alias for displaying) [HIGH] - [x] Parent/Inheritance subtags [HIGH] - [ ] Composition/HAS subtags [HIGH] - - [ ] Deleting Tags [HIGH] - - [ ] Merging Tags [HIGH] - - [ ] Tag Icons [HIGH] + - [ ] Deleting Tags [HIGH] [#148](https://github.com/TagStudioDev/TagStudio/issues/148) + - [ ] Merging Tags [HIGH] [#12](https://github.com/TagStudioDev/TagStudio/issues/12) + - [ ] Tag Icons [HIGH] [#195](https://github.com/TagStudioDev/TagStudio/issues/195) - [ ] Small Icons [HIGH] - [ ] Large Icons for Profiles [MEDIUM] - [ ] Built-in Icon Packs (i.e. Boxicons) [HIGH] - [ ] User Defined Icons [HIGH] - [ ] Multiple Languages for Tag Strings [MEDIUM] - - [ ] User-defined tag colors [HIGH] + - [ ] User-defined tag colors [HIGH] [#264](https://github.com/TagStudioDev/TagStudio/issues/264) - [ ] ID based, not string or hex [HIGH] - [ ] Color name [HIGH] - [ ] Color value (hex) [HIGH] @@ -41,7 +41,7 @@ Features are broken up into the following priority levels, with nested prioritie - [ ] Tag marked as category does not display as a tag itself [HIGH] - [ ] [Tag Overrides](../library/tag_overrides.md) [MEDIUM] - [ ] Per-file overrides of subtags [HIGH] -- [ ] Tag Packs [MEDIUM] +- [ ] Tag Packs [MEDIUM] [#3](https://github.com/TagStudioDev/TagStudio/issues/3) - [ ] Human-readable (i.e. JSON) files containing tag data [HIGH] - [ ] Importable [HIGH] - [ ] Exportable [HIGH] @@ -50,7 +50,7 @@ Features are broken up into the following priority levels, with nested prioritie - [ ] Human-readable (i.e. JSON) files containing tag data [HIGH] - [ ] Importable [HIGH] - [ ] Exportable [HIGH] -- [ ] Exportable Library Data [HIGH] +- [ ] Exportable Library Data [HIGH] [#47](https://github.com/TagStudioDev/TagStudio/issues/47) - [ ] Standard notation format (i.e. JSON) contacting all library data [HIGH] - [ ] [Macros](../utilities/macro.md) [HIGH] - [ ] Sharable Macros [MEDIUM] @@ -71,7 +71,7 @@ Features are broken up into the following priority levels, with nested prioritie - [ ] Stored in system user folder/designated folder [HIGH] - [ ] Library Settings [HIGH] - [ ] Stored in `.TagStudio` folder [HIGH] -- [ ] Multiple Root Directories per Library [HIGH] +- [ ] Multiple Root Directories per Library [HIGH] [#295](https://github.com/TagStudioDev/TagStudio/issues/295) - [ ] [Entry groups](../library/entry_groups.md) [HIGH] - [ ] Groups for files/entries where the same entry can be in multiple groups [HIGH] - [ ] Ability to number entries within group [HIGH] @@ -82,29 +82,30 @@ Features are broken up into the following priority levels, with nested prioritie - [ ] Fields [HIGH] - [x] Text Boxes [HIGH] - [x] Text Lines [HIGH] - - [ ] Dates [HIGH] + - [ ] Dates [HIGH] [#213](https://github.com/TagStudioDev/TagStudio/issues/213) - [ ] GPS Location [LOW] - - [ ] Custom field names [HIGH] -- [ ] Search engine [HIGH] - - [ ] Boolean operators [HIGH] - - [ ] Tag objects + autocomplete [HIGH] + - [ ] Custom field names [HIGH] [#18](https://github.com/TagStudioDev/TagStudio/issues/18) +- [ ] Search engine [HIGH] [#325](https://github.com/TagStudioDev/TagStudio/issues/325) + - [ ] Boolean operators [HIGH] [#225](https://github.com/TagStudioDev/TagStudio/issues/225), [#314](https://github.com/TagStudioDev/TagStudio/issues/314) + - [ ] Tag objects + autocomplete [HIGH] [#476 (Autocomplete)](https://github.com/TagStudioDev/TagStudio/issues/476) - [ ] Filename search [HIGH] - [ ] Filetype search [HIGH] - - [ ] Field content search [HIGH] + - [ ] Field content search [HIGH] [#272](https://github.com/TagStudioDev/TagStudio/issues/272) - [ ] HAS operator for composition tags [HIGH] - [ ] OCR search [LOW] - - [ ] Sortable results [HIGH] + - [ ] Fuzzy Search [LOW] [#400](https://github.com/TagStudioDev/TagStudio/issues/400) + - [ ] Sortable results [HIGH] [#68](https://github.com/TagStudioDev/TagStudio/issues/68) - [ ] Sort by relevance [HIGH] - [ ] Sort by date created [HIGH] - [ ] Sort by date modified [HIGH] - [ ] Sort by date taken (photos) [MEDIUM] - [ ] Sort by file size [HIGH] - [ ] Sort by file dimension (images/video) [LOW] -- [ ] Automatic Entry Relinking [HIGH] +- [ ] Automatic Entry Relinking [HIGH] [#36](https://github.com/TagStudioDev/TagStudio/issues/36) - [ ] Detect Renames [HIGH] - [ ] Detect Moves [HIGH] - [ ] Detect Deletions [HIGH] -- [ ] Image Collages [LOW] +- [ ] Image Collages [LOW] [#91](https://github.com/TagStudioDev/TagStudio/issues/91) - [ ] UI [HIGH] - [ ] Tagging Panel [HIGH] - [ ] Top Tags [HIGH] @@ -118,6 +119,7 @@ Features are broken up into the following priority levels, with nested prioritie - [ ] Thumbnails [HIGH] - [ ] File Duration Label [HIGH] - [ ] 3D Model Previews [LOW] + - [ ] STL Previews [HIGH] [#351](https://github.com/TagStudioDev/TagStudio/issues/351) - [ ] File Preview Panel [HIGH] - [ ] Video Playback [HIGH] - [x] Play/Pause [HIGH] @@ -127,7 +129,7 @@ Features are broken up into the following priority levels, with nested prioritie - [x] Toggle Mute [HIGH] - [ ] Timeline scrubber [HIGH] - [ ] Fullscreen [MEDIUM] - - [ ] Audio Playback [HIGH] + - [ ] Audio Playback [HIGH] [#450](https://github.com/TagStudioDev/TagStudio/issues/450) - [ ] Play/Pause [HIGH] - [ ] Loop [HIGH] - [ ] Toggle Autoplay [MEDIUM] @@ -136,14 +138,14 @@ Features are broken up into the following priority levels, with nested prioritie - [x] Timeline scrubber [HIGH] - [ ] Fullscreen [MEDIUM] - [ ] Optimizations [HIGH] - - [ ] Thumbnail caching [HIGH] + - [ ] Thumbnail caching [HIGH] [#104](https://github.com/TagStudioDev/TagStudio/issues/104) - [ ] File property indexes [HIGH] ## Version Milestones These version milestones are rough estimations for when the previous core features will be added. For a more definitive idea for when features are coming, please reference the current GitHub [milestones](https://github.com/TagStudioDev/TagStudio/milestones). -### 9.5 +### 9.5 (Alpha) - [ ] SQL backend [HIGH] - [ ] Multiple Root Directories per Library [HIGH] @@ -178,7 +180,7 @@ These version milestones are rough estimations for when the previous core featur - [ ] Optimizations [HIGH] - [ ] Thumbnail caching [HIGH] -### 9.6 +### 9.6 (Alpha) - [ ] Tags [HIGH] - [ ] Composition/HAS subtags [HIGH] @@ -199,7 +201,7 @@ These version milestones are rough estimations for when the previous core featur - [ ] Dates [HIGH] - [ ] Custom field names [HIGH] -### 9.7 +### 9.7 (Alpha) - [ ] Configurable Thumbnails [MEDIUM] - [ ] Toggle File Extension Label [MEDIUM] @@ -241,7 +243,7 @@ These version milestones are rough estimations for when the previous core featur - [ ] Set field content [HIGH] - [ ] [...] -### 9.9 +### 9.9 (Possible Beta) - [ ] Tag Packs [MEDIUM] - [ ] Human-readable (i.e. JSON) files containing tag data [HIGH] @@ -255,7 +257,7 @@ These version milestones are rough estimations for when the previous core featur - [ ] Exportable Library Data [HIGH] - [ ] Standard notation format (i.e. JSON) contacting all library data [HIGH] -### 10.0 +### 10.0 (Possible Beta/Full Release) - [ ] All remaining [HIGH] and optional [MEDIUM] features From e02eb39ae2d2dce6e4c7e4cbe602639341646554 Mon Sep 17 00:00:00 2001 From: Hissymaster <144076671+Hissymaster@users.noreply.github.com> Date: Tue, 29 Oct 2024 14:46:27 +1100 Subject: [PATCH 21/82] docs: change reference to `planned_features.md` to `roadmap.md` (#564) Co-authored-by: Hissymaster --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index eafecdb9..3d26790b 100644 --- a/README.md +++ b/README.md @@ -190,7 +190,7 @@ As of writing (Alpha v9.3.0) the project is in a useable state, however it lacks ### What Features Are You Planning on Adding? > [!IMPORTANT] -> See the [Planned Features](/docs/updates/planned_features.md) documentation for the latest feature lists. The lists here are currently being migrated over there with individual pages for larger features. +> See the [Roadmap](/docs/updates/roadmap.md) documentation for the latest feature lists. The lists here are currently being migrated over there with individual pages for larger features. Of the several features I have planned for the project, these are broken up into “priority” features and “future” features. Priority features were originally intended for the first public release, however are currently absent from the Alpha v9.x.x builds. From 0358f51f9998570887167dbf10f791e3a772cc1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= <88423841+Roc25@users.noreply.github.com> Date: Mon, 4 Nov 2024 23:28:44 +0300 Subject: [PATCH 22/82] feat: add `IMAGE_RASTER_TYPES` (Fix #550) (#551) * fix resolution info * Fix for Raw and Vector Image types * Small refactor * Create IMAGE_RASTER_TYPES and remove is_image_ext_raster * Change if statment only for raster * Rename _IMAGE_SET to _IMAGE_RASTER_SET --------- Co-authored-by: gred --- tagstudio/src/core/media_types.py | 9 +++++++-- tagstudio/src/qt/widgets/preview_panel.py | 10 ++-------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/tagstudio/src/core/media_types.py b/tagstudio/src/core/media_types.py index 04ea5e87..a1eda5e0 100644 --- a/tagstudio/src/core/media_types.py +++ b/tagstudio/src/core/media_types.py @@ -207,7 +207,7 @@ class MediaCategories: ".rw2", } _IMAGE_VECTOR_SET: set[str] = {".svg"} - _IMAGE_SET: set[str] = { + _IMAGE_RASTER_SET: set[str] = { ".apng", ".avif", ".bmp", @@ -392,9 +392,14 @@ class MediaCategories: extensions=_IMAGE_VECTOR_SET, is_iana=False, ) + IMAGE_RASTER_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.IMAGE, + extensions=_IMAGE_RASTER_SET, + is_iana=False, + ) IMAGE_TYPES: MediaCategory = MediaCategory( media_type=MediaType.IMAGE, - extensions=_IMAGE_SET | _IMAGE_RAW_SET | _IMAGE_VECTOR_SET, + extensions=_IMAGE_RASTER_SET | _IMAGE_RAW_SET | _IMAGE_VECTOR_SET, is_iana=True, ) INSTALLER_TYPES: MediaCategory = MediaCategory( diff --git a/tagstudio/src/qt/widgets/preview_panel.py b/tagstudio/src/qt/widgets/preview_panel.py index b38fc6c1..7d055a3a 100644 --- a/tagstudio/src/qt/widgets/preview_panel.py +++ b/tagstudio/src/qt/widgets/preview_panel.py @@ -625,13 +625,7 @@ class PreviewPanel(QWidget): self.preview_gif.show() image = None - if ( - MediaCategories.is_ext_in_category(ext, MediaCategories.IMAGE_TYPES) - and MediaCategories.is_ext_in_category(ext, MediaCategories.IMAGE_RAW_TYPES) - and MediaCategories.is_ext_in_category( - ext, MediaCategories.IMAGE_VECTOR_TYPES - ) - ): + if MediaCategories.is_ext_in_category(ext, MediaCategories.IMAGE_RASTER_TYPES): image = Image.open(str(filepath)) elif MediaCategories.is_ext_in_category(ext, MediaCategories.IMAGE_RAW_TYPES): try: @@ -668,7 +662,7 @@ class PreviewPanel(QWidget): # Stats for specific file types are displayed here. if image and ( MediaCategories.is_ext_in_category( - ext, MediaCategories.IMAGE_TYPES, mime_fallback=True + ext, MediaCategories.IMAGE_RASTER_TYPES, mime_fallback=True ) or MediaCategories.is_ext_in_category( ext, MediaCategories.VIDEO_TYPES, mime_fallback=True From 73daa39bf19b4588b1043e89a68b3cac51bee043 Mon Sep 17 00:00:00 2001 From: Travis Abendshien Date: Tue, 5 Nov 2024 10:20:28 -0800 Subject: [PATCH 23/82] docs(roadmap): clarify filetype search --- docs/updates/roadmap.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/updates/roadmap.md b/docs/updates/roadmap.md index 680f6a64..cc1f6b9a 100644 --- a/docs/updates/roadmap.md +++ b/docs/updates/roadmap.md @@ -90,6 +90,9 @@ Features are broken up into the following priority levels, with nested prioritie - [ ] Tag objects + autocomplete [HIGH] [#476 (Autocomplete)](https://github.com/TagStudioDev/TagStudio/issues/476) - [ ] Filename search [HIGH] - [ ] Filetype search [HIGH] + - [ ] Search by extension (e.g. ".jpg", ".png") [HIGH] + - [ ] Optional consolidation of extension synonyms (i.e. ".jpg" can equal ".jpeg") [LOW] + - [ ] Search by media type (e.g. "image", "video", "document") [MEDIUM] - [ ] Field content search [HIGH] [#272](https://github.com/TagStudioDev/TagStudio/issues/272) - [ ] HAS operator for composition tags [HIGH] - [ ] OCR search [LOW] From 10abd18def84395df0ddd1378fa82112cc669585 Mon Sep 17 00:00:00 2001 From: Travis Abendshien Date: Tue, 5 Nov 2024 10:24:44 -0800 Subject: [PATCH 24/82] docs(roadmap): add thumbnail overrides --- docs/updates/roadmap.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/updates/roadmap.md b/docs/updates/roadmap.md index cc1f6b9a..66890e80 100644 --- a/docs/updates/roadmap.md +++ b/docs/updates/roadmap.md @@ -116,6 +116,7 @@ Features are broken up into the following priority levels, with nested prioritie - [ ] Tag Search [HIGH] - [ ] Pinned Tags [HIGH] - [ ] Configurable Thumbnails [MEDIUM] + - [ ] Custom thumbnail override [HIGH] - [ ] Toggle File Extension Label [MEDIUM] - [ ] Toggle Duration Label [MEDIUM] - [ ] Custom Tag Badges [LOW] From 15bf354c88d5251f97a3c7f3051f84afcde04f53 Mon Sep 17 00:00:00 2001 From: Travis Abendshien Date: Tue, 5 Nov 2024 10:25:27 -0800 Subject: [PATCH 25/82] docs(roadmap): add drag and drop --- docs/updates/roadmap.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/updates/roadmap.md b/docs/updates/roadmap.md index 66890e80..c2829a19 100644 --- a/docs/updates/roadmap.md +++ b/docs/updates/roadmap.md @@ -124,6 +124,11 @@ Features are broken up into the following priority levels, with nested prioritie - [ ] File Duration Label [HIGH] - [ ] 3D Model Previews [LOW] - [ ] STL Previews [HIGH] [#351](https://github.com/TagStudioDev/TagStudio/issues/351) +- [x] Drag and Drop [HIGH] + - [x] Drag files _to_ other programs [HIGH] + - [x] Drag files _to_ file explorer windows [MEDIUM] + - [x] Drag files _from_ file explorer windows [MEDIUM] + - [x] Drag files _from_ other programs [LOW] - [ ] File Preview Panel [HIGH] - [ ] Video Playback [HIGH] - [x] Play/Pause [HIGH] From 5ee118c1fbc16fe85eba7e86e02a08dfaaad0867 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Thu, 7 Nov 2024 21:01:43 +0100 Subject: [PATCH 26/82] translations: update from Hosted Weblate (#579) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added translation using Weblate (Russian) * Translated using Weblate (Russian) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/ru/ * Added translation using Weblate (Portuguese) * Added translation using Weblate (Portuguese (Brazil)) * Translated using Weblate (Portuguese (Brazil)) Currently translated at 46.4% (66 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 46.4% (66 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/pt_BR/ * Added translation using Weblate (Tamil) * Translated using Weblate (Portuguese (Brazil)) Currently translated at 74.6% (106 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 74.6% (106 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/pt_BR/ * Translated using Weblate (Tamil) Currently translated at 51.4% (73 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/ta/ * Added translation using Weblate (Spanish) * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/pt_BR/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/pt_BR/ * Translated using Weblate (Tamil) Currently translated at 88.0% (125 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/ta/ * Translated using Weblate (Spanish) Currently translated at 11.2% (16 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 11.2% (16 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 19.7% (28 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 19.7% (28 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Russian) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/ru/ * Translated using Weblate (Spanish) Currently translated at 29.5% (42 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 29.5% (42 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 49.2% (70 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 49.2% (70 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 52.1% (74 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Added translation using Weblate (Norwegian Bokmål) * Translated using Weblate (Tamil) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/ta/ * Translated using Weblate (Norwegian Bokmål) Currently translated at 55.6% (79 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/nb_NO/ * Added translation using Weblate (French) * Translated using Weblate (Russian) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/ru/ * Translated using Weblate (Spanish) Currently translated at 56.3% (80 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 56.3% (80 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Norwegian Bokmål) Currently translated at 68.3% (97 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/nb_NO/ * Translated using Weblate (French) Currently translated at 40.1% (57 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/fr/ * Translated using Weblate (Spanish) Currently translated at 65.4% (93 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 65.4% (93 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 74.6% (106 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 83.8% (119 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 83.8% (119 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 83.8% (119 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 83.8% (119 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 93.6% (133 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 93.6% (133 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (English) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/en/ * Translated using Weblate (Spanish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Added translation using Weblate (Danish) * Added translation using Weblate (German) * Translated using Weblate (Danish) Currently translated at 1.4% (2 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/da/ * Added translation using Weblate (Cantonese (Traditional Han script)) * Translated using Weblate (Tamil) Currently translated at 99.2% (141 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/ta/ * Translated using Weblate (German) Currently translated at 2.8% (4 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/de/ * Added translation using Weblate (Hungarian) * Translated using Weblate (German) Currently translated at 14.0% (20 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/de/ * Translated using Weblate (Hungarian) Currently translated at 99.2% (141 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/hu/ * Translated using Weblate (German) Currently translated at 14.7% (21 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/de/ * Added translation using Weblate (Swedish) * Translated using Weblate (German) Currently translated at 71.8% (102 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/de/ * Translated using Weblate (Swedish) Currently translated at 78.8% (112 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/sv/ * Added translation using Weblate (Toki Pona) * Translated using Weblate (Tamil) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/ta/ * Translated using Weblate (Danish) Currently translated at 2.8% (4 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/da/ * Translated using Weblate (Toki Pona) Currently translated at 83.0% (118 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/tok/ * Added translation using Weblate (Italian) * Translated using Weblate (French) Currently translated at 64.0% (91 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/fr/ * Translated using Weblate (German) Currently translated at 76.0% (108 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/de/ * Translated using Weblate (Hungarian) Currently translated at 99.2% (141 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/hu/ * Translated using Weblate (Toki Pona) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/tok/ * Translated using Weblate (Italian) Currently translated at 11.2% (16 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/it/ * Added translation using Weblate (Turkish) * Translated using Weblate (Turkish) Currently translated at 88.7% (126 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/tr/ * Translated using Weblate (Turkish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/tr/ * Translated using Weblate (English) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/en/ * Translated using Weblate (French) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/fr/ * Translated using Weblate (English) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/en/ * Translated using Weblate (French) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/fr/ * Translated using Weblate (Russian) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/ru/ * Translated using Weblate (Portuguese) Currently translated at 0.0% (0 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/pt/ * Translated using Weblate (Portuguese) Currently translated at 0.0% (0 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/pt/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/pt_BR/ * Translated using Weblate (Tamil) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/ta/ * Translated using Weblate (Spanish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/es/ * Translated using Weblate (Norwegian Bokmål) Currently translated at 67.6% (96 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/nb_NO/ * Translated using Weblate (Norwegian Bokmål) Currently translated at 67.6% (96 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/nb_NO/ * Translated using Weblate (French) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/fr/ * Translated using Weblate (Danish) Currently translated at 2.8% (4 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/da/ * Translated using Weblate (Danish) Currently translated at 2.8% (4 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/da/ * Translated using Weblate (German) Currently translated at 76.0% (108 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/de/ * Translated using Weblate (German) Currently translated at 76.0% (108 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/de/ * Translated using Weblate (German) Currently translated at 76.0% (108 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/de/ * Translated using Weblate (Cantonese (Traditional Han script)) Currently translated at 0.0% (0 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/yue_Hant/ * Translated using Weblate (Cantonese (Traditional Han script)) Currently translated at 0.0% (0 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/yue_Hant/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/hu/ * Translated using Weblate (Swedish) Currently translated at 78.8% (112 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/sv/ * Translated using Weblate (Swedish) Currently translated at 78.8% (112 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/sv/ * Translated using Weblate (Swedish) Currently translated at 78.8% (112 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/sv/ * Translated using Weblate (Toki Pona) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/tok/ * Translated using Weblate (Italian) Currently translated at 11.2% (16 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/it/ * Translated using Weblate (Italian) Currently translated at 11.2% (16 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/it/ * Translated using Weblate (Italian) Currently translated at 11.2% (16 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/it/ * Translated using Weblate (Turkish) Currently translated at 100.0% (142 of 142 strings) Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/tr/ * Update translation files Updated by "Remove blank strings" add-on in Weblate. Translation: TagStudio/Strings Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/ --------- Co-authored-by: Artyom Ognev Co-authored-by: Space_Fox Co-authored-by: Lobo Metalúrgico Co-authored-by: Vasi Co-authored-by: Nginearing Co-authored-by: gallegonovato Co-authored-by: Allan Nordhøy Co-authored-by: Bamowen Co-authored-by: Ryussei Co-authored-by: Szíjártó Levente Pál Co-authored-by: Zoinx Co-authored-by: gold Co-authored-by: William de Castro Co-authored-by: Jann Stute Co-authored-by: Nyghl Co-authored-by: Obscaeris --- tagstudio/resources/translations/da.json | 6 + tagstudio/resources/translations/de.json | 125 ++++++++ tagstudio/resources/translations/en.json | 286 +++++++++--------- tagstudio/resources/translations/es.json | 144 +++++++++ tagstudio/resources/translations/fr.json | 144 +++++++++ tagstudio/resources/translations/hu.json | 144 +++++++++ tagstudio/resources/translations/it.json | 19 ++ tagstudio/resources/translations/nb_NO.json | 102 +++++++ tagstudio/resources/translations/pt.json | 1 + tagstudio/resources/translations/pt_BR.json | 144 +++++++++ tagstudio/resources/translations/ru.json | 144 +++++++++ tagstudio/resources/translations/sv.json | 114 +++++++ tagstudio/resources/translations/ta.json | 144 +++++++++ tagstudio/resources/translations/tok.json | 144 +++++++++ tagstudio/resources/translations/tr.json | 144 +++++++++ .../resources/translations/yue_Hant.json | 1 + 16 files changed, 1663 insertions(+), 143 deletions(-) create mode 100644 tagstudio/resources/translations/da.json create mode 100644 tagstudio/resources/translations/de.json create mode 100644 tagstudio/resources/translations/es.json create mode 100644 tagstudio/resources/translations/fr.json create mode 100644 tagstudio/resources/translations/hu.json create mode 100644 tagstudio/resources/translations/it.json create mode 100644 tagstudio/resources/translations/nb_NO.json create mode 100644 tagstudio/resources/translations/pt.json create mode 100644 tagstudio/resources/translations/pt_BR.json create mode 100644 tagstudio/resources/translations/ru.json create mode 100644 tagstudio/resources/translations/sv.json create mode 100644 tagstudio/resources/translations/ta.json create mode 100644 tagstudio/resources/translations/tok.json create mode 100644 tagstudio/resources/translations/tr.json create mode 100644 tagstudio/resources/translations/yue_Hant.json diff --git a/tagstudio/resources/translations/da.json b/tagstudio/resources/translations/da.json new file mode 100644 index 00000000..fc59c8d6 --- /dev/null +++ b/tagstudio/resources/translations/da.json @@ -0,0 +1,6 @@ +{ + "home.base_title": "TagStudio Alfa", + "home.include_all_tags": "Og (inkluderer alle tags)", + "home.include_any_tag": "Og (inkluderer envher tag)", + "home.main_window": "Hovedvindue" +} diff --git a/tagstudio/resources/translations/de.json b/tagstudio/resources/translations/de.json new file mode 100644 index 00000000..ed4c48a5 --- /dev/null +++ b/tagstudio/resources/translations/de.json @@ -0,0 +1,125 @@ +{ + "add_field.add": "Feld hinzufügen", + "build_tags.add_parent_tags": "Übergeordnete Tags hinzufügen", + "build_tags.parent_tags": "Übergeordnete Tags", + "delete_unlinked.confirm": "Sind Sie sicher, dass Sie die folgenden %{len(self.lib.missing_files)}-Einträge löschen wollen?", + "delete_unlinked.delete_entries": "Einträge am Löschen", + "delete_unlinked.delete_unlinked": "Unverknüpfte Einträge löschen", + "delete_unlinked.deleting_number_entries": "Löschen von %{x[0]+1}/{len(self.lib.missing_files)} Unverknüpften Einträgen", + "dialog.open_create_library": "Bibliothek öffnen/erstellen", + "dialog.refresh_directories": "Verzeichnisse werden aktualisiert", + "dialog.save_library": "Bibliothek speichern", + "dialog.scan_directories": "Überprüfe Verzeichnisse auf neue Dateien...\nBereite vor...", + "dialog.scan_directories.new_files": "Verzeichnisse nach neuen Dateien durchsuchen...\n%{x + 1} Datei%{„s“ if x + 1 != 1 else „“} Gesucht, %{len(self.lib.files_not_in_library)} Neue Dateien gefunden", + "file_extension.add_extension": "Erweiterung hinzufügen", + "file_opener.command_not_found": "Konnte %{command_name} nicht im System PATH finden", + "file_opener.not_found": "Datei nicht gefunden:", + "file_opener.open_file": "Datei öffnen:}", + "fix_dupes.advice_label": "Nach der Spiegelung können Sie DupeGuru verwenden, um die unerwünschten Dateien zu löschen. Verwenden Sie anschliessend die Funktion „Unverknüpfte Einträge reparieren“ im Menü „Extras“ von TagStudio, um die unverknüpften Einträge zu löschen.", + "fix_dupes.fix_dupes": "Doppelte Dateien korrigieren", + "fix_dupes.load_file": "DupeGuru-Datei laden", + "fix_dupes.mirror_description": "Spiegeln die Eingabedaten für jeden doppelten Abgleichsatz, indem Sie alle Daten kombinieren, ohne Felder zu entfernen oder zu duplizieren. Bei diesem Vorgang werden keine Dateien oder Daten gelöscht.", + "fix_dupes.mirror_entries": "Spiegelnde Einträge", + "fix_dupes.name_filter": "DupeGuru-Dateien (*.dupeguru)", + "fix_dupes.no_file_match": "Übereinstimmungen mit doppelten Dateien: N/A", + "fix_dupes.no_file_selected": "Keine DupeGuru-Datei ausgewählt", + "fix_dupes.number_file_match": "Übereinstimmungen mit doppelten Dateien: %{count}", + "fix_dupes.open_result_files": "DupeGuru Ergebnisdatei öffnen", + "fix_unlinked.delete_unlinked": "Nicht verknüpfte Einträge löschen", + "fix_unlinked.description": "Jeder Bibliothekseintrag ist mit einer Datei in einem Ihrer Verzeichnisse verknüpft. Wenn eine Datei, die mit einem Eintrag verknüpft ist, ausserhalb von TagStudio verschoben oder gelöscht wird, gilt sie als nicht verknüpft. Nicht verknüpfte Einträge können durch Durchsuchen Ihrer Verzeichnisse automatisch neu verknüpft, vom Benutzer manuell neu verknüpft oder auf Wunsch gelöscht werden.", + "fix_unlinked.duplicate_description": "Doppelte Einträge sind definiert als mehrere Einträge, die auf dieselbe Datei auf der Festplatte verweisen. Durch das Zusammenführen dieser Einträge werden die Tags und Metadaten aller Duplikate zu einem einzigen konsolidierten Eintrag zusammengefasst. Diese sind nicht zu verwechseln mit „doppelten Dateien“, die Duplikate Ihrer Dateien selbst außerhalb von TagStudio sind.", + "fix_unlinked.fix_unlinked": "Unverknüpfte Einträge reparieren", + "fix_unlinked.manual_relink": "Manuelle Neuverknüpfung", + "fix_unlinked.merge_dupes": "Doppelte Einträge zusammenführen", + "fix_unlinked.refresh_dupes": "Doppelte Einträge aktualisieren", + "fix_unlinked.scan_library.label": "Bibliothek nach nicht verknüpften Einträgen durchsuchen...", + "fix_unlinked.scan_library.title": "Bibliothek wird scannen", + "fix_unlinked.search_and_relink": "Suche && Neuverbindung", + "generic.add": "hinzufügen", + "generic.aliases": "Aliase", + "generic.apply": "anwenden", + "generic.cancel": "Abbrechen", + "generic.close_all": "Alle schliessen", + "generic.color": "Farbe", + "generic.delete": "Löschen", + "generic.done": "Fertig", + "generic.exclude": "ausschliessen", + "generic.file_extension": "Dateierweiterungen", + "generic.include": "einschliessen", + "generic.mirror": "Spiegel", + "generic.name": "Name", + "generic.open_all": "Alle öffnen", + "generic.open_file": "Datei öffnen", + "generic.open_file_explorer": "Datei im Explorer öffnen", + "generic.refresh_all": "Alle aktualisieren", + "generic.remove_field": "Feld entfernen", + "generic.search_tags": "Tags suchen", + "generic.shorthand": "Kürzel", + "home.base_title": "TagStudio Alpha", + "home.include_all_tags": "Und (enthält alle Tags)", + "home.include_any_tag": "Oder (enthält alle Tags)", + "home.main_window": "Hauptfenster", + "home.search": "Suchen", + "home.search_entries": "Nach Einträgen suchen", + "home.thumbnail_size": "Grösse des Vorschaubildes", + "library.Artist": "Künstler", + "library.anthology": "Anthologie", + "library.archived": "Archivierungsdatum", + "library.author": "Autor", + "library.book": "Buch", + "library.collation": "Zusammenstellung", + "library.comic": "Comicheft", + "library.comments": "Kommentare", + "library.composer": "Komponist", + "library.content_tags": "Inhalt Tags", + "library.date": "Datum", + "library.date_created": "Erstellungsdatum", + "library.date_modified": "Datum geändert", + "library.date_published": "Datum des Publizierten", + "library.date_released": "Veröffentlichungsdatum", + "library.date_taken": "Aufnahmedatum", + "library.date_uploaded": "Hochladedatum", + "library.description": "Beschreibung", + "library.favorite": "Favoriten", + "library.guest_artist": "Gastkünstler", + "library.magazine": "Zeitschrift", + "library.manga": "Manga", + "library.meta_tags": "Meta Tags", + "library.notes": "Notizen", + "library.publisher": "Herausgeber", + "library.series": "Serie", + "library.source": "Quelle", + "library.tags": "Tags", + "library.title": "Titel", + "library.url": "URL", + "library.volume": "Band", + "menu.edit": "Bearbeiten", + "menu.file": "Datei", + "menu.help": "Hilfe", + "menu.macros": "Makros", + "menu.tools": "Werkzeuge", + "menu.window": "Fenster", + "merge.merge_dupe_entries": "Zusammenführen von doppelten Einträgen", + "merge.window_title": "Zusammenführen von doppelten Einträgen", + "open_library.library_creation_return_code": "Bibliothekserstellung Rückgabecode:", + "open_library.no_tagstudio_library_found": "Keine vorhandene TagStudio-Bibliothek unter '%{Pfad}' gefunden. Eine wird erstellt.", + "open_library.title": "Bibliothek", + "preview.dimensions": "Abmessungen", + "preview.recent": "Aktuelle Bibliotheken", + "progression.running_macros.new_entries": "Ausführen von Makros bei neuen Einträgen", + "progression.running_macros.one_new_entry": "Ausführen konfigurierter Makros für 1/%{len(new_ids)} neue Einträge", + "progression.running_macros.several_new_entry": "Ausführen konfigurierter Makros für %{x + 1}/%{len(new_ids)} neue Einträge", + "relink_unlinked.title": "Einträge werden neuverknüpft", + "splash.open_library": "Die Bibliothek wird geöffnet", + "status.backup_success": "Bibliotheks-Backup gespeichert unter:", + "status.enumerate_query": "Abfrage:%{Abfrage}, Rahmen: %{i}, Länge: %{len(f)}", + "status.number_results_found": "%{len(all_items)} Ergebnisse gefunden für „%{query}“ (%{format_timespan(end_time - start_time)})", + "status.results_found": "Ergebnisse", + "status.save_success": "Bibliothek gespeichert und geschlossen!", + "status.search_library_query": "Suche in der Bibliothek nach", + "tag.add": "Hinzufüge Tag", + "tag.library": "Bibliothek Tags", + "tag.new": "Neuer Tag", + "tooltip.open_library": "Ctrl+O", + "tooltip.save_library": "Ctrl+S" +} diff --git a/tagstudio/resources/translations/en.json b/tagstudio/resources/translations/en.json index 016aa323..0f9b61e0 100644 --- a/tagstudio/resources/translations/en.json +++ b/tagstudio/resources/translations/en.json @@ -1,144 +1,144 @@ { - "home.base_title": "TagStudio Alpha", - "home.main_window": "Main Window", - "home.include_all_tags": "And (Includes All Tags)", - "home.include_any_tag": "Or (Includes Any Tag)", - "home.thumbnail_size": "Thumbnail Size", - "home.search_entries": "Search Entries", - "home.search": "Search", - "menu.file": "File", - "menu.edit": "Edit", - "menu.tools": "Tools", - "menu.macros": "Macros", - "menu.window": "Window", - "menu.help": "Help", - "tag.new": "New Tag", - "tag.add": "Add Tag", - "tag.library": "Library Tags", - "merge.window_title": "Merging Duplicate Entries", - "merge.merge_dupe_entries": "Merging Duplicate Entries", - "preview.dimensions": "Dimensions", - "preview.recent": "Recent Libraries", - "library.title": "Title", - "library.author": "Author", - "library.Artist": "Artist", - "library.url": "URL", - "library.description": "Description", - "library.notes": "Notes", - "library.tags": "Tags", - "library.content_tags": "Content Tags", - "library.meta_tags": "Meta Tags", - "library.collation": "Collation", - "library.date": "Date", - "library.date_created": "Date Created", - "library.date_modified": "Date Modified", - "library.date_taken": "Date Taken", - "library.date_published": "Date Published", - "library.archived": "Date Archived", - "library.favorite": "Favorite", - "library.book": "Book", - "library.comic": "Comic", - "library.series": "Series", - "library.manga": "Manga", - "library.source": "Source", - "library.date_uploaded": "Date Uploaded", - "library.date_released": "Date Released", - "library.volume": "Volume", - "library.anthology": "Anthology", - "library.magazine": "Magazine", - "library.publisher": "Publisher", - "library.guest_artist": "Guest Artist", - "library.composer": "Composer", - "library.comments": "Comments", - "open_library.no_tagstudio_library_found": "No existing TagStudio library found at '%{path}'. Creating one.", - "open_library.library_creation_return_code": "Library Creation Return Code:", - "open_library.title": "Library", - "dialog.open_create_library": "Open/Create Library", - "splash.open_library": "Opening Library", - "status.save_success": "Library Saved and Closed!", - "status.backup_success": "Library Backup Saved at:", - "status.search_library_query": "Searching Library for", - "status.enumerate_query": "Query:%{query}, Frame: %{i}, Length: %{len(f)}", - "status.number_results_found": "%{len(all_items)} Results Found for \"%{query}\" (%{format_timespan(end_time - start_time)})", - "status.results_found": "Results", - "dialog.save_library": "Save Library", - "dialog.refresh_directories": "Refreshing Directories", - "dialog.scan_directories": "Scanning Directories for New Files...\nPreparing...", - "dialog.scan_directories.new_files": "Scanning Directories for New Files...\n%{x + 1} File%{\"s\" if x + 1 != 1 else \"\"} Searched, %{len(self.lib.files_not_in_library)} New Files Found", - "tooltip.open_library": "Ctrl+O", - "tooltip.save_library": "Ctrl+S", - "progression.running_macros.new_entries": "Running Macros on New Entries", - "progression.running_macros.one_new_entry": "Running Configured Macros on 1/%{len(new_ids)} New Entries", - "progression.running_macros.several_new_entry": "Running Configured Macros on %{x + 1}/%{len(new_ids)} New Entries", - "file_opener.open_file": "Opening file:}", - "file_opener.not_found": "File not found:", - "file_opener.command_not_found": "Could not find %{command_name} on system PATH", - "add_field.add": "Add Field", - "generic.remove_field": "Remove Field", - "generic.file_extension": "File Extensions", - "generic.open_file": "Open file", - "generic.open_file_explorer": "Open file in explorer", - "generic.cancel": "Cancel", - "generic.add": "Add", - "generic.name": "Name", - "generic.shorthand": "Shorthand", - "generic.aliases": "Aliases", - "generic.color": "Color", - "generic.delete": "Delete", - "generic.exclude": "Exclude", - "generic.include": "Include", - "generic.done": "Done", - "generic.open_all": "Open All", - "generic.close_all": "Close All", - "generic.refresh_all": "Refresh_All", - "generic.apply": "Apply", - "generic.mirror": "Mirror", - "generic.search_tags": "Search Tags", - "build_tags.parent_tags": "Parent Tags", - "build_tags.add_parent_tags": "Add Parent Tags", - "delete_unlinked.delete_unlinked": "Delete Unlinked Entries", - "delete_unlinked.confirm": "Are you sure you want to delete the following %{len(self.lib.missing_files)} entries?", - "delete_unlinked.delete_entries": "Deleting Entries", - "delete_unlinked.deleting_number_entries": "Deleting %{x[0]+1}/{len(self.lib.missing_files)} Unlinked Entries", - "file_extension.add_extension": "Add Extension", - "file_extension.list_mode": "List Mode:", - "fix_dupes.fix_dupes": "Fix Duplicate Files", - "fix_dupes.no_file_selected": "No DupeGuru File Selected", - "fix_dupes.load_file": "Load DupeGuru File", - "fix_dupes.mirror_entries": "Mirror Entries", - "fix_dupes.mirror_description": "Mirror the Entry data across each duplicate match set, combining all data while not removing or duplicating fields. This operation will not delete any files or data.", - "fix_dupes.advice_label": "After mirroring, you're free to use DupeGuru to delete the unwanted files. Afterwards, use TagStudio's \"Fix Unlinked Entries\" feature in the Tools menu in order to delete the unlinked Entries.", - "fix_dupes.open_result_files": "Open DupeGuru Results File", - "fix_dupes.name_filter": "DupeGuru Files (*.dupeguru)", - "fix_dupes.no_file_match": "Duplicate File Matches: N/A", - "fix_dupes.number_file_match": "Duplicate File Matches: %{count}", - "fix_unlinked.fix_unlinked": "Fix Unlinked Entries", - "fix_unlinked.description": "Each library entry is linked to a file in one of your directories. If a file linked to an entry is moved or deleted outside of TagStudio, it is then considered unlinked. Unlinked entries may be automatically relinked via searching your directories, manually relinked by the user, or deleted if desired.", - "fix_unlinked.duplicate_description": "Duplicate entries are defined as multiple entries which point to the same file on disk. Merging these will combine the tags and metadata from all duplicates into a single consolidated entry. These are not to be confused with \"duplicate files\", which are duplicates of your files themselves outside of TagStudio.", - "fix_unlinked.search_and_relink": "Search && Relink", - "fix_unlinked.refresh_dupes": "Refresh Duplicate Entries", - "fix_unlinked.merge_dupes": "Merge Duplicate Entries", - "fix_unlinked.manual_relink": "Manual Relink", - "fix_unlinked.delete_unlinked": "Delete Unlinked Entries", - "fix_unlinked.scan_library.title": "Scanning Library", - "fix_unlinked.scan_library.label": "Scanning Library for Unlinked Entries...", - "folders_to_tags.folders_to_tags": "Converting folders to Tags", - "folders_to_tags.title": "Create Tags From Folders", - "folders_to_tags.description": "Creates tags based on your folder structure and applies them to your entries.\n The structure below shows all the tags that will be created and what entries they will be applied to.", - "mirror_entities.are_you_sure": "Are you sure you want to mirror the following %{len(self.lib.dupe_files)} Entries?", - "mirror_entities.title": "Mirroring Entries", - "mirror_entities.label": "Mirroring 1/%{count} Entries...", - "relink_unlinked.title": "Relinking Entries", - "relink_unlinked.attempt_relink": "Attempting to Relink %{x[0]+1}/%{len(self.lib.missing_files)} Entries, %{self.fixed} Successfully Relinked", - "landing.open_button": "Open/Create Library %{open_shortcut_text}", - "preview_panel.missing_location": "Location is missing", - "preview_panel.update_widgets": "[ENTRY PANEL] UPDATE WIDGETS (%{self.driver.selected})", - "preview_panel.no_items_selected": "No Items Selected", - "preview_panel.confirm_remove": "Are you sure you want to remove this \"%{self.lib.get_field_attr(field, \"name\")}\" field?", - "preview_panel.mixed_data": "Mixed Data", - "preview_panel.edit_name": "Edit", - "preview_panel.unknown_field_type": "Unknown Field Type", - "tag.search_for_tag": "Search for Tag", - "tag.add_search": "Add to Search", - "text_line_edit.unknown_event_type": "unknown event type: %{event}" -} \ No newline at end of file + "home.base_title": "TagStudio Alpha", + "home.main_window": "Main Window", + "home.include_all_tags": "And (Includes All Tags)", + "home.include_any_tag": "Or (Includes Any Tag)", + "home.thumbnail_size": "Thumbnail Size", + "home.search_entries": "Search Entries", + "home.search": "Search", + "menu.file": "File", + "menu.edit": "Edit", + "menu.tools": "Tools", + "menu.macros": "Macros", + "menu.window": "Window", + "menu.help": "Help", + "tag.new": "New Tag", + "tag.add": "Add Tag", + "tag.library": "Library Tags", + "merge.window_title": "Merging Duplicate Entries", + "merge.merge_dupe_entries": "Merging Duplicate Entries", + "preview.dimensions": "Dimensions", + "preview.recent": "Recent Libraries", + "library.title": "Title", + "library.author": "Author", + "library.Artist": "Artist", + "library.url": "URL", + "library.description": "Description", + "library.notes": "Notes", + "library.tags": "Tags", + "library.content_tags": "Content Tags", + "library.meta_tags": "Meta Tags", + "library.collation": "Collation", + "library.date": "Date", + "library.date_created": "Date Created", + "library.date_modified": "Date Modified", + "library.date_taken": "Date Taken", + "library.date_published": "Date Published", + "library.archived": "Date Archived", + "library.favorite": "Favorite", + "library.book": "Book", + "library.comic": "Comic", + "library.series": "Series", + "library.manga": "Manga", + "library.source": "Source", + "library.date_uploaded": "Date Uploaded", + "library.date_released": "Date Released", + "library.volume": "Volume", + "library.anthology": "Anthology", + "library.magazine": "Magazine", + "library.publisher": "Publisher", + "library.guest_artist": "Guest Artist", + "library.composer": "Composer", + "library.comments": "Comments", + "open_library.no_tagstudio_library_found": "No existing TagStudio library found at '%{path}'. Creating one.", + "open_library.library_creation_return_code": "Library Creation Return Code:", + "open_library.title": "Library", + "dialog.open_create_library": "Open/Create Library", + "splash.open_library": "Opening Library", + "status.save_success": "Library Saved and Closed!", + "status.backup_success": "Library Backup Saved at:", + "status.search_library_query": "Searching Library for", + "status.enumerate_query": "Query:%{query}, Frame: %{i}, Length: %{len(f)}", + "status.number_results_found": "%{len(all_items)} Results Found for \"%{query}\" (%{format_timespan(end_time - start_time)})", + "status.results_found": "Results", + "dialog.save_library": "Save Library", + "dialog.refresh_directories": "Refreshing Directories", + "dialog.scan_directories": "Scanning Directories for New Files...\nPreparing...", + "dialog.scan_directories.new_files": "Scanning Directories for New Files...\n%{x + 1} File%{\"s\" if x + 1 != 1 else \"\"} Searched, %{len(self.lib.files_not_in_library)} New Files Found", + "tooltip.open_library": "Ctrl+O", + "tooltip.save_library": "Ctrl+S", + "progression.running_macros.new_entries": "Running Macros on New Entries", + "progression.running_macros.one_new_entry": "Running Configured Macros on 1/%{len(new_ids)} New Entries", + "progression.running_macros.several_new_entry": "Running Configured Macros on %{x + 1}/%{len(new_ids)} New Entries", + "file_opener.open_file": "Opening file:}", + "file_opener.not_found": "File not found:", + "file_opener.command_not_found": "Could not find %{command_name} on system PATH", + "add_field.add": "Add Field", + "generic.remove_field": "Remove Field", + "generic.file_extension": "File Extensions", + "generic.open_file": "Open file", + "generic.open_file_explorer": "Open file in explorer", + "generic.cancel": "Cancel", + "generic.add": "Add", + "generic.name": "Name", + "generic.shorthand": "Shorthand", + "generic.aliases": "Aliases", + "generic.color": "Color", + "generic.delete": "Delete", + "generic.exclude": "Exclude", + "generic.include": "Include", + "generic.done": "Done", + "generic.open_all": "Open All", + "generic.close_all": "Close All", + "generic.refresh_all": "Refresh All", + "generic.apply": "Apply", + "generic.mirror": "Mirror", + "generic.search_tags": "Search Tags", + "build_tags.parent_tags": "Parent Tags", + "build_tags.add_parent_tags": "Add Parent Tags", + "delete_unlinked.delete_unlinked": "Delete Unlinked Entries", + "delete_unlinked.confirm": "Are you sure you want to delete the following %{len(self.lib.missing_files)} entries?", + "delete_unlinked.delete_entries": "Deleting Entries", + "delete_unlinked.deleting_number_entries": "Deleting %{x[0]+1}/{len(self.lib.missing_files)} Unlinked Entries", + "file_extension.add_extension": "Add Extension", + "file_extension.list_mode": "List Mode:", + "fix_dupes.fix_dupes": "Fix Duplicate Files", + "fix_dupes.no_file_selected": "No DupeGuru File Selected", + "fix_dupes.load_file": "Load DupeGuru File", + "fix_dupes.mirror_entries": "Mirror Entries", + "fix_dupes.mirror_description": "Mirror the Entry data across each duplicate match set, combining all data while not removing or duplicating fields. This operation will not delete any files or data.", + "fix_dupes.advice_label": "After mirroring, you're free to use DupeGuru to delete the unwanted files. Afterwards, use TagStudio's \"Fix Unlinked Entries\" feature in the Tools menu in order to delete the unlinked Entries.", + "fix_dupes.open_result_files": "Open DupeGuru Results File", + "fix_dupes.name_filter": "DupeGuru Files (*.dupeguru)", + "fix_dupes.no_file_match": "Duplicate File Matches: N/A", + "fix_dupes.number_file_match": "Duplicate File Matches: %{count}", + "fix_unlinked.fix_unlinked": "Fix Unlinked Entries", + "fix_unlinked.description": "Each library entry is linked to a file in one of your directories. If a file linked to an entry is moved or deleted outside of TagStudio, it is then considered unlinked. Unlinked entries may be automatically relinked via searching your directories, manually relinked by the user, or deleted if desired.", + "fix_unlinked.duplicate_description": "Duplicate entries are defined as multiple entries which point to the same file on disk. Merging these will combine the tags and metadata from all duplicates into a single consolidated entry. These are not to be confused with \"duplicate files\", which are duplicates of your files themselves outside of TagStudio.", + "fix_unlinked.search_and_relink": "Search && Relink", + "fix_unlinked.refresh_dupes": "Refresh Duplicate Entries", + "fix_unlinked.merge_dupes": "Merge Duplicate Entries", + "fix_unlinked.manual_relink": "Manual Relink", + "fix_unlinked.delete_unlinked": "Delete Unlinked Entries", + "fix_unlinked.scan_library.title": "Scanning Library", + "fix_unlinked.scan_library.label": "Scanning Library for Unlinked Entries...", + "folders_to_tags.folders_to_tags": "Converting folders to Tags", + "folders_to_tags.title": "Create Tags From Folders", + "folders_to_tags.description": "Creates tags based on your folder structure and applies them to your entries.\n The structure below shows all the tags that will be created and what entries they will be applied to.", + "mirror_entities.are_you_sure": "Are you sure you want to mirror the following %{len(self.lib.dupe_files)} Entries?", + "mirror_entities.title": "Mirroring Entries", + "mirror_entities.label": "Mirroring 1/%{count} Entries...", + "relink_unlinked.title": "Relinking Entries", + "relink_unlinked.attempt_relink": "Attempting to Relink %{x[0]+1}/%{len(self.lib.missing_files)} Entries, %{self.fixed} Successfully Relinked", + "landing.open_button": "Open/Create Library %{open_shortcut_text}", + "preview_panel.missing_location": "Location is missing", + "preview_panel.update_widgets": "[ENTRY PANEL] UPDATE WIDGETS (%{self.driver.selected})", + "preview_panel.no_items_selected": "No Items Selected", + "preview_panel.confirm_remove": "Are you sure you want to remove this \"%{self.lib.get_field_attr(field, \"name\")}\" field?", + "preview_panel.mixed_data": "Mixed Data", + "preview_panel.edit_name": "Edit", + "preview_panel.unknown_field_type": "Unknown Field Type", + "tag.search_for_tag": "Search for Tag", + "tag.add_search": "Add to Search", + "text_line_edit.unknown_event_type": "unknown event type: %{event}" +} diff --git a/tagstudio/resources/translations/es.json b/tagstudio/resources/translations/es.json new file mode 100644 index 00000000..f0b4a52e --- /dev/null +++ b/tagstudio/resources/translations/es.json @@ -0,0 +1,144 @@ +{ + "add_field.add": "Añadir campo", + "build_tags.add_parent_tags": "Añadir etiquetas principales", + "build_tags.parent_tags": "Etiquetas principales", + "delete_unlinked.confirm": "¿Está seguro de que desea eliminar las siguientes %{len(self.lib.missing_files)} entradas?", + "delete_unlinked.delete_entries": "Eliminando entradas", + "delete_unlinked.delete_unlinked": "Eliminar entradas no vinculadas", + "delete_unlinked.deleting_number_entries": "Eliminando %{x[0]+1}/{len(self.lib.missing_files)} entradas no vinculadas", + "dialog.open_create_library": "Abrir/Crear biblioteca", + "dialog.refresh_directories": "Refrescar directorios", + "dialog.save_library": "Guardar la biblioteca", + "dialog.scan_directories": "Buscar archivos nuevos en los directorios...\nPreparando...", + "dialog.scan_directories.new_files": "Buscando archivos nuevos en los directorios...\n%{x + 1} Archivo%{\"s\" if x + 1 != 1 else \"\"} Buscado, %{len(self.lib.files_not_in_library)} Archivos nuevos encontrados", + "file_extension.add_extension": "Añadir extensión", + "file_extension.list_mode": "Modo de lista:", + "file_opener.command_not_found": "No se pudo encontrar %{command_name} en el PATH del sistema", + "file_opener.not_found": "Archivo no encontrado:", + "file_opener.open_file": "Abriendo archivo :}", + "fix_dupes.advice_label": "Después de la duplicación, puede utilizar DupeGuru para eliminar los archivos no deseados. Luego, utilice la función \"Reparar entradas no vinculadas\" de TagStudio en el menú Herramientas para eliminar las entradas no vinculadas.", + "fix_dupes.fix_dupes": "Reparar archivos duplicados", + "fix_dupes.load_file": "Cargar archivo DupeGuru", + "fix_dupes.mirror_description": "Reflejar los datos de entrada en cada conjunto de coincidencias duplicadas, combinando todos los datos sin eliminar ni duplicar campos. Esta operación no eliminará ningún archivos ni dato.", + "fix_dupes.mirror_entries": "Reflejar entradas", + "fix_dupes.name_filter": "Archivos DupeGuru (*.dupeguru)", + "fix_dupes.no_file_match": "Coincidencias de archivos duplicados: N/D", + "fix_dupes.no_file_selected": "No se ha seleccionado ningún archivo DupeGuru", + "fix_dupes.number_file_match": "Coincidencias de archivos duplicados: %{count}", + "fix_dupes.open_result_files": "Abrir el archivo de resultados de DupeGuru", + "fix_unlinked.delete_unlinked": "Borrar entradas no vinculadas", + "fix_unlinked.description": "Cada entrada de la biblioteca está vinculada a un archivo en uno de sus directorios. Si un archivo vinculado a una entrada se mueve o se elimina fuera de TagStudio, se considerará desvinculado. Las entradas no vinculadas se pueden volver a vincular automáticamente mediante una búsqueda en sus directorios, el usuario puede volver a vincularlas manualmente o eliminarlas si así lo desea.", + "fix_unlinked.duplicate_description": "Las entradas duplicadas se definen como múltiples entradas que apuntan al mismo archivo en el disco. Al fusionarlas, se combinarán las etiquetas y los metadatos de todos los duplicados en una única entrada consolidada. No deben confundirse con los \"archivos duplicados\", que son duplicados de sus archivos fuera de TagStudio.", + "fix_unlinked.fix_unlinked": "Corregir entradas no vinculadas", + "fix_unlinked.manual_relink": "Reenlace manual", + "fix_unlinked.merge_dupes": "Fusionar entradas duplicadas", + "fix_unlinked.refresh_dupes": "Recargar entradas duplicadas", + "fix_unlinked.scan_library.label": "Buscando entradas no enlazadas en la biblioteca...", + "fix_unlinked.scan_library.title": "Escaneando la biblioteca", + "fix_unlinked.search_and_relink": "Buscar y volver a vincular", + "folders_to_tags.description": "Crea etiquetas basadas en su estructura de carpetas y las aplica a sus entradas.\n La siguiente estructura muestra todas las etiquetas que se crearán y a qué entradas se aplicarán.", + "folders_to_tags.folders_to_tags": "Convertir carpetas en etiquetas", + "folders_to_tags.title": "Crear etiquetas a partir de carpetas", + "generic.add": "Añadir", + "generic.aliases": "Alias", + "generic.apply": "Aplicar", + "generic.cancel": "Cancelar", + "generic.close_all": "Cerrar todo", + "generic.color": "Color", + "generic.delete": "Borrar", + "generic.done": "Donar", + "generic.exclude": "Excluir", + "generic.file_extension": "Extensiones del archivo", + "generic.include": "Incluir", + "generic.mirror": "Espejo", + "generic.name": "Nombre", + "generic.open_all": "Abrir todo", + "generic.open_file": "Abrir archivo", + "generic.open_file_explorer": "Abrir archivo en el explorador", + "generic.refresh_all": "Recargar todo", + "generic.remove_field": "Eliminar campo", + "generic.search_tags": "Buscar etiquetas", + "generic.shorthand": "Taquigrafía", + "home.base_title": "TagStudio Alfa", + "home.include_all_tags": "Y (Incluye todas las etiquetas)", + "home.include_any_tag": "O (Incluye cualquier etiqueta)", + "home.main_window": "Ventana principal", + "home.search": "Buscar", + "home.search_entries": "Buscar entradas", + "home.thumbnail_size": "Tamaño de la miniatura", + "landing.open_button": "Abrir/Crear biblioteca %{open_shortcut_text}", + "library.Artist": "Artista", + "library.anthology": "Antología", + "library.archived": "Fecha de archivo", + "library.author": "Autor", + "library.book": "Libro", + "library.collation": "Recopilación", + "library.comic": "Tebeo", + "library.comments": "Comentarios", + "library.composer": "Compositor", + "library.content_tags": "Etiquetas del contenido", + "library.date": "Fecha", + "library.date_created": "Fecha de creación", + "library.date_modified": "Fecha de modificación", + "library.date_published": "Fecha de publicación", + "library.date_released": "Fecha de lanzamiento", + "library.date_taken": "Fecha de realización", + "library.date_uploaded": "Fecha de carga", + "library.description": "Descripción", + "library.favorite": "Favorito", + "library.guest_artist": "Artista invitado", + "library.magazine": "Revista", + "library.manga": "Manga", + "library.meta_tags": "Etiquetas de metadatos", + "library.notes": "Notas", + "library.publisher": "Editor", + "library.series": "Series", + "library.source": "Fuente", + "library.tags": "Etiquetas", + "library.title": "Título", + "library.url": "URL", + "library.volume": "Volumen", + "menu.edit": "Editar", + "menu.file": "Archivo", + "menu.help": "Ayuda", + "menu.macros": "Macro", + "menu.tools": "Herramientas", + "menu.window": "Ventana", + "merge.merge_dupe_entries": "Fusionando entradas duplicadas", + "merge.window_title": "Fusionando entradas duplicadas", + "mirror_entities.are_you_sure": "¿Estás seguro de que quieres reflejar las siguientes %{len(self.lib.dupe_files)} entradas?", + "mirror_entities.label": "Reflejando 1/%{count} Entradas...", + "mirror_entities.title": "Entradas reflejadas", + "open_library.library_creation_return_code": "Código de retorno de creación de biblioteca:", + "open_library.no_tagstudio_library_found": "No se encontró ninguna biblioteca TagStudio existente en '%{path}'. Se está creando una.", + "open_library.title": "Biblioteca", + "preview.dimensions": "Dimensiones", + "preview.recent": "Bibliotecas recientes", + "preview_panel.confirm_remove": "¿Está seguro de que desea eliminar este campo \"%{self.lib.get_field_attr(field, \"name\")}\"?", + "preview_panel.edit_name": "Editar", + "preview_panel.missing_location": "Falta la ubicación", + "preview_panel.mixed_data": "Datos variados", + "preview_panel.no_items_selected": "No hay elementos seleccionados", + "preview_panel.unknown_field_type": "Tipo de campo desconocido", + "preview_panel.update_widgets": "[PANEL DE ENTRADA] ACTUALIZAR WIDGETS (%{self.driver.selected})", + "progression.running_macros.new_entries": "Ejecución de macros en entradas nuevas", + "progression.running_macros.one_new_entry": "Ejecución de macros configurados en 1/%{len(new_ids)} entradas nuevas", + "progression.running_macros.several_new_entry": "Ejecución de macros configurados en %{x + 1}/%{len(new_ids)} entradas nuevas", + "relink_unlinked.attempt_relink": "Intentando volver a vincular %{x[0]+1}/%{len(self.lib.missing_files)} Entradas, %{self.fixed} Reenlazado correctamente", + "relink_unlinked.title": "Volver a vincular las entradas", + "splash.open_library": "Abriendo la biblioteca", + "status.backup_success": "Copia de seguridad de la biblioteca guardada en:", + "status.enumerate_query": "Consulta:%{query}, Cuadro: %{i}, Longitud: %{len(f)}", + "status.number_results_found": "%{len(all_items)} Resultados encontrados para \"%{query}\" (%{format_timespan(end_time - start_time)})", + "status.results_found": "Resultados", + "status.save_success": "¡Biblioteca guardada y cerrada!", + "status.search_library_query": "Buscando en la biblioteca", + "tag.add": "Añadir etiqueta", + "tag.add_search": "Añadir a la búsqueda", + "tag.library": "Etiquetas de la biblioteca", + "tag.new": "Nueva etiqueta", + "tag.search_for_tag": "Buscar por etiqueta", + "text_line_edit.unknown_event_type": "tipo de suceso desconocido: %{event}", + "tooltip.open_library": "Ctrl+O", + "tooltip.save_library": "Ctrl+S" +} diff --git a/tagstudio/resources/translations/fr.json b/tagstudio/resources/translations/fr.json new file mode 100644 index 00000000..09b68742 --- /dev/null +++ b/tagstudio/resources/translations/fr.json @@ -0,0 +1,144 @@ +{ + "add_field.add": "Ajouter un Champ", + "build_tags.add_parent_tags": "Ajouter des Labels Parents", + "build_tags.parent_tags": "Labels Parent", + "delete_unlinked.confirm": "Êtes-vous sûr de vouloir supprimer les %{len(self.lib.missing_files)} entrées suivantes  ?", + "delete_unlinked.delete_entries": "Suppression des Entrées", + "delete_unlinked.delete_unlinked": "Supprimer les Entrées non Liées", + "delete_unlinked.deleting_number_entries": "Suppression des Entrées non Liées %{x[0]+1}/{len(self.lib.missing_files)}", + "dialog.open_create_library": "Ouvrir/Créer une Bibliothèque", + "dialog.refresh_directories": "Rafraîchissement des Dossiers", + "dialog.save_library": "Sauvegarder la Bibliothèque", + "dialog.scan_directories": "Recherche de Nouveaux Fichiers dans les Dossiers...\nPréparation...", + "dialog.scan_directories.new_files": "Recherche de Nouveaux Fichiers dans les Dossiers...\n%{x + 1} Fichiers%{\"s\" if x + 1 != 1 else \"\"} Recherchés, %{len(self.lib.files_not_in_library)} Nouveaux Fichiers Trouvés", + "file_extension.add_extension": "Ajouter une Extension", + "file_extension.list_mode": "Mode Liste :", + "file_opener.command_not_found": "Impossible de trouver %{command_name} dans le CHEMIN système", + "file_opener.not_found": "Fichier non trouvé:", + "file_opener.open_file": "Ouverture du Fichier:}", + "fix_dupes.advice_label": "Après réplication, vous êtes libre d'utiliser DupeGuru pour supprimer des fichiers non désirés. Ensuite, utilisez la fonctionnalité \"Réparation des Entrées non Liées\" de TagStudio dans le menu Outils pour supprimer les Entrées non liées.", + "fix_dupes.fix_dupes": "Réparer les Fichiers en Double", + "fix_dupes.load_file": "Charger un Fichier DupeGuru", + "fix_dupes.mirror_description": "Repliquer les données d'entrée dans chaque jeu de correspondances en double, en combinant toutes les données sans supprimer ni dupliquer de champs. Cette opération ne supprime aucun fichier ni aucune donnée.", + "fix_dupes.mirror_entries": "Répliquer les Entrées", + "fix_dupes.name_filter": "Fichiers DupeGuru (*.dupeguru)", + "fix_dupes.no_file_match": "Dupliquer les Correspondances de Fichier : N/A", + "fix_dupes.no_file_selected": "Aucun Fichier DupeGuru Sélectionné", + "fix_dupes.number_file_match": "Dupliquer les Correspondances de Fichier : %{count}", + "fix_dupes.open_result_files": "Ouvrire les Fichiers de Résultats de DupeGuru", + "fix_unlinked.delete_unlinked": "Supprimer les Entrées non Liées", + "fix_unlinked.description": "Chaque entrée dans la bibliothèque est liée à un fichier dans l'un de vos dossiers. Si un fichier lié à une entrée est déplacé ou supprimé en dehors de TagStudio, il est alors considéré non lié. Les entrées non liées peuvent être automatiquement reliées via la recherche dans vos dossiers, reliées manuellement par l'utilisateur, ou supprimées si désiré.", + "fix_unlinked.duplicate_description": "Les entrées dupliquées sont définies comme des entrées multiple qui pointent vers le même fichier sur le disque. Les fusionner va combiner les labels et metadatas de tous les duplicatas vers une seule entrée consolidée. Elles ne doivent pas être confondues avec les \"fichiers en doublon\", qui sont des doublons de vos fichiers en dehors de TagStudio.", + "fix_unlinked.fix_unlinked": "Réparation des Entrées non Liées", + "fix_unlinked.manual_relink": "Reliage Manuel", + "fix_unlinked.merge_dupes": "Fusionner les Entrées en Doublon", + "fix_unlinked.refresh_dupes": "Rafraichir les Entrées en Doublon", + "fix_unlinked.scan_library.label": "Balayage de la Bibliothèque pour trouver des Entrées non Liées...", + "fix_unlinked.scan_library.title": "Balayage de la Bibliothèque", + "fix_unlinked.search_and_relink": "Rechercher && Relier", + "folders_to_tags.description": "Créé des labels basés sur votre arborescence de dossier et les applique à vos entrées.\nLa structure ci-dessous affiche tous les labels qui seront créés et à quelles entrées ils seront appliqués.", + "folders_to_tags.folders_to_tags": "Conversion des dossiers en Labels", + "folders_to_tags.title": "Créer un Label à partir d'un Dossier", + "generic.add": "Ajouter", + "generic.aliases": "Alias", + "generic.apply": "Appliquer", + "generic.cancel": "Annuler", + "generic.close_all": "Tout Fermer", + "generic.color": "Couleur", + "generic.delete": "Supprimer", + "generic.done": "Terminé", + "generic.exclude": "Exclure", + "generic.file_extension": "Extensions de Fichiers", + "generic.include": "Inclure", + "generic.mirror": "Refléter", + "generic.name": "Nom", + "generic.open_all": "Tout Ouvrir", + "generic.open_file": "Ouvrir un Fichier", + "generic.open_file_explorer": "Ouvrir un Fichier dans l'Explorateur", + "generic.refresh_all": "Tout Rafraîchir", + "generic.remove_field": "Supprimer un Champ", + "generic.search_tags": "Recherche de Labels", + "generic.shorthand": "Abrégé", + "home.base_title": "TagStudio Alpha", + "home.include_all_tags": "Et (Inclus tous les Labels)", + "home.include_any_tag": "Ou (Inclus N'importe quel Label)", + "home.main_window": "Fenêtre Principale", + "home.search": "Rechercher", + "home.search_entries": "Recherche", + "home.thumbnail_size": "Taille de la miniature", + "landing.open_button": "Ouvrir/Créer une Bibliothèque %{open_shortcut_text}", + "library.Artist": "Artiste", + "library.anthology": "Anthologie", + "library.archived": "Date d'Archivage", + "library.author": "Auteur", + "library.book": "Livre", + "library.collation": "Collage", + "library.comic": "Bande Dessinée", + "library.comments": "Commentaires", + "library.composer": "Compositeur", + "library.content_tags": "Labels de Contenu", + "library.date": "Date", + "library.date_created": "Date de Création", + "library.date_modified": "Date de Modification", + "library.date_published": "Date de Publication", + "library.date_released": "Date de Sortie", + "library.date_taken": "Date de Capture", + "library.date_uploaded": "Date de Mise en Ligne", + "library.description": "Description", + "library.favorite": "Favori", + "library.guest_artist": "Artiste Invité", + "library.magazine": "Magazine", + "library.manga": "Manga", + "library.meta_tags": "Label Meta", + "library.notes": "Notes", + "library.publisher": "Éditeur", + "library.series": "Séries", + "library.source": "Source", + "library.tags": "Labels", + "library.title": "Titre", + "library.url": "URL", + "library.volume": "Volume", + "menu.edit": "Édition", + "menu.file": "Fichier", + "menu.help": "Aide", + "menu.macros": "Macros", + "menu.tools": "Outils", + "menu.window": "Fenêtre", + "merge.merge_dupe_entries": "Fusionner les duplicatas", + "merge.window_title": "Fusionner les duplicatas", + "mirror_entities.are_you_sure": "Êtes-vous sûr de vouloir répliquer les %{len(self.lib.dupe_files)} Entrées suivantes ?", + "mirror_entities.label": "Réplication de 1/%{count} Entrées...", + "mirror_entities.title": "Réplication des Entrées", + "open_library.library_creation_return_code": "Code de Retour de la Création de bibliothèque:", + "open_library.no_tagstudio_library_found": "Aucune bibliothèque TagStudio trouvé au chemin '%{path}'. Création d'une bibliothèque.", + "open_library.title": "Bibliothèque", + "preview.dimensions": "Dimensions", + "preview.recent": "Bibliothèques Récentes", + "preview_panel.confirm_remove": "Êtes-vous sûr de vouloir supprimer le champ \"%{self.lib.get_field_attr(field, \"name\")}\" ?", + "preview_panel.edit_name": "Éditer", + "preview_panel.missing_location": "Emplacement Manquant", + "preview_panel.mixed_data": "Données Mélangées", + "preview_panel.no_items_selected": "Pas d'Objet Selectionné", + "preview_panel.unknown_field_type": "Type de Champ Inconnu", + "preview_panel.update_widgets": "[PANEL D'ENTRÉE] MISE À JOUR DES WIDGETS (%{self.driver.selected})", + "progression.running_macros.new_entries": "Exécution des Macros sur les Nouvelles Entrées", + "progression.running_macros.one_new_entry": "Éxecution des Macros Configurées sur 1/%{len(new_ids)} Nouvelles Entrées", + "progression.running_macros.several_new_entry": "Éxectution des Macros Configurées sur %{x + 1}/%{len(new_ids)} Nouvelles Entrées", + "relink_unlinked.attempt_relink": "Tentative de Reliage de %{x[0]+1}/%{len(self.lib.missing_files)} Entrées, %{self.fixed} ont été Reliées avec Succès", + "relink_unlinked.title": "Reliage des Entrées", + "splash.open_library": "Ouverture de la Bilbliothèque", + "status.backup_success": "Bibliothèque sauvegardée au chemin  :", + "status.enumerate_query": "Requête:%{query}, Image: %{i}, Longueur: %{len(f)}", + "status.number_results_found": "%{len(all_items)} Résultats Trouvés pour \"%{query}\" (%{format_timespan(end_time - start_time)})", + "status.results_found": "Résultats", + "status.save_success": "Bibliothèque Sauvegardée et Fermée !", + "status.search_library_query": "Recherche dans la Bibliothèque pour", + "tag.add": "Ajouter un Label", + "tag.add_search": "Ajouter à la Recherche", + "tag.library": "Labels de la Bibliothèque", + "tag.new": "Nouveau Label", + "tag.search_for_tag": "Recherche de Label", + "text_line_edit.unknown_event_type": "Type d'évenement inconnu : %{event}", + "tooltip.open_library": "Ctrl+O", + "tooltip.save_library": "Ctrl+S" +} diff --git a/tagstudio/resources/translations/hu.json b/tagstudio/resources/translations/hu.json new file mode 100644 index 00000000..892ab95d --- /dev/null +++ b/tagstudio/resources/translations/hu.json @@ -0,0 +1,144 @@ +{ + "add_field.add": "Új mező", + "build_tags.add_parent_tags": "Új szülőcímke", + "build_tags.parent_tags": "Szülőcímkék", + "delete_unlinked.confirm": "Biztosan törölni akarja az alábbi %{len(self.lib.missing_files)} elemet?", + "delete_unlinked.delete_entries": "Elemek törlése", + "delete_unlinked.delete_unlinked": "Kapcsolat nélküli elemek törlése", + "delete_unlinked.deleting_number_entries": "{len(self.lib.missing_files)}/%{x[0]+1}. kapcsolat nélküli elem törlése", + "dialog.open_create_library": "Könyvtár megnyitása/létrehozása", + "dialog.refresh_directories": "Mappák frissítése", + "dialog.save_library": "Könyvtár mentése", + "dialog.scan_directories": "Új fájlok keresése a mappákban…\nElőkészítés…", + "dialog.scan_directories.new_files": "Új fájlok keresése a mappákban…\n%{x + 1} fájl megvizsgálva; ebből %{len(self.lib.files_not_in_library)} új", + "file_extension.add_extension": "Kiterjesztés hozzáadása", + "file_extension.list_mode": "Listázott elemek módja:", + "file_opener.command_not_found": "A(z) „%{command_name}”-parancs nem szerepel a rendszer PATH-változójában.", + "file_opener.not_found": "Az alábbi fájl nem található:", + "file_opener.open_file": "Fájl megnyitása:", + "fix_dupes.advice_label": "A tükrözés befejezése után a DupeGuruval kitörölheti a nem kívánt fájlokat. Ezt követően, a TagStudio „Kapcsolat nélküli elemek javítása” funkciójával eltávolíthatja az árván maradt elemeket.", + "fix_dupes.fix_dupes": "Egyező fájlok egyesítése", + "fix_dupes.load_file": "DupeGuru fájl betöltése", + "fix_dupes.mirror_description": "Az összes adat átmásolása minden összetartozó fájl között, ezzel kiegészítve a hiányzó címkéket eltávolítás és duplikálás nélkül. Ez a folyamat nem fog adatokat vagy fájlokat törölni.", + "fix_dupes.mirror_entries": "Elemek tükrözése", + "fix_dupes.name_filter": "DupeGuru-fájlok (*.dupeguru)", + "fix_dupes.no_file_match": "Nincsenek egyező fájlok", + "fix_dupes.no_file_selected": "Nincs kiválasztott DupeGuru-fájl.", + "fix_dupes.number_file_match": "%{count} egyező fájl", + "fix_dupes.open_result_files": "DupeGuru-fájl megnyitása", + "fix_unlinked.delete_unlinked": "Kapcsolat nélküli elemek törlése", + "fix_unlinked.description": "A könyvtár minden eleme egy fájllal van összekapcsolva a számítógépen. Ha egy kapcsolt fájl a TagSudión kívül kerül áthelyezésre vagy törésre, akkor ez a kapcsolat megszakad. Ezeket a kapcsolat nélküli elemeket a program megpróbálhatja automatikusan megkeresni, de Ön is kézileg újra összekapcsolhatja vagy törölheti őket.", + "fix_unlinked.duplicate_description": "Ha több elem ugyanazzal a fájllal van összekapcsolva, akkor egyezőnek számítanak. Ha egyesíti őket, akkor egy olyan elem lesz létrehozva, ami az eredeti elemek összes adatát tartalmazza. Ezeket nem szabad összetéveszteni az „egyező fájlokkal”, amelyek a TagStudión kívüli azonos tartalmú fájlok.", + "fix_unlinked.fix_unlinked": "Kapcsolat nélküli elemek javítása", + "fix_unlinked.manual_relink": "Újra összekapcsolás kézileg", + "fix_unlinked.merge_dupes": "Egyező elemek egyesítése", + "fix_unlinked.refresh_dupes": "Egyező elemek frissítése", + "fix_unlinked.scan_library.label": "Kapcsolat nélküli elemek keresése a könyvtárban…", + "fix_unlinked.scan_library.title": "Könyvtár vizsgálata", + "fix_unlinked.search_and_relink": "Keresés és újra összekapcsolás", + "folders_to_tags.description": "Címkék automatikus létrehozása a létező mappastruktúra alapján.\nAz alábbi mappafán megtekintheti a létrehozandó címkéket, és hogy mely elemekre lesznek alkalmazva.", + "folders_to_tags.folders_to_tags": "Mappák címkékké alakítása", + "folders_to_tags.title": "Címkék létrehozása mappák alapján", + "generic.add": "Hozzáadás", + "generic.aliases": "Áljelek", + "generic.apply": "Alkalmaz", + "generic.cancel": "Mégse", + "generic.close_all": "Összes bezárása", + "generic.color": "Szín", + "generic.delete": "Törlés", + "generic.done": "Kész", + "generic.exclude": "Elrejtés", + "generic.file_extension": "Kiterjesztések", + "generic.include": "Mutatás", + "generic.mirror": "Tükrözés", + "generic.name": "Név", + "generic.open_all": "Összes megnyitása", + "generic.open_file": "Fájl megnyitása", + "generic.open_file_explorer": "Fájl megnyitása Intézőben", + "generic.refresh_all": "Összes frissítése", + "generic.remove_field": "Mező eltávolítása", + "generic.search_tags": "Címkék keresése", + "generic.shorthand": "Rövidítés", + "home.base_title": "TagStudio Alfa", + "home.include_all_tags": "És (az összes keresett címkét tartalmazza)", + "home.include_any_tag": "Vagy (valamelyik keresett címkét tartalmazza)", + "home.main_window": "Fő ablak", + "home.search": "Keresés", + "home.search_entries": "Tételek keresése", + "home.thumbnail_size": "Indexkép mérete", + "landing.open_button": "Könyvtár megnyitása/létrehozása %{open_shortcut_text}", + "library.Artist": "Előadó", + "library.anthology": "Gyűjtemény", + "library.archived": "Archiválás dátuma", + "library.author": "Szerző", + "library.book": "Könyv", + "library.collation": "Rendezés", + "library.comic": "Képregény", + "library.comments": "Megjegyzés", + "library.composer": "Zeneszerző", + "library.content_tags": "Tartalomcímkék", + "library.date": "Dátum", + "library.date_created": "Létrehozás dátuma", + "library.date_modified": "Módosítás dátuma", + "library.date_published": "Közzététel dátuma", + "library.date_released": "Kiadás dátuma", + "library.date_taken": "Készítés dátuma", + "library.date_uploaded": "Feltöltés dátuma", + "library.description": "Leírás", + "library.favorite": "Kedvenc", + "library.guest_artist": "Társelőadó", + "library.magazine": "Magazin", + "library.manga": "Manga", + "library.meta_tags": "Metacímkék", + "library.notes": "Jegyzetek", + "library.publisher": "Kiadó", + "library.series": "Sorozat", + "library.source": "Forrás", + "library.tags": "Címkék", + "library.title": "Cím", + "library.url": "Hivatkozás", + "library.volume": "Kötet", + "menu.edit": "Szerkesztés", + "menu.file": "Fájl", + "menu.help": "Súgó", + "menu.macros": "Makrók", + "menu.tools": "Eszközök", + "menu.window": "Ablak", + "merge.merge_dupe_entries": "Egyező elemek egyesítése", + "merge.window_title": "Egyező elemek egyesítése", + "mirror_entities.are_you_sure": "Biztosan tükrözni akarja az alábbi adatokat %{len(self.lib.dupe_files)} különböző elemre?", + "mirror_entities.label": "%{count}/1 elem tükrözése folyamatban…", + "mirror_entities.title": "Elemek tükrözése", + "open_library.library_creation_return_code": "A könyvtárlétrehozási folyamat visszatérési kódja:", + "open_library.no_tagstudio_library_found": "A program nem talált létező TagStudio-könyvtárat az alábbi elérési úton: „%{path}”. Ezen a helyen egy új könyvtár lesz létrehozva.", + "open_library.title": "Könyvtár", + "preview.dimensions": "Méret", + "preview.recent": "Legutóbbi könytárak", + "preview_panel.confirm_remove": "Biztosan el akarja távolítani a(z) „%{self.lib.get_field_attr(field, \"name\")}”-mezőt?", + "preview_panel.edit_name": "Szerkesztés", + "preview_panel.missing_location": "Hiányzó hely", + "preview_panel.mixed_data": "Kevert adatok", + "preview_panel.no_items_selected": "Nincs kijelölt elem", + "preview_panel.unknown_field_type": "Ismeretlen mezőtípus", + "preview_panel.update_widgets": "[ENTRY PANEL] UPDATE WIDGETS (%{self.driver.selected})", + "progression.running_macros.new_entries": "Makrók futtatása az új elemeken", + "progression.running_macros.one_new_entry": "Korábban beállított makrók futtatása %{len(new_ids)}/1 új elemen", + "progression.running_macros.several_new_entry": "Korábban beállított makrók futtatása %{len(new_ids)}/%{x + 1} új elemen", + "relink_unlinked.attempt_relink": "%{len(self.lib.missing_files)}/%{x[0]+1} elem újra összekapcsolásának megkísérlése; %{self.fixed} elem sikeresen újra összekapcsolva", + "relink_unlinked.title": "Elemek újra összekapcsolása", + "splash.open_library": "Könyvtár megnyitása", + "status.backup_success": "A biztonsági mentés létrehozása megtörtént az alábbi elérési úton:", + "status.enumerate_query": "Keresési kifejezés: %{query}; %{i}. képokcka; Hossz: %{len(f)}", + "status.number_results_found": "%{len(all_items)} találat az alábbi kifejezésre: „%{query}” (%{format_timespan(end_time - start_time)})", + "status.results_found": "találat", + "status.save_success": "A könyvtár mentése és bezárása sikeresen megtörtént.", + "status.search_library_query": "Az alábbi kifejezés keresése a könyvtárban:", + "tag.add": "Címke hozzáadása", + "tag.add_search": "Keresési kifejezés kiegészítése", + "tag.library": "Könyvtárcímkék", + "tag.new": "Új címke", + "tag.search_for_tag": "Címke keresése", + "text_line_edit.unknown_event_type": "Ismeretlen eseménytípus: %{event}", + "tooltip.open_library": "Ctrl+O", + "tooltip.save_library": "Ctrl+S" +} diff --git a/tagstudio/resources/translations/it.json b/tagstudio/resources/translations/it.json new file mode 100644 index 00000000..94642e48 --- /dev/null +++ b/tagstudio/resources/translations/it.json @@ -0,0 +1,19 @@ +{ + "generic.add": "Aggiungi", + "generic.cancel": "Annulla", + "generic.color": "Colore", + "generic.delete": "Elimina", + "generic.name": "Nome", + "home.base_title": "TagStudio Alfa", + "home.main_window": "Finestra principale", + "home.search": "Cerca", + "library.Artist": "Artista", + "library.book": "Libro", + "library.description": "Descrizione", + "library.title": "Titolo", + "menu.file": "File", + "menu.window": "Finestra", + "preview.recent": "Librerias Recenti", + "tag.add": "Aggiungi Tag", + "tag.new": "Nuovo Tag" +} diff --git a/tagstudio/resources/translations/nb_NO.json b/tagstudio/resources/translations/nb_NO.json new file mode 100644 index 00000000..1d7b93ac --- /dev/null +++ b/tagstudio/resources/translations/nb_NO.json @@ -0,0 +1,102 @@ +{ + "add_field.add": "Legg til felt", + "delete_unlinked.confirm": "Slett følgende %{len(self.lib.missing_files)} oppføringer?", + "delete_unlinked.delete_entries": "Sletting av oppføringer", + "delete_unlinked.deleting_number_entries": "Sletter %{x[0]+1}/{len(self.lib.missing_files)} ulenkede oppføringer", + "dialog.open_create_library": "Åpne/opprett bibliotek", + "dialog.save_library": "Lagre bibliotek", + "file_extension.add_extension": "Legg til utvidelse", + "file_extension.list_mode": "Listemodus:", + "file_opener.not_found": "Fant ikke filen:", + "file_opener.open_file": "Åpner fil :}", + "fix_dupes.fix_dupes": "Fiks duplikatfiler", + "fix_dupes.load_file": "Last inn DupeGuru-fil", + "fix_dupes.mirror_entries": "Speil oppføringer", + "fix_dupes.name_filter": "DupeGuru-filer (*.dupeguru)", + "fix_dupes.no_file_selected": "Ingen DupeGuru-fil valgt", + "fix_dupes.open_result_files": "Åpne DupeGuru-resultatfil", + "fix_unlinked.fix_unlinked": "Fiks ulenkede oppføringer", + "fix_unlinked.scan_library.label": "Skanner bibliotek for ulenkede oppføringer …", + "fix_unlinked.scan_library.title": "Skanning av bibliotek", + "folders_to_tags.folders_to_tags": "Konverterer mapper til etiketter", + "folders_to_tags.title": "Opprett etiketter fra mapper", + "generic.add": "Legg til", + "generic.apply": "Bruk", + "generic.cancel": "Avbryt", + "generic.close_all": "Lukk alle", + "generic.color": "Farge", + "generic.delete": "Slett", + "generic.done": "Ferdig", + "generic.exclude": "Utelat", + "generic.file_extension": "Filutvidelse", + "generic.include": "Inkluder", + "generic.mirror": "Speil", + "generic.name": "Navn", + "generic.open_all": "Åpne alle", + "generic.open_file": "Åpne fil", + "generic.open_file_explorer": "Åpne fil i utforsker", + "generic.refresh_all": "Gjenoppfrisk alle", + "generic.remove_field": "Fjern felt", + "generic.search_tags": "Søk etter etiketter", + "home.main_window": "Hovedvindu", + "home.search": "Søk", + "home.search_entries": "Søk etter oppføringer", + "home.thumbnail_size": "Miniatyrbildestørrelse", + "landing.open_button": "Åpne/opprett bibliotek %{open_shortcut_text}", + "library.Artist": "Artist", + "library.archived": "Arkiveringsdato", + "library.author": "Forfatter", + "library.book": "Bok", + "library.comic": "Tegneserie", + "library.comments": "Kommentarer", + "library.content_tags": "Innholdsetiketter", + "library.date": "Dato", + "library.date_created": "Dato opprettet", + "library.date_modified": "Endringsdato", + "library.date_published": "Publiseringsdato", + "library.date_released": "Slippdato", + "library.date_taken": "Dato knipset", + "library.date_uploaded": "Opplastingsdato", + "library.description": "Beskrivelse", + "library.favorite": "Favoritt", + "library.guest_artist": "Gjesteartist", + "library.magazine": "Magasin", + "library.manga": "Manga", + "library.meta_tags": "Metaetiketter", + "library.notes": "Notater", + "library.publisher": "Utgiver", + "library.series": "Serie", + "library.source": "Kilde", + "library.tags": "Etiketter", + "library.url": "Nettadresse", + "menu.edit": "Rediger", + "menu.file": "Fil", + "menu.help": "Hjelp", + "menu.macros": "Makroer", + "menu.tools": "Verktøy", + "menu.window": "Vindu", + "merge.merge_dupe_entries": "Fletter duplikatoppføringer …", + "merge.window_title": "Fletter duplikatoppføringer …", + "open_library.title": "Bibliotek", + "preview.dimensions": "Dimensjoner", + "preview.recent": "Nylige bibliotek", + "preview_panel.confirm_remove": "Fjern dette «%{self.lib.get_field_attr(field, \"name\")}»-feltet?", + "preview_panel.edit_name": "Rediger", + "preview_panel.missing_location": "Posisjon mangler", + "preview_panel.mixed_data": "Blandet data", + "preview_panel.no_items_selected": "Ingen elementer valgt", + "preview_panel.unknown_field_type": "Ukjent felttype", + "splash.open_library": "Åpner bibliotek …", + "status.backup_success": "Kopi av bibliotek lagret i:", + "status.results_found": "Resultat", + "status.save_success": "Bibliotek lagret og lukket.", + "status.search_library_query": "Søker i biblioteket etter", + "tag.add": "Legg til etikett", + "tag.add_search": "Legg til søk", + "tag.library": "Biblioteksetiketter", + "tag.new": "Ny etikett", + "tag.search_for_tag": "Søk etter etikett", + "text_line_edit.unknown_event_type": "ukjent begivenhetstype: %{event}", + "tooltip.open_library": "Ctrl+O", + "tooltip.save_library": "Ctrl+S" +} diff --git a/tagstudio/resources/translations/pt.json b/tagstudio/resources/translations/pt.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/tagstudio/resources/translations/pt.json @@ -0,0 +1 @@ +{} diff --git a/tagstudio/resources/translations/pt_BR.json b/tagstudio/resources/translations/pt_BR.json new file mode 100644 index 00000000..82482bc9 --- /dev/null +++ b/tagstudio/resources/translations/pt_BR.json @@ -0,0 +1,144 @@ +{ + "add_field.add": "Adicionar Campo", + "build_tags.add_parent_tags": "Adicionar Rótulo Pai", + "build_tags.parent_tags": "Rótulos Pai", + "delete_unlinked.confirm": "Tem certeza que deseja deletar as seguintes %{len(self.lib.missing_files)} entradas?", + "delete_unlinked.delete_entries": "Deletando Entradas", + "delete_unlinked.delete_unlinked": "Deletar Entradas Não Linkada", + "delete_unlinked.deleting_number_entries": "Deletando %{x[0]+1}/{len(self.lib.missing_files)} Entradas Não Linkadas", + "dialog.open_create_library": "Abrir/Criar Biblioteca", + "dialog.refresh_directories": "Atualizando Diretórios", + "dialog.save_library": "Salvar Biblioteca", + "dialog.scan_directories": "Escaneando Diretórios por Novos Arquivos...\nPreparando...", + "dialog.scan_directories.new_files": "Escaneando Diretórios por Novos Arquivos...\n%{x + 1} Arquivo%{\"s\" if x + 1 != 1 else \"\"} Pesquisado%{\"s\" if x + 1 != 1 else \"\"}, %{len(self.lib.files_not_in_library)} Novo(s) Arquivo(s) Encontrado(s)", + "file_extension.add_extension": "Adicionar Extensão", + "file_extension.list_mode": "Modo de Lista:", + "file_opener.command_not_found": "Não foi possível encontrar %{command_name} na PATH do sistema", + "file_opener.not_found": "Arquivo não encontrado:", + "file_opener.open_file": "Abrindo Arquivo:", + "fix_dupes.advice_label": "Após espelhagem, você estará livre para usar DupeGuru para deletar arquivos indesejados. Após, use a função \"Consertar Entradas Não Linkadas\" do TagStudio no menu de Ferramentas para deletar entradas não linkadas.", + "fix_dupes.fix_dupes": "Corrigir Arquivos Duplicados", + "fix_dupes.load_file": "Carregar Aquivo DupeGuru", + "fix_dupes.mirror_description": "Espelhe os ados de entrada em cada conjunto de correspondência duplicado, combinando todos os dados sem remover ou duplicar campos. Esta operação não excluirá nenhum arquivo ou dado.", + "fix_dupes.mirror_entries": "Entradas Espelhadas", + "fix_dupes.name_filter": "Arquivos DupeGuru (*.dupeguru)", + "fix_dupes.no_file_match": "Correspondências de Arquivos Duplicados: N/A", + "fix_dupes.no_file_selected": "Nenhum Arquivo DupeGuru Selecionado", + "fix_dupes.number_file_match": "Correspondências de Arquivos Duplicados: %{count}", + "fix_dupes.open_result_files": "Abrir Arquivo de Resultados do DupeGuru", + "fix_unlinked.delete_unlinked": "Escluir Entradas Não Linkadas", + "fix_unlinked.description": "Cada entrada na biblioteca está linkada a um arquivo em um dos seus diretórios. Se um arquivo linkado a uma entrada for movido ou deletado fora do TagStudio, ele é então considerado não linkado. Entradas não linkadas podem ser automaticamente re-linkadas por buscas nos seus diretórios, manualmente re-linkadas pelo usuário, ou deletada se for desejada.", + "fix_unlinked.duplicate_description": "Entradas duplicadas são definidas como multiplas entradas que levam ao mesmo arquivo no disco. Mergir essas entradas irá combinar as tags e metadados de todas as duplicatas em uma única entrada consolidada. Não confundir com \"Arquivos Duplicados\" que são duplicatas dos seus arquivos fora do TagStudio.", + "fix_unlinked.fix_unlinked": "Corrigir Entradas Não Linkadas", + "fix_unlinked.manual_relink": "Relink Manual", + "fix_unlinked.merge_dupes": "Mesclar Entradas Duplicadas", + "fix_unlinked.refresh_dupes": "Atualizar Entradas Duplicadas", + "fix_unlinked.scan_library.label": "Escaneando Bibliotecada para Entradas Não Linkadas...", + "fix_unlinked.scan_library.title": "Escaneando Biblioteca", + "fix_unlinked.search_and_relink": "Buscar && Relinkar", + "folders_to_tags.description": "Cria rótulos baseado na sua estrutura de arquivos e aplica elas nas suas entradas\nA estrutura abaixo mostra todos os rótulos que irão ser criados e a quais entradas eles serão aplicados.", + "folders_to_tags.folders_to_tags": "Convertendo pastas para Rótulos", + "folders_to_tags.title": "Criar rótulos a partir das pastas", + "generic.add": "Adicionar", + "generic.aliases": "Alias", + "generic.apply": "Aplicar", + "generic.cancel": "Cancelar", + "generic.close_all": "Fechar Tudo", + "generic.color": "Cor", + "generic.delete": "Deletar", + "generic.done": "Completo", + "generic.exclude": "Excluir", + "generic.file_extension": "Extensões de Arquivo", + "generic.include": "Incluir", + "generic.mirror": "Espelho", + "generic.name": "Nome", + "generic.open_all": "Abrir Tudo", + "generic.open_file": "Abrir arquivo", + "generic.open_file_explorer": "Abrir no explorador de arquivos", + "generic.refresh_all": "Atualizar_Tudo", + "generic.remove_field": "Remover Campo", + "generic.search_tags": "Buscar Rótulos", + "generic.shorthand": "Taquigrafia", + "home.base_title": "TagStudio Alfa", + "home.include_all_tags": "E (Inclui todos os rótulos)", + "home.include_any_tag": "Ou (Inclui qualquer rótulo)", + "home.main_window": "Janela Principal", + "home.search": "Buscar", + "home.search_entries": "Buscar Entradas", + "home.thumbnail_size": "Tamanho de miniatura", + "landing.open_button": "Abrir/Criar Bliblioteca %{open_shortcut_text}", + "library.Artist": "Artista", + "library.anthology": "Coletânea", + "library.archived": "Data de Arquivação", + "library.author": "Autor", + "library.book": "Livro", + "library.collation": "Colagem", + "library.comic": "Quadrinho", + "library.comments": "Comentários", + "library.composer": "Compositor", + "library.content_tags": "Rótulos de conteúdo", + "library.date": "Data", + "library.date_created": "Data de Criação", + "library.date_modified": "Dada de Modificação", + "library.date_published": "Data de Publicação", + "library.date_released": "Data de Lançamento", + "library.date_taken": "Data de Criação", + "library.date_uploaded": "Data de Envio", + "library.description": "Descrição", + "library.favorite": "Favorito", + "library.guest_artist": "Artista Convidado", + "library.magazine": "Revista", + "library.manga": "Manga", + "library.meta_tags": "Meta Rótulos", + "library.notes": "Notas", + "library.publisher": "Editora", + "library.series": "Séries", + "library.source": "Fonte", + "library.tags": "Rótulos", + "library.title": "Título", + "library.url": "URL", + "library.volume": "Volume", + "menu.edit": "Editar", + "menu.file": "Arquivo", + "menu.help": "Ajuda", + "menu.macros": "Macros", + "menu.tools": "Ferramentas", + "menu.window": "Janela", + "merge.merge_dupe_entries": "Mesclando Entradas Duplicadas", + "merge.window_title": "Mesclando Entradas Duplicadas", + "mirror_entities.are_you_sure": "Tem certeza que você deseja espelhar os seguintes %{len(self.lib.dupe_files)} entradas?", + "mirror_entities.label": "Espelhando 1/%{count} Entradas...", + "mirror_entities.title": "Espelhando Entradas", + "open_library.library_creation_return_code": "Código de Retorno da Criação da Biblioteca:", + "open_library.no_tagstudio_library_found": "Nenhuma biblioteca do TagStudio existente foi encontrada em '%{path}'. Criando uma.", + "open_library.title": "Biblioteca", + "preview.dimensions": "Dimensões", + "preview.recent": "Bibliotecas recentes", + "preview_panel.confirm_remove": "Você tem certeza de que quer remover o campo \"%{self.lib.get_field_attr(field, \"name\")}\"?", + "preview_panel.edit_name": "Editar", + "preview_panel.missing_location": "Localização Ausente", + "preview_panel.mixed_data": "Dados Mistos", + "preview_panel.no_items_selected": "Nenhum Item Selecionado", + "preview_panel.unknown_field_type": "Tipo de Campo Desconhecido", + "preview_panel.update_widgets": "[ENTRY PANEL] ATULIZAR WIDGETS (%{self.driver.selected})", + "progression.running_macros.new_entries": "Executando Macros nas Novas Entradas", + "progression.running_macros.one_new_entry": "Executando Macros Configurados em 1/%{len(new_ids)} Novas Entradas", + "progression.running_macros.several_new_entry": "Executando Macros Configurados em %{x + 1}/%{len(new_ids)} Novas Entradas", + "relink_unlinked.attempt_relink": "Tentando Relinkar %{x[0]+1}/%{len(self.lib.missing_files)} Entradas, %{self.fixed} Relinkadas com Sucesso", + "relink_unlinked.title": "Relinkando Entradas", + "splash.open_library": "Abrindo Biblioteca", + "status.backup_success": "Backup da Biblioteca Salvo em:", + "status.enumerate_query": "Busca:%{query}, Quadro: %{i}, Tamanho: %{len(f)}", + "status.number_results_found": "%{len(all_items)} Resultados Encontrados para \"%{query}\" (%{format_timespan(end_time - start_time)})", + "status.results_found": "Resultados", + "status.save_success": "Biblioteca Salva e Fechada!", + "status.search_library_query": "Procurando na Biblioteca por", + "tag.add": "Adicionar Rótulo", + "tag.add_search": "Adicionar a Pesquisa", + "tag.library": "Rótulos da biblioteca", + "tag.new": "Novo Rótulo", + "tag.search_for_tag": "Procurar por Rótulo", + "text_line_edit.unknown_event_type": "tipo de evento desconhecido: %{event}", + "tooltip.open_library": "Ctrl+O", + "tooltip.save_library": "Ctrl+S" +} diff --git a/tagstudio/resources/translations/ru.json b/tagstudio/resources/translations/ru.json new file mode 100644 index 00000000..25dc7c39 --- /dev/null +++ b/tagstudio/resources/translations/ru.json @@ -0,0 +1,144 @@ +{ + "add_field.add": "Добавить Категорию", + "build_tags.add_parent_tags": "Добавить Теги-родители", + "build_tags.parent_tags": "Теги-родители", + "delete_unlinked.confirm": "Вы уверены в том, что желаете удалить %{len(self.lib.missing_files)} записи?", + "delete_unlinked.delete_entries": "Удаление записей", + "delete_unlinked.delete_unlinked": "Удалить откреплённые записи", + "delete_unlinked.deleting_number_entries": "Удалено %{x[0]+1}/{len(self.lib.missing_files)} откреплённых записей", + "dialog.open_create_library": "Открыть/Создать Библиотеку", + "dialog.refresh_directories": "Обновление Каталога", + "dialog.save_library": "Сохранить Библиотеку", + "dialog.scan_directories": "Сканирование каталога на наличие новых файлов...\nПодготовка...", + "dialog.scan_directories.new_files": "Сканирование на наличие новых файлов...\n%{x + 1} File%{\"s\" if x + 1 != 1 else \"\"} Searched, %{len(self.lib.files_not_in_library)} Найдены новые файлы", + "file_extension.add_extension": "Добавить расширение", + "file_extension.list_mode": "Список режимов:", + "file_opener.command_not_found": "Не смог найти %{command_name} в системе PATH", + "file_opener.not_found": "Файл не найден:", + "file_opener.open_file": "Открытие файла:}", + "fix_dupes.advice_label": "После отзеркаливания, вы можете использовать DupeGuru, чтобы удалить ненужные файлы. После этого, используйте функцию \"Исправить откреплённые записи\" внутри панели \"Инструменты\" TagStudio, чтобы удалить откреплённые записи.", + "fix_dupes.fix_dupes": "Исправить дубликаты", + "fix_dupes.load_file": "Загрузить файл DupeGuru", + "fix_dupes.mirror_description": "Отзеркалить данные записи внутри каждого указанного набора дубликатов, объединяя все данные внутри без удаления или дублирования категорий. Эта операция не удалит какие-либо файлы или данные.", + "fix_dupes.mirror_entries": "Отзеркалить записи", + "fix_dupes.name_filter": "Файлы DupeGuru (*.dupeguru)", + "fix_dupes.no_file_match": "Совпадение файлов дубликатов: N/A", + "fix_dupes.no_file_selected": "Файл DupeGuru не выбран", + "fix_dupes.number_file_match": "Совпадения файлов дубликатов: %{count}", + "fix_dupes.open_result_files": "Открыть файл результатов DupeGuru", + "fix_unlinked.delete_unlinked": "Удалить откреплённые записи", + "fix_unlinked.description": "Каждая запись в библиотеке привязана к файлу, находящегося внутри той или иной папки. Если файл, к которому была привязана запись, был удалён или перемещён без использования TagStudio, то запись становиться \"откреплённой\". Откреплённые записи могут быть прикреплены обратно через автоматический рескан, вручную прикреплены обратно пользователем, либо же удалены если в них нет надобности.", + "fix_unlinked.duplicate_description": "Записи-дубликаты это несколько записей, которые одновременно привязаны к одному файлу. Объединение таких дубликатов соединит все теги и мета данные из этих записей в одну. Записи-дубликаты не стоит путать с несколькими копиями самого файла, которые могут существовать вне TagStudio.", + "fix_unlinked.fix_unlinked": "Исправить откреплённые записи", + "fix_unlinked.manual_relink": "Ручная привязка", + "fix_unlinked.merge_dupes": "Объединить записи дубликаты", + "fix_unlinked.refresh_dupes": "Обновить записи дубликаты", + "fix_unlinked.scan_library.label": "Сканирование Библиотеки на наличие откреплённых записей...", + "fix_unlinked.scan_library.title": "Сканирование Библиотеки", + "fix_unlinked.search_and_relink": "Поиск и Привязка", + "folders_to_tags.description": "Создаёт теги для записей согласно имеющейся иерархии папок.\nВнизу указаны все теги, которые будут созданы, а также записи к которым они будут применены.", + "folders_to_tags.folders_to_tags": "Конвертировать папки в теги", + "folders_to_tags.title": "Создать теги из папок", + "generic.add": "Добавить", + "generic.aliases": "Псевдонимы", + "generic.apply": "Применить", + "generic.cancel": "Отмена", + "generic.close_all": "Закрыть Всё", + "generic.color": "Цвет", + "generic.delete": "Удалить", + "generic.done": "Завершено", + "generic.exclude": "Исключить", + "generic.file_extension": "Расширения Файлов", + "generic.include": "Включить", + "generic.mirror": "Отзеркалить", + "generic.name": "Имя", + "generic.open_all": "Открыть Всё", + "generic.open_file": "Открыть файл", + "generic.open_file_explorer": "Открыть файл в проводнике", + "generic.refresh_all": "Обновить Всё", + "generic.remove_field": "Удалить Категорию", + "generic.search_tags": "Поиск тегов", + "generic.shorthand": "Сокращённое название", + "home.base_title": "TagStudio Альфа Версия", + "home.include_all_tags": "И (Файл содержит все теги)", + "home.include_any_tag": "Или (Файл содержит любой из тегов)", + "home.main_window": "Основное Окно", + "home.search": "Поиск", + "home.search_entries": "Поисковые запросы", + "home.thumbnail_size": "Размер иконок", + "landing.open_button": "Открыть/Создать Библиотеку %{open_shortcut_text}", + "library.Artist": "Художник", + "library.anthology": "Антология", + "library.archived": "Дата архивации", + "library.author": "Автор", + "library.book": "Книги", + "library.collation": "Сопоставление", + "library.comic": "Комиксы", + "library.comments": "Комментарии", + "library.composer": "Композитор", + "library.content_tags": "Теги содержимого", + "library.date": "Дата", + "library.date_created": "Дата создания", + "library.date_modified": "Дата изменения", + "library.date_published": "Дата публикации", + "library.date_released": "Дата выпуска", + "library.date_taken": "Дата съёмки", + "library.date_uploaded": "Дата загрузки", + "library.description": "Описание", + "library.favorite": "Избранное", + "library.guest_artist": "Соавтор", + "library.magazine": "Журнал", + "library.manga": "Манга", + "library.meta_tags": "Мета Теги", + "library.notes": "Заметки", + "library.publisher": "Издатель", + "library.series": "Серии", + "library.source": "Источники", + "library.tags": "Теги", + "library.title": "Название", + "library.url": "URL", + "library.volume": "Том", + "menu.edit": "Редактировать", + "menu.file": "Файл", + "menu.help": "Помощь", + "menu.macros": "Макросы", + "menu.tools": "Инструменты", + "menu.window": "Окно", + "merge.merge_dupe_entries": "Объединить повторяющиеся записи", + "merge.window_title": "Объединить повторяющиеся записи", + "mirror_entities.are_you_sure": "Вы уверенны, что хотите отзеркалить следующие %{len(self.lib.dupe_files)} записи?", + "mirror_entities.label": "Отзеркаливание 1/%{count} записей...", + "mirror_entities.title": "Отзеркаливание записей", + "open_library.library_creation_return_code": "Возвратный код создания библиотеки:", + "open_library.no_tagstudio_library_found": "Существующая библиотека TagStudio не найдена внутри '%{path}'. Создаём новую.", + "open_library.title": "Библиотека", + "preview.dimensions": "Соотношения сторон", + "preview.recent": "Недавние библиотеки", + "preview_panel.confirm_remove": "Вы уверенны, что хотите удалить эту категорию \"%{self.lib.get_field_attr(field, \"name\")}\"?", + "preview_panel.edit_name": "Редактировать", + "preview_panel.missing_location": "Путь не найден", + "preview_panel.mixed_data": "Смешанные данные", + "preview_panel.no_items_selected": "Ничего не выбрано", + "preview_panel.unknown_field_type": "Неизвестный тип категории", + "preview_panel.update_widgets": "[ENTRY PANEL] ОБНОВИТЬ ВИДЖЕТЫ (%{self.driver.selected})", + "progression.running_macros.new_entries": "Использование макросов на новых файлах", + "progression.running_macros.one_new_entry": "Запуск сконфигурированных макросов в 1/%{len(new_ids)} Новые файлы", + "progression.running_macros.several_new_entry": "Запуск сконфигурированных макросов в %{x + 1}/%{len(new_ids)} Новые файлы", + "relink_unlinked.attempt_relink": "Пытаемся вновь привязать %{x[0]+1}/%{len(self.lib.missing_files)} записей, %{self.fixed} Успешно привязано", + "relink_unlinked.title": "Привязка записей", + "splash.open_library": "Открытие Библиотеки", + "status.backup_success": "Резервная копия библиотеки сохранена по адресу:", + "status.enumerate_query": "Query:%{query}, Frame: %{i}, Length: %{len(f)}", + "status.number_results_found": "%{len(all_items)} Было найдено \"%{query}\" (%{format_timespan(end_time - start_time)})", + "status.results_found": "Результаты", + "status.save_success": "Библиотека сохранена и закрыта!", + "status.search_library_query": "Поиск по библиотеке", + "tag.add": "Добавить тег", + "tag.add_search": "Добавить к поисковому запросу", + "tag.library": "Библиотека тегов", + "tag.new": "Новый тег", + "tag.search_for_tag": "Поиск тега", + "text_line_edit.unknown_event_type": "unknown event type: %{event}", + "tooltip.open_library": "Ctrl+O", + "tooltip.save_library": "Ctrl+S" +} diff --git a/tagstudio/resources/translations/sv.json b/tagstudio/resources/translations/sv.json new file mode 100644 index 00000000..3f4457a6 --- /dev/null +++ b/tagstudio/resources/translations/sv.json @@ -0,0 +1,114 @@ +{ + "add_field.add": "Lägg till fält", + "build_tags.add_parent_tags": "Lägg till förälderetikett", + "build_tags.parent_tags": "Förälderetiketter", + "delete_unlinked.delete_entries": "Tar bort poster", + "dialog.open_create_library": "Öppna/skapa bibliotek", + "dialog.refresh_directories": "Uppdaterar kataloger", + "dialog.save_library": "Spara bibliotek", + "dialog.scan_directories": "Skannar kataloger efter nya filer...\nFörbereder...", + "file_extension.add_extension": "Lägg till tillägg", + "file_opener.not_found": "Kunde inte hitta filen:", + "file_opener.open_file": "Öppnar fil:}", + "fix_dupes.fix_dupes": "Fixa dubbla filer", + "fix_dupes.mirror_entries": "Spegla poster", + "fix_unlinked.delete_unlinked": "Ta bort olänkade poster", + "fix_unlinked.description": "Varje post i biblioteket är länkad till en fil i en av dina kataloger. Om en fil länkad till en post är flyttad eller borttagen utanför TagStudio blir den olänkad. Olänkade poster kan automatiskt bli omlänkade genom att söka genom dina kataloger, manuellt omlänkade av användaren eller tas bort om så önskas.", + "fix_unlinked.duplicate_description": "Dubbla poster är definierade som flera poster som pekar på samma fil på datorn. Genom att slå ihop dessa poster kommer deras etiketter och metadata från dubbletterna att kombineras till en post. Dessa ska inte förväxlas med \"dubbla filer\", som är dubbletter av dina filer utanför TagStudio.", + "fix_unlinked.fix_unlinked": "Fixa olänkade poster", + "fix_unlinked.manual_relink": "Länka om manuellt", + "fix_unlinked.merge_dupes": "Slå ihop dubbla poster", + "fix_unlinked.refresh_dupes": "Uppdatera dubbla poster", + "fix_unlinked.scan_library.label": "Skannar bibliotek efter olänkade poster...", + "fix_unlinked.scan_library.title": "Skannar bibliotek", + "fix_unlinked.search_and_relink": "Sök && Länka om", + "folders_to_tags.description": "Skapar etiketter baserat på din mappstruktur och tillämpar dem till dina poster.\nStrukturen nedan visar vilka etiketter som kommer skapas och vilka filer de kommer tillämpas på.", + "folders_to_tags.folders_to_tags": "Konverterar mappar till etiketter", + "folders_to_tags.title": "Skapa etiketter från mappar", + "generic.add": "Lägg till", + "generic.aliases": "Alias", + "generic.apply": "Tillämpa", + "generic.cancel": "Avbryt", + "generic.close_all": "Stäng alla", + "generic.color": "Färg", + "generic.delete": "Ta bort", + "generic.done": "Klar", + "generic.exclude": "Exkludera", + "generic.file_extension": "Filnamnstillägg", + "generic.include": "Inkludera", + "generic.mirror": "Spegla", + "generic.name": "Namn", + "generic.open_all": "Öppna alla", + "generic.open_file": "Öppna fil", + "generic.open_file_explorer": "Öppna fil i utforskaren", + "generic.refresh_all": "Uppdatera alla", + "generic.remove_field": "Ta bort fält", + "generic.search_tags": "Sök etikett", + "generic.shorthand": "Förkortning", + "home.base_title": "TagStudio Alfa", + "home.include_all_tags": "Och (Inkluderar alla etiketter)", + "home.include_any_tag": "Eller (Inkluderar alla etiketter)", + "home.main_window": "Huvudfönster", + "home.search": "Sök", + "home.search_entries": "Sök poster", + "home.thumbnail_size": "Miniatyrbildsstorlek", + "library.Artist": "Artist", + "library.anthology": "Antologi", + "library.archived": "Arkiveringsdatum", + "library.author": "Författare", + "library.book": "Bok", + "library.collation": "Kollation", + "library.comic": "Serietidning", + "library.comments": "Kommentarer", + "library.composer": "Kompositör", + "library.content_tags": "Innehållsetiketter", + "library.date": "Datum", + "library.date_created": "Skapad den", + "library.date_modified": "Senast ändrad", + "library.date_published": "Publiceringsdatum", + "library.date_released": "Utgivningsdatum", + "library.date_uploaded": "Uppladdningsdatum", + "library.description": "Beskrivning", + "library.favorite": "Favorit", + "library.guest_artist": "Gästartist", + "library.magazine": "Magasin", + "library.manga": "Manga", + "library.meta_tags": "Meta-etiketter", + "library.notes": "Anteckningar", + "library.publisher": "Utgivare", + "library.series": "Serie", + "library.source": "Källa", + "library.tags": "Etiketter", + "library.title": "Titel", + "library.url": "URL", + "library.volume": "Volym", + "menu.edit": "Redigera", + "menu.file": "Fil", + "menu.help": "Hjälp", + "menu.macros": "Makron", + "menu.tools": "Verktyg", + "menu.window": "Fönster", + "merge.merge_dupe_entries": "Slår ihop dubbla poster", + "merge.window_title": "Slår ihop dubbla poster", + "mirror_entities.title": "Speglar poster", + "open_library.title": "Bibliotek", + "preview.dimensions": "Dimensioner", + "preview.recent": "Senaste biblioteken", + "preview_panel.edit_name": "Redigera", + "preview_panel.missing_location": "Platsen saknas", + "preview_panel.no_items_selected": "Inga valda objekt", + "progression.running_macros.new_entries": "Kör makros på nya poster", + "relink_unlinked.title": "Länkar om poster", + "splash.open_library": "Öppnar bibliotek", + "status.backup_success": "Bibliotekets säkerhetskopia sparad i:", + "status.results_found": "Resultat", + "status.save_success": "Bibliotek sparat och stängt!", + "status.search_library_query": "Söker i biblioteket efter", + "tag.add": "Lägg till etikett", + "tag.add_search": "Lägg till i Sök", + "tag.library": "Biblioteksetiketter", + "tag.new": "Ny etikett", + "tag.search_for_tag": "Sök efter etikett", + "tooltip.open_library": "Ctrl+O", + "tooltip.save_library": "Ctrl+S" +} diff --git a/tagstudio/resources/translations/ta.json b/tagstudio/resources/translations/ta.json new file mode 100644 index 00000000..e1be874d --- /dev/null +++ b/tagstudio/resources/translations/ta.json @@ -0,0 +1,144 @@ +{ + "add_field.add": "புலத்தைச் சேர்க்க", + "build_tags.add_parent_tags": "பெற்றோர் குறிச்சொற்களைச் சேர்க்க", + "build_tags.parent_tags": "பெற்றோர் குறிச்சொற்கள்", + "delete_unlinked.confirm": "பின்வரும் உள்ளீடுகளை நிச்சயமாக நீக்க விரும்புகிறீர்களா %{len(self.lib.missing_files)}?", + "delete_unlinked.delete_entries": "உள்ளீடுகள் நீக்கப்படுகிறது", + "delete_unlinked.delete_unlinked": "இணைக்கப்படாத உள்ளீடுகளை நீக்கு", + "delete_unlinked.deleting_number_entries": "%{x[0]+1}/{len(self.lib.missing_files)} இணைக்கப்படாத உள்ளீடுகள் நீக்கப்படுகிறது", + "dialog.open_create_library": "நூலகத்தைத் திற/உருவாக்கு", + "dialog.refresh_directories": "கோப்பகங்கள் புதுப்பிக்கப்படுகின்றன", + "dialog.save_library": "நூலகத்தைச் சேமி", + "dialog.scan_directories": "புதிய கோப்புகளுக்கான அடைவுகள் சோதனை செய்யப்படுகின்றது...\nதயாராகிறது...", + "dialog.scan_directories.new_files": "புதிய கோப்புகளுக்கான அடைவுகள் சோதனை செய்யப்படுகின்றது...\n%{x + 1} கோப்பு%{\"s\" if x + 1 != 1 else \"\"} தேடப்பட்டது, %{len(self.lib.files_not_in_library)} புதிய கோப்புகள் கிடைத்தன", + "file_extension.add_extension": "நீட்டிப்பைச் சேர்க்க", + "file_extension.list_mode": "பட்டியல் முறை:", + "file_opener.command_not_found": "%{command_name} ஐ system PATH இல் கண்டுபிடிக்க முடியவில்லை", + "file_opener.not_found": "கோப்பு கிடைக்கவில்லை:", + "file_opener.open_file": "கோப்பைத் திறக்கிறது:}", + "fix_dupes.advice_label": "படிமம் முடிந்தவுடன், தேவையற்ற கோப்புகளை நீக்க DupeGuru ஐ பயன்படுத்தலாம். அதற்குப் பிறகு, இணைக்காத நுழைவுகளை நீக்க 'டாக் ஸ்டுடியோ' வின் 'இணைக்கப்படாத உள்ளீடுகளைச் சரிசெய்' அம்சத்தைக் கருவிகள் பட்டியில் பயன்படுத்தவும்.", + "fix_dupes.fix_dupes": "நகல் கோப்புகளைச் சரிசெய்", + "fix_dupes.load_file": "DupeGuru கோப்பை ஏற்றவும்", + "fix_dupes.mirror_description": "ஒவ்வொரு மறுநுழைவு பொருத்தத் தொகுப்பிலும் நுழைவு தரவுகளைப் பிரதிபலிக்கவும், அனைத்து தரவுகளையும் இணைக்கவும், எந்தத் தகவல்களையும் நீக்காமலும் மறு செய்யாமலும். இந்தச் செயலில் எந்தக் கோப்புகள் அல்லது தரவுகளும் நீக்கப்பட மாட்டாது.", + "fix_dupes.mirror_entries": "படிம நுழைவுகள்", + "fix_dupes.name_filter": "DupeGuru கோப்புகள் (*.dupeguru)", + "fix_dupes.no_file_match": "நகல் கோப்பு பொருத்தங்கள்: ஒன்றும் இல்லை", + "fix_dupes.no_file_selected": "DupeGuru கோப்பு எதுவும் தேர்ந்தெடுக்கப்படவில்லை", + "fix_dupes.number_file_match": "நகல் கோப்பு பொருத்தங்கள்: %{count}", + "fix_dupes.open_result_files": "DupeGuru முடிவுகள் கோப்பைத் திறக்க", + "fix_unlinked.delete_unlinked": "இணைக்கப்படாத உள்ளீடுகளை நீக்கு", + "fix_unlinked.description": "ஒவ்வொரு புத்தககல்லரி நுழைவும் உங்கள் அடைவுகளில் உள்ள ஒரு கோப்புடன் இணைக்கப்பட்டுள்ளது. டாக் ஸ்டுடியோ-வைத் தவிர கோப்புகள் நகர்த்தப்பட்டால் அல்லது நீக்கப்பட்டால், அவை இணைக்கப்படாதவையாகக் கருதப்படும். இணைக்கப்படாத நுழைவுகளை உங்கள் அடைவுகளில் தேடுவதன் மூலம் தானாகவே மீண்டும் இணைக்கலாம், பயனர் கைமுறையாக இணைக்கலாம் அல்லது விருப்பப்படி நீக்கலாம்.", + "fix_unlinked.duplicate_description": "மறுநுழைவுகள் என்பது, ஒரே கோப்பை குறிக்கும் பல நுழைவுகளை குறிக்கும். இவற்றை இணைப்பதால், அனைத்து மறுநுழைவுகளின் குறிச்சொற்களும் மெட்டாடேட்டாவும் ஒரே ஒட்டுமொத்த நுழைவாகச் சேர்க்கப்படும். இவற்றை 'மறுகோப்புகள்' என்பதுடன் குழப்பக் கூடாது, ஏனெனில் அவை டாக் ஸ்டுடியோவுக்கு வெளியேயுள்ள கோப்புகளின் நகல்களாகும்.", + "fix_unlinked.fix_unlinked": "இணைக்கப்படாத உள்ளீடுகளைச் சரிசெய்யவும்", + "fix_unlinked.manual_relink": "கைமுறை மறு இணைப்பு", + "fix_unlinked.merge_dupes": "நகல் உள்ளீடுகளை ஒன்றிணை", + "fix_unlinked.refresh_dupes": "நகல் உள்ளீடுகளைப் புதுப்பி", + "fix_unlinked.scan_library.label": "இணைக்கப்படாத நுழைவுகளை புத்தககல்லரியில் சோதனை செய்யப்படுகிறது...", + "fix_unlinked.scan_library.title": "புத்தககல்லரி சோதனை செய்யப்படுகிறது", + "fix_unlinked.search_and_relink": "தேடல் && மீண்டும் இணை", + "folders_to_tags.description": "உங்கள் அடைவு கட்டமைப்பின் அடிப்படையில் குறிச்சொற்களை உருவாக்கி, அவற்றை உங்கள் நுழைவுகளில் பயன்படுத்துகிறது.\nகீழே காணப்படும் கட்டமைப்பானது உருவாக்கப்படும் அனைத்து குறிச்சொற்களையும், அவை எந்த நுழைவுகளில் பயன்படுத்தப்படும் என்பதையும் காட்டுகிறது.", + "folders_to_tags.folders_to_tags": "கோப்புறைகளை குறிச்சொற்களாக மாற்றப்படுகிறது", + "folders_to_tags.title": "கோப்புறைகளிலிருந்து குறிச்சொற்களை உருவாக்கு", + "generic.add": "சேர்", + "generic.aliases": "மாற்றுப்பெயர்கள்", + "generic.apply": "விண்ணப்பிக்க", + "generic.cancel": "ரத்து செய்", + "generic.close_all": "அனைத்தையும் மூடு", + "generic.color": "நிறம்", + "generic.delete": "நீக்கு", + "generic.done": "முடிந்தது", + "generic.exclude": "தவிர்", + "generic.file_extension": "கோப்பு நீட்டிப்புகள்", + "generic.include": "உள்ளடக்கு", + "generic.mirror": "படிமம்", + "generic.name": "பெயர்", + "generic.open_all": "அனைத்தையும் திற", + "generic.open_file": "கோப்பைத் திறக்கவும்", + "generic.open_file_explorer": "Explorer இல் கோப்பைத் திறக்கவும்", + "generic.refresh_all": "அனைத்தையும் புதுப்பி", + "generic.remove_field": "புலத்தை அகற்று", + "generic.search_tags": "குறிச்சொற்களைத் தேடு", + "generic.shorthand": "சுருக்கெழுத்து", + "home.base_title": "TagStudio ஆல்பா", + "home.include_all_tags": "மற்றும் (அனைத்து குறிச்சொற்களையும் உள்ளடக்கியது)", + "home.include_any_tag": "அல்லது (எந்தக் குறிச்சொல்லையும் உள்ளடக்கியது)", + "home.main_window": "பிரதான சாளரம்", + "home.search": "தேடு", + "home.search_entries": "தேடல் உள்ளீடுகள்", + "home.thumbnail_size": "சின்னப்பட அளவு", + "landing.open_button": "நூலகத்தைத் திற/உருவாக்கு %{open_shortcut_text}", + "library.Artist": "கலைஞர்", + "library.anthology": "தொகுப்பியல்", + "library.archived": "காப்பகப்படுத்தப்பட்ட தேதி", + "library.author": "ஆக்கியோன்", + "library.book": "புத்தகம்", + "library.collation": "தொகுத்தல்", + "library.comic": "நகைச்சுவை", + "library.comments": "கருத்துகள்", + "library.composer": "இசையமைப்பாளர்", + "library.content_tags": "உள்ளடக்கக் குறிச்சொற்கள்", + "library.date": "தேதி", + "library.date_created": "உருவாக்கப்பட்ட தேதி", + "library.date_modified": "மாற்றப்பட்ட தேதி", + "library.date_published": "வெளியிடப்பட்ட தேதி", + "library.date_released": "வெளியான தேதி", + "library.date_taken": "எடுக்கப்பட்ட தேதி", + "library.date_uploaded": "பதிவேற்றிய தேதி", + "library.description": "விளக்கம்", + "library.favorite": "பிடித்தது", + "library.guest_artist": "விருந்தினர் கலைஞர்", + "library.magazine": "இதழ்", + "library.manga": "மங்கா", + "library.meta_tags": "மெட்டா குறிச்சொற்கள்", + "library.notes": "குறிப்புகள்", + "library.publisher": "பதிப்பாளர்", + "library.series": "தொடர்", + "library.source": "ஆதாரம்", + "library.tags": "குறிச்சொற்கள்", + "library.title": "தலைப்பு", + "library.url": "இணைய முகவரி", + "library.volume": "தொகுப்பு", + "menu.edit": "திருத்து", + "menu.file": "கோப்பு", + "menu.help": "உதவி", + "menu.macros": "செயல்முறை", + "menu.tools": "கருவிகள்", + "menu.window": "சாளரம்", + "merge.merge_dupe_entries": "மறுநுழைவுகளை ஒன்றுசேர்த்தல்", + "merge.window_title": "மறுநுழைவுகளை ஒன்றுசேர்த்தல்", + "mirror_entities.are_you_sure": "பின்வரும் உள்ளீடுகளைப் பிரதிபலிக்க விரும்புகிறீர்களா %{len(self.lib.dupe_files)}?", + "mirror_entities.label": "1/%{count} உள்ளீடுகளைப் பிரதிபலிக்கப்படுகின்றது...", + "mirror_entities.title": "உள்ளீடுகள் பிரதிபழிக்கப்படுகின்றது", + "open_library.library_creation_return_code": "நூலக உருவாக்கம் திரும்பக் குறியீடு:", + "open_library.no_tagstudio_library_found": "'%{path}' இல் ஏற்கனவே உள்ள டாக் ஸ்டுடியோ புத்தககல்லரி காணப்படவில்லை. ஒன்று உருவாக்கப்படுகிறது.", + "open_library.title": "நூலகம்", + "preview.dimensions": "பரிமாணங்கள்", + "preview.recent": "சமீபத்திய நூலகங்கள்", + "preview_panel.confirm_remove": "இந்த \"%{self.lib.get_field_attr(field, \"name\")}\" புலத்தை நிச்சயமாக அகற்ற விரும்புகிறீர்களா?", + "preview_panel.edit_name": "திருத்து", + "preview_panel.missing_location": "இடம் காணவில்லை", + "preview_panel.mixed_data": "கலப்பு தரவு", + "preview_panel.no_items_selected": "உருப்படிகள் எதுவும் தேர்ந்தெடுக்கப்படவில்லை", + "preview_panel.unknown_field_type": "அறியப்படாத புல வகை", + "preview_panel.update_widgets": "[நுழைவு குழு] விட்ஜெட்டுகளை புதுப்பிக்கவும் (%{self.driver.selected})", + "progression.running_macros.new_entries": "புதிய நுழைவுகளில் செயல்முறைகளை இயக்கப்படுகின்றது", + "progression.running_macros.one_new_entry": "1/ இல் கட்டமைக்கப்பட்ட செயல்முறைகளை இயக்கப்படுகிறது %{len(new_ids)} புதிய பதிவுகள்", + "progression.running_macros.several_new_entry": "%{x + 1} இல் கட்டமைக்கப்பட்ட செயல்முறைகளை இயக்கப்படுகிறது / %{len(new_ids)} புதிய பதிவுகள்", + "relink_unlinked.attempt_relink": "%{x[0]+1}/%{len(self.lib.missing_files)} உள்ளீடுகளை மீண்டும் இணைக்க முயற்சிக்கிறது, %{self.fixed} மீண்டும் இணைக்கப்பட்டது", + "relink_unlinked.title": "உள்ளீடுகள் மீண்டும் இணைக்கப்படுகின்றது", + "splash.open_library": "நூலகம் திறக்கப்படுகின்றது", + "status.backup_success": "நூலக காப்புப் பிரதி சேமிக்கப்பட்டது:", + "status.enumerate_query": "வினவு:%{query}, சட்டகம்: %{i}, நீளம்: %{len(f)}", + "status.number_results_found": "\"%{query}\" இல் %{len(all_items)} முடிவுகள் கிடைத்தன (%{format_timespan(end_time - start_time)})", + "status.results_found": "முடிவுகள்", + "status.save_success": "நூலகம் சேமிக்கப்பட்டு மூடப்பட்டது!", + "status.search_library_query": "நூலகத்தைத் தேடுகிறது", + "tag.add": "குறிச்சொல் சேர்க்க", + "tag.add_search": "தேடலில் சேர்", + "tag.library": "நூலக குறிச்சொற்கள்", + "tag.new": "புதிய குறிச்சொல்", + "tag.search_for_tag": "குறிச்சொல்லைத் தேடு", + "text_line_edit.unknown_event_type": "அறியப்படாத நிகழ்வு வகை: %{event}", + "tooltip.open_library": "Ctrl+O", + "tooltip.save_library": "Ctrl+S" +} diff --git a/tagstudio/resources/translations/tok.json b/tagstudio/resources/translations/tok.json new file mode 100644 index 00000000..3832c5a5 --- /dev/null +++ b/tagstudio/resources/translations/tok.json @@ -0,0 +1,144 @@ +{ + "add_field.add": "pana e sona", + "build_tags.add_parent_tags": "o pana e poki mama", + "build_tags.parent_tags": "poki mama", + "delete_unlinked.confirm": "mi weka e ijo %{len(self.lib.missing_files)}. ni li pona anu seme?", + "delete_unlinked.delete_entries": "mi weka e ijo", + "delete_unlinked.delete_unlinked": "o weka e ijo pi ijo lon ala", + "delete_unlinked.deleting_number_entries": "mi weka e ijo %{x[0]+1}/{len(self.lib.missing_files)} pi ijo lon ala", + "dialog.open_create_library": "open/sin e tomo", + "dialog.refresh_directories": "mi kama jo e sin lon tomo", + "dialog.save_library": "awen e tomo", + "dialog.scan_directories": "mi alasa e ijo sin lon tomo...\nmi kama pona...", + "dialog.scan_directories.new_files": "mi alasa e ijo sin lon tomo...\nmi lukin e ijo %{x + 1}. ijo %{len(self.lib.files_not_in_library)} li sin", + "file_extension.add_extension": "o pana e nimi anpa", + "file_extension.list_mode": "nasin kulupu:", + "file_opener.command_not_found": "mi ken ala alasa e toki lawa '%{command_name}' lon PATH", + "file_opener.not_found": "mi ken ala alasa e ijo:", + "file_opener.open_file": "mi open e ijo:}", + "fix_dupes.advice_label": "jasima li pini la, sina ken kepeken ilo DupeGuru. ilo DupeGuru li ken weka e ijo ike. ni li pini la, o kepeken e nasin \"o pona e ijo pi ijo lon ala\" lon ilo TagStudio. ni li weka e ijo pi ijo lon ala.", + "fix_dupes.fix_dupes": "pona e ijo sama", + "fix_dupes.load_file": "o kama sona e ijo DupeGuru", + "fix_dupes.mirror_description": "o jasima e sona kama lon kulupu sama ale. sona ale li kama wan li weka ala li kama mute ala. ni li weka ala e sona e ijo.", + "fix_dupes.mirror_entries": "o jasima e ijo", + "fix_dupes.name_filter": "ijo DupeGuru (*.dupeguru)", + "fix_dupes.no_file_match": "ijo sama: ala", + "fix_dupes.no_file_selected": "sina o anu e ijo DupeGuru", + "fix_dupes.number_file_match": "ijo sama: %{count}", + "fix_dupes.open_result_files": "o open e sona pini tan ilo DupeGuru", + "fix_unlinked.delete_unlinked": "o weka e ijo pi ijo lon ala", + "fix_unlinked.description": "ijo ale li jo e ijo lon. ona li tawa anu weka, ona li jo ala e ijo lon. ijo pi ijo lon li ken alasa e tomo li ken kama jo e ijo lon. ante la sina ken pana ijo lon tawa ijo. ante la sina ken weka e ijo.", + "fix_unlinked.duplicate_description": "ken la, ijo mute li jo e ijo lon sama. ni li \"ijo sama\". sina wan e ona la, ijo sama li kama wan li jo e sona ale tan ijo sama ale.", + "fix_unlinked.fix_unlinked": "o pona e ijo pi ijo lon ala", + "fix_unlinked.manual_relink": "sina o pana e ijo lon tawa ijo", + "fix_unlinked.merge_dupes": "o kama wan e ijo sama", + "fix_unlinked.refresh_dupes": "o kama jo e sona tan ijo sama", + "fix_unlinked.scan_library.label": "mi o alasa e ijo pi ijo lon ala...", + "fix_unlinked.scan_library.title": "mi o lukin e tomo", + "fix_unlinked.search_and_relink": "o alasa o pana e ijo lon tawa ijo", + "folders_to_tags.description": "ni li pali e poki tan poki tona li pana e poki sin tawa ijo lon tomo.\n ilo ni li pali e anpa.", + "folders_to_tags.folders_to_tags": "mi o pali e poki tan poki tomo", + "folders_to_tags.title": "o pali e poki tan poki tomo", + "generic.add": "o pana", + "generic.aliases": "nimi ante", + "generic.apply": "o pana", + "generic.cancel": "o ala", + "generic.close_all": "weka e ale", + "generic.color": "kule", + "generic.delete": "o weka", + "generic.done": "pona", + "generic.exclude": "o kepeken ala", + "generic.file_extension": "nimi lon nimi ijo anpa", + "generic.include": "o kepeken", + "generic.mirror": "jasima", + "generic.name": "nimi", + "generic.open_all": "open e ale", + "generic.open_file": "open e ijo", + "generic.open_file_explorer": "open e ijo lon ilo alasa", + "generic.refresh_all": "o kama jo sin tan ale", + "generic.remove_field": "weka e sona", + "generic.search_tags": "o alasa e poki", + "generic.shorthand": "nimi lili", + "home.base_title": "ilo TagStudio pi pini ala", + "home.include_all_tags": "AND (kepeken poki ale)", + "home.include_any_tag": "OR (kepeken poki wan. poki ale li ken)", + "home.main_window": "lipu suli", + "home.search": "alasa", + "home.search_entries": "ijo alasa", + "home.thumbnail_size": "suli sitelen", + "landing.open_button": "open/sin e tomo %{open_shortcut_text}", + "library.Artist": "jan pali sitelen", + "library.anthology": "kulupu toki", + "library.archived": "tenpo pi kama awen", + "library.author": "jan pali toki", + "library.book": "lipu toki", + "library.collation": "poki ijo", + "library.comic": "lipu sitelen", + "library.comments": "toki isipin", + "library.composer": "jan pali pi kalama musi", + "library.content_tags": "poki pi jo ijo", + "library.date": "tenpo", + "library.date_created": "tenpo pi kama sin", + "library.date_modified": "tenpo pi kama ante", + "library.date_published": "tenpo pana", + "library.date_released": "tenpo pi kama open", + "library.date_taken": "tenpo lanpan", + "library.date_uploaded": "tenpo pi kama lon lipu", + "library.description": "toki ni", + "library.favorite": "pona mute", + "library.guest_artist": "jan pali namako", + "library.magazine": "lipu sitelen toki", + "library.manga": "kulupu pi lipu sitelen", + "library.meta_tags": "poki pi sona ijo", + "library.notes": "toki sina", + "library.publisher": "jan esun", + "library.series": "kulupu", + "library.source": "tan", + "library.tags": "poki", + "library.title": "nimi", + "library.url": "nimi linluwi", + "library.volume": "nanpa", + "menu.edit": "ante", + "menu.file": "ijo", + "menu.help": "mi jo e toki seme", + "menu.macros": "ilo pali", + "menu.tools": "ilo", + "menu.window": "lipu", + "merge.merge_dupe_entries": "ijo sama li kama wan", + "merge.window_title": "ijo sama li kama wan", + "mirror_entities.are_you_sure": "mi jasima e ijo %{len(self.lib.dupe_files)}. ni li pona anu seme?", + "mirror_entities.label": "mi jasima e ijo 1/%{count}...", + "mirror_entities.title": "mi jasima e ijo", + "open_library.library_creation_return_code": "tomo li open li toki e ni:", + "open_library.no_tagstudio_library_found": "tomo lon '%{path}' li lon ala. mi pali e tomo.", + "open_library.title": "tomo", + "preview.dimensions": "suli", + "preview.recent": "tomo pi tenpo poka", + "preview_panel.confirm_remove": "sina weka e sona poki \"%{self.lib.get_field_attr(field, \"name\")}\". ni li pona anu seme?", + "preview_panel.edit_name": "ante", + "preview_panel.missing_location": "ma li lon ala", + "preview_panel.mixed_data": "sona ante", + "preview_panel.no_items_selected": "ijo ala li anu", + "preview_panel.unknown_field_type": "mi sona ala e kule pi sona poki", + "preview_panel.update_widgets": "[LIPU OPEN] O SIN E LIPU LILI (%{self.driver.selected})", + "progression.running_macros.new_entries": "mi pali lon ijo sin", + "progression.running_macros.one_new_entry": "mi pali lon ijo sin 1/%{len(new_ids)}", + "progression.running_macros.several_new_entry": "mi pali lon ijo sin %{x + 1}/%{len(new_ids)}", + "relink_unlinked.attempt_relink": "mi o pana e ijo lon tawa ijo %{x[0]+1}/%{len(self.lib.missing_files)}. mi pana e ijo lon tawa ijo %{self.fixed}", + "relink_unlinked.title": "mi pana e ijo lon tawa ijo", + "splash.open_library": "mi open e tomo", + "status.backup_success": "tomo sama li lon:", + "status.enumerate_query": "seme: %{query}. sitelen: %{i}. nanpa: %{len(f)}", + "status.number_results_found": "%{len(all_items)} mi jo e ijo \"%{query}\" (%{format_timespan(end_time - start_time)})", + "status.results_found": "jo", + "status.save_success": "tomo li awen li weka!", + "status.search_library_query": "mi alasa e", + "tag.add": "o pana e poki", + "tag.add_search": "pana tawa alasa", + "tag.library": "poki tomo", + "tag.new": "poki sin", + "tag.search_for_tag": "o alasa e poki", + "text_line_edit.unknown_event_type": "mi sona ala e ni: %{event}", + "tooltip.open_library": "Ctrl+O", + "tooltip.save_library": "Ctrl+S" +} diff --git a/tagstudio/resources/translations/tr.json b/tagstudio/resources/translations/tr.json new file mode 100644 index 00000000..92c149b7 --- /dev/null +++ b/tagstudio/resources/translations/tr.json @@ -0,0 +1,144 @@ +{ + "add_field.add": "Alan Ekle", + "build_tags.add_parent_tags": "Üst Etiketler Ekle", + "build_tags.parent_tags": "Üst Etiketler", + "delete_unlinked.confirm": "%{len(self.lib.missing_files) tane kayıtları silmek istediğinden emin misin?", + "delete_unlinked.delete_entries": "Kayıtlar Siliniyor", + "delete_unlinked.delete_unlinked": "Kopuk Kayıtları Sil", + "delete_unlinked.deleting_number_entries": "%{x[0]+1}/{len(self.lib.missing_files)} Kopuk Kayıt Siliniyor", + "dialog.open_create_library": "Kütüphane Aç/Oluştur", + "dialog.refresh_directories": "Dizinler Yenileniyor", + "dialog.save_library": "Kütüphaneyi Kaydet", + "dialog.scan_directories": "Yeni Dosyalar için Dizinler Taranıyor...\nHazırlanıyor...", + "dialog.scan_directories.new_files": "Yeni Dosyalar için Dizinler Taranıyor...\n%{x + 1} File%{\"s\" if x + 1 != 1 else \"\"} Arandı, %{len(self.lib.files_not_in_library)} Yeni Dosya Bulundu", + "file_extension.add_extension": "Dosya Uzantısı Ekle", + "file_extension.list_mode": "Listeleme Modu:", + "file_opener.command_not_found": "Sistem PATH'inde %{command_name} komutu bulunamadı", + "file_opener.not_found": "Dosya bulunamadı:", + "file_opener.open_file": "Dosya açılıyor:}", + "fix_dupes.advice_label": "Yansıtma işleminden sonra, DupeGuru'yu kullanarak istenmeyen dosyaları silebilirsin. İşlem sonrasında, kopuk kayıtları silmek için TagStudio'nun Araçlar menüsünden \"Kopuk Kayıtları Düzelt\" özelliğini kullanabilirsin.", + "fix_dupes.fix_dupes": "Yinelenen Dosyaları Düzelt", + "fix_dupes.load_file": "DupeGuru Dosyasını Yükle", + "fix_dupes.mirror_description": "Kayıt verilerini bulunan her bir yinelemeye yansıtır, alanları kopyalamadan veya silmeden tüm verileri birleştirir. Bu operasyon herhangi bir dosya veya veri silmeyecek.", + "fix_dupes.mirror_entries": "Kayıtları Yansıt", + "fix_dupes.name_filter": "DupeGuru Dosyaları (*.dupeguru)", + "fix_dupes.no_file_match": "Bulunan Yinelenen Dosyalar: Yok", + "fix_dupes.no_file_selected": "Seçili DupeGuru Dosyası Yok", + "fix_dupes.number_file_match": "Bulunan Yinelenen Dosyalar: %{count}", + "fix_dupes.open_result_files": "DupeGuru Sonuçlar Dosyasını Aç", + "fix_unlinked.delete_unlinked": "Kopuk Kayıtları Sil", + "fix_unlinked.description": "Kütüphanenizdeki her bir kayıt, dizinlerinizden bir tane dosya ile eşleştirilmektedir. Eğer bir kayıta bağlı dosya TagStudio dışında taşınır veya silinirse, o dosya artık kopuk olarak sayılır. Kopuk kayıtlar dizinlerinizde arama yapılırken otomatik olarak tekrar eşleştirilebilir, manuel olarak sizin tarafınızdan eşleştirilebilir veya isteğiniz üzere silinebilir.", + "fix_unlinked.duplicate_description": "Yinelenen kayıtlar, diskinizde aynı dosyaya işaret eden birden fazla kayıt olarak tanımlanmaktadır. Bu kayıtları birleştirdiğinizde, yinelenen tüm kayıtların içerisindeki etiketler ve metadata bilgisi tek bir tane kayıt üzerinde birleştirilecektir. Bu, \"yinelenen dosyalar\" ile karıştırılmamalıdır. Yinelenen dosyalar, TagStudio'nun dışında birden fazla kere bulunan dosyalarınızdır.", + "fix_unlinked.fix_unlinked": "Kopuk Kayıtları Düzelt", + "fix_unlinked.manual_relink": "Manuel Yeniden Eşleştirme", + "fix_unlinked.merge_dupes": "Yinelenen Kayıtları Birleştir", + "fix_unlinked.refresh_dupes": "Yinelenen Kayıtları Yenile", + "fix_unlinked.scan_library.label": "Kütüphane Kopuk Kayıtlar için Taranıyor...", + "fix_unlinked.scan_library.title": "Kütüphane Taranıyor", + "fix_unlinked.search_and_relink": "Ara && Yeniden Eşleştir", + "folders_to_tags.description": "Klasörlerinin yapısına bakarak etiketler oluşturur ve bu etiketleri kayıtlarına uygular.\nAşağıdaki yapı, oluşturulacak tüm etiketleri ve o etiketlerin hangi kayıtlarına uygulanacağını göstermektedir.", + "folders_to_tags.folders_to_tags": "Klasörler Etiketlere Dönüştürülüyor", + "folders_to_tags.title": "Klasörlerden Etiketler Oluştur", + "generic.add": "Ekle", + "generic.aliases": "Takma Adlar", + "generic.apply": "Uygula", + "generic.cancel": "İptal", + "generic.close_all": "Tümünü Kapat", + "generic.color": "Renk", + "generic.delete": "Sil", + "generic.done": "Tamamlandı", + "generic.exclude": "Hariç Tut", + "generic.file_extension": "Dosya Uzantıları", + "generic.include": "Dahil Et", + "generic.mirror": "Yansıt", + "generic.name": "İsim", + "generic.open_all": "Tümünü Aç", + "generic.open_file": "Dosya aç", + "generic.open_file_explorer": "Dosyayı Dosya Gezgininde Aç", + "generic.refresh_all": "Tümünü Yenile", + "generic.remove_field": "Alan Kaldır", + "generic.search_tags": "Etiketleri Araştır", + "generic.shorthand": "Kısaltma", + "home.base_title": "TagStudio Alpha", + "home.include_all_tags": "Ve (Tüm Etiketleri Dikkate Alır)", + "home.include_any_tag": "Veya (Herhangi Bir Etiketi Dikkate Alır)", + "home.main_window": "Ana Pencere", + "home.search": "Ara", + "home.search_entries": "library", + "home.thumbnail_size": "Küçük Resim Boyutu", + "landing.open_button": "Kütüphane Aç/Oluştur %{open_shortcut_text}", + "library.Artist": "Sanatçı", + "library.anthology": "Antoloji", + "library.archived": "Arşivlenme Tarihi", + "library.author": "Sahibi", + "library.book": "Kitap", + "library.collation": "Sıralama", + "library.comic": "Dergi", + "library.comments": "Yorumlar", + "library.composer": "Besteci", + "library.content_tags": "İçerik Etiketleri", + "library.date": "Tarih", + "library.date_created": "Oluşturulma Tarihi", + "library.date_modified": "Değiştirilme Tarihi", + "library.date_published": "Yayınlanma Tarihi", + "library.date_released": "Çıkış Tarihi", + "library.date_taken": "Alınma Tarihi", + "library.date_uploaded": "Yüklenme Tarihi", + "library.description": "Açıklama", + "library.favorite": "Favori", + "library.guest_artist": "Konuk Sanatçı", + "library.magazine": "Magazin", + "library.manga": "Manga", + "library.meta_tags": "Meta Etiketler", + "library.notes": "Notlar", + "library.publisher": "Yayımcı", + "library.series": "Dizi", + "library.source": "Kaynak", + "library.tags": "Etiketler", + "library.title": "Başlık", + "library.url": "URL", + "library.volume": "Ses Seviyesi", + "menu.edit": "Düzenle", + "menu.file": "Dosya", + "menu.help": "Yardım", + "menu.macros": "Makrolar", + "menu.tools": "Araçlar", + "menu.window": "Pencere", + "merge.merge_dupe_entries": "Yinelenen Kayıtlar Birleştiriliyor", + "merge.window_title": "Yinelenen Kayıtlar Birleştiriliyor", + "mirror_entities.are_you_sure": "%{len(self.lib.dupe_files)} kaydı yansıtmak istediğinden emin misin?", + "mirror_entities.label": "1/%{count} Kayıt Yansıtılıyor...", + "mirror_entities.title": "Kayıtlar Yansıtılıyor", + "open_library.library_creation_return_code": "Kütüphane Oluşturmaktan Dönen Kod:", + "open_library.no_tagstudio_library_found": "'%{path}' konumunda herhangi bir TagStudio kütüphanesi bulunamadı. Yeni bir tane oluşturuluyor.", + "open_library.title": "Kütüphane", + "preview.dimensions": "Ölçüler", + "preview.recent": "Son Kütüphaneler", + "preview_panel.confirm_remove": "Bu \"%{self.lib.get_field_attr(field, \"name\")}\" alanını silmek istediğinden emin misin?", + "preview_panel.edit_name": "Düzenle", + "preview_panel.missing_location": "Lokasyon bulunamadı", + "preview_panel.mixed_data": "Karışık Veri", + "preview_panel.no_items_selected": "Hiçbir Öğe Seçilmedi", + "preview_panel.unknown_field_type": "Bilinmeyen Alan Türü", + "preview_panel.update_widgets": "[KAYIT PANELİ] WIDGET'LARI GÜNCELLE (%{self.driver.selected})", + "progression.running_macros.new_entries": "Yeni Kayıtlar Üzerinde Makrolar Çalıştırılıyor", + "progression.running_macros.one_new_entry": "1/%{len(new_ids)} Tane Yeni Kayıtlarda Yapılandırılmış Makrolar Çalıştırılıyor", + "progression.running_macros.several_new_entry": "%{x + 1}/%{len(new_ids)} Tane Yeni Kayıt Üzerinde Yapılandırılmış Makrolar Çalıştırılıyor", + "relink_unlinked.attempt_relink": "%{x[0]+1}/%{len(self.lib.missing_files)} Kayıt Yeniden Eşleştirilmeye Çalışılıyor, %{self.fixed} Başarıyla Yeniden Eşleştirildi", + "relink_unlinked.title": "Kayıtlar Yeniden Eşleştiriliyor", + "splash.open_library": "Kütüphane Açılıyor", + "status.backup_success": "Kütüphane Yedeklemesi Şuraya Kaydedildi:", + "status.enumerate_query": "Sorgu:%{query}, Kare: %{i}, Uzunluk: %{len(f)}", + "status.number_results_found": "\"%{query}\" (%{format_timespan(end_time - start_time)}) Sorgusu için %{len(all_items)} Sonuç Bulundu", + "status.results_found": "Sonuçlar", + "status.save_success": "Kütüphane Kaydedildi ve Çıkış Yapıldı!", + "status.search_library_query": "Kütüphane Aranıyor", + "tag.add": "Etiket Ekle", + "tag.add_search": "Aramaya Ekle", + "tag.library": "Kütüphane Etiketleri", + "tag.new": "Yeni Etiket", + "tag.search_for_tag": "Etiket Ara", + "text_line_edit.unknown_event_type": "bilinmeyen event türü: %{event}", + "tooltip.open_library": "Ctrl+O", + "tooltip.save_library": "Ctrl+S" +} diff --git a/tagstudio/resources/translations/yue_Hant.json b/tagstudio/resources/translations/yue_Hant.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/tagstudio/resources/translations/yue_Hant.json @@ -0,0 +1 @@ +{} From c7171c54554b529c40521e1444fdcd2184c4e015 Mon Sep 17 00:00:00 2001 From: Travis Abendshien Date: Thu, 7 Nov 2024 13:31:13 -0800 Subject: [PATCH 27/82] chore: update resources_rc.py --- tagstudio/src/qt/resources_rc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tagstudio/src/qt/resources_rc.py b/tagstudio/src/qt/resources_rc.py index c2d3874d..dda5e565 100644 --- a/tagstudio/src/qt/resources_rc.py +++ b/tagstudio/src/qt/resources_rc.py @@ -16240,7 +16240,7 @@ qt_resource_struct = b"\ \x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ \x00\x00\x01\x8a\xfb\xc6\x86\xda\ \x00\x00\x00H\x00\x00\x00\x00\x00\x01\x00\x00\x22\x83\ -\x00\x00\x01\x92\x0cdgU\ +\x00\x00\x01\x92\xc5.Ns\ " def qInitResources(): From 96026b66bc7d32d559e8ced4b6f058e56db005c7 Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:00:51 -0800 Subject: [PATCH 28/82] feat: add OpenDocument thumbnail support (port #366) (#545) * feat: add OpenDocument thumbnail support Co-Authored-By: Josh Beatty * tests: add test comparing odt to png snapshot * tests: add test comparing ods to png snapshot * test: combine OpenDocument tests * test: combine compatible preview tests * test: combine preview render tests * fix: update test snapshots --------- Co-authored-by: Josh Beatty --- tagstudio/src/core/media_types.py | 19 ++++++ tagstudio/src/qt/widgets/thumb_renderer.py | 37 ++++++++++- tagstudio/tests/fixtures/sample.ods | Bin 0 -> 11271 bytes tagstudio/tests/fixtures/sample.odt | Bin 0 -> 14468 bytes ...eview_render[sample.epub-_epub_cover].png} | Bin ...iew_render[sample.ods-_open_doc_thumb].png | Bin 0 -> 5956 bytes ...iew_render[sample.odt-_open_doc_thumb].png | Bin 0 -> 13127 bytes ...eview_render[sample.pdf-thumbnailer3].png} | Bin ...eview_render[sample.svg-thumbnailer4].png} | Bin tagstudio/tests/qt/test_thumb_renderer.py | 58 +++++++++--------- 10 files changed, 83 insertions(+), 31 deletions(-) create mode 100644 tagstudio/tests/fixtures/sample.ods create mode 100644 tagstudio/tests/fixtures/sample.odt rename tagstudio/tests/qt/__snapshots__/test_thumb_renderer/{test_epub_preview.png => test_preview_render[sample.epub-_epub_cover].png} (100%) create mode 100644 tagstudio/tests/qt/__snapshots__/test_thumb_renderer/test_preview_render[sample.ods-_open_doc_thumb].png create mode 100644 tagstudio/tests/qt/__snapshots__/test_thumb_renderer/test_preview_render[sample.odt-_open_doc_thumb].png rename tagstudio/tests/qt/__snapshots__/test_thumb_renderer/{test_pdf_preview.png => test_preview_render[sample.pdf-thumbnailer3].png} (100%) rename tagstudio/tests/qt/__snapshots__/test_thumb_renderer/{test_svg_preview.png => test_preview_render[sample.svg-thumbnailer4].png} (100%) diff --git a/tagstudio/src/core/media_types.py b/tagstudio/src/core/media_types.py index a1eda5e0..c07299a7 100644 --- a/tagstudio/src/core/media_types.py +++ b/tagstudio/src/core/media_types.py @@ -32,6 +32,7 @@ class MediaType(str, Enum): INSTALLER: str = "installer" MATERIAL: str = "material" MODEL: str = "model" + OPEN_DOCUMENT: str = "open_document" PACKAGE: str = "package" PDF: str = "pdf" PLAINTEXT: str = "plaintext" @@ -234,6 +235,18 @@ class MediaCategories: _INSTALLER_SET: set[str] = {".appx", ".msi", ".msix"} _MATERIAL_SET: set[str] = {".mtl"} _MODEL_SET: set[str] = {".3ds", ".fbx", ".obj", ".stl"} + _OPEN_DOCUMENT_SET: set[str] = { + ".fodg", + ".fodp", + ".fods", + ".fodt", + ".mscz", + ".odf", + ".odg", + ".odp", + ".ods", + ".odt", + } _PACKAGE_SET: set[str] = { ".aab", ".akp", @@ -417,6 +430,11 @@ class MediaCategories: extensions=_MODEL_SET, is_iana=True, ) + OPEN_DOCUMENT_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.OPEN_DOCUMENT, + extensions=_OPEN_DOCUMENT_SET, + is_iana=False, + ) PACKAGE_TYPES: MediaCategory = MediaCategory( media_type=MediaType.PACKAGE, extensions=_PACKAGE_SET, @@ -487,6 +505,7 @@ class MediaCategories: INSTALLER_TYPES, MATERIAL_TYPES, MODEL_TYPES, + OPEN_DOCUMENT_TYPES, PACKAGE_TYPES, PDF_TYPES, PLAINTEXT_TYPES, diff --git a/tagstudio/src/qt/widgets/thumb_renderer.py b/tagstudio/src/qt/widgets/thumb_renderer.py index 7cac38fc..348ab66b 100644 --- a/tagstudio/src/qt/widgets/thumb_renderer.py +++ b/tagstudio/src/qt/widgets/thumb_renderer.py @@ -617,7 +617,31 @@ class ThumbRenderer(QObject): logger.error("Couldn't render thumbnail", filepath=filepath, error=e) return im - def _epub_cover(self, filepath: Path) -> Image.Image: + @classmethod + def _open_doc_thumb(cls, filepath: Path) -> Image.Image: + """Extract and render a thumbnail for an OpenDocument file. + + Args: + filepath (Path): The path of the file. + """ + file_path_within_zip = "Thumbnails/thumbnail.png" + im: Image.Image = None + with zipfile.ZipFile(filepath, "r") as zip_file: + # Check if the file exists in the zip + if file_path_within_zip in zip_file.namelist(): + # Read the specific file into memory + file_data = zip_file.read(file_path_within_zip) + thumb_im = Image.open(BytesIO(file_data)) + if thumb_im: + im = Image.new("RGB", thumb_im.size, color="#1e1e1e") + im.paste(thumb_im) + else: + logger.error("Couldn't render thumbnail", filepath=filepath) + + return im + + @classmethod + def _epub_cover(cls, filepath: Path) -> Image.Image: """Extracts and returns the first image found in the ePub file at the given filepath. Args: @@ -780,7 +804,8 @@ class ThumbRenderer(QObject): logger.error("Couldn't render thumbnail", filepath=filepath, error=e) return im - def _image_vector_thumb(self, filepath: Path, size: int) -> Image.Image: + @classmethod + def _image_vector_thumb(cls, filepath: Path, size: int) -> Image.Image: """Render a thumbnail for a vector image, such as SVG. Args: @@ -848,7 +873,8 @@ class ThumbRenderer(QObject): return im - def _pdf_thumb(self, filepath: Path, size: int) -> Image.Image: + @classmethod + def _pdf_thumb(cls, filepath: Path, size: int) -> Image.Image: """Render a thumbnail for a PDF file. filepath (Path): The path of the file. @@ -1045,6 +1071,11 @@ class ThumbRenderer(QObject): ext, MediaCategories.VIDEO_TYPES, mime_fallback=True ): image = self._video_thumb(_filepath) + # OpenDocument/OpenOffice ====================================== + elif MediaCategories.is_ext_in_category( + ext, MediaCategories.OPEN_DOCUMENT_TYPES, mime_fallback=True + ): + image = self._open_doc_thumb(_filepath) # Plain Text =================================================== elif MediaCategories.is_ext_in_category( ext, MediaCategories.PLAINTEXT_TYPES, mime_fallback=True diff --git a/tagstudio/tests/fixtures/sample.ods b/tagstudio/tests/fixtures/sample.ods new file mode 100644 index 0000000000000000000000000000000000000000..ecc97b12f1e657c49f75b3b384e901f9dd83e7bc GIT binary patch literal 11271 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 literal 0 HcmV?d00001 diff --git a/tagstudio/tests/fixtures/sample.odt b/tagstudio/tests/fixtures/sample.odt new file mode 100644 index 0000000000000000000000000000000000000000..4cb6f2f1cc987ab6025a1870454965355fb4605b GIT binary patch literal 14468 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 literal 0 HcmV?d00001 diff --git a/tagstudio/tests/qt/__snapshots__/test_thumb_renderer/test_epub_preview.png b/tagstudio/tests/qt/__snapshots__/test_thumb_renderer/test_preview_render[sample.epub-_epub_cover].png similarity index 100% rename from tagstudio/tests/qt/__snapshots__/test_thumb_renderer/test_epub_preview.png rename to tagstudio/tests/qt/__snapshots__/test_thumb_renderer/test_preview_render[sample.epub-_epub_cover].png diff --git a/tagstudio/tests/qt/__snapshots__/test_thumb_renderer/test_preview_render[sample.ods-_open_doc_thumb].png b/tagstudio/tests/qt/__snapshots__/test_thumb_renderer/test_preview_render[sample.ods-_open_doc_thumb].png new file mode 100644 index 0000000000000000000000000000000000000000..5e749f2d3f9bd8b7a65b281e765d54725c9775e1 GIT binary patch literal 5956 zcmeHL`9E8E_c!&-=*oAx(b`5$nNl^W5__tpN{gbFTHB_U3bAhuGP)U!N;}n3l%i-! zf~bTbx`iSVYqTP?f30Ix?4_8 zZlA+NTQ@nmpAd3#JLGom0In>$`hJ#^Q{LlXYjZWJaEXPydNux2$4bo#LgiT0e-628 zttfEO9>jwwCyjIc2fT&eFI-%z7Y52Yu%2e3a9$As1LcHqD(pe}Jw2Y>vSazLUS2|xNapf#`@xb; zr@`mB#SYipqPI8EV}lzfArRRE<$$krx=?WTuVCu1IFNl;`BK|9{sBF4$HBBnw=a1a zep`ZBgS@f$A=O-_ZD&Wp+N`u;vA4t-mFvg+cxQ-P(SbsD7DErQe;OU2Q6QRUcM5S1*#BC zQu@^cr3Fs+C8z6H?`8YclZG2KvEaw*7L2vPamPg_F|sS?gjcocsazOv0%KsBetmSn zdQk&5c`mF93mZ0hrUNGVd-%VsX|}^Qe==+dDzgKB56@+@-TYIe+}%Xv)j<#S`b1kh zJIR6zGA!n4{M$qE=SO=qD_Uk-_)h6k@XrXuZ#@pKuCCXwzh=QB&y3B)96EgXg01Zt zpIby`cX#&#`4*j{#T~cfuFtq`b2wJ52wqz&zXXxyvC-3%b$7;)Pr{aMc+_ssJR}-I zQZ}ob6_$X2bPI(=5*7-eTSJ*Q)<7(RiX$<;MBGFvfRtct=dNAX@Y5HpapC=fSi>Ik z{sjs(AT~Q8*=Vk<3r0gAY=%QSc8>P+>C=*u zl6$}GTP;+JYw{Da5s{&xq2b}-!13nI((akl?ZCrmBX>bMCr)(c!z-GZUUz02IipR* z$hxTz&G5I@Na-NvC4>5+>_R+Zjs@qpaJf-uNRoGE_1oIoNGT0NTM5)MCgMQ%Zd zp|S(@qLiV`B|B7$)m!eT#qae4{ryEqX>vi&3&GHsli%w@(3%h) zpD+8WjrN9NeHy~J46H>WuO(?^^5Z=Pw1$;=BF_&>^-p9yfANA4)O{FA9c_xmVy)Jw zMgcANAbI>lY+TP9hqMU;$tPdJoha%9G}zY&Yu2v9Rl9ON(93g#l(2#N`%L?NrDk2r ztw67cuQ8zi*{R&_;Cf@9>4fGjA)g;*ng#0opRrY556A6wPBK45&(GeQg;LbGG7iVl z^}TX8^2}mqvp_mpS|t;u{>=%`b8@IfR!lh2LM zT?aV^0HtKPd^R|E_Nlf#0nQq!32b|&>tcS&ti8oGH39xH6aOCIL-Y3>)<8C41f#zu>XIV^9Ord<$da279yyphFs# zNz42+VRLV9uewFTUQO#!eeFRD|LE8CsiDLIF25!a^HaA_ppT@aLqRESjKnD5un2nYxu z-`NP`y7twFxHPlUww8z)4<0xH#A0BsIajW|t1KF6Ln4END?qcYLUsWJDa8kMkG#JP z~DETbGyZY zb$m{$?CE&ZO7^_qG1*T+i7_S}QlnqW&Di$xT>8`7{af_Xe=aB_cBQ&W6= zJRsiufl9P-B~TeCWkZ4Bdbyv+TtJU=e)QX=tn(3GMJgL`9#r2YYgO`W!?;%sH)CS( zVw&GR1J35}x@l@`sqnM+To%$iL~`<=!e2Cx%|%l=KdnddXEP?{dP_{@;{H&SQwQ8R z#K92hwkR_*6Od8I%a<*qC%-hP4#dB$!i34XB)A=3Wg@=yI-F5)vS#l>`<1I#bMo>U zL+BcjO4B|LkV4^?(jI6CR>n_OHCduEl*Y$9KlL=baAd6Rrv6Dlec=G$D=RCWad5I| z7G{p&IyoixC`>`3X3bQ4=u%T=JR$nwa%;+Jr>=9zl;+~&lE(LwE4e1j9TMJRJS@fU zD)WVw7?hImn{epy)`pBXb4KbnG{aU%1_~a|BK72f&Y!`}wtI}@iSQKBMd)QwQ%qn% z&D=8~#6~0%Ii+oPkY;CRJVD?u9)4>m$HySFOrY$Vt>feF=QF|QLY2bAb6T2_4SWItq9@2R8tN3@LjAn<NVa6b`9)*NIMedq^xNe(3@s+JK$Yl?bzQrzglThKLm54V!e*D;-Ye+nN4UNNKFr%ZRozHZMp?x>E1WP~(I#(K*nwpxK zeP4(>eE6`Au5Ly~24cf`JBp5V1iV$PJA2#k-Bs-4%wi_3%1<;_{?~j;lW$G+V?6Hc-ItNzmy0_l$O0sH&-{_Rsdi z2F8R%hg*ML_LZsFYSFVsG9^v6ooW z07-OobPPzE_!;JvAYNZMpP^`=rx#7p#~Mn(y_^I5q88+kk(yJ^d!~3IEB<^I0H*Ct>r% zil(#p3M9#Jq$PRnwaq<@RnElc3?)^Q#WJ)t9v4bXYAF7 zL?+NOfjjc~#lIk?hpmvQ_SARvv^LCUIPZ-X9@T-)Aeir4C6(6p8AnWU$)vHm#}l9RhGy>L0^&f?A%#PZgAdf@ya>l z^9}#_4dDG(g~CXNvUlr+lzSZH!}OB$_B;+gjLUpf`sjHg7E^2;IPp?;0GM`v9USKj z+t}DpC=^EAXY!epU7z4YmqOF%_4z&)DIS%b&Fe4k9(?Csu<*U`5BrNb+P{CGcc=^) z>6G@RUj~Zm%2~;09n;<#Jc&?MAsz2FKaH>8&yNtQKH6N1h?s(H`LJc%o1?O=(o%dy zr*4Emw2BKjfkCt`!(_O} z$mWe!aXbv>qXMhpaP~?@-Wq0aT%9`MY-5uS(m6KCv;xt2N=M&Ca55J&Q4D!kq!R%W2cf*TO8$K4XW7>2lTRJ+@yKT^w)3S zzGY=)1*g`DF9|I$ukukr&lxwaM!&NFU>XzR_lbpyvg)rYMglJ@j#5`Xdmkx#P`NU4 zj7(%DFyA;l!|VyQ28PzevDC!RkX@Sx#w05ZBJs~#L71Le@&3c=v&jZ6ovDTM&1EpX zFv529rBBax@ld>d&rAkAhqIX`&St?cMQd{|1twU4u+52l0aeW`=9ZgV|F&oim|)wG zGU;PgaN6=m1xD%S=4Sb&-1d$Rds|y-zHxW`Bj%E`qvIW55!*JlK3fo(&$nJ;sgUgL z-zzE=HJGQ4))sjTHK1g5h_k|kqGzVLOv$e0wcD$2^{Sq;RMu#OG9hcI;dSH5APM_| z@6J8DsD^q@kV55~YvA_vzXhxGHD;n58Tc+~&nr2fp>zB=<;xfEwn*>ody));ql8Eb z`H;LPMx}PL8cbe285X12!5&GIF@>5b-0_yL$tVj$92Tek^z=E?fOlWN0==!kB;qJd z%{pbX+pw)AYT{G6yuvBJ#;CqhyP`cbL%+t}r3B%8pZ4j~cp!;I9%_mm`Nl9nF-)Sy zKLD|Cc8h3J6yg&$Jz hLka&MDB(8be%x+P?>C=*2mX%BIoLVd;?7;a`(HGh3sC?7 literal 0 HcmV?d00001 diff --git a/tagstudio/tests/qt/__snapshots__/test_thumb_renderer/test_preview_render[sample.odt-_open_doc_thumb].png b/tagstudio/tests/qt/__snapshots__/test_thumb_renderer/test_preview_render[sample.odt-_open_doc_thumb].png new file mode 100644 index 0000000000000000000000000000000000000000..ac2158e7d03c8019a3199e4e9cb7d7fe08549fd5 GIT binary patch literal 13127 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 kjPPI0{NK^cIXt0kps*4~Fsk+5i9m literal 0 HcmV?d00001 diff --git a/tagstudio/tests/qt/__snapshots__/test_thumb_renderer/test_pdf_preview.png b/tagstudio/tests/qt/__snapshots__/test_thumb_renderer/test_preview_render[sample.pdf-thumbnailer3].png similarity index 100% rename from tagstudio/tests/qt/__snapshots__/test_thumb_renderer/test_pdf_preview.png rename to tagstudio/tests/qt/__snapshots__/test_thumb_renderer/test_preview_render[sample.pdf-thumbnailer3].png diff --git a/tagstudio/tests/qt/__snapshots__/test_thumb_renderer/test_svg_preview.png b/tagstudio/tests/qt/__snapshots__/test_thumb_renderer/test_preview_render[sample.svg-thumbnailer4].png similarity index 100% rename from tagstudio/tests/qt/__snapshots__/test_thumb_renderer/test_svg_preview.png rename to tagstudio/tests/qt/__snapshots__/test_thumb_renderer/test_preview_render[sample.svg-thumbnailer4].png diff --git a/tagstudio/tests/qt/test_thumb_renderer.py b/tagstudio/tests/qt/test_thumb_renderer.py index f3679629..8290ff05 100644 --- a/tagstudio/tests/qt/test_thumb_renderer.py +++ b/tagstudio/tests/qt/test_thumb_renderer.py @@ -3,41 +3,43 @@ # Created for TagStudio: https://github.com/CyanVoxel/TagStudio import io +from functools import partial from pathlib import Path +import pytest from PIL import Image from src.qt.widgets.thumb_renderer import ThumbRenderer from syrupy.extensions.image import PNGImageSnapshotExtension -def test_epub_preview(cwd, snapshot): - file_path: Path = cwd / "fixtures" / "sample.epub" - tr = ThumbRenderer() - img: Image.Image = tr._epub_cover(file_path) - - img_bytes = io.BytesIO() - img.save(img_bytes, format="PNG") - img_bytes.seek(0) - - assert img_bytes.read() == snapshot(extension_class=PNGImageSnapshotExtension) - - -def test_pdf_preview(cwd, snapshot): - file_path: Path = cwd / "fixtures" / "sample.pdf" - renderer = ThumbRenderer() - img: Image.Image = renderer._pdf_thumb(file_path, 200) - - img_bytes = io.BytesIO() - img.save(img_bytes, format="PNG") - img_bytes.seek(0) - - assert img_bytes.read() == snapshot(extension_class=PNGImageSnapshotExtension) - - -def test_svg_preview(cwd, snapshot): - file_path: Path = cwd / "fixtures" / "sample.svg" - renderer = ThumbRenderer() - img: Image.Image = renderer._image_vector_thumb(file_path, 200) +@pytest.mark.parametrize( + ["fixture_file", "thumbnailer"], + [ + ( + "sample.odt", + ThumbRenderer._open_doc_thumb, + ), + ( + "sample.ods", + ThumbRenderer._open_doc_thumb, + ), + ( + "sample.epub", + ThumbRenderer._epub_cover, + ), + ( + "sample.pdf", + partial(ThumbRenderer._pdf_thumb, size=200), + ), + ( + "sample.svg", + partial(ThumbRenderer._image_vector_thumb, size=200), + ), + ], +) +def test_preview_render(cwd, fixture_file, thumbnailer, snapshot): + file_path: Path = cwd / "fixtures" / fixture_file + img: Image.Image = thumbnailer(file_path) img_bytes = io.BytesIO() img.save(img_bytes, format="PNG") From f21d49df7fd2cf569b0aed7c3cb8ce6196a44ba6 Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:12:57 -0800 Subject: [PATCH 29/82] feat: add JXL thumbnail and animated APNG + WEBP support (port #344 and partially port #357) (#549) * feat: add JXL image thumbnail support Co-Authored-By: BPplays <58504799+bpplays@users.noreply.github.com> * feat: add animated previews for webp and apng Co-Authored-By: BPplays <58504799+bpplays@users.noreply.github.com> --------- Co-authored-by: BPplays <58504799+bpplays@users.noreply.github.com> --- requirements.txt | 33 +++++++++---------- tagstudio/src/core/media_types.py | 1 - tagstudio/src/qt/widgets/preview_panel.py | 37 +++++++++++++++------- tagstudio/src/qt/widgets/thumb_renderer.py | 1 + 4 files changed, 44 insertions(+), 28 deletions(-) diff --git a/requirements.txt b/requirements.txt index f2b7a90c..e1dff2fc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,19 +1,20 @@ -humanfriendly==10.0 -opencv_python>=4.8.0.74,<=4.9.0.80 -Pillow==10.3.0 -PySide6==6.7.1 -PySide6_Addons==6.7.1 -PySide6_Essentials==6.7.1 -typing_extensions>=3.10.0.0,<=4.11.0 -ujson>=5.8.0,<=5.9.0 -numpy==1.26.4 -rawpy==0.21.0 -pillow-heif==0.16.0 chardet==5.2.0 -structlog==24.4.0 -SQLAlchemy==2.0.34 -pydub==0.25.1 +ffmpeg-python==0.2.0 +humanfriendly==10.0 mutagen==1.47.0 numpy==1.26.4 -ffmpeg-python==0.2.0 -vtf2img==0.1.0 +numpy==1.26.4 +opencv_python>=4.8.0.74,<=4.9.0.80 +pillow-heif==0.16.0 +pillow-jxl-plugin==1.2.6 +Pillow==10.3.0 +pydub==0.25.1 +PySide6_Addons==6.7.1 +PySide6_Essentials==6.7.1 +PySide6==6.7.1 +rawpy==0.21.0 +SQLAlchemy==2.0.34 +structlog==24.4.0 +typing_extensions>=3.10.0.0,<=4.11.0 +ujson>=5.8.0,<=5.9.0 +vtf2img==0.1.0 \ No newline at end of file diff --git a/tagstudio/src/core/media_types.py b/tagstudio/src/core/media_types.py index c07299a7..b88921f3 100644 --- a/tagstudio/src/core/media_types.py +++ b/tagstudio/src/core/media_types.py @@ -193,7 +193,6 @@ class MediaCategories: ".apng", ".gif", ".webp", - ".jxl", } _IMAGE_RAW_SET: set[str] = { ".arw", diff --git a/tagstudio/src/qt/widgets/preview_panel.py b/tagstudio/src/qt/widgets/preview_panel.py index 7d055a3a..90a26265 100644 --- a/tagstudio/src/qt/widgets/preview_panel.py +++ b/tagstudio/src/qt/widgets/preview_panel.py @@ -1,6 +1,8 @@ # Copyright (C) 2024 Travis Abendshien (CyanVoxel). # Licensed under the GPL-3.0 License. # Created for TagStudio: https://github.com/CyanVoxel/TagStudio + +import io import os import platform import sys @@ -601,19 +603,32 @@ class PreviewPanel(QWidget): # TODO: Do this all somewhere else, this is just here temporarily. ext: str = filepath.suffix.lower() try: - if filepath.suffix.lower() in [".gif"]: - with open(filepath, mode="rb") as file: - if self.preview_gif.movie(): - self.preview_gif.movie().stop() - self.gif_buffer.close() + if MediaCategories.is_ext_in_category( + ext, MediaCategories.IMAGE_ANIMATED_TYPES, mime_fallback=True + ): + if self.preview_gif.movie(): + self.preview_gif.movie().stop() + self.gif_buffer.close() - ba = file.read() - self.gif_buffer.setData(ba) - movie = QMovie(self.gif_buffer, QByteArray()) - self.preview_gif.setMovie(movie) - movie.start() + image: Image.Image = Image.open(filepath) + anim_image: Image.Image = image + image_bytes_io: io.BytesIO = io.BytesIO() + anim_image.save( + image_bytes_io, + "GIF", + lossless=True, + save_all=True, + loop=0, + disposal=2, + ) + image_bytes_io.seek(0) + ba: bytes = image_bytes_io.read() + + self.gif_buffer.setData(ba) + movie = QMovie(self.gif_buffer, QByteArray()) + self.preview_gif.setMovie(movie) + movie.start() - image = Image.open(str(filepath)) self.resizeEvent( QResizeEvent( QSize(image.width, image.height), diff --git a/tagstudio/src/qt/widgets/thumb_renderer.py b/tagstudio/src/qt/widgets/thumb_renderer.py index 348ab66b..be5d8899 100644 --- a/tagstudio/src/qt/widgets/thumb_renderer.py +++ b/tagstudio/src/qt/widgets/thumb_renderer.py @@ -12,6 +12,7 @@ from pathlib import Path import cv2 import numpy as np +import pillow_jxl # noqa: F401 import rawpy import structlog from mutagen import MutagenError, flac, id3, mp4 From d75729b578ee6f6c9b8f3826fd8d252477e7f6ef Mon Sep 17 00:00:00 2001 From: python357-1 <30739625+python357-1@users.noreply.github.com> Date: Fri, 8 Nov 2024 13:07:51 -0600 Subject: [PATCH 30/82] docs: update CONTRIBUTING.md ruff instructions (#581) * docs: add warning about ruff on linux * Update CONTRIBUTING.md Co-authored-by: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> --------- Co-authored-by: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> --- CONTRIBUTING.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 67a0019f..db6d7fa7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -92,8 +92,12 @@ A Python linter and code formatter. Ruff uses the `pyproject.toml` as its config #### Running Locally -- Lint code by moving into the `/tagstudio` directory with `cd tagstudio` and running `ruff --config ../pyproject.toml`. -- Format code with `ruff format` inside the repository directory +Inside the root repository directory: +- Lint code with `ruff check` + - Some linting suggestions can be automatically formatted with `ruff check --fix` +- Format code with `ruff format` + +Ruff should automatically discover the configuration options inside the [pyproject.toml](https://github.com/TagStudioDev/TagStudio/blob/main/pyproject.toml) file. For more information, see the [ruff configuration discovery docs](https://docs.astral.sh/ruff/configuration/#config-file-discovery). Ruff is also available as a VS Code [extension](https://marketplace.visualstudio.com/items?itemName=charliermarsh.ruff), PyCharm [plugin](https://plugins.jetbrains.com/plugin/20574-ruff), and [more](https://docs.astral.sh/ruff/integrations/). From fb7ad928af8bcea338dc57878d6ce024429b11e6 Mon Sep 17 00:00:00 2001 From: Travis Abendshien Date: Mon, 11 Nov 2024 11:13:44 -0800 Subject: [PATCH 31/82] docs(roadmap): add translations to v9.5 --- docs/updates/roadmap.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/updates/roadmap.md b/docs/updates/roadmap.md index c2829a19..e372c716 100644 --- a/docs/updates/roadmap.md +++ b/docs/updates/roadmap.md @@ -157,6 +157,7 @@ These version milestones are rough estimations for when the previous core featur ### 9.5 (Alpha) - [ ] SQL backend [HIGH] +- [ ] Translations _(Any applicable)_ [MEDIUM] - [ ] Multiple Root Directories per Library [HIGH] - [ ] Tags [HIGH] - [ ] Deleting Tags [HIGH] From 97e0e80f6f48adef5be74d73f4810d3b0db6b335 Mon Sep 17 00:00:00 2001 From: python357-1 <30739625+python357-1@users.noreply.github.com> Date: Thu, 14 Nov 2024 15:52:00 -0600 Subject: [PATCH 32/82] feat: add filetype and mediatype searches (#575) * feat: add filetype and mediatype searches * style: fix some style issues * fix: parametrize mediatype and filetype tests * style: fix remaining unordered import * style: fix pytest parametrize calls * feat: add human-readable names to mediacategories * feat: use human-readable names in mediacategory: search * feat: add human-readable name to open document * fix: fix returning multiple filetypes issue and add regression test --- tagstudio/src/core/library/alchemy/enums.py | 8 +++++ tagstudio/src/core/library/alchemy/library.py | 13 ++++++++ tagstudio/src/core/media_types.py | 31 +++++++++++++++++++ tagstudio/tests/conftest.py | 31 +++++++++++++++++++ tagstudio/tests/test_library.py | 18 +++++++++++ 5 files changed, 101 insertions(+) diff --git a/tagstudio/src/core/library/alchemy/enums.py b/tagstudio/src/core/library/alchemy/enums.py index aaf9d32a..ce525019 100644 --- a/tagstudio/src/core/library/alchemy/enums.py +++ b/tagstudio/src/core/library/alchemy/enums.py @@ -77,6 +77,9 @@ class FilterState: path: Path | str | None = None # file name name: str | None = None + # file type + filetype: str | None = None + mediatype: str | None = None # a generic query to be parsed query: str | None = None @@ -87,6 +90,7 @@ class FilterState: # parse the value if ":" in query: kind, _, value = query.partition(":") + value = value.replace('"', "") else: # default to tag search kind, value = "tag", query @@ -101,6 +105,10 @@ class FilterState: self.name = value elif kind == "id": self.id = int(self.id) if str(self.id).isnumeric() else self.id + elif kind == "filetype": + self.filetype = value + elif kind == "mediatype": + self.mediatype = value else: self.tag = self.tag and self.tag.strip() diff --git a/tagstudio/src/core/library/alchemy/library.py b/tagstudio/src/core/library/alchemy/library.py index 34267eab..0aed7ce4 100644 --- a/tagstudio/src/core/library/alchemy/library.py +++ b/tagstudio/src/core/library/alchemy/library.py @@ -36,6 +36,7 @@ from ...constants import ( TS_FOLDER_NAME, ) from ...enums import LibraryPrefs +from ...media_types import MediaCategories from .db import make_tables from .enums import FieldTypeEnum, FilterState, TagColor from .fields import ( @@ -438,6 +439,18 @@ class Library: ) elif search.path: statement = statement.where(Entry.path.ilike(f"%{search.path}%")) + elif search.filetype: + statement = statement.where(Entry.suffix.ilike(f"{search.filetype}")) + elif search.mediatype: + extensions: set[str] = set[str]() + for media_cat in MediaCategories.ALL_CATEGORIES: + if search.mediatype == media_cat.name: + extensions = extensions | media_cat.extensions + break + # just need to map it to search db - suffixes do not have '.' + statement = statement.where( + Entry.suffix.in_(map(lambda x: x.replace(".", ""), extensions)) + ) extensions = self.prefs(LibraryPrefs.EXTENSION_LIST) is_exclude_list = self.prefs(LibraryPrefs.IS_EXCLUDE_LIST) diff --git a/tagstudio/src/core/media_types.py b/tagstudio/src/core/media_types.py index b88921f3..78755aac 100644 --- a/tagstudio/src/core/media_types.py +++ b/tagstudio/src/core/media_types.py @@ -62,6 +62,7 @@ class MediaCategory: media_type: MediaType extensions: set[str] + name: str is_iana: bool = False @@ -338,151 +339,181 @@ class MediaCategories: media_type=MediaType.ADOBE_PHOTOSHOP, extensions=_ADOBE_PHOTOSHOP_SET, is_iana=False, + name="photoshop", ) AFFINITY_PHOTO_TYPES: MediaCategory = MediaCategory( media_type=MediaType.AFFINITY_PHOTO, extensions=_AFFINITY_PHOTO_SET, is_iana=False, + name="affinity photo", ) ARCHIVE_TYPES: MediaCategory = MediaCategory( media_type=MediaType.ARCHIVE, extensions=_ARCHIVE_SET, is_iana=False, + name="archive", ) AUDIO_MIDI_TYPES: MediaCategory = MediaCategory( media_type=MediaType.AUDIO_MIDI, extensions=_AUDIO_MIDI_SET, is_iana=False, + name="audio midi", ) AUDIO_TYPES: MediaCategory = MediaCategory( media_type=MediaType.AUDIO, extensions=_AUDIO_SET | _AUDIO_MIDI_SET, is_iana=True, + name="audio", ) BLENDER_TYPES: MediaCategory = MediaCategory( media_type=MediaType.BLENDER, extensions=_BLENDER_SET, is_iana=False, + name="blender", ) DATABASE_TYPES: MediaCategory = MediaCategory( media_type=MediaType.DATABASE, extensions=_DATABASE_SET, is_iana=False, + name="database", ) DISK_IMAGE_TYPES: MediaCategory = MediaCategory( media_type=MediaType.DISK_IMAGE, extensions=_DISK_IMAGE_SET, is_iana=False, + name="disk image", ) DOCUMENT_TYPES: MediaCategory = MediaCategory( media_type=MediaType.DOCUMENT, extensions=_DOCUMENT_SET, is_iana=False, + name="document", ) EBOOK_TYPES: MediaCategory = MediaCategory( media_type=MediaType.EBOOK, extensions=_EBOOK_SET, is_iana=False, + name="ebook", ) FONT_TYPES: MediaCategory = MediaCategory( media_type=MediaType.FONT, extensions=_FONT_SET, is_iana=True, + name="font", ) IMAGE_ANIMATED_TYPES: MediaCategory = MediaCategory( media_type=MediaType.IMAGE_ANIMATED, extensions=_IMAGE_ANIMATED_SET, is_iana=False, + name="animated image", ) IMAGE_RAW_TYPES: MediaCategory = MediaCategory( media_type=MediaType.IMAGE_RAW, extensions=_IMAGE_RAW_SET, is_iana=False, + name="raw image", ) IMAGE_VECTOR_TYPES: MediaCategory = MediaCategory( media_type=MediaType.IMAGE_VECTOR, extensions=_IMAGE_VECTOR_SET, is_iana=False, + name="vector image", ) IMAGE_RASTER_TYPES: MediaCategory = MediaCategory( media_type=MediaType.IMAGE, extensions=_IMAGE_RASTER_SET, is_iana=False, + name="raster image", ) IMAGE_TYPES: MediaCategory = MediaCategory( media_type=MediaType.IMAGE, extensions=_IMAGE_RASTER_SET | _IMAGE_RAW_SET | _IMAGE_VECTOR_SET, is_iana=True, + name="image", ) INSTALLER_TYPES: MediaCategory = MediaCategory( media_type=MediaType.INSTALLER, extensions=_INSTALLER_SET, is_iana=False, + name="installer", ) MATERIAL_TYPES: MediaCategory = MediaCategory( media_type=MediaType.MATERIAL, extensions=_MATERIAL_SET, is_iana=False, + name="material", ) MODEL_TYPES: MediaCategory = MediaCategory( media_type=MediaType.MODEL, extensions=_MODEL_SET, is_iana=True, + name="model", ) OPEN_DOCUMENT_TYPES: MediaCategory = MediaCategory( media_type=MediaType.OPEN_DOCUMENT, extensions=_OPEN_DOCUMENT_SET, is_iana=False, + name="open document", ) PACKAGE_TYPES: MediaCategory = MediaCategory( media_type=MediaType.PACKAGE, extensions=_PACKAGE_SET, is_iana=False, + name="package", ) PDF_TYPES: MediaCategory = MediaCategory( media_type=MediaType.PDF, extensions=_PDF_SET, is_iana=False, + name="pdf", ) PLAINTEXT_TYPES: MediaCategory = MediaCategory( media_type=MediaType.PLAINTEXT, extensions=_PLAINTEXT_SET, is_iana=False, + name="plaintext", ) PRESENTATION_TYPES: MediaCategory = MediaCategory( media_type=MediaType.PRESENTATION, extensions=_PRESENTATION_SET, is_iana=False, + name="presentation", ) PROGRAM_TYPES: MediaCategory = MediaCategory( media_type=MediaType.PROGRAM, extensions=_PROGRAM_SET, is_iana=False, + name="program", ) SHORTCUT_TYPES: MediaCategory = MediaCategory( media_type=MediaType.SHORTCUT, extensions=_SHORTCUT_SET, is_iana=False, + name="shortcut", ) SOURCE_ENGINE_TYPES: MediaCategory = MediaCategory( media_type=MediaType.SOURCE_ENGINE, extensions=_SOURCE_ENGINE_SET, is_iana=False, + name="source engine", ) SPREADSHEET_TYPES: MediaCategory = MediaCategory( media_type=MediaType.SPREADSHEET, extensions=_SPREADSHEET_SET, is_iana=False, + name="spreadsheet", ) TEXT_TYPES: MediaCategory = MediaCategory( media_type=MediaType.TEXT, extensions=_DOCUMENT_SET | _PLAINTEXT_SET, is_iana=True, + name="text", ) VIDEO_TYPES: MediaCategory = MediaCategory( media_type=MediaType.VIDEO, extensions=_VIDEO_SET, is_iana=True, + name="video", ) ALL_CATEGORIES: list[MediaCategory] = [ diff --git a/tagstudio/tests/conftest.py b/tagstudio/tests/conftest.py index efcc2c66..39c3f753 100644 --- a/tagstudio/tests/conftest.py +++ b/tagstudio/tests/conftest.py @@ -21,6 +21,37 @@ def cwd(): return CWD +@pytest.fixture +def file_mediatypes_library(): + lib = Library() + + status = lib.open_library(pathlib.Path(""), ":memory:") + assert status.success + + entry1 = Entry( + folder=lib.folder, + path=pathlib.Path("foo.png"), + fields=lib.default_fields, + ) + + entry2 = Entry( + folder=lib.folder, + path=pathlib.Path("bar.png"), + fields=lib.default_fields, + ) + + entry3 = Entry( + folder=lib.folder, + path=pathlib.Path("baz.apng"), + fields=lib.default_fields, + ) + + assert lib.add_entries([entry1, entry2, entry3]) + assert len(lib.tags) == 2 + + return lib + + @pytest.fixture def library(request): # when no param is passed, use the default diff --git a/tagstudio/tests/test_library.py b/tagstudio/tests/test_library.py index 81f26690..db28a72a 100644 --- a/tagstudio/tests/test_library.py +++ b/tagstudio/tests/test_library.py @@ -401,3 +401,21 @@ def test_library_prefs_multiple_identical_vals(): # accessing .value should raise exception with pytest.raises(AttributeError): assert TestPrefs.BAR.value + + +@pytest.mark.parametrize(["filetype", "num_of_filetype"], [("md", 1), ("txt", 1), ("png", 0)]) +def test_filetype_search(library, filetype, num_of_filetype): + results = library.search_library(FilterState(filetype=filetype)) + assert len(results.items) == num_of_filetype + + +@pytest.mark.parametrize(["filetype", "num_of_filetype"], [("png", 2), ("apng", 1), ("ng", 0)]) +def test_filetype_return_one_filetype(file_mediatypes_library, filetype, num_of_filetype): + results = file_mediatypes_library.search_library(FilterState(filetype=filetype)) + assert len(results.items) == num_of_filetype + + +@pytest.mark.parametrize(["mediatype", "num_of_mediatype"], [("plaintext", 2), ("image", 0)]) +def test_mediatype_search(library, mediatype, num_of_mediatype): + results = library.search_library(FilterState(mediatype=mediatype)) + assert len(results.items) == num_of_mediatype From fd0df94830c3550b63625259b0c57f7bc4022280 Mon Sep 17 00:00:00 2001 From: python357-1 <30739625+python357-1@users.noreply.github.com> Date: Thu, 14 Nov 2024 16:02:34 -0600 Subject: [PATCH 33/82] feat: make path search use globs (#582) * feat: make path search use globs * fix: specify types in path search * chore: format with ruff --- tagstudio/src/core/library/alchemy/library.py | 3 ++- tagstudio/tests/qt/test_qt_driver.py | 2 +- tagstudio/tests/test_library.py | 20 ++++++++++++++++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/tagstudio/src/core/library/alchemy/library.py b/tagstudio/src/core/library/alchemy/library.py index 0aed7ce4..3a1a7678 100644 --- a/tagstudio/src/core/library/alchemy/library.py +++ b/tagstudio/src/core/library/alchemy/library.py @@ -438,7 +438,8 @@ class Library: ) ) elif search.path: - statement = statement.where(Entry.path.ilike(f"%{search.path}%")) + search_str = str(search.path).replace("*", "%") + statement = statement.where(Entry.path.ilike(search_str)) elif search.filetype: statement = statement.where(Entry.suffix.ilike(f"{search.filetype}")) elif search.mediatype: diff --git a/tagstudio/tests/qt/test_qt_driver.py b/tagstudio/tests/qt/test_qt_driver.py index e032b3fb..d405030c 100644 --- a/tagstudio/tests/qt/test_qt_driver.py +++ b/tagstudio/tests/qt/test_qt_driver.py @@ -94,7 +94,7 @@ def test_library_state_update(qt_driver): assert list(entry.tags)[0].name == "foo" # When state property is changed, previous one is overwritten - state = FilterState(path="bar.md") + state = FilterState(path="*bar.md") qt_driver.filter_items(state) assert len(qt_driver.frame_content) == 1 entry = qt_driver.frame_content[0] diff --git a/tagstudio/tests/test_library.py b/tagstudio/tests/test_library.py index db28a72a..24e4d9b9 100644 --- a/tagstudio/tests/test_library.py +++ b/tagstudio/tests/test_library.py @@ -3,7 +3,7 @@ from tempfile import TemporaryDirectory import pytest from src.core.enums import DefaultEnum, LibraryPrefs -from src.core.library.alchemy import Entry +from src.core.library.alchemy import Entry, Library from src.core.library.alchemy.enums import FilterState from src.core.library.alchemy.fields import TextField, _FieldID @@ -403,6 +403,24 @@ def test_library_prefs_multiple_identical_vals(): assert TestPrefs.BAR.value +def test_path_search_glob_after(library: Library): + results = library.search_library(FilterState(path="foo*")) + assert results.total_count == 1 + assert len(results.items) == 1 + + +def test_path_search_glob_in_front(library: Library): + results = library.search_library(FilterState(path="*bar.md")) + assert results.total_count == 1 + assert len(results.items) == 1 + + +def test_path_search_glob_both_sides(library: Library): + results = library.search_library(FilterState(path="*one/two*")) + assert results.total_count == 1 + assert len(results.items) == 1 + + @pytest.mark.parametrize(["filetype", "num_of_filetype"], [("md", 1), ("txt", 1), ("png", 0)]) def test_filetype_search(library, filetype, num_of_filetype): results = library.search_library(FilterState(filetype=filetype)) From 139836d9c871aa98a606d30b8cbd4380b43ad249 Mon Sep 17 00:00:00 2001 From: yed Date: Fri, 15 Nov 2024 10:55:16 +0700 Subject: [PATCH 34/82] fix: stop thumbnail jobs when closing library (#583) --- tagstudio/src/qt/ts_qt.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index e80aa84e..a63e970e 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -586,6 +586,7 @@ class QtDriver(DriverMixin, QObject): self.lib.close() + self.thumb_job_queue.queue.clear() if is_shutdown: # no need to do other things on shutdown return From f9ef76c2e132067b8030968d0f1291d333ed5908 Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Sun, 17 Nov 2024 16:35:30 -0800 Subject: [PATCH 35/82] add `.idea/` to `.gitignore` --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index c04f546f..0868bb86 100644 --- a/.gitignore +++ b/.gitignore @@ -163,7 +163,7 @@ cython_debug/ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ +.idea/ ### Python Patch ### # Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration From 9078feec0cef9e157b1c0a4808be2fe67f930fc8 Mon Sep 17 00:00:00 2001 From: Justine Akehurst <31110637+jakehurst@users.noreply.github.com> Date: Sun, 17 Nov 2024 22:03:51 -0800 Subject: [PATCH 36/82] fix(docs): fix link to feature roadmap page (#594) --- CONTRIBUTING.md | 6 +++--- README.md | 2 +- docs/index.md | 2 +- docs/updates/roadmap.md | 2 +- mkdocs.yml | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index db6d7fa7..cdd8e3fb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,14 +11,14 @@ Thank you so much for showing interest in contributing to TagStudio! Here are a ## Getting Started -- Check the [Planned Features](https://github.com/TagStudioDev/TagStudio/blob/main/docs/updates/planned_features.md) page, [FAQ](/README.md/#faq), as well as the open [Issues](https://github.com/TagStudioDev/TagStudio/issues) and [Pull Requests](https://github.com/TagStudioDev/TagStudio/pulls). -- If you'd like to add a feature that isn't on the roadmap or doesn't have an open issue, **PLEASE create a feature request** issue for it discussing your intentions so any feedback or important information can be given by the team first. +- Check the [Feature Roadmap](https://github.com/TagStudioDev/TagStudio/blob/main/docs/updates/roadmap.md) page, [FAQ](/README.md/#faq), as well as the open [Issues](https://github.com/TagStudioDev/TagStudio/issues) and [Pull Requests](https://github.com/TagStudioDev/TagStudio/pulls). +- If you'd like to add a feature that isn't on the feature roadmap or doesn't have an open issue, **PLEASE create a feature request** issue for it discussing your intentions so any feedback or important information can be given by the team first. - We don't want you wasting time developing a feature or making a change that can't/won't be added for any reason ranging from pre-existing refactors to design philosophy differences. - If you wish to discuss TagStudio further, feel free to join the [Discord server](https://discord.com/invite/hRNnVKhF2G) ### Contribution Checklist -- I've read the [Planned Features](https://github.com/TagStudioDev/TagStudio/blob/main/docs/updates/planned_features.md) page +- I've read the [Feature Roadmap](https://github.com/TagStudioDev/TagStudio/blob/main/docs/updates/roadmap.md) page - I've read the [FAQ](/README.md/#faq), including the "[Features I Likely Won't Add/Pull](/README.md/#features-i-likely-wont-addpull)" section - I've checked the open [Issues](https://github.com/TagStudioDev/TagStudio/issues) and [Pull Requests](https://github.com/TagStudioDev/TagStudio/pulls) - **I've created a new issue for my feature _before_ starting work on it**, or have at least notified others in the relevant existing issue(s) of my intention to work on it diff --git a/README.md b/README.md index 3d26790b..bb0d5b28 100644 --- a/README.md +++ b/README.md @@ -190,7 +190,7 @@ As of writing (Alpha v9.3.0) the project is in a useable state, however it lacks ### What Features Are You Planning on Adding? > [!IMPORTANT] -> See the [Roadmap](/docs/updates/roadmap.md) documentation for the latest feature lists. The lists here are currently being migrated over there with individual pages for larger features. +> See the [Feature Roadmap](/docs/updates/roadmap.md) documentation for the latest feature lists. The lists here are currently being migrated over there with individual pages for larger features. Of the several features I have planned for the project, these are broken up into “priority” features and “future” features. Priority features were originally intended for the first public release, however are currently absent from the Alpha v9.x.x builds. diff --git a/docs/index.md b/docs/index.md index 16cefdec..0337398e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -33,7 +33,7 @@ TagStudio is a photo & file organization application with an underlying system t ## Feature Roadmap -The [feature roadmap](updates/roadmap.md) lists all of the planned core features for TagStudio to be considered "feature complete" along with estimated release milestones. The development and testing of these features takes priority over all other requested or submitted features unless they are later added to this roadmap. This helps ensure that TagStudio eventually sees a full release and becomes more usable by more people more quickly. +The [Feature Roadmap](updates/roadmap.md) lists all of the planned core features for TagStudio to be considered "feature complete" along with estimated release milestones. The development and testing of these features takes priority over all other requested or submitted features unless they are later added to this roadmap. This helps ensure that TagStudio eventually sees a full release and becomes more usable by more people more quickly. ## Current Features diff --git a/docs/updates/roadmap.md b/docs/updates/roadmap.md index e372c716..4ba3f4f8 100644 --- a/docs/updates/roadmap.md +++ b/docs/updates/roadmap.md @@ -1,4 +1,4 @@ -# Roadmap +# Feature Roadmap This checklist details the current and remaining features required at a minimum for TagStudio to be considered “Feature Complete”. This list is _not_ a definitive list for additional feature requests and PRs as they come in, but rather an outline of my personal core feature set intended for TagStudio. diff --git a/mkdocs.yml b/mkdocs.yml index f34800d1..b3c3c8ad 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -47,7 +47,7 @@ extra: # - utilities/macro.md # - Updates: # - updates/changelog.md -# - updates/planned_features.md +# - updates/roadmap.md # - updates/db_migration.md theme: From bec513f558437278f6dc7c0c083876b0a7736d07 Mon Sep 17 00:00:00 2001 From: python357-1 <30739625+python357-1@users.noreply.github.com> Date: Mon, 18 Nov 2024 12:45:51 -0600 Subject: [PATCH 37/82] feat: add autocomplete for search engine (#586) * feat: add autocomplete for mediatype, filetype, path, tag, and tag_id searches * fix: address issues brought up in review * fix: fix mypy issue * fix: fix mypy issues for real this time --- tagstudio/src/core/library/alchemy/library.py | 7 +++ tagstudio/src/qt/main_window.py | 9 ++- tagstudio/src/qt/ts_qt.py | 59 +++++++++++++++++++ 3 files changed, 73 insertions(+), 2 deletions(-) diff --git a/tagstudio/src/core/library/alchemy/library.py b/tagstudio/src/core/library/alchemy/library.py index 3a1a7678..9badbe7a 100644 --- a/tagstudio/src/core/library/alchemy/library.py +++ b/tagstudio/src/core/library/alchemy/library.py @@ -395,6 +395,13 @@ class Library: with Session(self.engine) as session: return session.query(exists().where(Entry.path == path)).scalar() + def get_paths(self, glob: str | None = None) -> list[str]: + with Session(self.engine) as session: + paths = session.scalars(select(Entry.path)).unique() + + path_strings: list[str] = list(map(lambda x: x.as_posix(), paths)) + return path_strings + def search_library( self, search: FilterState, diff --git a/tagstudio/src/qt/main_window.py b/tagstudio/src/qt/main_window.py index d3274c7e..621ed9cf 100644 --- a/tagstudio/src/qt/main_window.py +++ b/tagstudio/src/qt/main_window.py @@ -15,13 +15,13 @@ import logging import typing -from PySide6.QtCore import (QCoreApplication, QMetaObject, QRect,QSize, Qt) +from PySide6.QtCore import (QCoreApplication, QMetaObject, QRect,QSize, Qt, QStringListModel) from PySide6.QtGui import QFont from PySide6.QtWidgets import (QComboBox, QFrame, QGridLayout, QHBoxLayout, QVBoxLayout, QLayout, QLineEdit, QMainWindow, QPushButton, QScrollArea, QSizePolicy, QStatusBar, QWidget, QSplitter, QCheckBox, - QSpacerItem) + QSpacerItem, QCompleter) from src.qt.pagination import Pagination from src.qt.widgets.landing import LandingWidget @@ -167,6 +167,11 @@ class Ui_MainWindow(QMainWindow): font2.setBold(False) self.searchField.setFont(font2) + self.searchFieldCompletionList = QStringListModel() + self.searchFieldCompleter = QCompleter(self.searchFieldCompletionList, self.searchField) + self.searchFieldCompleter.setCaseSensitivity(Qt.CaseSensitivity.CaseInsensitive) + self.searchField.setCompleter(self.searchFieldCompleter) + self.horizontalLayout_2.addWidget(self.searchField) self.searchButton = QPushButton(self.centralwidget) diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index a63e970e..c780a6a6 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -11,6 +11,7 @@ import ctypes import dataclasses import math import os +import re import sys import time import webbrowser @@ -72,6 +73,7 @@ from src.core.library.alchemy.enums import ( ) from src.core.library.alchemy.fields import _FieldID from src.core.library.alchemy.library import LibraryStatus +from src.core.media_types import MediaCategories from src.core.ts_core import TagStudioCore from src.core.utils.refresh_dir import RefreshDirTracker from src.core.utils.web import strip_web_protocol @@ -445,6 +447,8 @@ class QtDriver(DriverMixin, QObject): menu_bar.addMenu(window_menu) menu_bar.addMenu(help_menu) + self.main_window.searchField.textChanged.connect(self.update_completions_list) + self.preview_panel = PreviewPanel(self.lib, self) splitter = self.main_window.splitter splitter.addWidget(self.preview_panel) @@ -949,6 +953,61 @@ class QtDriver(DriverMixin, QObject): def set_macro_menu_viability(self): self.autofill_action.setDisabled(not self.selected) + def update_completions_list(self, text: str) -> None: + matches = re.search(r"(mediatype|filetype|path|tag):(\"?[A-Za-z0-9\ \t]+\"?)?", text) + + completion_list: list[str] = [] + if len(text) < 3: + completion_list = ["mediatype:", "filetype:", "path:", "tag:"] + self.main_window.searchFieldCompletionList.setStringList(completion_list) + + if not matches: + return + + query_type: str + query_value: str | None + query_type, query_value = matches.groups() + + if not query_value: + return + + if query_type == "tag": + completion_list = list(map(lambda x: "tag:" + x.name, self.lib.tags)) + elif query_type == "path": + completion_list = list(map(lambda x: "path:" + x, self.lib.get_paths())) + elif query_type == "mediatype": + single_word_completions = map( + lambda x: "mediatype:" + x.name, + filter(lambda y: " " not in y.name, MediaCategories.ALL_CATEGORIES), + ) + single_word_completions_quoted = map( + lambda x: 'mediatype:"' + x.name + '"', + filter(lambda y: " " not in y.name, MediaCategories.ALL_CATEGORIES), + ) + multi_word_completions = map( + lambda x: 'mediatype:"' + x.name + '"', + filter(lambda y: " " in y.name, MediaCategories.ALL_CATEGORIES), + ) + + all_completions = [ + single_word_completions, + single_word_completions_quoted, + multi_word_completions, + ] + completion_list = [j for i in all_completions for j in i] + elif query_type == "filetype": + extensions_list: set[str] = set() + for media_cat in MediaCategories.ALL_CATEGORIES: + extensions_list = extensions_list | media_cat.extensions + completion_list = list(map(lambda x: "filetype:" + x.replace(".", ""), extensions_list)) + + update_completion_list: bool = ( + completion_list != self.main_window.searchFieldCompletionList.stringList() + or self.main_window.searchFieldCompletionList == [] + ) + if update_completion_list: + self.main_window.searchFieldCompletionList.setStringList(completion_list) + def update_thumbs(self): """Update search thumbnails.""" # start_time = time.time() From 774c886288b1531edd55310468459a29031a66bc Mon Sep 17 00:00:00 2001 From: DandyDev01 <37933054+DandyDev01@users.noreply.github.com> Date: Mon, 18 Nov 2024 16:19:28 -0700 Subject: [PATCH 38/82] fix(ui): update ui when removing fields (#560) --- tagstudio/src/qt/widgets/preview_panel.py | 24 ++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/tagstudio/src/qt/widgets/preview_panel.py b/tagstudio/src/qt/widgets/preview_panel.py index 90a26265..e74d2dc7 100644 --- a/tagstudio/src/qt/widgets/preview_panel.py +++ b/tagstudio/src/qt/widgets/preview_panel.py @@ -68,16 +68,6 @@ if typing.TYPE_CHECKING: logger = structlog.get_logger(__name__) -def update_selected_entry(driver: "QtDriver"): - for grid_idx in driver.selected: - entry = driver.frame_content[grid_idx] - # reload entry - results = driver.lib.search_library(FilterState(id=entry.id)) - logger.info("found item", entries=len(results), grid_idx=grid_idx, lookup_id=entry.id) - assert results, f"Entry not found: {entry.id}" - driver.frame_content[grid_idx] = next(results) - - class PreviewPanel(QWidget): """The Preview Panel Widget.""" @@ -293,6 +283,18 @@ class PreviewPanel(QWidget): root_layout.setContentsMargins(0, 0, 0, 0) root_layout.addWidget(splitter) + def update_selected_entry(self, driver: "QtDriver"): + for grid_idx in driver.selected: + entry = driver.frame_content[grid_idx] + results = self.lib.search_library(FilterState(id=entry.id)) + logger.info( + "found item", + entries=len(results.items), + grid_idx=grid_idx, + lookup_id=entry.id, + ) + self.driver.frame_content[grid_idx] = results[0] + def remove_field_prompt(self, name: str) -> str: return f'Are you sure you want to remove field "{name}"?' @@ -900,7 +902,7 @@ class PreviewPanel(QWidget): prompt=self.remove_field_prompt(field.type.name), callback=lambda: ( self.remove_field(field), - update_selected_entry(self.driver), + self.update_selected_entry(self.driver), # reload entry and its fields self.update_widgets(), ), From 2977e07223de4a58fe5c6964bb3ee3660357cfa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= <88423841+Roc25@users.noreply.github.com> Date: Tue, 19 Nov 2024 02:35:00 +0300 Subject: [PATCH 39/82] ui: select thumb on press instead of click (#556) Co-authored-by: gred --- tagstudio/src/qt/widgets/item_thumb.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tagstudio/src/qt/widgets/item_thumb.py b/tagstudio/src/qt/widgets/item_thumb.py index da82a19d..a6983959 100644 --- a/tagstudio/src/qt/widgets/item_thumb.py +++ b/tagstudio/src/qt/widgets/item_thumb.py @@ -381,9 +381,9 @@ class ItemThumb(FlowWidget): def update_clickable(self, clickable: typing.Callable): """Updates attributes of a thumbnail element.""" if self.thumb_button.is_connected: - self.thumb_button.clicked.disconnect() + self.thumb_button.pressed.disconnect() if clickable: - self.thumb_button.clicked.connect(clickable) + self.thumb_button.pressed.connect(clickable) self.thumb_button.is_connected = True def refresh_badge(self, entry: Entry | None = None): From 7ae2bc24d6ab82586806f2dde271668723c0fc9d Mon Sep 17 00:00:00 2001 From: Coolio Date: Tue, 19 Nov 2024 16:14:34 -0600 Subject: [PATCH 40/82] feat(ui): pre-select default tag name in `BuildTagPanel` (#592) This changes the behavior of the tag name inside `BuildTagPanel` for newly created tags: * The default "New Tag" name is now automatically highlighted * Blank tag names (including spaces) are no longer allowed to be created * NOTE: This does not change the tag name column rules in the db, nor does it necessarily need to *** * [Feature Request]: Make the create tag panel have empty tag name field * [Feature Request]: Make the create tag panel have empty tag name field * Revert "[Feature Request]: Make the create tag panel have empty tag name field" This reverts commit f9c7f5d8892fb70a1618f05554234851a27c7eaa. * [Feature Request]: Make the create tag panel have empty tag name field * Revert "[Feature Request]: Make the create tag panel have empty tag name field" This reverts commit e5df3e0f15a1b97c49390ee6190b906958eddbb1. * Update .gitignore * Updated as per disscussion in issue #591 (DRAFT * Updated as per disscussion in issue #591 (DRAFT * Added formatting * Updated code as per discussion is #592 * Updated code as per discussion is #592 (again) * Fixed spacing * Add placeholder text to name field. Co-authored-by: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> * Use universal red color for red border. Co-authored-by: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> * fix: add `src.core.palette` imports --------- Co-authored-by: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> --- tagstudio/src/qt/modals/build_tag.py | 19 ++++++++++++++++++- tagstudio/src/qt/widgets/panel.py | 6 ++++++ tagstudio/src/qt/widgets/tag_box.py | 0 3 files changed, 24 insertions(+), 1 deletion(-) mode change 100644 => 100755 tagstudio/src/qt/modals/build_tag.py mode change 100644 => 100755 tagstudio/src/qt/widgets/panel.py mode change 100644 => 100755 tagstudio/src/qt/widgets/tag_box.py diff --git a/tagstudio/src/qt/modals/build_tag.py b/tagstudio/src/qt/modals/build_tag.py old mode 100644 new mode 100755 index dc45563c..af779819 --- a/tagstudio/src/qt/modals/build_tag.py +++ b/tagstudio/src/qt/modals/build_tag.py @@ -18,7 +18,7 @@ from PySide6.QtWidgets import ( ) from src.core.library import Library, Tag from src.core.library.alchemy.enums import TagColor -from src.core.palette import ColorType, get_tag_color +from src.core.palette import ColorType, UiColor, get_tag_color, get_ui_color from src.qt.modals.tag_search import TagSearchPanel from src.qt.widgets.panel import PanelModal, PanelWidget from src.qt.widgets.tag import TagWidget @@ -51,6 +51,9 @@ class BuildTagPanel(PanelWidget): self.name_title.setText("Name") self.name_layout.addWidget(self.name_title) self.name_field = QLineEdit() + self.name_field.setFixedHeight(24) + self.name_field.textChanged.connect(self.on_name_changed) + self.name_field.setPlaceholderText("Tag Name (Required)") self.name_layout.addWidget(self.name_field) # Shorthand ------------------------------------------------------------ @@ -162,6 +165,8 @@ class BuildTagPanel(PanelWidget): # TODO - fill subtags self.subtags: set[int] = set() self.set_tag(tag or Tag(name="New Tag")) + if tag is None: + self.name_field.selectAll() def add_subtag_callback(self, tag_id: int): logger.info("add_subtag_callback", tag_id=tag_id) @@ -204,6 +209,18 @@ class BuildTagPanel(PanelWidget): self.tag = tag + def on_name_changed(self): + is_empty = not self.name_field.text().strip() + + self.name_field.setStyleSheet( + f"border: 1px solid {get_ui_color(ColorType.PRIMARY, UiColor.RED)}; border-radius: 2px" + if is_empty + else "" + ) + + if self.panel_save_button is not None: + self.panel_save_button.setDisabled(is_empty) + def build_tag(self) -> Tag: color = self.color_field.currentData() or TagColor.DEFAULT diff --git a/tagstudio/src/qt/widgets/panel.py b/tagstudio/src/qt/widgets/panel.py old mode 100644 new mode 100755 index 8c403a66..d16803c7 --- a/tagstudio/src/qt/widgets/panel.py +++ b/tagstudio/src/qt/widgets/panel.py @@ -54,6 +54,7 @@ class PanelModal(QWidget): self.done_button.clicked.connect(self.hide) if done_callback: self.done_button.clicked.connect(done_callback) + self.widget.panel_done_button = self.done_button self.button_layout.addWidget(self.done_button) if save_callback or has_save: @@ -62,6 +63,7 @@ class PanelModal(QWidget): self.cancel_button.clicked.connect(self.hide) self.cancel_button.clicked.connect(widget.reset) # self.cancel_button.clicked.connect(cancel_callback) + self.widget.panel_cancel_button = self.cancel_button self.button_layout.addWidget(self.cancel_button) self.save_button = QPushButton() @@ -69,6 +71,7 @@ class PanelModal(QWidget): self.save_button.setAutoDefault(True) self.save_button.clicked.connect(self.hide) self.save_button.clicked.connect(self.saved.emit) + self.widget.panel_save_button = self.save_button if done_callback: self.save_button.clicked.connect(done_callback) @@ -93,6 +96,9 @@ class PanelWidget(QWidget): """Used for widgets that go in a modal panel, ex. for editing or searching.""" done = Signal() + panel_save_button: QPushButton | None = None + panel_cancel_button: QPushButton | None = None + panel_done_button: QPushButton | None = None def __init__(self): super().__init__() diff --git a/tagstudio/src/qt/widgets/tag_box.py b/tagstudio/src/qt/widgets/tag_box.py old mode 100644 new mode 100755 From f6a1ca67835a8101e846619e6ea1ae40d227c425 Mon Sep 17 00:00:00 2001 From: Travis Abendshien Date: Tue, 19 Nov 2024 17:54:44 -0800 Subject: [PATCH 41/82] docs: update contribution guidelines --- CONTRIBUTING.md | 176 ++++++++++++++++++++++++++---------------------- 1 file changed, 94 insertions(+), 82 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cdd8e3fb..d65f5f86 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,39 +1,42 @@ # Contributing to TagStudio -_Last Updated: September 8th, 2024_ +_Last Updated: November 19th, 2024_ Thank you so much for showing interest in contributing to TagStudio! Here are a set of instructions and guidelines for contributing code or documentation to the project. This document will change over time, so make sure that your contributions still line up with the requirements here before submitting a pull request. > [!CAUTION] -> **As of Pull Request [#332](https://github.com/TagStudioDev/TagStudio/pull/332) (SQLite Migration) the `main` branch will be an open test bed to get full JSON to SQL parity operational.** Existing TagStudio libraries are not yet compatible with this change, however they will **NOT be corrupted or deleted** if opened with these versions. Once parity is reached and a stable conversion tool in place, this notice will be removed. +> **As of Pull Request [#332](https://github.com/TagStudioDev/TagStudio/pull/332) (SQLite Migration) the `main` branch will marked as experimental before full JSON to SQL parity is operational.** Existing TagStudio libraries are not yet compatible with this change, however they will **NOT be corrupted or deleted** if opened with these versions. Once parity is reached and a stable conversion tool in place, this notice will be removed. UPDATE: As of November 19th, 2024, full parity is rapidly approaching. > > For the most recent stable feature release branch, see the [`Alpha-v9.4`](https://github.com/TagStudioDev/TagStudio/tree/Alpha-v9.4) branch. These v9.4 specific features are currently being backported to the SQL-ized `main` branch. (Feel free to help!) ## Getting Started -- Check the [Feature Roadmap](https://github.com/TagStudioDev/TagStudio/blob/main/docs/updates/roadmap.md) page, [FAQ](/README.md/#faq), as well as the open [Issues](https://github.com/TagStudioDev/TagStudio/issues) and [Pull Requests](https://github.com/TagStudioDev/TagStudio/pulls). -- If you'd like to add a feature that isn't on the feature roadmap or doesn't have an open issue, **PLEASE create a feature request** issue for it discussing your intentions so any feedback or important information can be given by the team first. - - We don't want you wasting time developing a feature or making a change that can't/won't be added for any reason ranging from pre-existing refactors to design philosophy differences. -- If you wish to discuss TagStudio further, feel free to join the [Discord server](https://discord.com/invite/hRNnVKhF2G) +- Check the [Feature Roadmap](/docs/updates/roadmap.md) page to see what priority features there are, the [FAQ](/README.md/#faq), as well as the open [Issues](https://github.com/TagStudioDev/TagStudio/issues) and [Pull Requests](https://github.com/TagStudioDev/TagStudio/pulls). +- If you'd like to add a feature that isn't on the feature roadmap or doesn't have an open issue, **PLEASE create a feature request** issue for it discussing your intentions so any feedback or important information can be given by the team first. + - We don't want you wasting time developing a feature or making a change that can't/won't be added for any reason ranging from pre-existing refactors to design philosophy differences. +- If you wish to discuss TagStudio further, feel free to join the [Discord Server](https://discord.com/invite/hRNnVKhF2G) ### Contribution Checklist -- I've read the [Feature Roadmap](https://github.com/TagStudioDev/TagStudio/blob/main/docs/updates/roadmap.md) page -- I've read the [FAQ](/README.md/#faq), including the "[Features I Likely Won't Add/Pull](/README.md/#features-i-likely-wont-addpull)" section -- I've checked the open [Issues](https://github.com/TagStudioDev/TagStudio/issues) and [Pull Requests](https://github.com/TagStudioDev/TagStudio/pulls) -- **I've created a new issue for my feature _before_ starting work on it**, or have at least notified others in the relevant existing issue(s) of my intention to work on it -- I've set up my development environment including Ruff and Mypy -- I've read the [Code Guidelines](#code-guidelines) and/or [Documentation Guidelines](#documentation-guidelines) -- **_I mean it, I've found or created a new issue for my feature!_** +- I've read the [Feature Roadmap](/docs/updates/roadmap.md) page +- I've read the [FAQ](/README.md/#faq), including the "[Features I Likely Won't Add/Pull](/README.md/#features-i-likely-wont-addpull)" section +- I've checked the open [Issues](https://github.com/TagStudioDev/TagStudio/issues) and [Pull Requests](https://github.com/TagStudioDev/TagStudio/pulls) +- **I've created a new issue for my feature/fix _before_ starting work on it**, or have at least notified others in the relevant existing issue(s) of my intention to work on it +- I've set up my development environment including Ruff, Mypy, and PyTest +- I've read the [Code Guidelines](#code-guidelines) and/or [Documentation Guidelines](#documentation-guidelines) +- **_I mean it, I've found or created an issue for my feature/fix!_** + +> [!NOTE] +> If the fix is small and self-explanatory (i.e. a typo), then it doesn't require an issue to be opened first. Issue tracking is supposed to make our lives easier, not harder. Please use your best judgement to minimize the amount of work involved for everyone involved. ## Creating a Development Environment ### Prerequisites -- [Python](https://www.python.org/downloads/) 3.12 -- [Ruff](https://github.com/astral-sh/ruff) (Included in `requirements-dev.txt`) -- [Mypy](https://github.com/python/mypy) (Included in `requirements-dev.txt`) -- [PyTest](https://docs.pytest.org) (Included in `requirements-dev.txt`) +- [Python](https://www.python.org/downloads/) 3.12 +- [Ruff](https://github.com/astral-sh/ruff) (Included in `requirements-dev.txt`) +- [Mypy](https://github.com/python/mypy) (Included in `requirements-dev.txt`) +- [PyTest](https://docs.pytest.org) (Included in `requirements-dev.txt`) ### Creating a Python Virtual Environment @@ -49,35 +52,36 @@ If you wish to launch the source version of TagStudio outside of your IDE: `python3 -m venv .venv` 2. Activate your environment: -- Windows w/Powershell: `.venv\Scripts\Activate.ps1` -- Windows w/Command Prompt: `.venv\Scripts\activate.bat` -- Linux/macOS: `source .venv/bin/activate` +- Windows w/Powershell: `.venv\Scripts\Activate.ps1` +- Windows w/Command Prompt: `.venv\Scripts\activate.bat` +- Linux/macOS: `source .venv/bin/activate` 3. Install the required packages: -- `pip install -r requirements.txt` -- If developing (includes Ruff and Mypy): `pip install -r requirements-dev.txt` +- `pip install -r requirements.txt` +- If developing (includes Ruff and Mypy): `pip install -r requirements-dev.txt` _Learn more about setting up a virtual environment [here](https://docs.python.org/3/tutorial/venv.html)._ ### Manually Launching (Outside of an IDE) -- **Windows** (start_win.bat) +- **Windows** (start_win.bat) - - To launch TagStudio, launch the `start_win.bat` file. You can modify this .bat file or create a shortcut and add one or more additional arguments if desired. + - To launch TagStudio, launch the `start_win.bat` file. You can modify this .bat file or create a shortcut and add one or more additional arguments if desired. -- **Linux/macOS** (TagStudio.sh) +- **Linux/macOS** (TagStudio.sh) - - Run the "TagStudio.sh" script and the program should launch! (Make sure that the script is marked as executable if on Linux). Note that launching from the script from outside of a terminal will not launch a terminal window with any debug or crash information. If you wish to see this information, just launch the shell script directly from your terminal with `./TagStudio.sh`. + - Run the "TagStudio.sh" script and the program should launch! (Make sure that the script is marked as executable if on Linux). Note that launching from the script from outside of a terminal will not launch a terminal window with any debug or crash information. If you wish to see this information, just launch the shell script directly from your terminal with `./TagStudio.sh`. - - **NixOS** (Nix Flake) - > [!WARNING] - > Support for NixOS is still a work in progress. - - Use the provided [Flake](https://nixos.wiki/wiki/Flakes) to create and enter a working environment by running `nix develop`. Then, run the program via `python3 tagstudio/tag_studio.py` from the root directory. + - **NixOS** (Nix Flake) + - Use the provided [Flake](https://nixos.wiki/wiki/Flakes) to create and enter a working environment by running `nix develop`. Then, run the program via `python3 tagstudio/tag_studio.py` from the root directory. -- **Any** (No Scripts) +> [!WARNING] +> Support for NixOS is still a work in progress. - - Alternatively, with the virtual environment loaded, run the python file at `tagstudio\tag_studio.py` from your terminal. If you're in the project's root directory, simply run `python3 tagstudio/tag_studio.py`. +- **Any** (No Scripts) + + - Alternatively, with the virtual environment loaded, run the python file at `tagstudio\tag_studio.py` from your terminal. If you're in the project's root directory, simply run `python3 tagstudio/tag_studio.py`. ## Workflow Checks @@ -93,9 +97,10 @@ A Python linter and code formatter. Ruff uses the `pyproject.toml` as its config #### Running Locally Inside the root repository directory: -- Lint code with `ruff check` - - Some linting suggestions can be automatically formatted with `ruff check --fix` -- Format code with `ruff format` + +- Lint code with `ruff check` + - Some linting suggestions can be automatically formatted with `ruff check --fix` +- Format code with `ruff format` Ruff should automatically discover the configuration options inside the [pyproject.toml](https://github.com/TagStudioDev/TagStudio/blob/main/pyproject.toml) file. For more information, see the [ruff configuration discovery docs](https://docs.astral.sh/ruff/configuration/#config-file-discovery). @@ -107,72 +112,79 @@ Mypy is a static type checker for Python. It sure has a lot to say sometimes, bu #### Running Locally -- **First time only:** Move into the `/tagstudio` directory with `cd tagstudio` and run the following: - - `mkdir -p .mypy_cache` - - `mypy --install-types --non-interactive` -- Check code by moving into the `/tagstudio` directory with `cd tagstudio` _(if you aren't already inside)_ and running `mypy --config-file ../pyproject.toml .`. _(Don't forget the `.` at the end!)_ - -> [!CAUTION] -> There's a known issue between PySide v6.6.3 and Mypy where Mypy will detect issues with the `.pyi` files inside of PySide and prematurely stop checking files. This issue is not present in PySide v6.6.2, which _should_ be compatible with everything else if you wish to try using that version in the meantime. +- **First time only:** Move into the `/tagstudio` directory with `cd tagstudio` and run the following: + - `mkdir -p .mypy_cache` + - `mypy --install-types --non-interactive` +- Check code by moving into the `/tagstudio` directory with `cd tagstudio` _(if you aren't already inside)_ and running `mypy --config-file ../pyproject.toml .`. _(Don't forget the `.` at the end!)_ Mypy is also available as a VS Code [extension](https://marketplace.visualstudio.com/items?itemName=matangover.mypy), PyCharm [plugin](https://plugins.jetbrains.com/plugin/11086-mypy), and [more](https://plugins.jetbrains.com/plugin/11086-mypy). ### PyTest -- Run all tests by moving into the `/tagstudio` directory with `cd tagstudio` and running `pytest tests/`. +- Run all tests by moving into the `/tagstudio` directory with `cd tagstudio` and running `pytest tests/`. -## Code Guidelines - -### Style +## Code Style Most of the style guidelines can be checked, fixed, and enforced via Ruff. Older code may not be adhering to all of these guidelines, in which case _"do as I say, not as I do"..._ -- Do your best to write clear, concise, and modular code. -- Try to keep a maximum column with of no more than **100** characters. -- Code comments should be used to help describe sections of code that don't speak for themselves. -- Use [Google style](https://google.github.io/styleguide/pyguide.html#s3.8-comments-and-docstrings) docstrings for any classes and functions you add. - - If you're modifying an existing function that does _not_ have docstrings, you don't _have_ to add docstrings to it... but it would be pretty cool if you did ;) -- Imports should be ordered alphabetically (in newly created python files). -- When writing text for window titles, form titles, or dropdown options, use "[Title Case](https://apastyle.apa.org/style-grammar-guidelines/capitalization/title-case)" capitalization. Your IDE may have a command to format this for you automatically, although some may incorrectly capitalize short prepositions. In a pinch you can use a website such as [capitalizemytitle.com](https://capitalizemytitle.com/) to check. -- If it wasn't mentioned above, then stick to [**PEP-8**](https://peps.python.org/pep-0008/)! - > [!WARNING] - > Column width limits, docstring formatting, and import sorting aren't currently checked in the Ruff workflow but likely will be in the near future. +- Do your best to write clear, concise, and modular code. +- Keep a maximum column with of no more than **100** characters. +- Code comments should be used to help describe sections of code that can't speak for themselves. +- Use [Google style](https://google.github.io/styleguide/pyguide.html#s3.8-comments-and-docstrings) docstrings for any classes and functions you add. + - If you're modifying an existing function that does _not_ have docstrings, you don't _have_ to add docstrings to it... but it would be pretty cool if you did ;) +- Imports should be ordered alphabetically. +- Lists of values should be ordered using their [natural sort order](https://en.wikipedia.org/wiki/Natural_sort_order). + - Some files have their methods ordered alphabetically as well (i.e. [`thumb_renderer`](https://github.com/TagStudioDev/TagStudio/blob/main/tagstudio/src/qt/widgets/thumb_renderer.py)). If you're working in a file and notice this, please try and keep to the pattern. +- When writing text for window titles or form titles, use "[Title Case](https://apastyle.apa.org/style-grammar-guidelines/capitalization/title-case)" capitalization. Your IDE may have a command to format this for you automatically, although some may incorrectly capitalize short prepositions. In a pinch you can use a website such as [capitalizemytitle.com](https://capitalizemytitle.com/) to check. +- If it wasn't mentioned above, then stick to [**PEP-8**](https://peps.python.org/pep-0008/)! -### Implementations +### Modules & Implementations -- Avoid direct calls to `os` - - Use `Pathlib` library instead of `os.path` - - Use `sys.platform` instead of `os.name` -- Don't prepend local imports with `tagstudio`, stick to `src` -- Use `logging` instead of `print` statements -- Avoid nested `f-string`s +- Avoid direct calls to `os` + - Use `Pathlib` library instead of `os.path` + - Use `platform.system()` instead of `os.name` and `sys.platform` +- Don't prepend local imports with `tagstudio`, stick to `src` +- Use the `logger` system instead of `print` statements +- Avoid nested f-strings +- Use HTML-like tags inside Qt widgets over stylesheets where possible. -#### Runtime +### Commit and Pull Request Style -- Code must function on supported versions of Windows, macOS, and Linux: - - Windows: 10, 11 - - macOS: 12.0+ - - Linux: TBD -- Avoid use of unnecessary logging statements in final submitted code. -- Code should not cause unreasonable slowdowns to the program outside of a progress-indicated task. +> [!CAUTION] +> Please do not close and re-open pull requests. This makes it **much** more difficult to re-pull during reviews. If you would like to signal that your pull request is not ready, please mark is as a draft instead. -#### Git/GitHub Specifics +- Use [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0) as a guideline for commit messages. This allows us to easily generate changelogs for releases. + - See some [examples](https://www.conventionalcommits.org/en/v1.0.0/#examples) of what this looks like in practice. +- Use clear and concise commit messages. If your commit does too much, either consider breaking it up into smaller commits or providing extra detail in the commit description. +- Pull requests should have an adequate title and description which clearly outline your intentions and changes/additions. Feel free to provide screenshots, GIFs, or videos, especially for UI changes. +- Pull requests should ideally be limited to **a single** feature or fix. -- [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0) is used as a guideline for commit messages. This allows us to easily generate changelogs for releases. - - See some [examples](https://www.conventionalcommits.org/en/v1.0.0/#examples) of what this looks like in practice. -- Use clear and concise commit messages. If your commit does too much, either consider breaking it up into smaller commits or providing extra detail in the commit description. -- Pull Requests should have an adequate title and description which clearly outline your intentions and changes/additions. Feel free to provide screenshots, GIFs, or videos, especially for UI changes. +> [!TIP] +> If you're unsure where to stop the scope of your PR, ask yourself: _"If I broke this up, could any parts of it still be used by the project in the meantime?"_ + +### Runtime Requirements + +- Final code must function on supported versions of Windows, macOS, and Linux: + - Windows: 10, 11 + - macOS: 12.0+ + - Linux: _Varies_ +- Final code must **_NOT:_** + - Contain superfluous or unnecessary logging statements. + - Cause unreasonable slowdowns to the program outside of a progress-indicated task. + - Cause undesirable visual glitches or artifacts on screen. ## Documentation Guidelines -Documentation contributions include anything inside of the `doc/` folder, as well as the `README.md` and `CONTRIBUTING.md` files. +Documentation contributions include anything inside of the `docs/` folder, as well as the `README.md` and `CONTRIBUTING.md` files. Documentation inside the `docs/` folder is built and hosted on our static documentation site, [docs.tagstud.io](https://docs.tagstud.io/). -- Use "[snake_case](https://developer.mozilla.org/en-US/docs/Glossary/Snake_case)" for file and folder names -- Follow the folder structure pattern -- Don't add images or other media with excessively large file sizes -- Provide alt text for all embedded media -- Use "[Title Case](https://apastyle.apa.org/style-grammar-guidelines/capitalization/title-case)" for title capitalization +- Use "[snake_case](https://developer.mozilla.org/en-US/docs/Glossary/Snake_case)" for file and folder names +- Follow the folder structure pattern +- Don't add images or other media with excessively large file sizes +- Provide alt text for all embedded media +- Use "[Title Case](https://apastyle.apa.org/style-grammar-guidelines/capitalization/title-case)" for title capitalization ## Translation Guidelines -_TBA_ +Translations are performed on the TagStudio [Weblate project](https://hosted.weblate.org/projects/tagstudio/). + +_Translation guidelines coming soon._ From 0d166e63c09a4ad7b6e8a3939c3573e9c08ac893 Mon Sep 17 00:00:00 2001 From: DandyDev01 <37933054+DandyDev01@users.noreply.github.com> Date: Thu, 21 Nov 2024 13:29:35 -0700 Subject: [PATCH 42/82] feat(parity): backend for aliases and parent tags (#596) * backend for aliases and parents * resolve merge conflics --- tagstudio/src/core/library/alchemy/library.py | 133 +++++--- tagstudio/src/core/library/alchemy/models.py | 11 +- tagstudio/src/qt/flowlayout.py | 3 + tagstudio/src/qt/modals/build_tag.py | 289 +++++++++++++++--- tagstudio/src/qt/modals/tag_database.py | 2 +- tagstudio/src/qt/modals/tag_search.py | 5 +- tagstudio/src/qt/ts_qt.py | 4 +- tagstudio/src/qt/widgets/tag.py | 80 ++++- tagstudio/src/qt/widgets/tag_box.py | 2 +- tagstudio/tests/qt/test_build_tag_panel.py | 185 +++++++++++ tagstudio/tests/qt/test_tag_widget.py | 8 +- tagstudio/tests/test_library.py | 76 ++++- 12 files changed, 690 insertions(+), 108 deletions(-) mode change 100755 => 100644 tagstudio/src/qt/modals/build_tag.py create mode 100644 tagstudio/tests/qt/test_build_tag_panel.py diff --git a/tagstudio/src/core/library/alchemy/library.py b/tagstudio/src/core/library/alchemy/library.py index 9badbe7a..f9ba256a 100644 --- a/tagstudio/src/core/library/alchemy/library.py +++ b/tagstudio/src/core/library/alchemy/library.py @@ -24,6 +24,7 @@ from sqlalchemy import ( from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import ( Session, + aliased, contains_eager, make_transient, selectinload, @@ -417,13 +418,18 @@ class Library: statement = select(Entry) if search.tag: + SubtagAlias = aliased(Tag) # noqa: N806 statement = ( statement.join(Entry.tag_box_fields) .join(TagBoxField.tags) + .outerjoin(Tag.aliases) + .outerjoin(SubtagAlias, Tag.subtags) .where( or_( Tag.name.ilike(search.tag), Tag.shorthand.ilike(search.tag), + TagAlias.name.ilike(search.tag), + SubtagAlias.name.ilike(search.tag), ) ) ) @@ -752,18 +758,23 @@ class Library: ) return True - def add_tag(self, tag: Tag, subtag_ids: list[int] | None = None) -> Tag | None: + def add_tag( + self, + tag: Tag, + subtag_ids: set[int] | None = None, + alias_names: set[str] | None = None, + alias_ids: set[int] | None = None, + ) -> Tag | None: with Session(self.engine, expire_on_commit=False) as session: try: session.add(tag) session.flush() - for subtag_id in subtag_ids or []: - subtag = TagSubtag( - parent_id=tag.id, - child_id=subtag_id, - ) - session.add(subtag) + if subtag_ids is not None: + self.update_subtags(tag, subtag_ids, session) + + if alias_ids is not None and alias_names is not None: + self.update_aliases(tag, alias_ids, alias_names, session) session.commit() @@ -847,25 +858,38 @@ class Library: def get_tag(self, tag_id: int) -> Tag: with Session(self.engine) as session: - tags_query = select(Tag).options(selectinload(Tag.subtags)) + tags_query = select(Tag).options(selectinload(Tag.subtags), selectinload(Tag.aliases)) tag = session.scalar(tags_query.where(Tag.id == tag_id)) session.expunge(tag) for subtag in tag.subtags: session.expunge(subtag) + for alias in tag.aliases: + session.expunge(alias) + return tag + def get_alias(self, tag_id: int, alias_id: int) -> TagAlias: + with Session(self.engine) as session: + alias_query = select(TagAlias).where(TagAlias.id == alias_id, TagAlias.tag_id == tag_id) + alias = session.scalar(alias_query.where(TagAlias.id == alias_id)) + + return alias + def add_subtag(self, base_id: int, new_tag_id: int) -> bool: + if base_id == new_tag_id: + return False + # open session and save as parent tag with Session(self.engine) as session: - tag = TagSubtag( + subtag = TagSubtag( parent_id=base_id, child_id=new_tag_id, ) try: - session.add(tag) + session.add(subtag) session.commit() return True except IntegrityError: @@ -873,49 +897,62 @@ class Library: logger.exception("IntegrityError") return False - def update_tag(self, tag: Tag, subtag_ids: list[int]) -> None: - """Edit a Tag in the Library.""" - # TODO - maybe merge this with add_tag? - - if tag.shorthand: - tag.shorthand = slugify(tag.shorthand) - - if tag.aliases: - # TODO - ... - - # save the tag + def remove_subtag(self, base_id: int, remove_tag_id: int) -> bool: with Session(self.engine) as session: - try: - # update the existing tag - session.add(tag) - session.flush() + p_id = base_id + r_id = remove_tag_id + remove = session.query(TagSubtag).filter_by(parent_id=p_id, child_id=r_id).one() + session.delete(remove) + session.commit() - # load all tag's subtag to know which to remove - prev_subtags = session.scalars( - select(TagSubtag).where(TagSubtag.parent_id == tag.id) - ).all() + return True - for subtag in prev_subtags: - if subtag.child_id not in subtag_ids: - session.delete(subtag) - else: - # no change, remove from list - subtag_ids.remove(subtag.child_id) + def update_tag( + self, + tag: Tag, + subtag_ids: set[int] | None = None, + alias_names: set[str] | None = None, + alias_ids: set[int] | None = None, + ) -> None: + """Edit a Tag in the Library.""" + self.add_tag(tag, subtag_ids, alias_names, alias_ids) + + def update_aliases(self, tag, alias_ids, alias_names, session): + prev_aliases = session.scalars(select(TagAlias).where(TagAlias.tag_id == tag.id)).all() + + for alias in prev_aliases: + if alias.id not in alias_ids or alias.name not in alias_names: + session.delete(alias) + else: + alias_ids.remove(alias.id) + alias_names.remove(alias.name) + + for alias_name in alias_names: + alias = TagAlias(alias_name, tag.id) + session.add(alias) + + def update_subtags(self, tag, subtag_ids, session): + if tag.id in subtag_ids: + subtag_ids.remove(tag.id) + + # load all tag's subtag to know which to remove + prev_subtags = session.scalars(select(TagSubtag).where(TagSubtag.parent_id == tag.id)).all() + + for subtag in prev_subtags: + if subtag.child_id not in subtag_ids: + session.delete(subtag) + else: + # no change, remove from list + subtag_ids.remove(subtag.child_id) # create remaining items - for subtag_id in subtag_ids: - # add new subtag - subtag = TagSubtag( - parent_id=tag.id, - child_id=subtag_id, - ) - session.add(subtag) - - session.commit() - except IntegrityError: - session.rollback() - logger.exception("IntegrityError") + for subtag_id in subtag_ids: + # add new subtag + subtag = TagSubtag( + parent_id=tag.id, + child_id=subtag_id, + ) + session.add(subtag) def prefs(self, key: LibraryPrefs) -> Any: # load given item from Preferences table diff --git a/tagstudio/src/core/library/alchemy/models.py b/tagstudio/src/core/library/alchemy/models.py index 09b54e3e..734c6823 100644 --- a/tagstudio/src/core/library/alchemy/models.py +++ b/tagstudio/src/core/library/alchemy/models.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import Optional from sqlalchemy import JSON, ForeignKey, Integer, event from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -29,11 +28,11 @@ class TagAlias(Base): tag_id: Mapped[int] = mapped_column(ForeignKey("tags.id")) tag: Mapped["Tag"] = relationship(back_populates="aliases") - def __init__(self, name: str, tag: Optional["Tag"] = None): + def __init__(self, name: str, tag_id: int | None = None): self.name = name - if tag: - self.tag = tag + if tag_id is not None: + self.tag_id = tag_id super().__init__() @@ -73,6 +72,10 @@ class Tag(Base): def alias_strings(self) -> list[str]: return [alias.name for alias in self.aliases] + @property + def alias_ids(self) -> list[int]: + return [tag.id for tag in self.aliases] + def __init__( self, name: str, diff --git a/tagstudio/src/qt/flowlayout.py b/tagstudio/src/qt/flowlayout.py index 6334cf95..046b93c9 100644 --- a/tagstudio/src/qt/flowlayout.py +++ b/tagstudio/src/qt/flowlayout.py @@ -140,4 +140,7 @@ class FlowLayout(QLayout): x = next_x line_height = max(line_height, item.sizeHint().height()) + if len(self._item_list) == 0: + return 0 + return y + line_height - rect.y() * ((len(self._item_list)) / len(self._item_list)) diff --git a/tagstudio/src/qt/modals/build_tag.py b/tagstudio/src/qt/modals/build_tag.py old mode 100755 new mode 100644 index af779819..1ed8821d --- a/tagstudio/src/qt/modals/build_tag.py +++ b/tagstudio/src/qt/modals/build_tag.py @@ -3,25 +3,31 @@ # Created for TagStudio: https://github.com/CyanVoxel/TagStudio +import math +from typing import cast + import structlog +from PySide6 import QtCore from PySide6.QtCore import Qt, Signal +from PySide6.QtGui import ( + QAction, +) from PySide6.QtWidgets import ( + QApplication, QComboBox, - QFrame, QLabel, QLineEdit, QPushButton, - QScrollArea, - QTextEdit, QVBoxLayout, QWidget, ) from src.core.library import Library, Tag from src.core.library.alchemy.enums import TagColor from src.core.palette import ColorType, UiColor, get_tag_color, get_ui_color +from src.qt.flowlayout import FlowLayout from src.qt.modals.tag_search import TagSearchPanel from src.qt.widgets.panel import PanelModal, PanelWidget -from src.qt.widgets.tag import TagWidget +from src.qt.widgets.tag import TagAliasWidget, TagWidget logger = structlog.get_logger(__name__) @@ -79,12 +85,47 @@ class BuildTagPanel(PanelWidget): self.aliases_title = QLabel() self.aliases_title.setText("Aliases") self.aliases_layout.addWidget(self.aliases_title) - self.aliases_field = QTextEdit() - self.aliases_field.setAcceptRichText(False) - self.aliases_field.setMinimumHeight(40) - self.aliases_layout.addWidget(self.aliases_field) + + self.aliases_flow_widget = QWidget() + self.aliases_flow_layout = FlowLayout(self.aliases_flow_widget) + self.aliases_flow_layout.setContentsMargins(0, 0, 0, 0) + self.aliases_flow_layout.enable_grid_optimizations(value=False) + + self.alias_add_button = QPushButton() + self.alias_add_button.setMinimumSize(23, 23) + self.alias_add_button.setMaximumSize(23, 23) + self.alias_add_button.setText("+") + self.alias_add_button.setToolTip("CTRL + A") + self.alias_add_button.setShortcut( + QtCore.QKeyCombination( + QtCore.Qt.KeyboardModifier(QtCore.Qt.KeyboardModifier.ControlModifier), + QtCore.Qt.Key.Key_A, + ) + ) + self.alias_add_button.setStyleSheet( + f"QPushButton{{" + f"background: #1e1e1e;" + f"color: #FFFFFF;" + f"font-weight: bold;" + f"border-color: #333333;" + f"border-radius: 6px;" + f"border-style:solid;" + f"border-width:{math.ceil(self.devicePixelRatio())}px;" + f"padding-bottom: 5px;" + f"font-size: 20px;" + f"}}" + f"QPushButton::hover" + f"{{" + f"border-color: #CCCCCC;" + f"background: #555555;" + f"}}" + ) + + self.alias_add_button.clicked.connect(lambda: self.add_alias_callback()) + self.aliases_flow_layout.addWidget(self.alias_add_button) # Subtags ------------------------------------------------------------ + self.subtags_widget = QWidget() self.subtags_layout = QVBoxLayout(self.subtags_widget) self.subtags_layout.setStretch(1, 1) @@ -96,28 +137,52 @@ class BuildTagPanel(PanelWidget): self.subtags_title.setText("Parent Tags") self.subtags_layout.addWidget(self.subtags_title) - self.scroll_contents = QWidget() - self.scroll_layout = QVBoxLayout(self.scroll_contents) - self.scroll_layout.setContentsMargins(6, 0, 6, 0) - self.scroll_layout.setAlignment(Qt.AlignmentFlag.AlignTop) - - self.scroll_area = QScrollArea() - # self.scroll_area.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOn) - self.scroll_area.setWidgetResizable(True) - self.scroll_area.setFrameShadow(QFrame.Shadow.Plain) - self.scroll_area.setFrameShape(QFrame.Shape.NoFrame) - self.scroll_area.setWidget(self.scroll_contents) - # self.scroll_area.setMinimumHeight(60) - - self.subtags_layout.addWidget(self.scroll_area) + self.subtag_flow_widget = QWidget() + self.subtag_flow_layout = FlowLayout(self.subtag_flow_widget) + self.subtag_flow_layout.setContentsMargins(0, 0, 0, 0) + self.subtag_flow_layout.enable_grid_optimizations(value=False) self.subtags_add_button = QPushButton() + self.subtags_add_button.setCursor(Qt.CursorShape.PointingHandCursor) self.subtags_add_button.setText("+") - tsp = TagSearchPanel(self.lib) + self.subtags_add_button.setToolTip("CTRL + P") + self.subtags_add_button.setMinimumSize(23, 23) + self.subtags_add_button.setMaximumSize(23, 23) + self.subtags_add_button.setShortcut( + QtCore.QKeyCombination( + QtCore.Qt.KeyboardModifier(QtCore.Qt.KeyboardModifier.ControlModifier), + QtCore.Qt.Key.Key_P, + ) + ) + self.subtags_add_button.setStyleSheet( + f"QPushButton{{" + f"background: #1e1e1e;" + f"color: #FFFFFF;" + f"font-weight: bold;" + f"border-color: #333333;" + f"border-radius: 6px;" + f"border-style:solid;" + f"border-width:{math.ceil(self.devicePixelRatio())}px;" + f"padding-bottom: 5px;" + f"font-size: 20px;" + f"}}" + f"QPushButton::hover" + f"{{" + f"border-color: #CCCCCC;" + f"background: #555555;" + f"}}" + ) + self.subtag_flow_layout.addWidget(self.subtags_add_button) + + exclude_ids: list[int] = list() + if tag is not None: + exclude_ids.append(tag.id) + + tsp = TagSearchPanel(self.lib, exclude_ids) tsp.tag_chosen.connect(lambda x: self.add_subtag_callback(x)) self.add_tag_modal = PanelModal(tsp, "Add Parent Tags", "Add Parent Tags") self.subtags_add_button.clicked.connect(self.add_tag_modal.show) - self.subtags_layout.addWidget(self.subtags_add_button) + # self.subtags_layout.addWidget(self.subtags_add_button) # self.subtags_field = TagBoxWidget() # self.subtags_field.setMinimumHeight(60) @@ -147,68 +212,204 @@ class BuildTagPanel(PanelWidget): "font-weight:600;" f"color:{get_tag_color(ColorType.TEXT, self.color_field.currentData())};" f"background-color:{get_tag_color( - ColorType.PRIMARY, + ColorType.PRIMARY, self.color_field.currentData())};" ) ) ) self.color_layout.addWidget(self.color_field) + remove_selected_alias_action = QAction("remove selected alias", self) + remove_selected_alias_action.triggered.connect(self.remove_selected_alias) + remove_selected_alias_action.setShortcut( + QtCore.QKeyCombination( + QtCore.Qt.KeyboardModifier(QtCore.Qt.KeyboardModifier.ControlModifier), + QtCore.Qt.Key.Key_D, + ) + ) + self.addAction(remove_selected_alias_action) # Add Widgets to Layout ================================================ self.root_layout.addWidget(self.name_widget) self.root_layout.addWidget(self.shorthand_widget) self.root_layout.addWidget(self.aliases_widget) + self.root_layout.addWidget(self.aliases_flow_widget) self.root_layout.addWidget(self.subtags_widget) + self.root_layout.addWidget(self.subtag_flow_widget) self.root_layout.addWidget(self.color_widget) # self.parent().done.connect(self.update_tag) - # TODO - fill subtags - self.subtags: set[int] = set() + self.subtag_ids: set[int] = set() + self.alias_ids: set[int] = set() + self.alias_names: set[str] = set() + self.new_alias_names: dict = dict() + self.set_tag(tag or Tag(name="New Tag")) if tag is None: self.name_field.selectAll() + def keyPressEvent(self, event): # noqa: N802 + if event.key() == Qt.Key_Return or event.key() == Qt.Key_Enter: # type: ignore + focused_widget = QApplication.focusWidget() + if isinstance(focused_widget.parent(), TagAliasWidget): + self.add_alias_callback() + + def remove_selected_alias(self): + count = self.aliases_flow_layout.count() + if count <= 0: + return + + focused_widget = QApplication.focusWidget() + + if focused_widget is None: + return + + if isinstance(focused_widget.parent(), TagAliasWidget): + cast(TagAliasWidget, focused_widget.parent()).on_remove.emit() + + count = self.aliases_flow_layout.count() + if count > 1: + cast( + TagAliasWidget, self.aliases_flow_layout.itemAt(count - 2).widget() + ).text_field.setFocus() + else: + self.alias_add_button.setFocus() + def add_subtag_callback(self, tag_id: int): logger.info("add_subtag_callback", tag_id=tag_id) - self.subtags.add(tag_id) + self.subtag_ids.add(tag_id) self.set_subtags() def remove_subtag_callback(self, tag_id: int): logger.info("removing subtag", tag_id=tag_id) - self.subtags.remove(tag_id) + self.subtag_ids.remove(tag_id) self.set_subtags() - def set_subtags(self): - while self.scroll_layout.itemAt(0): - self.scroll_layout.takeAt(0).widget().deleteLater() + def add_alias_callback(self): + logger.info("add_alias_callback") + # bug passing in the text for a here means when the text changes + # the remove callback uses what a whas initialy assigned + new_field = TagAliasWidget() + id = new_field.__hash__() + new_field.id = id - c = QWidget() - layout = QVBoxLayout(c) - layout.setContentsMargins(0, 0, 0, 0) - layout.setSpacing(3) - for tag_id in self.subtags: + new_field.on_remove.connect(lambda a="": self.remove_alias_callback(a, id)) + new_field.setMaximumHeight(25) + new_field.setMinimumHeight(25) + + self.alias_ids.add(id) + self.new_alias_names[id] = "" + self.aliases_flow_layout.addWidget(new_field) + new_field.text_field.setFocus() + self.aliases_flow_layout.addWidget(self.alias_add_button) + + def remove_alias_callback(self, alias_name: str, alias_id: int | None = None): + logger.info("remove_alias_callback") + self.alias_ids.remove(alias_id) + self._set_aliases() + + def set_subtags(self): + while self.subtag_flow_layout.itemAt(1): + self.subtag_flow_layout.takeAt(0).widget().deleteLater() + + for tag_id in self.subtag_ids: tag = self.lib.get_tag(tag_id) tw = TagWidget(tag, has_edit=False, has_remove=True) tw.on_remove.connect(lambda t=tag_id: self.remove_subtag_callback(t)) - layout.addWidget(tw) - self.scroll_layout.addWidget(c) + self.subtag_flow_layout.addWidget(tw) + + self.subtag_flow_layout.addWidget(self.subtags_add_button) + + def add_aliases(self): + fields: set[TagAliasWidget] = set() + for i in range(0, self.aliases_flow_layout.count() - 1): + widget = self.aliases_flow_layout.itemAt(i).widget() + + if not isinstance(widget, TagAliasWidget): + return + + field: TagAliasWidget = cast(TagAliasWidget, widget) + fields.add(field) + + remove: set[str] = self.alias_names - set([a.text_field.text() for a in fields]) + + self.alias_names = self.alias_names - remove + + for field in fields: + # add new aliases + if field.text_field.text() != "": + self.alias_names.add(field.text_field.text()) + + def _update_new_alias_name_dict(self): + for i in range(0, self.aliases_flow_layout.count() - 1): + widget = self.aliases_flow_layout.itemAt(i).widget() + + if not isinstance(widget, TagAliasWidget): + return + + field: TagAliasWidget = cast(TagAliasWidget, widget) + text_field_text = field.text_field.text() + + self.new_alias_names[field.id] = text_field_text + + def _set_aliases(self): + self._update_new_alias_name_dict() + + while self.aliases_flow_layout.itemAt(1): + self.aliases_flow_layout.takeAt(0).widget().deleteLater() + + self.alias_names.clear() + + for alias_id in self.alias_ids: + alias = self.lib.get_alias(self.tag.id, alias_id) + + alias_name = alias.name if alias else self.new_alias_names[alias_id] + + new_field = TagAliasWidget( + alias_id, + alias_name, + lambda a=alias_name, id=alias_id: self.remove_alias_callback(a, id), + ) + new_field.setMaximumHeight(25) + new_field.setMinimumHeight(25) + self.aliases_flow_layout.addWidget(new_field) + self.alias_names.add(alias_name) + + self.aliases_flow_layout.addWidget(self.alias_add_button) def set_tag(self, tag: Tag): + self.tag = tag + + self.tag = tag + logger.info("setting tag", tag=tag) self.name_field.setText(tag.name) self.shorthand_field.setText(tag.shorthand or "") - # TODO: Implement aliases - # self.aliases_field.setText("\n".join(tag.aliases)) + + for alias_id in tag.alias_ids: + self.alias_ids.add(alias_id) + + self._set_aliases() + + for subtag in tag.subtag_ids: + self.subtag_ids.add(subtag) + + for alias_id in tag.alias_ids: + self.alias_ids.add(alias_id) + + self._set_aliases() + + for subtag in tag.subtag_ids: + self.subtag_ids.add(subtag) + self.set_subtags() + # select item in self.color_field where the userData value matched tag.color for i in range(self.color_field.count()): if self.color_field.itemData(i) == tag.color: self.color_field.setCurrentIndex(i) break - self.tag = tag - def on_name_changed(self): is_empty = not self.name_field.text().strip() @@ -226,6 +427,8 @@ class BuildTagPanel(PanelWidget): tag = self.tag + self.add_aliases() + tag.name = self.name_field.text() tag.shorthand = self.shorthand_field.text() tag.color = color diff --git a/tagstudio/src/qt/modals/tag_database.py b/tagstudio/src/qt/modals/tag_database.py index f1aebad6..9375c841 100644 --- a/tagstudio/src/qt/modals/tag_database.py +++ b/tagstudio/src/qt/modals/tag_database.py @@ -99,5 +99,5 @@ class TagDatabasePanel(PanelWidget): self.edit_modal.show() def edit_tag_callback(self, btp: BuildTagPanel): - self.lib.add_tag(btp.build_tag()) + self.lib.update_tag(btp.build_tag(), btp.subtag_ids, btp.alias_names, btp.alias_ids) self.update_tags(self.search_field.text()) diff --git a/tagstudio/src/qt/modals/tag_search.py b/tagstudio/src/qt/modals/tag_search.py index c44278fd..1bb25731 100644 --- a/tagstudio/src/qt/modals/tag_search.py +++ b/tagstudio/src/qt/modals/tag_search.py @@ -28,9 +28,10 @@ logger = structlog.get_logger(__name__) class TagSearchPanel(PanelWidget): tag_chosen = Signal(int) - def __init__(self, library: Library): + def __init__(self, library: Library, exclude: list[int] | None = None): super().__init__() self.lib = library + self.exclude = exclude self.first_tag_id = None self.tag_limit = 100 self.setMinimumSize(300, 400) @@ -84,6 +85,8 @@ class TagSearchPanel(PanelWidget): ) for tag in found_tags: + if self.exclude is not None and tag.id in self.exclude: + continue c = QWidget() layout = QHBoxLayout(c) layout.setContentsMargins(0, 0, 0, 0) diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index c780a6a6..c7dfa99c 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -632,7 +632,9 @@ class QtDriver(DriverMixin, QObject): panel: BuildTagPanel = self.modal.widget self.modal.saved.connect( lambda: ( - self.lib.add_tag(panel.build_tag(), panel.subtags), + self.lib.add_tag( + panel.build_tag(), panel.subtag_ids, panel.alias_names, panel.alias_ids + ), self.modal.hide(), ) ) diff --git a/tagstudio/src/qt/widgets/tag.py b/tagstudio/src/qt/widgets/tag.py index ae26b342..2d4cc7ce 100644 --- a/tagstudio/src/qt/widgets/tag.py +++ b/tagstudio/src/qt/widgets/tag.py @@ -9,12 +9,88 @@ from types import FunctionType from PIL import Image from PySide6.QtCore import QEvent, Qt, Signal -from PySide6.QtGui import QAction, QEnterEvent -from PySide6.QtWidgets import QHBoxLayout, QPushButton, QVBoxLayout, QWidget +from PySide6.QtGui import QAction, QEnterEvent, QFontMetrics +from PySide6.QtWidgets import ( + QHBoxLayout, + QLineEdit, + QPushButton, + QVBoxLayout, + QWidget, +) from src.core.library import Tag +from src.core.library.alchemy.enums import TagColor from src.core.palette import ColorType, get_tag_color +class TagAliasWidget(QWidget): + on_remove = Signal() + + def __init__( + self, + id: int | None = 0, + alias: str | None = None, + on_remove_callback=None, + ) -> None: + super().__init__() + + self.id = id + + # if on_click_callback: + self.setCursor(Qt.CursorShape.PointingHandCursor) + self.base_layout = QHBoxLayout(self) + self.base_layout.setObjectName("baseLayout") + self.base_layout.setContentsMargins(0, 0, 0, 0) + + self.on_remove.connect(on_remove_callback) + + self.text_field = QLineEdit(self) + self.text_field.textChanged.connect(self._adjust_width) + + if alias is not None: + self.text_field.setText(alias) + else: + self.text_field.setText("") + + self._adjust_width() + + self.remove_button = QPushButton(self) + self.remove_button.setFlat(True) + self.remove_button.setText("–") + self.remove_button.setHidden(False) + self.remove_button.setStyleSheet( + f"color: {get_tag_color(ColorType.PRIMARY, TagColor.DEFAULT)};" + f"background: {get_tag_color(ColorType.TEXT, TagColor.DEFAULT)};" + f"font-weight: 800;" + f"border-radius: 4px;" + f"border-width:0;" + f"padding-bottom: 4px;" + f"font-size: 14px" + ) + self.remove_button.setMinimumSize(19, 19) + self.remove_button.setMaximumSize(19, 19) + self.remove_button.clicked.connect(self.on_remove.emit) + + self.base_layout.addWidget(self.remove_button) + self.base_layout.addWidget(self.text_field) + + def _adjust_width(self): + text = self.text_field.text() or self.text_field.placeholderText() + font_metrics = QFontMetrics(self.text_field.font()) + text_width = font_metrics.horizontalAdvance(text) + 10 # Add padding + + # Set the minimum width of the QLineEdit + self.text_field.setMinimumWidth(text_width) + self.text_field.adjustSize() + + def enterEvent(self, event: QEnterEvent) -> None: # noqa: N802 + self.update() + return super().enterEvent(event) + + def leaveEvent(self, event: QEvent) -> None: # noqa: N802 + self.update() + return super().leaveEvent(event) + + class TagWidget(QWidget): edit_icon_128: Image.Image = Image.open( str(Path(__file__).parents[3] / "resources/qt/images/edit_icon_128.png") diff --git a/tagstudio/src/qt/widgets/tag_box.py b/tagstudio/src/qt/widgets/tag_box.py index c24a3519..653d3c0e 100755 --- a/tagstudio/src/qt/widgets/tag_box.py +++ b/tagstudio/src/qt/widgets/tag_box.py @@ -138,7 +138,7 @@ class TagBoxWidget(FieldWidget): self.edit_modal.saved.connect( lambda: self.driver.lib.update_tag( build_tag_panel.build_tag(), - subtag_ids=build_tag_panel.subtags, + subtag_ids=build_tag_panel.subtag_ids, ) ) self.edit_modal.show() diff --git a/tagstudio/tests/qt/test_build_tag_panel.py b/tagstudio/tests/qt/test_build_tag_panel.py new file mode 100644 index 00000000..9026b475 --- /dev/null +++ b/tagstudio/tests/qt/test_build_tag_panel.py @@ -0,0 +1,185 @@ +from typing import cast + +from PySide6.QtWidgets import QApplication, QMainWindow +from src.core.library.alchemy.models import Tag +from src.qt.modals.build_tag import BuildTagPanel +from src.qt.widgets.tag import TagAliasWidget + + +def test_build_tag_panel_add_sub_tag_callback(library, generate_tag): + parent = library.add_tag(generate_tag("xxx", id=123)) + child = library.add_tag(generate_tag("xx", id=124)) + assert child + assert parent + + panel: BuildTagPanel = BuildTagPanel(library, child) + + panel.add_subtag_callback(parent.id) + + assert len(panel.subtag_ids) == 1 + + +def test_build_tag_panel_remove_subtag_callback(library, generate_tag): + parent = library.add_tag(generate_tag("xxx", id=123)) + child = library.add_tag(generate_tag("xx", id=124)) + assert child + assert parent + + library.update_tag(child, {parent.id}, [], []) + + child = library.get_tag(child.id) + + assert child + + panel: BuildTagPanel = BuildTagPanel(library, child) + + panel.remove_subtag_callback(parent.id) + + assert len(panel.subtag_ids) == 0 + + +import os + +os.environ["QT_QPA_PLATFORM"] = "offscreen" + + +def test_build_tag_panel_remove_selected_alias(library, generate_tag): + app = QApplication.instance() or QApplication([]) + + window = QMainWindow() + parent_tag = library.add_tag(generate_tag("xxx", id=123)) + panel = BuildTagPanel(library, parent_tag) + panel.setParent(window) + + panel.add_alias_callback() + window.show() + + assert panel.aliases_flow_layout.count() == 2 + + alias_widget = panel.aliases_flow_layout.itemAt(0).widget() + alias_widget.text_field.setFocus() + + app.processEvents() + + panel.remove_selected_alias() + + assert panel.aliases_flow_layout.count() == 1 + + +def test_build_tag_panel_add_alias_callback(library, generate_tag): + tag = library.add_tag(generate_tag("xxx", id=123)) + assert tag + + panel: BuildTagPanel = BuildTagPanel(library, tag) + + panel.add_alias_callback() + + assert panel.aliases_flow_layout.count() == 2 + + +def test_build_tag_panel_remove_alias_callback(library, generate_tag): + tag = library.add_tag(generate_tag("xxx", id=123)) + assert tag + + library.update_tag(tag, [], {"alias", "alias_2"}, {123, 124}) + + tag = library.get_tag(tag.id) + + assert "alias" in tag.alias_strings + assert "alias_2" in tag.alias_strings + + panel: BuildTagPanel = BuildTagPanel(library, tag) + + alias = library.get_alias(tag.id, tag.alias_ids[0]) + + panel.remove_alias_callback(alias.name, alias.id) + + assert len(panel.alias_ids) == 1 + assert len(panel.alias_names) == 1 + assert alias.name not in panel.alias_names + + +def test_build_tag_panel_set_subtags(library, generate_tag): + parent = library.add_tag(generate_tag("parent", id=123)) + child = library.add_tag(generate_tag("child", id=124)) + assert parent + assert child + + library.add_subtag(child.id, parent.id) + + child = library.get_tag(child.id) + + panel: BuildTagPanel = BuildTagPanel(library, child) + + assert len(panel.subtag_ids) == 1 + assert panel.subtag_flow_layout.count() == 2 + + +def test_build_tag_panel_add_aliases(library, generate_tag): + tag = library.add_tag(generate_tag("xxx", id=123)) + assert tag + + library.update_tag(tag, [], {"alias", "alias_2"}, {123, 124}) + + tag = library.get_tag(tag.id) + + assert "alias" in tag.alias_strings + assert "alias_2" in tag.alias_strings + + panel: BuildTagPanel = BuildTagPanel(library, tag) + + widget = panel.aliases_flow_layout.itemAt(0).widget() + + alias_names: set[str] = set() + alias_names.add(cast(TagAliasWidget, widget).text_field.text()) + + widget = panel.aliases_flow_layout.itemAt(1).widget() + alias_names.add(cast(TagAliasWidget, widget).text_field.text()) + + assert "alias" in alias_names + assert "alias_2" in alias_names + + old_text = cast(TagAliasWidget, widget).text_field.text() + cast(TagAliasWidget, widget).text_field.setText("alias_update") + + panel.add_aliases() + + assert old_text not in panel.alias_names + assert "alias_update" in panel.alias_names + assert len(panel.alias_names) == 2 + + +def test_build_tag_panel_set_aliases(library, generate_tag): + tag = library.add_tag(generate_tag("xxx", id=123)) + assert tag + + library.update_tag(tag, [], {"alias"}, {123}) + + tag = library.get_tag(tag.id) + + assert len(tag.alias_ids) == 1 + + panel: BuildTagPanel = BuildTagPanel(library, tag) + + assert panel.aliases_flow_layout.count() == 2 + assert len(panel.alias_names) == 1 + assert len(panel.alias_ids) == 1 + + +def test_build_tag_panel_set_tag(library, generate_tag): + tag = library.add_tag(generate_tag("xxx", id=123)) + assert tag + + panel: BuildTagPanel = BuildTagPanel(library, tag) + + assert panel.tag + assert panel.tag.name == "xxx" + + +def test_build_tag_panel_build_tag(library): + panel: BuildTagPanel = BuildTagPanel(library) + + tag: Tag = panel.build_tag() + + assert tag + assert tag.name == "New Tag" diff --git a/tagstudio/tests/qt/test_tag_widget.py b/tagstudio/tests/qt/test_tag_widget.py index 9d10691a..86158bf4 100644 --- a/tagstudio/tests/qt/test_tag_widget.py +++ b/tagstudio/tests/qt/test_tag_widget.py @@ -84,7 +84,9 @@ def test_tag_widget_remove(qtbot, qt_driver, library, entry_full): def test_tag_widget_edit(qtbot, qt_driver, library, entry_full): # Given - tag = list(entry_full.tags)[0] + entry = next(library.get_entries(with_joins=True)) + library.add_tag(list(entry.tags)[0]) + tag = library.get_tag(list(entry.tags)[0].id) assert tag assert entry_full.tag_box_fields @@ -99,9 +101,7 @@ def test_tag_widget_edit(qtbot, qt_driver, library, entry_full): assert isinstance(tag_widget, TagWidget) # When - actions = tag_widget.bg_button.actions() - edit_action = [a for a in actions if a.text() == "Edit"][0] - edit_action.triggered.emit() + tag_box_widget.edit_tag(tag) # Then panel = tag_box_widget.edit_modal.widget diff --git a/tagstudio/tests/test_library.py b/tagstudio/tests/test_library.py index 24e4d9b9..8175c496 100644 --- a/tagstudio/tests/test_library.py +++ b/tagstudio/tests/test_library.py @@ -6,6 +6,64 @@ from src.core.enums import DefaultEnum, LibraryPrefs from src.core.library.alchemy import Entry, Library from src.core.library.alchemy.enums import FilterState from src.core.library.alchemy.fields import TextField, _FieldID +from src.core.library.alchemy.models import Tag + + +def test_library_add_alias(library, generate_tag): + tag = library.add_tag(generate_tag("xxx", id=123)) + assert tag + + subtag_ids: set[int] = set() + alias_ids: set[int] = set() + alias_names: set[str] = set() + alias_names.add("test_alias") + library.update_tag(tag, subtag_ids, alias_names, alias_ids) + + # Note: ask if it is expected behaviour that you need to re-request + # for the tag. Or if the tag in memory should be updated + alias_ids = library.get_tag(tag.id).alias_ids + + assert len(alias_ids) == 1 + + +def test_library_get_alias(library, generate_tag): + tag = library.add_tag(generate_tag("xxx", id=123)) + assert tag + + subtag_ids: set[int] = set() + alias_ids: set[int] = set() + alias_names: set[str] = set() + alias_names.add("test_alias") + library.update_tag(tag, subtag_ids, alias_names, alias_ids) + + alias_ids = library.get_tag(tag.id).alias_ids + + assert library.get_alias(tag.id, alias_ids[0]).name == "test_alias" + + +def test_library_update_alias(library, generate_tag): + tag: Tag = library.add_tag(generate_tag("xxx", id=123)) + assert tag + + subtag_ids: set[int] = set() + alias_ids: set[int] = set() + alias_names: set[str] = set() + alias_names.add("test_alias") + library.update_tag(tag, subtag_ids, alias_names, alias_ids) + + tag = library.get_tag(tag.id) + alias_ids = tag.alias_ids + + assert library.get_alias(tag.id, alias_ids[0]).name == "test_alias" + + alias_names.remove("test_alias") + alias_names.add("alias_update") + library.update_tag(tag, subtag_ids, alias_names, alias_ids) + + tag = library.get_tag(tag.id) + + assert len(tag.alias_ids) == 1 + assert library.get_alias(tag.id, tag.alias_ids[0]).name == "alias_update" @pytest.mark.parametrize("library", [TemporaryDirectory()], indirect=True) @@ -38,14 +96,26 @@ def test_create_tag(library, generate_tag): assert tag_inc.id > 1000 +def test_tag_subtag_itself(library, generate_tag): + # tag already exists + assert not library.add_tag(generate_tag("foo")) + + # new tag name + tag = library.add_tag(generate_tag("xxx", id=123)) + assert tag + assert tag.id == 123 + + library.update_tag(tag, {tag.id}, {}, {}) + tag = library.get_tag(tag.id) + assert len(tag.subtag_ids) == 0 + + def test_library_search(library, generate_tag, entry_full): assert library.entries_count == 2 tag = list(entry_full.tags)[0] results = library.search_library( - FilterState( - tag=tag.name, - ), + FilterState(tag=tag.name), ) assert results.total_count == 1 From 7b2636e4a7c32295183b33ca81b70e9a6a59e9f8 Mon Sep 17 00:00:00 2001 From: Travis Abendshien Date: Sun, 24 Nov 2024 10:29:29 -0800 Subject: [PATCH 43/82] add syncthing to `.gitignore` --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 0868bb86..3cbfcac9 100644 --- a/.gitignore +++ b/.gitignore @@ -175,6 +175,10 @@ poetry.toml # LSP config files pyrightconfig.json +# Syncthing +.stfolder/ +.stignore + ### Qt ### # C++ objects and libs *.slo From 262893a1bbc16d0f254032adf22b77f9dcc95e67 Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Wed, 27 Nov 2024 21:25:03 -0800 Subject: [PATCH 44/82] add `.DS_Store` to `.gitignore` --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 3cbfcac9..ad3495d8 100644 --- a/.gitignore +++ b/.gitignore @@ -141,6 +141,9 @@ venv.bak/ # Rope project settings .ropeproject +# macoS +*.DS_Store + # mkdocs documentation /site From 20f93719d79dfb4aadf7736164ece77e34aa2857 Mon Sep 17 00:00:00 2001 From: Jann Stute <46534683+Computerdores@users.noreply.github.com> Date: Thu, 28 Nov 2024 22:19:08 +0100 Subject: [PATCH 45/82] fix(ci): surpress errant mypy warnings (#609) * fix: mypy error in ts_qt * fix: mypy error in file_opener due to conflicting types * fix: remove unnecessary type ignores * refix type ignore comments * partially revert "refix type ignore comments" due to being implemented in #608 --- tagstudio/src/qt/helpers/file_opener.py | 4 ++-- tagstudio/src/qt/ts_qt.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/tagstudio/src/qt/helpers/file_opener.py b/tagstudio/src/qt/helpers/file_opener.py index 0f4a7e0a..0672ed84 100644 --- a/tagstudio/src/qt/helpers/file_opener.py +++ b/tagstudio/src/qt/helpers/file_opener.py @@ -34,11 +34,11 @@ def open_file(path: str | Path, file_manager: bool = False): normpath = Path(path).resolve().as_posix() if file_manager: command_name = "explorer" - command_args = '/select,"' + normpath + '"' + command_arg = '/select,"' + normpath + '"' # For some reason, if the args are passed in a list, this will error when the # path has spaces, even while surrounded in double quotes. subprocess.Popen( - command_name + command_args, + command_name + command_arg, shell=True, close_fds=True, creationflags=subprocess.CREATE_NEW_PROCESS_GROUP diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index c7dfa99c..f934892a 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -254,7 +254,7 @@ class QtDriver(DriverMixin, QObject): if os.name == "nt": appid = "cyanvoxel.tagstudio.9" - ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(appid) # type: ignore + ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(appid) # type: ignore[attr-defined,unused-ignore] if sys.platform != "darwin": icon = QIcon() @@ -823,6 +823,7 @@ class QtDriver(DriverMixin, QObject): if field.type.type == FieldTypeEnum.TEXT_LINE and field.value: self.lib.update_entry_field( entry_ids=entry.id, + field=field, content=strip_web_protocol(field.value), ) From d152cd75d8058341eca61f6940d6c7ccf4a5607c Mon Sep 17 00:00:00 2001 From: Kiril Bourakov <86131959+KirilBourakov@users.noreply.github.com> Date: Fri, 29 Nov 2024 13:34:28 -0400 Subject: [PATCH 46/82] fix: "open in explorer" opens correct folder (#603) * replaced as_posix with str * replaced addition with f string --------- Co-authored-by: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> --- tagstudio/src/qt/helpers/file_opener.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tagstudio/src/qt/helpers/file_opener.py b/tagstudio/src/qt/helpers/file_opener.py index 0672ed84..d402e1de 100644 --- a/tagstudio/src/qt/helpers/file_opener.py +++ b/tagstudio/src/qt/helpers/file_opener.py @@ -31,10 +31,11 @@ def open_file(path: str | Path, file_manager: bool = False): try: if sys.platform == "win32": - normpath = Path(path).resolve().as_posix() + normpath = str(Path(path).resolve()) if file_manager: command_name = "explorer" - command_arg = '/select,"' + normpath + '"' + command_arg = f'/select,"{normpath}"' + # For some reason, if the args are passed in a list, this will error when the # path has spaces, even while surrounded in double quotes. subprocess.Popen( From 1fb1a80d53bc910ba9ea7311e98d1c847f2f399f Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Fri, 29 Nov 2024 12:35:18 -0800 Subject: [PATCH 47/82] fix: ui/ux parity fixes for thumbnails and files (#608) * fix(ui): display loading icon before rendered thumb * fix: skip out of range thumbs * fix: optimize library refreshing * fix(ui): tag colors show correct names * fix(ui): ensure inner field containers are deleted * fix(ui): don't show default preview label text * fix: catch all missing file thumbs; clean up logs --- tagstudio/src/core/exceptions.py | 6 ++ tagstudio/src/core/library/alchemy/library.py | 2 + tagstudio/src/core/utils/refresh_dir.py | 51 ++++++++--- tagstudio/src/qt/helpers/file_opener.py | 21 +++-- tagstudio/src/qt/modals/build_tag.py | 2 +- tagstudio/src/qt/ts_qt.py | 31 +++++-- tagstudio/src/qt/widgets/fields.py | 5 +- tagstudio/src/qt/widgets/preview_panel.py | 14 +-- tagstudio/src/qt/widgets/thumb_renderer.py | 87 ++++++++++--------- tagstudio/tests/macros/test_refresh_dir.py | 3 +- 10 files changed, 145 insertions(+), 77 deletions(-) create mode 100644 tagstudio/src/core/exceptions.py diff --git a/tagstudio/src/core/exceptions.py b/tagstudio/src/core/exceptions.py new file mode 100644 index 00000000..10bec533 --- /dev/null +++ b/tagstudio/src/core/exceptions.py @@ -0,0 +1,6 @@ +# Copyright (C) 2024 Travis Abendshien (CyanVoxel). +# Licensed under the GPL-3.0 License. +# Created for TagStudio: https://github.com/CyanVoxel/TagStudio + + +class NoRendererError(Exception): ... diff --git a/tagstudio/src/core/library/alchemy/library.py b/tagstudio/src/core/library/alchemy/library.py index f9ba256a..82f79334 100644 --- a/tagstudio/src/core/library/alchemy/library.py +++ b/tagstudio/src/core/library/alchemy/library.py @@ -131,6 +131,7 @@ class Library: storage_path: Path | str | None engine: Engine | None folder: Folder | None + included_files: set[Path] = set() FILENAME: str = "ts_library.sqlite" @@ -140,6 +141,7 @@ class Library: self.library_dir = None self.storage_path = None self.folder = None + self.included_files = set() def open_library(self, library_dir: Path, storage_path: str | None = None) -> LibraryStatus: if storage_path == ":memory:": diff --git a/tagstudio/src/core/utils/refresh_dir.py b/tagstudio/src/core/utils/refresh_dir.py index 87b734ea..11980329 100644 --- a/tagstudio/src/core/utils/refresh_dir.py +++ b/tagstudio/src/core/utils/refresh_dir.py @@ -9,6 +9,19 @@ from src.core.library import Entry, Library logger = structlog.get_logger(__name__) +GLOBAL_IGNORE_SET: set[str] = set( + [ + TS_FOLDER_NAME, + "$RECYCLE.BIN", + ".Trashes", + ".Trash", + "tagstudio_thumbs", + ".fseventsd", + ".Spotlight-V100", + "System Volume Information", + ] +) + @dataclass class RefreshDirTracker: @@ -49,29 +62,45 @@ class RefreshDirTracker: self.files_not_in_library = [] dir_file_count = 0 - for path in lib_path.glob("**/*"): - str_path = str(path) - if path.is_dir(): + for f in lib_path.glob("**/*"): + end_time_loop = time() + # Yield output every 1/30 of a second + if (end_time_loop - start_time_loop) > 0.034: + yield dir_file_count + start_time_loop = time() + + # Skip if the file/path is already mapped in the Library + if f in self.library.included_files: + dir_file_count += 1 continue - if "$RECYCLE.BIN" in str_path or TS_FOLDER_NAME in str_path: + # Ignore if the file is a directory + if f.is_dir(): + continue + + # Ensure new file isn't in a globally ignored folder + skip: bool = False + for part in f.parts: + if part in GLOBAL_IGNORE_SET: + skip = True + break + if skip: continue dir_file_count += 1 - relative_path = path.relative_to(lib_path) + self.library.included_files.add(f) + + relative_path = f.relative_to(lib_path) # TODO - load these in batch somehow if not self.library.has_path_entry(relative_path): self.files_not_in_library.append(relative_path) - # Yield output every 1/30 of a second - if (time() - start_time_loop) > 0.034: - yield dir_file_count - start_time_loop = time() - end_time_total = time() + yield dir_file_count logger.info( "Directory scan time", path=lib_path, duration=(end_time_total - start_time_total), - new_files_count=dir_file_count, + files_not_in_lib=self.files_not_in_library, + files_scanned=dir_file_count, ) diff --git a/tagstudio/src/qt/helpers/file_opener.py b/tagstudio/src/qt/helpers/file_opener.py index d402e1de..f696d416 100644 --- a/tagstudio/src/qt/helpers/file_opener.py +++ b/tagstudio/src/qt/helpers/file_opener.py @@ -19,9 +19,9 @@ def open_file(path: str | Path, file_manager: bool = False): """Open a file in the default application or file explorer. Args: - path (str): The path to the file to open. - file_manager (bool, optional): Whether to open the file in the file manager - (e.g. Finder on macOS). Defaults to False. + path (str): The path to the file to open. + file_manager (bool, optional): Whether to open the file in the file manager + (e.g. Finder on macOS). Defaults to False. """ path = Path(path) logger.info("Opening file", path=path) @@ -93,7 +93,7 @@ class FileOpenerHelper: """Initialize the FileOpenerHelper. Args: - filepath (str): The path to the file to open. + filepath (str): The path to the file to open. """ self.filepath = str(filepath) @@ -101,7 +101,7 @@ class FileOpenerHelper: """Set the filepath to open. Args: - filepath (str): The path to the file to open. + filepath (str): The path to the file to open. """ self.filepath = str(filepath) @@ -115,20 +115,19 @@ class FileOpenerHelper: class FileOpenerLabel(QLabel): - def __init__(self, text, parent=None): + def __init__(self, parent=None): """Initialize the FileOpenerLabel. Args: - text (str): The text to display. - parent (QWidget, optional): The parent widget. Defaults to None. + parent (QWidget, optional): The parent widget. Defaults to None. """ - super().__init__(text, parent) + super().__init__(parent) def set_file_path(self, filepath): """Set the filepath to open. Args: - filepath (str): The path to the file to open. + filepath (str): The path to the file to open. """ self.filepath = filepath @@ -139,7 +138,7 @@ class FileOpenerLabel(QLabel): On a right click, show a context menu. Args: - event (QMouseEvent): The mouse press event. + event (QMouseEvent): The mouse press event. """ super().mousePressEvent(event) diff --git a/tagstudio/src/qt/modals/build_tag.py b/tagstudio/src/qt/modals/build_tag.py index 1ed8821d..fcb786ae 100644 --- a/tagstudio/src/qt/modals/build_tag.py +++ b/tagstudio/src/qt/modals/build_tag.py @@ -203,7 +203,7 @@ class BuildTagPanel(PanelWidget): self.color_field.setMaxVisibleItems(10) self.color_field.setStyleSheet("combobox-popup:0;") for color in TagColor: - self.color_field.addItem(color.name, userData=color.value) + self.color_field.addItem(color.name.replace("_", " ").title(), userData=color.value) # self.color_field.setProperty("appearance", "flat") self.color_field.currentIndexChanged.connect( lambda c: ( diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index f934892a..6a869cd8 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -1031,25 +1031,41 @@ class QtDriver(DriverMixin, QObject): self.flow_container.layout().update() self.main_window.update() - for idx, (entry, item_thumb) in enumerate( - zip_longest(self.frame_content, self.item_thumbs) - ): + is_grid_thumb = True + # Show loading placeholder icons + for entry, item_thumb in zip_longest(self.frame_content, self.item_thumbs): if not entry: item_thumb.hide() continue - filepath = self.lib.library_dir / entry.path - item_thumb = self.item_thumbs[idx] item_thumb.set_mode(ItemType.ENTRY) item_thumb.set_item_id(entry) # TODO - show after item is rendered item_thumb.show() + is_loading = True self.thumb_job_queue.put( ( item_thumb.renderer.render, - (sys.float_info.max, "", base_size, ratio, True, True), + (sys.float_info.max, "", base_size, ratio, is_loading, is_grid_thumb), + ) + ) + + # Show rendered thumbnails + for idx, (entry, item_thumb) in enumerate( + zip_longest(self.frame_content, self.item_thumbs) + ): + if not entry: + continue + + filepath = self.lib.library_dir / entry.path + is_loading = False + + self.thumb_job_queue.put( + ( + item_thumb.renderer.render, + (time.time(), filepath, base_size, ratio, is_loading, is_grid_thumb), ) ) @@ -1188,7 +1204,8 @@ class QtDriver(DriverMixin, QObject): self.filter.page_size = self.lib.prefs(LibraryPrefs.PAGE_SIZE) # TODO - make this call optional - self.add_new_files_callback() + if self.lib.entries_count < 10000: + self.add_new_files_callback() self.update_libs_list(path) title_text = f"{self.base_title} - Library '{self.lib.library_dir}'" diff --git a/tagstudio/src/qt/widgets/fields.py b/tagstudio/src/qt/widgets/fields.py index 2fb8d7fb..2c35f86f 100644 --- a/tagstudio/src/qt/widgets/fields.py +++ b/tagstudio/src/qt/widgets/fields.py @@ -135,7 +135,10 @@ class FieldContainer(QWidget): def set_inner_widget(self, widget: "FieldWidget"): if self.field_layout.itemAt(0): - self.field_layout.itemAt(0).widget().deleteLater() + old: QWidget = self.field_layout.itemAt(0).widget() + self.field_layout.removeWidget(old) + old.deleteLater() + self.field_layout.addWidget(widget) def get_inner_widget(self): diff --git a/tagstudio/src/qt/widgets/preview_panel.py b/tagstudio/src/qt/widgets/preview_panel.py index e74d2dc7..107c14e8 100644 --- a/tagstudio/src/qt/widgets/preview_panel.py +++ b/tagstudio/src/qt/widgets/preview_panel.py @@ -162,23 +162,27 @@ class PreviewPanel(QWidget): image_layout.addWidget(self.preview_vid) image_layout.setAlignment(self.preview_vid, Qt.AlignmentFlag.AlignCenter) self.image_container.setMinimumSize(*self.img_button_size) - self.file_label = FileOpenerLabel("filename") + self.file_label = FileOpenerLabel() + self.file_label.setObjectName("filenameLabel") self.file_label.setTextFormat(Qt.TextFormat.RichText) self.file_label.setWordWrap(True) self.file_label.setTextInteractionFlags(Qt.TextInteractionFlag.TextSelectableByMouse) self.file_label.setStyleSheet(file_label_style) - self.date_created_label = QLabel("dateCreatedLabel") + self.date_created_label = QLabel() + self.date_created_label.setObjectName("dateCreatedLabel") self.date_created_label.setAlignment(Qt.AlignmentFlag.AlignLeft) self.date_created_label.setTextFormat(Qt.TextFormat.RichText) self.date_created_label.setStyleSheet(date_style) - self.date_modified_label = QLabel("dateModifiedLabel") + self.date_modified_label = QLabel() + self.date_modified_label.setObjectName("dateModifiedLabel") self.date_modified_label.setAlignment(Qt.AlignmentFlag.AlignLeft) self.date_modified_label.setTextFormat(Qt.TextFormat.RichText) self.date_modified_label.setStyleSheet(date_style) - self.dimensions_label = QLabel("dimensionsLabel") + self.dimensions_label = QLabel() + self.dimensions_label.setObjectName("dimensionsLabel") self.dimensions_label.setWordWrap(True) self.dimensions_label.setStyleSheet(properties_style) @@ -480,7 +484,7 @@ class PreviewPanel(QWidget): if filepath and filepath.is_file(): created: dt = None if platform.system() == "Windows" or platform.system() == "Darwin": - created = dt.fromtimestamp(filepath.stat().st_birthtime) # type: ignore[attr-defined] + created = dt.fromtimestamp(filepath.stat().st_birthtime) # type: ignore[attr-defined, unused-ignore] else: created = dt.fromtimestamp(filepath.stat().st_ctime) modified: dt = dt.fromtimestamp(filepath.stat().st_mtime) diff --git a/tagstudio/src/qt/widgets/thumb_renderer.py b/tagstudio/src/qt/widgets/thumb_renderer.py index be5d8899..f78724ae 100644 --- a/tagstudio/src/qt/widgets/thumb_renderer.py +++ b/tagstudio/src/qt/widgets/thumb_renderer.py @@ -45,6 +45,7 @@ from PySide6.QtGui import QGuiApplication, QImage, QPainter, QPixmap from PySide6.QtPdf import QPdfDocument, QPdfDocumentRenderOptions from PySide6.QtSvg import QSvgRenderer from src.core.constants import FONT_SAMPLE_SIZES, FONT_SAMPLE_TEXT +from src.core.exceptions import NoRendererError from src.core.media_types import MediaCategories, MediaType from src.core.palette import ColorType, UiColor, get_ui_color from src.core.utils.encoding import detect_char_encoding @@ -470,7 +471,7 @@ class ThumbRenderer(QObject): id3.ID3NoHeaderError, MutagenError, ) as e: - logger.error("Couldn't read album artwork", path=filepath, error=e) + logger.error("Couldn't read album artwork", path=filepath, error=type(e).__name__) return image def _audio_waveform_thumb( @@ -555,7 +556,7 @@ class ThumbRenderer(QObject): im.resize((size, size), Image.Resampling.BILINEAR) except exceptions.CouldntDecodeError as e: - logger.error("Couldn't render waveform", path=filepath.name, error=e) + logger.error("Couldn't render waveform", path=filepath.name, error=type(e).__name__) return im @@ -581,7 +582,6 @@ class ThumbRenderer(QObject): except ( AttributeError, UnidentifiedImageError, - FileNotFoundError, TypeError, ) as e: if str(e) == "expected string or buffer": @@ -591,7 +591,7 @@ class ThumbRenderer(QObject): ) else: - logger.error("Couldn't render thumbnail", filepath=filepath, error=e) + logger.error("Couldn't render thumbnail", filepath=filepath, error=type(e).__name__) return im def _source_engine(self, filepath: Path) -> Image.Image: @@ -607,15 +607,14 @@ class ThumbRenderer(QObject): except ( AttributeError, UnidentifiedImageError, - FileNotFoundError, TypeError, struct.error, ) as e: if str(e) == "expected string or buffer": - logger.error("Couldn't render thumbnail", filepath=filepath, error=e) + logger.error("Couldn't render thumbnail", filepath=filepath, error=type(e).__name__) else: - logger.error("Couldn't render thumbnail", filepath=filepath, error=e) + logger.error("Couldn't render thumbnail", filepath=filepath, error=type(e).__name__) return im @classmethod @@ -661,7 +660,7 @@ class ThumbRenderer(QObject): image_data = zip_file.read(file_name) im = Image.open(BytesIO(image_data)) except Exception as e: - logger.error("Couldn't render thumbnail", filepath=filepath, error=e) + logger.error("Couldn't render thumbnail", filepath=filepath, error=type(e).__name__) return im @@ -722,7 +721,7 @@ class ThumbRenderer(QObject): ) im = self._apply_overlay_color(bg, UiColor.PURPLE) except OSError as e: - logger.error("Couldn't render thumbnail", filepath=filepath, error=e) + logger.error("Couldn't render thumbnail", filepath=filepath, error=type(e).__name__) return im def _font_long_thumb(self, filepath: Path, size: int) -> Image.Image: @@ -753,7 +752,7 @@ class ThumbRenderer(QObject): )[-1] im = theme_fg_overlay(bg, use_alpha=False) except OSError as e: - logger.error("Couldn't render thumbnail", filepath=filepath, error=e) + logger.error("Couldn't render thumbnail", filepath=filepath, error=type(e).__name__) return im def _image_raw_thumb(self, filepath: Path) -> Image.Image: @@ -772,13 +771,12 @@ class ThumbRenderer(QObject): rgb, decoder_name="raw", ) - except DecompressionBombError as e: - logger.error("Couldn't render thumbnail", filepath=filepath, error=e) except ( + DecompressionBombError, rawpy._rawpy.LibRawIOError, rawpy._rawpy.LibRawFileUnsupportedError, ) as e: - logger.error("Couldn't render thumbnail", filepath=filepath, error=e) + logger.error("Couldn't render thumbnail", filepath=filepath, error=type(e).__name__) return im def _image_thumb(self, filepath: Path) -> Image.Image: @@ -796,13 +794,12 @@ class ThumbRenderer(QObject): new_bg = Image.new("RGB", im.size, color="#1e1e1e") new_bg.paste(im, mask=im.getchannel(3)) im = new_bg - im = ImageOps.exif_transpose(im) except ( UnidentifiedImageError, DecompressionBombError, ) as e: - logger.error("Couldn't render thumbnail", filepath=filepath, error=e) + logger.error("Couldn't render thumbnail", filepath=filepath, error=type(e).__name__) return im @classmethod @@ -955,7 +952,7 @@ class ThumbRenderer(QObject): UnicodeDecodeError, OSError, ) as e: - logger.error("Couldn't render thumbnail", filepath=filepath, error=e) + logger.error("Couldn't render thumbnail", filepath=filepath, error=type(e).__name__) return im def _video_thumb(self, filepath: Path) -> Image.Image: @@ -996,7 +993,7 @@ class ThumbRenderer(QObject): DecompressionBombError, OSError, ) as e: - logger.error("Couldn't render thumbnail", filepath=filepath, error=e) + logger.error("Couldn't render thumbnail", filepath=filepath, error=type(e).__name__) return im def render( @@ -1040,6 +1037,28 @@ class ThumbRenderer(QObject): "thumb_loading", theme_color, (adj_size, adj_size), pixel_ratio ) + def render_default() -> Image.Image: + if update_on_ratio_change: + self.updated_ratio.emit(1) + im = self._get_icon( + name=self._get_resource_id(_filepath), + color=theme_color, + size=(adj_size, adj_size), + pixel_ratio=pixel_ratio, + ) + return im + + def render_unlinked() -> Image.Image: + if update_on_ratio_change: + self.updated_ratio.emit(1) + im = self._get_icon( + name="broken_link_icon", + color=UiColor.RED, + size=(adj_size, adj_size), + pixel_ratio=pixel_ratio, + ) + return im + if is_loading: final = loading_thumb.resize((adj_size, adj_size), resample=Image.Resampling.BILINEAR) qim = ImageQt.ImageQt(final) @@ -1049,6 +1068,9 @@ class ThumbRenderer(QObject): self.updated_ratio.emit(1) elif _filepath: try: + # Missing Files ================================================ + if not _filepath.exists(): + raise FileNotFoundError ext: str = _filepath.suffix.lower() # Images ======================================================= if MediaCategories.is_ext_in_category( @@ -1122,10 +1144,8 @@ class ThumbRenderer(QObject): ): image = self._source_engine(_filepath) # No Rendered Thumbnail ======================================== - if not _filepath.exists(): - raise FileNotFoundError - elif not image: - raise UnidentifiedImageError + if not image: + raise NoRendererError orig_x, orig_y = image.size new_x, new_y = (adj_size, adj_size) @@ -1161,32 +1181,19 @@ class ThumbRenderer(QObject): final = Image.new("RGBA", image.size, (0, 0, 0, 0)) final.paste(image, mask=mask.getchannel(0)) - except FileNotFoundError as e: - logger.error("Couldn't render thumbnail", filepath=filepath, error=e) - if update_on_ratio_change: - self.updated_ratio.emit(1) - final = self._get_icon( - name="broken_link_icon", - color=UiColor.RED, - size=(adj_size, adj_size), - pixel_ratio=pixel_ratio, - ) + except FileNotFoundError: + final = render_unlinked() except ( UnidentifiedImageError, DecompressionBombError, ValueError, ChildProcessError, ) as e: - logger.error("Couldn't render thumbnail", filepath=filepath, error=e) + logger.error("Couldn't render thumbnail", filepath=filepath, error=type(e).__name__) + final = render_default() + except NoRendererError: + final = render_default() - if update_on_ratio_change: - self.updated_ratio.emit(1) - final = self._get_icon( - name=self._get_resource_id(_filepath), - color=theme_color, - size=(adj_size, adj_size), - pixel_ratio=pixel_ratio, - ) qim = ImageQt.ImageQt(final) if image: image.close() diff --git a/tagstudio/tests/macros/test_refresh_dir.py b/tagstudio/tests/macros/test_refresh_dir.py index 4655d399..a4d3e808 100644 --- a/tagstudio/tests/macros/test_refresh_dir.py +++ b/tagstudio/tests/macros/test_refresh_dir.py @@ -15,10 +15,11 @@ def test_refresh_new_files(library, exclude_mode): library.set_prefs(LibraryPrefs.IS_EXCLUDE_LIST, exclude_mode) library.set_prefs(LibraryPrefs.EXTENSION_LIST, [".md"]) registry = RefreshDirTracker(library=library) + library.included_files.clear() (library.library_dir / "FOO.MD").touch() # When - assert not list(registry.refresh_dir(library.library_dir)) + assert len(list(registry.refresh_dir(library.library_dir))) == 1 # Then assert registry.files_not_in_library == [pathlib.Path("FOO.MD")] From bc366fc34d1d8276cb31151986292ad618393716 Mon Sep 17 00:00:00 2001 From: csponge Date: Fri, 29 Nov 2024 17:47:27 -0500 Subject: [PATCH 48/82] feat: audio playback (#576) * feat: Audio Playback Add the ability to play audio files. Add a slider to seek through an audio file. Add play/pause and mute/unmute buttons for audio files. Note: This is a continuation of a mistakenly closed PR: Ref: https://github.com/TagStudioDev/TagStudio/pull/529 While redoing the changes, I made a couple of improvements. When the end of the track is reached, the pause button will swap to the play button and allow the track to be replayed. Here is the original feature request: Ref: https://github.com/TagStudioDev/TagStudio/issues/450 * fix: prevent autoplay on new track when paused * refactor: Add MediaPlayer base class. Added a MediaPlayer base class per some suggestions in the PR comments. Hopefully this reduces duplicate code between the audio/video player in the future. * refactor: add controls to base MediaPlayer class Move media controls from the AudioPlayer widget to the MediaPlayer base class. This removes the need for a separate AudioPlayer class, and allows the video player to reuse the media controls. * fix: position_label update with slider Update the position_label when the slider is moving. * fix: replace platform dependent time formatting Replace the use of `-` in the time format since this is not availabile on all platforms. Update initial `position_label` value to '0:00'. --- tagstudio/src/qt/widgets/media_player.py | 209 ++++++++++++++++++++++ tagstudio/src/qt/widgets/preview_panel.py | 14 ++ 2 files changed, 223 insertions(+) create mode 100644 tagstudio/src/qt/widgets/media_player.py diff --git a/tagstudio/src/qt/widgets/media_player.py b/tagstudio/src/qt/widgets/media_player.py new file mode 100644 index 00000000..f2bb6f37 --- /dev/null +++ b/tagstudio/src/qt/widgets/media_player.py @@ -0,0 +1,209 @@ +# Copyright (C) 2024 Travis Abendshien (CyanVoxel). +# Licensed under the GPL-3.0 License. +# Created for TagStudio: https://github.com/CyanVoxel/TagStudio + +import logging +import typing +from pathlib import Path +from time import gmtime +from typing import Any + +from PySide6.QtCore import Qt, QUrl +from PySide6.QtGui import QIcon, QPixmap +from PySide6.QtMultimedia import QAudioOutput, QMediaDevices, QMediaPlayer +from PySide6.QtWidgets import ( + QGridLayout, + QHBoxLayout, + QLabel, + QPushButton, + QSizePolicy, + QSlider, + QWidget, +) + +if typing.TYPE_CHECKING: + from src.qt.ts_qt import QtDriver + + +class MediaPlayer(QWidget): + """A basic media player widget. + + Gives a basic control set to manage media playback. + """ + + def __init__(self, driver: "QtDriver") -> None: + super().__init__() + self.driver = driver + + self.setFixedHeight(50) + + self.filepath: Path | None = None + self.player = QMediaPlayer() + self.player.setAudioOutput(QAudioOutput(QMediaDevices().defaultAudioOutput(), self.player)) + + # Used to keep track of play state. + # It would be nice if we could use QMediaPlayer.PlaybackState, + # but this will always show StoppedState when changing + # tracks. Therefore, we wouldn't know if the previous + # state was paused or playing + self.is_paused = False + + # Subscribe to player events from MediaPlayer + self.player.positionChanged.connect(self.player_position_changed) + self.player.mediaStatusChanged.connect(self.media_status_changed) + self.player.playingChanged.connect(self.playing_changed) + self.player.audioOutput().mutedChanged.connect(self.muted_changed) + + # Media controls + self.base_layout = QGridLayout(self) + self.base_layout.setContentsMargins(0, 0, 0, 0) + self.base_layout.setSpacing(0) + + self.pslider = QSlider(self) + self.pslider.setFocusPolicy(Qt.FocusPolicy.StrongFocus) + self.pslider.setTickPosition(QSlider.TickPosition.NoTicks) + self.pslider.setSingleStep(1) + self.pslider.setOrientation(Qt.Orientation.Horizontal) + + self.pslider.sliderReleased.connect(self.slider_released) + self.pslider.valueChanged.connect(self.slider_value_changed) + + self.media_btns_layout = QHBoxLayout() + + policy = QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed) + + self.play_pause = QPushButton("", self) + self.play_pause.setFlat(True) + self.play_pause.setSizePolicy(policy) + self.play_pause.clicked.connect(self.toggle_pause) + + self.load_play_pause_icon(playing=False) + + self.media_btns_layout.addWidget(self.play_pause) + + self.mute = QPushButton("", self) + self.mute.setFlat(True) + self.mute.setSizePolicy(policy) + self.mute.clicked.connect(self.toggle_mute) + + self.load_mute_unmute_icon(muted=False) + + self.media_btns_layout.addWidget(self.mute) + + self.position_label = QLabel("0:00") + self.position_label.setAlignment(Qt.AlignmentFlag.AlignRight) + + self.base_layout.addWidget(self.pslider, 0, 0, 1, 2) + self.base_layout.addLayout(self.media_btns_layout, 1, 0) + self.base_layout.addWidget(self.position_label, 1, 1) + + def format_time(self, ms: int) -> str: + """Format the given time. + + Formats the given time in ms to a nicer format. + + Args: + ms: Time in ms + + Returns: + A formatted time: + + "1:43" + + The formatted time will only include the hour if + the provided time is at least 60 minutes. + """ + time = gmtime(ms / 1000) + return ( + f"{time.tm_hour}:{time.tm_min}:{time.tm_sec:02}" + if time.tm_hour > 0 + else f"{time.tm_min}:{time.tm_sec:02}" + ) + + def toggle_pause(self) -> None: + """Toggle the pause state of the media.""" + if self.player.isPlaying(): + self.player.pause() + self.is_paused = True + else: + self.player.play() + self.is_paused = False + + def toggle_mute(self) -> None: + """Toggle the mute state of the media.""" + if self.player.audioOutput().isMuted(): + self.player.audioOutput().setMuted(False) + else: + self.player.audioOutput().setMuted(True) + + def playing_changed(self, playing: bool) -> None: + self.load_play_pause_icon(playing) + + def muted_changed(self, muted: bool) -> None: + self.load_mute_unmute_icon(muted) + + def stop(self) -> None: + """Clear the filepath and stop the player.""" + self.filepath = None + self.player.stop() + + def play(self, filepath: Path) -> None: + """Set the source of the QMediaPlayer and play.""" + self.filepath = filepath + if not self.is_paused: + self.player.stop() + self.player.setSource(QUrl.fromLocalFile(self.filepath)) + self.player.play() + else: + self.player.setSource(QUrl.fromLocalFile(self.filepath)) + + def load_play_pause_icon(self, playing: bool) -> None: + icon = self.driver.rm.pause_icon if playing else self.driver.rm.play_icon + self.set_icon(self.play_pause, icon) + + def load_mute_unmute_icon(self, muted: bool) -> None: + icon = self.driver.rm.volume_mute_icon if muted else self.driver.rm.volume_icon + self.set_icon(self.mute, icon) + + def set_icon(self, btn: QPushButton, icon: Any) -> None: + pix_map = QPixmap() + if pix_map.loadFromData(icon): + btn.setIcon(QIcon(pix_map)) + else: + logging.error("failed to load svg file") + + def slider_value_changed(self, value: int) -> None: + current = self.format_time(value) + duration = self.format_time(self.player.duration()) + self.position_label.setText(f"{current} / {duration}") + + def slider_released(self) -> None: + was_playing = self.player.isPlaying() + self.player.setPosition(self.pslider.value()) + + # Setting position causes the player to start playing again. + # We should reset back to initial state. + if not was_playing: + self.player.pause() + + def player_position_changed(self, position: int) -> None: + if not self.pslider.isSliderDown(): + # User isn't using the slider, so update position in widgets. + self.pslider.setValue(position) + current = self.format_time(self.player.position()) + duration = self.format_time(self.player.duration()) + self.position_label.setText(f"{current} / {duration}") + + if self.player.duration() == position: + self.player.pause() + self.player.setPosition(0) + + def media_status_changed(self, status: QMediaPlayer.MediaStatus) -> None: + # We can only set the slider duration once we know the size of the media + if status == QMediaPlayer.MediaStatus.LoadedMedia and self.filepath is not None: + self.pslider.setMinimum(0) + self.pslider.setMaximum(self.player.duration()) + + current = self.format_time(self.player.position()) + duration = self.format_time(self.player.duration()) + self.position_label.setText(f"{current} / {duration}") diff --git a/tagstudio/src/qt/widgets/preview_panel.py b/tagstudio/src/qt/widgets/preview_panel.py index 107c14e8..34302202 100644 --- a/tagstudio/src/qt/widgets/preview_panel.py +++ b/tagstudio/src/qt/widgets/preview_panel.py @@ -54,6 +54,7 @@ from src.qt.helpers.rounded_pixmap_style import RoundedPixmapStyle from src.qt.modals.add_field import AddFieldModal from src.qt.platform_strings import PlatformStrings from src.qt.widgets.fields import FieldContainer +from src.qt.widgets.media_player import MediaPlayer from src.qt.widgets.panel import PanelModal from src.qt.widgets.tag_box import TagBoxWidget from src.qt.widgets.text import TextWidget @@ -155,6 +156,9 @@ class PreviewPanel(QWidget): ) ) + self.media_player = MediaPlayer(driver) + self.media_player.hide() + image_layout.addWidget(self.preview_img) image_layout.setAlignment(self.preview_img, Qt.AlignmentFlag.AlignCenter) image_layout.addWidget(self.preview_gif) @@ -263,6 +267,7 @@ class PreviewPanel(QWidget): ) splitter.addWidget(self.image_container) + splitter.addWidget(self.media_player) splitter.addWidget(info_section) splitter.addWidget(self.libs_flow_container) splitter.setStretchFactor(1, 2) @@ -542,6 +547,8 @@ class PreviewPanel(QWidget): self.preview_img.show() self.preview_vid.stop() self.preview_vid.hide() + self.media_player.hide() + self.media_player.stop() self.preview_gif.hide() self.selected = list(self.driver.selected) self.add_field_button.setHidden(True) @@ -574,6 +581,8 @@ class PreviewPanel(QWidget): self.preview_img.show() self.preview_vid.stop() self.preview_vid.hide() + self.media_player.stop() + self.media_player.hide() self.preview_gif.hide() # If a new selection is made, update the thumbnail and filepath. @@ -658,6 +667,9 @@ class PreviewPanel(QWidget): rawpy._rawpy.LibRawFileUnsupportedError, ): pass + elif MediaCategories.is_ext_in_category(ext, MediaCategories.AUDIO_TYPES): + self.media_player.show() + self.media_player.play(filepath) elif MediaCategories.is_ext_in_category( ext, MediaCategories.VIDEO_TYPES ) and is_readable_video(filepath): @@ -764,6 +776,8 @@ class PreviewPanel(QWidget): self.preview_gif.hide() self.preview_vid.stop() self.preview_vid.hide() + self.media_player.stop() + self.media_player.hide() self.update_date_label() if self.selected != self.driver.selected: self.file_label.setText(f"{len(self.driver.selected)} Items Selected") From b7e652ad8d8055cd49bf37138413568d058e8a7b Mon Sep 17 00:00:00 2001 From: Travis Abendshien Date: Fri, 29 Nov 2024 15:40:04 -0800 Subject: [PATCH 49/82] docs: remove `db_migration` --- docs/index.md | 6 ----- docs/library/tag_overrides.md | 2 +- docs/updates/db_migration.md | 43 ----------------------------------- 3 files changed, 1 insertion(+), 50 deletions(-) delete mode 100644 docs/updates/db_migration.md diff --git a/docs/index.md b/docs/index.md index 0337398e..6558be1b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -45,9 +45,3 @@ The [Feature Roadmap](updates/roadmap.md) lists all of the planned core features - Create rich tags composed of a name, a list of aliases, and a list of “subtags” - being tags in which these tags inherit values from. - Search for entries based on tags, ~~metadata~~ (TBA), or filenames/filetypes (using `filename: `) - Special search conditions for entries that are: `untagged`/`no tags` and `empty`/`no fields`. - -## Important Updates - -### [Database Migration](updates/db_migration.md) - -The "Database Migration", "DB Migration", or "SQLite Migration" is an upcoming update to TagStudio which will replace the current JSON [library](library/index.md) with a SQL-based one, and will additionally include some fundamental changes to how some features such as [tags](library/tag.md) will work. diff --git a/docs/library/tag_overrides.md b/docs/library/tag_overrides.md index ee9f6cec..b1f798bd 100644 --- a/docs/library/tag_overrides.md +++ b/docs/library/tag_overrides.md @@ -5,7 +5,7 @@ tags: # Tag Overrides -Tag overrides are the ability to add or remove [parent tags](tag.md#subtags) from a [tag](tag.md) on a per- [entry](entry.md) basis. Relies on the [Database Migration](../updates/db_migration.md) update being complete. +Tag overrides are the ability to add or remove [parent tags](tag.md#subtags) from a [tag](tag.md) on a per- [entry](entry.md) basis. ## Examples diff --git a/docs/updates/db_migration.md b/docs/updates/db_migration.md deleted file mode 100644 index 4e2a7abb..00000000 --- a/docs/updates/db_migration.md +++ /dev/null @@ -1,43 +0,0 @@ -# Database Migration - -The database migration is an upcoming refactor to TagStudio's library data storage system. The database will be migrated from a JSON-based one to a SQLite-based one. Part of this migration will include a reworked schema, which will allow for several new features and changes to how [tags](../library/tag.md) and [fields](../library/field.md) operate. - -## Schema - -![Database Schema](../assets/db_schema.png){ width="600" } - -### `alias` Table - -_Description TBA_ - -### `entry` Table - -_Description TBA_ - -### `entry_attribute` Table - -_Description TBA_ - -### `entry_page` Table - -_Description TBA_ - -### `location` Table - -_Description TBA_ - -### `tag` Table - -_Description TBA_ - -### `tag_relation` Table - -_Description TBA_ - -## Resulting New Features and Changes - -- Multiple Directory Support -- [Tag Categories](../library/tag_categories.md) (Replaces [Tag Fields](../library/field.md#tag_box)) -- [Tag Overrides](../library/tag_overrides.md) -- User-Defined [Fields](../library/field.md) -- Tag Icons From ef68603322ea2c237e302adaf02aa82a87ddf153 Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Sat, 30 Nov 2024 13:00:08 -0800 Subject: [PATCH 50/82] feat(parity): migrate json libraries to sqlite (#604) * feat(ui): add PagedPanel widget * feat(ui): add MigrationModal widget * feat: add basic json to sql conversion * fix: chose `poolclass` based on file or memory db * feat: migrate tag colors from json to sql * feat: migrate entry fields from json to sql - fix: tag name column no longer has unique constraint - fix: tags are referenced by id in db queries - fix: tag_search_panel no longer queries db on initialization; does not regress to empty search window when shown - fix: tag name search no longer uses library grid FilterState object - fix: tag name search now respects tag limit * set default `is_new` case * fix: limit correct tag query * feat: migrate tag aliases and subtags from json to sql * add migration timer * fix(tests): fix broken tests * rename methods, add docstrings * revert tag id search, split tag name search * fix: use correct type in sidecar macro * tests: add json migration tests * fix: drop leading dot from json extensions * add special characters to json db test * tests: add file path and entry field parity checks * fix(ui): tag manager no longer starts empty * fix: read old windows paths as posix Addresses #298 * tests: add posix + windows paths to json library * tests: add subtag, alias, and shorthand parity tests * tests: ensure no none values in parity checks * tests: add tag color test, use tag id in tag tests * tests: fix and optimize tests * tests: add discrepancy tracker * refactor: reduce duplicate UI code * fix: load non-sequential entry ids * fix(ui): sort tags in the preview panel * tests(fix): prioritize `None` check over equality * fix(tests): fix multi "same tag field type" tests * ui: increase height of migration modal * feat: add progress bar to migration ui * fix(ui): sql values update earlier * refactor: use `get_color_from_str` in test * refactor: migrate tags before aliases and subtags * remove unused assertion * refactor: use `json_migration_req` flag --- .gitignore | 6 +- tagstudio/src/core/library/alchemy/enums.py | 7 + tagstudio/src/core/library/alchemy/library.py | 201 ++++- tagstudio/src/core/library/alchemy/models.py | 9 +- tagstudio/src/core/library/json/library.py | 16 +- tagstudio/src/qt/modals/tag_database.py | 23 +- tagstudio/src/qt/modals/tag_search.py | 25 +- tagstudio/src/qt/ts_qt.py | 21 +- tagstudio/src/qt/widgets/migration_modal.py | 784 ++++++++++++++++++ .../widgets/paged_panel/paged_body_wrapper.py | 20 + .../src/qt/widgets/paged_panel/paged_panel.py | 112 +++ .../widgets/paged_panel/paged_panel_state.py | 25 + tagstudio/src/qt/widgets/preview_panel.py | 4 - tagstudio/src/qt/widgets/tag_box.py | 3 +- .../json_library/.TagStudio/ts_library.json | 1 + tagstudio/tests/test_json_migration.py | 49 ++ tagstudio/tests/test_library.py | 18 +- 17 files changed, 1244 insertions(+), 80 deletions(-) create mode 100644 tagstudio/src/qt/widgets/migration_modal.py create mode 100644 tagstudio/src/qt/widgets/paged_panel/paged_body_wrapper.py create mode 100644 tagstudio/src/qt/widgets/paged_panel/paged_panel.py create mode 100644 tagstudio/src/qt/widgets/paged_panel/paged_panel_state.py create mode 100644 tagstudio/tests/fixtures/json_library/.TagStudio/ts_library.json create mode 100644 tagstudio/tests/test_json_migration.py diff --git a/.gitignore b/.gitignore index ad3495d8..595a3290 100644 --- a/.gitignore +++ b/.gitignore @@ -55,7 +55,6 @@ coverage.xml .hypothesis/ .pytest_cache/ cover/ -tagstudio/tests/fixtures/library/* # Translations *.mo @@ -255,11 +254,14 @@ compile_commands.json # Ignore all local history of files .history .ionide +# End of https://www.toptal.com/developers/gitignore/api/visualstudiocode,python,qt # TagStudio .TagStudio +!*/tests/**/.TagStudio +tagstudio/tests/fixtures/library/* +tagstudio/tests/fixtures/json_library/.TagStudio/*.sqlite TagStudio.ini -# End of https://www.toptal.com/developers/gitignore/api/visualstudiocode,python,qt .envrc .direnv diff --git a/tagstudio/src/core/library/alchemy/enums.py b/tagstudio/src/core/library/alchemy/enums.py index ce525019..7c70f92e 100644 --- a/tagstudio/src/core/library/alchemy/enums.py +++ b/tagstudio/src/core/library/alchemy/enums.py @@ -42,6 +42,13 @@ class TagColor(enum.IntEnum): COOL_GRAY = 36 OLIVE = 37 + @staticmethod + def get_color_from_str(color_name: str) -> "TagColor": + for color in TagColor: + if color.name == color_name.upper().replace(" ", "_"): + return color + return TagColor.DEFAULT + class SearchMode(enum.IntEnum): """Operational modes for item searching.""" diff --git a/tagstudio/src/core/library/alchemy/library.py b/tagstudio/src/core/library/alchemy/library.py index 82f79334..16d5f9c3 100644 --- a/tagstudio/src/core/library/alchemy/library.py +++ b/tagstudio/src/core/library/alchemy/library.py @@ -1,5 +1,6 @@ import re import shutil +import time import unicodedata from dataclasses import dataclass from datetime import UTC, datetime @@ -9,9 +10,11 @@ from typing import Any, Iterator, Type from uuid import uuid4 import structlog +from humanfriendly import format_timespan from sqlalchemy import ( URL, Engine, + NullPool, and_, create_engine, delete, @@ -29,6 +32,7 @@ from sqlalchemy.orm import ( make_transient, selectinload, ) +from src.core.library.json.library import Library as JsonLibrary # type: ignore from ...constants import ( BACKUP_FOLDER_NAME, @@ -122,6 +126,7 @@ class LibraryStatus: success: bool library_path: Path | None = None message: str | None = None + json_migration_req: bool = False class Library: @@ -133,7 +138,8 @@ class Library: folder: Folder | None included_files: set[Path] = set() - FILENAME: str = "ts_library.sqlite" + SQL_FILENAME: str = "ts_library.sqlite" + JSON_FILENAME: str = "ts_library.json" def close(self): if self.engine: @@ -143,32 +149,119 @@ class Library: self.folder = None self.included_files = set() + def migrate_json_to_sqlite(self, json_lib: JsonLibrary): + """Migrate JSON library data to the SQLite database.""" + logger.info("Starting Library Conversion...") + start_time = time.time() + folder: Folder = Folder(path=self.library_dir, uuid=str(uuid4())) + + # Tags + for tag in json_lib.tags: + self.add_tag( + Tag( + id=tag.id, + name=tag.name, + shorthand=tag.shorthand, + color=TagColor.get_color_from_str(tag.color), + ) + ) + + # Tag Aliases + for tag in json_lib.tags: + for alias in tag.aliases: + self.add_alias(name=alias, tag_id=tag.id) + + # Tag Subtags + for tag in json_lib.tags: + for subtag_id in tag.subtag_ids: + self.add_subtag(parent_id=tag.id, child_id=subtag_id) + + # Entries + self.add_entries( + [ + Entry( + path=entry.path / entry.filename, + folder=folder, + fields=[], + id=entry.id + 1, # JSON IDs start at 0 instead of 1 + ) + for entry in json_lib.entries + ] + ) + for entry in json_lib.entries: + for field in entry.fields: + for k, v in field.items(): + self.add_entry_field_type( + entry_ids=(entry.id + 1), # JSON IDs start at 0 instead of 1 + field_id=self.get_field_name_from_id(k), + value=v, + ) + + # Preferences + self.set_prefs(LibraryPrefs.EXTENSION_LIST, [x.strip(".") for x in json_lib.ext_list]) + self.set_prefs(LibraryPrefs.IS_EXCLUDE_LIST, json_lib.is_exclude_list) + + end_time = time.time() + logger.info(f"Library Converted! ({format_timespan(end_time-start_time)})") + + def get_field_name_from_id(self, field_id: int) -> _FieldID: + for f in _FieldID: + if field_id == f.value.id: + return f + return None + def open_library(self, library_dir: Path, storage_path: str | None = None) -> LibraryStatus: + is_new: bool = True if storage_path == ":memory:": self.storage_path = storage_path is_new = True + return self.open_sqlite_library(library_dir, is_new) else: - self.verify_ts_folders(library_dir) - self.storage_path = library_dir / TS_FOLDER_NAME / self.FILENAME - is_new = not self.storage_path.exists() + self.storage_path = library_dir / TS_FOLDER_NAME / self.SQL_FILENAME + if self.verify_ts_folder(library_dir) and (is_new := not self.storage_path.exists()): + json_path = library_dir / TS_FOLDER_NAME / self.JSON_FILENAME + if json_path.exists(): + return LibraryStatus( + success=False, + library_path=library_dir, + message="[JSON] Legacy v9.4 library requires conversion to v9.5+", + json_migration_req=True, + ) + + return self.open_sqlite_library(library_dir, is_new) + + def open_sqlite_library( + self, library_dir: Path, is_new: bool, add_default_data: bool = True + ) -> LibraryStatus: connection_string = URL.create( drivername="sqlite", database=str(self.storage_path), ) + # NOTE: File-based databases should use NullPool to create new DB connection in order to + # keep connections on separate threads, which prevents the DB files from being locked + # even after a connection has been closed. + # SingletonThreadPool (the default for :memory:) should still be used for in-memory DBs. + # More info can be found on the SQLAlchemy docs: + # https://docs.sqlalchemy.org/en/20/changelog/migration_07.html + # Under -> sqlite-the-sqlite-dialect-now-uses-nullpool-for-file-based-databases + poolclass = None if self.storage_path == ":memory:" else NullPool - logger.info("opening library", library_dir=library_dir, connection_string=connection_string) - self.engine = create_engine(connection_string) + logger.info( + "Opening SQLite Library", library_dir=library_dir, connection_string=connection_string + ) + self.engine = create_engine(connection_string, poolclass=poolclass) with Session(self.engine) as session: make_tables(self.engine) - tags = get_default_tags() - try: - session.add_all(tags) - session.commit() - except IntegrityError: - # default tags may exist already - session.rollback() + if add_default_data: + tags = get_default_tags() + try: + session.add_all(tags) + session.commit() + except IntegrityError: + # default tags may exist already + session.rollback() # dont check db version when creating new library if not is_new: @@ -219,7 +312,6 @@ class Library: db_version=db_version.value, expected=LibraryPrefs.DB_VERSION.default, ) - # TODO - handle migration return LibraryStatus( success=False, message=( @@ -354,8 +446,12 @@ class Library: return list(tags_list) - def verify_ts_folders(self, library_dir: Path) -> None: - """Verify/create folders required by TagStudio.""" + def verify_ts_folder(self, library_dir: Path) -> bool: + """Verify/create folders required by TagStudio. + + Returns: + bool: True if path exists, False if it needed to be created. + """ if library_dir is None: raise ValueError("No path set.") @@ -366,6 +462,8 @@ class Library: if not full_ts_path.exists(): logger.info("creating library directory", dir=full_ts_path) full_ts_path.mkdir(parents=True, exist_ok=True) + return False + return True def add_entries(self, items: list[Entry]) -> list[int]: """Add multiple Entry records to the Library.""" @@ -507,21 +605,23 @@ class Library: def search_tags( self, - search: FilterState, + name: str, ) -> list[Tag]: """Return a list of Tag records matching the query.""" + tag_limit = 100 + with Session(self.engine) as session: query = select(Tag) query = query.options( selectinload(Tag.subtags), selectinload(Tag.aliases), - ) + ).limit(tag_limit) - if search.tag: + if name: query = query.where( or_( - Tag.name.icontains(search.tag), - Tag.shorthand.icontains(search.tag), + Tag.name.icontains(name), + Tag.shorthand.icontains(name), ) ) @@ -531,7 +631,7 @@ class Library: logger.info( "searching tags", - search=search, + search=name, statement=str(query), results=len(res), ) @@ -694,7 +794,7 @@ class Library: *, field: ValueType | None = None, field_id: _FieldID | str | None = None, - value: str | datetime | list[str] | None = None, + value: str | datetime | list[int] | None = None, ) -> bool: logger.info( "add_field_to_entry", @@ -727,8 +827,11 @@ class Library: if value: assert isinstance(value, list) - for tag in value: - field_model.tags.add(Tag(name=tag)) + with Session(self.engine) as session: + for tag_id in list(set(value)): + tag = session.scalar(select(Tag).where(Tag.id == tag_id)) + field_model.tags.add(tag) + session.flush() elif field.type == FieldTypeEnum.DATETIME: field_model = DatetimeField( @@ -760,6 +863,28 @@ class Library: ) return True + def tag_from_strings(self, strings: list[str] | str) -> list[int]: + """Create a Tag from a given string.""" + # TODO: Port over tag searching with aliases fallbacks + # and context clue ranking for string searches. + tags: list[int] = [] + + if isinstance(strings, str): + strings = [strings] + + with Session(self.engine) as session: + for string in strings: + tag = session.scalar(select(Tag).where(Tag.name == string)) + if tag: + tags.append(tag.id) + else: + new = session.add(Tag(name=string)) + if new: + tags.append(new.id) + session.flush() + session.commit() + return tags + def add_tag( self, tag: Tag, @@ -852,7 +977,7 @@ class Library: target_path = self.library_dir / TS_FOLDER_NAME / BACKUP_FOLDER_NAME / filename shutil.copy2( - self.library_dir / TS_FOLDER_NAME / self.FILENAME, + self.library_dir / TS_FOLDER_NAME / self.SQL_FILENAME, target_path, ) @@ -879,15 +1004,15 @@ class Library: return alias - def add_subtag(self, base_id: int, new_tag_id: int) -> bool: - if base_id == new_tag_id: + def add_subtag(self, parent_id: int, child_id: int) -> bool: + if parent_id == child_id: return False # open session and save as parent tag with Session(self.engine) as session: subtag = TagSubtag( - parent_id=base_id, - child_id=new_tag_id, + parent_id=parent_id, + child_id=child_id, ) try: @@ -899,6 +1024,22 @@ class Library: logger.exception("IntegrityError") return False + def add_alias(self, name: str, tag_id: int) -> bool: + with Session(self.engine) as session: + alias = TagAlias( + name=name, + tag_id=tag_id, + ) + + try: + session.add(alias) + session.commit() + return True + except IntegrityError: + session.rollback() + logger.exception("IntegrityError") + return False + def remove_subtag(self, base_id: int, remove_tag_id: int) -> bool: with Session(self.engine) as session: p_id = base_id diff --git a/tagstudio/src/core/library/alchemy/models.py b/tagstudio/src/core/library/alchemy/models.py index 734c6823..8da0c470 100644 --- a/tagstudio/src/core/library/alchemy/models.py +++ b/tagstudio/src/core/library/alchemy/models.py @@ -43,7 +43,7 @@ class Tag(Base): id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) - name: Mapped[str] = mapped_column(unique=True) + name: Mapped[str] shorthand: Mapped[str | None] color: Mapped[TagColor] icon: Mapped[str | None] @@ -78,14 +78,14 @@ class Tag(Base): def __init__( self, - name: str, + id: int | None = None, + name: str | None = None, shorthand: str | None = None, aliases: set[TagAlias] | None = None, parent_tags: set["Tag"] | None = None, subtags: set["Tag"] | None = None, icon: str | None = None, color: TagColor = TagColor.DEFAULT, - id: int | None = None, ): self.name = name self.aliases = aliases or set() @@ -177,10 +177,11 @@ class Entry(Base): path: Path, folder: Folder, fields: list[BaseField], + id: int | None = None, ) -> None: self.path = path self.folder = folder - + self.id = id self.suffix = path.suffix.lstrip(".").lower() for field in fields: diff --git a/tagstudio/src/core/library/json/library.py b/tagstudio/src/core/library/json/library.py index 0570c2f3..56203196 100644 --- a/tagstudio/src/core/library/json/library.py +++ b/tagstudio/src/core/library/json/library.py @@ -414,17 +414,17 @@ class Library: """Verifies/creates folders required by TagStudio.""" full_ts_path = self.library_dir / TS_FOLDER_NAME - full_backup_path = self.library_dir / TS_FOLDER_NAME / BACKUP_FOLDER_NAME - full_collage_path = self.library_dir / TS_FOLDER_NAME / COLLAGE_FOLDER_NAME + # full_backup_path = self.library_dir / TS_FOLDER_NAME / BACKUP_FOLDER_NAME + # full_collage_path = self.library_dir / TS_FOLDER_NAME / COLLAGE_FOLDER_NAME if not os.path.isdir(full_ts_path): os.mkdir(full_ts_path) - if not os.path.isdir(full_backup_path): - os.mkdir(full_backup_path) + # if not os.path.isdir(full_backup_path): + # os.mkdir(full_backup_path) - if not os.path.isdir(full_collage_path): - os.mkdir(full_collage_path) + # if not os.path.isdir(full_collage_path): + # os.mkdir(full_collage_path) def verify_default_tags(self, tag_list: list) -> list: """ @@ -449,7 +449,7 @@ class Library: return_code = OpenStatus.CORRUPTED _path: Path = self._fix_lib_path(path) - logger.info("opening library", path=_path) + logger.info("Opening JSON Library", path=_path) if (_path / TS_FOLDER_NAME / "ts_library.json").exists(): try: with open( @@ -554,7 +554,7 @@ class Library: self._next_entry_id += 1 filename = entry.get("filename", "") - e_path = entry.get("path", "") + e_path = entry.get("path", "").replace("\\", "/") fields: list = [] if "fields" in entry: # Cast JSON str keys to ints diff --git a/tagstudio/src/qt/modals/tag_database.py b/tagstudio/src/qt/modals/tag_database.py index 9375c841..937b4fb2 100644 --- a/tagstudio/src/qt/modals/tag_database.py +++ b/tagstudio/src/qt/modals/tag_database.py @@ -2,7 +2,9 @@ # Licensed under the GPL-3.0 License. # Created for TagStudio: https://github.com/CyanVoxel/TagStudio +import structlog from PySide6.QtCore import QSize, Qt, Signal +from PySide6.QtGui import QShowEvent from PySide6.QtWidgets import ( QFrame, QHBoxLayout, @@ -12,11 +14,16 @@ from PySide6.QtWidgets import ( QWidget, ) from src.core.library import Library, Tag -from src.core.library.alchemy.enums import FilterState from src.qt.modals.build_tag import BuildTagPanel from src.qt.widgets.panel import PanelModal, PanelWidget from src.qt.widgets.tag import TagWidget +logger = structlog.get_logger(__name__) + +# TODO: This class shares the majority of its code with tag_search.py. +# It should either be made DRY, or be replaced with the intended and more robust +# Tag Management tab/pane outlined on the Feature Roadmap. + class TagDatabasePanel(PanelWidget): tag_chosen = Signal(int) @@ -24,8 +31,8 @@ class TagDatabasePanel(PanelWidget): def __init__(self, library: Library): super().__init__() self.lib: Library = library + self.is_initialized: bool = False self.first_tag_id = -1 - self.tag_limit = 30 self.setMinimumSize(300, 400) self.root_layout = QVBoxLayout(self) @@ -54,7 +61,6 @@ class TagDatabasePanel(PanelWidget): self.root_layout.addWidget(self.search_field) self.root_layout.addWidget(self.scroll_area) - self.update_tags() def on_return(self, text: str): if text and self.first_tag_id >= 0: @@ -67,12 +73,13 @@ class TagDatabasePanel(PanelWidget): def update_tags(self, query: str | None = None): # TODO: Look at recycling rather than deleting and re-initializing + logger.info("[Tag Manager Modal] Updating Tags") while self.scroll_layout.itemAt(0): self.scroll_layout.takeAt(0).widget().deleteLater() - tags = self.lib.search_tags(FilterState(path=query, page_size=self.tag_limit)) + tags_results = self.lib.search_tags(name=query) - for tag in tags: + for tag in tags_results: container = QWidget() row = QHBoxLayout(container) row.setContentsMargins(0, 0, 0, 0) @@ -101,3 +108,9 @@ class TagDatabasePanel(PanelWidget): def edit_tag_callback(self, btp: BuildTagPanel): self.lib.update_tag(btp.build_tag(), btp.subtag_ids, btp.alias_names, btp.alias_ids) self.update_tags(self.search_field.text()) + + def showEvent(self, event: QShowEvent) -> None: # noqa N802 + if not self.is_initialized: + self.update_tags() + self.is_initialized = True + return super().showEvent(event) diff --git a/tagstudio/src/qt/modals/tag_search.py b/tagstudio/src/qt/modals/tag_search.py index 1bb25731..adcfb7d0 100644 --- a/tagstudio/src/qt/modals/tag_search.py +++ b/tagstudio/src/qt/modals/tag_search.py @@ -7,6 +7,7 @@ import math import structlog from PySide6.QtCore import QSize, Qt, Signal +from PySide6.QtGui import QShowEvent from PySide6.QtWidgets import ( QFrame, QHBoxLayout, @@ -17,7 +18,6 @@ from PySide6.QtWidgets import ( QWidget, ) from src.core.library import Library -from src.core.library.alchemy.enums import FilterState from src.core.palette import ColorType, get_tag_color from src.qt.widgets.panel import PanelWidget from src.qt.widgets.tag import TagWidget @@ -32,8 +32,8 @@ class TagSearchPanel(PanelWidget): super().__init__() self.lib = library self.exclude = exclude + self.is_initialized: bool = False self.first_tag_id = None - self.tag_limit = 100 self.setMinimumSize(300, 400) self.root_layout = QVBoxLayout(self) self.root_layout.setContentsMargins(6, 0, 6, 0) @@ -61,11 +61,9 @@ class TagSearchPanel(PanelWidget): self.root_layout.addWidget(self.search_field) self.root_layout.addWidget(self.scroll_area) - self.update_tags() def on_return(self, text: str): if text and self.first_tag_id is not None: - # callback(self.first_tag_id) self.tag_chosen.emit(self.first_tag_id) self.search_field.setText("") self.update_tags() @@ -73,20 +71,17 @@ class TagSearchPanel(PanelWidget): self.search_field.setFocus() self.parentWidget().hide() - def update_tags(self, name: str | None = None): + def update_tags(self, query: str | None = None): + logger.info("[Tag Search Modal] Updating Tags") while self.scroll_layout.count(): self.scroll_layout.takeAt(0).widget().deleteLater() - found_tags = self.lib.search_tags( - FilterState( - path=name, - page_size=self.tag_limit, - ) - ) + tag_results = self.lib.search_tags(name=query) - for tag in found_tags: + for tag in tag_results: if self.exclude is not None and tag.id in self.exclude: continue + c = QWidget() layout = QHBoxLayout(c) layout.setContentsMargins(0, 0, 0, 0) @@ -123,3 +118,9 @@ class TagSearchPanel(PanelWidget): self.scroll_layout.addWidget(c) self.search_field.setFocus() + + def showEvent(self, event: QShowEvent) -> None: # noqa N802 + if not self.is_initialized: + self.update_tags() + self.is_initialized = True + return super().showEvent(event) diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index 6a869cd8..f105ed42 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -89,6 +89,7 @@ from src.qt.modals.folders_to_tags import FoldersToTagsModal from src.qt.modals.tag_database import TagDatabasePanel from src.qt.resource_manager import ResourceManager from src.qt.widgets.item_thumb import BadgeType, ItemThumb +from src.qt.widgets.migration_modal import JsonMigrationModal from src.qt.widgets.panel import PanelModal from src.qt.widgets.preview_panel import PreviewPanel from src.qt.widgets.progress import ProgressWidget @@ -468,6 +469,7 @@ class QtDriver(DriverMixin, QObject): self.thumb_renderers: list[ThumbRenderer] = [] self.filter = FilterState() self.init_library_window() + self.migration_modal: JsonMigrationModal = None path_result = self.evaluate_path(self.args.open) # check status of library path evaluating @@ -807,6 +809,8 @@ class QtDriver(DriverMixin, QObject): elif name == MacroID.SIDECAR: parsed_items = TagStudioCore.get_gdl_sidecar(ful_path, source) for field_id, value in parsed_items.items(): + if isinstance(value, list) and len(value) > 0 and isinstance(value[0], str): + value = self.lib.tag_from_strings(value) self.lib.add_entry_field_type( entry.id, field_id=field_id, @@ -1187,14 +1191,27 @@ class QtDriver(DriverMixin, QObject): self.settings.endGroup() self.settings.sync() - def open_library(self, path: Path) -> LibraryStatus: + def open_library(self, path: Path) -> None: """Open a TagStudio library.""" open_message: str = f'Opening Library "{str(path)}"...' self.main_window.landing_widget.set_status_label(open_message) self.main_window.statusbar.showMessage(open_message, 3) self.main_window.repaint() - open_status = self.lib.open_library(path) + open_status: LibraryStatus = self.lib.open_library(path) + + # Migration is required + if open_status.json_migration_req: + self.migration_modal = JsonMigrationModal(path) + self.migration_modal.migration_finished.connect( + lambda: self.init_library(path, self.lib.open_library(path)) + ) + self.main_window.landing_widget.set_status_label("") + self.migration_modal.paged_panel.show() + else: + self.init_library(path, open_status) + + def init_library(self, path: Path, open_status: LibraryStatus): if not open_status.success: self.show_error_message(open_status.message or "Error opening library.") return open_status diff --git a/tagstudio/src/qt/widgets/migration_modal.py b/tagstudio/src/qt/widgets/migration_modal.py new file mode 100644 index 00000000..2af7d94a --- /dev/null +++ b/tagstudio/src/qt/widgets/migration_modal.py @@ -0,0 +1,784 @@ +# Copyright (C) 2024 Travis Abendshien (CyanVoxel). +# Licensed under the GPL-3.0 License. +# Created for TagStudio: https://github.com/CyanVoxel/TagStudio + +from pathlib import Path + +import structlog +from PySide6.QtCore import QObject, Qt, QThreadPool, Signal +from PySide6.QtWidgets import ( + QApplication, + QGridLayout, + QHBoxLayout, + QLabel, + QMessageBox, + QProgressDialog, + QSizePolicy, + QVBoxLayout, + QWidget, +) +from sqlalchemy import and_, select +from sqlalchemy.orm import Session +from src.core.constants import TS_FOLDER_NAME +from src.core.enums import LibraryPrefs +from src.core.library.alchemy.enums import FieldTypeEnum, TagColor +from src.core.library.alchemy.fields import TagBoxField, _FieldID +from src.core.library.alchemy.joins import TagField, TagSubtag +from src.core.library.alchemy.library import Library as SqliteLibrary +from src.core.library.alchemy.models import Entry, Tag, TagAlias +from src.core.library.json.library import Library as JsonLibrary # type: ignore +from src.qt.helpers.custom_runnable import CustomRunnable +from src.qt.helpers.function_iterator import FunctionIterator +from src.qt.helpers.qbutton_wrapper import QPushButtonWrapper +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 + +logger = structlog.get_logger(__name__) + + +class JsonMigrationModal(QObject): + """A modal for data migration from v9.4 JSON to v9.5+ SQLite.""" + + migration_cancelled = Signal() + migration_finished = Signal() + + def __init__(self, path: Path): + super().__init__() + self.done: bool = False + self.path: Path = path + + self.stack: list[PagedPanelState] = [] + self.json_lib: JsonLibrary = None + self.sql_lib: SqliteLibrary = None + self.is_migration_initialized: bool = False + self.discrepancies: list[str] = [] + + self.title: str = f'Save Format Migration: "{self.path}"' + self.warning: str = "(!)" + + self.old_entry_count: int = 0 + self.old_tag_count: int = 0 + self.old_ext_count: int = 0 + self.old_ext_type: bool = None + + self.field_parity: bool = False + self.path_parity: bool = False + self.shorthand_parity: bool = False + self.subtag_parity: bool = False + self.alias_parity: bool = False + self.color_parity: bool = False + + self.init_page_info() + self.init_page_convert() + + self.paged_panel: PagedPanel = PagedPanel((700, 640), self.stack) + + def init_page_info(self) -> None: + """Initialize the migration info page.""" + body_wrapper: PagedBodyWrapper = PagedBodyWrapper() + body_label: QLabel = QLabel( + "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:

    " + "
      " + "
    • Your existing library save file will NOT be deleted
    • " + "
    • Your personal files will NOT be deleted, moved, or modified
    • " + "
    • The new v9.5+ save format can not be opened in earlier versions of TagStudio
    • " + "
    " + ) + 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") + next_button: QPushButtonWrapper = QPushButtonWrapper("Continue") + cancel_button.clicked.connect(self.migration_cancelled.emit) + + self.stack.append( + PagedPanelState( + title=self.title, + body_wrapper=body_wrapper, + buttons=[cancel_button, 1, next_button], + connect_to_back=[cancel_button], + connect_to_next=[next_button], + ) + ) + + def init_page_convert(self) -> None: + """Initialize the migration conversion page.""" + self.body_wrapper_01: PagedBodyWrapper = PagedBodyWrapper() + body_container: QWidget = QWidget() + body_container_layout: QHBoxLayout = QHBoxLayout(body_container) + body_container_layout.setContentsMargins(0, 0, 0, 0) + + tab: str = " " + self.match_text: str = "Matched" + self.differ_text: str = "Discrepancy" + + entries_text: str = "Entries:" + tags_text: str = "Tags:" + shorthand_text: str = tab + "Shorthands:" + subtags_text: str = tab + "Parent Tags:" + aliases_text: str = tab + "Aliases:" + colors_text: str = tab + "Colors:" + ext_text: str = "File Extension List:" + ext_type_text: str = "Extension List Type:" + desc_text: str = ( + "
    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:" + field_parity_text: str = tab + "Fields:" + + self.entries_row: int = 0 + self.path_row: int = 1 + self.fields_row: int = 2 + self.tags_row: int = 3 + self.shorthands_row: int = 4 + self.subtags_row: int = 5 + self.aliases_row: int = 6 + self.colors_row: int = 7 + self.ext_row: int = 8 + self.ext_type_row: int = 9 + + old_lib_container: QWidget = QWidget() + old_lib_layout: QVBoxLayout = QVBoxLayout(old_lib_container) + old_lib_title: QLabel = QLabel("

    v9.4 Library

    ") + old_lib_title.setAlignment(Qt.AlignmentFlag.AlignCenter) + old_lib_layout.addWidget(old_lib_title) + + old_content_container: QWidget = QWidget() + self.old_content_layout: QGridLayout = QGridLayout(old_content_container) + self.old_content_layout.setContentsMargins(0, 0, 0, 0) + self.old_content_layout.setSpacing(3) + self.old_content_layout.addWidget(QLabel(entries_text), self.entries_row, 0) + self.old_content_layout.addWidget(QLabel(path_parity_text), self.path_row, 0) + self.old_content_layout.addWidget(QLabel(field_parity_text), self.fields_row, 0) + self.old_content_layout.addWidget(QLabel(tags_text), self.tags_row, 0) + self.old_content_layout.addWidget(QLabel(shorthand_text), self.shorthands_row, 0) + self.old_content_layout.addWidget(QLabel(subtags_text), self.subtags_row, 0) + self.old_content_layout.addWidget(QLabel(aliases_text), self.aliases_row, 0) + self.old_content_layout.addWidget(QLabel(colors_text), self.colors_row, 0) + self.old_content_layout.addWidget(QLabel(ext_text), self.ext_row, 0) + self.old_content_layout.addWidget(QLabel(ext_type_text), self.ext_type_row, 0) + + old_entry_count: QLabel = QLabel() + old_entry_count.setAlignment(Qt.AlignmentFlag.AlignRight) + old_path_value: QLabel = QLabel() + old_path_value.setAlignment(Qt.AlignmentFlag.AlignRight) + old_field_value: QLabel = QLabel() + old_field_value.setAlignment(Qt.AlignmentFlag.AlignRight) + old_tag_count: QLabel = QLabel() + old_tag_count.setAlignment(Qt.AlignmentFlag.AlignRight) + old_shorthand_count: QLabel = QLabel() + old_shorthand_count.setAlignment(Qt.AlignmentFlag.AlignRight) + old_subtag_value: QLabel = QLabel() + old_subtag_value.setAlignment(Qt.AlignmentFlag.AlignRight) + old_alias_value: QLabel = QLabel() + old_alias_value.setAlignment(Qt.AlignmentFlag.AlignRight) + old_color_value: QLabel = QLabel() + old_color_value.setAlignment(Qt.AlignmentFlag.AlignRight) + old_ext_count: QLabel = QLabel() + old_ext_count.setAlignment(Qt.AlignmentFlag.AlignRight) + old_ext_type: QLabel = QLabel() + old_ext_type.setAlignment(Qt.AlignmentFlag.AlignRight) + + self.old_content_layout.addWidget(old_entry_count, self.entries_row, 1) + self.old_content_layout.addWidget(old_path_value, self.path_row, 1) + self.old_content_layout.addWidget(old_field_value, self.fields_row, 1) + self.old_content_layout.addWidget(old_tag_count, self.tags_row, 1) + self.old_content_layout.addWidget(old_shorthand_count, self.shorthands_row, 1) + self.old_content_layout.addWidget(old_subtag_value, self.subtags_row, 1) + self.old_content_layout.addWidget(old_alias_value, self.aliases_row, 1) + self.old_content_layout.addWidget(old_color_value, self.colors_row, 1) + self.old_content_layout.addWidget(old_ext_count, self.ext_row, 1) + self.old_content_layout.addWidget(old_ext_type, self.ext_type_row, 1) + + self.old_content_layout.addWidget(QLabel(), self.path_row, 2) + self.old_content_layout.addWidget(QLabel(), self.fields_row, 2) + self.old_content_layout.addWidget(QLabel(), self.shorthands_row, 2) + self.old_content_layout.addWidget(QLabel(), self.subtags_row, 2) + self.old_content_layout.addWidget(QLabel(), self.aliases_row, 2) + self.old_content_layout.addWidget(QLabel(), self.colors_row, 2) + + old_lib_layout.addWidget(old_content_container) + + new_lib_container: QWidget = QWidget() + new_lib_layout: QVBoxLayout = QVBoxLayout(new_lib_container) + new_lib_title: QLabel = QLabel("

    v9.5+ Library

    ") + new_lib_title.setAlignment(Qt.AlignmentFlag.AlignCenter) + new_lib_layout.addWidget(new_lib_title) + + new_content_container: QWidget = QWidget() + self.new_content_layout: QGridLayout = QGridLayout(new_content_container) + self.new_content_layout.setContentsMargins(0, 0, 0, 0) + self.new_content_layout.setSpacing(3) + self.new_content_layout.addWidget(QLabel(entries_text), self.entries_row, 0) + self.new_content_layout.addWidget(QLabel(path_parity_text), self.path_row, 0) + self.new_content_layout.addWidget(QLabel(field_parity_text), self.fields_row, 0) + self.new_content_layout.addWidget(QLabel(tags_text), self.tags_row, 0) + self.new_content_layout.addWidget(QLabel(shorthand_text), self.shorthands_row, 0) + self.new_content_layout.addWidget(QLabel(subtags_text), self.subtags_row, 0) + self.new_content_layout.addWidget(QLabel(aliases_text), self.aliases_row, 0) + self.new_content_layout.addWidget(QLabel(colors_text), self.colors_row, 0) + self.new_content_layout.addWidget(QLabel(ext_text), self.ext_row, 0) + self.new_content_layout.addWidget(QLabel(ext_type_text), self.ext_type_row, 0) + + new_entry_count: QLabel = QLabel() + new_entry_count.setAlignment(Qt.AlignmentFlag.AlignRight) + path_parity_value: QLabel = QLabel() + path_parity_value.setAlignment(Qt.AlignmentFlag.AlignRight) + field_parity_value: QLabel = QLabel() + field_parity_value.setAlignment(Qt.AlignmentFlag.AlignRight) + new_tag_count: QLabel = QLabel() + new_tag_count.setAlignment(Qt.AlignmentFlag.AlignRight) + new_shorthand_count: QLabel = QLabel() + new_shorthand_count.setAlignment(Qt.AlignmentFlag.AlignRight) + subtag_parity_value: QLabel = QLabel() + subtag_parity_value.setAlignment(Qt.AlignmentFlag.AlignRight) + alias_parity_value: QLabel = QLabel() + alias_parity_value.setAlignment(Qt.AlignmentFlag.AlignRight) + new_color_value: QLabel = QLabel() + new_color_value.setAlignment(Qt.AlignmentFlag.AlignRight) + new_ext_count: QLabel = QLabel() + new_ext_count.setAlignment(Qt.AlignmentFlag.AlignRight) + new_ext_type: QLabel = QLabel() + new_ext_type.setAlignment(Qt.AlignmentFlag.AlignRight) + + self.new_content_layout.addWidget(new_entry_count, self.entries_row, 1) + self.new_content_layout.addWidget(path_parity_value, self.path_row, 1) + self.new_content_layout.addWidget(field_parity_value, self.fields_row, 1) + self.new_content_layout.addWidget(new_tag_count, self.tags_row, 1) + self.new_content_layout.addWidget(new_shorthand_count, self.shorthands_row, 1) + self.new_content_layout.addWidget(subtag_parity_value, self.subtags_row, 1) + self.new_content_layout.addWidget(alias_parity_value, self.aliases_row, 1) + self.new_content_layout.addWidget(new_color_value, self.colors_row, 1) + self.new_content_layout.addWidget(new_ext_count, self.ext_row, 1) + self.new_content_layout.addWidget(new_ext_type, self.ext_type_row, 1) + + self.new_content_layout.addWidget(QLabel(), self.entries_row, 2) + self.new_content_layout.addWidget(QLabel(), self.path_row, 2) + self.new_content_layout.addWidget(QLabel(), self.fields_row, 2) + self.new_content_layout.addWidget(QLabel(), self.shorthands_row, 2) + self.new_content_layout.addWidget(QLabel(), self.tags_row, 2) + self.new_content_layout.addWidget(QLabel(), self.subtags_row, 2) + self.new_content_layout.addWidget(QLabel(), self.aliases_row, 2) + self.new_content_layout.addWidget(QLabel(), self.colors_row, 2) + self.new_content_layout.addWidget(QLabel(), self.ext_row, 2) + self.new_content_layout.addWidget(QLabel(), self.ext_type_row, 2) + + new_lib_layout.addWidget(new_content_container) + + desc_label = QLabel(desc_text) + desc_label.setWordWrap(True) + + body_container_layout.addStretch(2) + body_container_layout.addWidget(old_lib_container) + body_container_layout.addStretch(1) + body_container_layout.addWidget(new_lib_container) + body_container_layout.addStretch(2) + self.body_wrapper_01.layout().addWidget(body_container) + self.body_wrapper_01.layout().addWidget(desc_label) + self.body_wrapper_01.layout().setSpacing(12) + + back_button: QPushButtonWrapper = QPushButtonWrapper("Back") + start_button: QPushButtonWrapper = QPushButtonWrapper("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") + finish_button.setMinimumWidth(120) + finish_button.setDisabled(True) + finish_button.clicked.connect(self.finish_migration) + finish_button.clicked.connect(self.migration_finished.emit) + + self.stack.append( + PagedPanelState( + title=self.title, + body_wrapper=self.body_wrapper_01, + buttons=[back_button, 1, start_button, 1, finish_button], + connect_to_back=[back_button], + connect_to_next=[finish_button], + ) + ) + + def migrate(self, skip_ui: bool = False): + """Open and migrate the JSON library to SQLite.""" + if not self.is_migration_initialized: + self.paged_panel.update_frame() + self.paged_panel.update() + + # Open the JSON Library + self.json_lib = JsonLibrary() + self.json_lib.open_library(self.path) + + # Update JSON UI + self.update_json_entry_count(len(self.json_lib.entries)) + self.update_json_tag_count(len(self.json_lib.tags)) + self.update_json_ext_count(len(self.json_lib.ext_list)) + self.update_json_ext_type(self.json_lib.is_exclude_list) + + self.migration_progress(skip_ui=skip_ui) + self.is_migration_initialized = True + + def migration_progress(self, skip_ui: bool = False): + """Initialize the progress bar and iterator for the library migration.""" + pb = QProgressDialog( + labelText="", + cancelButtonText="", + minimum=0, + maximum=0, + ) + pb.setCancelButton(None) + self.body_wrapper_01.layout().addWidget(pb) + + iterator = FunctionIterator(self.migration_iterator) + iterator.value.connect( + lambda x: ( + pb.setLabelText(f"

    {x}

    "), + self.update_sql_value_ui(show_msg_box=False) + if x == "Checking for Parity..." + else (), + self.update_parity_ui() if x == "Checking for Parity..." else (), + ) + ) + r = CustomRunnable(iterator.run) + r.done.connect( + lambda: ( + self.update_sql_value_ui(show_msg_box=not skip_ui), + pb.setMinimum(1), + pb.setValue(1), + ) + ) + QThreadPool.globalInstance().start(r) + + def migration_iterator(self): + """Iterate over the library migration process.""" + try: + # Convert JSON Library to SQLite + yield "Creating SQL 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...') + 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..." + self.sql_lib.migrate_json_to_sqlite(self.json_lib) + yield "Checking for Parity..." + check_set = set() + check_set.add(self.check_field_parity()) + check_set.add(self.check_path_parity()) + check_set.add(self.check_shorthand_parity()) + check_set.add(self.check_subtag_parity()) + check_set.add(self.check_alias_parity()) + check_set.add(self.check_color_parity()) + self.update_parity_ui() + if False not in check_set: + yield "Migration Complete!" + else: + yield "Migration Complete, Discrepancies Found" + self.done = True + + except Exception as e: + yield f"Error: {type(e).__name__}" + self.done = True + + def update_parity_ui(self): + """Update all parity values UI.""" + self.update_parity_value(self.fields_row, self.field_parity) + self.update_parity_value(self.path_row, self.path_parity) + self.update_parity_value(self.shorthands_row, self.shorthand_parity) + self.update_parity_value(self.subtags_row, self.subtag_parity) + self.update_parity_value(self.aliases_row, self.alias_parity) + self.update_parity_value(self.colors_row, self.color_parity) + self.sql_lib.close() + + def update_sql_value_ui(self, show_msg_box: bool = True): + """Update the SQL value count UI.""" + self.update_sql_value( + self.entries_row, + self.sql_lib.entries_count, + self.old_entry_count, + ) + self.update_sql_value( + self.tags_row, + len(self.sql_lib.tags), + self.old_tag_count, + ) + self.update_sql_value( + self.ext_row, + len(self.sql_lib.prefs(LibraryPrefs.EXTENSION_LIST)), + self.old_ext_count, + ) + self.update_sql_value( + self.ext_type_row, + self.sql_lib.prefs(LibraryPrefs.IS_EXCLUDE_LIST), + self.old_ext_type, + ) + logger.info("Parity check complete!") + if self.discrepancies: + 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") + msg_box.setText( + "Discrepancies were found between the original and converted library formats. " + "Please review and choose to whether continue with the migration or to cancel." + ) + msg_box.setDetailedText("\n".join(self.discrepancies)) + msg_box.setIcon(QMessageBox.Icon.Warning) + msg_box.exec() + + def finish_migration(self): + """Finish the migration upon user approval.""" + final_name = self.json_lib.library_dir / TS_FOLDER_NAME / SqliteLibrary.SQL_FILENAME + if self.temp_path.exists(): + self.temp_path.rename(final_name) + + def update_json_entry_count(self, value: int): + self.old_entry_count = value + label: QLabel = self.old_content_layout.itemAtPosition(self.entries_row, 1).widget() # type:ignore + label.setText(self.color_value_default(value)) + + def update_json_tag_count(self, value: int): + self.old_tag_count = value + label: QLabel = self.old_content_layout.itemAtPosition(self.tags_row, 1).widget() # type:ignore + label.setText(self.color_value_default(value)) + + def update_json_ext_count(self, value: int): + self.old_ext_count = value + label: QLabel = self.old_content_layout.itemAtPosition(self.ext_row, 1).widget() # type:ignore + label.setText(self.color_value_default(value)) + + def update_json_ext_type(self, value: bool): + self.old_ext_type = value + label: QLabel = self.old_content_layout.itemAtPosition(self.ext_type_row, 1).widget() # type:ignore + label.setText(self.color_value_default(value)) + + def update_sql_value(self, row: int, value: int | bool, old_value: int | bool): + label: QLabel = self.new_content_layout.itemAtPosition(row, 1).widget() # type:ignore + warning_icon: QLabel = self.new_content_layout.itemAtPosition(row, 2).widget() # type:ignore + label.setText(self.color_value_conditional(old_value, value)) + warning_icon.setText("" if old_value == value else self.warning) + + def update_parity_value(self, row: int, value: bool): + result: str = self.match_text if value else self.differ_text + old_label: QLabel = self.old_content_layout.itemAtPosition(row, 1).widget() # type:ignore + new_label: QLabel = self.new_content_layout.itemAtPosition(row, 1).widget() # type:ignore + old_warning_icon: QLabel = self.old_content_layout.itemAtPosition(row, 2).widget() # type:ignore + new_warning_icon: QLabel = self.new_content_layout.itemAtPosition(row, 2).widget() # type:ignore + old_label.setText(self.color_value_conditional(self.match_text, result)) + new_label.setText(self.color_value_conditional(self.match_text, result)) + old_warning_icon.setText("" if value else self.warning) + new_warning_icon.setText("" if value else self.warning) + + def color_value_default(self, value: int) -> str: + """Apply the default color to a value.""" + return str(f"{value}") + + def color_value_conditional(self, old_value: int | str, new_value: int | str) -> str: + """Apply a conditional color to a value.""" + red: str = "#e22c3c" + green: str = "#28bb48" + color = green if old_value == new_value else red + return str(f"{new_value}") + + def check_field_parity(self) -> bool: + """Check if all JSON field data matches the new SQL field data.""" + + def sanitize_field(session, entry: Entry, value, type, type_key): + if type is FieldTypeEnum.TAGS: + tags = list( + session.scalars( + select(Tag.id) + .join(TagField) + .join(TagBoxField) + .where( + and_( + TagBoxField.entry_id == entry.id, + TagBoxField.id == TagField.field_id, + TagBoxField.type_key == type_key, + ) + ) + ) + ) + + return set(tags) if tags else None + else: + return value if value else None + + def sanitize_json_field(value): + if isinstance(value, list): + return set(value) if value else None + else: + return value if value else None + + with Session(self.sql_lib.engine) as session: + for json_entry in self.json_lib.entries: + sql_fields: list[tuple] = [] + json_fields: list[tuple] = [] + + sql_entry: Entry = session.scalar( + select(Entry).where(Entry.id == json_entry.id + 1) + ) + if not sql_entry: + logger.info( + "[Field Comparison]", + message=f"NEW (SQL): SQL Entry ID mismatch: {json_entry.id+1}", + ) + self.discrepancies.append( + f"[Field Comparison]:\nNEW (SQL): SQL Entry ID not found: {json_entry.id+1}" + ) + self.field_parity = False + return self.field_parity + + for sf in sql_entry.fields: + sql_fields.append( + ( + sql_entry.id, + sf.type.key, + sanitize_field(session, sql_entry, sf.value, sf.type.type, sf.type_key), + ) + ) + sql_fields.sort() + + # NOTE: The JSON database allowed for separate tag fields of the same type with + # different values. The SQL database does not, and instead merges these values + # across all instances of that field on an entry. + # TODO: ROADMAP: "Tag Categories" will merge all field tags onto the entry. + # All visual separation from there will be data-driven from the tag itself. + meta_tags_count: int = 0 + content_tags_count: int = 0 + tags_count: int = 0 + merged_meta_tags: set[int] = set() + merged_content_tags: set[int] = set() + merged_tags: set[int] = set() + for jf in json_entry.fields: + key: str = self.sql_lib.get_field_name_from_id(list(jf.keys())[0]).name + value = sanitize_json_field(list(jf.values())[0]) + + if key == _FieldID.TAGS_META.name: + meta_tags_count += 1 + merged_meta_tags = merged_meta_tags.union(value or []) + elif key == _FieldID.TAGS_CONTENT.name: + content_tags_count += 1 + merged_content_tags = merged_content_tags.union(value or []) + elif key == _FieldID.TAGS.name: + tags_count += 1 + merged_tags = merged_tags.union(value or []) + else: + # JSON IDs start at 0 instead of 1 + json_fields.append((json_entry.id + 1, key, value)) + + if meta_tags_count: + for _ in range(0, meta_tags_count): + json_fields.append( + ( + json_entry.id + 1, + _FieldID.TAGS_META.name, + merged_meta_tags if merged_meta_tags else None, + ) + ) + if content_tags_count: + for _ in range(0, content_tags_count): + json_fields.append( + ( + json_entry.id + 1, + _FieldID.TAGS_CONTENT.name, + merged_content_tags if merged_content_tags else None, + ) + ) + if tags_count: + for _ in range(0, tags_count): + json_fields.append( + ( + json_entry.id + 1, + _FieldID.TAGS.name, + merged_tags if merged_tags else None, + ) + ) + json_fields.sort() + + if not ( + json_fields is not None + and sql_fields is not None + and (json_fields == sql_fields) + ): + self.discrepancies.append( + f"[Field Comparison]:\nOLD (JSON):{json_fields}\nNEW (SQL):{sql_fields}" + ) + self.field_parity = False + return self.field_parity + + logger.info( + "[Field Comparison]", + fields="\n".join([str(x) for x in zip(json_fields, sql_fields)]), + ) + + self.field_parity = True + return self.field_parity + + def check_path_parity(self) -> bool: + """Check if all JSON file paths match the new SQL paths.""" + with Session(self.sql_lib.engine) as session: + json_paths: list = sorted([x.path / x.filename for x in self.json_lib.entries]) + sql_paths: list = sorted(list(session.scalars(select(Entry.path)))) + self.path_parity = ( + json_paths is not None and sql_paths is not None and (json_paths == sql_paths) + ) + return self.path_parity + + def check_subtag_parity(self) -> bool: + """Check if all JSON subtags match the new SQL subtags.""" + sql_subtags: set[int] = None + json_subtags: set[int] = None + + with Session(self.sql_lib.engine) as session: + for tag in self.sql_lib.tags: + tag_id = tag.id # Tag IDs start at 0 + sql_subtags = set( + session.scalars(select(TagSubtag.child_id).where(TagSubtag.parent_id == tag.id)) + ) + # JSON tags allowed self-parenting; SQL tags no longer allow this. + json_subtags = set(self.json_lib.get_tag(tag_id).subtag_ids).difference( + set([self.json_lib.get_tag(tag_id).id]) + ) + + logger.info( + "[Subtag Parity]", + tag_id=tag_id, + json_subtags=json_subtags, + sql_subtags=sql_subtags, + ) + + if not ( + sql_subtags is not None + and json_subtags is not None + and (sql_subtags == json_subtags) + ): + self.discrepancies.append( + f"[Subtag Parity]:\nOLD (JSON):{json_subtags}\nNEW (SQL):{sql_subtags}" + ) + self.subtag_parity = False + return self.subtag_parity + + self.subtag_parity = True + return self.subtag_parity + + def check_ext_type(self) -> bool: + return self.json_lib.is_exclude_list == self.sql_lib.prefs(LibraryPrefs.IS_EXCLUDE_LIST) + + def check_alias_parity(self) -> bool: + """Check if all JSON aliases match the new SQL aliases.""" + sql_aliases: set[str] = None + json_aliases: set[str] = None + + with Session(self.sql_lib.engine) as session: + for tag in self.sql_lib.tags: + tag_id = tag.id # Tag IDs start at 0 + sql_aliases = set( + session.scalars(select(TagAlias.name).where(TagAlias.tag_id == tag.id)) + ) + json_aliases = set(self.json_lib.get_tag(tag_id).aliases) + + logger.info( + "[Alias Parity]", + tag_id=tag_id, + json_aliases=json_aliases, + sql_aliases=sql_aliases, + ) + if not ( + sql_aliases is not None + and json_aliases is not None + and (sql_aliases == json_aliases) + ): + self.discrepancies.append( + f"[Alias Parity]:\nOLD (JSON):{json_aliases}\nNEW (SQL):{sql_aliases}" + ) + self.alias_parity = False + return self.alias_parity + + self.alias_parity = True + return self.alias_parity + + def check_shorthand_parity(self) -> bool: + """Check if all JSON shorthands match the new SQL shorthands.""" + sql_shorthand: str = None + json_shorthand: str = None + + for tag in self.sql_lib.tags: + tag_id = tag.id # Tag IDs start at 0 + sql_shorthand = tag.shorthand + json_shorthand = self.json_lib.get_tag(tag_id).shorthand + + logger.info( + "[Shorthand Parity]", + tag_id=tag_id, + json_shorthand=json_shorthand, + sql_shorthand=sql_shorthand, + ) + + if not ( + sql_shorthand is not None + and json_shorthand is not None + and (sql_shorthand == json_shorthand) + ): + self.discrepancies.append( + f"[Shorthand Parity]:\nOLD (JSON):{json_shorthand}\nNEW (SQL):{sql_shorthand}" + ) + self.shorthand_parity = False + return self.shorthand_parity + + self.shorthand_parity = True + return self.shorthand_parity + + def check_color_parity(self) -> bool: + """Check if all JSON tag colors match the new SQL tag colors.""" + sql_color: str = None + json_color: str = None + + for tag in self.sql_lib.tags: + tag_id = tag.id # Tag IDs start at 0 + sql_color = tag.color.name + json_color = ( + TagColor.get_color_from_str(self.json_lib.get_tag(tag_id).color).name + if self.json_lib.get_tag(tag_id).color != "" + else TagColor.DEFAULT.name + ) + + logger.info( + "[Color Parity]", + tag_id=tag_id, + json_color=json_color, + sql_color=sql_color, + ) + + if not (sql_color is not None and json_color is not None and (sql_color == json_color)): + self.discrepancies.append( + f"[Color Parity]:\nOLD (JSON):{json_color}\nNEW (SQL):{sql_color}" + ) + self.color_parity = False + return self.color_parity + + self.color_parity = True + return self.color_parity diff --git a/tagstudio/src/qt/widgets/paged_panel/paged_body_wrapper.py b/tagstudio/src/qt/widgets/paged_panel/paged_body_wrapper.py new file mode 100644 index 00000000..7e2e87f2 --- /dev/null +++ b/tagstudio/src/qt/widgets/paged_panel/paged_body_wrapper.py @@ -0,0 +1,20 @@ +# Copyright (C) 2024 Travis Abendshien (CyanVoxel). +# Licensed under the GPL-3.0 License. +# Created for TagStudio: https://github.com/CyanVoxel/TagStudio + +from PySide6.QtCore import Qt +from PySide6.QtWidgets import ( + QVBoxLayout, + QWidget, +) + + +class PagedBodyWrapper(QWidget): + """A state object for paged panels.""" + + def __init__(self): + super().__init__() + layout: QVBoxLayout = QVBoxLayout(self) + layout.setAlignment(Qt.AlignmentFlag.AlignCenter) + layout.setContentsMargins(0, 0, 0, 0) + layout.setSpacing(0) diff --git a/tagstudio/src/qt/widgets/paged_panel/paged_panel.py b/tagstudio/src/qt/widgets/paged_panel/paged_panel.py new file mode 100644 index 00000000..de84d078 --- /dev/null +++ b/tagstudio/src/qt/widgets/paged_panel/paged_panel.py @@ -0,0 +1,112 @@ +# Copyright (C) 2024 Travis Abendshien (CyanVoxel). +# Licensed under the GPL-3.0 License. +# Created for TagStudio: https://github.com/CyanVoxel/TagStudio + +import structlog +from PySide6.QtCore import Qt +from PySide6.QtWidgets import ( + QHBoxLayout, + QLabel, + QVBoxLayout, + QWidget, +) +from src.qt.widgets.paged_panel.paged_panel_state import PagedPanelState + +logger = structlog.get_logger(__name__) + + +class PagedPanel(QWidget): + """A paginated modal panel.""" + + def __init__(self, size: tuple[int, int], stack: list[PagedPanelState]): + super().__init__() + + self._stack: list[PagedPanelState] = stack + self._index: int = 0 + + self.setMinimumSize(*size) + self.setWindowModality(Qt.WindowModality.ApplicationModal) + + self.root_layout = QVBoxLayout(self) + self.root_layout.setObjectName("baseLayout") + self.root_layout.setAlignment(Qt.AlignmentFlag.AlignCenter) + self.root_layout.setContentsMargins(0, 0, 0, 0) + + self.content_container = QWidget() + self.content_layout = QVBoxLayout(self.content_container) + self.content_layout.setContentsMargins(12, 12, 12, 12) + + self.title_label = QLabel() + self.title_label.setObjectName("fieldTitle") + self.title_label.setWordWrap(True) + self.title_label.setAlignment(Qt.AlignmentFlag.AlignCenter) + + self.body_container = QWidget() + self.body_container.setObjectName("bodyContainer") + self.body_layout = QVBoxLayout(self.body_container) + self.body_layout.setAlignment(Qt.AlignmentFlag.AlignCenter) + self.body_layout.setContentsMargins(0, 0, 0, 0) + self.body_layout.setSpacing(0) + + self.button_nav_container = QWidget() + self.button_nav_layout = QHBoxLayout(self.button_nav_container) + + self.root_layout.addWidget(self.content_container) + self.content_layout.addWidget(self.title_label) + self.content_layout.addWidget(self.body_container) + self.content_layout.addStretch(1) + self.root_layout.addWidget(self.button_nav_container) + + self.init_connections() + self.update_frame() + + def init_connections(self): + """Initialize button navigation connections.""" + for frame in self._stack: + for button in frame.connect_to_back: + button.clicked.connect(self.back) + for button in frame.connect_to_next: + button.clicked.connect(self.next) + + def back(self): + """Navigate backward in the state stack. Close if out of bounds.""" + if self._index > 0: + self._index = self._index - 1 + self.update_frame() + else: + self.close() + + def next(self): + """Navigate forward in the state stack. Close if out of bounds.""" + if self._index < len(self._stack) - 1: + self._index = self._index + 1 + self.update_frame() + else: + self.close() + + def update_frame(self): + """Update the widgets with the current frame's content.""" + frame: PagedPanelState = self._stack[self._index] + + # Update Title + self.setWindowTitle(frame.title) + self.title_label.setText(f"

    {frame.title}

    ") + + # Update Body Widget + if self.body_layout.itemAt(0): + self.body_layout.itemAt(0).widget().setHidden(True) + self.body_layout.removeWidget(self.body_layout.itemAt(0).widget()) + self.body_layout.addWidget(frame.body_wrapper) + self.body_layout.itemAt(0).widget().setHidden(False) + + # Update Button Widgets + while self.button_nav_layout.count(): + if _ := self.button_nav_layout.takeAt(0).widget(): + _.setHidden(True) + + for item in frame.buttons: + if isinstance(item, QWidget): + self.button_nav_layout.addWidget(item) + item.setHidden(False) + elif isinstance(item, int): + self.button_nav_layout.addStretch(item) diff --git a/tagstudio/src/qt/widgets/paged_panel/paged_panel_state.py b/tagstudio/src/qt/widgets/paged_panel/paged_panel_state.py new file mode 100644 index 00000000..849dcbc7 --- /dev/null +++ b/tagstudio/src/qt/widgets/paged_panel/paged_panel_state.py @@ -0,0 +1,25 @@ +# Copyright (C) 2024 Travis Abendshien (CyanVoxel). +# Licensed under the GPL-3.0 License. +# Created for TagStudio: https://github.com/CyanVoxel/TagStudio + + +from PySide6.QtWidgets import QPushButton +from src.qt.widgets.paged_panel.paged_body_wrapper import PagedBodyWrapper + + +class PagedPanelState: + """A state object for paged panels.""" + + def __init__( + self, + title: str, + body_wrapper: PagedBodyWrapper, + buttons: list[QPushButton | int], + connect_to_back=list[QPushButton], + connect_to_next=list[QPushButton], + ): + self.title: str = title + self.body_wrapper: PagedBodyWrapper = body_wrapper + self.buttons: list[QPushButton | int] = buttons + self.connect_to_back: list[QPushButton] = connect_to_back + self.connect_to_next: list[QPushButton] = connect_to_next diff --git a/tagstudio/src/qt/widgets/preview_panel.py b/tagstudio/src/qt/widgets/preview_panel.py index 34302202..140dd748 100644 --- a/tagstudio/src/qt/widgets/preview_panel.py +++ b/tagstudio/src/qt/widgets/preview_panel.py @@ -896,10 +896,6 @@ class PreviewPanel(QWidget): logger.error("Failed to disconnect inner_container.updated") else: - logger.info( - "inner_container is not instance of TagBoxWidget", - container=inner_container, - ) inner_container = TagBoxWidget( field, title, diff --git a/tagstudio/src/qt/widgets/tag_box.py b/tagstudio/src/qt/widgets/tag_box.py index 653d3c0e..c4496e62 100755 --- a/tagstudio/src/qt/widgets/tag_box.py +++ b/tagstudio/src/qt/widgets/tag_box.py @@ -89,12 +89,13 @@ class TagBoxWidget(FieldWidget): self.field = field def set_tags(self, tags: typing.Iterable[Tag]): + tags_ = sorted(list(tags), key=lambda tag: tag.name) is_recycled = False while self.base_layout.itemAt(0) and self.base_layout.itemAt(1): self.base_layout.takeAt(0).widget().deleteLater() is_recycled = True - for tag in tags: + for tag in tags_: tag_widget = TagWidget(tag, has_edit=True, has_remove=True) tag_widget.on_click.connect( lambda tag_id=tag.id: ( diff --git a/tagstudio/tests/fixtures/json_library/.TagStudio/ts_library.json b/tagstudio/tests/fixtures/json_library/.TagStudio/ts_library.json new file mode 100644 index 00000000..7a1adf94 --- /dev/null +++ b/tagstudio/tests/fixtures/json_library/.TagStudio/ts_library.json @@ -0,0 +1 @@ +{"ts-version":"9.4.1","ext_list":[".json",".xmp",".aae",".rar",".sqlite"],"is_exclude_list":true,"tags":[{"id":0,"name":"Archived JSON","aliases":["Archive"],"color":"Red"},{"id":1,"name":"Favorite JSON","aliases":["Favorited","Favorites"],"color":"Orange"},{"id":1000,"name":"Parent","aliases":[""],"subtag_ids":[1000]},{"id":1001,"name":"Default","aliases":[""]},{"id":1002,"name":"Black","aliases":[""],"subtag_ids":[1001],"color":"black"},{"id":1003,"name":"Dark Gray","aliases":[""],"color":"dark gray"},{"id":1004,"name":"Gray","aliases":["Grey"],"color":"gray"},{"id":1005,"name":"Light Gray","shorthand":"LG","aliases":["Light Grey"],"color":"light gray"},{"id":1006,"name":"White","aliases":[""],"color":"white"},{"id":1007,"name":"Light Pink","shorthand":"LP","aliases":[""],"color":"light pink"},{"id":1008,"name":"Pink","aliases":[""],"color":"pink"},{"id":1009,"name":"Red","aliases":[""],"color":"red"},{"id":1010,"name":"Red Orange","aliases":["𝓗𝓮𝓵𝓵𝓸"],"subtag_ids":[1009,1011],"color":"red orange"},{"id":1011,"name":"Orange","aliases":["Alias with a slash n newline\\nHopefully this isn't on a newline","Alias with \\\\ double backslashes","Alias with / a forward slash"],"color":"orange"},{"id":1012,"name":"Yellow Orange","shorthand":"YO","aliases":[""],"subtag_ids":[1013,1011],"color":"yellow orange"},{"id":1013,"name":"Yellow","aliases":[""],"color":"yellow"},{"id":1014,"name":"Lime","aliases":[""],"color":"lime"},{"id":1015,"name":"Light Green","shorthand":"LG","aliases":[""],"color":"light green"},{"id":1016,"name":"Mint","aliases":[""],"color":"mint"},{"id":1017,"name":"Green","aliases":[""],"color":"green"},{"id":1018,"name":"Teal","aliases":[""],"color":"teal"},{"id":1019,"name":"Cyan","aliases":[""],"color":"cyan"},{"id":1020,"name":"Light Blue","shorthand":"LB","aliases":[""],"subtag_ids":[1021,1006],"color":"light blue"},{"id":1021,"name":"Blue","aliases":[""],"color":"blue"},{"id":1022,"name":"Blue Violet","shorthand":"BV","aliases":[""],"color":"blue violet"},{"id":1023,"name":"Violet","aliases":[""],"color":"violet"},{"id":1024,"name":"Purple","aliases":[""],"subtag_ids":[1009,1021],"color":"purple"},{"id":1025,"name":"Lavender","aliases":[""],"color":"lavender"},{"id":1026,"name":"Berry","aliases":[""],"color":"berry"},{"id":1027,"name":"Magenta","aliases":[""],"color":"magenta"},{"id":1028,"name":"Salmon","aliases":[""],"color":"salmon"},{"id":1029,"name":"Auburn","aliases":[""],"color":"auburn"},{"id":1030,"name":"Dark Brown","aliases":[""],"color":"dark brown"},{"id":1031,"name":"Brown","aliases":[""],"color":"brown"},{"id":1032,"name":"Light Brown","aliases":[""],"color":"light brown"},{"id":1033,"name":"Blonde","aliases":[""],"color":"blonde"},{"id":1034,"name":"Peach","aliases":[""],"color":"peach"},{"id":1035,"name":"Warm Gray","aliases":["Warm Grey"],"color":"warm gray"},{"id":1036,"name":"Cool Gray","aliases":["Cool Grey"],"color":"cool gray"},{"id":1037,"name":"Olive","aliases":["Olive Drab"],"color":"olive"},{"id":1038,"name":"Duplicate","aliases":[""],"color":"white"},{"id":1039,"name":"Duplicate","aliases":[""],"color":"black"},{"id":1040,"name":"Duplicate","aliases":[""],"color":"gray"},{"id":1041,"name":"Child","aliases":[""],"subtag_ids":[1000]},{"id":2000,"name":"Jump to ID 2000","shorthand":"2000","aliases":[""]}],"collations":[],"fields":[],"macros":[],"entries":[{"id":0,"filename":"Sway.mobi","path":"windows_folder\\Books","fields":[{"8":[]},{"6":[]},{"7":[]},{"0":""},{"2":""},{"1":""},{"3":""},{"4":""},{"5":""},{"27":""},{"28":""},{"29":""},{"30":""}]},{"id":1,"filename":"Around the World in 28 Languages.mobi","path":"posix_folder\\Books","fields":[{"0":"This is a title"},{"6":[1000]},{"8":[1]},{"0":"Title 2 🂹"},{"0":"B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿B̽̾̿"}]},{"id":2,"filename":"sample.epub","path":"Books","fields":[{"0":"Test\\nDon't newline"},{"1":"Test\\tDon't tab"}]},{"id":3,"filename":"sample - Copy (15).odt","path":"OpenDocument","fields":[{"0":"🈩"},{"1":"𝓅𝓇𝑒𝓉𝓉𝓎"},{"0":"⒲⒪⒭⒦"},{"0":"ʤʤʤʤʤʤʤʤʤʤʤʤ"},{"0":"ဪ"}]},{"id":4,"filename":"sample - Copy (14).odt","path":"OpenDocument","fields":[{"0":"مرحباً بالفوكسل السماوي"},{"4":"مرحباً بالفوكسل السماوي\nمرحباً بالفوكسل السماوي\nمرحباً بالفوكسل السماوي\nمرحباً بالفوكسل السماوي"}]},{"id":5,"filename":"sample - Copy (13).odt","path":"OpenDocument","fields":[{"4":"Всім привіт, сьогодні ми проводимо тест tagstudio"}]},{"id":6,"filename":"sample - Copy (12).odt","path":"OpenDocument","fields":[{"1":"𝓗𝓮𝓵𝓵𝓸 𝓮𝓿𝓮𝓻𝔂𝓫𝓸𝓭𝔂 𝓽𝓸𝓭𝓪𝔂 𝔀𝓮 𝓪𝓻𝓮 𝓭𝓸𝓲𝓷𝓰 𝓪 𝓽𝓪𝓰𝓼𝓽𝓾𝓭𝓲𝓸 𝓽𝓮𝓼𝓽"}]},{"id":7,"filename":"sample - Copy (11).odt","path":"OpenDocument","fields":[{"0":"なこに (nakonicafe)"},{"0":"☠ jared ☠"},{"4":"𝓗𝓮𝓵𝓵𝓸 𝓮𝓿𝓮𝓻𝔂𝓫𝓸𝓭𝔂 𝓽𝓸𝓭𝓪𝔂 𝔀𝓮 𝓪𝓻𝓮 𝓭𝓸𝓲𝓷𝓰 𝓪 𝓽𝓪𝓰𝓼𝓽𝓾𝓭𝓲𝓸 𝓽𝓮𝓼𝓽"},{"4":"☠ jared ☠"}]},{"id":8,"filename":"sample - Copy (10).odt","path":"OpenDocument","fields":[{"8":[0]},{"0":"This is a title underneath a Meta Tags"},{"4":"This is a Description underneath a Title"},{"7":[1021,1022,1023]}]},{"id":9,"filename":"sample - Copy (9).odt","path":"OpenDocument","fields":[{"8":[1]},{"8":[]}]},{"id":10,"filename":"sample - Copy (8).odt","path":"OpenDocument","fields":[{"8":[1]},{"7":[]},{"7":[]}]},{"id":20,"filename":"9lfqvtp2.bmp","path":".","fields":[{"0":"This is a Title"},{"2":"This is an Artist"},{"3":"This is a URL"},{"4":"This is line 1 of 2 of this Description.\nThis is line 2 of 2 of this Description."},{"5":"This is line 1 of 2 of these Notes.\nThis is line 2 of 2 of these Notes."},{"6":[1021,1009,1013]},{"7":[1022,1010,1012]},{"8":[0,1]},{"21":"This is a Source"},{"27":"This is a Publisher"},{"1":"This is an Author"},{"28":"This is a Guest Artist"},{"29":"This is a Composer"},{"30":"This is line 1 of 20 of a comments box.\nThis is line 2 of 20 of a comments box.\nThis is line 3 of 20 of a comments box.\nThis is line 4 of 20 of a comments box.\nThis is line 5 of 20 of a comments box.\nThis is line 6 of 20 of a comments box.\nThis is line 7 of 20 of a comments box.\nThis is line 8 of 20 of a comments box.\nThis is line 9 of 20 of a comments box.\nThis is line 10 of 20 of a comments box.\nThis is line 11 of 20 of a comments box.\nThis is line 12 of 20 of a comments box.\nThis is line 13 of 20 of a comments box.\nThis is line 14 of 20 of a comments box.\nThis is line 15 of 20 of a comments box.\nThis is line 16 of 20 of a comments box.\nThis is line 17 of 20 of a comments box.\nThis is line 18 of 20 of a comments box.\nThis is line 19 of 20 of a comments box.\nThis is line 20 of 20 of a comments box."}]},{"id":25,"filename":"u6wt6d6o.bmp","path":".","fields":[{"4":"This is a description box.\nThis is a description box.\nThis is a description box.\nThis is a description box.\nThis is a description box.\nThis is a description box.\nThis is a description box.\nThank you."},{"1":"Author, for the heck of it."}]},{"id":30,"filename":"empty.png","path":"."}]} \ No newline at end of file diff --git a/tagstudio/tests/test_json_migration.py b/tagstudio/tests/test_json_migration.py new file mode 100644 index 00000000..c8ad58e6 --- /dev/null +++ b/tagstudio/tests/test_json_migration.py @@ -0,0 +1,49 @@ +# Copyright (C) 2024 Travis Abendshien (CyanVoxel). +# Licensed under the GPL-3.0 License. +# Created for TagStudio: https://github.com/CyanVoxel/TagStudio + +import pathlib +from time import time + +from src.core.enums import LibraryPrefs +from src.qt.widgets.migration_modal import JsonMigrationModal + +CWD = pathlib.Path(__file__) + + +def test_json_migration(): + modal = JsonMigrationModal(CWD.parent / "fixtures" / "json_library") + modal.migrate(skip_ui=True) + + start = time() + while not modal.done and (time() - start < 60): + pass + + # Entries ================================================================== + # Count + assert len(modal.json_lib.entries) == modal.sql_lib.entries_count + # Path Parity + assert modal.check_path_parity() + # Field Parity + assert modal.check_field_parity() + + # Tags ===================================================================== + # Count + assert len(modal.json_lib.tags) == len(modal.sql_lib.tags) + # Shorthand Parity + assert modal.check_shorthand_parity() + # Subtag/Parent Tag Parity + assert modal.check_subtag_parity() + # Alias Parity + assert modal.check_alias_parity() + # Color Parity + assert modal.check_color_parity() + + # Extension Filter List ==================================================== + # Count + assert len(modal.json_lib.ext_list) == len(modal.sql_lib.prefs(LibraryPrefs.EXTENSION_LIST)) + # List Type + assert modal.check_ext_type() + # No Leading Dot + for ext in modal.sql_lib.prefs(LibraryPrefs.EXTENSION_LIST): + assert ext[0] != "." diff --git a/tagstudio/tests/test_library.py b/tagstudio/tests/test_library.py index 8175c496..26657e9f 100644 --- a/tagstudio/tests/test_library.py +++ b/tagstudio/tests/test_library.py @@ -85,7 +85,7 @@ def test_library_add_file(library): def test_create_tag(library, generate_tag): # tag already exists - assert not library.add_tag(generate_tag("foo")) + assert not library.add_tag(generate_tag("foo", id=1000)) # new tag name tag = library.add_tag(generate_tag("xxx", id=123)) @@ -98,7 +98,7 @@ def test_create_tag(library, generate_tag): def test_tag_subtag_itself(library, generate_tag): # tag already exists - assert not library.add_tag(generate_tag("foo")) + assert not library.add_tag(generate_tag("foo", id=1000)) # new tag name tag = library.add_tag(generate_tag("xxx", id=123)) @@ -132,19 +132,13 @@ def test_library_search(library, generate_tag, entry_full): def test_tag_search(library): tag = library.tags[0] - assert library.search_tags( - FilterState(tag=tag.name.lower()), - ) + assert library.search_tags(tag.name.lower()) - assert library.search_tags( - FilterState(tag=tag.name.upper()), - ) + assert library.search_tags(tag.name.upper()) - assert library.search_tags(FilterState(tag=tag.name[2:-2])) + assert library.search_tags(tag.name[2:-2]) - assert not library.search_tags( - FilterState(tag=tag.name * 2), - ) + assert not library.search_tags(tag.name * 2) def test_get_entry(library, entry_min): From dffa3635b002b1bbef5d3c209bf5099aac6f82e3 Mon Sep 17 00:00:00 2001 From: Theasacraft <91694323+Thesacraft@users.noreply.github.com> Date: Sat, 30 Nov 2024 22:03:57 +0100 Subject: [PATCH 51/82] fix: remove qt disconnect warning (#613) * fix: cannot disconnect from None Warning * fix: cannot disconnect from None Warning mypy compliant --- tagstudio/src/qt/widgets/fields.py | 8 +++----- tagstudio/src/qt/widgets/preview_panel.py | 4 ---- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/tagstudio/src/qt/widgets/fields.py b/tagstudio/src/qt/widgets/fields.py index 2c35f86f..dfcc89d0 100644 --- a/tagstudio/src/qt/widgets/fields.py +++ b/tagstudio/src/qt/widgets/fields.py @@ -113,8 +113,7 @@ class FieldContainer(QWidget): self.copy_callback = callback self.copy_button.clicked.connect(callback) - if callback is not None: - self.copy_button.is_connected = True + self.copy_button.is_connected = callable(callback) def set_edit_callback(self, callback: Callable): if self.edit_button.is_connected: @@ -122,8 +121,7 @@ class FieldContainer(QWidget): self.edit_callback = callback self.edit_button.clicked.connect(callback) - if callback is not None: - self.edit_button.is_connected = True + self.edit_button.is_connected = callable(callback) def set_remove_callback(self, callback: Callable): if self.remove_button.is_connected: @@ -131,7 +129,7 @@ class FieldContainer(QWidget): self.remove_callback = callback self.remove_button.clicked.connect(callback) - self.remove_button.is_connected = True + self.remove_button.is_connected = callable(callback) def set_inner_widget(self, widget: "FieldWidget"): if self.field_layout.itemAt(0): diff --git a/tagstudio/src/qt/widgets/preview_panel.py b/tagstudio/src/qt/widgets/preview_panel.py index 140dd748..70fce9b5 100644 --- a/tagstudio/src/qt/widgets/preview_panel.py +++ b/tagstudio/src/qt/widgets/preview_panel.py @@ -875,10 +875,6 @@ class PreviewPanel(QWidget): else: container = self.containers[index] - container.set_copy_callback(None) - container.set_edit_callback(None) - container.set_remove_callback(None) - if isinstance(field, TagBoxField): container.set_title(field.type.name) container.set_inline(False) From 1974ff169c4ed98f0ae4eef1708de80ef693ada1 Mon Sep 17 00:00:00 2001 From: Travis Abendshien Date: Sat, 30 Nov 2024 15:11:17 -0800 Subject: [PATCH 52/82] refactor: remove 3.12 nested f-string --- tagstudio/src/qt/ts_qt.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index f105ed42..4aa36762 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -696,7 +696,7 @@ class QtDriver(DriverMixin, QObject): pw.update_progress(x + 1), pw.update_label( f"Scanning Directories for New Files...\n{x + 1}" - f" File{"s" if x + 1 != 1 else ""} Searched," + f' File{"s" if x + 1 != 1 else ""} Searched,' f" {tracker.files_count} New Files Found" ), ) From 1fcd31b62f2ec2d617cdf1a77a3fc16a37335ec2 Mon Sep 17 00:00:00 2001 From: Travis Abendshien Date: Sun, 1 Dec 2024 11:56:10 -0800 Subject: [PATCH 53/82] chore: bump ruff to 0.8.1, pillow-jxl-plugin to 1.3.0 --- requirements-dev.txt | 2 +- requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index b6b2c6e6..c80848cc 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,4 +1,4 @@ -ruff==0.6.4 +ruff==0.8.1 pre-commit==3.7.0 pytest==8.2.0 Pyinstaller==6.6.0 diff --git a/requirements.txt b/requirements.txt index e1dff2fc..cd0ddcb4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,7 +6,7 @@ numpy==1.26.4 numpy==1.26.4 opencv_python>=4.8.0.74,<=4.9.0.80 pillow-heif==0.16.0 -pillow-jxl-plugin==1.2.6 +pillow-jxl-plugin==1.3.0 Pillow==10.3.0 pydub==0.25.1 PySide6_Addons==6.7.1 From 691c63e65966c438d5b84e3bfa760591d60032fd Mon Sep 17 00:00:00 2001 From: Travis Abendshien Date: Sun, 1 Dec 2024 13:24:18 -0800 Subject: [PATCH 54/82] docs: update v9.5 roadmap --- docs/updates/roadmap.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/docs/updates/roadmap.md b/docs/updates/roadmap.md index 4ba3f4f8..c5739b7f 100644 --- a/docs/updates/roadmap.md +++ b/docs/updates/roadmap.md @@ -156,11 +156,11 @@ These version milestones are rough estimations for when the previous core featur ### 9.5 (Alpha) -- [ ] SQL backend [HIGH] +- [x] SQL backend [HIGH] - [ ] Translations _(Any applicable)_ [MEDIUM] - [ ] Multiple Root Directories per Library [HIGH] - [ ] Tags [HIGH] - - [ ] Deleting Tags [HIGH] + - [~] Deleting Tags [HIGH] - [ ] Merging Tags [HIGH] - [ ] User-defined tag colors [HIGH] - [ ] ID based, not string or hex [HIGH] @@ -169,11 +169,16 @@ These version milestones are rough estimations for when the previous core featur - [ ] Existing colors are now a set of base colors [HIGH] - [ ] Editable [MEDIUM] - [ ] Non-removable [HIGH] + - [ ] [Tag Categories](../library/tag_categories.md) [HIGH] + - [ ] Property available for tags that allow the tag and any inheriting from it to be displayed separately in the preview panel under a title [HIGH] - [ ] Search engine [HIGH] - - [ ] Boolean operators [HIGH] + - [~] Boolean operators [HIGH] - [ ] Tag objects + autocomplete [HIGH] - - [ ] Filename search [HIGH] - - [ ] Filetype search [HIGH] + - [x] Filename search [HIGH] + - [x] Filetype search [HIGH] + - [x] Search by extension (e.g. ".jpg", ".png") [HIGH] + - [ ] Optional consolidation of extension synonyms (i.e. ".jpg" can equal ".jpeg") [LOW] + - [x] Search by media type (e.g. "image", "video", "document") [MEDIUM] - [ ] Field content search [HIGH] - [ ] Sortable results [HIGH] - [ ] Sort by relevance [HIGH] @@ -200,8 +205,6 @@ These version milestones are rough estimations for when the previous core featur - [ ] Built-in Icon Packs (i.e. Boxicons) [HIGH] - [ ] User Defined Icons [HIGH] - [ ] Multiple Languages for Tag Strings [MEDIUM] - - [ ] [Tag Categories](../library/tag_categories.md) [HIGH] - - [ ] Property available for tags that allow the tag and any inheriting from it to be displayed separately in the preview panel under a title [HIGH] - [ ] Title is tag name [HIGH] - [ ] Title has tag color [MEDIUM] - [ ] Tag marked as category does not display as a tag itself [HIGH] From e4d8f995bb9261b9b48d9898572ae40bfea5fff1 Mon Sep 17 00:00:00 2001 From: Travis Abendshien Date: Sun, 1 Dec 2024 13:33:39 -0800 Subject: [PATCH 55/82] docs: remove partial checkboxes --- docs/updates/roadmap.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/updates/roadmap.md b/docs/updates/roadmap.md index c5739b7f..e204bc3b 100644 --- a/docs/updates/roadmap.md +++ b/docs/updates/roadmap.md @@ -160,7 +160,7 @@ These version milestones are rough estimations for when the previous core featur - [ ] Translations _(Any applicable)_ [MEDIUM] - [ ] Multiple Root Directories per Library [HIGH] - [ ] Tags [HIGH] - - [~] Deleting Tags [HIGH] + - [ ] Deleting Tags [HIGH] - [ ] Merging Tags [HIGH] - [ ] User-defined tag colors [HIGH] - [ ] ID based, not string or hex [HIGH] @@ -172,7 +172,7 @@ These version milestones are rough estimations for when the previous core featur - [ ] [Tag Categories](../library/tag_categories.md) [HIGH] - [ ] Property available for tags that allow the tag and any inheriting from it to be displayed separately in the preview panel under a title [HIGH] - [ ] Search engine [HIGH] - - [~] Boolean operators [HIGH] + - [ ] Boolean operators [HIGH] - [ ] Tag objects + autocomplete [HIGH] - [x] Filename search [HIGH] - [x] Filetype search [HIGH] From 8ba23c5d54499309bf5693be6df9e3be353ff74d Mon Sep 17 00:00:00 2001 From: VasigaranAndAngel <72515046+VasigaranAndAngel@users.noreply.github.com> Date: Tue, 3 Dec 2024 01:41:39 +0530 Subject: [PATCH 56/82] fix: clear all setting values when opening a library (#622) --- tagstudio/src/qt/ts_qt.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index 4aa36762..c1e0b934 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -1183,7 +1183,7 @@ class QtDriver(DriverMixin, QObject): all_libs_list = sorted(all_libs.items(), key=lambda item: item[0], reverse=True) # remove previously saved items - self.settings.clear() + self.settings.remove("") for item_key, item_value in all_libs_list[:item_limit]: self.settings.setValue(item_key, item_value) From a630b09b4f5f47604f8fb5e19fdec4f5ada16391 Mon Sep 17 00:00:00 2001 From: VasigaranAndAngel <72515046+VasigaranAndAngel@users.noreply.github.com> Date: Wed, 4 Dec 2024 00:09:44 +0530 Subject: [PATCH 57/82] fix: remove/rework windows path tests (#625) * fix: tagstudio/tests/test_driver.py::test_evaluate_path_last_lib_present always fails in windows. * refactor: removal tagstudio/tests/test_library.py::test_save_windows_path Fixes #616 --- tagstudio/tests/test_driver.py | 5 ++++- tagstudio/tests/test_library.py | 24 +----------------------- 2 files changed, 5 insertions(+), 24 deletions(-) diff --git a/tagstudio/tests/test_driver.py b/tagstudio/tests/test_driver.py index 65882d68..240406f9 100644 --- a/tagstudio/tests/test_driver.py +++ b/tagstudio/tests/test_driver.py @@ -53,9 +53,12 @@ def test_evaluate_path_last_lib_not_exists(): def test_evaluate_path_last_lib_present(): # Given - settings = QSettings() with TemporaryDirectory() as tmpdir: + settings_file = tmpdir + "/test_settings.ini" + settings = QSettings(settings_file, QSettings.Format.IniFormat) settings.setValue(SettingItems.LAST_LIBRARY, tmpdir) + settings.sync() + makedirs(Path(tmpdir) / TS_FOLDER_NAME) driver = TestDriver(settings) diff --git a/tagstudio/tests/test_library.py b/tagstudio/tests/test_library.py index 26657e9f..25f1303b 100644 --- a/tagstudio/tests/test_library.py +++ b/tagstudio/tests/test_library.py @@ -1,4 +1,4 @@ -from pathlib import Path, PureWindowsPath +from pathlib import Path from tempfile import TemporaryDirectory import pytest @@ -264,28 +264,6 @@ def test_preferences(library): assert library.prefs(pref) == pref.default -def test_save_windows_path(library, generate_tag): - # pretend we are on windows and create `Path` - - entry = Entry( - path=PureWindowsPath("foo\\bar.txt"), - folder=library.folder, - fields=library.default_fields, - ) - tag = generate_tag("win_path") - tag_name = tag.name - - library.add_entries([entry]) - # library.add_tag(tag) - library.add_field_tag(entry, tag, create_field=True) - - results = library.search_library(FilterState(tag=tag_name)) - assert results - - # path should be saved in posix format - assert str(results[0].path) == "foo/bar.txt" - - def test_remove_entry_field(library, entry_full): title_field = entry_full.text_fields[0] From 461d1030269d5ae53a02d56db2b012f2988da5b3 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Tue, 3 Dec 2024 19:48:23 +0100 Subject: [PATCH 58/82] translations: add Filipino translation (#584) Currently translated at 75.3% (107 of 142 strings) Translated using Weblate (Filipino) Currently translated at 50.0% (71 of 142 strings) Added translation using Weblate (Filipino) Translate-URL: https://hosted.weblate.org/projects/tagstudio/strings/fil/ Translation: TagStudio/Strings Co-authored-by: searinminecraft <114207889+searinminecraft@users.noreply.github.com> --- tagstudio/resources/translations/fil.json | 110 ++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 tagstudio/resources/translations/fil.json diff --git a/tagstudio/resources/translations/fil.json b/tagstudio/resources/translations/fil.json new file mode 100644 index 00000000..4f129b95 --- /dev/null +++ b/tagstudio/resources/translations/fil.json @@ -0,0 +1,110 @@ +{ + "add_field.add": "Magdagdag ng Field", + "build_tags.add_parent_tags": "Magdagdag ng Mga Parent Tag", + "build_tags.parent_tags": "Mga Parent Tag", + "delete_unlinked.confirm": "Sigurado ka ba gusto mong burahin ang (mga) sumusunod na %{len(self.lib.missing_files)} entry?", + "delete_unlinked.delete_entries": "Binubura ang Mga Entry", + "delete_unlinked.delete_unlinked": "Burahin ang Mga Hindi Naka-link na Entry", + "delete_unlinked.deleting_number_entries": "Binubura ang %{x[0]+1}/{len(self.lib.missing_files)} (mga) Naka-unlink na Entry", + "dialog.open_create_library": "Magbukas/Gumawa ng Library", + "dialog.refresh_directories": "Nire-refresh ang Mga Direktoryo", + "dialog.save_library": "I-save ang Library", + "dialog.scan_directories": "Sina-scan ang Mga Direktoryo para sa Mga Bagong File...\nNaghahanda...", + "dialog.scan_directories.new_files": "Sina-scan ang Mga Direktoryo para sa Mga Bagong File...\n%{x + 1} %{\"mga\" if x + 1 != 1 else \"\"} File na nahanap, %{len(self.lib.files_not_in_library)} Mga Bagong File na Nahanap", + "file_extension.add_extension": "Magdagdag ng Extension", + "file_extension.list_mode": "Mode ng Pag-lista:", + "file_opener.command_not_found": "Hindi mahanap ang %{command_name} sa system PATH", + "file_opener.not_found": "Hindi nahanap ang file:", + "file_opener.open_file": "Binubuksan ang file:}", + "fix_dupes.fix_dupes": "Ayusin ang Mga Duplicate na File", + "fix_dupes.load_file": "Mag-load ng DupeGuru File", + "fix_dupes.mirror_description": "Mirror the Entry data across each duplicate match set, combining all data while not removing or duplicating fields. This operation will not delete any files or data.", + "fix_dupes.mirror_entries": "Mga Entry ng Salamin", + "fix_dupes.no_file_selected": "Walang DupeGuru na File na Napili", + "generic.add": "Magdagdag", + "generic.aliases": "Mga Alyas", + "generic.apply": "I-apply", + "generic.cancel": "Kanselahin", + "generic.close_all": "Isara Lahat", + "generic.color": "Kulay", + "generic.delete": "Burahin", + "generic.done": "Tapos na", + "generic.exclude": "Huwag isama", + "generic.file_extension": "Mga File Extension", + "generic.include": "Isama", + "generic.mirror": "Salamin", + "generic.name": "Pangalan", + "generic.open_all": "Buksan Lahat", + "generic.open_file": "Buksan ang file", + "generic.open_file_explorer": "Buksan ang file sa explorer", + "generic.refresh_all": "I-refresh Lahat", + "generic.remove_field": "Tanggalin ang Field", + "generic.search_tags": "Maghanap ng Mga Tag", + "generic.shorthand": "Shorthand", + "home.base_title": "TagStudio Alpha", + "home.include_all_tags": "And (sinasama ang Lahat ng Mga Tag)", + "home.include_any_tag": "Or (Sinasama ang Anumang Tag)", + "home.main_window": "Main na Window", + "home.search": "Maghanap", + "home.search_entries": "Mga Entry sa Paghahanap", + "home.thumbnail_size": "Laki ng Thumbnail", + "library.Artist": "Artista", + "library.anthology": "Antolohiya", + "library.archived": "Petsa na Na-archve", + "library.author": "Awtor", + "library.book": "Aklat", + "library.collation": "Collation", + "library.comic": "Komik", + "library.comments": "Mga Komento", + "library.composer": "Kompositor", + "library.content_tags": "Mga Tag ng Content", + "library.date": "Petsa", + "library.date_created": "Petsa na Ginawa", + "library.date_modified": "Binago Noong", + "library.date_published": "Petsa na Inilabas", + "library.date_released": "Petsa na na-release", + "library.date_taken": "Kinuha Noong", + "library.date_uploaded": "Petsa na Na-upload", + "library.description": "Paglalarawan", + "library.favorite": "Paborito", + "library.guest_artist": "Bisitang Artista", + "library.magazine": "Magasin", + "library.manga": "Manga", + "library.meta_tags": "Mga Meta Tag", + "library.notes": "Mga tala", + "library.publisher": "Tagapaglathala", + "library.series": "Serye", + "library.source": "Pinagmulan", + "library.tags": "Mga Tag", + "library.title": "Paksa", + "library.url": "URL", + "library.volume": "Volume", + "menu.edit": "I-edit", + "menu.file": "File", + "menu.help": "Tulong", + "menu.macros": "Mga macro", + "menu.tools": "Mga tool", + "menu.window": "Window", + "merge.merge_dupe_entries": "Sinasama ang mga Duplicate na Entry", + "merge.window_title": "Sinasama ang mga Duplicate na Entry", + "open_library.library_creation_return_code": "Return Code ng Paggawa ng Library:", + "open_library.no_tagstudio_library_found": "Walang umiiral na TagStudio library na nahanap sa '%{path}'. Gumagawa ng isa.", + "open_library.title": "Library", + "preview.dimensions": "Laki", + "preview.recent": "Mga Kamakailang Library", + "progression.running_macros.new_entries": "Tumatakbo ng Mga Macro sa Mga Bagong Entry", + "progression.running_macros.one_new_entry": "Tinatakbo ang Mga Naka-configure na Macro sa 1/%{len(new_ids)} Mga Bagong Entry", + "progression.running_macros.several_new_entry": "Tinatakbo ang Mga Naka-configure na Macro sa %{x + 1}/%{len(new_ids)} Mga Bagong Entry", + "splash.open_library": "Binubuksan ang Library", + "status.backup_success": "Na-save ang Library Backup sa:", + "status.enumerate_query": "Query:%{query}, Frame: %{i}, Haba: %{len(f)}", + "status.number_results_found": "%{len(all_items)} Nakahanap ng Mga Resulta para sa \"%{query}\" (%{format_timespan(end_time - start_time)})", + "status.results_found": "Mga Resulta", + "status.save_success": "Sinave at Sinara ang Library!", + "status.search_library_query": "Hinahanap ang library para sa", + "tag.add": "Magdagdag ng Tag", + "tag.library": "Mga Tag ng Library", + "tag.new": "Bagong Tag", + "tooltip.open_library": "Ctrl+O", + "tooltip.save_library": "Ctrl+S" +} From 47babdd5b516927fd16cb6d35474b2a9f12c2162 Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Tue, 3 Dec 2024 12:59:27 -0800 Subject: [PATCH 59/82] docs: update README.md and index.md --- README.md | 160 ++++++++++++++++--------------------- docs/assets/db_schema.png | Bin 141713 -> 0 bytes docs/assets/screenshot.jpg | Bin 544067 -> 871194 bytes docs/index.md | 59 +++++++++----- 4 files changed, 109 insertions(+), 110 deletions(-) delete mode 100644 docs/assets/db_schema.png diff --git a/README.md b/README.md index bb0d5b28..e865bae7 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,19 @@ # TagStudio: A User-Focused Document Management System +[![Translation](https://hosted.weblate.org/widget/tagstudio/strings/svg-badge.svg)](https://hosted.weblate.org/projects/tagstudio/strings/) +[![PyTest](https://github.com/TagStudioDev/TagStudio/actions/workflows/pytest.yaml/badge.svg)](https://github.com/TagStudioDev/TagStudio/actions/workflows/pytest.yaml) +[![MyPy](https://github.com/TagStudioDev/TagStudio/actions/workflows/mypy.yaml/badge.svg)](https://github.com/TagStudioDev/TagStudio/actions/workflows/mypy.yaml) +[![Ruff](https://github.com/TagStudioDev/TagStudio/actions/workflows/ruff.yaml/badge.svg)](https://github.com/TagStudioDev/TagStudio/actions/workflows/ruff.yaml) +[![Downloads](https://img.shields.io/github/downloads/TagStudioDev/TagStudio/total.svg?maxAge=2592001)](https://github.com/TagStudioDev/TagStudio/releases) +

    -TagStudio is a photo & file organization application with an underlying system that focuses on giving freedom and flexibility to the user. No proprietary programs or formats, no sea of sidecar files, and no complete upheaval of your filesystem structure. **Read the documentation and more at [docs.tagstud.io](https://docs.tagstud.io)!** +TagStudio is a photo & file organization application with an underlying tag-based system that focuses on giving freedom and flexibility to the user. No proprietary programs or formats, no sea of sidecar files, and no complete upheaval of your filesystem structure. **Read the documentation and more at [docs.tagstud.io](https://docs.tagstud.io)!** > [!CAUTION] -> **As of Pull Request [#332](https://github.com/TagStudioDev/TagStudio/pull/332) (SQLite Migration) the `main` branch will be an open test bed to get full JSON to SQL parity operational.** Existing TagStudio libraries are not yet compatible with this change, however they will **NOT be corrupted or deleted** if opened with these versions. Once parity is reached and a stable conversion tool in place, this notice will be removed. +> As of Pull Request [#332](https://github.com/TagStudioDev/TagStudio/pull/332) (SQLite Migration) the `main` branch will be an open test bed to get full JSON to SQL parity operational. This notice will be removed once parity between v9.4 and v9.5 is reached. > > For the most recent stable feature release branch, see the [`Alpha-v9.4`](https://github.com/TagStudioDev/TagStudio/tree/Alpha-v9.4) branch. These v9.4 specific features are currently being backported to the SQL-ized `main` branch. [Feel free to help!](/CONTRIBUTING.md) @@ -20,10 +26,11 @@ TagStudio is a photo & file organization application with an underlying system t > - Ask you to recreate your tags or libraries after new releases. It's our highest priority to ensure that your data safely and smoothly transfers over to newer versions. > - Cause you to suddenly be able to recall your 10 trillion downloaded images that you probably haven't even seen firsthand before. You're in control here, and even tools out there that use machine learning still needed to be verified by human eyes before being deemed accurate. +

    + TagStudio Screenshot +

    - TagStudio Screenshot - -
    TagStudio Alpha v9.1.0 running on Windows 10.
    +
    TagStudio Alpha v9.4.2 running on Windows 10.
    ## Contents @@ -38,51 +45,76 @@ TagStudio is a photo & file organization application with an underlying system t ## Goals -- To achieve a portable, privacy-oriented, open, extensible, and feature-rich system of organizing and rediscovering files. -- To provide powerful methods for organization, notably the concept of tag composition, or “taggable tags”. -- To create an implementation of such a system that is resilient against a user’s actions outside the program (modifying, moving, or renaming files) while also not burdening the user with mandatory sidecar files or otherwise requiring them to change their existing file structures and workflows. +- To achieve a portable, private, extensible, open-format, and feature-rich system of organizing and rediscovering files. +- To provide powerful methods for organization, notably the concept of tag inheritance, or “taggable tags” _(and in the near future, the combination of composition-based tags)._ +- To create an implementation of such a system that is resilient against a user’s actions outside the program (modifying, moving, or renaming files) while also not burdening the user with mandatory sidecar files or requiring them to change their existing file structures and workflows. - To support a wide range of users spanning across different platforms, multi-user setups, and those with large (several terabyte) libraries. - To make the darn thing look like nice, too. It’s 2024, not 1994. ## Priorities -1. **The concept.** Even if TagStudio as a project or application fails, I’d hope that the idea lives on in a superior project. The [goals](#goals) outlined above don’t reference TagStudio once - _TagStudio_ is what references the _goals._ +1. **The concept.** Even if TagStudio as an application fails, I’d hope that the idea lives on in a superior project. The [goals](#goals) outlined above don’t reference TagStudio once - _TagStudio_ is what references the _goals._ 2. **The system.** Frontends and implementations can vary, as they should. The core underlying metadata management system is what should be interoperable between different frontends, programs, and operating systems. A standard implementation for this should settle as development continues. This opens up the doors for improved and varied clients, integration with third-party applications, and more. 3. **The application.** If nothing else, TagStudio the application serves as the first (and so far only) implementation for this system of metadata management. This has the responsibility of doing the idea justice and showing just what’s possible when it comes to user file management. -4. (The name.) I think it’s fine for an app or client, but it doesn’t really make sense for a system or standard. I suppose this will evolve with time. - -## Current Features - -- Create libraries/vaults centered around a system directory. Libraries contain a series of entries: the representations of your files combined with metadata fields. Each entry represents a file in your library’s directory, and is linked to its location. -- Add metadata to your library entries, including: - - Name, Author, Artist (Single-Line Text Fields) - - Description, Notes (Multiline Text Fields) - - Tags, Meta Tags, Content Tags (Tag Boxes) -- Create rich tags composed of a name, a list of aliases, and a list of “subtags” - being tags in which these tags inherit values from. -- Search for entries based on tags, ~~metadata~~ (TBA), or filenames/filetypes (using `filename: `) -- Special search conditions for entries that are: `untagged`/`no tags` and `empty`/`no fields`. - -> [!NOTE] -> For more information on the project itself, please see the [FAQ](#faq) section as well as the [documentation](/docs/index.md). +4. (The name.) I think it’s fine for an app or client, but it doesn’t really make sense for a system or standard. I suppose this will evolve with time... ## Contributing If you're interested in contributing to TagStudio, please take a look at the [contribution guidelines](/CONTRIBUTING.md) for how to get started! -Translation services provided via [Weblate](https://hosted.weblate.org/projects/tagstudio/). +Translation hosting generously provided by [Weblate](https://weblate.org/en/). Check out our [project page](<(https://hosted.weblate.org/projects/tagstudio/)>) to help translate TagStudio! + +## Current Features + +### Libraries + +- Create libraries/vaults centered around a system directory. Libraries contain a series of entries: the representations of your files combined with metadata fields. Each entry represents a file in your library’s directory, and is linked to its location. +- Address moved, deleted, or otherwise "unlinked" files by using the "Fix Unlinked Entries" option in the Tools menu. + +### Metadata + Tagging + +- Add metadata to your library entries, including: + - Name, Author, Artist (Single-Line Text Fields) + - Description, Notes (Multiline Text Fields) + - Tags, Meta Tags, Content Tags (Tag Boxes) +- Create rich tags composed of a name, a list of aliases, and a list of “parent tags” - being tags in which these tags inherit values from. +- Copy and paste tags and fields across file entries +- Generate tags from your existing folder structure with the "Folders to Tags" macro (NOTE: these tags do NOT sync with folders after they are created) + +### Search + +- Search for entries based on tags, ~~metadata~~ (TBA), or filenames/filetypes (using `filename: `). +- Special search conditions for entries that are: `untagged` and `empty`. + +### File Entries + +- All\* file types are supported in TagStudio libraries - just not all have dedicated thumbnail support. +- Preview most image file types, animated GIFs, videos, plain text documents, audio files\*\*, Blender projects, and more! +- Open files or file locations by right-clicking on thumbnails and previews and selecting the respective context menu options. You can also click on the preview panel image to open the file, and click the file path label to open its location. +- Delete files from both your library and drive by right-clicking the thumbnail(s) and selecting the "Move to Trash"/"Move to Recycle Bin" option. + +> - _\* Weird files with no extension or files such as ".\_DS_Store" currently have limited support._ +> - _\*\* Audio playback coming in v9.5_ + +> [!NOTE] +> For more information on the project itself, please see the [FAQ](#faq) section as well as the [documentation](https://docs.tagstud.io/). ## Installation To download TagStudio, visit the [Releases](https://github.com/TagStudioDev/TagStudio/releases) section of the GitHub repository and download the latest release for your system under the "Assets" section. TagStudio is available for **Windows**, **macOS** _(Apple Silicon & Intel)_, and **Linux**. Windows and Linux builds are also available in portable versions if you want a more self-contained executable to move around. -For video thumbnails and playback, you'll also need [FFmpeg](https://ffmpeg.org/download.html) installed on your system. +**We do not currently publish TagStudio to any package managers. Any TagStudio distributions outside of the GitHub releases page are _unofficial_ and not maintained by us.** Installation support will not be given to users installing from unofficial sources. Use these versions at your own risk. > [!IMPORTANT] > On macOS, you may be met with a message saying _""TagStudio" can't be opened because Apple cannot check it for malicious software."_ If you encounter this, then you'll need to go to the "Settings" app, navigate to "Privacy & Security", and scroll down to a section that says _""TagStudio" was blocked from use because it is not from an identified developer."_ Click the "Open Anyway" button to allow TagStudio to run. You should only have to do this once after downloading the application. -#### Optional Arguments +### Third-Party Dependencies -Optional arguments to pass to the program. +- For video thumbnails and playback, you'll also need [FFmpeg](https://ffmpeg.org/download.html) installed on your system. + +### Optional Arguments + +Arguments available to pass to the program, either via the command line or a shortcut. > `--open ` / `-o ` > Path to a TagStudio Library folder to open on start. @@ -145,7 +177,7 @@ Inevitably, some of the files inside your library will be renamed, moved, or del ### Saving the Library -Libraries are saved upon exiting the program. To manually save, select File -> Save Library from the menu bar. To save a backup of your library, select File -> Save Library Backup from the menu bar. +Libraries are saved upon exiting the program. To manually save, select File -> Save Library from the menu bar. To save a backup of your library, select File -> Save Library Backup from the menu bar. Automatic backups are created when loading a library, and are automatically loaded from in the event of a crash or unexpected system shutdown. ### Half-Implemented Features @@ -185,74 +217,20 @@ See instructions in the "[Creating Development Environment](/CONTRIBUTING.md/#cr ### What State Is the Project Currently In? -As of writing (Alpha v9.3.0) the project is in a useable state, however it lacks proper testing and quality of life features. +As of writing (Alpha v9.4.2) the project is in a useable state, however includes several metadata field bugs and lacks several quality of life features. Focus has been on developing v9.5 with a new SQLite backend which will allow us to not only fix these bugs but also to give us a jumping off point for some [pretty cool](https://docs.tagstud.io/updates/roadmap/) features we've been wanting to add for quite a while now! ### What Features Are You Planning on Adding? -> [!IMPORTANT] -> See the [Feature Roadmap](/docs/updates/roadmap.md) documentation for the latest feature lists. The lists here are currently being migrated over there with individual pages for larger features. +See the [Feature Roadmap](https://docs.tagstud.io/updates/roadmap/) page for the core features being planned and implemented for TagStudio. For a more up to date look on what's currently being added for upcoming releases, see our GitHub [milestones](https://github.com/TagStudioDev/TagStudio/milestones) for versioned releases. -Of the several features I have planned for the project, these are broken up into “priority” features and “future” features. Priority features were originally intended for the first public release, however are currently absent from the Alpha v9.x.x builds. - -#### Priority Features - -- Improved search - - Sortable Search - - Boolean Search - - Coexisting Text + Tag Search - - Searchable File Metadata -- Comprehensive Tag management tab -- Easier ways to apply tags in bulk - - Tag Search Panel - - Recent Tags Panel - - Top Tags Panel - - Pinned Tags Panel -- Better (stable, performant) library grid view -- Improved entry relinking -- Cached thumbnails -- Tag-like Groups -- Resizable thumbnail grid -- User-defined metadata fields -- Multiple directory support -- SQLite (or similar) save files -- Reading of EXIF and XMP fields -- Improved UI/UX -- Better internal API for accessing Entries, Tags, Fields, etc. from the library. -- Proper testing workflow -- Continued code cleanup and modularization -- Exportable/importable library data including "Tag Packs" - -#### Future Features - -- Support for multiple simultaneous users/clients -- Draggable files outside the program -- Comprehensive filetype whitelist -- A finished “macro system” for automatic tagging based on predetermined criteria. -- Different library views -- Date and time fields -- Entry linking/referencing -- Audio waveform previews -- 3D object previews -- Additional previews for miscellaneous file types -- Optional global tags and settings, spanning across libraries -- Importing & exporting libraries to/from other programs -- Port to a more performant language and modern frontend (Rust?, Tauri?, etc.) -- Plugin system -- Local OCR search -- Support for local machine learning-based tag suggestions for images -- Mobile version _(FAR future)_ - -#### Features I Likely Won’t Add/Pull +### Features That Will NOT Be Added - Native Cloud Integration - - There are plenty of services already (native or third-party) that allow you to mount your cloud drives as virtual drives on your system. Pointing TagStudio to one of these mounts should function similarly to what native integration would look like. + - There are plenty of services already (native or third-party) that allow you to mount your cloud drives as virtual drives on your system. Hosting a TagStudio library on one of these mounts should function similarly to what native integration would look like. + - Supporting native cloud integrations such as these would be an unnecessary "reinventing the wheel" burden for us that is outside the scope of this project. - Native ChatGPT/Non-Local LLM Integration - - This could mean different things depending on what you're intending. Whether it's trying to use an LLM to replace the native search, or to trying to use a model for image recognition, I'm not interested in hooking people's TagStudio libraries into non-local LLMs such as ChatGPT and/or turn the program into a "chatbot" interface (see: [Goals/Privacy](#goals)). I wouldn't, however, mind using **locally** hosted models to provide the _optional_ ability for additional searching and tagging methods (especially when it comes to facial recognition). + - This could mean different things depending on your intentions. Whether it's trying to use an LLM to replace the native search, or to trying to use a model for image recognition, I'm not interested in hooking people's TagStudio libraries into non-local LLMs such as ChatGPT and/or turn the program into a "chatbot" interface (see: [Goals/Privacy](#goals)). I wouldn't, however, mind using **locally** hosted models to provide the _optional_ ability for additional searching and tagging methods (especially when it comes to facial recognition) - but this would likely take the form of plugins external to the core program anyway. -### Why Is the Version Already v9? +### Why Is this Already Version 9? -I’ve been developing this project over several years in private, and have gone through several major iterations and rewrites in that time. This “major version” is just a number at the end of the day, and if I wanted to I couldn’t released this as “Version 0” or “Version 1.0”, but I’ve decided to stick to my original version numbers to avoid needing to go in and change existing documentation and code comments. Version 10 is intended to include all of the “Priority Features” I’ve outlined in the [previous](#what-features-are-you-planning-on-adding) section. I’ve also labeled this version as an Alpha, and will likely reset the numbers when a feature-complete beta is reached. - -### Wait, Is There a CLI Version? - -As of right now, **no**. However, I _did_ have a CLI version in the recent past before dedicating my efforts to the Qt GUI version. I’ve left in the currently-inoperable CLI code just in case anyone was curious about it. Also yes, it’s just a bunch of glorified print statements (_the outlook for some form of curses on Windows didn’t look great at the time, and I just needed a driver for the newly refactored code...)._ +Over the first few years of private development the project went through several major iterations and rewrites. These major version bumps came quickly, and by the time TagStudio was opened-sourced the version number had already reached v9.0. Instead of resetting to "v0.0" or "v1.0" for this public release I decided to keep my v9.x numbering scheme and reserve v10.0 for when all the core features on the [Feature Roadmap](https://docs.tagstud.io/updates/roadmap/) are implemented. I’ve also labeled this version as an "Alpha" and will drop this once either all of the core features are implemented or the project feels stable and feature-rich enough to be considered "Beta" and beyond. diff --git a/docs/assets/db_schema.png b/docs/assets/db_schema.png deleted file mode 100644 index f611542fb31ef2bfa1f2c352e01c382eb04cda7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141713 zcmeFZcTkgS^Ea;8D>g(xK&43+kQxva73tE20MSrF3!P8{Vne!8r39o40YZR;PDGk? z=^-?c4xvLJ)ZdMs^PJ=PKHqodH}n4W&Y5wX%uRBYy>>sl``Nv2|Ho6M>hTFlo%wF8Md*I;Vb8>(EC-?62-i1PA-M|Ah$FDvA z>%Y&XYbR>d&Qfmt?HTabPS%(`J@or1&xwlU`+p6(|LNRKIr62qO`nebKJEc* zIMM&FY4$%|d;FZpeJ)z#%x?=ja1hFcz4-eyavu+1wXO-IF#fjG12i>iP_Eync`kPl znjvTSQ1tJ61(x*|RipNgX?%g7`xXaT{eAbqvd)40QU92R=Ez$VjRQmX-^91S(`$$e zp!2^!JACpS=*SP@EZ^UEDo18V{C9zB|0~eHB>1mDf7jZ7HS}MT{|%k~#n9hy^$(}? zFNXdNHvYxXzX=0yE&pQZzZm*2hW-)I{u_t>rV2Fw2KN7EN`Ivvz^8vx&)*X7e{=bN zbNSyQ?tjUV->9K~*`|N#yWd#FfAFE7%RcKteAJ)H9q?TQIK-j24~u5{hyKG@${C)D zh}5f$H$GQ!${gKdgUflM{Jd7zkoL&Ajhp`@H;oS`hp*CPb9{!fa%eo}rr`ys#){iQ zyjdE5@vl$2Pt|C51ZD>7ui43ft~mVDp9#_kMXo}vOl~A7J{ifPzlQLzgzD~;wVwSC zIf>T%zQrnr+FTpx#73_)F0^r(w?c}SJ1_Ua)p6ULOkq-X6qPm}!3_Fb;{`Fs&cZM& zh9aMCz3!M{%0fjH3=j27v<^gHj1$|l!IO;3y>PpNi8IkIyy@^z zu|3u}d^|ACRHuIlwO2kgA!1>u%oh0qCX^$6@pw(;?|g9{<6+HC;dB^XQMQEm9w`Eq zu@Heia=I>JT0gLIv3%K6b6K`KY?DeV+)c}!zvHs|TDi9;NBxSs@H0F~%&spB^Qm;= zW1p3^tdD+NraebM5g+-jCBu>4i{w(y;PcwzXVKNd;setdOKfeSD|j=`kx$l z@{v1xKjN0?Mav)NwmU+^|8x|2kG6xe44dffRDQohi7 zsGu8f0?YJHpDeti?oFZUT?}^u=KPXo4G3{t@ynaUB2E{Vb=4NWsX+JKSCT*1`*&jf z+&YaYE*SX9lcp0zt?NrsTIT2+?DQuwNQ)hutIfg*kjkUBTQNEKhD`Sz6^x=fii#PG z+ziXV-e7|poM!!I?oI733NX{a@_8?fi<49^7dH*gc9Ce`m8K1=U$|4zDf>}y!bPU} z{N*E z#Kc^N&z2!!11NF$#fAVf=J*Hyae~w_4rXP#I8E&s>iBnRryBeWl0gAxG`zC%@>=erM4u6F z$*H=w$`1O@C^H&gxAWH!bx1ZQK_4rd|5Qw_seRvlS#OT!7suGw@_7AP{C0io%V585 zuJo~qxm#d3A)zAgM_qBwB4SvkpnHN+6Ac{UZcM_siwTXstl7D@NB+l(&x-a7=3I4? zSXTTpyow?l)$R#{;n5gpE0Le_2^i0rI$f@%L=2nRi^Yl z-AOFSSg7oG$M=HlW&^4EOoG?X#nIHX7TcMctk4GL-1`&mlDQY>TxGLpi^!EOy%s84 zvl&c#F$pd+y_6#>KgyRM`V1RDs4Y&rtJ!@vI6AsWudv0;D07*>X;-K3BX13!8tV^i z#B8B_S2=K&J16(;m8;G8Lk_+*PDZw=PW^(I&8A`{(E$lvj;#EE=L4`I@PB}kN}qcH zCfiE7bFU0N2HDIl!E8@R?jb^VBJ}1IjQn9jJB_n5aa}Y;o(t2HTlzil*GEknYsTVr zGyANx`0QLSMHbVo7)m;wduw(OI%#ELYC;tZg3JGBi=26u;m(`QuQN;pCnLqRL{1qE zA{k=(2d&m4hovX?7Dp#$#cfsFc$`)+3W+M8W|#QVA$zi7b{eO&d#`r2truiZo+NDT zF60olr8Z5Ww!3RDtKOHtK-oq=_sEU;pYZWq&h&6s6Ns*^}5#=vHz^GeWBY}MlX1iZpbowQf0YX8sDUb zc9&!rABJi@Col4%h!dSDefJJojWUhH=6Umi zpEb)bfY^R*cZ9}|mNhqfpox~oTK{87Nl987N3(Gg0Fn^zHB~h=dO9Se2}@Okp?`9x8?T<3}t{t_@ zhS;3x7Gect^j06J?k>)oH&?FPT%kFBU-db$M7Q(uRt4WVN3!#&_?p&FI0NlhfL!kD z{^=iHodQOOSQ}n@MVuD3zW`$EKV=FBwjl3ViQpaT(Ysl&i!#_|%3!>h2M>=vT-afA#_Z zw&v-ZeP(~Nu|Uz=%~ix|frIY)uSt5{rl9K;b*<-UxUeGTU`esl!1opf|5U{(zn`qYph7~=ghj+s;a8Z zmuI&3xiQuU9}BakMMOLU+3mK;O`lxYb?-j-qs)HI5RmD-!6=Ot*~Z$s%)I~{9J0ON zKafr1o0&PCl$4a48<)`*FJu3a5@+Z0e z@@}=FKqJoLk|e4|$RZHb9{)rG3@|rSDtY_%ZBfy=o(Mnz=XnJDQ+5?^i%0&^ZLoi& z4Mx_6a;%_kV>OA9f|OCm+hs~W;c4RnaicF9%q}S+QdXF~y}8C@b+W=^jnPj=ruOG~ zCrmZpJ>ZMulp`CCCIt?z2cfLk&KYd5BXV(^5jzjA86QT_MXRW(@dSK%rruT*^p80| z>yfp$II7;LLo;ALA(DV`vC#~BZB=)pdkd=*AYN3LARD5>@acU$olx)z?K^Pz+{P4* z12agKQ){oncbI<9YkgP#t1Llqx6jA!v#D^-(kjl}b=ZfjEt}-)rw*M|u(5^4-`sDxXhW1CHU>*Hqc}ExB$X<2Ap+0pCX_YV62l zg81V6j^9Z8()O1h5rryq3N7IzjP1n)%mn>q+RzY!=U&p@klY3XrfWjUfP9+y<0>dukh4J}fnsv*+ajntMk8IezMOcl1jFLWVyeO0HOLyRNm@Zg&Tm zX`7jY_oy=RU>h+eEGmYOGB&tHiy7Vqt&%USarmR&-=GykWHH}`jD!=p3sagK&&yqV zL8BL)yE3K?2E#GKU zV3!ksK^O?Z*TEs54K8j>^s`EI>moZPNs7z+?JN5VwdQa;o}H~BvxH7HXHoz%O`fZC zU(wuZc!PXxncvn45orv)Y6k~zW;TR#C<>eF-Nq$M7Y}qh<)l=km3X@vXH8NbX%6kC zrIBodL2CI%S7)?)I}zo$+|S>$+baTU$N}jhlNbtRU?-<&T}d^Ho#CW)R8i90Mmv(T zp(MM~iaV{?m=|H;8XF4TeDK3UDxR20(OU)9UD6{pPZp$c;QyS7pXpa1Um6+=nr%D5 z6ncQ>{Q0-*#7vg7pe{nvYhYQn7~6%oye!Gbdkf^1W3a6JB9A7^TKe>8r%|u<%IrhY zEWD?piZ;#YR>&0vqUraeZ{AdN8O*IUyo{B$P;rcM)fMV@dD`n=COB;Iny#rPlSVNt zAI!=xU{}|16+^>)X5Cnl2UT3IK*58I>4O4eM(Wkp!ao7l0J~4((0#EFF2#ts(&U>s zmo*Kv&{5tS|M4<4YDm*F*Etn6m6jS5v_iDg$ED!+us3PdqS!s|i^4eLuQGgi(&|mp zB-Lo!rR+{Y-(sDXsf*dx=`OFDn^WWs2AJ>YeCNKV*sxa7fcVJFp+6gZP~R7s;VGYoWHy@P8}$1kBN)Bgb=GgA z?n2H`Nv+v+!|5(DT0(L4i9u)Y#Kee!OcJ0mb6I^8ms<;onH(w)ghFMRkrL8W$Euin zbWH=@72Kr!u)_82@JTlHgiy6u+>s0}vQw0|tv2A>JamDqb7FFW)7)540-6!gH0#=2WXVf$wY7NJ;g>iRQWKiNRFwZ_}&a`EXw|}K>_CpCfpQWrHwHEUj`$VBM zWKIQatgFOhGv#$>@=?Jlc`g}D>FKekd$~I0-aVe?5Zf7D#V~eB?&=8J!o(0>#Riww zmoX-AAWw4c&QZ*ojdQVScnnT3S=Vjb^GCIl`!(nRON;${SyA_rnZ5n39x=Yye)*re zIMJ_Y1T20(NPlON!QSv1R=BlUK9k#I9|#RIy(zV2DDzqe`=o3(Z1u=$%wqTVOvBzd zTE#a%R!ldK$d4_?~b5 zan^8(1d0<;XWm((3%Eq*!(!f)wB(ywT3YRy0%F$J|I)SAThPf|ivPGgYGpk%-4nE> zE!;C~@I*kw1xeU7mj*C_FR*AfI3Xry^+%8gV-D2aabPTA{Y3yOpw=UWRPbh8GVIwf z&az&pf26bD1$2X9wv-u0Y#o;U;lhf{6<0F`5-M}ScR)Jg`{{&=sw#It{!)Qpimpkv z&i$WK!4<{N0gh%0fEM{sR3H3hNP)UvKd(w(-;g&?tE>xqDHm)_Pi+P|*%fnRU7Nef zaROT(LX`BeEb{cdW->_>l$^KzrkTXvV8(1vgCu3~T4qn{wB_mWVLTbjrN2D@D{iZu z1Ema;9|Kxl6Y=@`_m9ap0mqk)=ZR&K|D)q1@{tX}!%R1S%6|BF*SED*;DJVde!hu)e{z9hjoQdy%T)RME&v6vd~)Q|k_g)z!YG%i zM`h{_%|g#QUpJv=vlIzke-l>$U^tAMz! z*Q;gzAVrMUbR|(5zc4@G-7)2=w}9*1nl! zM7TP3IYg5h;yl9!7dF|N^4S-p9bk)fukob;UkdL>)4UHv1saJCX$=MF6!S-szR6}J z=vcE@TF&d*eMo(hFueeu#ee15h$J$Mi}}p}1NZ#QnSORv?uUB}j^qe4$=RuI<)hO5 zSSHba!?yd8sWsd9daHLLV0gHAR`7dJ1H!r+zShnOFdEOS@x2@LHspvftFq|%>#0vJ z!zOWTi3HObv3~0Z4l;lfww8H{KX&kNGN2(pV~~ebyV(7ij~@9Uj;QorS#VvD9b34m z;gmvIC|hS8s@VIuGb1*#)(wOU3qw9`I}^iIbzBX_TOAw8qiWKDoz;W&*1WD0=IQA+ zO#&pJvE{{7wg{dH>_w^o8X|OY)8~0WM4#}-9Iu&nYE*TwY7SRiQ@Hbahgu#(u}4uH z4S5T7FLuoz1&p^0PQYzzb^9ho%%!{ z`|@B@cb2x7Gx3|B(-U?1dg>>6SJy9wnYq`h6yGC9EF1V`ZyErxlW=DV*tN!`mPdNs z)w))cpQm3>!UrQzJ3jEV?ZFS^S*%EG1$YJkm@7YXwfziZaUnq!cyM!nEw^J-?DjT7 z8QH4$*5_FFgkn^ZI6f6FJJF^`hq{-J%XvB$Jn<9IO`kb?FAJCb;lxh8+Ln@vs%yH@ z1q_ryHfBM^pI3LJgb-%v@$5@U>-2o-{ZRgOL!R78096Ji9y9Ob{Xh0!ST7Ksxi|EA zA<*Z|MUW3ropJ5PmP%tqj`nki zod6V%dtdSXOnqxwpQy^S!pef^#5u3J@-UV?W<(LU9T43by#FWhp93*Zo6PM(!ZZsU z@f?kgnregHu%^iqyb~EYC9O^O^{~L{HNww!170foXL|cHLzmlUm+6jW9dK1`l##J< zFMEn8;q4d;w%RFpLSv{SeVGl|A?=5Kzj1RvZT*>_?#87{?ZYiV!$@#>yHWOz23MP zQ{3;lb@Ua=asU!6lXlg^#>VF8Tolw%wgmh9 zaeGyLd~bb4Hk2I-yLRS5MAQ8prl6DO-)i_yd94B<1)$R8NVOj?@A~pfz(2>v#eoeB zk~@VpmG@~1;k_IW?i(G|2J=BxF-_Pzz(GJ*(nC?{p4*t!qs+??Cg7$4-Ih%OUe7dDTGWA(f z?v+d5Enuhd23F*Oa(AcGyH$CL$L}iu2-uSD4tw9K7rJYRhXrOqZbmh&_Ob`~ zSSJA(ep|#df_X<|m`vmmlcfP3EP}&6_wMW1!|(D&deiISryKjM zxe!s{JjjH~R*iq~|M(PuIIDe*XY2Tq$#b`%=k1<+F}#iy84xs&3I%u-*oT%!j{`3P zioP^#o*gXnvHr4l=Vj~H-Ne2xKY!&D8QuA|)}ZV@If81}0+>WfA0Rn@lyzl;|HT6y zHtjYHY{t=yAfHWlUfJW>s=lndyR?khx8i)ya)C498s4)>2W|xXH4lw!bGFnAnpNTp zD-twkaT$m5R}=<*spy;NJ*32T*?R5*R^-KSdp3_6a8B(u(fc|r0l(QZVBTpGXx?;X zsTAN?=0pK1D98=I+*%gP)VcGD6y!!-;<`Cnt0h2|w3N86iM$<3eFsfMX#i|q9JtO)!KZh74b~p^=_^S>6nX9j-hI%^(t~n=ORlioJJ)6w}(LnS$RLKw2HbE3Og1qDI!@e2#4ifwiz& zQDzPADkh1wAt8Y+Wd*t|Nox90|K;qs0cAcl_~B`p%y~ZGFt3^0rk9HND!ZRr_fa)wyMcLJAsv)W)^4AW>neH*YA!Sty!8l zL`Q8{Zfs%{3A7GDN%pq)xue%f-Ayocmds|=CF%RzitbzB{*WR(ZjjM6-n2}j%QCTG zRZH(c?{vteNNdTh_`}Y7)LF{|8L> z8CE0|fNbTZDXN3*6DR=h5T}Qa*9%f$izTzMfQl}@Q~v6 zPM1*gC_5%ski&zmxtQIpRu!~UTovbTO;#RC1n4y3!>dvW2lWMldMpw>&!jMIe z!%Ukqtq3AZ2H^XFufs!2&qkZstl`M`My(3LbeEz%2R;jCPh#Jb52?edK$?!1u)8#- z(fhKF9aes+kkH!Q>blS*Wj~G0|6ZyX;7%FpV+_wz!0)4t@WXO}U#v4giw$MHB7FI5 z0!x*;HRG{5yx^;@9OmHZ;+a@f+4ze&s-XN7Ah!1}MyTRat*}FuTv#f(M}Z_mnR6Ldc+~oX1Yyjx&a3&CxsFO%EeF}2D&1yOp;aY( zWQXY%uE`+Bhn|5yczdK_^A^Xn>cxtk`wK;1Q7&5t`ib2opC)je@H$h|iemwBaN|~2 zM=g7G6|IG$S<0Zu0gcEJ_)U#4%>Z>O1Tn8$5q*kJD^Pt1WoY|i&Bd~_5&gdB-pigB zuQrZ+pYs*EzJMvlgn8QGVP+khYk(SXHUB=zU(wjivt7 zTp6gwxPEM9L_fMFtq!nGk7P%z5di*6P5X-9AHd_q3}cZ;`Rdz z%NvM?Y={{_w?&_|^gTU!CQfJkT^1pgFjK9S=XdtQw~V@kGk1`pXwccrC&seU*lMS% z?aou;(Pk|euKEP&s|oS(uIa*NBMl8Vdhg=M>6MnSvg{|u>LD^nd!O&SDgF)aliSph zPWKSDwBOjPH#Qz$?!cxeA4bk!N%^?bt&4^~PySG!7;@)of>+7Me#k!MH59k}jqyI5 z8w$G(u6x`2;Ab%e0QjHb+!Z(ScJbg9{ip)Q!A+)#C9ag0>gKDHD%??hxv_9kbh^}e zlB=sl#n~Lsr~e_x_?YJkhsn2crgQTLsx=8o%sCw1>c z+YZo7atdSqkVS?mj%q}B-5AJJ=7P)^?>;&#--+j%jDGJvSo|D{50Z5kzK#FL{H5D! zoe?DO9f&(~91fhcxAKJz##vx`R(>fp7HDOGG+a~Z*|Z{H!g_~oZ6dR z@2!+6V1unsvh$Ay#E%)l_B*p17G9hdg0cN{Jom;96O-zX& zbO*dV8#&&4T%9{T$$ysg)de{A+i{%GNm4K>jD5kzCy7(8HebTap{QRpKFpL)V(F3f zF|ORXUNy*jcK7aj-gGpLObrT~SV7Tdz?$tM zr#)R5audDv)dq%h%m$Cu7YrDmojLWHAMvJuU<)zA9917LO>p632xtrCXI;^r*yj$r z;ez+J00yHaO6Z5n`JaU$AZ%aK<=CdHdq9q0FIfyih*#+ivg{mH6uyK)<|g!KKFJ<* z5mHuW!cLa7ohAvJsbktnmTX=?O8bA@=Y=NDS*(V{tywHmTHB3!-v$DGa^&# zdP1Q)GllE_Y zvnaJr&>$#snC#@d9v9Z?U7rp8ZYji9xG;aslevef`wpR>qq@@Cz|U%96)_m{sIJtu zJ`)D;t8Rk|iL)-qyZw-YZn4hZ56S2UydOM&#IU6a4#CxWC(swKuYO}MS#AtUQI{Ch z!8$+hh2tFCsazpLCl;%ac3x^S zhhdGGmU|`I?`%g*E+bN@mmZvO_M;ysT|Bc(wtaHSmnJ201_ONpi&MEmE?1w@NJXtN z`ji(ZR%APheNprrsMnr6(3y!^5F$p6&a%alq(7qQ+l`8J_&KMen59M>bKhdtid&*j zGdvK5N88e#4XKEAGK@^pNmaWqftbNd68Cp6V5!@WDV(^gK-QMx@$z1>7=MYnhB!Ku zTl-WII>|_DM8306jHGS6MS0p)aU<-JO;TyAuAeTVJzq-(`&?X$v5 zDzko%!j|NUMw3(Zkln_#bW(cQFA=srFp_e)>jQSGT=eMoyyd*^mG4%0GPf-kROen~ z`(6(3RgFj;OZNn%>t=`TouNqt^6C93-LMSnWWB?j(=adj$tYoAS0j?*(jsBdu%!@< zsqGTAk(JH+nP}PA0Q8w{ zZ2d?ak>*%fua(_eppA80ek*mnCIkrBkAm^VK)SzR`*VMEKzx#2r>4jwk;5E`bXKa^ z`e-WsZM^vIXcLo;t=H zp0sqLEqK7ygz76`%hd;%xTo%=uB(5+qN6H?;+9tVaJX&zQ)SNJ_NHyY=tK^#)oelR zn8UrdJMZ~%MG2C&Y`His%2rN{PonqI_TAx^u`q$)KYIb5)t{NY!33%%K?VmG2Lu?p z4a7r$IAJ`XtQ1Io(&NjEe70RBe6#1?S>Zpc(TKhBE2edtt5eI|CZ&$vn)r%&9YXtY zYfmKPtYqxh+T7T2y|h6+h*T8Pqi0l-Ykt;#SAav;)v6Z-zMN6d;v6q!Ttq0p*&9*n z9LHj5ZB)b-@lb3Z=C95LnWGDNW>2ysD8sBkt-LzrJ+}OX(PqXNzighk5clUPC@Epx z!i@}+i+9$K9WoqCxfFh39Yyvb_U`2^v`!lx9aZQ%$`cHbmw%kRW-X3e!N=rNMZUd4 zyOM0*X8-am^uxNy(;Zp{g$;JFe$+m>FTm$P4C7aPlO<5kfFETBAqS51_5~VPDiskX znmoPYP2-5)W{F3~cQt}}$5>*uNkSuTp$Ry8&%uX^jgmrSiJBQkP_`ar6gAtM4iFrBcVEl~7=d(M*tye-7`3;SR`W}byonQfz@s;my)R7Ax4 zq1(`%>tIKtM2wki72Epi+mxjMdvX`tDQ`;|Fr7cdQ|WCYTO>xvdy*&#q?Rv(QI60s zZt=ZeRdfd2;}P_Yh9{35rXGzZu?3&;6gDhKiy#sUR-fsam+=}xmT_Ve^_X8W0_=ZU zVF9$sqoub#Q+Cr=WfuCxrbf*Y+_^K(1rs=pH)G6_Vh%043WN^tWR@Wh_o1GW$IE(KCayW{WpQ%uWCl1rQ*>vn19T01HX`~7huqF~`c5va#}DhlQ8h9|=NA{v`a zLc%v7Yr2y2&73+?c8MS_bH9FgSz6(YTD?|Ki*6i@JYe7gE(4RQbr-7L4B}=lgQ^Dr ziRv&3??H@=naVzzU-*;N(u!GQ265#AMCVbj3%EP7%5}*B6FqMx>bAQqYFi&$1N_L- zvP%FGMU7{t$dlYwiNUe(Tn(kL3oHFBAl3>*3Tf)f4O*YC63xbby>{;0nRw4>mU{ta z4hUn=GF3U}?T%M*G2iJ#>qWmwBjf16+Ztg->q7(+F?3H6AAM4_y{+bY6()c40g&?@;y<0eGv zXmouw8D29shqSE{#;Op=15Y5}>RqD}hRl9E{oLO8=GSH1Ny;iwKXS@KB`u=Pc#bdd z^%9f9I=yK+C!?0|N&s)16ic~tNktBf93c!odKLEOrdDWc(N$X;E15pSgs~@ty@e0< zlwR7DMm50Vo9J9!YJp((GKTXLuC=4a(FWbkK!#i_;~9;b5{hs@4;56Axn>~ zcG8D>wXrhi*I%~h&ldEKEhV)Ji(0>;;?#OSl_JuJc^y6s`cpae@G%Y$XG(n?RU#<~d+wudY+r9iqj zIdW_0M_##U41fd={fPj5MHyyt15kc(su6mm==Sl9ae0OzHZCS}j^ff+Gu@y?P`lR%IW=G(Z=et_?h9IRBTGe$v2 z6S>E6XY~gIxJ6K9%rC8WO<)pRvxyo}X8RdzZZVqoC;&r5x2A3Lp>1>TY!jGy?R%zb z6Q`!pJDBvu^#oZ9rDc{o9P$&n=^?pQ40A8bZ;89ClVY;II7c6H;Gj?J>m_^|5&~oS z1U_|F%=DFA6=v>5gv7VBkcK^+oV_w-H24BV1QXZebJlPNHw}8og{CUXLs5~j8oDLU zg-$Sp?hHP=3(k-re^e7{PtvT~Y{c+1GVRT}9q19f_N^1fQw< zY`tn28vmiD9jH*^ei5MW%_RShL`!C~YDcl2g$*pfj(bt7wMp3m5yI`bN6NEnj+gW)*tCP7tn7};OyV2k^ z*~bU~kf?c6{#DX$Zn43ihbCq+xy+2@e6yLrpE#9@JEZ9f*-m3p+bkH6>6x;kjN?+uD9i#>80csmGMc-RJd2hd^RectM99bcDXc z#}eGqqTpsCfL~vnC!hM7K2mEKF2i6S@OFOlvVqj*uA0I&B7hqwM#0D8z)Xy^re$Yu zKWaE)7MydYg@4P{O!276HPOxM!SzIHckgh$k=DhoqsK0QOp=&VD6AcgZ89GyeZ!CW zdXfSo6T~HgKD)XCCzG?6qWZ{j`t=D|K*D@(r`pNR##dq^1H%ouCWH`+HltqgFXm{t z$D)^IR>5d$H=Q}HsuGWsvx{kmgPaapJBDe&N`MERs6FWxjG|nB{%!~gAC(8lq@&#y zuYi0Lur88TSVNbO-8GsvAAs$?Hv!PrB-u~XX)V#LcU;cAJB3MSbxt6n#uJzZWr@>i z3b|+RI6x?73w@=A^&BYMz(R?|6>0CruFPKZS~GfuE3 zwzeOUZFpC?l_h3aAtAZBXb$U*oIe(NHF5kkHspqaJ2$2zWzyDlxRZW{|8>OlF&Wn~ z&w0eKl*Sk%C|dmKGxNpW!Pa@towf<)V~-%R7Tk;BrajBbnxv2)jWhWb!8l3^N&!vL ziPq7L)|nSd1D4T{*HT!99on^0h7VQ^dS)T?#Cxvhb9KL|D;;n)T2{F|_X(%ad1$Vm@Sb}_4ti}H zRB-CO?tt5L(THWV1`l9`Jw7Fw17o5k55~$sG!V5o!ejkL{hpcIN1x+vEk>hsmdR*%sTQ z-kqK<;qavN-0teuT@c_Om|(l@F?gpTj~`>IZq`y2yHnfG<5XRLgFF32M76mXGwJZ<$*FNCNtPuGM#HQt&6cZ6zQ z>qW%o;9pP599!1x4oI!Z&Q~^RYH%WJR;FB@G|#RuiL0axwgF{2s;CRa^3tA3zrO0>Tjg*xVTF9Xwl*U% z8$1Y$aD|#uEi#suJz|Okw2HASI_pDe{l<^-g=AoQ?mEah-yO3DeI%53Vepa^wy@yt z`ZxA!yfZ88l(J?W)-S|JY@K-#-$aVKzrxRn$R$3$pSRyrk%?@Md20!_IoP`UH1K_RU(bY&QUL`k0v_qaRW zhcAHW0-*%SGyxSQ?%)}%@0V5v59PwVX99)hcn>Sp#s7E-V3R_lV^npyIY-(h9ilo) z#vp#~>a};L8~Ph#nPS1SXyvfe4*@+WnsJkNvUZt96v>{3h+56Aivk>cMjwz(uJ$@D zGQqNog+_{He-K}5Vz80}M9cY{jzPH42K=;#f9i`mUbcy8zl@U=%!ThXXYAS}p_8X3 z4^dy_a&`bE+iJ_$7e-P0HS|@k4{QGCpCGYL-4O9KyATse1W#0^NLl=e`@v^`Ab3_p z`Pi)%SK2Fs5SNF6W7*j+I`U`O=>7Pt+T0djHCbYPYg?1#`wg?+ovww|MOhUE?SxG( zhZR^EsTdWAAYaQ_Zh3D_<8T6gx1)#kUkVlc_^=Z}3bUz*i--V2)wAjwS2`{@q30&& zdlppJ-DZ*9pCFOFme7pKyT=i+MD7Vs(JX6#-p!7O`{&0;Xt{PfNLE0-NwKrzjLKVQ zyib=gwifO&F1Ectxm970;_5S)@7a(^zEXvXW|yx@s)Q-8duj3ojw1PA+ZH9M2w2R6 z?_?5fa24gHz1AHe-#L#|@<3sEEgBL)Wv-_6vus?%_6M5tL8uoVx9;NZ8)M=&Z!%qe zns)H=%IkCe*p+7~^;)bP^2W0!q8l=Hy!L0jEsvDN2^yDyw%zWvvuvX`0p7AIysBPp z1;x{Ak`b09Cv!*@TP}gC#vwY=)jsPTzdbKOblZq7t>Ea-$9wLYMziK8!pe%i&OJ(h zwzV4z#OrTfdd^W->>cpYp8cCy?bcmgZ9(_Q+q-_M8QwDM&gAj(<*gO}m=*fm?ZVn! z=fgXpl)F)96j9=y=`f%=e@YMI$`ovAAT$@MFPl`E)k>Y;A`JU1x=|v>XV&KLn`HG_ zc>-7az=kMdAr%H>jX%cGYd%zMLN-_k?pa9PBNmQ#VJ06Ysx`L|SUgr!z1D|-hH>dY z%kk=%x1HfOvJ>JCS6q}!GW_`M=$i#xAHX;BY6;UA&^7HtjE^079qaWZMtsf{2-E-Zrl>=yBGOjO$Q2-fIrG>x&Sh&eD~r9 zcwXV*TIXFeYrUtDwQ87(n;4Ooo7!(4OMF&3#5ZAm2r7jTSj|$u-R^g|;T_3MFBmn! z>xrro#QpeEt-s|3k-c8qdIy@pBD-h_xo!_G*`ZO}lRa}xDQMnOwp-i%zEM{C4fV1f zJ%UW7Raf+q6u%TAJ>5*DO)60|XBXMpLJ%{XoR*E8@p>s_=7FGYluN;ksWRNuL@Py% zPyc3gY3Wv%Fui~gxaiKav4&TDR{iB>=*r}o*q6Z7&Yf*DczWqu3flWMsd@Eu=W6yA z+s!|&vuc0cr#TVa`35XyJC-f`{X!Evk6~Y#(gRU1{k#m#8I~J&_--oJC7aN4IyZE} zVcihArfpQpYjBDu1(VnkL32P39H2;Ejs1qoB$P*Wkq&*&i16O%+<#+p<8Lu_iNNJNy^_; zAlGj>70Doadb=a%GAUH8c+B7>r9tV2cklIF41-Z?TLA<2rX3kfG-^A-@2$w}nr|

    Iz!>s<_yMX^Ocz~N035ok*}ovfGa+NZi-4E=VAAFE$sH4JN6|! zQ(QlC$}38V)Tu|QA~}0A9Ez>PPH))2&dAIR1hZ2uL2}KP>YY8~w}a82LIZ`Bl7lCn z-39uvw5IA~A{A7C8pgdt^i>bOkSRwlfZ7rWg$2bbb7gj-=~u!#!?Z*+JA}Ixb~hI~ zJu6FpXlg=7mz_ZT;Tf({p|C7;*adX10Hog?Bj!%+zEQ8$JMl1gzDcoD&%k*%P3b&x(wi=&R~ z4f8}jsLkJ~jUKiTsZg7;mV9h2D>oD6EvvY(s0zm18X-GsmreDxJ(Hs zP03Izf=Ki^7N_%pA8!ilB$n7OEqADc^)H1YtPX_5#}Wu>6$O}us;RFlF-utNvGsX` zafNfal&qvdZ>$y5#jl64B85F{g=zcUJaTs;Bd8lR$tIKOiDLzmQgwA1z;#@cQ7u@j z(PsSwe?m)R8#o-e^`2}jBf4ywOtqhV6P!33hz!enrf%kErjRul5gJVWy98aq%*6671SEVm7K&8GfjOCwwNC&A z_8dCF4xZGyy=M0#ptJJc$3o=Z-7OhkN@_{$mVQ!1zRC32qI#Z_9l=eskW3-ThgS=a z04|PhQS|z4M3&!WpY1L49FztZe%l7P*$YsoII5Ks7PzD>1{>Ubb%u!mJY8u__D=7~ zb88&{z*gSOc93x1ze+339NxUK=0_%&4$+6Qq>3XS+ zSAaGFXf#5)vU-K(-Q~wW8=Z8Wm(liowCO|N97v+m-M`ddTD*zYHF*wB6Byrv@?&P# zrL?}`bbM=CXGm|_VS>Bcn7yq@pPgagbCxwz7t6NYp-`ar<~v$^!P@&VRx5@TL=Xfk zC-@&xuvI0Rq(a@13y*SjAGBiHwC6JDc?(bNvCCW8u2d-2S05NKfkEej^=2AMQ|g`7 z$$7FJTA%?X^6Br7Qz-&dT12hEjs-a*Fw*2YG`1d@={MzI)%u4P_j(TH4mJAjiiWczcKTq)u@es|i}< z1W4@x*TlOfvcZXYyMjJCld~|7*7k>)cXr~Mp7j5AW4+gYoCI8y)dl-JBHY7tZW?fM z!hj?gmgqCCyNt#VdjC8PU*wLamFUk9O#W90X4sO`U_}ylz^=^NRq8F|I*gNA_&a*` zFFU`-XAPz|WKuB%sxe%*a%Wxv_oP3wKz6&B+DSl0RkqyT?D7^2F5TqBsmPC>2OPPD zDIY(OG1Li)+ic$u-ZXGkL#i~(UqDGy}CJ9 zK!Qe-5TXT!^JMRd$e6TKAPGBedrrXR3(70Y1g4pVl5ax}C6nzU^_|_9>!bo! zL%-cD6V7F!5fzl4De+jY$;4A;QMBn@TwYmW^H?p{YtGMXJ?!mQ9om+H(&X)dn~w`m zuVIwlWG9#EZXFVHo#fywWpBH`_I5m}u7f7rDd_Wu1pSW3F!d}ygsB8AmeUrKFDsOm ziGA!Drs^?W$+;CSt8A3GJ)QAzkBRR#qI8g1dq=BlSBI~)`om^hS>@fu_ytJ?YxwG^ ztj_=cH~qI4x!$7Cnc<%+Ujf$;|7dklgTgElwW0#>&x?ufpZe~o`Jgi(W$k+%i+dSG z9-C{?4@6m{vW8~w4Og;r>~-!o2Pvp`$IPH4!@}Z2Z#)5lgTTUWplhyKfAy5d+=FS@ z(PA9~gM17{8;15?4=DM-xhG)g*m^6iVH8d%=NGktDveHV&g3=0dKnT-R_(cYJI zE}Vai%pEO!((ulf$Iejc1OM6?KZ9ztq(x4!_g%Qh zRC_q^N&t26SaY@^ptoL7^Bu@;R>h3xS$ceSYaA7n7avt6<-}S1-G~rlwkL!lucwXvb;I?>3n^nLN!6&gN?JN)O!&cG6yY z7ES*c?|^)z7_CvdS#Gv;|HUXO zmCIxi_g075jw8i7B+Y&7anV`>-|p_=-x>r|Iv)?hBu88f&&N+z0zw9!qC66E zcE|eV(t+!=!|CzTvO=F@HWQ4#7C>5~O`E?8@?l67Wqb;*-HE-Tj}&9llVu`Badc^A z!dj?FD-Ztc)`-)J{tQ$}Nqy3ZMDLR;nt3$){4GD5q^M3JEo#{^9iBcA)SNvQaf$nT z+-d6YQCU$BqsJCxZS{~Vf4nM#b>(lb%2-Qug{SufO-;lzqKUJJFL4? zs*9;@f_}aO)6!e${d#6a(sOgZOvj^Q1z-6Aqx1R}&}d9BqQOgR0$%uBY{)zM{cCY- zYYk>H&?7aqYHRs7i$Yp~!DciX-N%DTmCd}Am0L3ZA75_)73CNF4~u}5bV^Hi_Yz8n zEFA&@f^3@ivwO(r+?bg=cj7a%k@Yo_ z^%rtLBc38CLtVgs@>_l*S3`I6>sY5zbvrVmv6ihL&dSV$N+3AF_osw8U^rmS4JhDl z%43n%=(L+RWqJtYApv9k|Gzm0TgdIvS0_yIb+w^%z?9I?=w-&pwzZjrrTQ}><0_0l zJnA!hNAGq?eCyD$u9npd*d~C>>7Npv&0r5dPV}u@ZkUP(`87XPBLsE%JHSpofqv{^ zv+qJGXz!0JZrQ^bmY+*zh2_g1fVKnC-k}M?2z`e>#A8zM6!6Fa?TkHjVCU1#0Ke3&nvgC}j}R1m0c#g9V^@2yDi? z@a2%*y&ZKD+vLMz+TzV7DmbSW$$!29^b?tB1kC4tkKcE%cKA1)Uar)T7GytJ(Dgc< zss3_eH)iP#-ni!zXqKD zy4%C;jl}z|PPmU04lyB@Hml-x7`8w`jO6#*Y2|o8EI*M)^I#EzI-;RI=eS4*4;wx7 z-bX^e?>;HPIi;}|DXrz}F#vncGn<#(cO{ab^v+Gu$lj`dy-a!;w)vyd2g*G zvU+pJ+{-X@{Kmh9Bhk&0iK_ZBfl<3(AtXgn1FOb4-g-LamqT4sU)7v3@pKgep3+q0 z;Fa8@nBN2f7d8;-74+?`ca4klYo&eJEKc{oLixskPJrU|{2?t1HR(^(SH_t>Z$qvo zE*7X~Bc)4XZ@KEGUrnEV=JC;?qh0QCoi(oPnYBG^Hq;>pWe8|TU~8|K4mL5&6t?Uj zA(Eanyt!nYjDLw*kw`UOBlfJ^s$QJXh$Sh!&!ef>R435lw{<>mQ?EYTCOhD_P*ba zjqY4oZxda73mX156TXam%=}(xG^w1k;xV-~3IY-Nc#NHlN@@TT+J}n=fw;N-_#Zn{ z?jtg_s)1kh7S1dnQ^(C9w_Iv>dw^QbZfL|_NrohG(DB*99f>$rf8(R)yi|6qf$@|2 z?|1ayt_6Oj-qqXiWDyHWaMGwHBM`~FCw{2G;xJ^Q+0bMmmG<--d?rGr&PC?h&3;PybO_lEf~A{b438>tn{IDt_CGeFF?Ydkbc z{~}KN+n!l7Q_X+QZDHXU+E`*&OsZ11yK}SDDs{)-MoJ$%;&OP5=$JUE8IQD^a=IaA z4LA?DjWHb9vH8vuV6i%KxwSl=26NSAZ>C}~AXx677OiDk^U)G%X2VSM&Ehc7tX7Zl zD0u+V5lsKY-{)g$XU?pda|{!{!UeFXb(Wi+H9@hR&c4r znRYHt^ei?;rIu1eU~L@mFAA^y_L`r~fyx8!YnKC{*erWWakr$aM?M2SI<k=e;XlvWFv=0w{XGp5h*5*Um;TR^kY3Toyn~)Md~Qz% zRvbbx3oMy!oUwKA5lyo5#XBhGHi0QK@Ursrd{CkF`fXCJXe;==6Z!pfqsku`CILG5 zYPYW)kV3)Bw~+BsbR&aSNwjE{7`qYhxVn2~wa14s~Q-?97Wl5{m0 zDj&h87xDa15DmZ4v-0q+dP!XZGR>VEl*o zI|>JOOH86*lYxu~IsbhB9BWy=q8WAttWAN@NYb>BK{?0?jUf! za}M@-284wV)cn^VJ~|@(+d$p(U-E+lBG%>ne~^};?fytw<@N5cvzI8uQhkJk2z?g( zkIyPJf4KaN^gaE*JozIJK)(~LOx86TU_lR2|BnsdZy6xRKSaFWh&nHXp3VaVlw z^pTcm<3)wDf*=W>Ew6rP?cD~P(A<1ofL+`oudR2LcpQBsL2%((%XWA_s324r(KbXQ z1nqDQT^EFsme0RtlNqt4CB-fwu>HP|Spj2leh5)6a!G|_G~}$&ey98aXtfJGI*yPy&ql58z10_Z!=Z70xg-26OJ_^vCJP7t za>^ho7z+8gelp{v%<`_N{2AAlM}<>wR%H7iK`REFHHToylzC$`g)-JzqZHs7V^UJp z=Rd;&8@U_Vv!5}!3qf3Nn4?`iU+JAcw!lSzhiWK(X6#Azn;5Vd)`t@TD}pc|?4rY|~7_P)Z0BZ{va34MKJ6 zU|RiF57W)wP8bRPQg?9N2nh|8-IDKW*L({h5g7^8M|37(=|t=5xXTYHOUH>RoWV_f zIaY+1j}vMApa+$0p8a-Tc#er?a@EWG%$S+(ImO~80%#*HL7O51-mu|0)Kyrl(j>JDe+wdVE8u>|rsQ0Iy?d((0i=^|!xJar! zDmxu1h^?V?H4Af77$$O6?k%f^qV@=#snttSEmu?>^FmB{J3l3b2wtu;J+r5Av^vpH z;y>p_8V$~R_O2|)FDSoSsAbH8o*ldUON73y=b~B0qkniiy98H?^M;PCR~WucygJd1 z>@jJOB!SFl9r7wGSVu7x4mt7)=&<>k5u>zxKTI(Amm=EH(Bx>{$7Me#qQo-hmW4Jx zNUit1wz7bZ5D8~Y1#)Uw{WP`e`b)?rBp@Gjo;FWx9lVUbEGvBMVx%F6A4z!=-^&D? z>jce7BGdJhcCd6}s#1%QN{f+UmSas=H+Wv(|Bw$5Bf!)tEb$nm`Y>I*H0F(B<3ItG zY~J6%NR-I%KefE+?F;2TJ6T`1#G}%xv$-mt)JWLrE^!~99h=U2{KoS4PE-AFhwTgz zn41UGYr=JTA}`#-@(dTl{TY)WKA(zpv>0r_6eA>UdQdlfz_j*BKZ#@}A$joNR&9N= zZi%W2aab)%@fcZ}E4JKiRQw}$hsigy^0o(tL|gp-F(Gy2LoqSJ;l)Pt;#^C!i`9)% zdVJ9FQMd}}nf%Pj#ZZn5ob@xmJ$tmP`a5VfN*bkQ;n14%R^(H^&1tZ~Z+pj#87J3< z$KF)&cPh_~iDz<$_kvWb$_Pa8AzU0>^5$>PwKoHS{%X$O*7al)hn=GR8Wqx3?y7j@ zPqR8d=zk+EIAO#Y`2FfRTlIn2$^6M?<)_MRI2BWv7a!rW?mT%9N^zmOY2E;ee?5U^ z{L>)5C-&5hKh60vYFD{IAvBdqG4YtNymS{jQ9yuJU0QO82^Z}@j9Ac?^TwmvTdy0jUIeVu^5_=}*j+z(4 z;}!)qeEIVsbDjUz=HVN?-LeO{=HB(zH8rlysPK9>FG#&2nl9dPQ2 zUEZ+lGH1Ow7cFtb%Lni6Y^p}V+?RTx%{fAZ%(e82W#2jRRluEu$T7b8%x>SG1^H*R zln=lwy8QpUcBzhpA^KALWJuzIA(L5ar1| z9im6fHv60vYZc;)wciPzwa(6Fw!^1?QNsf^-Vdv43U!;#Uw209tFxmNd&sL9`$$Wj zF8OOx3^@&Q&%c&VuSxr+{&A}=Q|c7P$Qx_yWFI3-P|w0bLg5HWoh}u~e2>a3Z`Q03 z$7JW@<}5H}=H}UICx{o5wYVbdD`LHHEo$mn<@=ypTZS9IQ~VLEnVq*E9?P7!d+iyu zBR_)N3hqVDB6x%Zs$+s!nm4YWInJd*>v=rlI2=~JdV%gA1*4=&N@uNa8U4DjYj zczh=T1(t|T%Cg+*APjW-j`c}?zQdKp>;AOj&9TCOvju$3*ytMWE792Msz_6F$Y%t= zQDPVP^!(%#idbe3oX2v=bI6N1l`I|E9Wt-kt)i>#Kc&^>MQyyzrRk@cHwn#I0X+*#0_>-n<)>q_`gc6Q052Gd$tpBLDz;SdIuu0vzvrZImX zq0i?~L*3BUEfuRvvbGK$n)_CtekM{nQUNP)XGzZ_BaaDfxN5vyLT0H|imBG;uT-6W zA4>byoZ-?buzNQ;s*4{)Z68Sg^U0x+ok0{;(c-$TqMwdr;FcNR+s#`S>C~5Fo!H~nt^(UhN z$2KP5awTgV)@sK<_49P{b@3WHANN(77|!nY;b3d-Wj95;uxA-(nR=L-S%J2t#rk4& zFW4&Z$Y`iyyTa?=EB+Ge=s)gy_Az5X|7Vzm7rgjn^tqL+meNuW6>(iP~fL@|W<5$@k(rm)%Q)-{M?uiEkY1 z3D~EBJ7-kX#U^-u++lfQ?m}WBMrYsng;S+_EqfhfGdTXS`?bdHD6Q5Gn;T$-)a>y=6lS?5%|O%xje~ zVb=^y%Iu8`lb?}KcSg4-+hde9(u0RwAy=xX+^(aeJ-)<_gT-}ll2Gy19DnF;uPAblkd!^^*ogHvIVAO;Lt>CXymG40iE+Rt zikVC>c&=UvOC#N< z4nt;h^>;?^GVws$QT2ut5vVU{xEJjG-a+FBg)}_kQK|kp3gEqNtaO9@j=tS(czmb7 zGshW9XgL7h=^ZfO*JY{8R}rE^1ibR`jV1Y*8uTAE$Xq=d!l72?(bZ}e^E|dJh$!YB zB2$TfGxD#cSKdAiw~>io`z=nF!MYCp|A^f4r2k6NwFgZ@Vv zpn85J#2)FBhO!B0bkwIsMQU&1tx55s4*F&k8ulNRxJ_eZ7W$}ZO z-dRtnw{tFBeH!WaZi=F+u-=Qr0N%RUhjg)$VsemNw61*_t)k!0HV{hV4l z|En(eJ7%eiOzJ2EA-e{&INojHv3}ZC1)j+GD%-D+VpotvM*K}mEL2-1bMP~k@KK)g zCFyG%c`}xPRjI@@#!&qX)E$y){e8|Wa~p(g2MLWN5ZJ&MtFIiZ-?jrBvlojmPlc>U z)j#i-0t^^@W#Woe-?LgtXc%gMBO$xw`c`2+(QG{Pt^HGa)##dh^(xT--3MLaNZw$+ zY1@HND`_|@oBU`E6It5K-Y5GGe zt}VzPUz%?4Mi7Gv`EQC*fZi&USeFeq_~6cYroI{q)=3@z)xi&H{N_^x_%(I>()1Q~ zA7Sw68CzEGf?sPaH%6u9#1f={Laz4!aXvTr{pjIfZXuzzo$!sZcRy4$kYvV81Exxj zi3S>3=nA|)`5|CO#4*)vBtRK*t@%W|=w1c2KQ|0+F>*7*2K2P{)7RD(8gS*v;K-##vD zeREgaX(yFw#FC?~O2QOR9zd$TviP-1o0??QSP%3go|p4L_+lp>g;pl^)s2|ruh7+{IKAx zm>{_>#kB`FBE~FwLC4s{4AUR@aDcE94vP&+1?-TPj5$W&By;MQkK}}Uc0z+%`fFs%|4&W->-6}ai)--8%a_Jt8~qS4S! z`?(x>mjC=AIA~cY09fpa!@hE^(%-n2sI??5-~Q-S40-9wveD~mxu*93a6(x#NgM8l z<0nraH0adYoEShgtSUC5C##UNeQ2tBEQb1e<;d-VDj$}af`W0-`?dfp#@IJRfZ2Ud z-%iNlnY|Szhwxx52a0@fR<2%jP*dA8Ce)8KDLIt2`mxUv${0mj8K%>xO;m+?Nnl;M z&0ijXR62kt4?{d14n#LkC5EazG{K$D;KJ6V;8+Y#KN)Xu^Ap&-nLIfW&~jfG;`zm+Xfh@u_tTRTp(jdn*^s;VG%6F~Zlh)}1v;B73flgV1dU#m0{Ma~&bNuobn>K}S{p2daqMB^At?5ug|uO>Elt-d?>S z*-x~;kV%y~!hrXlX`(WUzTZ|&RS=EBsHnZ&&v0)l z4li3@bN(~ys22|6Eg~sDh2HwTr5F&OO~^-;1Rg&ugvQ@!w>I$DN|+1|Trv(;vHpT6HZJZ8K%p#-t78{!kbp@0@wVnjAkHfY zGI6!M*W$8HAc@M|{0Lx_5&z622Y0rCpVptxC2tpuQGS@0I(Lb0&)6XCD|{H zeRyWuU-f6wx?iR&TE}B+&qiUsMm6>IV}EOc;RggjBT`MtfrJ!3D3($pf=+7pP9Y{M z-$QR~rU~t?e3%T6ttXbAU(|k+Ir0b=jti!NHbbtI)=&peRyRp@8!iIPJx2Ovyl;LX z4kWVo=KS_Mi+{3PhpW9Q1ln-V%5GdHPK1UQY{MFdtHMu+K?Dpp`O)*H{2L=HPCIea zWu6Qpn?D_jUs$V7#+>u0exV;onRV5QCUo#j-iMWRq>1?`Y(k|#M;^BvBe}!eP);;N zCy}7LE_)=Dai!g~s>z%F+ZMe~I1%N-PgEv|P{cT9`^B^cU^X9YEuI{OGckMk`R@;J z+Igft2^;S&S=}^-h;Cda#5~kvzo5qo9O)eNq#M~1pmSqTRNj7k7Co#5jUSvv?#X?f z*3JK8L%-^$lT`q!>Laxo+UB(9_9E6R8##c<+N2=?$<2vg_@kzQ#UyMb3<|H2`2_wL z<2{vLryy)lQWt$nY5rd4DY;o$#FMoXIugDMw0F?1O08Tnn+#6z)`iu5)9j)3I(;aK zM@b6^Uv>Af!iKwJJq!w5i&78Rzc>}_aoqwU__qeCui)n+`VE9-V}D1y_i^J)q(Z{`WlS;<=;hocoBM;XSj|#d*$evjh z=NVas(q}<;>iV9!l?OUtho&ZXW>|p^kYuo7VRK%wWb3Fre!O)ViY}){wkGyYIH3Ks zi3trwY11G#E!=?~6sC~7i(oHDv8nQ4O#NXmPENDAN%Q!$`;zcD%o7NKIF|%RPoS4I zCQh3+OL33qMNwghX$jBw47_0Kex(h9!X^B{yLi*G`j^B`}S4$JTmWo8)M#dz6c`xcf@1DPcaDC&=A_1K=fp_eXwBWO!#*| zsyI(q^9VEU3y1G_6>eAliD9F^e7>0^OV)xUrW`q(zTfc#*yP9#P@c@e_gt`5jen>b zd>$>%fFKWpa?0da+nRvB+id(y9ER94*1HwqCg6v87xk|v!&zIl2 zmq`DE1t@scKl-g6X92Z}@vB@~Ir^xzW5hA@25XR~i(WYYI?cT&Sp-VQSWCrRmI=P` z|0vj#nLj_8oZs@{B(>i4hd>}`CbxPzkW1Jwd&Hy-2#C3yz$4zd9{j4&W;+R{@z2j6 zer8xu2`e?KP{B_At~6YiyZX?l`ojcf(D;l`i^%u=)JBT^v2c|hrb`D(frp6Bi<(?9 zQS{@@jK^7P^BTtsQMx(tmCmg_s^;b>J+a1&KUU3nA`M1jTW9AM^(_w^E{{j3ZWeL0 zZudefV-G%CyTWa`>tO1Gtup;yqHOWM zik{Q)J&_jhbQ$-!stEV*jT<#+y8U`<%CoT46shm_j38-Zew2!u64Sl*C3gMe(cEPI zf%v5ECHH!Jgh~!0Tge4`(6~($3AC+swPRM0e8;kJ#;j)Z*qiQ7r|1Ls7uiT@p^`Q* zm-FY;fOpVT0#==xQ6Le*^_U4OM%H;dDH$sVRAyhVU-l`Fuw-gxngX%wHZyRop<63g zM7x3%H10TN7$s!zi3L-ouKqK+W}%>HKP0xxw$M$#P;VBnfV9o%a-gGd)?}_6Log8} zR||cSOePaEZRX}H-4#R(5)hhIR_^;`F$PP7YyVlq`_Nk|9ejEVA@wJZ)w_a9*rG{| zLWg7DK?#(VUjk`l!45E_SjjP;#qD}&qVYlns~|1WE9+yb9JlR!nj@=FSg1TzQps=R zv-jED$}Il z*<;ni9Bg-f6|u)E5^v})3p}^(j~P}JsHdM@WBCy^V~KqlJ^WJ)a`ge>`ZYE3zsz0x zVAbBzPu^S?pd!GH)YK}^%*ti~1;N1{>7vaN4Hb;X5@kTQ4?+t8(&((=71}niKgYmm zLEB|*Y&_tw1aX^b?U;BKV7uJAS){V@IrMN#;#r&+p}}ijQCK7i=5(&vJK)Hc>1ph|L2R}5zVr6|Jpa)!Efu)70H2`q(( zF(5eN=mgp>ASvB1B{@~my713ZlyfcHs7jnNMBd)8rq8VKt>>-&L^CTxov|a$ z#FEn80|b#GhngjT_en~aLC!@_qRc!7L+-%}2qUmTH8f-Oz# z%EXt4+D@DAqrsG^nUd~q-rhr*W@eDaHUf`TGRCgX%}F34bOl-uiL@fB6JRIHn}ai2`GPu@!i3m2?Im3@F<*3shUd zt7s3ai-dr&{^kJ69}EDlb0v)YACf;pXd4zG-Dtr7kwYLwPmMa9iFu!$|2Nx5Gh85D ztocm^9aMq_4uMvB(ve4YC_KR>3or);@N9bKYJ2p+)N1WN%S6wIrFamn|eI#6g&;Q%RTNqik z6Nv=C0F5j_aIG^*vG@xTWYTuw84wJAhHSPTdwbi{!jxXBt6=p>rT1g+!AyEq7EZX2 zSta})$0hLPewGie&WL}x0A#4i_fvt@MC8R1OaiOMxPB&VyBf$D3zfPGk41YF#&otL z<#*Y?w6xUM_vP~AudIv=tZ*NHIf03-ukRpj$b$Fs6#}#h1t{`|Jc6X3(>)##f<{ug zu>kT|06-K#1_WuI4+sA82GB-UhCV&PXtu1|FC%~xHBVZf5e=#i@0LT0=fPHh6MI{7a!C%g_J~Sw=N2_In+#+ZsCH=2eP%@dp znTW@3FUw*~2vwynuV_@b=o2VH7(;C(xjy~1)RlJ4cG|yy9(n_z#cNbW4?rV7xG{mH zGQQD>0pJpLl0l!4Yff5II>C^Hqqbl)haD;x#qd%gB#<45<&(SMJq}1Wo|Oj&h&lX0 ze-x43@AjQq>)=Dyq$`D1uwV%3a5%ZQY2@qmySwG=s>IBm*nkUIz`4F7c6^7VsTH;Y zia;3wAT514oYKI+e=tMZbZUYKdEg#mcozypsGh1O6;oEg!pzaqb%W7r$slxVrDIB9 z-PH%62_At@xc4+-W=F@Q{Fj>yZQy)Xn!Cg7mOJ4)1th;fCVgOvNui2&lXkm-Wg$>t zC&k)Zz?NFh&$HpY#<75hAV@LGl=MYXipnv;NE$&h+=u{zHLBz^)8WJb|OpQHiWt(uQn^ z44OXvCH6|D=$Saue|!IX#zF+##=~oko3qLD#PR4R{DTy?adSpXwW)`fEl4Eigd70W zX#H6X6C}uJ-1+_Uu_|v$Q3H>VjN zY+wtWQ%)^NhoxA=iFt|dphl}-8qFyYDD_3o3uMhZIiKc=%J$u`-}tgD26DcG%5;nX zHtXs~<}GkQh}dH|MlKStL84JK(LTUN?-~TG695xKDGC`it=^2*Jq`9G2&kTcX4wg+ z+}rLg)$amG#%Go9m6Z$tXU#UkOYcNfvuI5(NZ( zaBr=U9IB*J7W#8do{#Fjikb}DVlXX?ll-9p#2dLGbkm&ZbnKDz83IIAlj<(C+g$|z z!eKB6G_=P6dy^8gC{>jbp{>ugg#p4gU&ntcB}v%d18zUNm~elTHI)LnBqINT+90dn zh(?A$oa()YPO!*4x6-~^CTSfE4GjfYYL~0TI~UjZloC-LD-Phc25WCl)P8)8m4sB# z$Y!0NQ7||xUMVM}$At!N$^&+vdzc*!fLqgwsPpDQYiXZAcTjncLqcdAEInc?$oUZB zl3cP2WME33%!TmWyTN_JaqvohL011AA`MKYSUw>x`oL7V0!-(g6zT z>FR10kKZeK_d+RYs_r&0ZldAUn8WkGa7o%~qq-4@h+i@IHiqFGk6#2lgkWw4Q?3H> zc}fsQ+4Rcc%V@FE#lkuRasTi+wk2%F=DFPyGIw#v#LH4gr}#s&5)VA`ytYMG_`nPs z_OFVsF;mrtImY)3?#p@iVY*Zc!65J`cy1j6!uFmgTgPS*cr1r&^>~^!8fp<9fT}l= zpVJvp_)fU*lyh02ize_j(j zCWzj=Hfr9AArr?W_F%4Qb=_zaVYo z=l@39c>7x^1}6*I@j24hoO2%Td?IKC>(*`^eA=x@BsII9)(ZLA&$M>rd8HvI9Q535Z8huNy-HzBqUoJ0U?)<;V#(?WQq)@UD7nXl_kR<)+--QB}xjOPt@ zEh<2DB)T>WEB=#v*%)Zdq*){>g`*`3-iHWU&S4KGXD)P=H~fD9HLCURqG;W{oz$GnGRp{o%qn(Gnut~-O7TP;qgii+r&;Us)xm;1 z0VsFeC%q?|b};;WlESW0DBxV&E6`$bNNp|JDUF!s(&s+x^=rmZ^aMW0j)X@G9R8wg z@C6EXSNG@d<{k%&nf`qIOPoMs2X2sT&#{Y!y8&qGr<=@|k{{D;Bx;j&D4V#WxE1m@ zmLwnzrT)AriVXUAS+Ijy<)USHnmc+7--0!MA^-mk1oLfwD%?igCz?05&3;e$G5_gu zZxP7k4DPs(yF~?Z5K>@E7IWXKHp|U$InLla%nqv$)R-2NMXra%zrO z60Tdvm9UTHWtMU7eqIfsNA_9K{llzwCBVnj3_;Ucjvfp+I5v5wn?d;Wn_XX@&h}1s zm1n)dbGtdk|4NnKhXAcry=$nwe7C!fXn!~}bi7Q6|Ae%FA!=Y}QSlQquPj<5=+cKi z(3t^mw|0BFXv7|uDfhT;S*D}X)FXf=fs8VTzTVRe?$D>|L+~$t#)w5pbFG!-l^2V( z>=@Om0Y?eo(wEv#EC(LKU!KO8g}b&X*M^u+`9kc!O8NQT9CnSZf1UF@=K%dql@wlL z;Q_;YxGD<8y{gX}u?j8yJx=CfQMIMqYLGQeGTC07MJ4c%v53#@q@Tb{nnAO;&msa5 z3ggeNOX>#4>$Q2)kFC2b^`1N<>HT18rLwIq0JyD`Sng*YCtYZ9VGIferBATq)gx1t zR2qf(NQTh${tw^_27%!QpEcFqhH_^jVP)s(ZJ@R1r=FN*YQtu8E2~fJ$;y5QU2i0| zV%4)JqM)h0>bZwRvTxL8vuvGa-0c?+wDQHzTI`u?LXM6~SebG-YD8>*`V9BKK{=Od z>GjRj9b?4j9F!{Yn5H^-Qw+g(pVJu zCMY`3XKRw4C{QAEbFH*p4tHHEO^cfAMX3GDPr0+fg?f0Ul4&YyVNr_HIcQ1y3DOC# zD24>-2eULz=DqaAUDW~K|mYM(SiJC3!!=;uS1tQ9dVTBqoee4q1M(T%JL zRJPX)z-L9pscEPRTl%thh|DvyS_&q(MM-R3?Ybgeo6XmUoduGW842<}M1(!W)`@^- z1>fnq$tJOIWP}C|cBzH+u|AN`3VM%-0M(Jgh6XnEQC~A}k~OA#F>fs4ShZOY%->AK zOMiVu*)K1M>YjA1q5qKIy#L7rB> zvavnT6LO6fH?p*>Vme<;OEW~aE!(jiXR5eZD!}4j+AfbQn&K3pS8c05(lQxfa@irs z_dlnUxJ&!x>F>fLJcuzw8u@tlD>v1_`nolKzSY!2=-kI&`g6bI>5WA@4OqtMtG}MY zWyM8FoS$I+Vm#)2D&`JRXr!MK{(s_j1le*(unbu5P5ygp{nG=8!Daa;ImvH#hL`0; z%}{Gq({O&~-jw~_pW+`3S}1?=F;_i{8(i7T;x|8me6J0Irvog zsRdqv9Lg$g%!|%MP@}l`A|K?G&U(cZ$N~1-GealwkBNSePZ2Z5Y*T^q{szUL6iG?@ zeSHMl$t!m7_KEoI*<});9A@VJSdODO0Z_fugiq`?kD=u${&f|;+n3txg!E|%dc!J8 z+btB_@6%^}KJw!t24yGW;@R_64&FSj;`t^F1oHl}N$YhgUEhu;(A?P&@~2t&uc5)7 zkj@5v6rG&5|33KajlJz#WQ>jW_002x=>E}1sG{Efs*A>r`dG zz>jNvuJw?p!KaJgzn3TSrD95!q3z{yW>72> ztWJz+7CStAjL|puJaKD~D^_DUX85&5bx-FJOg(be_#RyG$BIj$0G$jh-{$?kh`Ejx z6<4|K2Hti!Lzlp>02V^pHOu~6H*|-=oOJklr9(>wwP`#*r#g6Dov(d4jSQ65oprd- z`3xy;*hxOkULH1JU7M0l!_EpKHf5e+ye|3SWuBMhNkWy?zBuRE3iX*y8NvHPT=r&d zxj!7875S-rB)W&xO_o<_;{vL`eC|mM52w-WH27^dzfvuzUTyY+w@eXUg%)p3n^Tb) z;(D{3L)GANgdZFx$7kl%3_qk90^Kcpt#5awyvbkbdqbC)1CKWpQwvmGYadSpoDaLY z08r;lN(2v+<%oRSW+*;5NiOdDoUl4kHKerg2SKp(vh?>uf(DeAWJYz!kR^8c6QD+? zjs^009h1bJ;YW^^ogyK(0@i#t?`2Rg&_iMNn?HA`vH7#{k8Ohza+OEoQ<7*P8mh-D zi;fG{O!Xflq4T|d(0&S0vv(QTfgX_AEz5EK!WI&dk9w30v%*M{C1=+p{(LRn?C~B9RR_T+4y~p zq^bwtNEdkTd%sNf&o1gqyxm^8B!RcCE&LfY8ka=1_3g;^(`}ClOPVlagq0(#7Ik>k z+Cn-S-?-jJ@yfi*dLY4^X20717>hNSg%g1DY#h&3Wc$&z?r=^JaJParx?xiy?JabU z?2LdT1eY_zbK=H%&iNt6H ztsJv}P9>Q)Va6QvH3zniK8{twh0(ZRH)nz;AzWI4hlo^8-*w6=9?VRj^e7+KB?%eg zsDtS5kY<`>je&*@FP8Lgf0Rbl0nvn0=wPWJ-8c)Ii72o7C!En+7NV`R#tl*tm4GE= zD%6((C^i-0J;N`9pW+65et*lUT?qoJa{hRD0O-l%oEs2pn-}%rva00D=7%F%pTh4n z-4<5b1;GiNAfcgdmzT$g%@8gxoY(7#X}cVd6vJ>p|->AB)*wzRI02}4JR!_K*QU8`yKE!nwbIbFi zObdRF1pJ?MPRIdXPeg#`r4ZI@=4W~=j`i*=t&^oYNCEwpD!?Vdje!c3Kk%!qGntJDG zWP1RP^QqG7tpdJx4ylVQ-0P}>ITFelPMxd86^k`!>b&P%S)~O?vNN$)C21r-~skLjD z+K{}K&=0+SrbAoY6qyqBUQJWUhL}Z4GL<>`l<;DT`lzMxjH{XHLG}Pzlt2~=PLfmN z0Ug3E=G8n8<@e0;bp7cv&(*S|MqWyDVotB5{EcAi^@aQdytNIgPjV{Wi< z?Dg$UOWFFd%yH`7EPBQputoS$^RnNy7JLnk{2vViFZ+qrPT9VpO`C%M(2qPI>Cw;c zlextt0BT5u`7hK^dHgm~ra4dpsjOuIkKnU^%g1qh^RfpJzpvMNU?ZFx;HSIW(sOeQ zA)kk+7}9sJUiDP^kJvtJ!-+vN8MMWxtd}ERw#%y*8r~zA?KK{O_}wSliKmF8Z$Yr6 zyLc(f3r72L^s47D9#clc`|3&<(0S?Z1=IA&wY6itfq{(DJ@jZ2>SD^=_#XI_so<>Z zI$HDu+b7wgZ#Rx|)FYqMc7+o6vEhc$#yOvku)E4emi9j#r^|7&)crR14a=JpL!7^gHZy18#Ydf?1oLiLB4_euv5{eRvNQ2B0GR5;h}&wKN1mi#29`$k z&I$2Tf`{(c=iytW;vQGzObeF{Ew`I753Q0|;LRnknx^!ivPx#=wXnL^p`lPc>8tl| z^x_S<%f|UZlRmS^{yaV0ueT#H_hfDGU*q!It;o+!%LThe+uCz>^q(?QB8aTSVfpGf zWiOXgfk^3}YEQNfa8N$~{yn8FRPjJ}7G)xk52|5oUmk2^tw{1D;DK!9Y$bdnM|um7 z%)K@3?(8v|cf4$@4vdiddFdPkzhfS#z)9pb6N+RplC1#Q{JUzDf*kb9WL7?wz)3X} zj<$kgWp3+)Q@Sq8K7AL@T9i$`?B|u{edQIfz4dS!W-;OIB3E zL3eQFfi+qh>psqL_vqZTuxY#i;7Ck*9@Qo63q0#26ts%L^!+QVIBpwN6h)uvPO%8z zq8fD8Q?`PAUunHot-mjlOY>R39=rQFC($K!)3P=%n$uWf{Y^e@Fg`L3l|RMG;~VT} zEPnn--O=c)YVy;>pBlSw4cR*W!2-C5>w z>iAFH7$559P?Ub6tk4Q=2nmLM&N?#i87e$JvYumBz03|UyA%wD0(xVJ`wGC{Wt*Im z&OY5x0In%H_s3}o_#mYK%ahyj)zsc*yZGsTes{q^L+R2DK{l-)G_Y%eTIPEkS#C%l zj0Z5nfx6tmuw?;ZYElu<0KpOp|YsyyZLzyUYa|8#8x+BL=;qq>`so?ib} z`0DFsVyJ`*a|s@U1oAVdiYLd`A{yk)Bv|Q{luB-wE{4s728lKFk}nds6k&{Kj_(c56)|NuMZ7gL#0%ze|%{f2Eg!tYJxFMtpEVWMK`56H=dVRxABIrxpZA3 zUd71C&DF4E=BAaC?%sT=gqQvA@qWb87JWW31^3roN7fgg9o8PNHws&VU#L-w`)_U0 zSMx#Gn!QVZr*B69Zc<}kZ;O6FRYOIEn;+z3sFEe&V=+17&`(qiC$rx6^(70Xc^$ZG z=ZuJmt`1N{we|lWe2AjxJwXG3UZ=6aCQ!}ur^s3a&U$Ru)muUKI4v}Vi2U*Ds(xkJ zd)2UZ%K9!V&_NY5{QFy61flSxuyLV~alilD4Ynik-Gh1!Wx*%4QTCT3!R|tQth^s0 zw-Z|F-Y*d_jzdF{0OZ)8s%4 zx>DXxm;?y`h@)`h)ur#x<9~U2Z4a`s#hceA;>!lJ`(Kj7lEv$6+^)|jiz_&L+!3hC zKF{KkzA~n#p^#1UiW98%@1!DLVTAGYFk-L{!Jl}bGyVgQ_s_A;E)E+Ogd-TXrN zo+}WQJqI{0sgnM=)mHaaY33YArCR@V^ub@H-)}1jdqbyw4^Ch<10@Yyc#xFlypWY3 z+LNyv#oJxombUcG&H}p&`OKem(KYv?vN*&tffG)0>i$*_PQVT-!nj9AeK4*@_S4)Z zrF$Wq-+=iP6s6A!WPYvj$8S27nez z6fBs5AaNuVsA2|yy&^7%{HNLCUET4JLf})GR)M-(AU{*V*Cth@7yyMXTanUO%&+7N z8~MB3&EB@1&K);m@(n`xTv7Acy-jc1*z)Fz>Q59r2B{URaM#bLSR62(lMisl-=Z8% zYTd(%K02tx5v^jnD|mFLP9r}O=?Q;yb;D&BBdXL~z^)WPyv^&npAd5=Fj&jt0QvND zVA5(y`W{+DZfa#gUYGy_BGA2EH5ostO(;H!clF5uIk#PzXkq{J!>v37{Dni4K{L$R zbhxKE4Qp4wO!)1J@-1r}xBtA!w>5rps`IK~gQtppznagE2i%WS?RO4Fxh%VW5ajms zuPqwOVSq6EAt}0#C^`GCUTsjttbGMynjS!n4B4SbziNJpGie+6^W33yk2ZUzXs=!T z|Hs~6MrGNwZNM-BigZazNrO^S!bvyMsepiVNGNgAAkrn>p@bl!bV_$ONP|ejNjC_5 zb7DN#^W4|_?_2Mm_g;(Ty5Kryj(ukK*=LV!wuAHdzB&N@G7nPQ@OBxlL}oHXUcS5% zwmYCb*JU}z}Z%wFg|GuJ{0d~y)(cSs}N2cL$c&3|$-^ZI$ z6`%G4$7Cf6He)eu_oeIu_xRil zzRm6gx}N&7<^shFD;5^ri^k^x%~sD>uBr&e7to9YD8dN~x=oDcB+b6WKKl5b`SH`} z!#un$Bg- ztBHc|&(Ymp4vB-h22e$SK2rlg&lG>D4s5UFzo(N^cR8VU@slk zy9R)s^8k~!NZ93_+EMqpQ#sZ|X_2+Yh`+>X9AGevCb zZBP`?{VMJ7h>Ch`49RJmkCc$u8cE4A$%yiKd!|y|6_7MiS>e$(;fBA;?xv_W z@O=N0Xdu2})W`2KG6O!t%UXGLXn^3N z?6CAHi~vMC*{_)S089mjiG6tg2qB##dD?omTv_Ldl8#%$#*1>|Ljs-Xb)ZeL=C~Di zKNP9KqQt_yQ*{Hj?4fp(Pv1>#vDHG8)M-8{ZhjO1$`=i<<|F+<$N+Z)N8&U|84t3- z#qVunYYm4BFt8Em09cd)=_lAN=GE-j?HR=~OtdD>s)QL$OOL~&c%vIz*)5hEUml-{ zN38cYA;3OA6=a6s{$kOPqg&T%wgKz(OYlF~0zggzpYWL0K6*?7l3=!(x~r`X;ab49 z12mJ!D)o)cm$pXm|H^t-El{x?P$pyNtQ9els(uK4#@jlh`(_knQK&6u7CMiPAj-#xMF~qzZhD$Z_OKqz%c`|7H~KOoFxUkn>jZ$ zs^aFj*1@*m9iF$~VY(-=>zIg8o<0QM`viLc|8NM%N^blw@qhD`{Br<+PUU|OAg{Hr zrQ^1H15&XY6$c_fNIiT!OW341v5g-=v-4V85N920tSr#FlaBEQYRE*JLO7ZKA@B+fFN5QmG}7YmO;5%b~Sm=w@C0v-V;1` zbT|lS$L5*==g*+tX5g%TB7?63oG+&9Ri01p8JLEgs3GKQP|SdaJ~O?v?TugW06Wh} z`E@Tp{E1&H)5lLLI-mjGIj&V3^<4+yf2R63#ZA{8j@J{eyPyFYJnq!<$39RKg0BRV z!f&L}9+P72Q-C*9C84uL2T$B0Jy4?uPdv_N9=!`LAFkP;lsGQ_W9@%KQ~o=I|39rl zu@OMZB-WSi0OT$3@t7~+5S+`QH#19-w%@%?Vy{6(CNVWE@&GcUe9G>-r2)=O#ZHY6 zu09FlvPnssG)lGSSEF7B)o-vp)sYP3Ta8c@V@3fMXY@X59bkNNDH`6|tMNR?tYeMO zKLxBcOP#~3*4Q^UrM`U5yc2qV8+3Oay~05`%AQX}LxSOe-s?CqD|fwge-YodG5eM}&_&Ztu|Y%*rP!$1Ae zE8_RQ0%Twj=%)@+n%z`}kG5{YVxDPy;tljkJ&Mc$Y08Q6`b*S_!@+i}BcBfZl_%lr z&;2=0Zl#-AV83RKJ;FX``D0Sl^kD9nQGH)VS2%NK%?Uz)@$cF?vZ=e;`MCsve%!%6 zm;zr2sug`#wW;ZO(-W1$*~WT-Tj3MutIG+%eDh1i*@GrXp~~C?bTPJPn9e z{|F?I*72~Qt_jnV?`+VE8-lP}3>i#`eeBsp$;p5?^Uk@l;x~TnygfsPCOK$Sv>?FE zUEdJ9J-6~?%)(#(3(Mw#fdU0yt(oSFkkoHmH*P_yF9-}7(qB~~&3_XKkPL9_On97C z4)E^R#(MraLx|u5ttV!U}5we%% zmILhQH5->kVCo?wQ5m_9*cW^%!`G>E1p;v&)AepZ(J;D{z-@PyASaU?2C?ZuN*mrA8hm=+>8^;ntZHJgfL@8xk@Fp3!s zXwC3cj9Hdh#Qi@Qk+uvkqb^dm%8Y-2L)uO^5KB_sFFs}B5g3{YcHQigQK?h3 zd2J@`kdG|!;CvcXYW!S3h{1Z+hV~rtxVfNvZF~5x=`ElTqx57u1#+iEt#vr*_Ru5` zzlZDmAU=JT?Eipt{O0Bc&+r14xAU_~LZS4KoWVsjt>Gf*qh(m;=%yEtte#QWN~3&3EZa4|t|w z?7SvHNrnEmqN;3FQk@^p^DbRJ!2Lt(BK3>bB|87MJ6=}jBn3HH??fmTw)2-;O@o{% zDS_B1m=oEYSnZsO5fk?xCT!{k8MJu{kT|0MJbiF>|My`f=K`CKvQu#|AE{x7G>EnY z2Qr^eflG041MyJ+8a(j9Eo8;E{=3wJRcDi3=K{6%*(a;7uc>K7H)se`qFlcUOlX`; z;)<@P4n~g!BTHV>wcy?kJ|KVBJ9~fV!^mV8EML*u(^+{ye8~%0x9I@fO8DiWl%y4w zz;N)I`m&dicoSA!4uZ>m@qxUnFDgAt$?N0R>E!V-mZUC^`<8BQXK4P2aD8igJp?;+ zfQwiO&I{6rX<%i8EsZD`1h&{exl@o|l%wFQoK5Yf&p$1!7ABU(poYMSQ`lsvxuCYj z57KhUu%XgoNSWe*oI|2#c)Gh?@l6YNn#Ps0^b_i|lt8-jV{D0LBta<03o5Yt;aqpj z;i)>RtX+EQ3e3hRj{={jWf1;kz4q0Bv)`!Ocom6hr0gCA3f^5bnb+opWB*z^;$av_0uVo9X73Oya77-cEn#+(6YVHxMk0^Xh}HD>9T#l zZ!CnRGw?%;h~Z%pWJ)&TZHvH{(A=;m$IHj%#$z-04!+QoROR@rH}~z1uO2-wN!7J9 zPad4&lULGiqu#u;Qe+r3hRroAN=k$ehg77}SU+^urh%BhA-}y^485(IXPcSGo+eYu zr(m^Y-L~8}zk9O!=tAStDu;OCz>1-{$0(hrqWt@|e&+%9(HQ10H!|+wc-7L<8*;2q z{5V+KA}w}QXyZ&(pVV!YNnoGl<5%C)mDw>5Hnky~H7rW{)2iKFE8);lME;4AZ-!?w zOypGYVqAD5+Z+E_1#xq@S$CR@ai!w}=AAn;sdK|A=)u}}oUK08ztAEndwbt{6ze(8 z&2=^~C@Q_nk)GBIE)}eXyKRZ>yt&bH_FgXGEh6l*p6m{||M7_wvVvVz=W&);EDW{s z)3x`>t#bbhiQ%w)GrS;uqN6G+vG#7z5lweTN2a~UP0>hJyPBuU63%r`jXR(oYk|U7 zo5XJpVA}6FZPo7PokQ$icJn;RLjo$*kMv8W)?48!wK>(GuXn2t=J*J9D`4iOX~6;; zn*|y{(*A?s)XA0)j#38O{}A9SU}#TU{Ope5uyFUoT1m7{B5X-lh*@2+;GRc`&Z_JN3yjv@=uogpuwDJ zq8q6XmWl-%h2fzU@Tlc%U{*L)4U}w;zuiIG{?YjghvSF{q+zc$$OiWLaXgRaQ5k_M znJ8w8bBp}*Y&HzzCtU{HMbqB@LtygR6ilICzXz;hq{Bqr+39Nz6(isa*;Gq(*R@fW zkXjiC$s9X&RK2Cvm~;4D*LbJPH`)5bG78X_dc;3LTaIhdegRV%s6nU9ZY;h{8Fotr z|6QYJH4jSTl10N_--Ym6<~F;i2zBaZ#Yvo4GiutvEa|fQ(ns?Q5_|N&yXV^ z9w!1x=o*yJWy4410Kd4|(xzxnbb)BLrsVz}>5EW&;!oIvJ?TK38FD7)3bmM5b!R0{ ze7)e8bU+9iH$6TK}JOCB}4DDAnO#vBNjD56jT@EO5OK(}gz}brOmFCSmD4Vut0~v9qe#<)Z z(;`cx9%$A)FbFTOawYLYio5FUU?7c1!yPl{#xnHEQaJ4-(saKBL-0$|(d{BuZ z8Exg5nW1m=eKO`ep}+?`jGYmKYtq)%RF~mW@>#**{jRh{A?yXq)0W#FFU%n z-NaKg_H~>oKRY#-lJx}g|I>D9yD4@HQjX|Ef{Txh+J-acXwyHUMj81fz z24*^~PKG_{rbmjl;8^m^0A8x3vWGOKX&SB_LEHF_vfFTN(Nh;!(e5J6Dkloa!i;gl3tOEl;Cr?3_#UPfyE?7<%u8@$-A zkI>gR3zAh?7C0HOJcRC8axAjhb-RA1M{y_k5no9D;wd1+y=K=Pg~xN2|51r~I*QYx zIFzhAbH22hm_>6x#J6qcY6*PijdvT^wlbz;4t*3*o2NvMDdGc|A_h3WnUd5s<<)l3 z&?aXQ;lK^iq-QgO`T4J#Q(PS52A*E{9Av-unI{b1m-hQh&(K1Q0t1vXND2nvwh1Ngq8x6W;Q zfCX+ELy8 z*M_99%vAyu$dSHB@Sf*8#p63R4Q*KNOTSEt+bA$8<62>_)nBqcH(MHHS0oF{W;&31 z(THMphS(`uGZs}RVKxQuBoTFsR~zA<<#(`y=_kPTi{cGu)A&zePx87$%)%A6lZBi- zEiji7cL?Hawd(M$HSk-=eHz(*skUhR$oJCC_uA@BDJ*MznmdC|WHN@$`Y*VLl0K8a z`YOOTWYsCSHf@TI&F;)6Fut;X%A%RmIYe?$FUjX zTHZMPI8BOgxGEH$)g^1lYZ|ECEr_#yP{8i0`>`;IEF6`aL6+}YvBeR)WZ(o4sGX7I z%`_@bN3qy%xF)LcFbv*GFVF~H_%zNw^?H*w8p`10t3y8hRD;pZ8$mM?}-NSdS=kWGQjKvilM+%UY_*6J0?#ke)Nnm;KiJGF1(5a{ydPf@{1Fq zyooRl{fJbA;PjK+pGPt9xMvFE5Re+le}6t(=8(OV8A95{H`ue zQr`w{dIahmnXS|qEtxkg)xF{8$v5@pb-d?h+=!};Rq(56D}WFh2>O-`V$s2%^m78t zYsMkJN1gCh?p;yUwylejZVSyMwT=6LyJ4a_oJixTX6T~O_YEpw^~6<7jP>%_lXR#r zP?s@#7W1*pSf}FrWdT3KSI)K`0=(-s7X z$xxhSPh4AH@z+uX+vsQUcCtDZ*lvI|QB^x+Y;Keit{wKKy;f7bsw ztf~v#i2bA`+kNzf3mT_jitiZy$`3K^X^@?+?i0-_AZMHg>eBs~w!S2|oRpputoTsU z%$$-9RKYrXldGfjzHfv%1ts>+f9%9cGdA;-L9It(rL!Dau()A0U5==x5P~>zc;V45 zh*5{jB1^;%Rn=@=X5ieNp27dtxsJ|cicNj<*eqEv=G&oyP%P<5$J6db!lx1NtHIaA z{Ev;yCO$wUW^@6I)pVH&bKWzs?$`IfWB*8%x)p^2uUO|^Ek2nbFh?guG2}6KvEyH# zeAuNtg|1QssxH5wV;iWD7kT75b&hAPW6PIyKVz*1lPYRwQnO*}m1TQK&l&3Sa|=x^ z;AG--Jj^(5-HjMIPs6Pf&nyW!;Hh6#IR6CeQsMrZt($Q(sPldJ%c~Ien^%F9FM0Oi z8y}Z@mOyv@d}hHEvM(TF-b3${T){H(ZFKk>#m-q0ir0EfjOzj669{yL)?aoF9*VY8_tNqWX zFu4_8Od4vp)RH*@Q~3L%03||&(GZ9EN)Axhy8hMxxGWpyV$`g`8wiS4ppy3p1Te=8 z&rAWIe%u|^U$w&h6Cm6QM#yCcS+F5m_v-WRe5t;jmesU~Bri`Yx8@4ECjCU$mOz@>;#s zM7+sF6kBI8;rUc-hRNwrnY+VU&RlzxiF&>l;(#J~8=ZO1B{tas`vmg)R7-z)bB5Ak z;-OerW#-jcda9+ARO{3m==v3oICk`7gvnfIb=ev*b2HTy0cKw08|G#|B7N&_fj0P) z78szrv&!t|r~yUsMaosemqLX;v+g;$lhOV=-ib4*( zzP}IXq(|6P=j0NFq^Gt;UyNacKRjffB`j6D3Lth(PzU0*WB{C4sSGrf~-aoo$&1@-HJj9>O zH8obRVKFz`!@?Y~y8S=hW4?mDkCvrF*pwHD8W=;^^o5E+!ocWcDaRb1;!P%w)ZB>O zc!yA`7VrvnGWQAzMNppShIvj>I_f0qCYQeh9b{{@-V^*GQf0UNed?KT%RqA$-fJi` zg$7;$4rtF8-UXknL}%Lcf*YU>5ZMQzG+HQst&p~K80Qp)KT+WK+M4ar3s~}?{j+-# zI#0TScLR#tG?_oFMIq5n=I>3#!RUW?ZxLvOk}A*qcWuowCT06c=|rh;5eNDtRxRpS z@=}wWkjN2kV4@Q92Ob_Bx(TGs)_G#yV4mg5OAUS!f+pJV6geqbXJqZ=V}D%P)%U4; zWy4E$+`JXvv5`maeYdOf_xGnIpJn_^iFli6os8aGvL6|PyhZh)J{c*gnEBBDJ)gQ< z@rEV4+-R08W8z3(tVt$)2%Wc-0S>~AUq3#0B6a2i@2IqRGm#K&Q0{N23m{V?gwt>2>KC`TadN!~QbV8)SALcC1_l$+sCV}#p*xFU54 zX=$%jd|tmn#*uoTYM4WEGl%pO;-A)_)5VZmGp|;8Zm$OXtL*CxPSQ#u4e$Rn_fdS| zaQFAXMMOjqJBSE;gFcB+38Mbn#2LD}B1&N*qTz`Udqaa$P4A>wf@%6acF<`A8>vHk z`V`fBuz3F>`^R_Fb#ihuv^`zGIcIR1L;OgT%;l1Z=MZlE<3ZOTZYg9$F=Ru3-1H`fa(h z$;_{E4+Y%EBCq!h`AEaWRN7#D=A`dlTUfb%X#I}QY3;oJr=wY0e*IRt9{D?M?b+{y_@B@= zz_CAa4~H}K<8Y~>wm0y`{`vtTBB8$oq3EsMIV=D2jm#$Mn5JZEV@gkNhW5VBF%$^0 zz-zO4(wk$v)EBB`t1uUmAARRL>&p;F=&_5(RD8S5OLSPz$pO8iHTWn81|n4iEm(S) zsL3I-vH``S;ZUJt64#r5yo>krK(DCBE+qI%I2Y6kY^O?2-^P&Czv|wYDxbR0UtYW< zAc$A{*2%)d;n==0)z|CvGVjb-TI!YT%?jde-5Q`t%85V^Gwdi!t+6IaaCghV*RIL` zoX;Ww$cD=y)T+nr+n1{9&x8uM8%B3?{aU&8I#G19fJujZz+`I$nUG=(3 z5BTe{b<*Q->Mwq!obv8k=Z7xAnsfTRFUk%TTImSpy!v+@*V&y@9_=qZ@%rv~-d(Wx zY}0)=sutQ+u(?0y(fcBPjOoDePGeh3MR%tSv+g|rcF9}}jAby3L7N-xKgU9S z&Y7&CQ3l}@nn~Q9V1PWN5c1qQw5Ak(b(U;ff4-UX?#i*^aHNBA!xJny@7!f#?-A7F za;aoR4*b4)df)5x)p1{FKiE$Wmp?R)yRPN%DBlQS=+`?FJeq9LS4f0#LOrg0)?lkk ztI{MEu`e=oaS*(fpvEm2G!~M#u5DFb?(4?CCbNYWOhFCDe0_E7Pmf}n%)0d08d~(3 zS|nI+#fPQQti1<1TYHwu4=1A1dYwkOujUV}ZJjG*ia?iz+je6T1zcvPY!C9I2q)%V ze}le68*QaCKK4=C}9{8^y8TDtx)d7GLnpslXXnw|+sb=lIo8LtQ$<$8mAI z)A!R}EbvZHt{7wPOr9v%>>aOcdkMH$9-N{dPqroNZwWnMX1zKnnFHH+i-4`-sk~#T z-f3^e93~~d(6Om|mg@How_-iT7W|xbH4e3SGdQ zgnycok_r)?C@yQpu{@dR%j5wP3*spAgsvJ$sGk4d;|>1$8PkpX$G6T~<+keY&a%wf zdOq%5SEc~RLIrXRCe2s!Y?=1!f#SY&M*m}Bs1$B9rm=Y*9`b@6T0iYkSy@_MyzKVV zc>bi5bGZk`H6LW~MuZekSs;}7?Y;jDtVmfKB?Cl7Z2tr&wY^UcQ2ul-;sJt_QM0#% z-~#EtMs-m3` zJ!4+g-GLbSKbl0RPTlUM5GraL4<$L zG0^F0#_ZAUGbBX+f0x}~ZgHitZ z|JS?=d8gDbft>2fPZp(%Y{#LDxJf?WD{xBC;tj}tmua?Ega_UNT*%`bzTB{^hOkddP# zzfTEY%1#mA-n6o?xY(7Z*Mblq0#AiDu>rIK`ChJ`Otd>&(|@o4LKBfUHs$ver4Fgy zaC`;YC9%zIV z#L@1gJ3%+t3XfM#C5s?cU5xK(m*FcEy0q`F%J#REMW-iYSl*8i$8Ku$Ou|L5KRc>D z2E5rxZYr88(WyoZUZ0hs;%od?ow}JVK@!CIYJTBh(~ZN)|KxGrzT)b`$*H2Fm?)B6 z?`~(_U$V*TjfIVVx7lOWw<_setx4nchFT^&ib5>jVo6w$K4zo=wJ5bI1ewfKe!ib3 zJ*<*ELCGH&hk_NE)5#u~6jl1*DeY8Fx}4|KRF*O6h~#oGPvs?)i9!}$tZYw}TGX_;)EV^iwaUr6_)-m4oDDS7Np#axpY3r&)zZ+kZG{vEcus`bQ3 zG+1|?D^dQJIxr|4h_qy<`#yXKihO05uem03qnq{HV5-K^rH}70p~z{4`q#_6X&>#A zH6v88MvGH<8H#qqY^pKPcQQ$$Mpa@D6Wh=_z2h3MOKEQwSim*#8ILj$ZQJr=Ds!k} zGyQMll+?*a;Z{Y7Wf$LCkzo=4Wr1N_0CZg!LXz#Uy)*CA9DuFwh5NM=y3v^6rSQEVXPWHX ze@fm>Va)rTQrO!t-FGz(yFWWKeOTxw)W_zE<&smRmEOJ$3!5V*KXn1sB90AYSAZ7CaZ^T zPInAmmIsrmg+^KF#7xQt$qcc65AD-RWf>PYt@u)E@%&`ubl)g?EI%xjoR4EbJCUaF zz5+dd&LjdCeMzCk+z$9&UV-8>QgRZzL!P)#uf*AYZIw=RdJg?yvxw^wrt%ckY_^;4(^4vM?G^Ej?!nDVhoCru{@L+( zSIsXZD@WDN5W`S&rh(SwFGWg8}o&}s5}j@ot=3NJ|}W%E+4R5M2E530iq zT-(Hz+6~L1&kM}<^M^^7cwAW8>Gi+z^_QcbezLv1OehiC>Ff*boON(sU(-HGe+2Wt zyOl$fLO>w>&VM~jX?uTF;CP?}m+!v7 zZ0r<6HCdBrnCn#_f$y(P*J^6ED)=FTt0GN#X7`GX=^1ifG~U}vL1hL*dmZ_G6ZoV? z=s~JbY=3m`WqV{ygv8j_W)X3edQ0$M}F z6RwL2a!?(~OFw9K5_Hn??W{IN8@i$S^v(Xsg?Tjl1DHWiYu{a)w4Mk|!P(Jj&JbAl zc>Z18%!Z_$`P!48gO7cG?3G3v6u)@e$LjZkbPYpm$I5k!;!BwXdGkEIA$fx;t}K6H zYqBY^&P-5%O%d)X#oO`~Y26OYC)Fn>vv0m%>LxkRUj}71c!u`3p>^GiUe$wXF9xP@3U!CcVdQdiw?$`JOYczJSZ#b59@l zBuVWjk0G*tAhCD0zTULA5!R8Hdb3ZzG9bTw!(-RjX1Vj>u~@#D{gNfoRk{IndLu1) zWR@<~5La^oS-u-C&7^w?*Ok@s+9cY_P^sDe;RQ`>OZk;o~)79XQys$z) zSDq(q<+p5t2vd|%Yi|J8ZQ~7eNM1j^<3T9}Zn8gfSAsnKZ)MBG=XAvKvP+;%tCis& z>+V*S!5`!!jxO1bV@Tj~UG`)R>LMn2F(<*8cOY<=DV$kExkXDx`*HT8Xqn@MD|&%J zMOKaQv5N0XSz}c}rNT-t7KH5s7oElGdHR_eMirUfJb&1k7WWF85mS+#>N=)a%)8)e zlwe>bh)?lwVQiVZ36mapP*-R-NwW-{;~jdnErFSa|SUY3c=)!`jqjF+vIoR zQb@Nofb{~Z74eCc*{tGT`7(i zi)yjtK5EOoYVYU~lNl92C$gljCy-70PTmki^)ONXm6K@7M`Owwg{Fh-?LoiG;A#1z zx;yrYYqM(Mfsw8PN&#}zHazq+Xd?T9b*}IE8DxBlG!McB^)Wq+3wOVN9N^^;J6XJ< z{C(UfR*Ri}7;rTyi#}ktsg$85%Oxr53@n6u&IqKE5E8m#BA1o3N`rvp4}pu%F``HD z>k|099zDFbn~jH4ynmi$TE#%$q{)9L4_t=q;-_iV$#(CI1AloPl019MfJAc zQQdx}?eXG%PJqewBi!U_l;(QVZgBrj#i>I^e~z4$TiWwwYl58{Jx|~Ovvb+-MR#LU zhf(+@P&#H$`fz3KyWyl5%?WvmLT0vzyH;myZq#*!U3@|`LXn2ViGkyKgJk1P3dx_O z_57)91^K5s&aoJpjpHa2>0Y_d59w|7HfL!U*t%ISKb58BYI|nyDs-R_dU*Fs5b5`1~`2=uitXf$Bq&Nv0-WV?*Fn?IwPe*Q4%TEPY0wc(feD zNi9v3n@HEmL?sQuPl@Ali!R0}<#a5Ko>{tl;qMpb_M%x+HXBjR-GS%8py%h>q~@r_f}0pI1+0C zC$C8y>-LgoYO1}vl)2eU@wLElOuCy6dg_J=lf!J{5o6ia;@H$Q;zwTErWUotU!^BY z9`=<<_XU>Q9GKcw7{+h(u?D0Zb&5*2#15@C6_0_L=>7UWl}qi344dD#7avk#PY)=I zED~~LNv@A#s>xjSBkGlBY#eg9J&lOMVzba7TH0{MJFkY==}XK695%k4r8Xvzkb1~R z;37?QS=_p>0g>EO-SRWkd(&PG4&#JZ%dIla2~Fb1oz||${*}{@`1C?Qa~E5zedOI_x*Zcp4F-Hlz5|H?O<3rJ}qU@^O$Pu2H7ClP3m$1 zg;0FUBqo6~Dz1zVMNqqadkH0=Yg4I;IIP_P z2Yhh{`WRC>^ee6ovg6lUfY?(t&iwq1crtMjCi(N(JDE7Vg_pDTP@#iYe4RSP^dCoJg1;(h!yPyCs8(YfP5mfMOEr1GvH99#M4phrx)xGr^e0?F+T*KkPDP zgQ?Ja<}1<41qlU{WdB62%CR~kJ}(ucFWI+TC1TRowOA2Eqy37v%e`kvrNhwsoO`e@ zpuNjiN*8J+6eCmrW44Nrw|(JGL}n_gqFnlX$5XJ*+YZDB&BGO;0Vx zEs{4kBxB%`@HG8KKrtAjcEYR3ZxexHJ!j`fp?UY!zO`{#dM%wNGg|E9gR23>t^-C{ z5SVgtKK*S0ikl<5z+vu^6ypu0XDU|Fd~q8r^^q7B$F9AHm=>CaPl>YKiG@t`n<{D3 zbIhaWSN+TDRksvX)VPv)Tf$|hYyHd_Z z3zBs|#H#>kb_7(LzpW$Mo2O!W-$^>095ykftns7pW}0X-Y>Nb2*1{M1EsWJSzfkaQ z&_!lFhMN0gWH9dpkFGYF<65JPoTQ0HO}*Hbj{#r1nQs<{9d1zoDcI{)U+0Gm%_YLa zpWG&|K0T-O6&w0Cn*Wk1-BK2HR}Ggb?mJ>>^h3eNsvO{IEHdGcT>4>>Mb7lgmXCLT z+di`>>boXo;E15-n?UDlY3V-QrJ7PT;2Sf8F)HdLhZtZV`)fXn* z`Jd6wN3(;WTTnONH2=SvKCDILxjT{cxat0>>~$Jm zv-}jk>0$Lqqaa4AEch-6vqN-+>EfJ5Y{)E_1Y<{cx6TFzH2F!#YkDa+~Ycc5zSu~)_kt&AXlOYBI)gSpSeg!DfKF9qgD zX82>}OrrSC5VCFKH{n{+O2heGAqu;jUY9c^B;uaVciTLeAh(LShcS3mAw~g)kv(C& z$dU4)=Q8*Dm-iCC?$F$mrAxGa(y42khp)J0TaxUSEha2c&%GIZR-9~fwK>4{t%a77 zNb-#=H;LE}^Z~_Y^OdcmyNfO*#{uY>$AZIno|@~K@9tOC8?AW}LKWM`4V4#b>a6pj zXV~4f3yayB{b$|XeP}OMXHiX^M7ukhKMa8Hjg$@>KO}&8iO{-SK7OM2Q5e=h(xwVM zxpx=sqPc3Q@xnweeIVjCHHd4RhyqdAs$clK+wPCfER049&vY8cVarDb#M%lz!rR^G z5u>3V7Wsdeyr@#nKfdZOXX4L>>Z3JbTg1T^9&5*h`~b$pue#xBbvsf&&YqRcm(S7n z-vz)@l-jD6*5dJlyknS1K(2_15W*M<&WeMx@_5S75s77I`t#XAh5~WkE?3sgu#+3m z?Dd0^ftkRxc-|ws)?rQi1J9kdWszGH;wKhIZq%~e7eZk=c#|ah5RgG?2Z^L^<`)w% z-=Ftsf|&9?dw^^g$TtrT{*_MG|0Zn?mwal)I+D#e)JP|d%Fb`w zorz&9dJzG{)>V{YlrWoI)}pE6eYCtItTZnPA+9~=m2e3m9(hJC+BY3@ADpX21m1Hd zVwx>Cv&XO4U_c-*9`D(sztDEY4(mgv%-h7iAHq9HjTAQ!*dc)X>*x}JFb!wY68L~n z?74&$UfzTs^8eD>q9U{g z?Bn7VPTs8niH96%aL7}h61~6c)F-t4J-PKM6h#GA-{_q~Y2o;N)(;7H`&oPoFsv&n z^(pwyqF=0bBzBTGJ+i$sq<9@GEQ-m1j0%|W9NRfJFu$2qL?#5>EqoxSrdn3=Ib(Tn zIs{}O73b<0j4C+f*LIL7h2K4;c!ANY>(B9o+)a!XVej#t-d-u^OTN<6gUlTi=9;~< z-m*k3-s*>qv{H+eO9n+FZv`-Bo-}M=yR1zd2nx)!c%(%Hp3?<0&a&cIB#~<`r$v{f zPnmb(IHOZ+=h^rEl%8qxqxWR~;T?N{Hz}J)L6=Kh8g05xZHS_Z-%9<@O%A3EBvtRH z)kcWR|9nQts}h?0A;P~By*jz6U*aGj{%}e#@?EGs`Y>BwMAT{YlrJamL+VKR2ig#q zTymE+Eic!~Ci!(*biSGB#e8wqgae^np1E(S%?s^!QH)W+NS>K<^3NSbcw}jyVPE0p*YkG}g_LAE=g(GvJ=xxbuX$0j11Pbu(S@a=wNqW7sWYbsH}Ae&3i zPF*fN_$O$(_JKYODqfIX2AcsNi16y!yO(iz9*;P)zjCI$c(t`lv2~1>**#n!%l;xP zIqIfc1`d8Ca=3Yp*?w04#~bhvt1SS-<)5|qdc!XW;bL=7^r7Ns#h!0Eo#G@9F)JZ!Ym zPr*0vguJr5X31_fcOrdm)A;jww%GB7T{up<$x(o~#M`OyeeRq#m#ui|t?#^OVkl|b z69=arm~Rt`lxk4vIV65mi`1-rN3h>`wz4g(8x+wW#(g|fL=$$CLkP(Ss!C7Cq>nL4 z0+EpTBH6-|C_jh`3C7oyp@GNkZA0cc`FK3hLlYsL#=!-t^wEe~k4GX0*&pYZyRepP zXUy_;%H6&o5{OESiu7b|lAwj>H4m+o_`ggnUF6tQS5;8D@@Sg1DRH4MI$H??6F$xD zx-qf-nDL3elW?_bO~pu845b%Em#2|?MfA)w_fTZNPz#b-o_RWRhFBt9))~uQ#G2%glMo#f$=XEY#buCXB>hFTWuSA2;0gNYU}u7A%(B#Cdb5##nyh z?I-``quI2rxBh}lH+kd^=tPrTWk_5Csdhhu8}DVwZYe`QXqRmNhs8BhNlP^)y?}-7PKMHI#G?NH_d0zCZDO)^9z3JkR?5^<&LqG0dHN&)Mhfea_wc zwfF5ci*5Mff2Ii#elCA@f|Lr^jkXnRxeLYJ<}T`^IxVilMRgwJ!LdO%Jhu#We>%|FFlj4gXTq zGYB}4??b9qie5ifJ2D5{$bdbPGPA+fYY{}wNAR#lFOU)>2D*VI8gmq2&*}e80QYyJ zdhkry@0Co$|JbAD^dG?N9{wx#Glu+vPs&DBjhmQN9Q@CTW#9{qy-$NE4iA5xTpUz4 zPR9#)%r4WSqd&htZ-8@vvHZmVHLu|xC@I(RZedY&U0xst63T$pM-TE%(J{Um0o)O+Jxzu zTBX3f^8**bC?FK;4KtS4mQWD7ii8vMJG*S=6km$zIVnfmlTO_eraumjyN79k#H_yq zNvo(u@C1bx186sv?=Vm!m~$Hyg$3wF23)5fRB0)HKi%&`mF$sZ#{v@n1g3@u3HZOg z4d()~*ZzNZJ|nJ!wSTh!|6ld}=3g|#^7H8ysL1``g-r~)gE032z?dfRCzOlJg6yH! z)uj-HlD%O|wV!msq&CvV)>f`}K_VNVb$jUV1x*Ky%Lt5l4VdFMGgL^x1+^^Q_BtF$ zZm~G?yXN$)GhVcwl zM4Fa+SKSM^}1P>=$ zcja`s*RMnFC;5F^fes+p=m(bN50Eh~p5n&1%5lJqhSf@u214F|(ms&g!-~LxS?bs) zV0xW#G87AX8DB1KAafG=MHD(3`k$kJOe_Vp{-6Oqzdti-CD1||lu-Ltv?Ur%8V1}0W{r_y1^_JUzfY_>a}kaZ1-P*L1B;w;ML;9p7l0vZvs>p!k8OL~VEhhy2H(fYRha2AA>J~*)49o%ntf8`?sO@jSw=YbLTUQRekC1Lj-Bbz! zz@%Av=f~>jdmr_`mlm1@hD9;_1dF9)jx5Pc&|tB8s)oGA5{Sa@glIoNFm4?OwY^Sf zMzO6r0^sZ;cR@BHB9q6#E?O8!HHa`k=>qU2Aaj|5m)k>%mASmAN!DPMY(+u)Oq-}g=Te2!3DnDER&zYdA ziSlcsa;>Tf#f_iBk=-jVr=>{3R7!{|@q;PRiQ)gcsASsCCUhB)o+Bqekj^{yjN8{& z7{j6fZh0%10kGMkpc4iUuY>r+v}g6m>XqhcLh6I+Rh(A zj2+k7vaNv(4hxCv|HGt|O&mJ*nuxuSM(*04xZAm)=-26dfXp}t(&*8UYTm+`V*f8e z35*Zwr$HT$PJL3p0{1Kc!YpOXIJM{Gw0lo;XMvpyzL(SK5M)lhzcRCH4$w@Vs+pgh zBy`rbzq&jy^gX+H zk$>~Vc1SpNsHX}*{0o5VTlV#|-1HSr)%aLnQuJ&CoPFof3%e5gD?kzelZ{9$>ocqV zYSH%#?+}KePU|I9$*Dfn zK^#wsPE!mobQl~M@DNOui)S4RMio>-M*u0hXmB(X$A78Hmm!+QWNb8-TzKTV0kGxJ zu*T-~yNa3tI2N`NyXe>=FA$KMaX?lBxn5T-cLI0i0I4+}LaA!Bz-|D4?&GohIBy$9 zP6Ff;G|A|bxrtwzTYv>#niFT*VbFYs>n$Cl-NLfq?y0zysx{q@1RkRv|5w|FGay|q z)o_wDU<3fLe{~+X4&aJtn7=bu+%x>($UjA2XMX_XRnYy|1KL)1fo+hu9F1wmzR(cT z0+_tCS!Fzcl7FoP$_!Kuf-HN80cqMBoNv%jPJpE}uX5~zo`4T{{ePi#K%8HfRZiSE z0R&kBeN!8BcRp_z8rt{dl)P3zxT>_aYpmtJ*)AKO41I2%7|0l)97gNf7&~_E%-+tw zFoe0y1eQSWSb(gW`3^%BEBfVFstWR0-v^PtYDfY+MG{2F2F8drJ?d-w1z^_#q}o<; zHbVqLt!)Uv;lhMYXIsDRL#Hdx{XoR1qvaW=;cK? zF#m;t9Bgl7N;ButZF~1j_fhtmSGn`xi1S!CBMTFa*g38$ zy*zi?xXdhnIK?p;7#R(XsWLIXt3P?pMo?QHRY#f5vqerlxob12E~c70V-dqoCr?tR zd@f>B3gB!83B_7DbB)LDd5fCZ^lCyKMAy-9TNs#5|f7*DA2ziiu6u_X~ z5X=?rG$i&9w{z=d4FE)69Lk@nRE?RH3CQ*?K+n%FktHz=-L;(w{f9sN-fjF$uV~?4 zEOd)E#nh?SYriSZi0jo`;n2+308}|~CdXhAva_IAJmLcw+rrzZC+G@_H+V-4@Kb+0 z*$=Bk4eYK!V%GYNXdl2E-p1+vWa&aiQ}uBnLfo_4{Cw#~VZODH(Wf~y$m{I_k+}x9 z#g&8O6MjMr>aL>C>sC3JD8pJaik=j8Z^B6}X=u&vrE7K)y^%7*4QOYbvPhDuSoukUo|oVyE=_Crpl&}=nqk4T%u!p) zno?X&Ioq4RJ7l`m9E-(dmdp#51Wn-hcJ)HWMShNDNj$d93fx|bxnGYa-ba!0g%f@u zso<_i|DId>lX>b}Vt+neORYek&G6tCsm?da!=)k>+Un{JoGW91-U7KgD@!XI06%bm zpVM-2+OYWP@&d3&N)h4ZdmAUV&?98p4EFBjbsu;r9_ZxAk>>5;${z5|n?IRb*PR7> zu?qL2b7eF20!TqT_S&rqX-VR6`?z~~`($ipq;DjW1Mo5qE9Uv3ubn7~-uz~4=(Iq_ z(5J*8E^_vp!6nWM4Q_V@xoqeRWV+8jkloj7a7LWsTGFfm_Y$O{pv3;hxn(CWMWO*k zb7ubPwnH(g1v}Y*-s)MoJ|zDPSL~BMv)Lm#CQNcjl)c!fbDeJ zpwrFPcY24K{Ih}4wzJuHqriJd=Z|t*YfGbm=qLH+AWF)Pygmu3D*x73}B2OMU z1HL7#=9x~m;jQ7BUMf_mluRle$3D8u{4Lj&VmrW8y0)gv5is?p-5Rx$#JadBef)!7 zQgVC)C|U%T2#eJ;>MOCw&_fooGMARAOAv8t7lwDnnX@r6FjmYyh3tcPqVl|Q?OvC zWFwWibW2*sa;<2~ORkS>k8r5!AbB^^x%{y^kWwe34S>f7|M!_*DZk6Ht5gjdzdxh% z%cOgWWBumw;M}LG{vhTOH@j^c-Kaaha*YPXMIDDHQ&&V33fPk%`KXZ~dHb8sAn0SA(s-C%F=bw7Tzoi>qr>cbn_87`HP%dCaFFR$pTAZ1gS!ll9 zY=O}$m9^DXS3|DPLrR+0Me3PbfmGvxlOOPy8El_g>Iy|GPf4B*e+{%YMh%7>%#wGc zJw5gS{W3m?p)tMwYQba8O?od4?7Y+I3RYB;jMewDFloJ`3=ly=t|Ka z_cDh}u%*n246W~UkKx?UgqDRNAx{!r6!ZKbEMhSaqLI%h8o0$FBmRDZgO{d>G|gAk+e$Rbh3c{lG_Z& z4J%l}?%YndD~*zK!i#Ox7Rn3fUVli1cy$ggkzrM z!BtiWecl>ZacbQi<#5`4`UO;9E6P6T=qH6Xb?*pIkz&i5ne4pT{brDj^jB$xv4cPE zJD%1BUBTgjQ792TZ%W)QU%jYtQ$jHv%(DDo=EhI}r)uuS+(>J_5+*V3sCCURflqLs z&?}|kC*g6;e9dxr!IvSY2yh3%Csugq*;>-nD|)JakZnzncGXc~-M-S|%Z5*9xBk4f zADxjVUKD2zCNHn-gYZgR&%U=@cl1AF+}E$0Gv0{fRZsgwP|NZA#I}TuZ9smp(er4; z^vt?g-l+=4zQJSQ60EbRlhOdS-Q5m6XsFmrC$#U6)CgqVW6v%g3DI3qRWd9;+;v=p z*K!LxT3=sA<$q(7*?YSIi~i!rP-#G8pr-D2Rv*;hb(xejOLltdhJ9{Zy2!0;jzgg% zuV}6yC*@O6G0RqbH9IS?tqZ)8$Y(l?j$TF#8r(IA&kOlP3?L)O2U)8rz)CW99hALV zFU`pVZd%)JA_mA6;8*o$SZAOsS*F?VKzqkDC`e7AwgDB3+;bb(c}*2H*%cF%Yb4Tu z$@_1fW3TIf^BkLm4Y##Hj4QEOMr{*{)wix^N6GlGsUK-cfTwiA{N1qFCsj69Nt3;7=SVAY135RU4YV=lw60FKP975SQ_l7@TufDMt@1y(CZ=OEd(oo{|HsZ36M!WJ6%e07^{QF8|oDn-O%ALeGv^P9U0-LC#9$?PIUJi1-gI*$^I zD`#zC6}T!0JCqSNE05K1+dbP5ho5L?cuo)P-VAQJ>@oJz2D)viO`beE*(W<}A@rzH zm0i2tsX+l#*dSD+Ns@4)zmaN!{x_+kT@>ir)pH5jUl%mC^+1-(vExQh{fwtp_Uaq~e6RKXM+ zihWygy?e(fas>tchiWnk+G6Z@y zk>?-jRM|PY4aB^Kb>8V^AD;*K;@kDZ3x3ZVnz0J;t+X6XR%{7tlZ}ofIos5)Yp2eU zIVnPT-fEM-5U(k71ZJ;pQ7222RCh6arw^;D&u-M+5zf7oT>R^4X`4uToAmD6H8sVo z1m#ADTbJC1x)eV8*^a$s$X(!o4>|VNI*c`T`HzkYiw-T;rOne_JCrc}iPe@XYp8;; z#grBk>64%<{U@ZdnV1{nRb`{UMieb$pV-ly8e&;6M_eG44bDuOxr!lsJi3N;ywi2P zH*W0>omT@&Li7fnlZps;TJ{87pr@>9me2Ygn%eP^U-w&Ew~>5>h4VLn4{cv>HZ_kD zHphwv8`G~-#sx6}BjATaU4FQ&e^b1)@KvXPA227em9KW)u-wK852#X=!yK2Stie== z7|0k>8-RMhKJ_BpxEr|Yvu~m2;C)}IYPHuPtu*vrAgE@X#+NHPnx|5A2ytO#`00G? z@+U3#hU;m5rdvJJagn+6zQQR}JPx$D0^#HVouFo$rny>hzyQ$~K6IPmW|P$IIpN~a zw*rFrKLC`)gSYXUy0Wr?<|4cM>AOE8>6}u%?fW`~RDN1k!F3aKmf8#k#|=T-a&3uB zvjV0?AJZt*DC$dJPIH$*MFSZTJ1tGsAa5DiGe34PA{qN!sI>a6ma|O5-HwdUz{ujf zdH+lx%Wd0S0etig&L`-}gEGBQ{L4oxRvW;+ule$lY~$xGkoc{qr=zQVB=o7=;d+(C z`D69?xK#V$<)mW1JE3WL$YWS3#B={N$W9N3Px2zFdsls6Vl1jghf5D#*x22()R!x# zy;S@%ZvCkk9s^@@*)tMrnW8(>=7(6>{BhCPcN+msMRgg@v`ft6RE)1H0Vv^c6(0cG zT=ECAY-haVl(MW+1!O%hH(Kt{=%5}%!SO!nV}JI^ zt#x#dNdi>?r@G>j04k-Hvp8#`-H8Lwqvz1?xT%HfX-x(1co@lXgDD87D&81y< zvJqe?`P(W7yIpavokanY0Z$Nv$$4afb;H7r;Zf#x%YAK2(-5XsPrJzYjHstaep zRZMNlt132si!cq|fojbCK`2hTboYV;{#D0R*LP3_6PW8!8Zucsn^QF5pFtC2)Hrqn zMM+BPH3CbsHi&w(@aL0j_Dbh{^}7m{6* zH@xoEc~^|G_%VX9s(q=MmZcQ4JIn!%a^9%l+;tq0IQ9DuHRs$A3TC;=UHaWQR8Rcs z$+<4u)^DF0Rh6|7QyS{;hQ1Kl0ay%6i9IqaRFf`DUFGcuS)dvoWHYj1oRyKrFM65m zT}OiL*SL2)s}Szk!)B^hB7CbTHL6O{O!)C%y`+E@!PmgIZk-oUT_lE> zi$$>tF+C7%Ajo4YQMtR+Kmm0G=qu@Hnu{WJ20UnLaC=Oy5R`*i)#Zec=E zCN?bm%WUX52Vg={vurL1fcw7I_l(GKHJHm$%Kn+-{k zN|VFKt)n6X219zJ`_w~O=DcS8Gew&Ik?6}-;E7*UJ8=b(Y}JIpX$!{XT0KIPej{R)cT*~e3<+am(21PN1V;yfw z|J04oP=pv+8GJl?hns|eolW_-6!0TRuNAQG_NVj>K9(5RF$?i6%&O^qgC%NeOgNeV zH(SqKcw8Hq_1jU6;)Ue z`#Ym_UVM2G8`1jeOPG5-225LJb{|@9;_Shi=cjMfU)MR%goSky=#i23v1*#B{#pbR zF`;6<=I#G8p`yIN)6?|YH#DX<0}kTI`pECeqy!}0MQW-9gqR>0*%c4JYBb7IpwOxM z{U$k2n9!KUJ6910+iGk+QJa3%y1Y0=J!~?^PWK%?^4H)P0S1RIjJpK+v2*h->>MR_ z+qH1RMwr%F?ssp`{5dIeNf(lI3Wt6xn=$IZpCT#(Ji4=6Z#q{!tzS^%l(!9p$ z`ZchKAo8vyNi=AD)L8<#+$j+_dFy~O29#9#bo+aI?J4~yVXxE6%oiDQ@dcbx(LfTql@H=aMkqb8EV&?!Z?8%uFQL@MW#et^lCVxIV-c5E4wJEk{Pt zLGre!`KR-wqdot)L0^MY7bFW?$*-ChYw>EDTp%y~CprSxLv?GnzM)yY5|ZzOh}=*# z|Cyzc1@OmTH1PsLR1jNfvjR^+jyN@3j6WF&1X(0@+1`Mdeywyn?;uVupgeV~hhUh5 z4gol|7UHyaG@Q}i+Z7yBqVNa_EPmQ+0f7PbT1U(;yHSB_w?S~mfT$&$ zBSBZs7_c%4S4xFkmQ+oqdF^7j^;9?( zP`l8^vCn2fv_5Ms+e`e_e?mWZ?0Oc^ncwjI^UJZz2L4wTc90kLAqhNa>aq;An&c|eb%U`sl>w?fPiMy z^uz>jtzN*r`<`U>kmvc7qId@ru$nMX$Tsz87^H-Iy-yciMkB63ZH4tP=N&C-a*P{j zN;gXnB^2>jDc()JygWnjw=6J@em{2rNb&{8i1-*Zi^`*uSwlc-T7MH@H*Py`I?`%( zw2`Yt1fGmBNNFrLo15rS&J5PSw&Q*v{$)ElE1mad`hZm>mCrS^?iL%Oi!BrlxfN5y83KRf3(6f}LG9&}Y4{mj@B!~&eIpAYB*fgP_?(EE~LAiyX!XTnlsOA!gS?19&Mhg#=+SSB=$ z!j=ELobe24wo&n^P4W03w%VH5S?u29vhh{p=YxN<0KB!=j#VYxk(u$kiPlObB6My% zF%AJm(qU9yD2Sd2n{Bo+i;ZJ=;=N>rQ`uM+Gm{{|rZ~EdJkbjnmvTZPE*f08i9`wI zyxayC9)j@){O;U-|9(W3)x_3AdrVju-gp4yp~&s5*Qv1X-arjkACPX%CgsRjBW51& zwh^y6S;JjZtrkP5L#_1lIo8^Q8bSB@{9s$Vl2(LX{rK|_!mnwID;kL)5&dXQ+IpmJxfF1h_$7y>CACp+8(MZBvBz?^wB8k@3Mpi(_^7v1h=I(rl=YDE z%EI{Liqu_9kHBm|30E{AKxd97`iM7UL=o1x&ATlCV5RAIQomHH) zE3sD2WLSQpdO&ED1Vy=3fuV|X?^71zPb>N}!=xfS=73}7cfQklca}7js`8)};qUF~ zs)98)y)a-O)N}Otmp|C~#LB+xUGT?EJI?h&y;Bt8;-$Uf)9rjA30lIyHSSmiAN{Lq zL#6Gl+@4Tx`QqM{KuE82#^*}aAV3em`CUx0^!!N=Q7Hf20u=+00ud8nPcm_KEYUYb zfZ++X%;_;9ym*J2M3O$sG2<1)CZcCrVvDzQe0SS>J+JCB(P+p&hGbAFF%9Pj<&^u_ zuL4FKyimSx11DkVpZ|C>S0pA@gazOuN;bt+78J4;d*t%FL7s#yPE=n&xUs_~?=) zdy-bRx)!&~I6GFEli{kQ;G^wf{z|&uSBCS(@QgeD(Hii0=;jw<^j~D*FoYDP#$6XbXc@o)HnLS z)J`oz#v>4>%N$hzf6q5Fj-?4=RI*`sjM@W;NNt$XTn$LE>ME3kzfPySM{-~q{NpL{ z7IJB5f94fQ@}e8}A%~xV0^~!~s7U_l6E^C4XXiWXqm zR9|)m(|hUMOB)r*HF@B_;4jJrl#(z61^;;k)R%h%{2fjZY5QVUb})%vsUrxajv|C!JwY$yw|m1|k%>$PoKGczR%h=$^b`m z&GitHD+>L$!+CD<#_zWz|6!cIx`24zE?C@u%BWTe>BR*)eQeY5zwZN3cl#bl0(wvj z7!bY;cxc+SG9|h+0As~Ge?T|~6b^Uo`YwpR3Cy3rgpOx&!)D|q(0@StG(h-(RC6vX z$XWa!ME*xe^!8!^E&$X)1HSQZLJMe)zE40O_xZ#W^jjH=JuHr>g9%Y*RSRPmD7>%2 zZ}48_f)X69 zSVMqJf`+FDzkUr|`M*={Z{FILeNtq*xQjS{yZ6Q}}d&uJrtb?tB zgd$&+Gv57M8UO+Cz+yPy>AWI7aE3QXt_=-=$CJH^w)lLv4g@%(EBndaFWZS4mpmv>ddjT zoFDs2^MYmFDU1eMFt?M%c64S1`kS{o`%2`tAzJpW!67n0`J%r<0RZpRhp(|!fXaaP zgaOc)xQJ`0;4BTBgdpd-Zmp+p=3wo=C3?Rb)xB$~nu!`rgqz0a1MBw02bEJ`w?AbM zRk!NmAlm3y2i@0+}~oj;lJx{Qj;{+6Fw_4M7iJo(hCpv(*u z>HlXoML_ajJ&;(Ip@Kzx)Wu5vu|?7Ad#~$2i(H-+s;At!wJPm5^YD6~c8eW$CxN+C zGq`(dJztL#P0CRLHZmvVPMUFW6zW! zLmXG1&Ey)@OkXL(G09oonwNfKU>&|2r06NlZ}kJ2G<*I(!3j0YmU7+CkVC5IUN*~0 z)td(lcuEX7W;2~!Had{BvW#UkvnO0LLNZwr_f2KSn$x|ynvVdCnxQIEpckxaQkSVoQs1PDi6#{lyrg9UEbGe?P!WmR z6RS8agB-~^2*w%-3wk!HylXr}PuMf6jBrgnHr0d&)V%3EAETwi?h_AswrPj>MXpSN z4Q*DVr>`>AmC?5vN>ls2XBJ@RKzXG6YQ-xLpGh;Of9dE$3$TV?W@Sel;Z?G$ah?~X zS}+|RPD@{tI~Qfo`9X`pv~1?(8ZE6v_3reE)GLDU8LJ*PmRVIz4V?rMD>0g%bkpLh z)j}=Tcz<&7I?EP!wd$t%Sx5KYk_bMU>hn zOBbZszp;otW#&-FaJj@Gsto4Vq_R3c^k3K(<=qKDmjKPOMWy%h--e2J*$gn}GQ44Z z+b2XqoA=Mv;TAy+irpB zPuGtg+{#5$HBDvpE<2+`$Pcef0~>gu#re5MzfN+(DB`A*vjgkGo{-w2o?U?B_?47I zpq)eu-YcKjL6@olwnH;Hl9P&bob*g3KjRD+@oEv;`dUVP_w<649LTiHd`1paws-f` zU!LhMr8A*|ncvUW_8let5#S?DvV}ma>i8Q55|3G&tY7#2qgL4qKysTPC1-FCmekv! z^~vq>tJc-J)AE-pKh4TGs;fsf{HE7@jy7E$YATR8f4F0b6e;vrtly__(pnDY03L>? zsE&G!qCihMZdN7+!YYQVi0DOLmkO%mNSt&7Wz6{Rq=(jz^WgG!vxzw++LWueJ2S@v z;gx2N{hZ9M&TjPUiw;jK0K!8gUdr=@Y4tkS%Vcko%+l_aX5l%Dm2tpG{Zb7}74a(F z<`p;{!XF z*+o~=9|xCG_MD}*qn{h#f~hO%9xgqj{uzx^)zf~XdVB+XY5)I8u_VV6F&+B};ebpB z`dra;%}QE1669#y}*1D`gw`Pu01TKTp-ATdq9Yp@MGjqd$kK3X{ZEpsQ_AfN!w z4x^mV80}z+P0MXfcVtMweA<-_d*_|8WPG@;shA7NPoCvr&ReX3DHf}Du8L{Lpv zm%WmRE{^^uZy&eZ6wpCJTfmt0JFht{T@UxO(}^D7DVW|FhYLM^ZC?&4kHS#rBW3={vY9(o{zE+3vveMjpmra3j9Cg`JR!IY#_O3e7G zxT5(3K*z)#wL%$MJZ{`CTb-$)z~k#aYh17=(p$E-FKg6WKQq)}9Tgfx5fME#`{ZgtkcvAgHA@zD6EefZ}I~OB%&8 zH1c~FV|;OcnVeWMDf3_)j%GdKZjA5)q3KD8XSG1RwT z7Yq%W?YO)fT1XbIipmPPyNaJS?Xp!mJMM=J9oNoI)Y4Gqxu)xi>FHpjEXRp|s- z(;MMmn#MqNw^fX%ZxQ>WV{`jyQnGab){?h$k@XiUmHo@E>tPA&O&JVJh`zo17jB6% z&hs6qMI3Rn{H&PNzQiI`(W!d8QuQGoY9tzNxYK8Nzdu;?{18I{ z)da$mJog#%=*qA><#03#2VL_$XQmPd5B+-RuiCUz8J3QWa=07vyXIBY^>x*D85o>3 zUQ0DJ4CZ5N^XS$MVW{M`r}~RWb*U}%9rgTA%<(g2frDbV6y#@lW^pRDexX#~6i53hbBrkkH*IAX@Me~sN z#k=Kt$zstd$kNZ{ROR-95>avwzv4PSrhQ#hyMpoc;lA81O~>UNf+(k<^#@Kp{cwP4 zOZvFZdj&Xv$YfIrC1zCC!S~{l4h1n7>7=t;M^;^GVm5Y&Ip4b%a_OOgfB!bh5jB4_ zT^A_KZa|7tn?3mh!9rO@wA+$ZW*MI3v7>*cH}I5q#U<)J@)H5gXreBE{n$f4_J<|* zdn&A|83(x>gO8s@U8$gs5a{6LEB_okFFV3n%pdKHd8nQ=QD}YHGk3bUUVS&oeM2)~ z^^w=wt!^7xd(vXCb~jaUU9+O$#^0?-eB5xZCIbwxiY9O4*YJwEjHlX^?SbEP^o6cE zv=v|IdoSTemq~$=t#_1Oe6;+dA)d4PX)qL=yOi*xWGX@DfLHt0)`sNq6Mn-4Cprla{Qj=?xjD@QQK zizTw+ua!rCA_OscyszrhNtXrN{lfd@otujqGi*~-8inuHr#%$kP?Ts&OecMwo(OoX z=p!DR!H!jCO)O({3nBR=sYdip_7Ft$;rSIl$klxO7?J;la$vY3Y(gSpJO9{$668XK5^ zPbg&;v$*hL&?)G6`J5CBq@OdSL6}TZe;c##PMh;&jWo%FylS?4xs;wJu1&y|%#uFRSw{IiXN_xJ)v&KDbi84Om`o$4RK7lrlD;tNW z%t+6G-I+&tf2Vuc=E`MVT;qR+53zlG)l z45&5E!jH&Iu>w4L2Lku1K>@JHjV6l~JsQko=q~CDh?8{s_U)VKpVA5z*#6lk{JpEj zs%VB8PHPb>?-I}W4#u+eUMC$AfG6q|(~4MoR6lM{zp{NtzV@D}jH8kyk0}$|7%~~B zeC;8i+4u7G@)_Qtoc&ZOY~hmwv1Kx~Wp^lYt?8znjYvbI$$s6CdA@#(7FIA_zuAGY zd^k~^Gd2{jaUIZ}nMit*(Qe7W>uCac1}<+&;qy39*%`06SewvX!B={UnTI6i-_Hi8 zPCN7}lymE+c8a`GGWt>UZRU^s3(1Fw2lG`t&h+s-wrKS0AI$l%&`z7sRHOq@f$bmM z5PJ5Ibfa?adSdRjMb?Y$A|T|tHLLP0Y4&c)=}1#>eT!A|=5X+|hPS#nOs7cl$HcFC zR;#_gLP7$wg7D!l&VlX_AZ?b@lV(W}*uc-y5d!562lvRu0^^~ttDe~Jln zUyDUYRA2E1Pg?$&W@qH25H_Th||ZqnhO*0`Vo(gIn~?~zTt!V1a25=_7GpHJX%u|miEM_ z>*iEb+;`1Xn7~+L5_sAp5hK~Z%`~rfk3|V~%{GSo;9rZsp;;w_e!&xS6+yj?(fB=L zLuZasg6s$q#2hJ2sRc4eyf3V-GKqEvKQWOmWa&ussBS!XdXOc(4USsj+tY+X}I zjPA&U-^S&+c@pPgV)0@e;XnfE^I8|xK!E#fol=IM3+lIgUl+VMx zKi6eiWn-SmN0FCQE*nzMA&QG{_nt%W;=)V;H&MwDFNk{tFbtn=bYQb-&7b1Ekt`8=z4(?V=oTh+>3)bg#us44yEv)r5Es?TE+ zzmMz{1rwu~#=F1X-A*5{nK?}a1mgq7^Y<`y%Hj0E5O{+j?XU=>zX+EXiH0!4V_eRj znYeT?W<-Ns~9G(e5nYXe;?|3uH7Im+}Ky=r)@OIxFaSaIu%@=jRmDkm%vwt~zYc>R*jD1_JrcOeNa$g-Le#yd%Grs4bugwu zogF>MrQ%}L&##l`MX)Ju2R^*?ph0c|!vjg>LlF{H()gghb7a5JbVn`J8daJ3(BC<8 zu@>&oYYdjOsGorq)P+}f9L2uII>8B`p0E~nap~+(W?u9k$L75wQ@W`rXMg+{Y5+d^ZG72 zX{a7_^;wZ@DB<>(lvB%?kem{(7>sgCbQSFhvdVtClFtePsZ^y0&#NcmpdA&?0W(2U zkaGG~r$XV*PffR%e;`$UONI*VnZI-QA*HZi`=Veyj~TpgG4tLeDRarAn1V?I?>BpM zC7y7<48#7T)Ps%-kaE~H5fUE*`P|QCX}v1;END5LOri5Y?wQ(qsnM^GA#jhd6389j z=8=8=#JGv#rBn{@m`C)dkmo<>caX16FL(*xU{Oab7-i6#>dl9g^n8We_(V_n@l0uX zISok9K0_VAE#olj|LaZI+_k*=8Ln;Ix;`m{ACa04?`q`Ss7QPo3v9F-PQ>~@ z#fowT#(jQ6P^yXxc_Vw-nH0UBr@+S1EEoUj1iozc08|BDkW4l!5IQ2N+SjCxvw+zc zMreIM@hg3!z5V7H7D0MPnZT69AZ6t_IHMtsn?y#(iLJI1Dyz#f(!n5@8ez6eoT4kA z2?v&h_i?0{%zfqjQ`9|94>wZBAmtH^&Z+cmk=5o8BtdR%ad@dP*(Ptb&LO4lV z$u=^`vw-A8p%ys4iix27Fa9{`Z}s(0T2-0AoWw= z!aF~Of@fsQXpCcsheu9Kha6&0a?@>>684)JXqSobSiT8PU*y;~Pizgio6=XyI6z7R+~?O}BEN|V&TrzO1n8m1W=CwfFnZ|OMSS>N^L6{wu~~Ql=zv?M3?`NK z?eQ5p0(Ls#E)^&+4$V{N^w5+F(6PwQq-hL!odG#P8$#;6vU&^jY4UkWUc+INI-%sh zS%CBWkk;anu&$p zU5ar>%pW)Ew+`PssNUw$nRYn5um54mQ0e|UyNIZMbNOjSR5*En^H+>}WqVHQWfVC_ zD!!W9j$+L>rZeA0j0|US9&IBY=~SW-d@x;yUmf#D5QYmpoNnfMmhmL7f$(0-rwgaC z3+pKm{l|y(oej)%q&+-aT2oxK2*3>sj!sDXu&@{^~^(Af8tuHKe@- zd+QPU6Pfb5T|COVFSV>Jue(Vh{{h+2++YZNt6JANm#(=gWMTHjprN1}a_=T8FdG-w z4j%;U5Xyf;aDPwn3UaQ@*9a859G@r^N$ygljDlvOW1KRvrQ(GF9M$Q{-?}iOMsiHp<~~GztidZs)v1 zwZkj?P77A(xd>Rs7Jj@`<1p3?#}8>x{G4#2^rO{N=P(V~!ULI5_{a&yL}+2r<{x7# zs^eYvjd|VplFF(R`N6=#lC`p@q`L{!6JPhz@r^C7qlJgb(LL7Ye>OhezhwGRzrrR^ zX%|+(F233v^&nDAj)xF)nh_n;SCFDQHnezmJar~=<7##3;i2wc;Ay_)o4s zaI2&(AZkA#6z_UhLE`A!duN02WRF-c_6+E*|3;PODP$O~q&6rrYn~m}51=Z~e1~d6#7rQ8ii$yAIbM zL8LZFrN$*BxXC(T&Cd@#b(X&j_L}eldE|onYyvq@G4oq^X_f@}Ojj zfq^PvVtX_yZhLyvxqtV?RQY$RkCqpIBeOpBhPYqZ)j6Y|xa=cV6Mr2%O#MECMQn1K zjpj~3`i?FhSSII4L9_M?;_IY0(5nHjTI9zBvP!Iy=N?vM2H*s;KeR6$;_|)Q$8BZ} z7iPTM<65Ad@q7;j2hV{uG-mSYz>KIp`rsX~fpqA7`$L*1y3EueXf6{zGQR;BYejPe z6RNwmzV=5RT{SCs?>AdU$V4p}a&26==J=snE=%F?B`r!OilEZxSGIi*jKFPJc?lc@ z{&4Yj(^tZutXf=^h-6aBOmZZ_DG4bTz_1VhA%?cUmd^WeJc=x%y^M-wV#~3s;^VOF zm)ZJGoKw2&Btf?k@qEa{NQ;m>buW?Jx`@kk`zIry`Ie~F>F@Qu%Z_?<{yd1z&ZB!; z#m+s1OqnLBm55)Q6KW=2XmPW>@K~JaopV-|{(mSt3#cf&?coE0NJ*=7x1e-4!cc>> z(%p>=Qc5G;ATe}`lyo;pOE-!%4v2KhcksRMz4!fpvDUYSwU`An&pFT8`<%1S-oL${ zIWYBA?bmy>y)3=oJGR(j`DmB$^web*ioxzuJ};|I64vv>px7%Ap|Fp4+9}$}`JUQ4 z?`wjMWa+Az-<6}iYM4o#{{e;Ht+-Z3zDx1w$J*rcIW3|`PM*IBws!;Zmt7I$X|Fd9 z9f39U<+xYd@NIw&>9Ryo`3=qHJk+fKIX~~~2uT6cW#x_EXj{KP*7}!~YAT|XBeV2# zdOo##u)S6k8PNpw%x@>sJGMF@2Ct<^Bj(d#&b3Wb6qG3stk)5h2O`U zZ!h(fil_J6I%haD7lXy-y_gLWvyJ*YnY|FPV*k3sO zLYsy3Ms*0vb=*$*u?58(womAb=V$Fgg-s33Umo)%RaJ7|)qbG#DRNPtuJYu|-WnsS zFt6w8g1h*{lGy@Ao6l*LtYdd%CX+-ALFl~Mz!UbzBm7nguLv_Y%ieQ@PE8}E1H5W;Ere+)0kJO&|?WfTz$T5@gGVE_@_b2~8LL$p!Pg zBZhXNH>df8S8f{|D7G*QvwuDAY#WX8iTXZBJ_U{z*L$s9ZRhMzk2C(Z-5pB2+wFME zdt~{yv8VEV3TTtpjhrW!-j@-yK%-3q7Kx*ajTxpwjg7~;*5DpY#uaF<>C$(VUz?$5 zrtC}6n17P@mCI%b{Yxx`1(_gCf7`{Dti@j6!5+wBV)Dq<)2y>HzAxa}I}@j}RRscC zdzkX!9GU(SZtta+mxG=VyfiLP`?z!u%Tn;o&>4!|XS2R<>4KHq`vY@Hbr_o}Xn8vJ zT9Po;XO+1FS})8dStsNzP!~J!lHx(`+6vS0xh)DVSZ%sI@P~ubo~$D|DWzA7 z5^_Ttk5*ra#Efrb!=qpqhDh6jmqvoo04x{oYMB`58fEyw@bLiqKEt$jc zX6FZZl;+XdX(4^-j1b->*qjZ0t{>)kM^W6EcqYw<6s&HvII3g_f$zC9O*k&^9X(cE zSmt|ah8vVs@-hOLq&ec92u7CSG85bz^z+_Ogu*ySuF1KJ@D)H;XHt(#PGK@ZGf?zZ{ z8{cLl*Gvv>Ibl2ROa|7TQiW3?xtx@dFu|;#qxwElqC#5W;6$5r+2delqqyCu54r5z zn={%GR9LP4s1hiliR~Pwo6#+k2(2r@R|3OY&;8rJOK2)nqK&K(h zKPqb*9=T?+$%%Ko!zBDl07pN+uYyj#^40GiE)IP7Oq}`fYIAa|CQ2J-_el5etr#*0 z5`ByW1`;gkO212%a4W;qvN{YSnh6p*uq?EHbv$pUVr}ud1Dp4XVMI*)7iJ5e>}X2h zCI*W;6lHSU$&GQ7oLdvw?SrLTET<~r(D&Dv?IWnE&z;TCW=Z67gLFaP<8J$&`TJ^j z$xAeY;pf3lNpayJ#Pm_b%K+)<2M=aM6qn2PkY5Qf(YAx%jauh}q4Cj!8Dh{Ici0hX=TrJeZz6J6WCn9?R1x@#&RB!TT)nZP*p1A`sU5E!AQAq ztKd?1w;Tg1$-JiLoXr00$WnQe52mK-M`vBDBYG?fCxbxJ56PV#3&G1?{cvQ2Qauf^ zday6NX?il7ItED>r6~f=$%0N3dgJmvZ?sL2Q;?nBnV6UqOUm`*ZEa7WRWuLH?4W z+D{q4LDeY2Pj{f#r2hcTXmdH$1hl>QEn6T4Ngt)yAFjyuCiCrKQ~Wlz&(y5<^5)m( zX;>P5CaWQ`@OCMFC$*nO0+JCE6|5kfUY9b<|IM)#UHTCp{sgr4h^&q(X`_14r`f-k zZ+oagfO}jg4IU#(Q)ejunWo}bv_{4{bNFIEpOZy<%J_HhXKT(xO;0%6M_Ot|k%Zmb zhNVNPksteMbU>?_U%j$pRX4poHBf?Qkpl0BqeH{H`&0ulEGJsgJ^DgMOb%gqNEmrV zU^MF5M_$F|H4g~#USD0Sy!E-6Fa+xmcNA1o+&j*c={t$0fxVC7kM*caeqkYwY938t z7jrM6S4lZO77srtze~WBj$$cfF3h55nz7)rEM6PeXLcW?MG{`+dr#m(XSA85Ohn*| z3WMH`P9daUag=naC!*7~6{j~P6Jt!VDG9@9bEL-pGYNf#FwhrZpa3M;S4{$?{|R#Y zh(33P02T^D>9-gP?_wVTgcu?6N?`ZY@Xh)M;X|jjU*SQC`NTKzg@?&y%hWw;(4IKf zSYP;My=zA<1s<4CD6qXQ(>`3t&!y`=R0P0Ruq#|o7eo^75wsIPXuuzoYoznFd)rh z%(4&(-ggoAvy{8-JB_P?QLQih3!x;67xRC8-gq@6M-l}i7Kr}#1(CQNc=ylg1n=36 zETs&*VlW`oVxYH}lN!Pa*cG6(4VJqfYMdPCgfCnwmd-Hlirju18kslqj6h{bOX1tvv>ih;-mJw&tlK%sDVwjm^vD(o%> zz09BP_`<1?v;XU6F+6r98L9ow=wp}>B5@}#B_&nW)x+DPaQkDxC01?goE}1`JwV_8 zj8$CWl$7#`0=SZw?F|@7&A|{CFfuO}LVXXnCkhS9>sB{PTc(&;w1JYol8%x1p!g4& zc-a<#D#I6K4|g)h31&yEm?#8V{KVTwUQDqVSt__w6^THQreOtsB>^wfHwol5ZR zBxT$Sh1a^E$edrGBDEO8><*KWrFR%UaGNQUa)F!uglbexC@UNk^=j8;BJg|MbMU=i zFBL-@u`0MRgwZs%zd@+A5D|CN!Jms|+D8H=X1>XvmVo<11}{kzDWD1@nKcPTO-RD0 zKhhp$urbh61BT6yu!37G@!o6-!4fJf2En&K3Q+ib?VGi%)3z@da&9qO7FBm-7-dY< z-RP8b0z7}Xl<(hPO20<2K_kHXr%Zb-*%@{?+Mz2y`5+hskb2a!N_7DzaFQw{Ko%xk z&ZCizY3KMeX6no?i2v)|kivQ~|9|eLy?5m7-yQpZ-wj4LG;&#hN8|*U4&Y4p{de>7 zYjGZtf-y2&$U<-*Dux{kvJlJxT>x2lRXr4?l91?I5<3Z4BmStxtwR2#U=gD_3X}R$ z73#VCtv;u&i`D)0zjm84{X|Z8jYp%IPQxzrB?d=F zqo~A3u|vxL1yGv?URYe%=1OKsr7YodJDwJRb_lAUrHY(nOwR%bq zmnO<`6>5}45#R1xksU`XtA*N*%RlY0=w-^5kL$#43T9@0A|Z(UI;t%RAP9QhN4rE~ zBcW=TB)f}mF`v@xBvTWYW&1wRH*9pcgIMIIh>J1gp5vl{xVBbhkH554vs zc_|DGPDPng($Qy&ohK4co*^4k}pib+6Cq3ItQ-{z$qoA%l8{Tz76iOUFk za~@Jo*b})hBzF%++uR+HE`W!AyUG1p>Y01}Jqi^Oq5F!(nT}?h)b7MiH-ptQdD3x_ zVZ4&?czyTdKBC^kHVtznYl*|me)G4wFUEEc4??d#u1b-DorX6=Db5fD)tcp1oxsxZ zgY{`;tO{3K1kc@#>EA0FG@ zS*RlFr%ul+?LzK`>iS*hTPnZv*gSLuCaZ1%(fbH)s&?q3T_sRH(Y@zhWz9RaHja2Z z+jxdOwJrW$eOfYMRq;q%F=S!E8gdnSBc>LTKB5BS%`3D)4!7#}Hupl+wSj6`i`axa z%fBND*^lc;&%Bl=Lx(Z;Z%K0TI7m%@iDn#OcO%{tgnbBSLz#VP7fL9+3d>~ba-?a# zkB%oCq@L5BfD+HiLwvz1W4K#dm5JAHu2ZFzE5h(mosc#~$&~NWD=zEFmnu?Vky-=w z=TTYkiz5osz2jBc9%$*x-rwh?A$UiIvdSU4N04jGw3AWU3HF)7q}5O*3=rv82wMJ_ zWZAtWR#&h3VeEax0d`X7(DPy(#;CLQYHv~)wC)iLf*yiV{B#Su5gVqZ$9--(y_;p! z&|TjXot9d6yN`Z4Qa#{ZU+aXb(T-Ga9i^BxPg^d+lx()C+o6>4kZ<|dVer6DSu1;I z6Ztqtz9oa%{ADCA^7=ipe_9&!;O>Y*@Zl70j7kGPmJ8JnjY85WHxTZQpvX@ei z&KwF?sN?G*n((CGt&C>01u64pn(z4YCkU-s@8QQ-t@|7 z+0O~uDu1|9=)nJAfL41iaH9N}bHf2|pa2~r*-{@*#r3Rn+j8C&BvMm0>m6lZ`KVvp z=L>y!0{OHwgT5)+@%rY<%rHPXo^k-W#taM{d~Ew5?Jc>_o~|^elf6fCd8x+3#CVKn zFX})rFX^G^s?YBI`1CQkPE9nlCOJlaNd*QTVo!wvO|nm~7)^uU3$_lIt8TYFmJCyo z=T0Qe?KM)f!#GFzKp{g)7Wc%vI-WY8L}^rlm&`JOp1N#)^Y8 zTukvsV2K0E-VoD&C?-`wL4Q~va$@O)PC{-L&KO?ai`3N*Zgm3s#Pg7ncb}gw=uM)8 zeM(pIC&FTh-OLU&V%j;D`bJn0uP%Kc!^i}?%P*4VA#%mF^$P1p(s5)1WpaAKm)Gf5 zfuB4cIe#1UdWFE=5Wln=BAnJKdRMclf6_T<$~N@6e00KqfYU8J7|ty!I;wpKZN(Ez zW7~{=HgnJ5GU!A3JP*qTx62(VM|Clu49MA-M8{sDEKXVFN8W*iR1|GD(R_XQ9_bxr zHq5c27w8#k=9`I`W!cu&mhh(fr@GKVyb5(@C)z2-?uZ3*1h!X%h0v#|XE>*fmPuc! zcPqZ9>^2#cgkH5cUs6NdpgwY&v)^4H*&o@TU@td(H&Q0Yd03gK&T8=_87YJ+c7{*6 z;fT*aqxLwGcWp&?n?2jw@=C7>?_Se8DY0xPrFKnu2+=2{TvsU;)Ckh2o-xfLN(38h;MS4KuaIZDqm zhnt%{OIN$yx3TF~A@h|cULKA&`@lNZ{F!$CP_b_BRsR~RELXw`@H}yg9K5zRzdl)V zNdNXj9A5vr_;_w;Q1j=Hx$~YM{0=_uaW65;RD@U>zE1skdC+?FajA8I{lTEK7&FeQ zcw?AjUnnjG)Ku>GdUt<#vQA;f@RRaZ(#+R7&mpDsmQ1;pom3BU%3)N(7|LBnpZ8ws z8j!ygc-^+Sveir_TI_DW;qoTXF#QW3&dL#+VzeCPs}p6V)}s(2|MGHZc$!|8z3Wdi zGIz0#uygM!l|ss>VG*yzq~WQ;EjQnND8x6$a(#Z#o}rA@rur}7-m%tA4d{DF{dg6fAYHAJB|{^5uBVZSSaPu1u@$qEi%O?mLZoH zjZ`B;kI}8?n)p0)sEqaTQn~NY=(p^6NQ&zGoPG3$=j-^A3-2D+*_i(`U;ibyGi+s; z+Xiuc`d*UGjJ4de$d()#!ue9=dRgU%@-mI%n5boLdvW6j&7Gh8xwJK@3+7|#vRinh z*E^G>PWRSA1SVs5FDNTe?PG z6-DakS{57+WiDFww~))#St%pPzVSxVZUMPtQQR*lo610Csighn^e3lR!6Jmpw-6%!Ta;f?&+QB2R?3 zJ}8wPJoX?Fd|cl8y%|oVD6075sJmo&CN6^Nxz^EZ@&d!08FXz7IaUqQQME4z?RBOY z-^@7C0=G)^d!has35$lZxMwaOOPRSLD1qJ2=Nfz=E*|Z0{GEB!;#aTGCcJtV?6V_( z-ixiR-<>o0GWS(oX+fXyBY}1BJnSI*WA!#w$q>E{r%qbP89WJTR0BV@I8M!z!?G3{ zr0LK&^j`l>uzx=$nS=H=Z9j{fs)tW_RV#-giA|t_E=kbGV=c{YRH+Ptb1FV9giMPt zsW-6J^R9ujP|*dUm$t_`hF0i7NRV6Nh{n=e({UGH%Xju7$C`U`r?z_}KlEf#VgYFE z&{)uJ(G(L!!z@~^E%^(~p-%lwQOo<>^c2D^KgtXC8upRyW>*_h>Pl<+jA;g366G)a zWLM=|yGXMXjeOt%j@Q$~wNOu#Mo;_3VFG{Mk42Il2PLuarZDW8_IsAns!@{U7uHUp zoxH3xoEyTrK=B4Xd5hG_$C#+;YiOx>V7T(~lv5$h*z}SyI9GFw3k#OL6h3r_Tjrn~ zm62`jmv3Y$pPXRd7cr1nx=Da}+mvoYon6KaaF zwlZ_UbgI7QszdRIGImxNQGy^_Ozx7trDn+Ew9>^*&W7ZB|8H(nRfGRM-b;HzVeJ;j zyCIbF^as^nDKGcTE&wG0yt`N7iC=wwGwf7BwF7|n=$Dyn*>fu4-&R~{{Z2Kj6J~a!o){P=jS9>M7P`BBEY!Ql2^LxHOmYOcISOa4Nw+BoU z-q`2yb*C5Y;sd61UsGb+J|csA^=_yp?e*e_{d!gFtX6mBJ-p<5eoF}wJoo;CgeG(D zNJC1WO-{~nH_SW5(|yLyAKnGHYr>{Hgj13gCyKGKDPP2}?>!Acsf;WOqWl*yI+yIu zP!U8$r%s>DdZ9lr=I!Oys_zfhu$Zk4!Cpw!;uP{pvqw?^bq(jo>{=%De_a2Yd}Up> zoK25IQlaFs=$FdRixRKIS5HBZPF_E?4X(&d&7xoGK(2$ew&69OhqaRbi(q`$R(&_= zvpfvd+Kx2$?z83}86_UsM>JjISeUSxKEVKGX5Y7ydC^jI(%Y(SE{{nQQ-2lqf0{iY z$`r<}J??c@iN`bI4^URh7sT<#$J;R!ky@Q21uQlvQ7;7|B|zs%)Fdb>VH= z!f)M~qj;VY60C>li|ZfiR;O<~6K@R5557j}F0GRn@#tZObsgMdafhM!b6}B&5s~>#4 z+Oe?o;dWyI4{=KxD(3wv;!xq_8dkO%ow~BfIO|dKA{r zRxl-uP8slUP%!jKcw1^&O(2At(bPRVIkE$d1L5h>?3`<=dGjxf62h_9Cl{Ae34-T{ zp0<4#`D89U8`{W60nTaXQxumrE~cBWTUhPP(Na@NnCgc|pPPS%ZBANrXbrd3PVlP{ zrg}rop{b+dlCuroaEqnl{|WhE(oQW}pX$S3>vppIOpuq)aC!Orn)cdsDFZb> zSs*EAd3iG!(yBido10;NQaajpUets4@$Kh|qYH_SV82Y79g1sGE*vEampqvZNroVxHLG7Hlvh3iT<`6KBWy4)Qpn5r?7nkex3C}9?A!o{dntPY3dDr zZ(DB}e@yiLJ=~ycj;#pY@T>^DvQ(eJo_#C(U*Pw1`hlwb6IL~xI}T-2XsYRIGFJv1 zlK0zy3wUO`O0&lz*x6g*XV%A*3m2SW!$(stVf`)il|<7tX`$;&$(zZvR(Zyj5v?WE zFqg)TE%q3uW@QAAROS}M5r>Xoca}A2 z>5x+Ct#4ePq3?!HBxe2MB;XQzJ+IOT>CDV{sz)hzvD>ey4@oq>)d-pOE<@e=Ml6DN z1tL8!YrrU$C>|uF2%X63K9>_5Q}`I6P5)1xmh&S;X*W9+>~c2rLco8tpdg98NrWCe zqoKHRg1>z+CFx^hTi9o(yt_}zu&Q2)b6-E0C5g=lhKJAC;n&+X0R(F>6ux{Mxu+8a zHEt9MUslewj4Yx9=nd8Gjgl^n!f0_(9YQ^Z+K=GgilM&Nni8#sj5jIox7Dm#Ol_-3 z9oLK=t?he{gI=rUDloehj*}b}GqWU6G2;3?gCpVh&Uj0-`Yq*U0Ei-_y z1vuw-P8GnnC%f0SwN$$4PulQumC8=Lsb1Fc69vhV9b&sL9S5-q;?DgtduvkZ*~@B#Qx}fC5n< zO18W2_$K`Ob}Zu2g{J5G442<%HS~8?D0}<=0+$2~jHodxt3GnqyFGWee~t1;#r3<2 zidp?79*pCZ=+MM6=U}CnRd1dGLq89^xtlU>cZX=q09@qfMPa&V$PoF)UkX?;%`O=Ct7&3>gJkw)o{gyX+>WEIvAM0#I%qC)AR{2Gqw))LQ*u^a{Rj~BNx z?OX~os>38pQc|^>tD=^aqQ~om?y2^@;ANE@SPQ;dRMTd#cO@Lae0GVA4C9)NZ!eb` z5;&n>_&LsE7z;KDKzI_L7&U&%)zn$W}4y3&i%Rd2<90?clOdSbt1RTY3lX_PlTeQ${2e&oJ^SNV6(x=iZNYJ z+$tu9VWjwZW3rL*jaAlcb2)RIz{KJDq(6D2--M>}q`OVnjW2nszkTFA7w$Hl1OKBI z>WqE9%0qs+C@vvJ(tf?;*4|%tD^w%uCDjY z8P39%wPR`rUzAY(J+~=W-{#LrVa9;9Uc<&c0Cd!=8t*ySV zj<33(TdKUR9^DOYHmXBGthr1(7Hbl`r#9Pg223nzA~kVp&V>$7f7x#(507VWB%QTj zQChiL>u9y;=!giF31F?x&W2jdraE2?1AIM}Ho|o>stc2w7u9psv54WiQ2b}IJD<;* z2vv*L#h~!Q+lv67#IcRe*@o#pvFCx*=4FzB@K#+0i%=l+%4jHhZ&HELoZf>2%pX+cwa08JnMpp&JGIB`n@sS@rTr2$Tk z*8t-KMj|+}%W%G&J1^RXioDtQ09=@C<7AJSpm@v#UwisPz($=dYPYS6KIWJmGDnhA zf_M$X7Nr7nh+x<5==|Z^JSGqa-#z=;ns>`}9^4v)gR?Bfxr}`3($jT=0!s`Lwe-$7 zxiwh{Dx#=K0>i~|Bgx2Jwl(GVRWh(kWKvfWi@cr2@MhUCWV)bhRwXrQbGw0s9|*W> zFw!S9wJB#^i@rQswnzI)Tq=`Jtpfr?iWD`u7$<13X&CxLZ?4T${Bw#b;b=J64$c@h z-lIz@P%K&5Z)_@17tGjjxnFyYp^(6?EVcrOh0$uib& zl)SXVnh|4Qo@~y@q13GKRjOy3mAOssDBm(2Wd@UP`xr9-t-xSTe6)8pHS;x#&-;vj zr9%z+nvBu|>|Uf14=#4ojYk#)t@(5mV6{gH;wR$!=lmpvwd6wSCjqqa84+-dw-JA& zAiq|f?Q_+lc!#*!dNaY6rE83H^Z2ocXgID75si7`gjl2!n~EWeeMm%mI*+-g<34z5 zBb%{w$V4g)K|*wU5^g_;myS`#d`VOdzi%V(fI_AOn`Rgj;k59=OzT}hNV&#$?jQU5 zV+!3EIcOlDO*{!TT*94|-!Mp#WL)f=YThTH^iOzSHk4Ht;Lao`%);heKo?%ijh64F zx!3xQYjV!DAg1g-+^z0pEj2baBjH7w*Pem6p{7}4P_5;v#^hKdLHEx<)U)B{_dFkH zZ+Lj;^4@PB(?OgqICS7hNM!6h9pv6bkb%QkYzFpMwx`s<9nS}g6Pm$uiFX`2 z;!TmFmybDEoZepdJ(`vs`My4YT3q6Vr|{LQ7f;Oum4%=G{%E$d?|Llh1vad#K{s?D zWa%@FMKXiLyDH3pLR;D9pZ6+hqJ;#?D&Mv$O%I6O0u z-9jR+W+!*0bx0tn^LF}I*m)NVkj7WD|Ahcv-T#FLo5!40IpSg3U|ReIg_=nLrvgRH%H{@K(zLe zn0C_B8u~MuD3Z&UTE!dRX}$OI$f#$2^7niW10Yzxn+ zkub7mwiv_^(xeAyllbQ)kh!&6WUCSh77>V0e;7%0yq{_E>>crr2$S2p$|ep)V#+53 z+g~VGIk1*{RAUVl;C9O~R2~ORDxp_xXhuxYu=yaxOC;gqC1$qEFKQ?@t49o@XR~W( z=?^J1{S9b^BjLz#-lC^xD@#!)(@nUt8~(0J&8>4-FIVnAJ4Rzut{aVVUv6`Jo6m1G=hBC+wcs=kzQHbEc>;g4nO?>I3$`zJ*`m8l$a;Qz8GO z-NlZvkptGv$)iKS7as$n1fKfFz<^k00A#_u6f)XA6TjGINs78rPrCm_S98>S>Bdf$ zJnKL_tu|v2KMi|qVzo@MICv`MN4}1oU+55y=pm7;=ZvAK)xC_w1dh0^C(3m8#~(}Y z;U?h!#pN6ItM>Xl*2TmJYWA!Lsyfw@RcH4h7PiK(Pt^3l;#3ocU8Y2YQ1b1{z$<1? zoXpNjgp~wZyumjMp48Fra`sig{+mf{=c}Bs>o>OJ6F#>44IrLbgG%CrtR$ryLrwJ% z#;>Hqa{>$szHQ%qWo`9zFg%U7Qr6b4387t~$y=<#3shdk+n>$|*-3;|)E>j%;){sm zEbZyPO*0=heJEM}=W(Zhh$cglWZkGn@{;8mp& zP($Q{YZ!~Z?u=;6OnvEXCkDX|-=}G|>23^B1D)eKA>nFq&{GnxTE1qa7j~ZugJshw z&R6&uB^A~@IBW{as+5!$&ftYIztL5QV4cXUS799Unt!n4r>QVZW@eBya_3j$yq_jd zeax84}&>G`Z*pYkpMdzom>MOY=?_a8?oP;46XlW;< z3_nQJDdaNK4b$h{ll2m;8D+mlBDTR|t9~QjZiO^TxFWZ}RiXR`SOSZO&oyqc)-)5P zxN9TnY}(%c0Pkva-fn?2ObuY~?4q)?BHPCA0822reDO8kq07{zg|TyKRg+=<^cZ0U zKE9#3!n2Lmrp&zc>V5`EKQU?RwJfnc(D z@>vgWq?Jk!k`te{rqE+gUI$iG7ENN*$Jz4)4A;Yu^T)3Qc_&3;!%*%(sh(cvCVf6U zTj+zLrmJL%9ecJ=@H-k0gMxjxC`{8wB#&x!p4AYWH?;OEJ?Qb2;{KyGJ#%|(Q=~7q z&WhkYBj;ERFB9!eU0(w&OiNb3#_>?yRZ}yZ5IX849N(S%VfP1+&d|bp-XoIpZCl-m z#g72bWCLTYs7OI3ctk_SkTJpty^Y2FCoK%&I}&jhGa!^xdvvfC0IsqMOF& z3&wXeb*>YqYu{d^l6Kr30!K}G^yFdmM&j&zW+0Ja`yAg3O2L83{Eq~QzDwG3ob?}> zXH$?ueA*wyL0&yO@fD_`da?P6Klx#5Pp=CftoK`!g1>w%;{Izq69hy4@|Ulj{(ZX+ zAS-By!U1i-&(JWN@xvI|*VfCFJ;nv-8GvPYFTQQB)MM?V%A{!7`sG$URVhhWu_hJS z?y<3jW#`s+JMh{*!rFhmXJV+JA%;k&v6!Kk_!lUhdq~3yr)HpSkS*pcnoJ>4V~M3k zX8@qIN(%)d?+(*AI^fBUDWL%8KGi~Y;Y+iMB|@@#d>5X|Stp`%f!b$jRV{cT)wEUbfD-M=`Zp0nOg7I&&r?K^cnXO)FwVbT@}Kk z)qmr9dS>!SeI_aMRKIjcl%JRimXluhbNzb<)IXsp{0U6#rF469BhM7keA+|tnLX6m znEt2^-j#0Xo6`oTQ?&}BVy!gI7<~;@L=mWSN>VfMN=@mJKm|ACgKp$q)VP;lS}Cw` z8QyTv`0Yl+_KYpRmgH>Dh7Jwauf!V~t{6Vg<-d;;-LjlzvCw<%(emq!)$7NM8{Ndd zNDw1Kg@1Es^I%^9q)Zmlsrk=j09!u-?oJNNiR?PtV1w*{0SlcctlEuTIxi_5WNjW+aQe8)l* zC5O8-7Abl9Fd8J18ZyMMaZsK%NSvxwqhnBJsaeN6d0f<`cvMS~`~u0VFBI(%5oBU$ zCQPf^0p-*Hiv(T~Hkj-kX#0o&(Khh!p;U6ywDFpu5FlY70s#XT|47(U_@kb0CE+g8 zff516b1(fOL5pUP2BZ1q8*tAwetutsVc{&oWn@V{t;U0hxC5NDt5(%cSP*Je0=y{r zRXfHkNeC?(LP>)=*jwT+c2W!x;TFeEdKkfX5IPMTzj6J&zhXZ33r`Sc@LNa*UfppHEe=eH55RT z-MfY5vLT>Oh+Sq3z^<>rc;7chiD+ zN^4p@EmSjk)8fm0tvR1-0)AMpr5Pf+DG-1rAn>tx&4E{lRh>yDD$X4?B!{57q(m$_6tvIAMwlrF$Di#@3eb5kZ|82;ZJHO{V3_EHmZ_D1U zunj<6}(ABnI;zz(XF>QMn33xF{PKS1!ydnCHrT%2EK z{=WEK*alS=w4-X+WhQ^Cc>p3yZ) zfkQbs1f4Xsrdw{{?Chru)&f=9M|P_X>L1cqC}Vu7bQS(vz>5|?f)*q}Va;1kbtDj86^D&O zx>J!$ATi5wBl%MOM_{xB#$t;*)yov;o4!pDDc!R=3?7n1xdNY<8y{DD{`}}@d!pWp zr_tHYPA}`epBV&&f`S6()!+Xr?#9x;HNB~M^EwCMdAV?BY+*agYQj5AsquG# zd$jfi1eXAkg-RgY|3FsQRI~8ud`f#S_DcX5{x=@$TLX7~EFb1*&vXZ1j;CvA7(xE1 zTLf8vGl*MwxiaT`s6~FUM*S59z37WBT_7NLZ*k#vX!hsWuwAm9^cT16pYdT&7(Bf_ zbO0nQch_2e#-YcHM+L4dAq#JSDv*>20WlRfNSVY)5d8NI|3O}X_Xs3CP<}&2D0R*- zX>4c7Q-gCAdM5bi2Xz3jPOpCRIL-V6um;ig{kFZ{m#G97;notCr-nIT05r6+R`d2& zZvj(oEueZ4ns5{tW3#+;Ftwk4(mzOM)0+6&Zm1s+a>HP`Ec1Q(_9S0C1kwF}wFZTy z1wM+Au#vwdc>$H0r!^QnzjwQGfG@tT;ARB9Tns(I_V7nFiSuiMF12&i5f>{lMkzwSQ<;Puw zJ*+@eU+mJ~h4te6_pN>J8nOC&D3xBv2V+a3G(G+YLJblWjS-8CV9nS&D8UcAgHgdy zL4hy>beZMH9ioc(B}SUN^f5Yrw^ls$DZ5q}pyHslJg|)&*rPePcl~U;G9^Fda`1B% zcF)n2&Y(v2BbXI~*W_;!-E zX!`oXg(oX$bYt4ffEeOCp=Z7zqviI)EHVnh$#*MUXAB~r<3W7c!N=k14pJ_6|C2It zUkKK?wD;Xa7_80Iz%+AeS{fc6mO|WtR1tzZS1LVan}lV8>$);crtXUXg?}01-zVrx zAh0#dqW4u&AqEK~xKz{;;Jt&Bwm1V@^tcyPAr(*wn9=s@oL@WhRNKZ^QzMFGLvL6eN@ZWE3F(NViSm+%~E0SkzE64%tW; zn5s0fY=q=+z6bW?(ax|}MsoVmQPF5ysMwvtDG`p~ZN#0E z?*U!1dH&gIlY>p-_nvG5%!9xm{weskgxGR^S?8{)<5qiejjGi@Xps%uG!VIQcEVg86cGux z{G?XygV3Bt{dZfd@e!?$W#%wPBV#?zN;GmgN!CdoU#DlQktvb?(qq#O(%{vj)xPgU z{8v^y)6;(mlmvtR4__MnbNIv0;T@gKfM<#ShG47DT-`jJO|nYIb0RD_o{oF@EEk8s zk3Cpn7fub_yIT4^=NXnyn*ADDTW7Ei)$7Qx%*X5nU=DayOkj)-umSsLUWG0zTve08 z1>P5%EPM@wBxUoNkt*4^6};%=fnjh-)8j6(VWnOk_0gEyu<8a~5wSclpcO?YzYCVX z?npm;yfnR;5DPS(IeOu4LWzqer@m9AuY9~6*?)13BL*?nRxcJ-1y*|&3w*L!UeceSvzJHPAwWEX`9!Sk_;2-WY+A!`V zD#{-834#@j*WkZCB0~9wqiYuDqiwu zl1_C5FErCBQA7yva=yeVfYMATu-hy|YQKb72~1iTf>k-Ax%fO_p^!->`aj1nIe@jrVHvodtx^uab^CO0jqWfTgSA=5<*>s5k2SUcp;CSf%(TN+* zaI1uA+7B|e<#rOCjJb~GR_siVN4(h>0(s}F-UbXKKrOBc_ z)$EoP9x}?%Tf{Hufx3J|Su3%|(Y#Rrvj*xTPI)%uj39Yhb#q?c;O(L5;-^XlgAsG< zmdx)zR;(}rPiMN?!^D|7fge9UC1jrzR41x_)^XH)_VH|;1$ce`(nTkri#26515>vp z+Nc_>aJHGHQuSxZC`a>5EgSQXfs4i)cVyj!;u$mRo*1r@fxcmbDxRPfm5)7BzTHoD zG}ir%mnyl>DAh7d^o@Ve&&#>r(t+P!*kB^5IJ|x!PlV7*wHn1adg7n(nOy%hJ?vOs zjstdQn-o3iOTbV@uDv6roaXr@o!+y5mtVZihq^Vw2O!ku6%(&K$mcWxpT^tu=ELs& zv(AOUr(l(3jpt6VONW?C71OPB<7NS1;sRMLO=0g?5 zgLY_A0Qulkc@$8VOX}ljsl9U}nVly|?uWp?D;DC^arh5CpI-!i9A%G;KqA7t@o!cx zjk*JeZV@dXa}qx@2VE0`Z6YZiP9GI{>uhA65*_F=27pXe<;16?Fok8#f<~j4wktkSH z0QIGl=;wa2ma+;0Mu@c=74PqD{kLxAaeNFkCm*=-a0~_iU8qQjmhX6R~`+(S5mElftkF)^~g1lTih@EvH`3dZpdg~ZR zGmMVIxwVSM#gPGT%3?fGb;7oUHke0M6GQDIhfQ9=w-5FJ>2uaSFQ~Lf<2dwZ@3?2hY6qmW|MY$Vu zNiRs=;HYV9Z96y%*(x&s7J-+n&o1!kgz91<|Ir1=1% z8yEJlp<)@QWvEAF3ZcKF_3^^s1%p*bWVu0>^O(-Vb$)RC%iggH*I%jZQWNtIceRDS zRB}gs_%0;vEBEhemI<8vr&=@8+qV;e3qq|~@o&OK_5mhpKV~%x-EH3RkK^Re(RWLc=J8neEX=FLTEGo3cNCPv`X9D>v6?)`YN_|;c z;urrjU=Jb0>>EM+z}iYW56vFQ_-&QBfa6gwzDEq}Rn^q91ZKjYT11u#HU^Ckf}a9g z+R2GNh84gLWEeV9ACIBwKcVtgK9hPO@Jg|;`RwX{*Eow%n7_?~TO+lQrx1#?;FkY* zi^kQ!xSQmiYH5jBIJH&Tr1ag^{X|1BBUj+izhmlWa>8w(u#)Z$Esb^U5dAc&mzveb zM4~t`j7siYv7#RvLJG4uymjoapJVz|6MD@hWiE0|$yKXhS9Vr%)8*M^>J3LuJCOYH z3W7UpB&xce4Y2rGVX|XrGXLi=K!TA6%rHTFD^s7J;}XxTq~9L3(sPkhxEhSc%~YLb z$>QtXmszXMm7Z$JXjPj}BK9Mx8u+mMO*K7UyAwtX(z~u>!(wmOL~Sj_T?~!KxH!&^ z=dS{J*ebg0O=Dlu+^1|+D>g3u840+kb5QfPwEg#ZRj(1#ns-O6)cCjVP)w%>sYOHQ zhsGjrs=HC*DTLCK0%zsd+=p@+9@#B1ur!^=>6k&`n{%t(rC6hbyXDb~Wl57fBAAp* zB*enWZ@aN@o(IbqpsUr|s+5sPr&Xgpi6yXg9bNjdSrYbPg5$G&h8Er^XiZTHKdjtO2m7z0grun1EPyM5)$j@PvQ z8e8GEn3#4t=CAvx{S&Nr{X80oJxH?eXz2Z^I+{Z0oSSgFLnNXL3(ke&_n(CkJ+w4K zahr#3j;d?=J;PE;%A1u>l?qAttKQcuxp&x6!c~wN&IJE?mrZCResi6;z!bdY@-yl%pWzrgNTSR*ikAr z*G{A6E}deZL{1BmRb6vZ-v4+gq}}?Gknam9sg+TcN;}o~So5`iC1f)Ts#NU$a(}Em z>}uR|XKnQAbG*2Rf|+(SB_SJ(D<&eoT!4;*-(m9ybh8cKnC%rb^AtQ(@~`??PA+{H z!Il=yms)*^QLVp=HLFwbJcTZ-EE{*H$<=KCx5`_tE=ElD)UWL4xcT^w>+9r$ERkPW z55Qo}hkK=i+Vk_CjGIzykmNoND<_kkZ}IyTtaSX)mVy68*;hwZ`EBhgQWBzobayw> zAs|RMNJxj2Ajqam1Vp-X)7{-E-Q6WEumJ%9>AT=}zWbf?jeGAH_aDYPfW6mx=bCHQ z^Q^h>@yYbuy}zeHt@BH;jn#LWF@B6uwPlV*%7bt@C%C@eW9S**L*0M{)D13nhwiHm z(whk?^@+Fl{e=L$lhItuyUvYx|ESmOGUD>`jb!cHtcFB4tbukuv)(hYyXL*yaz=#U zW<6w;g3|iCc!6eHSPm8jv^S`zA%gIv-2y7r5R^@JAKtdyk%dI-2m6HQq z?o*{`l>_Yo#QbP*1e~-UXZSthW2XF|BAJ!35TB5&h1>?td^}Z&SP@nX7!NmcKe2vQ zhZD^{FOB|wem>Q?V|TI<;7SCuRBscO=lb%kJ#L4x&CmA}MCI!vzD>?f=z{X{1mn@y(ZyFOqck!vuqTv?_co4E}`{E=hg5{dcr52Q@h| zSC_XIOO{?84xV09dw{s)kxN6;@#odK8hHAMUqRok2&|sy5gIoBhDy{4*Cq5BD)kl_>`K zqy23rn8XlAYrUI0dtKzjeO~Rk>{QKhzK9)3MF*W;o1!toqekWyZ@LLfW;<-0EsGcqLCmhGn0Gcq zEZ`EL*u+h;S}?#Sk1G_CZAWibay`8Cr)I=8 z_uK0TH9W}@%QoD&?|c=jVZR*Ykb?w{*OM@aeu?fMs=3CL(yNhv zJ5RD`U*z9|Rw)j{y=T$=$)=3VEaf_K+R|C5{t+r~Kf-h{@vv0EiN6Ek;qU+IqV(Sp z4cPDrERi4nbb}J#3?b-fRwq)*vy6crW|PWyek4FbvY#gHjV15`_frKHW#m!JN%u(W z-}S|lH-H>=-8CK6nGaqrZeU8Y)X{l{2Xx4}{T=3&VH_XM)~J+Q2>9{I&K#7Qd11tN zH|6X4y&DBc7_@+~-<~eTI|4qL3eDVdUv8KNi0NuK}Ah#(k z6PkC1xv1XP4=GlgaJaW9sJ_NMpTq%90&^AtR#apU_(mZ^+xV9S`4<_$9~6jmd|NqY zB;2LR-EzN`50p@7J*WEgeg4Mk|GPCSR$Y`$K^1i#?c1LQ_gH}`BLA;`f*<$Z`!VR9 zu-)#i*r7@r2oHHIaD^lZWFg{p!Ytkjy-opa*8u+>ydxdY>`GEa(A-JtNnz>A8W(5^ z3%JIX+|}_>w_`g)a3@*+-LX`t5Y*5AAfgK4uQRL{wv7!_SuiW11Eqf`Q6qcwkAC|7 z5)@TIc{2>ud*=?>Kz|=t;{E9QOhpuE>(_VVl{kg`Yd#Gk9w)^Lwk3tOFxWw=SNV^( ze4wf3>CN4oz)9|_lFx^&Ueba`CJ82y^?h=Y()=0KQdcaUIjC=$jK<(N3Tt_n*=p9& z;Sgc7h}OowA;b`>vXG;{Tg%w%1v;B6hZwfuVyA#(AY`yvER25wXzoBVaG1n6`b~?1ubpF@{8$tN*Z(~c2 zdF6S{w&7&xuF`Y5GI5mqllNcX(jL*331EW;GwFon@dyZC>B67DbVFz~dEN+0-jHf7 zq(#iu=xe19TRO?hEoW-ebY!*1^j7}5+$vp`bDhl)|Dea!&?23)fua;Nyhy-1hr;)U z9Gy<-C;0k<&{Z1E+Gj`iLpXsUn0^y7sFl{e?0pQ$;I^K4$N#O6Fsp)8MpawGkAl{A z1*6(gqrr+26_VjH&f*;j@{*7{BykvtsSpfvs>_j4Wg5%UkY4L2frb`~YQFrs80q+@j_Xn9nR`i& z=<;fnq#oB#Wu#fixZF?Orkw;%5g8|Frm*pIXs!-+tAAb6*!afsobBJq7^l%to>YLo z_NZs$-rs%T;9df05qHQ>v*1yHF%1;y0n+ii8?jH+2ddN%&6HO3S-OJF#U^AbymjD_Wwk&&! zvZ3+-F99JuLVyGSu%o_7Kujy`k^Ey4m_(yigKmuNfmaZfB!SXX=@VAco5wb$d~Cc7 zQTbjs(~bHTXi}}h^#n`r0tK(uWRoS07CcRHT(1s%!BWrkD0uuiqHXouTVj>npj9}_ zERdYx5xM-UYH|W~T1oX}!+pO36LC8V(~oYdzuO;a4Nn&Ga`F5WGR;!LuN2jMGwgPr zL;8Zq&GeUSAZ+O7(EY4FtMm@efu54Z>i0+5ee18KX>A|X0Le5IE4ncIo-5gp8+Bn8aoYSQy;Mtq_l^5SoRxV}6V8XwjOtRs_Vvl}b*I z#1>I#Reu-4Pl|_>C1W#`EO27i!UI(#r&Hp(w%%)I(gzWyXPQV(Z>@7|!q%xPB&zgf z^9v)nS%t?g;y^YGdV02`#jq8K1}51I%*k~Tl#rCju)qYJdhDX+PsH%R>YwF+$tNuCld;l; zrvu5=JGo{lid<1NwD7r@^PkHj!UliC`@_;imw_q+w}v1J)Yyp*z(MCaG-?K{jAglH zSbUeBw|-y!eS^swJ?dOUEo%Vl5A zs?G-Lp)_*~o3d%IxZOF~Hs65$^x=R0kc2cx)u$_2*sthNz|cr}N1u2-n4kYKi+b5l z2nFwnP_W@389d~E*CWqSW$i97P6`LVXk-#r35jqry>*5F)p$yvWTixw5B$Rc-ba+f zIC5&RTG)l)<-1<9j(&e%(3bLJ_>9N9 zLE`jym28x}f%<_4T|j=KK1=BU8FbnE@`x_n4FTn`z=@x`pAw6K`N4<_-3#pA5->!g zah(>jknrSV@PXq((BB7g=w*P8{X82ydJ2fPDJbUxgc$)v>3{4>1ZONihJE4(lXX5k z_ly|<0U~y<=wD<65%-I!l7S8w`D6k8hxK+%E*%y4 zo9_Rdpr^Rs?#tQ-{qOSd7vBSRP2->C?m9c|gKCk(qnPMCE;pyl8i@t}CEy_if0gzq z3_Q;5_K#OSse}sB(h|WTK>Wb3x&om{&xn4z?)`j%Vxs9|$GbQ&5w-m7vAt;tShte8 zVlnC6Gf_-ncXz*~2dD#*7vOYQ;a$ z)3ud?rSTVf=RXGya*inSqM%^6+|Mu=iuv~mLPhQ)e~+iL39DuF9Wb%7i4WyMUPr3) zRnh~0ue%f*zX`JImav@ElJa{LwBG$nKe*&De#*jly}&kUS9`y83^8I2@0HR%TU6-v zW0r^Yt?Z#T$j<}nJ!m%=?E)d6<%4**?@jIXHFCa^s#htd75PS6e*iz|oH_T(#oP@1 zrF?IFFcSgKSGss;Wq433RceN3%zRV37Nty;0r%M0uukkF9k))f3cWXft`XSePDTmu z0Q6m#GdWvhEpqDxHTO#Q_z*Vb-14O{Al&oGxHp{9!}embRQu9xst6=4hbX7j#|STw zDoE*WwLgr4$*U~N1d++I&zx#G-93#mXYE?nv`;1J*gT^=$DN5B#Mg3za9a<0$U`gw zb-2|(Zy`s&ncFRpp2)?+)Gz4WEcg9u;QN8cYI za6D`*PB&e+*zek40##D7bNzJi0%Jb|yOU+Ah0$TrZ#Q=~`+wI&OG40CuUr!ihI_UD zXn1Lg8nZjP6c`Q^NbHSYp1|%<2;-E8b!O2NF6eBPOwxbX07AERG~Jnd@desl zW4b-3kA{@u<*nIzmXth^+FBjOujF>=Ky~1>e`2$ZZu+w{e?jK8E0I*HHw$*K*AP z{4C}zohw6W^ry*mWH?q$(yiHygR;$sy`M8Iyrkz znqr2**M@noGRsQzLG=&>h*6!2AtXN7)yMWJ7_gvnZlDnMDk|7U$q!J6qdH6`kBczA z=JS_y3tCeKXdE4YQ0h zNRvO_NFAhc6ir#|+Y7Bc**;K&wFB}dhk@Ui{;-4xX-qx2cL6DI2=E||>Ep-jH#K=| zL`#E?E}2>^ky&L+^u%^cq*l%qLx1B)2rCPvk^3K; zHw^4XiMyewSm!uAM$46ivZyCm9p(i4yU`0tUeRC#rnMF_C8& zu|Lg2G#{=Tln+2U6bbFT_Q_P-Hp?A$n#$wNF=w}_xBww+OtxQNM2lJOtL%&DKzSc@ zlcCU6nfmFp@!hP7x(|Kv?@rn3B~8olnO}uys77iV%H?Q$Kxcq15GL(2apJ4>s#$V; zsm*5aTed8lKXvt$YYBP6Ml)j>e1thh#6&YeSB)5>J#_iVNN2qYCk8MXt@7tSs!}Bm z7NBusCR;nqEwK-PlYw42l0ur~$;Jq6h7xH%?@MT3!k=LJ0P`_us1#~!9|kpjd9a>4 z{CiP>&Ef;{(K4)aYA1Jtp~A%A?I2~NrZ-yoBvU^J_xD7eBg@}NOur&|=0BO=#2nEd6B96- zMEahEMtIBHbTm;A}pmmN@Uc&-|OYAQ%ZytjP5THK|3`tqoc?=LLms@TLT6JjLuIZQt?X0H2)?oM7_ExmWMQ>a86bG zyZIJ#S0Q{yAW*DgH&C?*nM$9IzcHA#H5J59XAnn!0@Qk-`{h? zHt#v}XgR;4%KJ3`WTS}azb9Auh z;u01n42i>h-}G~$XHUc9v%!bYKX-4WzIjrf@c2sx#;0?h22%S;yvtNF$|xEv=;5jp zROB-M-OXIVXEm@*sJg|*Zrt-BB9-kKp=t8s^$0Q^?sGO_}DQ3lv$a*gxSDV zu@KsMyrQCK2p!EnqdwgpV+tFUBPY*;#8q&xC!-JozM$B zy%L3UzI?iYn~%Bgth7pjLht^G;jhHp3GA~;Up1A8EX*WU!L0uzzm!dleb?cvUrhem z$=>Q@lW#+|i3?LhX(A{(=)#vKJU9?4x6xvf+hHPA9w3sdWo-U=O#?c4SHU`a#gFfFXkKT86R)cTt%^SO8?0g zd2Db`Lc(%J!G4|vVoJWtK20*D*?g;}!0F|*+ZpcVjfN|ggx%G8#Cch#f>G|OI5U&o zEN&kH~ zMk`6Nm4jw~PDvJ{Y(=_JP$9iypS^YMw-u{YV&mNjaBSB{<~Bky0| zEtmcTNk{NmB%ksnrYt3U`P>1gN^i)3I9ikz16*^vUBE&HMUePoxt#*^7g$*@pE`Yz zJ1DZ)L-%hiunF$mEpUYo!G>X*3vRt7;qGeUHK0Sp%W2Vbp*ZIB&JC`&1u+9El3xkP5>_0BKyY|;ly7(_Ph{D9LIHm?f&EJUG?6ryJ< zpDpv*;l~Z-hrG{MNeuNe;#bj7_ivK2JZ{AsL%~P_UD~oWbh1;j1iDEd6#w32BpO$Y zlFgq}^G_#_B4Gq)&=2+CCVu!V(bSmDo>z@nt)Zwe9cV*FPr%(KWVZWBM>R#g$8(ya z$~D}VL;6P`bPMrEa}70LwsdUJDu;&+Zo5xRP952Fw`d&?-fuR2NS9r9pDb0*FvKV$ zxMxLwpMpNFC=f7-%{{N$s>)9~M0Tk-*3ccuONb0p4=%p$d8Me`j6@Y|W0jOC_JE%5 zYjWhB=j3N)fer~DD{RSQiHuK)lmq-VlraRCC3oD}7C-$`VDhxt)FmFM6iK1!AlE=} zZcwtrOJ_g?M&YR-0t&LqebOOb0;rz#S5hFP;#wx(l^0tlwokd~TD+m;jzo)EPwAa6 zRx-L}cEPSaU6%AsLJA;ysy{~s(X)~BcofDlA0{Mf(0AvRQ%a-tyf&)%omC&sn@Uxo z@9i(N-PoHp$5F<&{Y8%a({GY^HCNK?xaU;NM6I7B;CxGG-i{Po9q*(NH<3iEtqwok?3?5-gG%i0>?P$F;fUpMQ+2Kha#XWwAA0z3CxR)FJXLI}M zI`Y2v$_TJ1une-YEH;grMdc7>&@7l-KGHg_0>=y3D+!*RgX7R)1v(5TCiVUsh@XLoFE9NpZLQ&9x8m8JI%$Y_uX<_JRtv_Dir zGlEa5zF8A^-7lDjf$Qu={Z~7Rmuvk;igEL)`gN?N@>(9-$I2%_KSpSEi?;pW=|7P< zr|3O@%?7DxGx?UpqO`Q00` z+h^}S8uotR3Vq*r@p*l7x^TwAE9GMoQ6psH1J_o?!OPt3F<#aRNa;efi7XnU06W%- zIcr4?yGv)pfc8smEpOplTZ!t^X&s!N%r1Dz=4ziWKLWwGmArKKz{9H5i zPOtR(!f(My#${&ANagnW$IZ%KUx4l;r$kYy&+IZ8>TKWu{B6B*Bu*Y4hCy`_xX z09{qaNA0ZJF}RTR2tGs@NYgQMF)i*~K7vGMrn)0Q2n1f%kj0TE{=lKKO_+Sd_x*c` z?eHHrix264!qRROC^$VrJOBC*Vy?C+*e`fbHPYJT9}*kZElzPduTHMUYR7%AAbNoT z`F`&;kMK;o6pETK_7k6L5m{su&4~x&z6`m+pgakRxbU;`ls7u#Eg$$|SD)8PhQcZJ zb`XyvE{`3{>?4`R)8on_ObG(2C-Gy1I+QcEro+jy=q1y$XS9#Z8R zv%^s?iz^86Y(Wkom3orRiW4BQK^lL3gNF%i$+af_r zISwJ7P{J?Uan;`{dM?+~9LMwT4@zYZ%G(2=6vYwDYgubBe3Kr9MIwTrQaBFIMH@|; z-v_B7vbk564eFNOXt70=F;!|H1_~() zS`$`j3*PQp)=Cqm>i@`cHRmj+|4=zYoh$gM&CYLpYS(;D^iA+5Ny0vyr)ZBLTeTSA z+MmRRLJs4lxK8@wzq%RMzZ`~e*rQ?z zy{pBqe=+*5k=AI*enTU?TpQ1dkX+^4KhmFH{UtV6D~z)_q5Sh1<$e06)saOza$9w} zTisk`uTz#qV_=l4Qd}FS0R(@uF_&7QQNNG&$uL)fqTMbkx3ILel~vbxc0d*S6?-<0 zB&;?!m$sEMtXcO`VFZ$ql<{NCaM$^J@5JPh+UhSd+t|T-wQkIpilgcFS4f442ypQc zFBoz(wAAxY9Lm6+i3MlWbSPwC&jcD98XDQhL#ZIG58g$ zGNRqCw6vQh`+24WL)?6lPDgWljZ#dtB zABcKtmrW2{V#~7Jy1`BL+RsZ&w5YmBGpvVfTNFz(@dj5biBwC6^e!i{rdhy0C@Scp zlHYbW2wGVTi;a@{Sa}p6ZUc}EbHXlHzpH*pLjzr_Mi9}K(ht8{a59Icen|$4Wa1`GRdN01#`?!VSB)(D^?zS6ga`2rr#MKlndXfw5A`%7Ed;Wc{~XBEY|jcsoF@bJ9$V5;uXPVXh|e(jUbxDal z#DrUe1~Dd8^z_oG{Yx$A+F*L|>{(h6*y59a*`sw_OV-q4yTq6Y*RW?I8PC*}H3_wJ zQtKV*H=;R*jtyu>((8ziy1IxoWdBSFZPUbRVi|uv_AFyNx#1B;#UtC^Zr5_7#m$a7Nsjk;h>CI9eR_`Fld=6D{YR(YwpO!ge7M>svBEko*?Mx$c`VrL2!e;8MhH zRrotBd<349Bi73}Cjd_wTv`B}D#1qE@R}3eeFQs5P-((3xY?g1xvBP2N|LnF`I7o- zZ?mykA=xY;fZ64lG*#rE?@@25cKru91EtX_KAMnWLK{c(Sh zg8Rk6qs7X-y-cRN$FEyusosR28z6hbWx?UGX#PSk>Mbawft*?wR|jsYk30K=k~qjv zu4lnDIUfK7U`%_N*Lqxz&V!EljfMiZcJDH z!R)JE!RfsHH->Wfmn_{S5!Lm!3@Umm1~mS7<^R0qyh+zEsK&v8>`r>U^iM0r=Pdry zbT&=FJLPEE&o*-Vn%ne>@G~ibDfM3KmqU9|m0?(n5fU>zng>Lc*$2KqI${L_sCIAy zv>I)d^t5#@SKH5xGkrCCXw3pQ8OLZVIPhO#$JT-iXFLOR!Hr@~wWgS&l$^U>8diOu zMle=19zl*9K2)F}N2npN^KPWL*nB_}=PT}AJD?}C8EgL%6sKT*7^ zsRo|4Jz1Aaha!e>aJpEt^zM(X&g6tOZ5gL$tl1Q|ueSMy9Lv-kGtQI!@igl7>%>_L zdi%R*^vhkigTkQM2iv8}HTTK%=MUMEzeUEh{`uMg6jU|LBWTs?yE2&0frPswiyj2D z4b}BnoAmoX4P{Hj6R-!FC{ zIC;Ek&y8k^;!M}UhsT`7Z(Jv)icfKNfp%WQ#S>fKKctb{r>v|^_~9e19=^?~I-N>f z-;gP|#0BUzjxc2F*cw|M$DdF;An>t@iOu>nc|cxMxU&{s2zXGh0RM%F)*&KT6;lJcvEH1Qr1)h2`On%ad8>+NGFM{lU#SG$E*~McZ~4?;dLt*%zaP6Gn6!c@fr=JW zQC&r6xGPq0HUaVp&%f3^F5W3*d9PZ9QS58Bc9ep~yMyY$?jJ2smjm{%u!V%;#F?79SV#Ge39Rayn`)XGN}7JyI7RPH_BWw|`!ITE=^@hT z%|6hnToUCKL2Y8bpV$=~TFa%}d7`c;*mWRbGfzQ^5Sa1p3CR7NG1q>m>)iLUReV<3 zHeJrRLbGn~Iz6;hF+@;X#$bEhLC>5qMu)TBQXGFdC@%8Q*h2=kr-a^l^ zbXdF(*%s;@aEn9->N|)39Jqv|V$&IcN)^HxxPB?vt45U~#sP%>*F4gdwXL8{i5LA>pqD}8XK|Xef5p=$qSi}56bxz*2xywvI_fq%}HRw(Q1YuFu|fg5kc3F@ocF3y^Y0G zkOUpx&>f%#S&E26Tf?TxSEX>BE- zcvHzsD|k);k@1Mb!DQ?#u^Aj${3SBKG_SN@L7>h7_opm!+6O+`47@vCD2FstJ6po= zj?KQHrnc0>4cxyY+uLan zRwMJF3sOu*#3B8|a++5iRQMQ`B#lXL!x3PEX}lFORgY+t=WpV2Fs+HS>eNv0EjN&t z!{K65I-mi8THr8pR5e-KFkBN|noOEE9T?}afCVgSOS8m@w|=ei_M>^ASM(oM;%D^n zLrVTF`h6sj9R1`$rQN3x;#Mv$&#OHKS8jGW9HKc<^uVH}gVC4asm#1{6`^14@qy5G z&kzG&`@k4L`Z{nBs)YmS4I}1dh$tI+4{QPci>z}fDk~T$6dHd%?*4`0&|Q^58cN$a z*&-X=Wn9U&0Jij|2WOz`@OyL%i_=aV(WGnLaGv5I|O*zIz;|+p>ou1_BJ;n{s_Na0zo?5-;7S7YrgCep7)%@w8E``R*wc*JQFt47HC2Vz0w2t>uhs@M8 zn9>0{)1u&_H{Z3-L*f{Gudu1D2(^d~%U(_+rU0GfipBhh12{D+#p(MlnqWgXn^$Ae zgW$*WsVJbKpglnM*a%L^fgzIXC%AV$WSl2=Bl_0?V;?q{g4Z9>uvdqagl|Zq-y?)! z=z7o~MNYF&XyLluX&dmNMzId$0a?qc_t}B4$nf{jK4KT4UkQ@F*qRGS0nBx^l$F0;sDc zPaS6~0Veo;zoH_Eq|9MN&vo>72GH^QjAK@d*Pl(-;3{c`QsK;k3oS{_DpO@Lb93DKmm?Kzn+CV5mga17?yl^U0JE*T6hf(V6ZUc5lPOa>Ifj zm)}$90LK75WxNKQ^FP%g!-Gfo$_Pe)ti;3w17kX({`M&f_C4v!8_HGZU7Gf&5j<<* z^O+jKmsPSIW-1j5WdMbyS<>8c0WA!A{Sb$k?!CfefjRsqMz0?y!nw2$V+ddKp0vx1 zy#q|iwIp_~;@|hg5nFwfS*^b_$dk{pe*y&o2MrN%f4{^w&?Gyb-6=V{Wou20^LeKI z&UqmNfo5Skv<=vv>vK*(Zh_^2Nx-@NbI)ET=%0s#V4wETTtmQEl!;DM6?{X2abD)L z7`uzofgV#iesA-~}52|Zoj`j@!;RBE^M~{kM;Qx)FGjPa^B7=m0A_cz2 zj5K}#;b5dA}Kn0fr3dM zP0j}kj11MGe3ut6PT1^Gi`zsPPTY)C=?VuPvn_041pbW~npFj$!L9w8q0KoMVJQ|& zh;Pz-uiBFstQEr4jr^&CTiY7!t>{-a;~c_XM^U23op$vNgDalD{^Z}@W(G9u4Fpry z1=lg>@4u|(mULudiph1#{G$60Un`+&nF(DL1XFe|MTtdy8&OajJf>imK%FtK{sLa=j+qY%VI9oa04rW_b4YlC(}#3L}=v zp2LV5h3~032@bgGmcIYchWu8TgUuE;pa~B)C(JepHA*|F6`BwxOpBmjKVAI8G@kwQ z=GZ+`w?DIRsGF+~D{7h)ztJ(~ue+*`5=6(nScpW{Yj5|(VNFZ`JSg^eytEh3pEHV< znYd0k`vUZOZhy2>8|(ic)=Lh`7C@1qtf*XOu+cUrs z1vjzGw4{O(N@(a36%zYl)73JdJOX-$!;0R;HEJJN&j`i*{?Py80{lGoX;;Q1?u*ua zY&q8Ia_BqPBMbg}!o1}M7N*})e+LCj)HtM)Vdf&0s80#~Mor+R_v7H-#p*d6pbm!{ z1jWo>{7`NCP>hqk6~OWz*q1tBEul`}tT=;N&e8!Q1ybY)vgEU07yEX^U0Lbr@kej} zSZ1=pIuipljkGineRa*qQwkoL{eBhT25K?3`ThhLh6VQ<8#Xk~Mh!3UNk0E(<1TZI z<{~D5Qw!s%(|KA7Exn=L`Ro}zIn}J}gX&grB6fa(+5RLNQCgZA@cG zJ{yRrxIsmW|MrOhwMu=sE}q`mDOY=PMD?%Y+Y z3Ypoy&{NH=#{ykwrfki*^!`v1^TgReX?cy>+QIkvs#zD}xoFc}YQpCDAkNuo;TQoV zu@IX90HNYN6TEv=>UniebL`uz`Zu4Vf5~^in&5zBht~;vqw7buba}UL$G0|poPRS= zY0t}|9Dg2f-PRfno+JzM|6cm=*+aFIR&OiIa}Wn9hBiOogP~hXpeA!g#S#Nj8K z1wF=nl{!ddXuzS#{J4a?5v7bXdtolH#K3kQRDx^bZTADHxvA_jyx+mFR}aV?CTkqO z&hv}C4r4hzUbR1OtER)-COc8+I99O!o>gDfCX1~gak`Jb>_((BOJ$XM@d8TnUN&g=~> z7fI*BWMLU?NTi-}@{$4#So)~g0_wz?5m>Obn8ZotxbRhE8udcCXHm+8`d_|%+QZ~} zrn-CjDnPGTg4*by663J|z6{C*-?+jPKnRT!oXuh&gBN(AHy(eozmhcGrjUL>vPeu8 z*ND^|_2yc&rm9p6F1F4pGH^~P9+yZG{`S|sPuh8oyfNpCf{hH(-Y*I4bNhDw;jZs- zzs%Qn-CLTrG(y&6sFT@vS9;`qIR5RHC|QO4L!Brwpq1P7xE_lT1U{>otsnb`p1|2v$@KO>@KDd;cA_ctgY2`IA zXE!!~dF=x?r<#_L@niky?9U$)C#rVikbX}(Eeoxe-;L?)-Tc1o(>K~p{a$5d|F z6q(LWZf(7!IB#!lCldDE{~`}T$BUb@LFOzrvY=eubLpd z;`rw%Of|NN(LsDkouj{qeufvVBPM4W6-%}+J2h!!B`#{*s48nj z`~B%`w2Wi^2<|RAG4D5FA5p7(X-4U5$@rEU`eecH?q`^>@i9#6I2Zf@2gh)9;8aL*_92 zZ!}ygQm!d!0lsu@k%4v~2{RGObT$YpY|NaWn->3?7%wuYisdSqt!M6#80?xJ^gh=$ zZL~OW2YU8)`M>yHLHGi0KQXX-Q{bRbs7ufAQQsA?+ztLTy9S$?VIr@aUjO@<3mNI5 zVS@kDnG4XsYpEBAZ#VOac;*w$LlLn`Xv77fc&5bQXo721*7JZ4JTn-PR_OX#|Mj|# zF=d>8caQlx;j%etpUkwovdH4L7dmi# z@5(0Br`IsfYpM_}g+iv#+jCxhLG)dH6(_6^9N$p&W6xp6PaD~8-@53$z8O%vjMXCH z3%RGiUU!bA04`WaZh1GZr6feGSVJDg#YiP{Y34;R?XziT_iFil=Kbb&r8W)ikxm6P zTuZ^RZUa+CI=ln)ug|z%T{O!(O14{(J%*Uoiep(7kCtH-!jjA!&)<<01PS4{;~kKQ zRoDp?P+lW^b@_%|zgt`Ul;g|lr zw=*fjBg+SedCHopZqHBLwFuCV^Os9xqdw=nbylP@ZZrIP9R0YgGQRv|Vuby#H{6`c zPYkbXik?~gz@_cHmI}rfMxHR>taC#(`5T^5bUR-`&z0Q8jjcX=oQ${qZqdIsJo=eie(!|CX0?T784@S>nvLZ|rZ_Isu<@W=TA^J*a zWv`v#dcaZ;BumC_)Pj%4{1_t@OhI+NPSBw!u|@%o5~$~br94P10R0_gjsti{H?^+(*rgsMe23DSG#;u zA>p}ZBI3e&{cBxuYU*c?%Q)GoKXp+oKCezlmN-Ca{C@wYF z?;O|r5JsJJF8uAR+Lmh#8h`TKFBY2NmKMBN-^e4V4u z2A1d-9k)Mz;6QX`SX?iraqa4Mc8Sb%6PK#iwKmag;FZ*<^~Sz!!3G2RzA7YgHt{r- zQEUlTox%9cu|^fAA#|EOQD{YUIIwGC{kXt$%~3agAA1?$Q&@uQqQ<2VTvS~8lrK?W zg5?)HzE?`^gXmw~Y-H_aqKaPn5B#Zq509jgxYi1-W`BNwjwra>c}+`QKE6SXscJ6J zg&)?sF!x4<#X{Er0Bk|cS_C=c-NP7nc~QOCfG?vpZ+vh&2Kb#)D=ULbA`G%_@gg3x zxo*O%m#MVscPCl97hf4+6YLX8#+?mron|liH1Evz4?11HDHZmRZsj+1x~xGKm0!8; zEBSGKk~T`rK@A(l{5X(X7!8iK%>FpcQJIhJ?@BtCg z0?7BW?|<69BHlhGR0350&rQH6W^J9V?yq*`DmoTp_`M7#?M!#szHEE%sZ>Cna>@cK&t9U z_&U;&h3h8oUlg=`WjF@y1C;SH)#xJ$!i9KdillB*ki@&D()8bRjSfhI^<|!JO>!?w zEaWNO?Gf0jc>O6?jRnLbi_~&e97_W2_<+TCS0$gzRI>t*i~R-lFBrlGHgQVtdb1hL z;S%8;C{($(HIZt_;JEruH?e8yJ&JB-_iB$MHm-kJ-Tk{kG69tslP z&@^u)1p8oUh9s33rq|^hF7U>E0uy4GxCV)9ZNvTpdkY-qK!gWks_wl%woDeBsXv;u zjX=(7^ximtGvQS_!ZVsB>{yOAIvlM23x)8;xiyK-K2djA)&&w)xIMHYh3`nHpJ(fM zR5=0Soq0`!b;JW((XH!G*~$7ytJq00$RT)#uix(x|7fjP*Pp9iChtjT6&Se{8+P&c zXaKK&cRA>>nb&8cmJnRPC?)UZA*n<+l1xilUw-=D!XWn@#tWZqPA~a)!E|VdQZWlN zV>~a;sR%@1WKn$!AJal_484d?%9Y>fFY4F6yD~95kNox+=$jkYKl=9ijO_U%gm_TJ zfa&Ve#BZFiQdPZH(HvO?*>PXXN!8z_<7(crN*MOhybX{9#2$A1Q@v#5B2?xxV#P3C zox+WGaGN#l3BNog4ZB!|NWln^z$rI8QRWM)qlm9`;Y2sz%Ko z1fg7{bdP8;Omqy7P|F0WeFQttDy(dRg*Xn3ZPp{MBIJOzq#g>?RssP(%-{bK+L_`Vk>pHm=eOoIju+_64|Lxq1ZCrcRc%c zi9OU6)*Ju@gkv%M`;ecW7Tya3LF&8?t`R|COg6o?I~PrI&+YK;pt#oSyV`Mx&7;MqudM+MG-CBjHEm+xqEI7;+r7|#mKDpOndSp za`ec@`4fuXrsDWEFDRo$)yEV%6qEt*EurBp@?S-<9YfmVGRNfGLO{w@k;japQmOwJ z8S>@L!CkZ7#R+O{mxKYsMR|O*NUPo5x$8AO9=;-?b8krX;aaM($q)qyH;Wc(9;fun zX4$Ln@8|^m35j?ilyRp9lXFdjM~*YQ%$*fddf<~yN~qy7^yg-_J+R8wOzzM8;c^I4 zvpxc#E8NRj=2@*T177j^*~`Sr&fE>J7fv`CebbZiU)a9~1%hUPG^!NmdMGuuktWK~ zP~ncW`8guLVOeZ-J>wg%H}0(zn~ZoQ-L0;#r$-V=-yrW5C8VG;rNJcMV;MC8&snOF#NvZQ? zYg*X=$^z7v|4m+6^QW0qfdAp9u2lrn_Ziyjpt^qpo4!L zy_OVbBXz~wGOSvE+cX4>RJlJqJ6O*2fMy%hW6Rt#^A=VbWSia|3at|=pX#sNX)mKU zgpblDZ1oU5u+}RQPcCv2zOQSA``HI4$XNXVobpE5I9>B^cr*P)F|UmjvBP}p2U5G& zjx;qJ<>&uiW713sBn8U9PHJZ1+l+wsXN)e<5E(#ZFbaMGIapXSCIL-a^BWmBr#+g``_e=DJ#eOupI zhe+SA=sL4~y7*CVyz=K1ec2`6xvquFvorpkK*Y=YlvK|{xW#U5zWaKxv#tKt_A;PU zp*SsF@e|m9&h03Q-S_(R)(U1!lN=v{=I`dg{fgcX@2RGwn}byy&n!-XJ)ZQTmR!!5 zCSu@UJDq%%i$_(RKW)CRnp!#dcC1eB4DnkfOkf=cG&TtvL3MT!8U8l~)(n8rF8?sH z3{mZw>9fiZluH05YbH``sJf3@$KnlD-#sZSV@AxP?vkZk3q%2GvGG@8^Dgv7Yt)_pNVz?^?P99Ioq(z4y8I zv5&n^d9o~;+ICVuh&kKV4F3N4|xgM;zj1FbuZ+^OFibT*hl(aLLNP zW3qGjAH0rCM#9CQPLtVXFenehzfwUvU*owTU)8dr(rF5Le%5dCi+;No6>_FHENZja z)6=Tk$UY42CFOh9ros9StXL^nG2=p)!+ElIj>rN>|2!s{jgVPtOLumK1nDz#BNIzE zHNW=)4|?pbG$W@4$;PE|$J$-0Cym#`=~zY@L5-uY$o0hD_7>&%Er8-WIV$!~oaINOlf=j^}eZJ~6~=FlZB^Y9HM5V#KJpH9JP+9=P9KU|=2BneF;maHz2|S{xc!8r zuq3!h8k)}&^Bk0SZr=B8UKpwlDLO5`^}_IDd981Iuua-KlV`>IojsdDRB~s;Xp>L* zzyD-tqb(uZ-T{}`zg!d}E1KN@>;~#$0Rd@*iN*bJ*vaL{?P8{>z^F|+u zi=VdkP#+hfr&Hcxiz;Ny-D4P zyaZ{LQm~4MN)T93?~}9%J*BlP=pLaAtq-KyEEHyY^#e!M&`$cS@U8=^(3KQvp5Ab1 zSZY^_6$xopr?#Pq?!>|qho>WhN9hh=oe}k(4V`x-jP9V|!M)0~K> zEB+$6%QOu1C`|`5ULs(?ZV(vv-a8r% zky-2WLqC`SG75C-(_4dfC{g^nv?AY(iF{N=iTKdQoz(YR<}hjli$|5=ukb(GZZtxK zs;8F6NyIqt_0%l(#Ps%vRJmJb7VcbfUH$%RYbjJt>-GJ_QL1ih&Yc5VDL?BU<1It! zO#^21>;s)FJk4D48-ZUjRRi*FJ~~Fu{It9S*-}qhe=+?bgpmi*F5q4cl*W|y`zxAY z7rXVPrhWT0Rd|VYD9LW(WESdN9pZ~563KmFHgK0{&|5kpMqb2i%<4jNPeu>35ffl) zQ`Tk)qwm>+L>b*b)q}^0VqC$Bd06`zClgwzL&XB8{E;9hORt z_aJ!AmyryRkr8Ul|Bl4!b(7j5ze7Cx~TTobM&D|%CL z#7Umhy|APya4~4y2xPU?&FU^?8b~z}K_sw-C?AW3?*l`4FZO~5m81;DW;@yNAYt zFVOwV;8}Ob-pgC`lT!ZgvvPZ^;o3SPd#Mf80iYt9D|#c2oav@5?Ypbm?|}=5NvoF5 z?BUmmGK^tbiU@@Z#8nphKYpBETFT{yx#=QY@7kcmH9$qvwdARcABoc&iPfvxh|okD zCI%zXHdtuY%*#C%xBSuMfT5#d0fVc177q)DQ~YGvU$&AwP#BKmJ?61+yzi~?hd~6I zu$!~}(Foz-N7FS&57B&>7m>SP4sLmW7Y@$4zn=*BiXdKjj>0RXg06x3Bo-sPHtE~C zaR;VV^>3C$a~7)k-R2*>SM92}vUgjLd%c(M4-E)P((!iB{xZ>~Brrh(l=t6`CQ4wg zu&7bF!fC9ES^Mu;HUixhqrf%u<7vuSRpdjQ>;P7el*sAp3U>lY8Z3y%Zf=W9R-xdx zX`ea$^Q_X-Q$_DuBN{I4Lmw6&MH-{eZG;1WHs@Ak$>vb@=(CB!V_hP!dW_`PAVPuQ z+KsPuyzg}{nz9H>e&MzO_4Yms+AnRMW7ld20+0K^v(5m0tDk=l(cf{|;P*{pL8&SC ziLRgh_W239*G4-LQ^mKfTT#0|w19i0x=d4sOU{nrtr*l+UGQTD7ca$P;r9Q<#t9-) zZ!e4l?zyy=N81v+Uhduk-Uc7viIrfIW3-12V1(SRmEo1ryO-7C5;Xb9u7Wb_2j16O z>+8TqT;{%wCMQh0U%39frsTcg`?~_5v^`M)F9E{`XniJf&*-8RoXSgN`By?LH=*+W6||})J_`Zla29+P zPfVU2oBRi+$S?dlf0)4~NHt3JH6AWJ>;f^s4M8f`qn3oJ_U@ZiXk)TbGKk}l%W#{g z4jNV;LDGpAqeMI&x}RVg7^1}tit2MIJ0F+rU@CYdcs|8wh|a#6BIq9=raO`fT39gK z)8w^`z_>uUa?Di)qLKK@1GC#^`k^dgh0cY%z2W}HYRr{C^Lj`mMfP2ILwjV9Y4uYx z8kvPM2MjidC;SWx-fb>f#`ce%xN92t779|48Cl^++iPD*{%$c~E5ee~ef{zOOd2VD za8=FKTq(GcXHq2Au`q#72n7ik%en``cwwEw$_4kbbmJe9GaFSFJT(kc)@H3QA9SeX zAXQ^k+rs(gkbT5eAWIA`jltzLu6xNZSbt7PNQgw5fF@gJ04k*an?42w8w@(H3@lTQ z;^BrGVdzmPv^mTm==gVzkg*=2?wD*eLnr7bbr_OQG{VL}papIX>?`=pYLqIWtAdRrJUgxhN>28fBX&(Qjc<@f(uLR$ zJ8)PtTKB%Lk=X<}^tSwy=d)2-(YqC`pd!XpkA96Y9H-f2uY8djm(bUuO2KT_*-3qT zw^DR$kF!U6gnIK@#qcLm`Ak-P;Z$48FCY7<^W+Kyj+;KuaHDnvUy}vTx>W5Xm=1O>plOr@@42a(n6Rr zq-Tbbnhx_v3LScnJlNh2)yM1&8bC;;*0?YBFS=b8V_g<|w6F$nT2X{Pd=2XGP6%Yg zOZdfPL|wfW40`4L{^kOprViP(ae8SXCe}P>F3u|U?}rEUr-&Wwm~Htfo!nOETVCg= zaMj6pn0yMlG=ggLPMcVF^O06yQTl9Xsn(%RyYb}7wLwp6d*5^$E4D$qp$}1PtRmxn zbWNUf=Hcyn6NA(J(=R=inBEpFCfd2-VDQ^9Hd zf$YmM=o$1%#B*#&0ft$#3{A5%rzdB3x**F8v}4MWK>;m*T50_dLLTRzxHo1S4S(yF zxTjXpdBlX9LbMsxR97BjK-8$q8{4aE3w5-?$rFV|jEJdMmWs+`goozJdba!$)=2{J zeVp+dgE7>dS;5MK`?f6PzLDQ4f%!m`$%JDh6nbK@yH0HWVKwKx-P>!B-O)TIia^{QOIgV5F2 zWDnQS8~+K{3?z#sEJZHl;A1^vIQaXBA*`E7Ja)USjDuSOJR^YSCSi)%SEY^#Hvp#9 z>Gm8{8U+74Vj0YcK`g)FEIrg$p>F3yF%(U8e07m~F7aJMbrvE^e^A#;43WdTUg1f5 z$BpTjB~HP@qI3%OA&Q0qZXu{5|6Yu8)5S>JYH@x~yT(qg1?Nc+hX5a^$8g!+m1dJ6 zQ3VTk9qH!^1n^Ly+irKR19Vo~($WtSqbogJ6o7m}lnx9Q=8~O~)F|RVP162lp%=%l zTL)r8Fuk74VUnXc+#63peKV*UH~dL_7E5>DRk(Lu0(CM4FuPO<_1kDGiRznIUSxJ{ ztgj?9*oc65Vg41Jm7v$eHS)vHjS(p~??meEww}5RwV=$a+8x!NK4)PSU9`5{V|bM$ zc-$p05t2xQe=r`m5W{MqLdO1hrG(%n$hr0XwiN zeyRtm%|9gF!2`_XoVI(afvIO)BL>}($lURP%3G`5{Y>5u&T~e`Ji#3i*Kx?XTgy%5 zA>~$Yke%g@otpfUrYw|@@}U;Ol#?`btt@WQdaAUOd<(268PD<}_norY=dYrzo{)@{ zIf7CuAR85}P)5w%QX8FDul{Ls_4kSBaYTf7j3Fdrtb5{h_&D?|h!ElkFgf>OAmU3> zk`1IV)I;GTb30d0mtQ?O(NnXJ=5rvb=x4NP@^8hw3wq|BNmqXVUT2xz5c~y-u+N*A zpFhza{Z6WE=z+H-`lLK)j44F>@2X_X@w&_0MScTLfCtrP;^t`aescE?dlU`WQ+ank z19hU&#N-`XWh`7c^x}+p_7CKhvhKUs1Rd#Y$0v{9Of9PXlymDL!f?$YTUb1JN$9_U zT3wL8pxiYv6-QP96Z9^b`Pd@`qZWJ?EuFFfkh*vZ(*KcxIMkprwisLyhK>GUA_ypl z9a$JYA*7y8Iry{Nt2ZwUK&QcuaBM)<7Q=lSyN#&2e%E)L0G}!qROVb@s>thbPKSGi zEJ5TI3?t$UAxM=OFHOB(Mx;$q1zUVxI8T-(x{7M1COQf54&(j#C?-a-I%T4@9zJwN?vDE z6Gp4v5ZBOSSg5f{)g!(P8VDKyI;qfxfRe5t;BvfdejM3ONDl@*T2Jt@c{cwU{u3JD zrk#oFcl;72!}OpUKOzCpji%_M)$>;s{x6p|Bb1DIc{A0-vuj9egWvDQ6=i>SSUznq zbS=EmtTX(pygj5mNb@t<$e@Y-T?5@^)`tBNLn6Dx;mvJ2nk2u_Ibb0qT2TE-F3$Xu zoBb>!R7@@!HU&haJ{g|0)JcMrg~gsHLqkr{x*^veYu1-0j*^#+t-sUqfHmDz*2_z? zzI;=l4e&*+&+n7>1Jr60Okxf=P}T{DVnGKj0Zy;d=4F zx2ixpKBa(1z%$vxb8LL_hl{wocPYwnY4_#HEN@Yy{&HMRU?}@M*ux^|HzU0?373p6 z!s^2CTN67JvRSW^dW-?Ug0s*$Q_%FiJ`+r(!CQl!;-X8R1IDeV$MF6Vh>9Uxw*D2i zD;&Oe0zYe+dsiR#Og(&elQ}O_MnXXP^(+SOSaDZ#Ed({Rn1*KO_k78q)Ns-~w7wzq zP0=^k0^Vtex79C=H+pVj6CvFAWOKhZn*r;8t=rV90;=TTu5Yn%vbDp9;fNJi>kkk%p+J{6P~4R!;h~Ww z`iRf5c%=NhLvo!^DZmIu_nrpoiQSo~Couo3*IQY(O>Lz-M8oY1blCqYrsXIQVR>*K zFX2JH|9ZB)`KDJRwey!YIVcb@{wd*oxM}D6BDyul35MPGVJSB?FeK=AatcWL4P_}d zw+;CDhg^ZzqnN2cQ%*TH4!P! zgV`6TaTnPXp8?wbfkz^sj4wzeVnMuG#`cMWyRENeCvIr`sPNLj{;O#njJt*B+x=NK zK+pbg{Jid>ttmMsKkU_v%AZ^!foq<_TDcoZR5uz^^wn**ntJE)40F4TZ4`BMw0^E8 z6LvI{Oe!KqP0h_12CyX1N9q#f z=9SFeTuq1N?5N=5b$DEmCEH(A$8O(-X0Ll3;R>~Cy$Az1!6eq7 zMY=>z3^?-`$Lxi++I*`|$f-n59&x&hmE&s3%vXum+#MvhgSmub876UDhas~<;qaqOT2*T52e)ic+Ts&Xv*X8% z(}gR8Lk-?S-_1I^zh*1Imgl$DOFe=ilL|_9Pp!BJWCQ-y)~=;{-%2&VuW5lgw#lY! zRM=2W$&T-3=O6(HS>1drOOe*BF9;Hq)f86vbU1c(UknwF&{%Cd*7&Iw4pGjtWVE{^ zsAdjQYukye?>u)5XPcnR(+}zTP#KrBAu6BIIdP^ck-Blx>qCz=hGED3(WqpgQMWF` zoqU?7LvXsbrwJ?LzfZEpN>SK2rQpXXdCU?M|M%*^2D2n=P@q6>k}w+bWKDf0vbJ1{ zuNm+cLGdKhQ!0z9oO#`pgF^SDCv@00vi>xV>1D1321o|_z&NgB7(0aLt@~?CNUR+H zaIvfF#h{uWN9R&-O`cUuOoFiROU|7iXTN=27ae1)_rBkB?k(OLz18x8E0GchGiRM)xY8S-2@UMN-#1a zJ@yUvy_i%U%FWy&o)LbwC`-cRb*_^Y1DcY*$&nHIq;=&A@`uG1ecU)y>J<;OSac~O zrMn4(PlreC*6s`UQNcN5)>PtoLHk;u(RhD^_5JS)y8q--u~=UKD5I?Dy6f{Z#PT#A zwSPdry5Z!Q|41OUWJjOslV7A1H!O zdT)rXnNj)tqU?1nbmUe{C7HnPlcl7iZV(rK>dX=GF>e57TwA)M#9&aXm2B=mX&~2Q zdd2v^h2nBy?v>TMTmCd!fA_B{3bjSdlsg!4jEbH0&oe08bL-6D`E zsBx`qe7?ZqHqybAd;UT$!m1Xo@e171#QLw$y|P#3B6Oda4JdkElPlU+i`4WH3Jgm( zPc(?%mD3&T@*~X3y&z~RzDSLG2uBfRb&l_g792}p+7<%dO8E$^7hknn*b3^xAu_k%c7B1ZC}Oi9 zi@hKU-j2l(1rgMF{U=*pEoj;>LEMUaUD$r8RsW#;~Qx6yRKOL@UycZN|57etWxf33COO+z45IAb}(`O%* z3;VyxShLYH!N!y8b+siWCa6NDe`TAO&i^ubiB!qX)v^)E>*HZ$wxsLai|VK#_YWY1 zfO?V2*lAhIZA{lUW&!7(SO0W<%MJXe>)ZCQf`wXnfFkl&#K$|jNp%k_)*RSayF4cy ztHM4Q_g8(nJ6s%12<~~_nHadg3XbhZEx=BLf~Z#_*mzh`+?cwxKa*>TEsVbLjkIJ- zjFDp5Dct|ST`^iMK85X$y0+@t#yO*c(|4n$gfyPu32(M@gpbGBWLfnJ;zU-7!I~p0 zi;&jv!RLAI-X%0+R0|tTR1|TFdBr!}uh)Y#v4tHLHNW-~zvotB2%*)o_4esQ3ennZ z5;e}yHwex6G`bYmWde#+GA z3WE6aln*eu@7(vRN|6TZmB&B7*5?$yuM+;9{ULoK?T*;c!)*Fev1f;TGmbfNd_}Qb zdo$8iZ3Ur74IW=s5Na2_Es4V~S{8sSTu*61E$o*KMqI*Xy~O}0g@hp6h#BClmCVql zQ7Z9Xorc2|BwJvferz?A7UAlo{$iVo^X#jr;>OnFRr|Pj_-}P00_$VE56*hio9>)~ zrh_Wi=^>T7hcVX(54?Z(=yJFcLoORB*JOP|S4uBRv5s=Ci?pMjUpc1`XFjj099BAb znn_F|OqV0~tH`NyfBMfi%fRDRq6L(0yA;}G)~Un-6see&j8 z)>B)HISVj)cuNiyB#VEQ-F|iQd@6_@;V(RkP!8Q?hI;e)d@M4KjU;^BT%3LvMO$0L z)gHHaV)5vxV!2$J@pc*4C@pn7=%g}nP4V>J$a=E3=epfYkjkt-^k;4~wGuj|ebiuZ zB@&68sHjew_9VnnNG@Y+NsW5qF`6r>4TEGFdiGmp?|)H3t2(KxY~VAP zTY!eam~j$eS-@N&b1~sa*AKhxHx)I!1|p{E6|$q3o3&`Pm-!us24PD*EV?l?x^b6Y+?(0OeRCiT5~DufQ3lB{*>*tt?)#N;t_&k% zZu<&u4ZIDl_K+fVh)7B$ghludeb2f5(zXAbjt zfrq5F&OiSaN`t3A8lEvdU3hhSabDQf5T&f7?)%Jpev)`4Qn=Lz5tV8?=SS6%HvMxP zmZr$m`o=b%dlb?@6YZoXTm@SSq#X!p)!nR?;gJ5Zu+&)~FSONv}NJ^ z-ahN>ZR&eS?jXO()t6Pbrv8F?IhkC;MUqRQ+Nx=3a&LZjM42r$oQQ~MdUM8zooza) zxf15&EqwIDW+qXq9xsx<(Per0E~LI82X@)4TTGY<-bM;>JS%d^x}gdhw7)yhE1FqYxVgM=lLG;=k2`C7$)DhtU|x%P zBhIOfzoow#KkuDI*PQIAW<*CX>~erMm^x!?c`R93)*hz*)KvsPpN|f$RDMyMTj-ZG zyU($Gr}xOBe>$f;p_+8lq1t-0!KlwhHa5)5PfPt3s)D?amEHoTT0HR9WI)32eu>XP z#U^SyQH^hO8+pwn@a5RR>gM#|_;i(*kA3`k{>O>ZT5GwG?Hgog$q!>i%W-64eIt?{Ov!SZZgq#`+^m&I<=VRPzQwTBRp3}CuT7j6!g zmBVox0$0b3^dyfdUVWhpNlt2Dk~3*IoOVmPma&p zIpnf)bd*_NU1YR?y*GW8i3ST|g^rO76>nY!7cWFl%=Y+ftP)NeRNL(>9|i&KuxyV| z;do}dG94W5Zj6BZ9Oov+!nsdC49=uC}g@6v@jc5BF z99C`T=S7XDQwF-})?z!$p&4CWN4?>_dyA;&-wf`1G4xF?Dbh+BGMW+Oar5s;jf&m$FdPZ=b|`lepdwUh0BM7d*+Y-8QY=~_8f zc%qPJz-_NkbFOK)M$GLIulerWj-bOqP3-5rZ%wpm1xs#;{!Uw~F34dTuah(jC~k$W zQbscRCdt4*X2Cx2dBU38YSPnvG=EFEF09mcPejV`sv!s~keKks@ zGa~vkNTdxFGu4EXoC%+470O2Wy6wH)ZG}GFRW_1Yrdhp|jf>-RPf5!o8|Km7Mmp5F z<}M#@RC8L%ZC9u{vn&1>;wx3GwRSCoAWio*lC&F0_2lN}_wO1S1;0oNq@3XGYpMuQ5ZR#?uCLzC!6Qv+y~UMX;LUkY*!`2vj!A zOwngOI4L}9afn5yd_B3M^5-vv^)n+Q$NkBP1y z*P*o!&pvC1Uc%M|?hGje9D$?~4NAQ=7%Ths8a;%|+Zi>9f>|s~SJoOEX!zIii9`|_ zibP^R=V5d9TaT;uD2d(ls;#b;kv&n%T`ImddrQO&%ur#PTBhI@WT0Q@I_=8hOPDL7 z`w;~DBgMb_P7qOV%(f0M>I{}SIKqc+EmB*i-H5-NP?#5B&ey>=qhDS8#IpHgczI!0 z?p~0WM9uIg>)9O|NEYhO{oiHgXya--5jLslW24}468`#&HM=wj)(kj1?X0hnhF1<^ z?lFkq?!HE9#*+&A8uG(kzY0}1T706z;sQqs@Zs=HawJHVt@19W8-fg(oX8=>iVg4w zGtk$b9Y`vUCQI!+<&oRKPcX$;ojY)9IgIh$Oc>1x#j2BMc#G}b4$bj-+ng<8nSK5e z_VbNh9`7xT-E2R-3KOc z61@f=k|-VkBRcJs4f8lVYAATT#m2H786#DGuHX@;J6Yp)KC~_dRMj>u?41HR#v{>U zg;Q^RO7Hzh0=~b|#zZ?3G|OUP+_l1*uju@id_5@t9$ra9AEaQ&lxo>23D2!5ikiT%v#ieMj}~SsrqaIG3`{~G|_mZplK-m zL|6IHdunP@G!5GuO~Y%xLkx1&C*y0Imafn@Sm16irc4t5znkP z>yX_BRm%o}jf)TK#oUXvvQv2$EIc+Rc|t7|6=5CfiLZg@*ur`jEi8wge6%k4Z1=%S zvy^sEOVjyMlVP2Hhf&6*1*}~W&#oTX~^Xa4f>Ww#_he>2e zLz61J_uV&6?jO$YKhs(6OVz#UFeVY3Eb6h>VLh2Dot!MX#08xtsK`$VH<^$=o-{F1 zp)K998K=7skIl1Bn;0mywk$U9?$@+@c?C8OobA!0s>7tPQ7W(V1udLsHyPl6b{aV` zmB9{o^04PnrNSY;dp8q^7E$p|K_hxmpIu)3sl!6sP&bUvxN++nMB3UF{meeFjSk=hsY}k0{0=(_yeg~i! z^)HPN4$aC=RM)z@CFf=J4)vpZ5+fp>7kn8T9a=pv%eI`@Z(AB}t0>%eLTI{sICAx+ zNpEnBBG(}&-=EpbRr_x1ewH9GhMWXJsCTd*ITvgdtlviuj^?atzZpFoHi^N;Utt45 zP!5c+THgZp@D?jmz}*yZZf3SY)s1G0#O%+Gy-pFbMdy1q;n@ZJUw`^obEi~!IBBi! z-b{a=Re+GNOe6_cSe5V z`IRl$wAA4!?SWYGUHz@jX1`dbTeG~a^+e)EL%t?=dtBpcZFV4`y%~|os1{O;47*gB z=Ee-wRc^bv=`B0?x$w`!&Zq2OJs=yg8xtqX{8Kc_gp2%%iAKfgj+L^iPVUy-y72az zjE@y`$CHqn5j@?=#!cKpp0kdc%#SXpN*MFt@8Mxm$UGW7mxBDa6?jvM7iI^yfN2|( zD_p_~2P+`ghRRdyKKtF9byV$L#ywf&D{(6{nk?IB*;h{UlZ+s{3F7#N)t+h$sl#mTgN=PZ zr#@aigF-ur`%ty$^Zv1^a+Xp@;6dW@MoyF#l@_2Lcau8cE*AJqrTRJUW#uL_2IXn! zsB~1eK*Nzq&{p8n{%!iRq0&Yjt)vjS5`GdaoH=mJQ1ijP#|h4V_wLE^887e0$B4VB zq*Q}1PWlKD1lK%J05fvlWKZc;IookHFroP9yyI3bZI4oPyFxbB+N!fxSYguc3{@_6 z`;o_4{RO>UKLUXjYF$hDm4CFxwwk|Gni*P}nFv>G&Vlv27H)FJ#aph|ar-6j?l*ZW zIyJ1pn%|~n8Te1?@%EASg}E?3VxO98tgEm@aj4}mHN^opryZf>XcAIl*Q8;(te)#b z&AE+UbUd^7fQT*Pc?IWbRDW_Q3PC=F!=Iv{XrfA(AYC91@Kol}O&LkZQL391K_q{4 z+_QM6PsI+*b*QpY`!Kn|8L>*=SnXeLkeR~XsN3?jy8!gXBB+Qco!1nsn@*G#gD>fb zct;?77Ev3o=0YB#e-e#_= zLey!PmV27MBn$)yn#ab8#l**&=X3o((%uC-ox4{g+iAlD9kYzafeqW-NIp4qgE=a_ z_L%^4={6*Wh`{Y6Z!*K}##A_71VDjIBE2i3!dT$JR*#v0ZRP;B*%W=kXEp@}-?j8H zspMUXtiRi7d=c+Lk*_>Dg^chr+a0-f)Z|A?F>JF&B8qe1%o!c|&gN=C>19eq7VH!t z0>=2_*iZ%3&LC>O!9h5^$FmQ}XBxeawro0c}pq5YE{KLvXa5#PV=$M3m57eol! z5Ra{|+DUsWDhGJCpsp#t$_kRLb1(n-HOoad+at(Sjb~QPfEA3$ZnqtUa-1;kb$pDl z<64C9s3|HNJ(gcL<$%MT3N?cIR|O43)B@RpbeB*P2YC)URU<^zWxKXVv0I)}y}djq z3;}mbaHMXltE)%)w~MR9fg@ZHmyh_a`E86B6oNcV=Czg(D=3EykC(`H_Z_}lU&l-iMM-Im_wRb(RB&uG8n`@LMm==!`Lf{ouEg7gVo(r(fO(l|P;DdKa(=osx6`L(=BV`%nV!B)@1=trtt_)WLT z57l3XD4i0!R$EYB=->J=Lpa+qd@GZisN=dXc3h|bMI1MB?wQW$sn;$ z?|at|Z~p!OL&}$pRPcqQE&ox zwk*6t)str*EHes-_0CW79-Vf5pPH*J?}7XvCjZxSd5-Rl?oK?*=>;KE8xKjw^0jW~4!ig;PdI z3|U4H=PwR3JJM}7`9%7kPsn2aUim3)x9+0yxNVhW#=AmjV6*C*(NUw8+wJ$;jar3- z^=?jrA5;~;x1mZdAABf{kZVs~_{mOCG3nZOBNDdB^Fak&7VA@Z{4<6ND%0rYYX6qW zRC4Y56lJo%)k>$@+Hw-Rp6;WD2w*fGwa<(3A|9f`Rmuc5 zKPm5wx~dprk1RSBbf=rOmi{%jK2A{p7@U`U@u^H=ex^>r3uE>*_s2n+w@AcK+e0mY(8$c23Msm-6 z^Elu8(m0}fo*|D6yc4oL=5)_jiyFtz7vBoOif+gvJ5wa5I)`VL0C0Bs#+L9g_iooIym=UTQPpG~RLmK<54-{pT_L$7w#UL%hghG)SeoqOSbR zKgp0h5JhNin3{?Ej1|vR|Z*l!E@Rwd>;|Bl( z1d|@Fa@^PTsy`pJRk!yGIWc(zJczvYZL^&9Y0VFw-msU{%wi$~n+$NfpCjxc0m=c7 z%Lrap;y)n%;TaOptO&4(QlLrSi`{-rX975D_qI&o8>;$Ok&WJ`HsD99wanesN{1Q? zBa*F9#7SxV@IgwWgyg9j6gX{jW0_&E#_bzv2Swn@>-JphQoegz9X(If5gVB|Q1tsf zsn9`}$h3}U{n^iXir#-LDCdfjlJ;3whC%hl=>T@fZg00aSt=c+ayhUxJF~vLCf`=n zZQPZBM(QlG!kP0?i^^3O%WOok5lz?PcAzm`MO();*8jLmhehZ6Yal{w&06ewqhV}# z1~5y+X{BDjdqwWLvs^>0%?KqV)?I$j(1l#WKFMetlC&mvYY{c^L?PT!Ur)b$y1d#; zOU2zf#M0^0Kow4SD~?fxbP+#9OfT_9mKSbvbLuj;OB}_mo3P~t{2jQT^C)$5dE#hJ zy;(=!I#?E#@$Oc)ZJ>>VjNN$f#n^_H+I{FdDoU=u7i zml8<8ub?mE+fw}S{O%;LgaZT*#F)>}zU%T88jDmMaL)5cJ2(N&!+`(%jtA|i%4tpZ zT!s%sDJh3UfLEPJzp2 za=Qh(aZ1fX^5`o68{NQPw*v98Y57Q8euJpj0%WCF88N@`Kdjfg+elJ5CIC|g*nBg1 z{U6@P2B#K2{D!^*Y<2m8eawTqEMNEyalabjFyXt@J@_)qj6?j|02BMF?pkWROPC}A zd?KMGrwA$%bIM+sfB-mF1jUAK%!5l<8{nh|iJbuqe)XS5d;vHS`DM78QmdoiR3}?1 z;7}@*-oU8yynO9V7H}%pVh|K1v~Vy0z02nfsRl6Tpes z0=0Zu=q2&kb|vUPY}y?R#>EK2h5ukEG2>3}{>H|+oV5j#9JLZQ5B|5qA_VhF;G6yD zr4m+HNs1>64mJg8s{h|E70BI;S7Nb{d;`$TV8#O~fL8Orx!(Ep0r8jMd>{1`JgHJn1Fu<;)NiAN#OZ@5v}_!x}i z>Me6hq`6D3P}!ySuyir{a76~|3%LMc@g=NiLjE_jo3g|A|ff!$M+ z85L}j>EgsZ;VBqZ1X}>DQVu9GrT5NvPjC+xMqz+T064GuQu9g-UC_7B z_On@` z_RD~$xbVMl$n2+jfpN_L+mJqah`i45{BhU$`FfTl&Kq`@vlCnmauwz7@KMk4Hfz((=Vu6=qh=I}MX(Hr;=JQ^Ss!-P zARnEi{z=lTf=O`XZO)?w5Sv`|RAP=&AWxVhYyxt~NG} z{rUq9-;>{4p*Lhh>=X!?&2h0-@9%=~7JwuxGdBL6iyYI%VevWi%j&>PXoly}Ze_^1 zyGl4_?XxAdyw<;o;`9IyrmV}noA#K?J`jU(Gk?jd*jf=N3c(d0dNLQ@oy!;nQYyd& z11k~`5QMX!;wXEzz{jzjoM6KcWgOTyoWE#p-}9lTl#fYi4#-Ol9HUEOfzf32NgCO#1Cu!SrDGUgE#~Oi~6ch>f~eg zRZ9};D9^xM+@B7k`eMS*)QL_Ye-f+ezCxb>QkTyR20v`xE$Jg_5Au%S93Ry;Vw2Vk z8c2Pc{(I0DdrZPBzR373_VOZ^9>|XMR7T{JfGtS+=ZzYHU<;Vi_NCmGYQ6R3G&DM? z8QoTEyR|kdMK&u07`TC8>Pr<8o z@?Tc4J$_D~HZ-1t$I;Ot>HX?B-4!y*aQ-B&%8tytnIMvR7+HS6@_Bb^(f(ymM#ejD zy%)1kx9{dScLKqT01tpmuV6`e{L^&=0dqjW?SJhxMg=ei1MGSP_#xfXz26Y5?hA>+ zI1m_52Kg>b`Nbk!=~B-Io$i=zG$+c8YiX#uP%3_iX#e z?8R0CzzR*1NQ;eS6O;2Vh9l=! zinaP{PM#g4!3I2%Yf8)?96wTya4kQ1=Ryjsxa6|3?(-EI*LQekhiqr2MPgf)tn$i{a)Jl88KqN6yaxXgv% zHK}gkw+t~x7p&*yYo~H8w4B^u?$9bK;Vp7jp1zgq<%Jmz!+TPY1hD*+KJHM5(Qv?; z3W)J)Yo*XDJX>*Du&ygzC>2S}ZjfHyQ z*J!)-&e|)DVv6cyY&}`hZQrL_iQd0Vvn$JNQ+BtrOPzwpU##(qg!t~a_2lv4YB|o2 zetwIsoMsP$`(r%f>(75}2^Bf7jfObuA!^`2mde*@{g(NzMMBxbIAF^n7b>m!uUO*l z7fNi+uhjzlRkmBT+dsE=al?3b&GwEyR=^$N*_2t%$48mel~np{f39pFeca#m%}Pm# zOD(R1HI9f4m0MOyNsBAXL!47|5QlsBss(_=9tHulXl?6Pl~i$_PbE3_A_w?k1iB9_ zL!gmd|AP%jUET-&1rJ8Yi%nvE0I%bg4R?+2o}#sYm#OK69r*+fk~T`aPogx=7sov} zI|EBf?p}GWJ0Bo~9bGN^`-S4T{rW(kcM7vEvLfT!**&$z#haa4&&_O|-G0^O@;UCC z)hvM@Qb_8sba&+e@5K5-IvJwkQt$n3k{QhN8}+VSx`h8m>A^j1A}o&Cy7Ryzj->8s zBa$lAexg*#TV-BDspT_CU^KE;8P5@dg6T;n{>gEvBpY>4bx%#6Wo0nzUlc}v-8=eGcntOHaQE&^uGDrA5)Mc7p7Dh_!|Pj)Lo8k z_7@h|p5WnCSkqVe+#$1sVs;n7Uld;69o)jRejI8y4jaWKe0T*s_dS=?RQg`K!H25b zW&6HGgq^ux{TPLtk*h5ce_|NI&)a}+fV}f_Pp#8!3maqD89w}DY61jsJ}{8`hB_Y} zpOqrz4$?XrS7YBQrLs>o>w2v-95N4u{TQ216yuR*Mvc7yY+0=_bArWC+oC@YXP63o zGUmgzpq@pcGUI1vpt{HLXGg96Ol14YJnn@&TH}6r8Ey9dEcmgKLDqpz4(1z=@lB|^yJkplP zULZ?TRbF~YpXxOi?=OrfXC@UBY(4gSxfO$*fJH%49KRuSF{hQ}U$6j|B9 z+&%hC$uE2EV|3pewQxwNS5mS)ZBVwmb24{|7oqBD77@l5BNllrRXWuRXwh7Xv^e~1 zaX`e9tPv~(1itBa{vwis$289DN1fkt;Q2kl4X4g~K3OHn+d-s{fsyg}Dg6%0QPkT5 zrfanaOKew9_4@6pYM?3sDZ0?Rn1AyI+K8h_p*njCL(+zLuWtKSuxcGnNE_dBjnkH* z+fhp6JfG1&7^y_v?yCdZ{uFh)PQks9_35_Wq9GW}GM}+Qf`CtVmM5pqkZpI@Tc6!lu)kE*rT`&Hny z@UH3qENpc+H*jq&FQ~TKCm}cYg?0VP4J$%Ib?&_Rcm|Zy&c9KdJ!N+IkJ$MClP7i- zew-e?z1_-cw=r-6^QrdQkTX-+uK&1reD$~5!h{d+4yQjpzn=e3NZ?k*A0}(OCT$02 zwn-@2ps874F=$-`ur}ZUHkwV21soQz7VZT%h%STzhikR{CbpEo1*+(WVJ@NgHrQ z9k4b^?3ml>25BxpT4oGP2a#e3*4To!*P4Uvg2B#(6RSBvE7f4iz-=-HCM#g$we-l= zTlWnj;vwFHs#l0W_ygoGaI5b^Ake4Ec?GA^xj^|AY6h^gWC|bNf~$3Ka0mLgZ%5c~ zX|~tkS{1II1vngz!zH|aKYc*`HMpx;)&SStz`_M?0<@KxRew047MxaL>KhYqyX2te zd`N)8oZfI1SkoNwL$VBHj4W`l&+1Xs+kA;N`Y66cjv+Lcm|HwGW<_?jzy?G&1FlwK z0dQ4KuzSqvzr4*~!3_&=sDcR4Dq9>bVOw6a3@NOEriCFjm*6Ip02eO2>d4-@KXJo8 zmh2a?j*JLn>o)laTH&2AUfr+7+_?9xI}u+rzmvv4FO#myjU1ISfjh}D*z0ddl-g}?tegC=FlkD#7oH=u5=gjVzbI$A@d^z|E zI0@B*=mD6Rm;kpJKfu8_;H9oV$^`&`!2r?#0Du+1%)}31W(B3UK%@ z{2@lBB7m_6a5FZ+@_!u_6%>`!FDj}lToPjJFR7_3ssaFq zUo!oj8-woUp})bbSq%8_-{2!OMtMd$80V;T^YQUimzT$Q%Q-q@ZzJWLuxNRIM^E{S zatiVQ&CC9tj!qs(AEDbwR}@A|WTm!ILB|0fjFdDppm&#pof#1 zv&dy_Ax(dEf3znW>EkHmkG_NPR`=Hu`HQ(a1OAPc7ZLi4#K%KR6aveE zhSA&e=o~8(-Qf+kbZuCa(4U;zgnn~$yp8qs(Gp?Q{Fg|cZdf0zw;R^;pUnS@2L74-mmdC6 zh;dc_nfxCL`!_-u?7t^Pqkn7RFIl{Obny(){=1g&HV^Pb%EOV~SYMnIQWuZJ_=t)K z{ZmTyYuGzj91QD>)DpS$?|8_yYbH3X3+fId!yB%zBLvaCrhHLNSsA1#cky@qp6W10 zgE%|-I9_-3VG#W`D9}YkkisSNe;5=f(aJ zpnL*^Onx_;&_%h63UbQ-p!IV@GC2HK!4(;I!ll0pF8{Ae|I+k-sPu36|GrX1Aw`CT zf<=V>M*N>@{pCt% z1AjE|M+1K}@PD5M{^f)tF$~Y!kKtk;ECFQya)o|-utJyQ6acC^5ZDp%zr6aBeS%R# z&j6)I=I*gQU;LpHdN6Uwnc)aJn81zoAUAXwBNPDOkog@awD%DO0052g!Tt6OZ(1XS zSY`po7=sIT03SfX(aGEMs)@;szj*$~-PXWg0}((k=r^zbNb)~NayT;_bjC=Al|iEI z=)} z?IZ&ha{V{>_P@bSZa6f9hH>QpG4vf@h75nD-$SZnNQ{LU<0!(|1OVOuI6xnu0}uj0 z0J?x{0A;{MfEr`33;+QX0dkBp!2hKDZ{7j`BLJ3B)`_wA1OxzZ02II#;0Evk$TG0L z4DLwA(S?CWGJbae0l)RnD91?u(yO=2CB?r`OviKp0OrwygYS$sW=Q}5_G1qY_Ff$v z>}N8@d&2<0Tg<=8V_yOQs+$aa?7whg834eEFaV(9-M?_RlK_Cq#{j_DAx}q~<6re0 zX6z5SFovw_xd6a%YXIQ%X8?fR=5IP<H+{>Bm)2v4Ehtc2Xuyx z4j(%7`_D*67=LC~X67SDnAuraj@0^)FfsB0%%_eDvv6HJ zeU+74#MF_8S5(o=>waAPs~)fp+}t98@TQc?cIK?uB_-wCIBy@{#H_NWRXxiG<-OzL zDyrA6>smR5W%5brJL4ZVzgr`c`X(fi6shd@lWHzgj~KNIFyuLO_`gVX_z2UX-(oRx z;SBki4lz{8ewdm0DD$DiYygH(r;cz5Uu3>&dfL(JD7T0r{C?c4H$6N}tD={5%*J_@ zZsX#`z}GUVYb@8zAC#VH7I*SaD4S4znDwsL`G5vEc9>D)sl%rLmjTm2c>0apdjW3` zeFRADER19qve~O10BWn(yIek=5V$)syyHT=;y?Lod8R|D^zerZ+kV>Cq}cO+r;)w4 z_F;eI6A|Ui5_5TZIk?PFNYm>8;O9M^Y|S+JY_B#$mimXyAKm=1n?E@vFXCpc6+@eW6HvJB>fP533n z40EEBFc)_TP3K+M>#&oV!S?_xxcsHnMJ@H6)JZ>oQV`u{fs_F{6F?uY3bY`Q;3}x> zgnCLtjrDr(`vz1R&~qU972ZZWF7(^HD4Wq)tZF;`PHsxO;eFeJ57*Nhwl)L()j2V8 zyb#HtD%zf8@>a-LT&gZR2+|u(p4=IJGcTyR|Mb0lJMLUQ91&mu)NI@8B40+7FR~lM zV!l4`znQ98^4%*av?0V;1zPTIuQ@osKevAOgAYg4VI5U<=66L#q5mk+q(S%spXfH{gG8fwK6%=+_w6UF;4 zJTA<#-CbNb@1;+7;65H=_Rn_8tG1D_c5OU5e(J}in^vN4vMX|i(e_C3DM;&=UEM+viqKt9hR>Or> zcRmbG*kJ8m!_Sq5YC9vHLNaR8ZkmMf( zXG<+!og1rQ59;r&bcCuvRFZsE_pG)CH*BoCTGzN&f4K4o>MxA$bv8!XbAJBu^iGW( zxx`83b;_M{^=We9LseqONCN|Ro%|0IRP_U(O%U+pMb&9tDRaMvL*MPS&-vd8Mmq_r zm&PZift3g-iFP2>xqXE^;tX;w z$fLV_HNN>!-^661dVuAt#YfhkGI$IHN3o^}Or_B-*j}HF z1IzOCo2PVt56{VC-^BI$Xu9h8bAlfx=boIhI6f03Cc_F9ZMmU03`dBGRmDU2Mr>Bp zK5+19sGOZ2SwUt6)z(V-5x2?=&8ef8J|!9&*2;YME2Z1nKW!h*C~&bZKLD^!*={5t zlE1&cQ={D>0nOA2-EhwHw!P9(pI|x^5d3;whnP)LGXW&TN~G!XwWeB3^)Hesiz%2k zyV1emlp))GyK3veqEFSdt%V?uoZ%(kkY_J{06DI#q4@72+Ij~$3hPx1iZal1bpzF> zQ}s3VGW>u#@t)-BNOvm{+{;4#b+USSfj(!tKSUqx7jq|XMMmqiolg&cTNB2`wT5VMu~^j%VB z-{5ZT!*t-n`qJ%&q2&rK#XS-I2tEirD1ZZ15q}=Z483YhF#00OZn?>M?ljPG)+paE zEpelNs&fp74^C(li|ilgd6K3ogIFHnijS`IwWU>R5I+X<_Ep;8!{gA%$b{XNAz8Zc z2XD?t3SZG7uWmw5Dtf2i1{{gMXq9Hrnw{51mo-nBc1@W}9Gk|aBjY|1?=3T^o2m*#l*64 zr`hr}s3rF2h>Fd3!wjW1RLf4MC`gR3-1sXsq2JDpHuSxwrdFX|w|NOxh@l-FI^UnO zw0wiwIec2;i>4_-=c-@2?e>|l$5(VB20!16RW#snEf15l$0a~P4w-dMNN&n6@l4n^ z%zLk-#ak1_eq!}GeQASj^!S)9$n%i{K$tPzhd_q8^bui>t`BxaZO@lUL#>z%_n*`Z z6RjOYy00MM+0$ZNoJ^mvD7{OOG3a76!pcK$v!aGxvxSe-zZ7qLvw#8COf4>^rES_q zIqA;@(C8LJ8~c=ofpH&VpYrLw&DUbCohohG?$yk^`zp>9Y$l>|SvRm>LmCrA|F$E~ zyP>zbdcR~&>sppsa1Zb6&!Q-f{EfnG5v4G`sIUYskJOjmpytQTL_aaf9$R-FclB7Z znXa9hcsodA+F?&zP`&j=C4WeAUU)*?+%$Rx|v~UriL@#E*!CZhdLU;oF&~XH3rZ)n~i)wOD2poH_ba(adVwex(-eBb+(t zsFR`AooTO@{WAbpoxfr$7{{UisjnggcDuh~!K14T$Lrh1*(4_*YN9UIEYJLi<3VTkl z2oy!rDa?-wHfqfwp5;FukDeB<=&vW8*A*uzCZ6x|zZN5`pQPFx4>K6N=|7kPdu^1J zSS_hC9wd>{5u(v+h&Z2iOcvk8N(#l${p@B_N*j`tT*Ah^5z{A47dnh?E}vlw73UoB z#+im}vl&3NA~}W26J^DK{Xzn#KcBW^Yd6J**`^gEG5cVY9o=ILlfSFh3TzM5#f-Hq zk>h7Pa8@W%r0rsSp~{?PWC8S{vOuCPfwnD6mImHbU3hT97z_zd)MSL~*hi6zy}v;$ zFOiZ#?$v_s-I0$xSD)>R-|VqWoUI)HQE>VuMXB~a+H}uy`GFtMKm9YwwPSGyf=xPS zb*eAzhO+2s?NYy}ms7I#u3I~vXm|jKRJ5)G1=xT}rbG^r|$h8_-_#xGYWrhYvDxQuJ~ z(M+u~qDLK8>3I>RUb&{`o5d_xmz@EJbGmAN71jJIdJD$ZF2Uil11V`OThv}Ixz!%< zsiQcO@ME21I00Z}3$4DY3K+jeQmrnmtb9!USw9en*sAdwa)k#M=LXG;q3={Q6gz3G z-YdKI2tB^kvtVw>n^*TGjNVdn#JuI!`60KMRU|-|q)z23C5QuOU$Q7~qIOl2`);kU zPLGV_fdlkb?9SON;j68&Ms_*p!536ywBJ~k{TPw#l1YA0^jsbxq5vBO3QB*fJ+C$ll!|{ zA7cn_PXf5wO{jE({m7TV!?Y>(>D4@=BHqY^S`>EFVZs{NYV4eup0fM2*6)`~$BS3f zBdQl$4AIT@>Ae#4_Y#R(TanQ=w{c}aX4wh?uwOI{0zDZ9yeTxvbloi4z`3a(R^CT# zC`IR^9U9sywt6km0-sxMXAV>gSB%yM?={Hl;;G=^6D(R+0|wOfKDgId7rpUyP%U>5 z)n0khkkce5Zreo~=zE|BwfrI!SHTLt+s(DaonUmTv$tXZGdD^bB5$~Nw*){h=H%Ni zC_5abA&LV-=03awN@xlu}@!uW&OZl zApdT6s$&tJT4@nPM!Wh9#?-ny(TX48d`4p*=R1yp)Z?2Zf+~8Hsm=iUtd8w8;sTPC z`$D=sIBmz`+ZfVjD=t^6oQAfiOS+bYd}=D%a{)pix%1^2^>#t!?)zpS+V++1@%~ok zhG}WhUXsn^@R{?{eI(rzLaO0u-wfW}XBN93s}{cRCFTz7_H=kVjBTUT*9^@~ym+!} zK5l^)_Z<(p(C9mi!5mIGS~n4z{>YuWmJ6+%ZR@P%v?D)dO~Rp{$_amNw9u-B`6%DX+PAZ;K^*<2lPLV+C~=n`RmI~Sgsnrg9_O%G+? zt3|D>NMfKeuyfF@ZEO$Yac-}Bh6|*;w{pzKvaGx*n#};Zu{m9Z7S8$Ub-%N>1$emK zH!(ZWFOL%Mot$tfT-r1U29*0o<||szfYJhY&*n6`d>xr)@z{(in%LVSV5u^B&;7Nm zH`1R|yXQlE-J-oI^BP%!mO?}-uak1Qx8d_IChN9tz!;0@Cd8W?=C0Q7SahdT`$(Zg z%f~flfkp1J#WYp536MXvBUgeB%RK@*!)cT!R1$hhio9Kx)n`KCn#G173;${l1Al(T7QCz}v>M&_Ehe@}RITGp7) zRD;X{nW8wN(qwl*<-zW^A6r$urA3wt(e+O%uZzqRZ|b~jag$oRVs1NaaOBm^#crq~ zd-?mpJmV6tht?zwvfPp&*Ff6=fOkQUQcsPE_+;sc)#d&vFIB*BfvL+slglnHs64dH zZ}gIuhXEdC_a^&uhV;Kc3Cm$9MD={+1!%&c6w{(d~$M*2zTCKp4b7vnHE2j zWoUdZr#6~9!5mqdSBc;5>Xow!C0^V+!va1}DjC8kw^|eSzpYNkGgD-M@q1krkE-6p zp5!<1VltFDD;W$hAX+%FNi}$RH;VHNk`|W+I%)RLP$@t7BiH;&EoXA*^Wa6lUYQAK)v?SPxbcjKO!+oMY2=vkl7fZ%9Wr<& zy4NAYP;14f_$Q?242J_ZW#*Jbeh>c#Y=7@*UeJ>G?bUU$Jj0k?VanFMW6X*7?sqa- z8p$NQ^UxulInE|it)~uJr*&SBA^s4h+IV#i`#F7bs>Os>BVyJ@IeA>;_^|1r+4_rIec5DIcqS`6 zw%15|4sklXd9XV@)S2)=|7f(nET^yX!U2H2wl;uVh@Bsrr)p@d6$<*}2ZI|+s+G}NS~CgiU%#-#8BC*Kl{D@=&{mO3 zw;uhZF^235=@Ofcv$vf7WKWidknl+|v+yWFA-xpSR-aN|hYpdatQ19c6)G4dtir0h zD?H9Bb5N+irfeeb+7IYCYF-p<+A$dzy?MBfWQaw|=WMm4ZRI^hJ zJ}U;&wQu?IJ^Yg!VkziK2Ki$PO!J2Di=nEPp|(5eqaa`)D4QC*guk7!B*5DpO5T~J zRYq7@Q8wm_bwj@*2aV?T!Cnde^3OKS!Vo96V%NAjE(r8?=Pg($qC&g+&t}8S|c6S6=lX0&SrsCFU=zaij zY=HH)yb7WqG6LFoM}2Wzr8)7v_c>3}I^z|IYA?jz7gR~aOA=L#1N)HU4G_fv!6l42H_o4K99=rMANyV?Is>Ql-sA4QBPngd{;Qf*%63o|{ zJOHyF8KlthhUVLTJ@tuQW?gt7Cog>^J^?DsO3fJ&!}x4Mfud# zhLkck=fvwHE5y;o?H{As%7f01iOz5T%m)5_DpXNW@)ZWr+gfj&;QDN0IQ3V7{kV;H zS1QiGgZzEZEZuhU&ZMZik^8x^;gsFOLi?iN3nL)G1Hd>X=>X6^uRW@DVHde|R6gG) zd*p&AMqqoX^t{*0Rg3&N-mjk_Vz;UVKb+(tWQe8TQt*0kNz5gus3AJ!stft=EpYhO z+NW&~G=pEX#sOf_&4T%a#gC2yK*Hgsv0o+viU)v+AlF^G`TNjsp(kdK2M6|j{l_G( zN=&%h52$WrR?!Q+>iazQS@S&Egv)~2JZF2&nS_A`n$I#&_YwnCfmvqzNn4TqLB(Am z_c0Ub=@_1CHJ%+X;Vl7l_dC;32jq>9)pZYRfzW$qUa_yHUVbgSM+tE^qe#_|Ei5x5ojfPaSil0n6Sd$r zS&*>?`pJq2CXy9y_D1N;eXW^}4?|8Vy~`u97Bb@`7IZ*^ z-OBgi28mIp2&;0GArGZ?Uhd5b0ve>^mmsTjrV>n%|LGuZ9h4hMiY1C`@ zv{aj#Hnz7RZJ;uf25~9HLfj!%X_D_7xZD=Fm#oehj42hAodwpsCoBf^WNYR&({1r- za9f?H5FKjlRS5f+2#RX^*=MTIdD93KVy<}(u_TckVv#(%Y&1N3p zL+2z%2Vehk%wR3ZmYdT`R3Q&mJ_rBEA;oq)#{6r%kwlc8Ei`{J>2s$*}}R` ziaOE$YRq{E-25v1+)b8qaj9^UUViiEhtVVmS*hRID>1#+etxSyopxry9NyAiI&cYY zH@^+$G4l!0bd>?8qO=N zBdq7z=E=^Rl{VfrwuNaUqz4i2^+@~NxtL0?c&lkNIxCP;3QO{@bLsh|l0%MPme1+c zc#NW+v0lprc~pEfYxmA5vyyiwNGV%qTJ^$9ixq*UH;}e7YW~N_Tk$)*QoS{@iJb}at0WfnFyC08;@EuXDnl>f6 zj8IBZ;;z3W==dQUKNRY9b9up-TNSD68-+eqm}FHj8`bG`*Wg!Sq-FJ{%>lsT`HfqQ zg%IALwy8=|V$cOi?T#Zs4#u!~HF(Oq2}iUm-KOyp(II+Z&s(T$(ev{Rv(f$#0y~be zpSa6Wm77!kE#>pkp<-jsespT3?~R)$vvWeeN?f&po=_O#tQ;y%DD&+TS2bm`)N@I_ zkeUZodqo7wK@s0@#zD0jg`Ysw+1oX~!q)nO7?|Ntkc@a2xF}g-k^Zgx*_q-JUws}* z^u(6~KolKw<|!^q>ti-P8Z-@*o;Eq+eA4p@IOh;yb{u8)y08y^_t2JvSDr>DcFmJTzNOSVy74^CY2%Q^niw^NR@tzJj=8&0w8*N?ugM`0~3 zrXf-?Dw089U!F4KgoMgqi~i-0xV$QS{+d^uyiAfHxft%H4fj4;Ck3E%GPYDnl`Q!)0pfNvY|L#lFOW z)l#5OCAV*Sc-V%PN=4a1 zcbkpGrWAZpnGtdPI$l!od-q9;Fw$FdPZf>BmaoC=aaiY`qaY&+e;lG6vPajO8Z@3` z6Y$S?&#HN?WEdR}zEUf}adH_&JZoMuE~a*hVM$_fpN6k|Q)Nkf$GuuUOU+}M9a15c z&(#0YO&9*vZ6X}IxD<7;;Ml_JIq~4n))it+BcUED9^*3E3sTBn_fwoNz|ROn7?~$k~H*-UXLzf8Ue%ZK)Th16h)1uVk&-SDzAzsv&t@@nV?}GW>p%(S0XkPC z5PkDj7Bj@IUe5^X3S@q9u^4FWQ3_i@n(B+o=8d#xOY9MB;dA5!>~LJzs@csUrC(_S zcQ}5+_zI_`6&Gpg&iZLWhB7iP?`&MvaSkOKJ?g*TLmNt|8?icW4!n zO@_X{p?+WD(VEw1#Qn>cdNkWcKQWeiY61%|cSejq92eHG;DZjF2D1rVOvn|iHI5do zNc6Ju2rGCFv^O=;d>{8f@uhc!T-dP8RJaAu423H7SqVbsAL7fF(*!>jfv%q zJv5_KQ}Qd4C`H6P$6xF+Z|2SCmxK!sw^MaQz%t7fYIW8hrDse(__oYNZ+fnO~a zZKw4JUgrCOa3if{`xu9yc191nK1_~>7v|{>Sr{GP_$4lL0C+4Dx`pZrDs=VYK-h1B z+H89<@xz3#N5%!(#e}t;vmJ%}0L-q(bscA0;|DrIi&NIHmNo^d-RLIkJ4x5e4TlS( zYMb_MB9!zhsy@|stVzXuDT@6(<6Nouy+;6DJ`PChdwJ=zD~|bMY@)3=!ejsr9i7wN zKP{X)JF&WH-;<23wl3~`S8kWz72Nmvl{?1@IprG3u72?SpnOR)oADc=M>5h(8b04X z`5K$HD@{wuw1IdBL*(1{uVD@4JjO#Dsy#+sf1YeDs#xF@s0z|`80RCtELtF3$+c!< z$xPM1^C?5_ej}6|NsTD(PUt!SQ0Bm^8;x6{3KUJ~U{A)&QF`OmMz-u)!VAB_U^LbU zp_CrmV_0hEvl%f!vyJoajg#2w9qA|?){oIQdm=E;`j+j8l5*>DM>AiUKC%|L{La#B z3#!s8AZSP9dG7h{D6>scfMNA$n-3KT(%8Jjrg?|TAHJ_*ZCnFBVKVmPu6mb$M4#ko z#w<_x9&i7Y^2x&=4c!GApq@I_`22na>I1S~e4XtpsfAyv?H+bM?nWy?b9k&SMOHH( z3v0W)J{=#~`?Fnn8WUbIUX)qV*nB)FORn-G4ev{}Xb4vG9*Ujv(>OG1qhEqa#2adP!=!QIB+{SgW`+$nQn4ktRYm z_)PCJ8!=Fk_?5MwOA&@1%*tQZ`@xj0FkHOtqRm@1rmVOqxcOMR4!&N62zQu>vIQLg zYUEZDsoO350k8W=l2|+a<{Znh>KXgfy)T0MHShKyyrTn^CrLkDCSQ?3-GSHcl;(_a z4jZ;wN!w1h)33eOfoSG0>iqyiiJX||V6eXP*SwYkK)8(lN+Ny6wW8&PIU&m^-=W;w zLaedHH@8`ORN{0_j@#&QNy`y(4Nao#g?7JOm-~IpLq+vw=U1@29o? zjU}Vlx(jifckgsPXu&+jS>2upVo8pj7&co?PIP zSaG|JgcI)$XhECf=CVVa0u8tX^F8VjDD;0VuMW5H4d}YA3elG(E$A#NJYi8_-w;W(Fgrg@GnoS za>}fA!2`+>@q_ht+IiM5cs@ic?>($BnsFK2)i*LKx$+DhTN@sIV=mv;^y5>L3|pQ& z2!bn7SgxuET6#jNDG$k?MsgoIw5^jU8Az(xEZRRaa+|gHK`#Hf*A+!u?%T#G z2rY|p6eVc5PjT}nFqjK7u=sh4WLb<~pJYcuzM)Lx(?7?msoWGL2<%?8oO@UD-f;#J zs5CM7n8cf8NBq{iUyM!L-3d7W)HOaXY*0Vv`a~eW$z-gUzt_kkTK*PphPkEabG<Vz_C%k@lrui!#fr=kqrblZS_Ae@0?Yyb=DuJ79hk zFWSy`Zc}5>D9YB0XZo@w-hR3J;$4=IT_5T0lyo*zd&;+8moS$FFE87xzGyjWg&B~W z8@WpwrHsLCbaRHX_#XNMBnd+I_>6N-ql|_4;IVtD?K+;UrtpCBl5Xz2&jq~el>DTu z*-%3eDXwNhYB%-8nf?O>gL++k`Dm+oe~PT zyOCN`>o(N(`ezBLsYH9!ypZ{KOE=uG+!A>%=yJT zy{xd46e9Ef7axj4v&)o2Z%nBw;bdf?nvrgr;LN}eFG?$_pY%RYR~q`6i5F-H$A zqz(XS)^nacl9ni?;ZxeuV`hbn)e9r|kjXa_Ggks8o=xrbu&eZ13j~~e5hht^>oYnB zv7Rf6){=^Njuuw7|S@F{bz zSKbJh17*cZnB4*M4bZ&YWQ@3Si0LM3t2m|Tvw8$kX`=y5yFI}+wM<-Mpk_pAk=}28 z&cgRn8x@}zZ~ViK>^!JcSQ))kK~B~{w7==<-_GNAIk&a1x%j~f`xF?wT-s#1NX<%! zKYhP%Z-$I`m;Z*uV?Am)_+fLn?iAQI23z)}v~No1Psrkb2;DpvX)~l$R9{6aT3nNd zAr1gvWi(YBZAI*YT!%(j=dl?jdwm=&&Q%^WG50Kh%?TcF zIesBea?Js%b@WrfW6#)Of4@iSIkXT?DWS6fo|6etv6n_=c#vwn1n%>B8+#9-$yNV| zA3f~qPWENYe_3?#y*h7Gf_!y!`!(+nYN53CgmYL1uD;e40Ic@^n71eq8@M`e4u5%7D7s0ok9mEKT&yyy z4OE8nHm9D@7*e1^W51r|)XWw;W62~0L|%7ZsV0*oRRS~!bB?`<*iysg$G(Nx30YbPd~5ELD>eZZOy%fFl?F{L*QSrX_~&%;e+}Y{ej2jBhZx&~?r8{RZG*ao73l@Tcc zC^0c7;p+kOVO7ymDo4}PFL;^-u02{d{z=#e7f<*EUQQZ5VXsinSb&eu$jNxxGyBWI zQ_H`3Tk;n)G&xjKKWiuC?dBxMaK;XB7xg3U{Ilup!-G-sxVuxibGd)Y|Iyzc`}uSK z{CR%-d4B%sKmPQefBc6({?i}-@sI!fXZ-MI{Pbu1_-Fk5f5!YlQ!1+ZNtLxz!xy+o z!yRVdq3d^jZF4QbnfdxI$6>Fvi)|YTwL5xsq`RY^TK2DAH973uyc#gztu&p!`?YtV z13msw`p^o0em@p>?W+4#1R_qH>pVAufF}Yq2rFr2Hm#iSj!&W) zzxq>VW+|9@T5^9fi4QhUAPABdG;CVj)B5|PcqiHL9bwNgguE}yc_eOu2XF(`4Yb9a zxdo~<8;`pD)P<~~mz`(mU(vv^nVq?vk_2KNs>qBXXFm%)*rUVKO>TPwx?P`Z^Q#YrpTa@5SR z-0(A}_VaCM_rQ(Vu0Ny*ORo0VE}1&1j&~W^@-f z=ma2l=`s;fqvvcll^^ueYGl^VRm?p+b^|s2T5~3<#s*u)BqnguJ3g((CGoN=D{Kjf zv{$oj;58lV*$?#e<2jA+N1yfNsu%Y^s9i?LpQ)jn@e%!-ciV>ihw8Twk`3Xq!>;zR#FNy4 zUBXEsHQwCZ2=F08tG`~gy^tVOG&-_<$!trl76z){pj0;AkN1)cS5FD!C+~v`$nIrh zXVH~*PjXXyNHPWpHZym)AB2VP<4V(OC)Kw0i+=5kKkwQdPj$}Xqhu#CY--y*efN1i z#{D157JNsJGlf>qrW6%L9s)OgK)Iazxp|911z9px9tbW`LhR~FNP zGD?kwtrV+k!OO8%T7P`ZJ^;9$g$BW@infR@4g3o)pXCDeG+OL_*bn}AbNJfme_`?B zf15>V%N1mDZFr>?AE`X#m&cmm<9y*-WiC;&ZtG|I0`lrxI6(8G7%uUcQ|P?;exl#w zpx3Q-18GYuy$+q%wg|Nr6)63&a}Fa#;lHi+&$mYY5u^Xl)t&zpl^h-ZoKb!A^4tNy zEr0W@{ILGm=B)w5!}-mQ9m7U~$0w`(#h(s++&lpFyOG4DQw_>V|>l_nGBZt~BPkzJAoEkCfm!-jIxmhmPf@D7?DC6D>^Q-)r0~Pvw=jh>sXr-Y`Betr^T1+@ zGUQV(S>J3Bq3stW$tDCk}xjXyLSQg)byw2*S?Kbx$?y7 z3zcpJRRn@CrXZ>LGHuRit~({5w2dTVqi6#inID`E8WK^nZca0_ZU=o4} zkNFk3-xj{&GyQ8U%hg}f(`gX7yN3j(gsgeFlwR^$(n?Fmgi>uoZ=j>RT_tl=x`OK| zAm7D7MmR;m?w8i{`_Z9knFoMvuYHVT#nR>MD!-2J}~a4@H%gMi|B$zB$A?oaDV z+<|UIv@XAf_BOEr^5~Y{WFi7h-H42O2rjq zQrEKk2(|#^zN$H1XPUW)3R$TCrYP|^cdJk}{OfmvD{JXGlP?6CAZAVkobb7CH(Yb= z6U!MB`|qnp{Xxs}s*8ouKs zO~sG)5T>Xr_&3afF+~2TtlCFnHFnKx4mB(G6CJOX1T-csNqvDL{V%PlMPQFK>9$ap z8PMEFp&sw-+S|!|$M-eoOst$cY)Myg0k__%8QoN`s&s2l?xxZ~i<3o_WmGG~2MZVK zEHwF5boi-VD7?+Deg}eRA4Ig$wU&#Pk{@tB`TD5%YE!M7l=|{?P`O^?h|BP@_t`1; ztI`#YIh74RB z8%pbw#Ik_;b}8tBdW*#Pfu%)3<97y{qT@4R14)(8P`ms~$>`abwhwpC2K*W-ufE5G zfPaMu0Sv^LQq9dQbM+Ga<|o8?2Y)!hLB;3n-O61t>ugMDxL=b zBWoYK)|rseAE-0jB*pGpGk> zYMp+w9jGBwyKCu{U!oaD zxlu#R`^RPOKH$rchYH#~%^p1EL$X4Rl~>Ajw`Z<&uaklt%I)}O_?4zcMf?qNW|Uj7 zeLa)2bgkBJo4>wQ@y-sf-h?Cor$C(C%vC2uJ)i@HN4^J{iRQAOjq;5*jn+%>D;-dV zfShSCU6}?vO6fLO^2xhf>EF{dyJYMZBsK%ZgVY#N!8K?w%xl&AbItr_Gur@)Sc^6;_FC} zoc5wP59x+xuCo+SAC%tna)6!lC{I|29(w@El=k`cNJY&uT;ARe4?pYZEnpKN|AcOwfL63y|H(Tw_iM$TDvH(~H9-7y%r>xDCQXTx9;gu# zIpL>MAENZQ=Rc=e2l5C^3t)J{+c3Mhk z?Hk#vPkT-&b>*Fwr5!e+m%rP#vZi<(mkCbrjs_D*H<8n7!hNrn;g1M}(l?KS&U5zl zz9z8_Si8E=5H0hG6Pq)is$2Nl(dYlOC4YP zTDns7qz*d%?up?$OH}S4Tf8P|Sol{>%;`C;l)R1a!QAfyZ}JzXsqiN)N0w9VRtd$Q zj2}G9ipmPf4a72DioiCzEAM?7v2w9ed1!@Y`9||HD@2?>Ux-m~9XgF)3dTc~+u(JU zruqi}dBJ`O#nd-om%M@+9${8;g5_e)0bsvyrTAGu5f_wzYR9zKxhwCC4KTh701_XY zL(t}22Gor{6sQgcjBkztt8Dze-l0sKgtW`W&#;zoENe_jVZ_Lt+3_djSVi57ExpJy zRqa?q66b8IXLcQyo7PAfgxhK&*}f`Jc*@$p+ih~^4BC6yriZghoH+g?=vCDvWi039 zd}L8h*i=eK(z(=uWKd2}=Y!^(0i}#1Su=}7*r&pA^GjPL5nXD-rUMLUf5V!0ZkDVVTv zz6pu(Y*ALDVfyQGD?h4wW!I1l`9}9b7UMHn0_7PG!9-9sLhpmtneCkBhvLR~DdgA1 z`+`^=Dev&4j{-7489?G>(9N*C2^q^2jKV9v^@g-8Lk}!zX?}jQ8gaZmB8&^3Xj``w zAZ=P-IW$r*zv3YgKY)PJU-^%F3=VX-+<%-Y$7?8?b`@1cUp8}AE!S(Z4M2rVzv{;K zFVU{uL|pv<1oC%PQT?OkS$HRZf}p066-AI-ajc<*&&XmMYT9@Fs(Y?a%IG{OHz%2H zfeAzxbx|8mXsXt(-58a_x6u7jua)-m7Bqbg{aFXk#ofTi3eHHIpuSBPe&XjBg#_lIuqKRrHltq$%k|P84$r zd3J;&cx4yvI+B-*Z6${Vy!yXWcuugc(OADtHQ6Yh>56gcRC&u|*B^}_?8#e|MP&q~ zO;yr9w`Eoqu7rR*%6ulxw2L(&=G??clL5-b9dfB%FnApM;Vgf7-lj`U#*v_To3!@c zJDd2AH&QIBt3P>9Sh6@zE*=wH57_$7-+f6wWn7N&ifi}Sua0Tb?#2qjab<>Q=_lm? zuyST0&b!RoCvFusaotWhv~KiRwEk`Mw1ey-{TftT@pQ*fM_ebT5oEfR#dfLQ-K?lY z$uhzsyLfbtQu*#hg!d!hZFh}1h*q_9+|KsRPVkwB-S>NwD^1*FQbEG56dUwPNwk-| z-Ssoi%n@!?yi*qhfyY68#E05)0;~v#iHStMMSi|1**>`}dRTPQGu>FupOz7<0^byrV?FAENO2+l7Hf$AO4xJK&J}vK|GC!V$X~=9#7?w>q3jx9A#iy~U~J%^ZEC8eL)VUxEVL2w({gCYSa!V4dITdCf5C<)=6^+v{W-q< zgP>F9n)ez$AH(~P`YaZ2IaI%CT>M;$V;EdYTTcrY9nLO47};$s6cwlQ41HX@`>@QN zN4rl0;x?2AjrGAK4qw%20*<-XO@FI4{1I99m`(PC9v!(MMFR@47+=v1got;{R-+G8 z#3M(5AX;741o3?w)Zr}rUOvxcmDePM!oxIqeb#+t)N8x@&J>?jI17tY0Z|mf0&{0^%D%q$4h)huig(x?N?amU2eU>|mfC}$!KYqpAM&p~5msZrBG6|xL zXZ>~HT`>tRZ+BJhZ99D{MkXz5tr@^e5y-0L^ zJz}gGOwG%JZg)mU*D}TzrURde8Odf<(1!ZmJY-?!l?UZwp-!DzN@BWdLK`8=d7FCG zvCVTgy`=Z;FcOajRakT>9a;GPr;ax2*Q=7FD+^o#y4V#ivOO2*n~5uO^5u6xafvNX zhA7q=`=e4as&E*8|HmP-!LrHkKOih^v+%(ac3a>+91c-q^s{`B!0hih2*X=JvRwMR zq3B=qH;M2~qCEv+a*1rPuNow%Rw6k&)R1CCNNSeo*!4RI3+cZ6{AJ*T;KWlB`21ZeUp5R&O zErrpagC*(^Rix3SB0~_e)-*1(4>n!1+l;VtW>bmwY#iq>sFfC@e9Y zLqY(w&`fM)=kOY2A74so4^g~|();*b68ZcdHPi#6el8%r_StLkFo`>3)CZ|oq0(|G zPN)m0Pub2wK_aQ8wTPb4uYFmFPC}oxs%kS8(mmW~zkSyxry%`bOd^ZgSH`j8Mk; zVH=_xZBP}zN9Y`1Y3nKV*{rOC;P80!GzoS{QbGd7uWP@>sSo)`SGTdYKh5I1Od)vOP5Z2^4SY`GuEg{LIw0l-K^K1TQ&N|R;{2r!CE znc7n?alyDCXNH4EuyZBK7T~6|U?=!pBB> zpznWm(Mfy^Uq(ER;0j0>QyxRb91}Lv4bF??rX) zN!V@lJ7We@%Z6}dxa=D%@6Z*4ymzG3dU>b5egE6_X2Hy9&1uuJA?jUHN;Bwj-!?51 zMj#?b>~3Tr#wioUDY7`;fv7J#=Dpb&fs9VL;@EGNSVL%-a_1jq6OA?_HguSHU3zTw z1*e;1Wjrvvq>x{A%u;&OCM?r&mVJnHxvIo=ckxRlR*YVK_(Nss4TuH*jZw>5 zn0>t5(ft^dJV@CFUqo#~`yF=is`Rw*UvQaT`eh4)xCP>PNfXI4irAaJr?m#eaI!X> zxn->aw(sv8(v3~!eIZ20#`)LN!r;V-7R7vG-wlDAMz-xk9kB3dp$0MQ-KtYW?*K~v zR>S+jVC@YJGdutL2KlO=2Ljk^dfQ!uP;O4Qm8Vca9+x^bjl~1(jjo{qps#ntw;(Z% z8oJE}6HiL01KIx0cg$rxhvKS)+qd1udA4rBb-od^QCL^9U%_>S=9E{3UdbdjwkdXj zmbO6gYuS(4?j&YKkW~j;Exej;I&P)vQWhknm&!jC|H$T_+*1@eKG7XBOPn8ah}zDr zTU7J)YOwMg^sT*538omFSIYDy&da|JDGOH9{AbP6>JVj2W)rO;XK4ywyR<~F>rhm#D}0}$md865VN-H z$XZ>&?2IegT^Rxckq0d!X72lur;iPAJWIW{s%l-=oz7%6$!rh*TdI#K29jb=i$Pol z57zUq3i%9x5?sX{K4q=6FS(G3K|yx3<0>~@#SCm}<>;?1aIk~~j)>dAB?Z2(_MSE$ zd-4#4y`GiOg*GxY-}T|vjzTmzW9VUX*HAbWswN}X3VRKiLlqFzbklgv4D7(Rda%M) z$9h*L>Jbpb8!XR1@ny)aCvc(&&>VJae3x1_vq(I+m1i7UFtQfn>jr;8ikfZ%CVx^(ysbI^z)Ke8K-SI_#tO~U+4>N7 zZ03$@E4pDp_auITK)aNur@9`0@Ec~pf#3A=WSH1l1gA6kWYki@0(;&A9}};7%+apR z`hPuOZ4=XP*Sb-qtXvG-UY?mlj;|_*Wk9-rb!s_f&Nap;I~=EU6dg`bN|X)+?J9p^ zv_5R&`YrTdPrY$F=2#R_o$+A+k2;-g_Y?H!{b-TMp6$gBF%ma2Iw$ow(4$t-X*Jaa z*8!(seB~M+b2aS)#oG@#It(17+IRYdR^w=&I})UiGWf*Y_Qd<0a0|rH_M2j~i=@!E zMN*OLnWkEnu0Qm@pG>@EY%Kw3S1Q%sqVT=;$hN}q^RH62AQSKNucbNb?$?((9d5jU z2MMJS?F>T-l~!bD^F4V2I#7Od@zEjv1Wy*L^hEw@ABn89ketx*u8)nQkJ+R__$F!)vlgQ8AHl?Cl{+d7Je)hFb}i7Inm@)?u73h@~_GL!*TV0 zb6ovXw@@b{$jHk(5)6kLE61Etrw?8o9F_8XH8~yJ=(FBPmD&mW^)E*oWs7YGc})iK zhK{*hzTyLEWQ0%2a)TRvdwJzvAwARoW8i;(E;=-=OY^Uj(9K$oJRLZh;^4et!ea3^ zhtEs=%hdn-On+VR-x)r`e*7!{fd&49>vH|w|KQ(Q;Lq?stOI{U^+#0yfvx;Ueg4bT zho0bfWfa6>6z=qIvt?U!V%LNi;rB1cK7 zZ)$fg)Dbp&FOYotcI+p2Qjd`I`$iD;r7`vOiGEEDK*v2w$jfn?eb;j=_(>vO!OZR)Xo){>h5IIk>udZ3CwIWc+W86vM{G@|C8 zTge4IX>Ow%32$a6>8#$>^uOQgd`(Q5?#J_r@rYr+)Aw!6lDJu3^S={{NQ~Q5I$Av8 zS;%roIJC;WlB>EsvE>*M96=+855~|ho@_kk>;#K4{Q3JI`TWt3Kl|g4efVP^|M-Xh z&-|n4xU;E~WXeq?5dB>9ZRClv7B`=R;OB7oC(`VlRHF9n_6ueShtF~q9H{b8qvj2@ zyMd?|Kf{7g_Wa%OgMq5-dQk3l&=GD(cPJux)qnMBkS8_wYW{5AYW-K5JorgB0i?+Wc`CdT}oB*=umkN6G&f2AE^G@uBbT zja-I%(IKZiXI8>pkSDv{=#P^rg$(la@!s;*y-6C$Ex+mtbR=*d_=gM>om8kGMUVrzSF4>h?Rnt>awA6KpVO{PB zRCq2&jowt@6wz_?Zfp5B8;rml>A?9kywF*Kd-1r(<>vJ_dQ&?#36^4e3k+)X?t^aK z35~z$1TAN8MD$_LJp9_Fa#UIaSzb#`9e=myDjD?UX&%CRj$2+xARBxLEy|xoC?3Mz z=NRL>+RvtVZruYZ`#zL#HCnd5ud9-%X?bJy6gx|nTSFL$o4Q%ssBy4P?aYt@%oYvX z`240LsMp2u^gC5gv`7|u$m#2!hCHYj2Nv;j#M%9Z;#9u3n)I6Rmr zkE2GNUp7;QzFpjGnwk>iN=+w4<>F+%H$x6glA@Cz1X-zhlPWjs_aqK#ce!eR)z2to zsroloF9mcsb;QQg+1}S*^2@!F&d9)?p-|r1(Kj2Cu8>1|JJvTkrQ3cko&pENakFgT z@oeZCFq4mB^LLZc3Q1_w*FcG*UXib&!g#3bl%kQ0u;N-+t|52et?oT z$o6f8ziv|WzT1)yPBOTrt#=3?gm6raX{LCw++OIiF!Oz$tT;4$Q>hRjwu0_4v;WpV zY)y?R9BM_26<{3^bVjnDD6=@~~264_<$5*;Z-A!;U zkUelZal6wrZkj=T3vMKyk7&r8Fm#83j50kvS$@->ctc;&Jv z$S3!IZ$gSYK~-lAARfjeW#`Gs$))#w#7S+yiuRz^W)?k`z%Cd2SS;3s6NN_=|AVNa zKk%!671S9G-~9sGPqV|#(-SYrunf-iw|h4t#>W0))qHz-hbF$V@GLM36s(RJ6Wv~4 z-nuE^{Txnu`yCK_^<5NZ{_2QsXqzTq9a^~+v*;9caCHix*iW)F!0hi(+iAd{VjbM5 zBGf;CvJ)0)Tnr(;IuCUneZRR-lO|Rh1jkp;EsvUsRhlr7eG`2UDNfF+SC+R5i;58* zl6DgYzEs-G!QfCF(%L;UbZ2IJZQO;Kcfe!I+fvq)8dl3BuoE9P-=g+I;@DI^5q zV}9Yt(;Y=sh6aKYcFNSoujyufB+CQ-cHxFury85p%dFAOvEqX9D*Irs$SBbhxp^P2 zc~Y!RJv@;1hya4>Ccz9$iY%P?u+=E>Bt0QinpU(`XENkSDa!z zYgTCR`WO)sT1=Q#=3XuO*%u9@WY#Krp88EE%cqkmYLp)&dC)3{1A!fc&*gcc zl&0iCVNor}!Pc=cLeOY(foj0JkACTb{qFY6%KWAi?d6Gypdjt6NE}yZpnnP9t^}V% zD|t_v554aXFuJmI#IHTYoGKyt`T5k%W;wlV5Lq{?3XcMVN=$b`#%l0NreqTFhnf+Wx}Dl+y@iIJXip&srB?o#8foy{$RqWzmLYVZ|a<43u7@ zIVy*y6Bn3kz$RWuPO4EBti>j?#-WW3B*Sibsly3DoOjY{xnySA!cs~98y$b>Rx5r@2Fe7D?#K-t;cUza&sy`2Ub zALp3eJ4(O4S{*zAT6nb|ZV`*wXX0n2z0vYU3E+ENql+Z2SObGznjsVg<>QOZOBP$C z8s#==wTIWX3X1BTWuN_l6+*T0aTr{dPLcoZPKcfV@ai`%H&JEnQSF%2 z=b0BTyxV&rSX_Qj7F_k_xcKH?k+8^tGsliG9RDlMXrn|5>H8eXonhO8Sp}GXnR(UC zK@l@(Im>kFBEkZp`t#19a5%6smV7gGU+tGXAyzIQ5jESRIMay!^u~TswK=ArM`748 z<9ffxTbM`48*Ohx@w?IUSaFD#kpg*q^P$DjxXCQ95V7`PVslPx$v}17kg^-vXv0ij zvg%5Ds?$*Sn=amt^_!ISg$UH?m&&Y-z@&;(I}t`(G1>8Kd8pYfqa)72KnE>jQdv1B zPZ|Lh(itGAnSF+XDO0c=U9I#>-&Z@mYNwsu#K3GHjBcp}8)sKo-^8MNZrd*t4#V$? zDI!12ri8ESoy-sS4{(?*J+5g)R=hmiykj{K*|>`SarB~fD!Yhuc2FgiXY(G^e`VZr zP{ShoN=G$IfYt0$qqNcDdt(xM0lG0~pOYt_W5?OY>g1M@fc%m0j-y6O^X&~MY_YjN z+nwaoLdmE{evv_d7JE|)Se%fZ8RQ)PD~EFQ)*fN)*0?5pq*0!(YVHQhuUGzRu!z>z zo&44sH#3(7x?+z5zd4l(d7@M`e<&`lh z#>)13-QgwA>hMGU;pBqRR-+)0(dD1!T+)CVwL^`gDO>y3!i4vG97|^~wTmn&#N38NgvrXtk37BKl32f zl9p$8sp)05zW|ot$ugZdEWlFy#97ff4ZDNBiI|wwcR=y&#_l%j5CZKxqM#Z{uq3pv zlpNVL-6$9w4ayR6hjv-b5o>MAFrANE1n#tVXl%r@*K{Q#=*RZ(qv*Iw3$z@*HjEcN zl|3$G?Q2$aW)soh;)!0I;c1xGupQkxJ#XZ;w{s4v6&99Log&5ys_T%0!A1;u7sf69OVNwkH@zd0hpPk3XN z!~c3j^xWuW38wGSgs*V682DgI`FX#o$#z$edfSuE7jmNiXgEPeo}u9^%RN5WDn1KxUCMuHeBX@^e}AhTzE389%9)& z)II*j7Ytp>UkXZGHkVFTSgPn>8FOXNHa~DY@j~VNTo#kkyKZnM&vTf?(`BD-8ZlxeO9I~YP++n zL>iM|p48#uD;j$|8dCyM{95c4Ka&Xw9JF348Kigy4wu{{g%iv&F`Rz;);m%OUC`Ei zQkvB-9-ON|K;=|eo!isu^9IjQa<>eazrcqLFq}hE&pp{UGSSI}9*km)Jw__is;8+& zQZj*CW`LU*-`V2+kj3thqt(SmJ!XYkERE`r+7mX1DSCGw8Gm|GV)BwNzWFikHHuQL z(BBoA@V(%6G|=eQ(@Jx##o*!VnVCv(3r?7Mj4>K5grp^`QJwt6be++?3Fryln{dp#18QcAjBaA0feyOeqxVOu^#hL&ac+zR9JcCcDf7xy|EE|k|D zIy|j{oDgQV6D|YjJo}LdLLtm52NTaSxX+*D^zt^Ua~di#p63sXU8khTz)R(ILwWW^ zc3dX<>->g{cA*4kx2+orS>XKO{zYCRQLUSt;L+EQ@1PzFJ3BcQCL!~_Uaw$lgcT?A zR*gUu0e-+XXh#TTeE5<_-0J-ym&^%H6fSk&coWD9|*^7$>IEo9eXcRr1FNrqo(S#jIWwuxRrn?b%06cjjS79#d zu>JFII^zRf%fioLQ|iCzO3qXcT(vB7Xt(>7XCK^1dpvcNi?2U8m-AVkPH`%2+50!$ zE7*Zt??vBU?w0er6PPDjs?Bm`xhZfh%iC|2iTd3+6WG%HOn9bK;3ZIV9qt~T&;`wuz>Jdxic5)U5Tp<1b1eUCeViaU(AC^B@3 zDuR}k6j$wykIyzlM^O$5tC94&&*2KyOp8Tq{u#cUVu=I1b6OBgXcRkE&ql zzlLP&zcv{RAWvmRCbOU6te!ygB!dHfzB^yxGk~ztLF6}FRMkZ(wGi4)J3nF=Eg+OD zTNK^Qj+6ed@31)$gc8+b+OS5Ich#$`cx0b>F{H9%vUcVtu^_*$v)&jSihR`cG*5X} zel*!B;iI!(o%h#nB+p8AaH@H@nz&ia102HNmaHdfLSs%!^bU`xxS5~J)Ev!; zTTD&9li(-nE6P?F7|F;mf%&i!D(yGiWHne)J}ju7(wy-oMt!jIE81`KWg^6!tXnO+ ztF_&BPF$%cFItHDCqh~RWP>5b+9Rf%I{;*R{F4;?hMRvk`J2=lF~DTr z$S*FEMPccUu0Dli2qy$CZFR;=C=9C|{HAljyydL}5#ud98@@VDzyj!I;#p3a z=Zr-_?42Kcd}sMC;pN|aAO}y}3(Gp+C8m212BR%)N`aKffwl%wO85-n;`6&DaldSy zsy8u-f3Nl`O?mcFC{d9dJY?F%_Xe&ubU+P1p?d?BlQY~hzb0doU6khEKLk_ls(gnp zBUeCJwFgI~(`~< zrl+D>M3iU7E@ke__r-5uvtbH2+dVRRX(Fxn~*a=oA?q&X4Eeranxl?o2q;To1_htFfWL*fzP0NC$0^VHj^Fq6pqB3D>iLlNJ95)14X&R`OD4bNb}`D(E5pH5Kv!G zJ-*}#;0w^;ZRr%6le6=?S@qOm+fGhOp4{{GE5b(Vv!z9Dri;Lsb>o8f-qyC@>{IDk zt6R6I`^9!&?~~m<6uvlW`VS+Ih0^8~nVXmS2>$W3r!=6c0XU)h&Zr#_ez~!|g}`hr zJN>W{0#40v?6s2_bH6w#C7rp!H~pxe4m^_MT8tqXOjcl0Eg7l;_pDmW>KtqBXyDkd zLnSIwsq@FZ&l7I5y&nlHYMQT%Mz#Jo?{eQ#DO$|I1` zG$U3x_T{bg6OYtNAAc5#$iJNRTF5geBGLQQdjNw_X z27RR%&DP2uw_R+sdg=&4>a_w>`HX_hqT*}mGc%D0-yTKKkjF4V0b#k;$D^$*n7R*J zB_21Jj#HhaFSDD9wbj~!>JM~1lvIDw%LD(IZPM$>SDzy$n8rV|HJl_*aF|9s}zufPj@t$w{p*#>Kw`X^EW@xyI_-HEWS>?o%|nJigtpC=$+|hr?cr zViQbyvPcRM8GNE~ zIB!;QWkCwJ$;=FjX4o+q`13~R#uv0wQ_I*OjwX}M<^9;y>pAFLcUJ0)EQl(%OuhpD z8%czgnNjY6Qwf*SXZ~;ei~iDj<}>Bo9@!J+i+H$_t*5Zuig1-p`S74fYX|N^6lQ44 zr@t~6%FmC=s2octUYE+oKFI^+%lV9ipA$DRGN)rQ>aYwu+oY`GZ(&YzBH5k zGYF?&oP6AJQLG0!^;$W|rf|4@PpYh)ApiHf*~xyly|Rqtzqnr+gZQLuf7$ zEl*-n^!mz$XHt`w3$$4)B1>6~2F?`cD&9!eo~53<{#`o@_~^`F>+R^%64!b;H7=)Y z6DLCCPJWvWE!!FIqFYmTfYt9*Y2Goi9HoUW_i}WBUtWjuj!tMJfq5ML-7+ccB6KD^ z9uf7{3Gjs@*1x2a*a!YoZngf|4gUYjoc0+tU*($mU&jn#q4Yj|o&xa?oo!+mH4%w` z%}9-g2y**#F`+k{e$#c=-u}xsy72ct;(z=Bp5Jsa^N2}TXB(9_A3@9UWhY zKiO;~2pt}V8`6sn^Mz^|)lTR8N!={D%AI>B_d0a`Q6x{$kk;6XF_6}7JpJt!)M1SX zZE4??;f=w8kMYFtF+lKdOmE;n??lHRG#oL;zz2%h?V@L~000+l!&`*<&#*%inj(zMu=*ItFr#k@s^LnNE7R8jqD; z-TY05wFr*mTot74e}qYDZ3WN%LQS;G&zBr+heKN9^n8g!C-a9`FwA?&)7zKe}40wuR`Ep9!L?W~&G$K0E2 z{}|BqnC$kSy-xdYXdX^Ne?GIV4W|9VH75Mmu-e&hJUPP(i z8dYH+{}QutHCBK>V_B&nQ%`FaWOTNbTv!P0mVba|$g{Lxhkh}inUoxgZoh$O>~ZAn zD-9Go-=)*7>s^>2CXITZW*&KY_7olPRgZL-L{P9;4b(YsthQnGFrE|jVaYSx_{vnz zs0j-xg7|&2X&7{u*iO)0dm$-vf23sPVs=|1HZOzeT1h)Z?{ZQj(4eWG?mjSj$^E~+dQIwm_|;sUc! zWB|dpkNfC~thy~tMTIJf$HH(lh{m)3F@a%B|1lfF6;*>UoepMvKR_HZV01#07h&|B z9qTwV;8-^DV!#YOa=l`SnIw5I0JtTjL)@N{eGhc6T;vm?OA&q|rYu+{!IlOW<_X5H z(CRU3z2>2Dw&)MQqa}w0JC972fdH%h*L$g}O&ASj1u~KtFgUf&24;;<4kExq(1ISs zn0OEUS5Jw`DlH4-R{Whh+E3>tr-2v>oSTg@Umbb8oN3{*?CE!R|a zbhRdRWb!>OyMRQsuOLS+QS65YvWlJrmiXD~q1^Z-gDdp>Lz6shS7`UNha-cuQxh3K ziCl?!BimrJ2!9MC>+r2eJUWTZ6_@NqQRZ8opSa!c(rN{L*GHC8T5S6S1knp6^)ijh z_yok%ycA{+X!C&t^Syl33UyZ}b$G~40nMXNMj}{#JjaVGwE@I*DYsoRZ49kHI6!T< z_)&C!{W_{Z`cV^hFhOJTj7GGk?;X$YmuM!uSD(AhriUKgAKp$rGaTz!+l@7>ZN}e! z3yaFXVLq3KxqnYWNz?m*Pkz$JHtxJlkmutMw9pfq88H;t>LL(l^Vq>dW@Y=kkJRlM ziMQ`6c+ASG%Vj}{0QF}!qBW{Q4{`i9LICK35C0nh)W-t@$?E>sVjwmaCVkaNmhb<% zKj88%uR~Gp59)8{d&>ItTW&wVkj<)^FoX<{ISL>;&m48K8(_58tXhR6OLUzjTia8% zE5pqn$zt=z-{KC+Lqe~9!jB2GW4qrn`8|Gbm@tJ5zVqT(G}ufraRB!z{#WvRPWk1W ze(qCK%YDY9;O1j}RRx~Bh5H%qFd?}%PsS?bS8F9kOv`>46;kRiQe#UIK6Q!8UKN`V z&t+&}-Y)U-0!}`geaf)8P3n8B&fAgfvAF|=cV?5ii3MrVds<>oDHCL)4NR?MWt;_S32oA`x^BiMjd)U~I4VtT>N!JJ z#aEGzOU{+nWgFMG6_&p6`<$bEU?&R`&cT#UB~NO;5k0>H2LxYUo~=*XQ6(>Ml*o>5 z@8sw7edzzIp$JGm*46*1R}bzuTgus~9%ssa!A*Ebe~a;=!z9$cCR{9VJw9mhH(h;B z?0#fq?w{o8--q|OuU?i;Gp01ADjufisyzR^Vc-Vd9I6`HckA*c+DrEJ!EnK8+$|K3 z`_EtUGinO?+~S+yI{j^Ds=z0U$260p5@9zKUqG80uncyO5odR+Hg;`l4B3426W&3T z+~>YR{BdCUn~pJFo@t9|8jT5_yh*WhsT{?8Ai*X zuONSFXVcs^@8_0-8c!c$un1&c1V+^5PjiQ7$i_9O;|^9Ic(}%2E%M_iuZ2e2r&mLL z`CII28b~A6AEzm=ArKv?%wT7}L?VXrn(tfO(0FE^QNATcnAf8p0k_`Rf&@$U-%k^_ zKxywl6>|0h!9Ro514bO~|Aimzo}L%&%LQGi4Z^ch-qt2c7*KOtAo;5cB!+MKlw%*H zS2meb)jV@ni;MooDhJS_peUThFJnGMZX%$Yyxy?yyLPoY4vkHAhzx+WB!&1I!0H)G zExSs~U-wwk-Yl`(mT@zHqnTjHnB9E;idskU#x;!+6_qa0+mps#6*5ue&6UW|R6(e! zFkZ3@b&u#To%OgI>;_Cxbr-paSrMf?P})i>7?Wh-^b~E)fTU3qk&%GO?+LOn<)Mo zid6AX@FE6vr#~7HB3nt@G~4lPs7oQZZ3X@CPXjDwdEZ#_&Jnx^EnE}MYtrV;xZT2< za`#cX=6l@3AjqCMo%SoOR`x5{4+nNm1(OA@aY$Mg0=PZ6m=;Wdl%U0f^-OyLF?oK- z*}y>O%DH8%h}XD%W)fPda4sX-kI=l8Sw@L1ZJw2s+Ferb`zF^bCN{Gep*6R73&s_@ zmtwFo3L@+`OvTqN^7{-Nw@$Y%s}rgEJarU7dX=O^-a5$<=&XXiG@9FC;5@F=7QvuA z+p0uXF7cxlO~WR~dy@>x-hzh5EsIRQGMv|@G&L-th4)y;C+9Lq;CQV<`HRFJoJ?p~ z6O2I4CveXX4Y3hyL*YuvC{ZykW&}#QSlcLQvv}^kwy%APZbpqTtRb*23qfjA?5zQ3 zLk1smE__Cf(~uo0SWC~(Ha3{FA|?3An5tbJmkMP+-DnlC;pfLq-_lzj*2r?;Nl_0} z=0f9z=-Biv#eLgvn#WodZy>r5Y?RdaeK9G#$KpZZ;wovVUd(|Jc(Jb?rCZiUQP{JS zP<0=V)$4Rz`*Cn7;G7zD>A0UssiJ4!a(_}OiS1(lr{s3{mrgHGwncP)d|gscq&Jpz z1={QhaOuyQD)(fRyj)pjtmi4RFz6K<#2O|>3_*rq{6Yi2R(E|^2|f{omq%?GWmI1` zc&(F0h3mVx`ympS#C4d@v#R7*BUsuu2IFQ$co$Zvx~q7C@tTMq9y|}VH8%_F#9~u> z%5B2WL5Ozf3E!VkQX212dCekkXn`HIOVTr7p;O;oY@RQb;ih?%5Nl`(!2WBV+bX-8 zb>7PoC66JCvH85Pg}E>>_95#bG%&=T)*v%j9)g8;&sjHxiiN^JUTBB|Tv5WXdspyo z4bC?X&%gG)OaOrsesI+ZE-9@xQ#kP5lFM7ESryO>YrL;n|p#2jTU{q=|B2h11jFwa0`C68pCUy%_*iCBKBLk)5%UQ`?=eD0DKV%;r{N zD@$C>b+c9*ce&&ZR-6d;r*>cD%mc)Rdr!&Gwt=(`zhuB6 z*Sft*J)BniV&}&mG`e`D{QA?vQNu2Uxq_?_!&vXculI`#YrlfH1=5nytjVYcbgEj( z2n2JwyaCR4P)D-HL9G(w38#$LN}!6b#jFSzw%ijD9=w?bryjB6clvN0{BQHH3b~V~ zf74l7nTBDkQU`6)jU9Da&FZ`(N)JB2VeKzUt+ZC4Sj{xs;_Q;zQzV;NU)&SD zwjsojDYk&wctr&0eQ2))02X%I%Zr0yPs?G}G~CA7qW&&vfP6<%_?O|p{H*2Ga+sRr z)36|7LP3Swr8isy3S5@TPq@wiw4k%$`S|22s%dGPs3qoX$vt_}0-CFPeEvq7SFF!_ zK>hOI{%mq?gQ=x_8tgd!#L%s{GQc$5yUzoA)6Tua!X$tkPSTfF^~}0X6&^l%CP8;{ ztQ0o5brvjEYiSz3&jo4h(z|UwCGW-tz;LmcW8(*I`XjYDK7%v;De@kZYrHqtU z`5rQ*)+@exe~*QbS&-(3h{`*zt}ytV*q8IjzCOf3==$hl6#x)2MIkQh{-EYhOkQ9e zubqILB{mJ1VzX)(u8HfE3(MLWk)!U3AA|22wKl-Jz?l4NsR^jfxxCZJV_!O+cXdlj zhx2?wN&U2ua?;|g|Amx!j~T0XKfWU0uXvWsKvxWlr_rYE_-|Nfz^fpS(<#*(H7mZ>z-9jRIp!+nZl`tpf>)8aZ(_tn^Gnr+RzBtj_j?qq zMJ1pCLr!}m&P14{e_Ganm~t&3SUD-F0dE?Rg0G(_!BgvF)AcfIcQv3`YQ++rl=oc#Rrftu3naK zOZE#!ql^#aDIrVF32V|XOeA}&(Lp}*e$}?_DmaA~IavZyWjZifrpzGQ8k;C=Qs-IT zECM;hDB$bEMWNI{pYfz>^N+$Qkp6BSz}d)^N1x+?bTiBe!F3 zlE#1pv02?L`ibbBp}s)qD~mk6^fopH14Ow_=!49bN(>v)AaL|+5Oa5?P-$1A3WJ=5Il%Gwu=V8>E6bKkBc2MyZ@%!@s&_ADG{Oa zejD~&L>5XKSC!r)B)_Mg>&)e45fxR;M1Vo1^eX`QOv9A(s^Oh!$GORA`~eIG4JkEi zgsFyH_)V9oP7L(Kl&*ra8L3$Y;Uw7y`b53{;DoQ`Wo)y1;5c$1^O-RRSs` z@%FgK*C#=Fepp|^js04`LEU~E*I)eGxXqsmXt#tIvi$uwGpluGcJ7@g@4HrWma#2` z8Xb_#)LX8P54ey)ItCXo1Lc_)0oN2{B2_n#ql9HD33((|-FTXB!tCNETC~B`a{?)` z;WA`->dA2}Dx1_(4VT%%@6}cATUwkbOd6LnG$x%zwr~<#blm*!97~?h+m2_QnBv*U zZ|3$GPKhlR`dn5yY8?Z$w~I{OG7l-8bwu))sA1QtG0(}JA#zQ5z|i3 z7yW5Lc|Fn_=Tms&=Z4=-OvZ3Fc;+` zY{X9k80WMrB77kO9�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υ`5LOz7VQq*i3 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%0DwDa9pz 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

    mU_FZ9(&FJDY+=^eVLROhu*@ z2mjo^mMQAtG!Gt_V-~uk8*dZwG<^JrVR)xp?BL5q^6(Es(^{)p&OUUzk}T~nRbbGi zITkjv=&jd-xOHsjPJeaY+pBa5adPE%38YIJ7p6LLDj7;HN#ef}rPk_o`({180pw@5 z67O~$)~CstZZrL0P%)|viuv3|p9i9XkvCh2NF2T6{Pzq2Nd`dm+>hOT46fJKY^9Z( zsS{=E9?6Pf8c-i5(sl{eCdhp=-p~<9Ii82DbYJe92uPoR?qi{6$ds3ll)E-y=h3*@ zLF-O*Jgfa7LQjd)<4Zl@*H@yBjjmsTg9+xe%=9K2sLUn}%7mI_r+g3fJmz;}mNg?% zJH8lt(SnzJkGzKRD>MyRG3#eYFUC#efQ|S1Mur^{-#*Zo{Hi<;g(DK$W@5%~zq*<+56{h5dZF~A@70(5uf# zNaK{DJtq4YmPAcS38Lq9oS@N*O<67xG}9!6Ecf@9@T)SP)c$G3K{Kp0{^5b?+}rt( z?hC@o>`QTZEhXZQkkEp;ZB=S2ucnoe=o{f_1Ny(;_iLuS$l0QZ1tED@$7#dv`j4D`TrzF7RAabwTsMiV884XJH>JQyU|b$ zgWKCUR#4laVQ@>1akhi|uCRl|LNub${^dC#RUSSLNt^7WOtUA(=t=Dr~X zP8d?a-QcC7?<9N0LN($O9_Rs8s#Ojda;V{KNdriUw|L}Fy}uIZjQZr_XWH;2S?T*P zq;BJ?DkLs;@yGIFjR)J?Fr(}i%84Un*F%i1PEavurrOVJqXl4REaL59gUl;8j7qfy6IIK)md@rDiDjC8B+8kCiQgz%PHbMBHr6LFW3jQ# zGTUBl`wEqRiUvlKif9HrxNLex6AK$#xk1YXt(Px)+Y7|0?;LA88h0&usBGU{i4c2VfU#vOFUaHt$@3uZmGkIqO>KBwfv>N~z^5hPz z%TxBziPC&zs4I^(23Rv zkQcR)o!jMwhAMzVh}yd2wu_*-n8n-`IR${YWOks_$q>viTNvskNVj32a>VoB@Fkbq(? zSez0dDgme>cKpWryaX3@y`3j_jea{Gtb*W(w=Hg4Gk@AnzTr9W`9Z&7#?klqi7+Ct z#uJiAUT7aK)7oy&m;6U>>gv0m8jGr#wH(;QZb?sfHg zCFeI!*>8z0uQO)C-Og9C>bF|?j~|8!t?(SpYEcm|Gm#Lf%BQ5i4LO`514n1vF+a!> zxfPwcm=lxELJTV>inzT=kC9~t+zj<=Ku>jSkMo)Ayq^PrNmljjblayVxL0-!%Il87 z)p6Qye@u9eqn z8ZPDzO@M!3iLdh?iFeDKbr_2+n$YKKGN+ob>kb&SNf7w+XJm#(VMJ|N5AICLC_L0(u)h_} z?f`yXwDxQh#TX_}IPdt3Hb>qgn7ALd0;e^-^=_PM)G$-hCsc1=JsI6UAq0QfQqu4E zc`J4NP&4(DgO*GbgLs~B;FsLza@(`@;^i(^OH^Ks^p==mAHiRaRw6GK`?LGZj7_#X zc#Q|ZEHdAMfJ@W)V0ekj8!Eg^cLJLkEA@l7k-t0#YLq+}T zgc2}5cRO(ZNRLsz@*xdw6a@8rleVr73qsJI38cf5=$-F5PqvF;117Jg-{JfTHT!E5 zI9MYziot;HfIU15jC7yIJkA(|y$u`~`y5*l>*ir0EIEB-YI+L^t;CI}RD3=-H!Sj}M1m?`_aF(@#&1mGB{9$|fFhOz$rsh+=y)o1u@>h6Rh zv0-A!m#^h@BXB5Om-Bt!xaKGcGMm;(h%4iPi-EWY`;CbapyH}!ea|M}VZNH`%HVwX z6XA2u9+<6;G_h>n0C~Z^0^s;wlggk}AW2u0_$VpygTR$pTa(2y)fT3xW_`&QuIdc! zQ@|K(Z&Kw)Ks2|2{Rh7F&-^(4l|smzzX87G(p!JJ1$xhBlHeO8=3wC*i?i0PZ$3

    ~4=wSe7t3P43K=6~*osU)r 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

    jhrVSHMziT?=U*FKTHZQK^x= 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

    YBE>%)HI_cB5(UCm-{1iPu)=LYpf~t$$lx{w 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 H&(wba>g|_O literal 544067 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 lTmtoOd+dC^5ORMQOujEESWhk@{}K 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�+dd4f(J^$E_6W$cWQa&(O2_&yinoEh5*f@oP5L8^ zRSyoEy|i2W)Z$pQ_daabdNCXRAOWnp{aAkaW=kqe&{LwQk2_Vsp>>mE_~f~qw{PvJ z4bCA^>X^?kF;pzljrcG7)Yu5sDlbM2VA=ZVLYA}0FT|&g|Jz83n}@a5$*FH&8*yI5 zBEW)nOZc*zpM*uo7i+vcO`6Wz#asAll@0q@amJx_I|8A{+NBrdS9-D?7mJQ=+O;X1 zM(+6fMTP0CLuTp|fDp<2SIBlg;Xx?zIXcerC7>=fgCcNxihKUS}(rn!XitR3g zI!%~bE@++I%o18RWX71ooI|W*LuW6%|PPUdp zs7Kw}gZOId+bS{g?>>=3(;d(BisfFU8mF5WJcNen?eryz5z!EBb4i?Ksd?cWG5vH*=NMz>ogQ&y8_hBNk_g$%_LXMg*4@AEGRH!O96Hdl zL^mPMJWtV+pAY_Mky8HJfRyA{r{2>Lo^ELB`o0Wd@PIxpOIH;k$gs(t2`An`De7Sm zd^Hp8$7U?%3ZyRN8PK;=&**Nr^P;f&bK&FJtF=P3Mar(V_93Dv1rozOWfUCOXXiqo z*F{pT(0acmQO{VPC+r=3@f8AJdOSBAhRlj%;*Smv|F?*Lur1cAXALk~lfsMUUwu>4)o6u^%5 z&-z!W%OPf0A_TzskkJLZItJz*&Hg@yRB0GfQ4ir}c7!P+7rLXRik(TV&D$=;{{lE) z%!jt`gJ5_vm8TrFviEWB$B_c0tN)+wjTOC+@pJ{_>hhGO!BWj(01WO^CSM~;{I<&| zemES6Jyj-JWEJNq58~usoNCV~9*Kq)5-{kti?bab3D_!!TDW$R=Ju0xr(a##Hs$Xs zE3_U+@V44l01PybzH_$`yArcTQ5iX8I9%~-a@Y)on`3$vh<;HKw+%D8H`>cSa$u%= zAMOloF0fWi6n(cXZY_$XqWX;g+VqB|%jG57ioqp88+u;Zmq1uh@tVXZP*)F_u z9_#; zGH&w7hKl`q1wZyjXXP~B9_xODu?HJ=J3IrP(rt#Y-F~oJY#%mJ!ShzFA8~dgEX^U- z#3asHd)}>?Y%uT}8Z{1gCImh-q_^;pb8fWQVADwx&@$UW=Ye#$2 zbx~fjhj7qjY^_F8y#BVYrxm&95F#IjsC~K2hV@Y<`SGOT!?Vu20s1fBK6{*yO5OnD4)pX{0L*7rs4wNB=WDv-94)+ujxU<2`8h+;p zo^5{RWi!V0h8o>$Fnp``cr}lXAfHi-WlKNPr z<1|+tASSA^$L*1D7s(##-=Uj6@(_geI~kwyzv`p2e;gxpQHpiv2Up;CNA4F(hXO)noV zbu|-gAV30~lxaGe{+bN%0j(dt%9V0{nri*_C0qIp0;Bqh1+QYnQEP&?{@zu$=EBNQ zJ5_2wUKe9V=OI)4hGU-lm>r#G_anaO4sRl*kFOgm(Qd{E@=C3EOKv``7*xGpL$)tC z=hfy^D0<3)szxP-el%DFzqm?dD7wtjA2x`$9_e#p z1U0nQmLyT+TJlLx8HZG`zls0$;|=w2dVl<^FL|$#QnTrB@;=qyX>PuvtD`Mh`td>X z2ZPM-`b6iRR^Ear07OYbm10xd3dGyN|23pJNu>Q@M`o=|KZaOqF7BupMquxMkkE<+ zF053akc4(K_GHJ&JTB`01JlYJtvtRP>z?uXbR?n9EsKOCNufykzSIY6+qE3uQo|MD zeNQdpg>qTesF%~3gI$XErQ+s3j;8&Z)SwN6WpbV^*wR~m;26CN^naO?NhdFx<9)eO z2=ub)g9id%?fyPQkwRRc_t4T^;y|T~5Od`{wluEc=&8Sk(@`xGDUv#fZz1FFbCCfCG~{V}dyqAd znRT1C`5#08cc|pZ4|Vm9`W1y0Ln=v^kGW%&tq?u{IX~~+r3^nJ--1!^bB6BI_)J3t z$7x?T3Q-xL?G)9L;P>ZMm7vhf+O9E9@8L;eC2fKj(V5;`uVp|$#?S7R=PDD`8Lfr8 z=Ii`mVejcXH%T<(#}ug;N9-`BhFHUn3PuuhpIX?OrYPAae&b`yoSXF6f>~iA=c_|Q z*wk`}*pED-K1wb5nu~A@x1vy__FwHb^K}b*aa}_Qf2mVL$6K(f@^@{%yd<{D&wk6ZfrsIe{=IucDORq;ps|GN*6t(V^HvieaLD%e>obaM z&w77BFHJShNq0!Ep^U&$#tPKlh<&$nxgFpw3){Qs%m0V7zY1!r zec!NQsuWtFK!KtyPM|<>rv-|I5+EeOp*SJ9YlW6l96|!ci-ceamf%v{-Q8V^Yy13O z{xjdV|IWL&X0m41Ugo~8`#g`M>J6)}WH2A(TiW;l{m@8umGXX3eZET)R^M(|m)iCg zLzHJc8hU4R_#U?TXj0qCt*6*Qr6<8>PgV61cKl~WWv-T6lT0VC7H=|`O;2Fsh_tq$ zHA{Q6*X2d5o@M-0vg)W_2f5aQLr-fEo<=57gVbr$@>1Ik-eOpoys6Wr**?E$9_;D? zXyPU~`zK~fuEpPZApC3j)k)mM=KbT-voUCCVQMsx`Z!@ZP(TWwChfz5k)P4|QtoF% zH#6|^OGrpwOZXyb@UD}AKx!w%x~dYK+TVU_=GE%$_?S9!&~A(o?r(4WMiu!Q&n`|; z$PuF)cbyO${N~#6Kh`VP>blUCVav%{b4h$U<^%BOOR=t-$WKYhhFWm0I}3=7MwV4< zMX5*$kTC;clGvbgyA)}iUhA-8n(Vfq>6QBKgA*12nJxDV3mS+^&OT5{(ej^$-w#kw zux8$9L@Z^@wOgOJy&eZ_p=Ya7t`)JP^*n`}lZ|a zGSp$&9_;w3OQd9JNI+W_*~uJ%_H8@(VSNAmz~5ZwKQ<7(8PIu}i}tH$=4HdFyqb;< zGa3DRp6nnMrx#LjWj)MbrE9jEg!G30^6=&&jyNHz@cuN@pk#N6ChF5MGi$$5w_NR~ z)(PD0Z+iQRxk=(k{bwMr%)fF8*od|_dnMu4@vVv@Ye%SHGn zj4bn4rz#~<`@BxiwV-$y=z+0h7zWQItdI4SDcUO!ZN4Q;7($(xv&!0=i~ zQgH*2Tn{Yj1_BKN@dk9Av^|xcYq=0 z8Uulcq)LWnk9Cm&CSl4^ntb|v?iVB)>`H)6K_>3r960UMDepFv^se(#jP2Uy0;brq zz6k20i5&Uq4%iO|FoFW}(cK(l=snZam{sjgZvjMw9{K*;2XC+2ttM;vdo(L+PWjt9 zQ~k5UpVY%Zzz$KWXhgjDDTl7MTzhti7Q!tw5t2<;JLLIghc21>cNw!=4SS+VsvsG> zVg}&XaYMy4uG&DB=zud1Q$l0{oUK2NR0gv;sYnKT`4zy2>E1CYgK29Hrd&vkuLkb@ z4x*=JkT>Tr>6Y^TXdyPbD$i479D-Gok&&#vu4UR(b-xEbocK>jGRZtr1h8qOe2n%x zq5KvQ9ng;{dmU)}eUq9Quaj~h{~syb;P+slT9A3cVetP*M6o^hqQ#^aeTehe+0?J1 zuUwizqLeH$-CUVQ5hnG&06x?BX35cVD zt2d7O!6j9j;6NQ(UXW;jRQ5saJwT=4QyalCKEdK=A-IUxd}wXKSVZKCo11)T;y~+S;V_2Le2zg3XTS)H{F+*yxmQA{4u!!#FVx{I)x+6#M)vvivZ1sqkNI;QxN)OlUr`5 zb5@^=*hqGL0)Z{G3WWNF{SooLl;eDrdaPB0#Aey-CS_Y*7FD5f96ytgqdlBgyYsfK zx}gh)dF<{JPA9L01c~(PodhIRM|FN>=?=EkDe}gtODo>3IYI4calyh0 zvvepzbD9eONENvzS#dWMaQ_XNcjmvAc<5!y%H%L?c%ha?STcRi`9Z}%1h8t^A|JL95hLa?-uv7of zq$HFZY>>PMSms;iJ19+Q^jTf#vEQf<4@Me2aL^IqhrL#~P7z;OPHyBCrjBUSYjc6P za#b&e1m}@<&ZY`oy*ZNL9>a8sw8tj z^2e}N;PK`bZNq=I&_c709$&)qJK!f} z(?J@`=h(Vk9=uQfKtZBi6}ON&auoDIRM#JP@-<;W7AnuOs#fWLSSEqEg&-x-(pS2r znuNcG@^hiH<<)ckb4Y3Z%)t8iRQc`iPSdqbjA`d2_D2*{@qO4mDtc7fRgQzZw{5h5 z`*R&p=Y!io5y`&klz-QZ`yfznC-e9EzIr}G02EDw>;>$%9M9$!{gl4@mUaGtw@;tF z8ZynRVsvVdb7`R?C#>WLNU#GqbGq4A6pqPID;TB04G3}lJYkGs2`=9S0K4CAlK$q~ zd!$%}A<4vJ^i@WI{C+JaaHyGL`if5BbA0q z*eLn>{SyI+-ECFn$65|YX*2h+bGI2nTWiPF`l}O4*bXNF@|V=jm=5 z3lEt!l(~X(qw()YO56gCyFX<0b9<9<%1KJzoDDhVi z!;&d!pn2*0%pYdCY_VPmj(EPyb8I{cqM_g`?KcRpjEU@y@4F z!P)cK#TdtE9fgaKX}vFRy%A|HV@b?uiJZCBSaWdPtmXyhjsEhV%gJ`Q6Hq@YFm{CQ zeC_pqyTJ5R!xq5;Ysjr2%4f%s29DfBt2%W`)^)x zbp1xhRdw7WHe>#D*rBE|C|ILGGg3(W!6OgUq{zO41fA!Tj6!Jz4MzEFY)DipS}`af zLzvb)cWvBR_BQVAT3@58+)LpT{qGrePLfir(tYUSj3jUa$K_!%Mx5Ti)#sG_tZ_G< zM5#r|lxC~xNJ?GaQRK<;2<2MmF(MRoEAv$kRBDb!!~=luyq_IQ4{7$=vvhaQ*;{$0 zP4XM2K=V)*6`8`8JLl$i@d$0HiJ56{&S4f%fR$N!;~o#At>de{xmPSUztWJ!Yf-LE z+C?4C{}OSDey3{G4(7Dh*T4OKZzuL$)6}8))1k~rBh`hS-7@nFz$uoNHPRXA0!H4b zF@I*q-kskxe*3^=Dd_2{HYk+^xqT^cUCY_9}K9d9DUO~z9kp1)%;U~sNq9QHT7)w$7 z(1$K}^Ka@}Y5kI#Yvk;H_oMvm7xAg>y1C;LEEAhPB{K%mEKr~ehTGw^ynOHMxoStV zrz^O|wXEB8(iEBBV^i>wT@a&?9p4A}MYbKMNy?FH7$Gc*7AN@lG~)kTEX9!H`c?c+ zREvs^t5zq}882RW%v8_660Sr&;H?q>!e&s5LoG@ znl>&A{Z5eEsKBc!Akie{6gQ~a%`|f4Q3qNP+%vI@6?4EixL=V0XEixdSUlzY{GEI; zW&A--t#guyG_hi!Eb&Lu88APNQDPUedE%5C8@NgmxlsB~(rOgQnKW|Zk+9prqZ_EM%Z>@oQ(NbBzjBOj2E#Cote;xR|WFYBz@ZEjx zEicX-6BZTp^ZHuBXj6n(xLlylS<%!Us2$gzuD=hPO*7h)arrSa`*bYZf|8E}Q?&1X zc)i=-0md?o@s|LE!N*DWrWeHK2jpii87Znc2c~?Pvk~_`O_87Jxr)Y`Vq;3K)oyr# zOiN4+q+F5EsaxZSpEut=`QCw4Z`zCDC#?0Ld4bf}{DKiMvbM1y9b0sWU}T|}7)z3# zUC5mBr7Jw5?6UB1d+kDzGZZQABk-2fcG=8x=WOz!#D{}~u^Vy8L^S*?0T%CWhSl@K?b zn&*q#a2J;s zXx4A-$e`^-Ii)PS;L5!yfJL}$tq%SPCSanL%`;SN0WYIsVZT5Rup8Tq9}W1A(P>WH z`pNs^^-&X{+dU?64yV|@z$H7XP{faBOe6y%MZchnu&U`{oe-Z;pNW+jsgnH7@tIw? z5!sV~=l^z^;y|&IV|fGIaq| z58Mr6Fwlp#!LluV{W2DOWbm49-AH;c zUdL|LafKxZI*$*n)98rzt$srx_3W*aB>JQ_^p#EZ_m1EDwI_!L$^yyTkF7W<`k9PxN`fAZ^L!7K%HQBme?jVz4(a!>u>UmmTMehDJ*-a++A;mO2r z{T_bl-RKd4PNxUYtpP0nLH|#6iUrHJD$!wg;nI1g^5fHVDG%qm6e|s9eD^DEGI0Fh zXB}Oo(~9()qCK&%#zOY%{BHF~go;WJVMZK>uFBo@cNQLT)?F2cRVMT)NpFzcnS4Wk z*4GAZx!w9tY=V#_#vt)Ys#|^dcAe=ZMR#;t6@A;c2i!oV0m^@y9Jw(J6ncPm2Lp7# zkc%j21KI+O=4IOJDVfi;+6qn<`Vin~oX{thwuyT29jAuOMd=?qsltTvj7(tC1H@ie z9a*%Gqe+QuD52g(7i~kG=7Q+H1dp^d8}FPe7X6Qe()xcSW@evkgS7qGY`#lK@tGr4-kv+Pn;!h#ou8-iX_Loz9Ub9q049cU{usIeBx=uBqY>PtC{grnyLpi|%lF`uWAA z8YolJW%1Kl&|#Hyco{QAgYuS`VNK!p36)SL5{ImIZs7DqEou)Wx7%V>PzyDE!C6(I z55atFvXWqh$mT7UDc6{I?Rr{k#)`^5w>d6Q<#$ac6tOYWQ6ECivdGrIO+ITRrNKWA zm|NK|5**B1FV@vvc{Zvf{~P<^;Z1>AD}G#pi8>E=7sn5xEgwgD62>C694*_TFnAkj zN{H`Nly||#94v1{$KSrMGd19yum7T7mL|K_{ikAod{dC0ay(4IQf^W8sOWUpB#JsY zM|)DIldp>w61au}qnaaIVxma7Q1L7Lb0e9qjTT=C?Gj-CM}X-hgKwJE)@%Wi{H=Vf ztjv!ygAunlcTA#g#h#3Quby~naOmsW9@}xLMDtD85&3zY*d_xH0n@L(4@(Ni2&Ukb zX{~>eX$xD`7)rg}cIW14`fZ6+!QKz3@2zxkYK(Og!0a% z0Q8wEIRGK3<&oH5j|hK zq2At{@YW7OC3%AMdH9ISEK;r7}t0#D`3;Q3+N>lD(&emD~yI+YaZEILXMbRn+;C4GGDaKN|NfkT8<4(d)neK8Wvx zZP-XrZk+6DZ)fBmOJICyP|Bb%%AS1idlB(dhJ;~E`8&fJ+t#rpjixUbqF&M`)Tgkz zfdz@}?E$YvQx&0|%h)Vn=|+#4A1GHbQYTXKd=#92nJJUehx^es zkVwOzcR|hHsmL+1qz02>$)({ddsZl5x{%k^xy*%iHc$_wsXupOd@x?L6>*^nyB%Pi z>#$%MgS#bBD~Ci@O$7_)1WvLGe=TpM^6zGVG>IRq!Yf}@&GhkeW5a(1#`;<9?(5ba zguhop`Sd?t9$=WX=zx#I8(2dLA`(p9t&z4>hCAs}t$s9gJ}F_jiN}fhwMen3IH`MF zcLOU-ChW)$O+I)Jouvxoy1{ zRQS5r7#W1vfR+2t08JH2{H6Im-FdI_*mAtg%aBYZ;-A=Cra2yW%PT#Vdt=)}u_75_ zT*9pojH&!%>y1V2QrLc-OFwj6XL)Db%UiH<{=EmsC_BdP=i_0k&tz%!)LREom8kHW znMyC8I|}3vu2lysQh^fbV5phY_0h8UH+P@#0bG<=^Y0_cdZIbOIL#``hs4sUSBgyH zyZ*hftEyvOxHjMTa+n#4%~|G7dHRvXDzf0-~u00=K24*i=7_muH@ z=1@w@dWTQ>Ax-?yU%E}yrp!i=PFe5cu-4`AM_k#7kp~iIo!T0q!UN`rME*2>_7@sr zi{{8gAv$)Xa8KD0MNX;6bJ;(1VEVlEU>SjJk6N#)JgI)V7L?Rvyv)WKdC0AK)hA^< z>1b-^ata&fqqjX+O_U2p_wB-+Dpx);d*6q)hhcM5YvoTXD*^VH`=dS=bQDG|G&MK= zcgWlV%+@lN^|Yvg^u27PYB8OiR;E>FPMK`ZjT)`hn|V{AYgg?L8UxiwF)kQsIjTOF zm72>w(;a+R--$pT4{KGVfKcu9!;xZ9 z8qIryo?}dFtC#8%Cap!4zT62=wFb5K-?}nJRR;#QemGF?UcA|lSjBprL`M-*rQ^E1 z>(bCKFS(n#ic>5~e^)ozT0KmynPc^y9#sEUWvtTXal*?L03e~Q@{{;EuPMyJl)8V_1{qT_zoyUU%qSE*WB{HW5a4ZUZS_;zB z;!fHUULV!46@c@WRI#6256M5KS^tI#W-=Qb2fX>pzkfeR>7pb;wjykxRvgi@H`X$= zI_0c2$V26hC)zqjt?5pr$RvcM+}wI5ZI5n3&)>IqqIwuzia1KO3U|BXJngbzqJC`0tF)A-_L29I&e_ z8l)qgj6V}F*DpKWWA5FXF|{pjrIC}2hi zBR>&n_93E(SQ-w%^&#dU)$gnTp$vFcxKJ)H;E6(|UwV{{Uhfwb&p$iy>70%B@aB7> z*ci^`0-ASEDPrbbccTHr^N*x+!Ux`uuo%|9;pe9-LaN_OKUJKuiIRSjrex?_`7 zKpK+4t|=&Y+oz<1lB1bwwPHE_&0h*F|H}A0gXEGUt#A@lWy|E54SBTC@MNh_sRg*5 z0YV$72bbHQJ|W80R1w$ybW6juXLlw53hK}c}H{S zoo;6E5n4yEPcdv=B5^rgM2asuuNk*Mq$;LfOZlKQb6j2$X>*b_5Wxt-YpIE#_Y1WN zPB=iJ5KNKQooU@AW!JU+i40>)X`?dc)`3K+?uW-1>lT=hf*iMTAa4GOyt2`+71~ps z1fkjqrtEf?R3YaD6Qm8$*+s;|`P(b@^0$wq*Vj8V{}dYTaWnZ9v``PfDc#@u3)%ek zZIe5Yx3Ebpyq+K(nlCY4r<{G`W_t8w@Cn@))QNvJY{@m_-CyWb+p@#*)-alHx*KsI zW5}Xyd>QqQAGjl0zPIA}z%yo;IdNM^RTSJZ)o-)-6X#BUdX!QIlk#_S{o1ZS zbh{CGo`3y~#2xVerHStZg<)5^M{XHg zX4Yl=a$hKB$Mk0!kYD0tDxzMc9cQ|Id}3j8x6_DpO8Z{3`Z{Mw)a>PhR_4ja2LZrE zUWj8|ddAc0((9jk-bz64$GmqibUp|fx848~s*_VZ>P!twa)kW=yKOVO#1Rx7f^ zDmt+H0HOM~?wxm77ncHU&%)aO1ilp}Ebtp`G8=URhzc^@W+oYlBT};B^L$oidafs+ zJdH+vsR)$WmD*87z@lV$CCsQ=AbaUb)h(O5S81A@-OXES+Q%Q(G1QhC>EOk{ElNUJ zqPUyMg^D_OVBBT^StlY!Dj=h78%fEn<^6}d-USv^YEZxjK4`6H5nnG3*-$byIo(Wv zXGkm8AE|eP-%!ttu#lEcrDVRSVtMm<&ty#s2KiR@k_*N4)IZ``P8EQ8%g1MJgg>)!Hp!L@tq+Y)EqZMt{c6B;13XaKwtyOOD1?|o7ESG=JY`OiEi(7t!w zB=q3l$9ZRKzboz|U~8KhD~=cOk4!paIHBckj~^AIPpCvvq`a zSlg8`GYCn_N_P43)ZPcI^l-1OoKMivrDThHYgSv9f455bwRhLr5g&0!%Z1=gtNpbH zh;nzP?%X}8d8xH4(LRd=%J=;A$e@yx_^Rd!G)!7hFLKjTW12a7swHHIt! zYnfKUdiw08s7}AiBxW~08YJx`7xk*Hr8T&*zi=)gH5bRdEk)-wNhxo@F);@GF2Jq8 zQD{7$6u>Bq?tJ2$0sJdBQZN1`PcX@Zc#EIk^_?74u~Uj$VOf9uOZFF})%oe&qb?$g z&HenZl{C5TCd$!t7-^e;qYQ+yHx&`0Ol5saCyY zNpR7aViDGojn(GS6jajvxhqtiVLgD#DvyKK@Qy$|5wc#6xP!t@9cpD=khr*O^6rlx z=h^kr;CLo0C_`DWA4TO`4Zn+A5*^I$RLYS=8EuhXVSw#zaLC213K2#)nEZ7}fNLvQ zFw8jaPDFm8f~ZM`A=k^e7p8}PJMnRwSd+>(k|06yh#bM99~qRzi1q?WulNkk5|9Bvt zUn4z#NW^tk9mcF6!R2<)=6&tE9Qee*l(Dmh&YCGCm|UZS0hRIV;_HgQR-FLj${3($ zKH6*InoS4(fz=_=DxVJe=AD4&btbXYSlE~=qd$$&-?j7wl}&XxazZ;EZCn$vzh$h zlD}UL;LqRfA>Y{B4iX$KvVFGSX>#f-zO%e2UVnLlkIx7I-hI3;jY*u7A>kEFJL4Q7 zb@Dpe>+NlTuJh&$3k3X+Wa?D$jas_KlB>NSG?PvK)04ug1=H|Cg@np*r`lw5w^Q#f zVGQGMZdJ|STwK1vg1~JUPK}(Yvkr0tyiDSg;in(W!}si_N4FM3iw zjFQYf#x7Q$g7qKK8pSgvQ_jHb94TnsZm=`f5=XeQTmO`Jm9zndl*Wb8JPUoYI|Q^k$wCH&^~2%)|&N!eh!x>P1smj2GE?**X4P1YO3 z2WpIrt~uN-=)WaZ89TSbhkdrO?Wrwij?pDJmP(m;p2~PsJ1|};u z5519Q@;?$O&R*+M5Z;ljK%#_=$=wca>Hgy>R+&r_X(Skjx>k9>>v?FsjDI+m0R6)j zbBombZ?z^Q?*iTp_ja`sxOyg}H$q|Bv@bQDQRprBqXV zAAQ~t#{m{LL(`t6L$Y*Xh<^Sd;9{_z!s8qR)gc8R6UXar9{&_y;GmB_JNHSST&J~; zERg;R=zSEi9sl5a+^H4vHYqPxcg}bz&^tOmj)J0cGUU&eTW^s!$Qj$gyg*? zZRhK5ne06C%!pVaav=_n-X&BLjp$}>si^ztAE-1mngwE-n*jcZ=NY$_BD)eY7Ph!& z>o2c8nrQyiVt>@$~evXK^s%=mal8F**01Q>&J0O5@6K!0YlBHS{JT?LE9?@0V{r1 zcGmj-2j9c@Xe>)l_XS|^J;iQTc$-?Z@bgrElOAMcCGp_O$H5bsid#7y=|@!l!Tdo8 z$6y|mKo8{`Va|1F;?pM)2XC9t;J$E&K$bEU_qjSDdqBZiKCNFk=N&dkg9 zgH_6a8vcRMcO{6t5_=aZ(}q0aF=4cz(Vd?buT4!&K9_ulTV@}^BCVd!dVxLO0aqy(Wk2uybYdn_SQM{|Vf*{!mIF`*!W>b$kJkv97FW|%cJM?ymd<1SiX?{f zRI|_YFD}n_#lNp<#`XEiSj3S~N}6kuxFQv3L=j1qIgbonm|iGP#gv4rVGJgxyLw8l zaiUEkqCJWs?z8#mr&;NvjSozwXUSlBMOJoaOG%(n;~Qhh#yAz+m9XP&oUsv{+w-^u zRt_{J8+@yDGww^h^iS&XP%3zTsf&}i(_@haod5Pu~dHtg^o(A458 zjvu_x-h3imU8~nNjON+*%=F%0F&hNe&vx1789!gMBw)DB*26<%=f4{||t1Bh% z%SpGPYtIvjHw)wWO`GCPC(`IGANyp^uY@<6v}|ALgx)!0QII4g3TL!_hs(Oe?QX+9 zKPa66P{ngQ0We9~W@Yx&OeGH$&)E0B3wIVs1i;(mx<({5I`{xi=+s&Z zAt15Iov=en8Zaf5KX35)<-&LytZjvt)s_u*qHmTSY|oGAK87x?EvYmJ z8(MUI#D-@#*O{Yyte>B%J$iYDm!yvoLPPn3{PB$qE_UKO9sbDSGs*UFJSJTNspHl8P&*_i!d=h9VEE{k<$4c9`zsGef0^^~FftruM0iin>n-KwpQ)??+W^A{H3QpRwiW4jSJU!g)|tbEm}o|zF7r&M~6}XG~aGaG2&^FcvZuQb~I3|Nh}r z>(=JSg(EU$xt_R9$tB;fhX$#wmxAG~un52CbzX0QT+9waM_)l(hjKlh?H@bBx7e+xwrsy7?5E_fz!iP>tUR~ zhF3AV#myE~a%U!Iqvd-l%uS;-B}(*dkM3#D5m}M%OuQPq zJ8SNy8npnGx|??>_{O3E1)64$#M7sbPkKGy=V-YrcJ(|XUbRQpkb{SNfKdei=_9sS z@6nNAf{oFaKR ztjIXG9AWEf7bXLX;u*WN*ypI6<1)O*2Qr}7Xf1NH5g-ksh?yNPX30aXzBv~h$YYZL zjQvae<6$kDT5rl~nnVVCN+3)dlK6Qa7Pu3QF?5tt@5JX{srpxMvj(qcYv-GC2oU|* z)djjiOMV~8C+Up95wH~xw_~rJ${Lzgqnz2Fx1|b*nT|kEAprO+@SnE@6}ca3c180C zj#sWlQcY9x!Ng$hk|s^6??5Uz1ciQyMaB6l1o%=htq+m`(ZQ=rnRgG~kBybIwPc$y zq6gOUMn0G9gP{L)G}wGtz0KC|jHG{0o5^sQGZka(utvM5ej5w;p)_D3arUOC-zSdkQ1nCa1uE&9tdoTl~IGE0jLO;?qytAqrD!np!7X)8C`=rZ}wwSM?!u}rAlRBDD}#48RrG~a8A zXjnc<=tIkEat?QODnUg2{2_bN5^yNmv`0$EjQmETSs;9x@D0uWpdIZb1}R+53Cl~1 zK!W>y482*ZoX+1?jl^^<;o#Ei-Mg{hQE>ed21Fi58pgJ5^rGWuEo0Tg6sHdGP|Vnx zO~&=kus=t^!np!Bi~I!RM3BD7xa#+F-Q3EaIOVrW^XdzSMNFMv^c8euFKVI&)$L`K z)ikssn9p`iuVYSJ38xUV?e=p{`D0Hv;yPLDgD-vhg@QIzFZ!KfaDlOieN}CYl+FWl zxcN}Rh1h{JUL}bhwuYidp*_BgN^B!k!Ek+FMdk{71&sDs$19v1_wR4={mEgd^kzLH zez}xct}+@;^lDU2IbhI>Q0Ma3h@W+v7UedQkP)FfHF45f8`SeNxQs>LWBzDqW^_z# z9+NRV8EI*2&s7o>I9^=T(<8N{qi)v%!URS3tOh&J51mya+tgV|RPS+pj<04tE8aoi zb5U-E>7)`@l?#ytxz(xbFI*~bFZH;>^Nh{O+_(C9y*!`2x|>!0Wh=E#>byE8Rh`=YzFz7+#?`3~V@FR?-{-kdgy;{nCacY|upRBT`@TNqgvsOxQavV0 z;@&G5kP~JQp_hhD#(%6FwBW$6VV>V^`@s{HFL+Uxw0rY7eQMTm@q^3hV2pTO+UASk z{Jj%y(g*KcQ&OH4@D*qu$xNmB$a*`1F_cu9;47!$N3FEnvIR7fM$R8M7x2MOffMNx zHi6EmOVI-Q9aedpijqNcQR(QAJDe3j$+Zp=yq5YffantL!KG>Zc+0awKu6g>0CohL zs4*|j-T};PMQ;wXKVY{Mv>xGd35FJeg#PyLK%yb5pLjF7+J#d5CsWp|YX3MGWW4{D z#Zf2juBUTSV6qT23%`6L8}~nwU#JSHmTgszS(~W!a?`|I!Sed0m?p{~{s|5s!J1Ey zlCm>L-_D>&otis&dvfw)CXICxGK}d-fqaX9Q}EkK?3-ibgeEFo|8dn(E~=aPPFrC@BaE|P@L3qEJV;}EO$1Q9~eT54Gh zVdE#2!faJOzF)BD+mHR)wmfF}=yDjE(mOXq$MmzvD6iu-pMJspIr;(*&U8&>7--|D z8WETxKJb$R+Fx?PFF#G$;!Yr)(8WFjX)JC%CS~?wJzJMo!@vi@IBG_DoXHhl9GfzwDf}`cOQ~@|1OAU&%bKEKkTc)3z@0f97 z?>pf|m2i?eo%MTSWjzO0(*I!H7qc-elAi2Jow^;Sai~-uH12^BsE76e~!s2SgpD;qfPak6(rI3?P+l+r^lV{XR*kG6smiqq@>1@ zXMe+wos5~I^0>%mLe_20WfZ+ea%U4>5P{);04(zX6Lxb+oQ6&_W%Z?h{3j-T&QqI= zk32OE2`8>HzVM+LB#JPYM`U4n0*l80>bRVBY*u*%WSxB)s0WQZqoktkb~P&BIu1V) zKo=mHAAkCIid1+JQe5b@eKqhWYp+z1swJi0z+kp@dT_!zu|bi2Cs3NsQ<5%zAQYRighwt?)00gSVONQs&Zla4<|Cm~;c|hRQ!S@qb>i8ZG zh{P%pc~^KE9`Gms%0=UYjB`CS^A6q;v|fq-Jjs*%hLpLxar|XIglVuaPul|W7C(PW zmhwxLH%a?Y!S#!a9W1B$g`C+Y|NhI>McuPB2-KFz&0E%k8>7`jpf4`G-Bc?(IzODR z(7TEg?hovn+kcwG{D6-atvSufJGcIp_G^NL^o(D<_7m$~Qt4?a+rpZy{BevjnT)Ng zmQ;@2kO8^ZKWr$2Hm|dfiB?VJ_w# zDawc z9l9(gavfC{$xYAj{~UN9O)s0WvH2KCxhMwJB?fA=XMl7hj(BA@Z^jp~g#Y5O&$$v+ zo!_vA@nqcjurrpA2|D<<7@6j4lBkW&!|C&EotwawoV%Qjlz;rz@cs~cepED^#i&N> zEF^WFHbb;#irEe8>L4m)QGdYPC$yx@-Ic4qb94qVEY#B->FGGNTNn5l>>j!Dx!-H2 zcfzOVDeAs3`R|>ePo(W;g_NgWd^*6CWO?UDd%L0sm?&i>6-75vbqM)qnH@K(qYIc> zfMYi16QF3ejHz}=eK(Ht~lmmwh6gWv&oz$Vd{1Yi7ITAjWV=aPsPy zR%!d--|^R`xX3s1Kr(qR=2nD>JeZ12GN-!PyO2pc6H1#9wbw{8*74qJ^VDX)b9I-r z%h?tEYbE(NQQRl1R(27`Zt2Bm-X}VpHA>;46WOyR)zF^hedI8J#4qh;oL_w}hIw4Er7?)UQ2=TBg-df_4#jYd^}OJg$+ztq?@+kC?fRBK1lmU+C$P3WLUcM`B9Sta;^b_w9j#{mZY@q}`)&Sb=3MNV zGjsOEzR%rS^II$HeV^xnS&8&_r3+gCoX)Do7JB)*R3)RALon%dmi7|ITv5hjQ1R2S zjoY0^>aWq3XW~EXhq?jw-y9wS%9F{PgQ&4(+VzGr&{4zm5(jQ8#IJ%BMOqt16=~4? zM>9FhY1O5^RuRO?YW62P*7L!qE^KuU*Z)vD^ig=7O2&|+2tfMt{9HBQIJGVl_=qSk zS~2T{Q{ju$i%g}fNCzipQkm+9Q|p(^0RdXJ%D%)0+ys9Sa?SOjKkGxjcUv&NK?pau zn;3PvOBF(z+Zui?pu(_tT&Xx9U{(Fp0OsW^ZREM{i#VsXT>?+5zj^58d21lwoOAyD zN~h^Ii9P!2d+}r%RzBv%=BE56@KGM0zT`TU$n$^E6v1`kyw;uv)lqK7J!q*T2i?TN zT#V2`d4Imk>+4%pYD|h4H{@Eypcc#iR+Y4KT+0q06}boji|0QngpK^Pr2z<$KGj>{ z#tkVO=;Tv}=S{8}!WPC(yiZR(Mt#C6CwfCGPj=PC4>3+0XBYGO#kE+QP&i{B{_T?2 zbHCN-&nweIM`TNzEZbcA)nT*>HVj?zv?=#3i6nGbFa~%n4--yaJ1s4MQEEiQjeL6E z8J0n-2sH)QZ81loZv2}<#qtYvg92PzwJW}$z?ojqezkklO@3@v>&X05-lR@Zgp`k+0>w^$TR+%)2 zB16N1O_8gT2ZE*_bDQiF)tbYyh#Z2pORbU{Iq9bIq0_n`O$7STX1upX%P)dz=?&6U zGgeB~vfTG+dySRJagB@IAuZCCR5UPpP(Ib^bEaytH|Tx!vY3AKKP<0n)a!$ms;l0M zxm~-q-lb{w>}#}sTA`6?9BlJqcDeXkOksrpV&B=G~1k(GTVsZ-ulf24%-7 zq=_G{&ZvhEMie(E#z?qCXPlJ0Nr2g0%MY!Z=8gy6u!s-Onn)uleQAqIij^8?m{S^{ zX}x`-QN7aKNr~=V?O%kwO?Zfui?<1Y4uBNV@f??%s4mGBYr&i(0X3- ze10p^7AN;EwZn_)p*<@lbB)kFhTy*@oLh4Ph&D(;c0zR-W#pGWE%_1INxmwkf+>ua zp`H=W&Yw~94|Ow{iIi|J=$D6n-@@EN?T2;G=@@vsy)G;~dLu2R8eJuskd_+1Hq6hJ z^I3=Fe-pg@KdI3Fo!k3A@{Y0U=653w3&)wSp2{R8ZhSW8eyqxM)q3`pS4(@D`d9Da z0Eg>oDe*ji<<{}+)Sm`&I|0(XN$IZL?~8bl;km8}A#W@+Aqhe=s%;IK^NxO}A`G8u z5T5hk18dPVYz}_F0jpaLJX4Ctt}f}LGtDQ7)ni-~MYpBKzo^UR-am)BdM>*(86Vv^Q>~hob>@l$>8Fme^Xf%8i~$#!97Oi zi_CUl-5!9h=l58xyT}EbHQ}pfM$*eTPp8vQF`0H8``XM8w3X44%g$*7e0nI8Was*b zDu>7bNH)LIN8H=>AD<SejChN2W8>qO5ib`#+#HstFhJcYx9&!h-@<+p4N&pa zT3}AUd3;C`|1lX3wh~(4;1v{}aZ-~4qRMhlzr=$3tAWw8)IuypXn6A=@4b)M*u^u&3f?x8tn#{^Uj&(=+6XSMm_xKHO1IL(4pJyXxaZZaQ~ zwhq|E>|8nQ!7|Kc`AS#_+$po}(=DZ?2Vz{cVh-b{N2TwqCWY*PiG2%#jji1|lxdFd zF8S~4*;??A10me)GdIJ^uxDw4Qj7njQ*KivGt=#LQO1mk<92q#LkqttuMK`ON`H;t zd5)4TH<6Lrgu2Mf_6_x4d~h)v?vx(QTGs;pZS-x>jBgu6bUzd5$5zvc4)4`F}ekWp%bFwv&EjQxK!w*3c>s1d;|^PHV#bsA=9^zY$u z_u~Q#NY@X*ZTi{|*Vp}KU{!o=Rz|#UYNgK5n9pUXiK4n^X#Sb17N+(LXJJbJN_Ug< zhdFmlh&}MwL^eVbulL5ztH)~F0K!evS4aJMYvrz1H_`Lx&{aGl-i{Z`@lMrRmHeBB zYphYPtZajzzjpGdA8Ru()BbxhKs!?k6??+8wPk3a!x5i$5Fm4MRfwB(3ke5K9msQu z5rYCDg|mIHj9ewg!|i&18B9E1ir^k%1UZvEb@t}b4@`WSn+=k-EQ#MZ@>45C!k@;SJoW#+VALda*qQ1qpmksB2H+}?e2eV@ztF$H zvz)^vnxrS%mxvo=8{8}R+=ay=`L2y8qgN-B8fa*(QYC0B;LLXC$#C`iHL;MpGjuP$ z29ms^pP3E}*P}Uq;(*U{YBJhqOevF~5eEHj>s%Y9kDxf?7d|uh89|~ zM_lJVk`IOF6n}7rGDmTpH@$)g> zFf5%uyr`rB8q-i)rPZjurqS@AkaLM?e?0o7wmF(yJo4H5us+{m9y)s2$?rp0D6W&I z)4?jI#q{LyNH9GR->~V4uTeC;*4XQ1sD#aP2=Z6;2L6bV&qoK{=F)(uS;ktimYk=P zv)SJk3zIQL=!OPgjUtH?5x`D*Kl>|L$FbPSmx%Rt@6Ti278`*@U#9tXn-}?}w3+Y% zc>VrgdkR{s3{pv2X<|T8pT)g6mIYsS7z-)Dj0KzhOzCrPO; zU>im2kGQq+p$sksk43_G@=@4rD%4ap`87RA_sm8H_x3RUmv4K0?e_t#Up9q@NPn5U z?FTBaHx6oF=>j(cH#sjCtQn802nE?4FJiOfYsJt0aOC`~n!JAXWz{&rURv4CbFm|6 zSACe9&*=o>cGe?qof5^fIT&!^Vp>_MJJ>0-X=$8i#F8X2GVaj!`~h>GiYo#+=*1+k zvZudw>Ni|^#VyW<(Df5to^j$TdOrItNc79xD&My0btkOukYj!g^u{NcQlPQzYuHRs zU;tD2(m{lK9lP4T1Wo!o!6WdjRI??M1^eB4NJ@giCA+HmCGVM7Rua z-O?^}r8wF!j5oC}W8kC5COZcy<#>tM@h<%q_Vtu=D``ztwDnqJLtt@U0zSA)Przljeq0><%*6X0$7*XZ0_)wXQ08V_#5IBoNpsK-o^zhtzsv}wU1_Fe zhUxK4!coBfNH4^JOtmD{>!vX#&kRTq#`9VK*aT`;{{wdTQ&?%`NU0W993%$Zy|qxs zPqj~BppXUU@p7xCy;3Wd=%vIeHiT%7b^Y8FjQieq!ND)*xi)4-6SsOk{A6nUPL=dX1Al6C9@txk6gegD4P%sJxN*xQLu=pxT$&G{dE?;KeTUxNk6#7_j)Ji9Yo z1aZH}WjNV2nsO2#tJT^JKPLyGa5B@n&1av96Zm<+VB0t72W-{!VAyMtiy=!jx)kz13A1%Ii(>i8ZoVrwuKyY8! z6Gl?9CWdq;K2e`>zDCOR?&VZB1{i{C7jii`;(wB4f18)mkQ0Lf`SD00vkPTE$fY}F{0@2`W3j{2 zX1712x=NmQFvSw5Awe6m@D}9ijY^BnDaA5tolmwMiA=0YHI61dn$ax|#Rr!P$lKQT z!Zo_3^zfFmE(h#7s@9?5vokSa)>(|foIJUONto~gXRAXz zZ1QbbcX}H3m*sTGS%1Le7o$pKK^F}SnK0@;fpcT9Df71{*?g;?g|;ZsZq?fbHM*VR{5%a_lIw@;y9Q$np`> z9nL$v2Zs)!pF2%2rSJ_~wjY&p2oEu^$v01#G+@bAt}c*t<6hW#2Ul z3Lfa+ZH|HVR1F65<;k-A;+&fLj5wA8=!EP&j#cdMd#7iesGJvUT7#wq7wZ^*!%EW+OTn$^&c5BA zb;aq*+z#IIzUuCij&grWC}7lNcFEmJeYLHMkqd?gMsV!&*?Kg^9afO5sL$E?BwzS3 z|KxKZS`K1T<&X(4^+<@o_VGpuPE?ISZkIaDF=sfbBXN5vaVY>8I=(zUrQ5C>JRe=m zaD85!%Zn!Zwr{|(ZV~l^rKE*gAEU|@6XtDhLn4Z02^br6t$8V%-r#H%ocV5H-R}%< z4}~UC$haj;895Bn5NB~&tgw7!f?f}Kmgs#@FgZ8|O{LuuesZY^x!y{y1ONaQQb>r6 zo5+-Pu2UPJ}hL=O|FCRyKvNoc128@i<94 zCFJwoxkbl^ynO1@wTKJqKpQtx)NFU|+9)_f-|3Wc#8zQOeDK!CoXE`(I7p~+VHxH6ZIJXd1(cO3TIG+dSYmL zVoWw0&to=K|LPyii;MDlr@(m`;4KBi)8rE%-)#>unXkFWJShsxqz6)@K-#K;UvPXZ zxbyi@!GA>59@T!FKxEI!?2UAyZD;3Rl}Om{+XI@#%NtQNVKP| zB~lv{@`{>C>6lC=iBX&8nBnftOXU!QL#h$8Ap{LY0_y#Ht+)4FTE5odZ)7RMu>eV~ zOriB8BWs?5b>?D*pb=lT5$ZJ?TSOvE_HK9N9tcth$$or-sN z>M+k+Mi)Ixlnn+eJrQ+i?gLV-hX#<0l*MoLKuOv{yuo|>hA=u5Leo{bbjPWf-;pBL zlV9GxtJpB@(@QcSlPqAj_Vt!d^)+~}m|23Lv`?)Spn)lZr<N$ugpwsZ{lYDBN96i*gp89hJ2#0O4W8)Lg^4cQ!7vZwbZ0l z=V~v5+ustWtWd+5U*ELXz~~VrT~rlOq5@YtoI2Uass@!P*Dka1_X9ajGLq+yC&L@w zQ(0y^(=;bt*hfHI)t{5@hYC76%+9fKK&Q*PS`FW6+=9uVCo3@&D- zU;1wI0_joC|CSA#ZB<5{?5=h+QnUR|zlq7mq>2g{B8(4nWJW zD>v8eHN~AiyqBKJXAlA`{T3Qpo9u3q&3kPXmfHV}F-)NMEqEXh0*ck;90(JZio2%=ucb}d4&0bL*O?vc z=lYei-IxlC7aU}J1r4Q3_+}oQlL#pgHB{%Qn=Hn(=pfS~OS)V$#CENQL?*@0<(?|O z%Mq#e^W%3oeYx24L$6boyn;{P_MhBu??3yUr2zzPU8LZz(hFuiQCYlI&G!h$XqtoS zuICw!cQTp$_Y!GUi)QqwId%J$^RNmPl`#5>az0YE9)5SK`mu-WkD7~c3K|z@oD4Cd zlLnQhe-=~SA6*j}cwL0+E}KmU99HA@H!(mlxni%-2Sc=+1qjtMz zTqMs13)L5fQ~>%D!3ErFkErJc**kwhUqGWP@zNoWWfLwUHs3si8w|9K8a|WF5pb!Q zmA&({0-l%#OZd9S%YEOcTw`ExHVFO&8OC7O5AYYURQZl0dOh0D^PHTwhfa-;M;p1J z|E;65-O+_J*Vt))$HzZYEAeH>S}xVmmBRTac#7*{sK6iY*uD>^m+We>K}9my2SJTR zL=ZrCu$NN>s(VUZdE;*=C|GJVN(vN(GG_G@Q*S+qnvfKGUbQPNalwri?YM+gj6v=! zSiRt<^{WZ~1^oIcKDOqDormY~)$PY6!OLsqWH(sz^@3#TVmEh z^WF#Z@2|BBiVgqCv^?2RwgW}x&TqYQOQ@#yHNs4#LUFnqnvzHKb1Fg7Thv_a)9HQpuJF z#pz)q0=ra+U3feD{@l{Kc0>5^ApRpKyyi_mwvhDbrM(eZx+r5b;bE2%IOybcTAK46 zg`I-S^J2cE3nWXi?}x}t{R`I$UadygiEUk>V)S$dy@}(38Z^OKQA}ucqbg|*h6?5d zJX++rH*%~qGDqd`QO+Zu4tC+6KFuDYAkO15R|R~c5FO_+5$~jHjTuT-@8oyMOnIk* zNbC}Yz{{j?`)d~JVbPC2K$>_h}fC1#eqzHhAT^^Tq1AagXuj`#9}en| z8LPjnG4Xw4Ezfz{XiU`Dm-3{jk|2bvo4DpXIEEy4p#*7`mk#4oWvAbHfEC2Up)s(* zLyUO3ICb_HfNTBlsrT==b5tI68WYP__s2n@oY1^ZE39AALluhm2^8Ka>T-qpl!&TP zW@WF6V>}A{$&dO$hD!9iVd%IC$=IO8pe_F0%VC}P|M{R#x-@Y4isZQXdL!5Ry>_Z3 zZ8G+^<57*TSpTtGR2y>H-}~$1;xE&3LMM`|ALu{!Spcrz3hm=oXH6P`75Pd7j-rfj z!QWoh?&*HU-gomv36m*DrnZAhO;ZL*>>7U78%v$<;@3wbUv2N{V!*v~qm?CYnR4Q5lnZVCrlz8-u|Nu9eSxs; zia;kF+RYvRa$>r6UuD5sgwr-XuptagG6YV`Xi%$GC?nNlXlQba zZJl`ec+W`c9c6A$9;**e%O$E1IE9YG&fix_@Mi`-L-BqG4c<3SJr&XzmxJ9eIHvN2 zxO@%FeUr)Otbbov3*Pnm+2MR#%O+RYP*SE2bn_$veqrP$PF{^cRHhA5-oR=75hX}kWZ~! z=wIT-S(kmsSP(Cug)cV^bO?|vb-TJSrR$x*%ed<6gva|w&Dt$@=cRd6^KUZ#@D9*k zFip??i&nurwwL?nw%!fqQrDJ1XI&^2U`-RH5uVKUO~gY4z-Yf+mzE%WTHUC4+_Xu2 zOPZk&xgEQq_FjK>CU;gMTQai^J_*z?`I`V;XObi7dApXEbOkCiKT5r&2T-?7^N z`-6vztK_@(+J}UIm;Bg}Q&unWlKj7-i!Dw~S6c-Wr^{Y~XgaD#lmB>t>2^~YY1OPz zaHeppxSpn;YR8O+X42P%Kwa2rM z!uEH@CPiWf3rU=1Es`E@b*XVPrrkdtrxy25{}v@RnVH;P-&wnc1Nzqfx01fi8Qs-y>zyEb{*Hwq;)mz*B$wx1Ysg&-5&o}4B(>twlvpj15+pwQ5AoLO( zEL}`{_~94M6tbNnqFZAZ@&EwLNJL|M+;^Mdt*_H9h=BA73%tqNi^E~>I5sA*M@6Tg-o7pj?5K&SDIHe-Cp z9b5>C32=~DBOi~%y0@~cKE@kWC* z8x@m-A(Ut#GkqDEJAG>)fb5y{u8z5|yK#cqM(^3`!S(a*=U{Sg_0V-iM|A?T?8k<@ zg^B45d;UVCTRP@e+0pbY{%n!lb6ML3?Lv{leQPrSX$ z!}5sR*Q`Ob+|gJx;B#dtRVkvxq%K5k@5hfU$?8=m-Sg&EXLKU z8uIc6ywNuGZTe*pxnQz(07{n{gaJ3ZIP=6a7}$&~Bp>9BJX^N@vh!J@NMb3km!rr& zfUU?uP+?y*?S;h3){b+F^qbn;Izg9#3eIeaIBaC<>^#vvRqa^ zH|~Y{Hnk1upo_t3zs{q&I~Knn`p7g_pTZ4GwaHjrHSxPjSfn_732J|6I=y;&!59-_ z>|_!`#%=PQQ+zDqpc7S2K zJ?tW2@mdb|{4S>9OS76Rxmu(%|HPU-(0xy!dXDR-5h@$fc?Oe*0~wUIh)qE5H_&a7mdko1XNYV=U{S^e0IUDADm z8(W|>W!bJC{L*VWdHHWtnUGMBv6uhWJI{2hH4dwOy{tKo&RQYLeXF&=ikTjR%^%Ew z1)BiEQ0Is{m1X)V$KS^2M3zc#)P_OHpI6l%M)u(b-VWYo{yAx|8?n!#B+(t~xWZab z&_7^ZBVPR?0_Jr)z`m|jkGye~&^uGA%?-{7+F+tQX2`c3ODEw31EAR>07m!2$$ zC7b%PL?dts$~#OUj{6g3wPZ;&4MizUsU^DK9*bd_wqR3EYofSE>?G7UzN6!$gtScX z{9P6xbG(|a3=@r5i;36k*S4F8QsZ>^dAMCFn%gd->q;?em2W7-$@?){>245Zhk}H zQZZDAB`wi5S@R=HDrqjxToa>v{}Jted%)?y9Lt_+#XS7M#Q$MnKad!2TeahLAi0CV z`D%H4a`>K0TTYDJj>oPTG$tE3?L9EeV|U(dZQWrnk$A)G6%K@VO>5DcFOKi|x)6yZ ztcT-+5e=x8^1oY?75&aef)8pHSDC_HWLZrb*_FsFT-klC&jH`<>>)?Uds>ji%-&JL5fQcpFy9>M~1r*+pYf&Obe-e)V zc79*o1euV!LGfxP+#(JWBN4qCuS5QlNqQrH|qcN8>&v=ijln5S03cvd6r|0*XJmE|4A`C>hLm*8J& zskdO3O;QFZp*IcfK{l?+8SjlI+4wrV z{o|s-3c~jhzX^#malv7=B-9qUwvq*1m*?%396D^i13{lzix=oJ4BI2$&j3^25k-GY zvzb1D2t7-fq#@Yk{rFf;SKyM(&v___#Kj$P0=~7?J-j=Sn?_bXO()N9XhuU}lvljZ z)vepf%SSMEk}4U(I!4$(i$UB~?bPW*pGyPrP5p|JaI0p;*!Z5?|FH|&SqPDqfFCKF zYdGy!u|CBSd`44yvIEP)0!6nmJ5rto~jXq3k;PFeCwzPgyiy) zeO?QV$^UtE$xx?a2VQKojYc~ZB1*k^^-DZ z%=(GIorcQtvvo!wG>&<0q_fNZg^^93rR~h)_?~B2qKDK=+TDx#dH^kYDkt+Pt|n4B zqk`jP1!iA$0{(qPJGN6$i!xAD@{#nA&zP4LjGp_)31Ut(CZ)()_h58MKIKIf$=dg@ zwmxr!+wjQ7AJePCC)RBV3%ho1*@5$jY??xWE{&}WlRO#2$KRmiw#0%Q_g6?a;wFww zXvR_K+ULbNg%EHYo6MU*NODg+gWFgg^oRi@E9apmzu_ldh=RlWEsYWuLE}3k*Tr~yeqS<`dI3p7jOB47t;W*9Z=UKrdKR&70 zBUL<%2dOm8exjtN?(DYe)k;7A;!4ja7HZeb^>H0gyIIQM`^Zyt zAF9&!?960W`Qp`=jBBxi{658C4iAQku}}XIi4?Z2@k`(UC6PCq)XTDp1->NGJE|V; zmKCqpyyirgyL524cZjkl!(yV^BV!2km)gt1K>_uw)3@tRWKm>zTGi*Rt`6Zx0+KAO z)pOKa{U0R9&}lIt^{=ZFQcp(LMV9XCMzV(YE~A$+nn)@8Ua5uF%CH(sZVwWEI}#|~ z8xX|@5(**{zDztNY$Chp4{5ozG~q|nn(p!$Pl$e|$|SO240GySr9gAZan>c9xMF9c zO{qDfXl5V^Eup5vJ5M6@0!1FGF~MKS|}x33Ch3!j9h!uKZFt(e_w7+W3XV03sL3y{>Wz$(zgh-n z<~`!m;cm$fHo_B|7gHUwR-(jo`)S3KXGLiUoQpk2-Ww&i!d9Y>4=|6|?R0M2T}!$>6QF0Yd$*0ejKLv23wgPa)*2WM$Is2bHRH*o@jx2U4x-n!X2|fsIUr?%UtW>0IRy7J>y>^#xDecTKus z=De+&j#YpUwgkZ!7Z!Pod=u_aKP_hc3@zOi9fOjxbHU2t;*)1La-AGx36D9LqA^%A zh~_LkgkxnZV*RmM5NA!|9INRnAN%(hodPSa&FnF(%Cr2_rpS{2;<_03< zIU0lfJ7@vOG2hqeeX1F5te^c)_|#-YoAi8{+p!+Xcq3IG4I1bZz705q(WXI9pO)lI zc$vOkM~~swLHy9?U{9><7Xxu&1fpR^9;cq+^m?PzMHzp)yS9A`QIcjA4vCZ& zZsy-BB?hKwB_x>C$s1+>Mt;j`+eS#>V)8LY&L!UX!;=E6@gA=(5J4b~8(ebG55+zn z(v7+Q@4ox5+OX+-VogHI8!9V?xK!)B$qOZUruq{KR2BmX43q^S8oIM^Z@Rv*!AXnE zW5c(U7+q~&Q01&{+Al^j=>z>Sp@ztA2O5L>jiRYI+0*$z$QNlVq)ca*g#zz&qvrfr z89BSlt_2-cxQJE2w+8Bm4h9+K4Pq3OA}tC+*ayuPa{>O5?!#IK>(sJQ$|269z47^I zUk_RP5cwJ~$ECN6KVqJHVEOdQ!AyPEcP8PYbAtkA#!UjNgJ`Y0#gJVNs;Uaa!&`)C z93rItiJ0))1dJOx>{F?oW`sSZsOT7BQNntJhx=wFo1guslhir zE7DV`F4kgXkfkB6JQ|%pm~O>iyZPAT!6WAH3mnJO;vDY4?U4%(Zmq9T$~L7G@gPa* zR9DD13bsyF2^Kh(J1xC(K!vDve-SoJ4Xj_3=5_|8EvP)P8O4O*8VC8({7U9?8-xZ* zdwVaLCZ;*~E8i-a>ajg_`)%C2EOiTSASE=6d1_7fwtLD)-PcJFYo&{L#~qe;Yw)zS zhR_#@xX9dAD0hNAhjyjp+xx@6C^w5~4b?R-G(`E>z9WWjI zeNN$8hi*6&DTz0rvm7kkY@c$iUYalhxn}I?*ab{09IdD03%xPIHHx|w^EA-hM>;Di z;PUqH8Lw$zdWGtT&OW!oiCol*hO;p1JCCe2V3`j1OH@OYK<>dHw?Mz>NUIgcOLg2m zB7x5e45ue!8ci&Z6Q4eQ6H-+)_!Uhbio_>ViT_g~9@xan0Ksn05*9uDeGgo>W#AoF0m#xx#Lw~g zqm+!Ht?!EE`D`H!;T_6Ug84e1(TMaKP+(Hc$nwu($f^^-|Ii)HEki zj|8#2S8^N>^*2JX{~V*&JC!HCpy3Is-?!sDM=LD5t?X_`qmN`6qk;1t!6P zPHA0;i`J}sr*qU;%CPR9_s|UL_c0up?)`6ut)rkcA;aoc6BsS$Ss+qd^pKI9I;{F| z2VGM8A&H+sA0LX<7nI}{CkY6 zrqtoJ=jybi92mcao8yx!I$U_a3Al!}Wdkr~qidX!WLcr^D$YibIuKgqQU5`tMy$)! zH{&QN#X_BCCC4err1DZGA451iSZVNLoJ8{wK!vLVwF9f`ms)og&tIk0(5E^?ikhz{ zJD*CqmL7tC9TU86gH-E^F5|6M4H-58!2VE&+q@gh6VHd+$?O;z_+b?0wL%lW%P&v4 z`aua13DZtqbkns{uq0)h0=|b*#7)!p4!T$fG<1zi0!A#=4_FkRm*qos?&=W#=#}4Y z%SpF)g-0%?u7EOx(yX&m8di)VJ%m>|-0q5!^U^PPO~izA4X4v(V5~@uClcq$II_9X z>~tLZjFi+2iNKBtBlzS3VG?w^>46;!&GafxkTQD9d*=Cw-DhW2kXN?k0c;vN5dry+ zNG1K>*7Wu3sdKq4P3=KJarzhk>Uw_Y;3Q`X^Jrrd7nvB%&p|8OB4gr&O;W*dVr2Qh$oW)9 zv;5SviJW`b-_Ea+fLJbi?Q!I2xv<$BV&Z}(6~s!Z3ajSOWVlL@kkC6RGsJiF-m#-tv{ypKSM9bSRyRVn}8QB|2YA3TLR|LX!%Xs%Re zcI_vN$|Yz1DJYpXB8I_nWOUgD`}oqFAgEPm6*>)MY;@{a+Vw}Mx4K=g zP%o0khU?Ioc0J_}$|rx($uX+^^qo{puGgy77_1=_mN$E-azCv4(%p;nT{4Y%COBIA zIjF?uIX9bszR(QQ3@G6N17sUmWhL$*Rn#&AFk=5u>1>?&l!R;!p_R6~+!vW)a~|E_ zuYFPP0VCW%7n{}O98DT}j{`5#<-1JCvkb~i^P()QCu!+Mtu(*k{0nv3Or4ZA3HUL< z+rIL_Son0Ol=^c9v|OQYgCTqXjsEKpD&CuB4@U)iwZfd?b|=-4%$CX|c9^X;&oTEt zgI64en}9!zB`CC*%r@l3n^TIIe4hAR;8?6(L?w(OnTY-J87b9M*q|WhUiN&I4;nw% zE`R9lRsobBl1bN-!@>wj!oc`-CWA*|ZwV4TW{12H+-pi9 zKtwz;sbya0q^x?)R{b_wUpO3Gg8iOrEom$@Ov*bJKEBwAf@LuV*Nq(57~55kH4nB{ zj6GdwxAmTthN@@LcrI*)|;^Xs>x*B~^w~9LSXFv&+`QFDrCIaJV z+p23GT=jVTs+GgCIv!5A(K&(Z;I}$KDR#Tab<45sVN;pQly<%SD0#$*s@vCrUq+hp zoes#fRWosjLn5OnPCL1*1eEl<7e)EmRi?jl@nHQ(PNw~Im7M>G zq>>J;_O~UAD{XaVTT;To<6imk{}DxBjQ*BB7;i$YEGD>|Mi+g#HSiMsU$j#mlL2^f z42%3GW5xwx-T=zGR6*H>+{DsS%#t&|gZ+*|7~GKo20B1Zjw^5A0_=t*v}DH1B)tmR zj*aN_7Dk{`3F&_(mIaOKr#0zKTx;fwD?ik>`#VJD=;TZHz@9#Y>eVfCcjuiC=-t{! z+9#p#mEwGlT3i4AC*?>zpinUnZyTI&bv`Z0_`6r;y@sG7iN#LryjeaK!7U3b*K}uV zcf_Su+|6#f1B~YBHO+{5#r4}mfl={}`V+o0o*HiY*SSm8&6(`hGp}zu{G*rI=1(;u>-Yc6aSo=7UPodbo{@I^sbofG^?cDjgx{Wo^H~P+I$`y_+lWV-r@X{IlouRPkj*-0 zlZlha*%nf|x}2y#Z{-7yOt`qQIVFzeo@~TI9(5jjO++&Q0XwDLT1*XtURK%>ySQ)a zYfV_%hsCya#ePQ*q&Z20A5J_Y0U_y^rSBbYWhdZN@=gZv0n8C`ZTbm}6&ls8l>=i_ z`&FO&#FY!p$a!aafU@i@!Z1&$A2G-Ah`!!rw9GAj<+juEc+E@#$x5_IzjU%5K(1vR zS9+E7a%wK8<|&8TPpjHl!-yAdYJjaXny4Wpvr0F6b_pV~($hCe&af~;JDN z?H0CsRK>N|4d|40SJyT&zTNthSz7p8{}#=LmLuFRc6iGYcXXQ}Aor;=7!X&6@$sBC zK=sOvKnXm%{(ebL(lztWa@whc%gS}@-zU-<)8b3{_DlPMYHr$cpYtcO(l@$(r~h8V z>$?I)3rgZAJr4YX?a%E&;b=*!;~TA|q482d-sU`aZ_14Djj4VI{=>&kZE2s$g#q`; zP0u$S=ERME+F2q7lY%pCn4iozI?0@EsxwOA409*qM=w113H&uiRg4j@uEW8+LzBwn z*+9B`X1kP&V-@@6)+vi~hYGLI4YI_%MGuI(O8&~>O89GTs~~GI4*^bPCDrV2j#ztj zb)onnw_OT~JNx>)lWn)VKDz%9T1V7QW{2H2V2yJP?$Wd-ZcQFHuaJIc%wm&wZ@r{xwo4Z+h}K z>{o6Pc@1-itc22eV|#edOs*xFQZYMb7uV3WF%*{f zV*yb@RG31=1Gk+?3=rH?l2XByPhSt88kARKWJtz;J^3E*r078B{4!yenEl?^nZMz@ zUj|{%O(&7zbsEgUxYyxO!73ue4^k)%Zg#j{ltEwAG9=S-3a&dji|s!4C#9XhT5cqu zxpC*2A$7GWwG0W8PBk3Ip53=D!E#SB(-MlxqU|Scl?^pYCZ)){^$xpUptb0|;?J?A z>K^&h+$GE1ke}bbt7y^L*2yZsY?Ft(on+=gh5bzBQ8(u*9pi)9cq72Oo@M`H;Yftj_wYt77_y+8YTcr3_BH|J^wynbgbr0o%!Jkc8pKP!2oi@<4~$im5z*ix)2 zS+SpT=*=8tl!?SCheKI@+l5zlRpG(S)%iFJ6d+*~V3e|}S+}HT`dA)fA0et>p1ryu zFf5SHVzJz-uFXO0`eTwLmvrXKZihkJ(qb42@dqq1?W?zJZ(WFRo-&q*dzjMxu#X}{ zHd_{fB(7d9J|oi>(2iZNmx}Z=qY%lM8VGwnEh&D>LY+@Z|DCp-m+D$~sHosb{%CcX z@!bI@LHG54L|X=J&V=$U&cSDcwnR{k_0fzZ%)hfD<^PCeQU4JowU@l9_^SH9p^}pt zD)A!;cB2czuXm3EC8%g-tQ&e{6#r?1j$P5R;CO4G@tO^T4{j;1YtUI!(}U;NIoj%7 z6$vzlL%15DWn%QL_g17QM?Jp}zCu2|7w@;6FkY0MuJOyXIf{^LJg7~TJkC06t z&iA;IGGU63WgF;RRe;;}-k|5tPJT>XZ|~W)yPQWU?nO*wnF~A~x%}m4(rB%XJ7Z;r zd~}!9Qw=8>Lvkbr$oEaW(oNq|TJL$d4m^rI{B)P488$!m z^LKRa2t5bp-GPDWV}n>*&bJ1c>I>v6R#c&6a=(LnSx>Zw#}r!CI{ob5S<&eMVK$L7 zo>pT4$k=ap7>S_2WKCsKpy5j}Z2+@qM(bvUl3t&)5szSbPA2}nYoy?h@BJ$9M$!() z$S8Hl(KAKs$a{-qO{sOYxBfMA9Bb>#r}PvHtxUBlF-A(PE_@gYY_xLGI5jf*ql(tl zVTpKTW_0k~7x5{5z#6#MF=DSASIxF8{$yEN6St_zk&E({H ze1uC1e5@ZvDuzhZwTY>s{N_)yuBaexRxXMW;1#hq7ytfzZI@w&@ZoG`u5-~ZR*`35 zhB;AMJEe*h%MOs~RvjMN(N%w@D?U+kTHv(K4^~InACGM~S@JOSg>@^M_oSu^+BI1T z3(wBW!4YiU9NfHvC?BBTOIDXM+BEMqSeFL5CM4J(wNEcX)%4Sx4sD%Ta^y03kTfh1 z5qP4rLs>KE#r4&1vbset(o(Ze&-y@7C#rc29bRDOXe^OdGhJmVn&cKGQyIKmMgMh3 z_Z9JcbMZ<(q%fWpQMW3F_$prYxqqRR8LAl$`qt z|2P&JAv~NdEaM$Kh7`&{1C(CRy>U1>y~Q1EwGf^_Hg(I~McvDX5lsy~VF~vQR;$_P@=-SXLtB#!xC>3T#4rA55^2+Sb&luS?$uHdVMZZ*c6adqmPvca82 z_$P6Ce`cJW-Pocd>P>Tau=EjE01~HZUhXqt~IC`O-}a7B6eWu zF^X3esaKQ>X81fhP6r2qiiLP|gn*=5cDZr2h~zS)Ft0SwTA&5F;+7MAvn3VB8<+$j zE|R!#%v<5@;P3b-wc#v9sIxJ@6N4p=v~AbxpmF07(x|ubrlGmdqJy>S%fg%4@iQ`? zdyU(1u2`As@yuH$2kV_Y7}Jek&Q#F;ljoYVr#ZNaoTh00g%Qj{b#`UF>Uod@*L<*7 zUZH&`G;JSnl{q=ekXnzwbLYePf>(I)c+y0R^&k?r0@D|HAg-NBImw=9K_Qp=%#f@8 zBxlncQk!Rr=5<<{lsa2(ArF3HgP;+6@!PlgF#oC!h#38yU34m%Qt;2s{ny!lL~p(A z=Zm+VS0kw)2vcp1*E0BUfBNRW3#!rm!={j;4u74T5*=g2=*AYIKjBhW;lsk@OGd-R zgK>M+$dB`7CY_vOX^fr11Ly-qZ1)(`*&$q-?>yf^h}2k#f;FJ5XDQt$sH zyBv3ZY~O09{Jhq@_RoOR=Mbg(KZgpwwdPB&>i#s~qoRwolR)5=MbM z3}j~=Gl=}`LFo+8@E__Pu$xrio`@ZpGbYua8*1lFNKe$~InLGb7R=w~7vxd6T%+}Hv2VaS?Sdj8r zvHw8ms%o?C;kI06G)SYH!pFcGQK6Y+iQUVdwW-v_r;#D2_y5cZPqbQ|%@*=jiFhNF zTHf0=yWCkN%JX2hDFmf*m-m>`=}BbaIVxO+H0-O2MKkTYnZEdBD=t6X;}POmC3@tD zdKHtJ?tmy<_;zPouj*+7VXQ8=wMJ4_d0H`um*V1Un-j;zS+@2BSRy(Wy0$az z>G9oYu)^Rp17i>4DYQ6;ose8*x0&zY4FXj%0dzcT*X#xEV+yiiB63?Pj`$#cq9Yj} zx4S;JmJQ&JCF?h8JiaWf7^QT|4*b$ZaR$6eM!T8hbC+GB6W+&h3c9qdvSX=;`@lu$p?U?UrMK#Djwr5zBaRxw)8l`q_`fA5-jdq1^f&6 z1`a^xaR4d&0wAO8PsJfUDvHKdG+AiwY8XoJV#-Q>i+m7OglETyl;T+@Q$3MTUOPdq$*-^(| zojJ?2xqXjHE4ijGBjB3SOm}~T?>=|}2;H2(dTNW-=8s9kM0C&)}N$z8*-q zFK?od3XUex;{xD{x=<}yy+}65e3QR&mX}&GjYr**!#=ODMAuktq~_SeL~-yO)X2#` zDyMXCMk9#RQ3(^JeXa2 zO27xk$ZxQH^y<`2kFV3@X)Xch8mdS&+{`N4>VLXXl~yJcJ81@@XA+Kuu-p4=4w=9l zSDG6@T+Ky+cztd>k3FXxE>k5ABeM~8X}5!fg~@Rz<{GbY%i!l6P-?s%)6RiE8UX-? zDyS1u*-pee2@;9PAIm`WyM_9Y``~8YPPx)jEIY=qz8OG}&1~fkUbHlCFPh$GsNofU zE9z}*A5{o3KOrVmY1}$It0U|y*c>|=`#uPn(ua2YE<_}Huc_l)K_n(XRfFd-p zR5>e7PxzR9&Pvh>mGYW^EykE_UM%3_y1bB8sY^#n@@;PQ7jz=gx*2$lEt5!7<~LOPeFkMKv}6>RJ~uDTNz2(a($cscU?`5ho|k}= zk-^mk$l8Jco6E5odKwyZWx7>fwHn3Ivp-)i({4g$t5%FA{DkZog^Q|9EQczqtxb52 zTXjDdt47m@$i{$8Wv3MrP4uOL$iQgsmE|E7@4t0&srA1$iY=o|jV-`NupW=E21Plw zHJ^ObkWv9f_*9FxQ8jL}FYXL@@h{o627XLKd};7WdnfEbYjVPh#nnXy%wlv>kRFL- z5X$U6X*w>=sHxf|F!)7TBZ(PusQu#vkH!;_hN*~KV`Y&o=zY9Cvg16-tY&=TYB!xe z<+)&phPnd6$r_qi|hT>j+xcxI?$P=9val9s}O#j=vbsH>+zDZPpy_f zSPR1WyV6$i3k!~}Y?R&mX^Xe9i~XY49+9!}g-ND(KaJDMt)xiF!D+`1#~=7?L`AvP zVX`wngd>D4yb`>XV#q9$o>iKxb;iA;5N-_@iU=i%>3ZgqYd|IW#K=(HqQR-62?SSE zw)R{5x|FRrg>%}m!l(vg{kw&!xifMxh9439FfKRA(P&}Kv~rYXg*iJLyYs(4r=EH0 zz0vjI)F4S2=EfeejkG&VcR-_7FW?Gvup;3oOrh zw#m*<*s56BS942%3woOmPxxisHXS{NIgN&Qi_Rk1-M7dg;OOT;s$uqA&K1hJjo2Gy z!QMjdt;^agvhQBw5tAh*X%>@`fcI4_8ixl9ZN3GGL_zoV2PT_tsj>lwlFAYoug$KI zDh;2|Sv~-O^pf=^$A}&Ro8!n^&uydq(%bmPxl`A5t3~6xNj=&xh-bvsbC@y~p$QstgbALKjEJ%hrz z_D2xCZL*S;-Bg)@&jKNB_0g+!58K52aB8F<39J3e)Gj746UUDMLgRC?c73I-aI0SE z_KFa6C??(gv+(oyk@CXAsZ$olGNZTN6c~5{yXQ9K(>nhhlNPo4c;E4p+7mbxk}P(a zO>XA)v0k%}in29J1A)ikM@0oy0)`vlgDZ6ac&`}nEKO*tA(ai@7t-^Hbbht~`KZ&k zVjc>w4pPzG7vSEzs`fMD?poSq5S*wus;f4y-KB{!veD%iO|uhyKeMX=|3DkWXUzjp zXv6a^VBn(IrAc6k9Tvqmpb6ZV)S9`9v^l7Xulxlclc7Q=#SjsrdrTh`S!SyWm#ej$ zy7lRGOK5=!uSvRqlOl}Ix2!kJ+E9qq=sdc}MAcdxqu{aYZ{7^WM&xLV`lSy45*5^w zXDhSM?=xE_`ICiFL(IBZ$4d$9m{q|4#bF~Y;{iT^h#BZ}^%n_q7?6;WurK`WP}j=Y z)RJW18Liz{LGpJN^4w|?3l!I^q@c=Y!u)xwF*{863nyr2XR}}4*1Lytk32ILoWSpUU!0t-g;6`m&R@p z&mR=uLmJkhohA!_6yo;E&S6O4bB$e8)=`Qz7g7l8eQN>Q)?56ZN#a?2rMbDdNd7rt zdvr7@H2Z!~^VD6GF|`sRn2faN+)yM#sfBE%T092` zPi8XmgeTsu>0FQJVSnoVUF||36AVH<{^es>Vz2J9ySwbx4{6skn3_oQHIyImyDXA% zsUj90)oyL<^bq2o+Q*X3*&<(|xSAM9ZpzG@KUtLhGD>tGTb`KT^L%jymO&;%o0Rh1 zb(J9&kBksGK@{%su?Ko46weI;k5wi%yz<6eoutgNr=(RaWMWW4@Q~V1mT-fP1ujEb zh?zN9Uisd{r$bRK;c2t+iI@m(`Z@g5>|M9(S$RV{DV1$*(1Mbb2WFB1m3AVeie0uK~5tsrDvda$n*Dqc*3Qg!fVm z+!WX6>nM08woC^v=6M!#F`$kelMqUN609$CHg4{iSR$rx17)J1%~^*3NKeyJ_@Hm( z>zZS`(iMW$PkVk2iRvpX5*#OtbsWE+V%L7l$*PgZ1CZIsj?TElOtu9%h{bO3c@xYt zs3Xj6Eb_;2r+$sCEqU(Q^o}Cyl*22*OD{^KVO(|hSXKqL)Mq_pyH6*FOOY5H--z8G zk*Mm8M1m`3as06!qjq->cbrMw(k|L!P@m4mzOOX254FCGo6eC5c+llna8p&x4Q?qs zhSn)gnnfOd&eMuKi8Oa>GH+wA+^mURsq7=Od!isp3VD)8M5c17K<4t5LT+Llpya5H zF!3D{3T=a;!g7mj*B8_u{UDbWcCYN?sG&C zukF{e)HIaxL{>KK(3%$$=YSgMo{OrtfTp+eZ-KfhNw>j^G$%SUJY?eBq(#>%FZu|( z0zEksmSO^g`Amm=&%4O^{L770#)604gW~bX4$}Z{n#oN2w!0bLB-AwAIF4s+fksFn zWiF2-MKP45daag0AqhhAd`tJpoYTly3T24qwZYXcSuN}Lj>j(K?{Z91;nkco;tOP2 z0Pl$kGXK;zsVr`HfLtc)&m=`@UCP}tWBrLh_*wG0smr|f7BD-Jc6Rx4`MO9hdW8R# zeGG>QhJ?d_RULS)7j6J>A5X54@NDFiQ`PQj{-J%a58Bj-b6YU!f)VIa6_;qD!HBrZ z2N#k#2cpS+7-j7I(}YMWFzE%dZuOMDok%^K>` zyQ0#OF*TkimQx?#N%Apv|9leo$$?Ov;)JrQVN)_z=+uIHIb$S;4^_bUrj0^klg~RW zO6$+O(cya6;!G2NrL?fPDn=3SxGrTZm@lkz=|}lTo70WT1eS^AGh;DQmXRK!te)r)zyIbH?bk#*jqOweFe33SKTC z<^H565F7yY(%-QqUxX>+JUqJe&_1_|EK)_d`RZp*QKUyzBYDe0nnm}yc?YbWn|4CF zz~ByWkzlD0;hM2QUIC=p3!9C8ToAZEI+T=-Pd{=TBUS5x<|UBKx@-?SOq8p$ux9>M zJEs%og2_(QR1Uo4+}*Lt>oXQ3dqt`al6BGB1F0WAsNdOI;_uBdm304`C<@N34a`%o zaWf^il>-Qs85qrjGpxCD-KBvf2z;q*xajxt(4K9a+gI7J{`m6wMA|Q~bH3pcGFm-N z0^-Ch|CSSj|6Ug;t31g)P|XoC7LRc(tp9P+1>of{yd}=~XuEE<0)&pXzdXBpUj?Pd z`;dFNU{5&4<9<*W=?}-_3}ABEhT^)-j6LyhVqRI07s+Pr?t5)=Fu7j-GTNqaTu|9M zxwtG~y(p1qDypxg=BMzy*o5KhZ_&1oV>Wfx4F|=va~{rG=1R|w6KJg=y||)_#fu%0 z5ih958_AEymZ6tA4Q=3N{??UB(dGHA0zFaL3FwHc#Pe!pq#|J_qu_R?SsQya?svGQ zUW3_avS9W}9y|_nti#e4sgi=Mek1&d25jZMB`olHIJmW??Wh5mHo%`H9oN_Ky3;UG z%m+NcOf|G-_F?m0> zN?r98flM#aWc{-($@ms6mV-<~>v3B=y8Tz+S)j~&imA;8H@IF!eXI}X0H3wKHA_Tn zXw@?l{egz8gxTZ=#*V5r#w%V{%MOvJ#nB`rPMESuDIG>P5CAFg1<{|P`)ZDXS@UsR-&)q z;qoiolBsty`%cg=eQA|&dco-ANwx4G-tfF-Unymd2Ek6$ncQ%hOTe~5HboyfW?@N- z#Zj64aa1U)PxMxWR?a#|(o&$)S~9<5|dqbKm3}L^K{5vGK#5upL;zWKu1Sb=_p@)x?I~3CEMk3 zuU6#yaq7p2BCx(!o!PO~=8alP;fsAaver;A*vIKr0hw)jyM-6HTzOBvIfg`(Yr+kJ znMLyfjF~E1cO*%9re90(`#0+5-I-6m-E-sSu`&Ep)rj|M9rD(M!mUv} zyqV6ijANDMkZ*S+>FGc23dnMsIvF9xolR5>BTLKuc`O|)i9BRwJKPUp3_dWJV%u<0 zlA!e>Bj1d1!{geiEfdFkcg4g5UMR!TMwS3?1d~NZAV@0j%Dov{uv@D2*J&UP#sX$B zM!#u%>KB3alts|oe*?(FOR!iiT~d#YY^GfU$d3e_%&DejfBXnU_#{slt&qP%?z^ z^r17Z)@-CI&1IUOFsDo)X2RRo=a+w?rbczoo1Y>`QV#(kz7Hk%7Gl3}3<$d}SPmRt z21RBgO%+7CyCjYIqw<}}IqqPkMOS!;vtAi86#F~l`x>sb(q4)wbl14lI+x9A;>E7q zm`m&0yeidOoRKSRAN&mlblTtes<`0xlBi@&>uAcKl2h#%6_3ak$;d zHItM7i0GX>`&KtM6758~z3>#>8~c3wTJjWAouZ366H^k~cr?9+7L)7gbr0NF+{&p+ z*pNk^dF!SgG+Eu|K1zSv8)ob7eX~;(a;1k-_YjzF&+&h*^S$zgSBZJ)neE6hq8IrW zUS+@LHxJXD9?Y?*FoyBZ)or`MHZ^I|oSWy|Fe%^f)D^AWO~TD^K84VU1J=p!Or{yg zDrl+Lk5$i^t#by81+l!f)DIeI@yW!1=N&H&hiBBaQ!v4h&HGN;FHTdF3zCfXHJ&LK zG4g)iO2U4e+NIxpbf?R)v;U@1Olj{9Vy4_=Rq^{;t6r}LY*4mFy=976gE~BtMXXE0 zbbNH-%2$?oF+06@OI#;CdI)W<&t*QOo!;zNX=-lGs>L>^7|MPgBQ^K-yHV>1##_j= ziLG^ymt2*Sg1*n+SMj|0?`F#HPzREe3*&)ASZuak+cDWoxd&fv_Cl(<3p!Y?vx5++?+m8+#C>2{HXUEFTPk{3mA=tSDEClFwRQ<$P; zirlFj1TPK8ASn^r?|o7yN9<&;brHLqV`lY!rcgT~1!H)kpi9TX7EaQIP>9ExS-nENR(8kk=MDu@$- zp!iETrTvqW$#z{8>Zaq%FOA}r8YHS0x!7W7qtOd_**rozz-(|@RV?hreYiU7%6pVT zr6!La-#WtH*h_`1T+-_4`nFkJq*s#pn8sR!XFA0=!!TbB*2DrfA$!4;@`BcY!JbGNZOdcGeTu)kuGadVMJP%&L${Vp>cDDYdV1I!Aeot z!1VnBg$E1gW5odBfu~RuRMu(VqYvU5rDFqG{O%cGCO{tC9`EMH7S`$Ww?H=5+zsN@ z(0g=RQH5>3&h#KJ@_Vq9symyRWH#>9y+gdYzIH6_xjN{!m4BN5x}#vrtQnlQ4M~o` zO;nB&{P=IX@`KGs#JE4t2{LidCmr>Af)%3Q<*=s)3JjKwens&*-_g;Hr;Sg`;0y-j zK1ZUI7$>UC`ux!#f{bPUX?b7em0!mj&`*)nYO273O!?kUPa>85F0cMPKofWlXRyWg{f+q>G=CVZ%pX3@IJeE=`ADb{lP_ zYW}bcg7#a*7K>m{44foPykZp!(n**n%|0iTk==IE#=<42v$lGbtDt6kj}?DGJv!cY zrcgf<8>32Z7P!aTq53r<447wV`Y3Ou6U7=5U7W?K?0rl05_d z-rXO=$>+OPDH%~5N9?M~Z=?ib?H^c~ASyqo*}Xe1;y?D_=01uqBpZM1Nw zU+eWBc~4UgVGPS}j~-G@Jqf;%ywOZTh^QJ2^vheYrr#z0zT4lo%MP|}O_Mr9kCx$c z{00OeUQf`393C&y|2j-+Hu!cY@kiFD_v@>QVc>7X3h?FdxJTsxopkR3>9#R-LFLWq zY+Z9fXarCCqcz!|@LE(=#x6}(Iwa=zUH`$EU7Wcw0nv>sYwuM3ysRno%z7ZRji%k% z@a%;dD7(zo@i&3uRqNlihT={X6e$;8LMx>282jcKpL~)J^WEopKU|xJ%CTFK-2*`) zBP`Vl&F8Uy1nP52tXz<4y-tr}Jvg+o9~!w*kamvq^t@ACIVm2P`k62br*QMEK8cod zHp!m>ONcVkxSM=gMrqjY^V>ESHg5hxSaulYxZPd6&u>)zs>734W~?HtUkC0e4uQ|5 z!F}vDVjcS{(4009d`gVi7WFV?SvT-#nUVEWl|HcpJ<+9cZ<%Staog34WE}8}VoA*T zJ(tvfM5zi>Jr**2yAS_nHWkns6O*NcRyV;FhvVgKynfcN{!9jhQWn)qL_9Fjza;PJ zkf!{GH-1D(=1HdTHM~f@=g>>wwOgNMguT)mTLY*ssNzBciUUM1r-O!xx zj9=IXy_8M+eDF4Tcxpf*{XX*Tjr;O#)}fR6x;?C4@oqU0gWwL0>w;OYBYxz?{%pcB75 zX2+LZsdk-Mw#%rnQd9D~fgpj`_wRo5&-UeNT@lp&evPXAl162k#@EJ&(J=r(AXc;H!(9Fn%YB>Bq8DC(hp z0bi@4UddPUM@Pcf3QLa%XaVoGVa$lx?tJUlh8wC`zg3keo`k>)rmo3_G9Pwk^OeE*c3_sp?8eQh1}&;W9ZBjrb#Iy*OQR5O>1_D`?;M%zeKP&y&fI`MPP zEadcM*vG*9mOkD`TW+j~IWhU90Ev#u$k@$16wJ|ZYGK($UeHvdgKm5~&HUe+AULnsH>9u-0LMsQb3^%=Ey^aAmSzMlwZ!ViWAf zzt(YY4_L6Y5*?b#7d-!_A9$6&g`ycXiI7088rOFfzs`J7bi3!r&ELO5UFmfJGqnG> zD>&`Y&kVg?XGy&Y|9amQ{uO1t^KxUvI$!w~KlFjowW4~b>S7xeaEzLTv>%wRCzl?Z zXK-b{F<%)q);$i}^bYOza2y=67}rm+^5^47 z5v%5%?Qk2}Rk*SS>-%}HMtgnsS2ikpcJo!wcr0JYA9w#pWaPEm)$^{|d*y2p@N9V{ z_k;Y=%Zaor_z~mxZR3vNnY9M zAs=~N>ofdV#tiKGt-c2Nn&N@IsrFy%x-T=nhXXp8^~M8Zzze=7C^3g4>Mw|!mP4U- zeziBRED}0>Lt4x!16e-_c=KNwp7=$VYX@*Wtx3~}(9!4M;a6K#n{W0gaNleVAFht) zFX3?)7PSC!w8sD55pR04mH#=_iodJJr@RPu7>+fRhRhXuKJuaES!kOgiD$tKefChi zD0aHbur+QRU4TWYk87<}Hy%=USsr!3l*2uGo}CrHrHJ-rUaOKg=&6r_gx^Ghcr?JirgmV);jM}mGU|RuVOQX~ z_aECyghwl?o{79AmKFW^6MyB2VR5g@s&k|;2WD^GeH7}giu`M4 z{46cP{}^lEXS8w~E0g(nR0H;E;E$l#^Zw`#t+`m1^PS00U znDgwk&j@JU*U@cRqvO#`ZDXe|fkrwgr1!e((&A@y^|U7G5eWWT?9l`Up%g0?oxli*c%ci?WwX%HXxp*YnX0}Rcbme&Bjz-3HIaGaJ{oW!M zgDhJpq4tl6Qjy##Z%!7nXx3lOV;!WU@xysXER62$+n*edOnO{dLBFV8^Lsn;{qxKU zy8CMC?(5Atlk4Yl4U!2dqGnM{_yLK?&zrA3T)_`LXUm`d;1@Au4=srK07b4p5%>XM;)!DEnT>bWK$O((#)nf&S!WLBeu)+fXm$i@u4DLC$ z10VOl&zp69j_@^|vd<=;r60_EYR1tZ%R@23 ze0k}*$080tb*3(ybs#D2*m4-Q?uycq{<{GvCaxge8Cpj+6#A++VKY9G{FUGtnFv_I z>+xt})`^Y3#bhY+lQ3NP9-EjrDWZ%fP|p*W*0IxdVhKzU5PiqPFMG=%<=f(@TU7$< zX;lfCk#Tw5<-%2)r$u92SBcJw+~PyoX3CiChh(k(M-=6C1XGw}%bW2w9o4ewvN}4;Zf9Xy*CydvEB`!ha>89urUBzY&_{JUyB+Gnqdwa) zrxYSKw06NXj~s8I`6FG6MP7RO-kst~A}UHpsTxkQfoM|RIGLeF*qk6wvYQp8XgF3} zZ|>wo=FsBp-Tu`E7{W%i$A3Jsgpd2F^p<#3!KQ(O;H`sH{->y{v`$q&*5$}NZSzz3 znhsbtrc`gB_jh*b>E|bp^`kpg;2q-VYRhZTEU#O9^lW$>uq|5Ym7_W9J z?MnG7rI$;}=5njqedvzKslS`z$hgLS6dV6zKRgp~0s~-Ixs$c#uIr))9!p?qJ(zs9 zTV`gO+fG;y?1W{fmj+J^)jsQLEU{R~x6sqA^_dqlaZ5{e zM!&gLecoGqmP~si?LKr(u)N;WQ@KdMc%y|UNTb3i<~S&e2J$~9fu`(MB2RiBJSk{x zU=ct)-0bmtLT{Gi6?f!~+ZUUopLuarRGLV1?=1ZDkHO-dXB2Llf z3+wQ3AA=zSqf2$jp9HBpK>fsPREJG%cv;1?gkyhdM0iZ2@`3;(1CZ&=7w7=#no~B+ z4hnD9cw%$~z4q$S5v1Q>u8^%47Kl~FD~Hl?RRn!xXdh#>S(*A+TQ%7%>%KfJF#<A?N) z-D;CPi_&x08fzh|H#&Z`*moe4NQ4`K6JSt`{cEmMJj<(6&lE6xBBO@SEAOQ@TRLg~ zsZi14e?)T?i30I{R40~PXH{FX$F58S=4rv=>`XfM1~bdwKO|x7FpN@mq;S|A%SaT! zwXTum?P<0+RF|S2FOL+iRio4grb=_#DZK+|LQMRts4klys=nZ6`;X{sTX&q_S@-vj z4@{;*PJmp;Oyh?{F~*2>?A)U=t8!d)2`PYKS-&?%OAWEBt4kxi%>L=hKAMrsY`&Y@ z!~*45=k#cwiY6uqI2}XDBmPAg8P&2Mb3CE`hNgM7+Oo#bG6>7%k$&Le=?f}xUb;>i z89w3ZGgZCKP&sz*EU&K99q<4ik|fG73`xE4BmX?Ln{NydL&+$ZCA&7%eKt7$!XWpP z^>Om$qYQg_dHQkjVx12IG4Tm;sr0W`i3)B1umsvRapr!Zv+&X?MXaoR0* zs$}}#YRlY9@5Pe`@qcf^t&sdEarV3rGDv^sk3VEzSoF=Uck_W@w;+K(w@PSG>e_!q zK(?3rXDObFF(aeyV!T!8Ulns}Qe(KGdqN8b{02HY%#k@%avml2*fV#F^8B$>lM?zI zXzf|$=XdmhS1Q4?Xa>CjCf9QC7tMrJs?jXj(Fn?^idj7-@v>3!UmTiMl(5w`#V{kh zI;jrnhSY}d_FA1dC4?R%4DUU*-_i&%J3jgPV{Bb-l0ciYH>$JeSm!1DuvHSAJxfh? z&qI_lrxV~<-9=PrdH)UbwW8!`tCIU{K4^D7L#vIjbnC*D_<)DjR+;I`L3-9B{%)Bi zx+OoBt*joXxF39ppNceYRa@0sph3NjoBx3?i=4UePcio}(%PFC)iSrZ%yzhtpWrmq zkDqaz*Y~~2Wk`F6t;UgLxC_0)_3^Ak-{!w!mWzFs>L)nEk%m}g@uhG>ZAL*U)WAp} z-QajfnKt*j8m10PLfp2@rnX=4qOcbaX7 zHvSaC{p&TS=4{wL$4Lf3XY&0+V@?9&rW93-1Xx1#cW%Q?&hy5O+7AKa)7V2}MUme4 zIL{G71)0P3wnXX*p$ocL^ z##=YX^z7OOw$|`jS*t!z^MhU?X!iY<=Qmz2R%TcGIqzDD4E%9%+~&4v;Hsituc7fP zfSK%*t6-}b;Xqp_a{2e8{q;F=INsmvtie9Xt$x!|6ew$cYtJa$-WABIb*x@>Y|n-n zTznLl2oC!8y{{A;?^{aRGw5$Mnb|t@Ii9^lz~yS-5ckR9S|oZr4P!RBw2$vgSv`{T z{c){O_8Q-4pNCy7)2Dl;%~fhsyA{HIkFPK<#=D{%J_-jfR=&$kNilzhz0{gN=%a6l zbTJ4|V)?AjSLAJtORf^XyM!88*-Yo>iBjj3kZh~vkZPBW=K}z9qSHvby3Dx=@waH< zS{L+Je*10JE$s)^g8Bi~KI8SflP$n!(gmZbTyLbi*SSG#Y zwq=x52#q9(prbV%f$66x!|z&>)3bmPi;rCHvoH7t$c^bydDaSyN9|ZuI0%~vyIy;5MiM~qtUu`(-J3!8}C;X>c^DEQw)Y3(> zE05Es$+~`-`{dF*r-9(+53-F_@8ZNGDUrkraEQg3=_jF+al}f$HuW1Lm>IC`s}y0@Iz*Cqmh^UZ zFHS^QzEd-5i|`&-0Rfc-eow!>vxt1wU>4LV+Nfv0<-)_SeyRP26+fAa-u`vQFKKLh>)YE~mTn!V|sgsB(A zA`+ALoR*e5sQja&%|z%Bra&a?7JW$0dOdtB(O*aPx#JVtey6$nm)cJgl3v5#?v^qZ z+~b$piDGX5BCOV6u-0B#wsvT0hxGhOOpqfS(cP8Xjc&X=$b-|&=4opR{=2^;VaYV? zxb1GgVNcf}!nVQ`CECW4-9PbY$d!a9tCYIJj&Z-|u){T9Fhz`CLjYm)XV#mmBt>e( zJNq^uZR8=*mAHzd6l4)k+yU?I4e9m1_AqSATMee7o(o*qQ!MaVbAZv79w6oVLKN$@ za%a21U7(aq5gt=(TzP}Y?iB^FM8*4uMe9dq0;n~y55t4*jqu%J(~q8~b?49B%#P#N zl0+xWHr^9ml+Qwm_V2Om%uu8aLaJJfrDJ88rE&}VP3M?J?Y-^4h|$m#qOqrwjQIGp zzWl5a%7)AgjqgJJ(Ph1)04RTr4XyQXgMlD~qg6xrL7$Txh()QQdOIV$#9}XNv%JAj zRm#m@d%{gp%;L(uqYbP@giz`R+?PO`KV2uBfwU-vtY^wy;V=DJf)f-zC z1`RYJK0Q?>;9EBK67b=YMs4&;@2UzMRc?GM>dMK%8f)_bWVjrUw5GRpw|1uG$y)KA zcIbj8V57-ZsCBS!)EH~Vyz4m7SXsKrR5mY~#`Nh`>@YZ0ynp?LfQ-x??x?y$9catI zXxsZZO{MATZENSK>a@pFw7pL?FDp;uCknEA@WOBWHx}J|ITu!2XVugdw~NKRi1z1o zZB-Jip?`GEQr%5wUot&2z`XI7^WEs^5cXU?TzEfQ{G&+I26`A$!u%KZ+KmWTU^ zMv2lFxpc8Vy|Slcx@}6SwoqguVj_Ls&U>-ABItMVr1Tt?Q^Q#W%wWqbQGSPvrEPYd z3#}Op_#;B9kf{lYJR<0yevx^`OE9oCe9i0B6ur%~M3>djUT(TnUc=TY14Uxc(5E!m zBL3HG>%8}t$NT_iyyQWc(7=@h>*?a?RkS(?B|U^D7@kBtB}BM*Iv{ytWvvyGjJ`A9 zD~Pv{)uElhfMGh_#Yv4qL-Ljn&;LDRC7VjN?kjLD9%%F5*x?uCMxm*qKazI7>Uwda z1w7V)cBmi?@cqR%m6x>ZVY=lbj?Yh5%!Qndm~dM3lGOz0jzhwjQlH5>mXze9i%Pq$ zLH9&_cCD#@eX(v{fn4mIdtxPlX{_0{%7~--C_58iuv^*raF8U*J>D!)fhmu0wELyC z#|K}5o}JhZw}`glQ3uV=KNIOQsV(!!U5TJsXHe;29Ns_Ud!NWstqX<>ly-Uzwdgn* zK0h`8?ozthQ(3iA{YV6x&?W2W%}zZBb=kzH*LTBkI^6H=WqQN%R>aE55W&H!=iFn+ z1Ve1k?FtW>#v$fq=zm0`PjtWfTYpW^)Bl+q)(;;VK6+VQa}kWgtd;tLZ>=g16E>q* zs^davys1>Z!fq|sOcU?u9VuG}?Au2rKHYG98MmS5P4gvn_+o1@G|)3N&0|tO8{P>| zheQWwFMQlO6U+5OR(G##P?|2C;E5wy;V?K58SN{HHx;lQ(6cXpoQYrLW?96OCUgkySqyT zcMlW@PH+hBP>Q>IaCf&t>HqM~clUmC=G^a_J^NGChq@q2j>AXoe-xBgQVBjX=U zwG35CA$E%g>)5_jSFW-toj`fa;#g3~;6Wp72G{SFRiNWOQ)YZiaZ~jAllbiwWl=}J zDx?%+&Z4c6Xj8_syT?y>F)M^MH#GroE0bg?D%w8$5_x`CrS~pj@_&}uwN@~e&n2*x zPHE#{5RE23>|??nlizd-?PO|++V-+-=Q=v+{JIg zRFzEJZ5p%0yb)NtXGE}#`n|{Lp_>GH_)Mp{=3?(5%0n+f8rkCo7lKcUkxMhSj?~Z8 zC!!QMHl24&Uq7*-z=H_)onrC~+>qR#7Pp(5N}P%gdJDJws%@wL+IKcAakFi@+ieu` zw%HO9NzMPpxm*@Ep3w#0coLYnG2F9a4PbkyJc zMIZAW+IEJ2Aa%X2B$jvm*&EqAfqqR0Y4XEahx-|22RBAeCzcUs!KBBlM)j;4+?hjA*?)f6_7j8{9Y}Sp*a6(6zP7LC|Rea(EpNByQW( z**W4qkHh4FPHCkitrFSP_nxVpKv@N$#_!C@2>@0?x)TFcm#iVW?44RGOVte#AE;h+B4MoaJK-lfH@ldqg_ z*bpAnz{3S5o#(7{knyn=)h#n^0=7OA{t#9n(@)P0_;8jR_Z4@%xB=@Yv1yA*gyp}o zSqM9Dg4gwt_?|-hMc&C(T-;^O@`_sxkyBXefZ)L9-)kTS6i;L3%Q8x++uH*t&xm0k>U33}u23on-VY`AM z4B{EB@A6eFgI10NRKG0WfqBE#2p%1sg@<+dxYpZCe;-VugY^4jf+qU&5+nTmCw?*^ zN7~HWr(6NlZ5X|{|5+N_Tc%E2Sr+OD(fnKw^CTr_H+lG|{POWNykyDn^U8dH0 z7sHC`yRs7zWyikaB@RPwAyJoSOa{Fx#B+ep!iQm+{PN$n6k0A1uGn|jm#>+Xy8-(5tTYYhv>Ekk#iK>3F0cXZ#?!!L5dnZsdXf(AZ|EsX*kZkwgfv>sI zwv}~4`Y55<4afv}CD<>Gd0TX0Tk`#Wkrl*JSut4rOt?eFBPBNHX|YcO4TC_v;AQR8 zE}I70&yur2J!WJ0Two|FhTp376}g0BieKgR^>zBXwM`M?{nK=k^OdbqT^fQ(Iqh5pak|?|$?e zMiS0TiIF6|B94V4Z5~t+y6A%g0UJ+hnrrdEs`-o1O5?`t{Rpw3c~Lc~Xffx=zeoMm>#3a;>Xj7yQ=<8numlXp=!y}76cIA^et_k-nA z+suTwO4|R#37=wg`x@SmTLv^h`Utli%a>o{Y>@7p6aPyH+cl~c;Am=h)0z0|6*fBW z%HUJKnD)V@K9AMoP@+6f+pyXRjdn&$Gc(MPiT47>Y^ClAkXJzj{0^NUM83d4u~(@n zQfP9Q6ygS6l3Vl+U3dVlb;*dD#2;=srp|fft;?0kV>^~~O6iKg+6R&bX2%u9Uu{exNg_4+TjTeHlUG@8aD7jKeVyouUbUbQR&?_{ zDFkt#Vpf6%@)~4bduL@3+_IKe7xaj^S)4WUzJO?i%PFl+{nO1u6!`L|e#sT-SAQu) z!<6{9i;K3G5jcD(R^GW;%J}M;i^GK7sZT^=Jz(Nz{aD@w<1bakPcwG`)&rQ=;E-Mw zvmUYbgzUtlXr;{VsRm-Bsyl!fNS;>3q@%jok4jhr=Y^cJcK9#6~dcTT#N#LCI(8Wh{F?8~GU z9oA&!5b@?A@5f7b91?{~(BGuO`@aB<@oHo!0&x4quTC*ZYixT{@#}5~MI}P4aL}EE zvop7cyI1Qy)WI^GNz~Eud=j9?Y!Fr@gVqt40^1Fds-x*D9OGC!>kCa)UdeJ@bK;3G z(H>(83{SOJsg_Ea;I#x+XAydc`3-8@&qlJFpHP_Mh41e(=;|J5DZSf%>gJY$06STw z9MwDoK6sk2Z%$Wuf4tW9K{8G^A^;1xe)|^P_HsFsWKY9tpPy2eGPK^g7Jv4}tb9*r z!lfS+UAML8s*=SEkmj@~CV)A|;eGFc7fXCL+?FIsCnppeAD~&N>#YwZt_xD_hsGcu zBe~6)3vTY(YZBI$2xEoL@cYh)w?#%mQfr;*@^a%!P>*X|94X&udr2FZFrK_0=ply&cgA_>pcy zsy1Dg7*8S}jYWz6n#W2^ZfUPoXVY`^1@wA!WgkyS4klJg8#XSBP zC-I8wf}{jXW$LtBy6K~1d)Jihsn!~o9u2zfse9I@xxGRlH0(h3E|6@T=K)W9zu7Tr8At(IUK0tFM zUj{8Yls9#EvFEEMlMq+=`6pdg;JkLofd>ZAU{Wsw@vCTjOiea zWdHqUGhYPhHZjoh+$l2%1pHzigTmt{c}DJEA#U;j6)~zc<%S(jLVjsXoQ^>IZ6kvj z(Ha{0;v&U@1DL`+&ChE``F3}&p}cNux$>It4e_5Zki|U5`}I)5sOZAdyV}J#W%#H5 z!)Z-nNcI4z0CF@3w#U1&?>p0Ey;EQ60J<*V&_hAe+*O?KFQRUaM7#9c4;G}T_>mMh zxkvxu%n1ABe$i`fsNp4BT})FmJnc6vt)tuIRQ-)FAE=dv2SF81 zwWMrpWKd2e@nKmABeQoo3Tkh1n{Fw^{KJHIl}jzYj&>R|SI(zK1r~aU(u(vk&b5sM z`#M|Lpd>WX-45N0^`n}VpT2mS0M#fKcbLGGU)^=?k6EsD)M}m1J(tO_5;rvkD-7c+ zh~Rxqby-Rf(x69kA2#i}&un53D4J;;k^9r0n({Yw)rGNLrSfEWreqrEglrKv#mLHZ zBPVH^wq-`_#jq8}ferVz=a#!0{6Cyu>#=kvDg)mAGtqi(S7ga+zJKA_?>er`b2)2D zdln3zO0zs+pok!o{JY&)=M8+(oPbUPo;2P48*q#J^^Cpw4A}gj?Lc3}%-`hr3MIx3 zTzQh2NMr`TGNc7RA6DReY@BxHWsFy9R@RqUBr!LxSiF9-X|GkdGKiYU(%tmc%XL$J zXC+c@nz)74bA^!6+jhsrAWZ@dMY@IX7KyxWVaO|9I%wo%Ty5iWlYSEvyhPBg1dc?U zx$n;e*GsP*<(est&AmUYOt-{+O=v06ypm7T_WOyui8-Sj(DK0MeE`c-)(rc%RkQbI zH9lndNV_6W#Rp0>R>hFADjXgpRq)KJlw3i90B!d<4BD2J%-Y@OzHQTjz&`gop=EGz)t)95UMEhGLa3dJo zq#BP7{uohF73tXM%-`s|idd}+^<20`Y#W*V`ikW;0SK(}pdL}R9xx7fyn1SE@_;Ay zeN{cY++k=O?4P3N;+r(HU_vhV*_)#HOOs0vg#MPGJZtwgg2O5HN9{Vs6;xilX0fiG zYK?JU$M9zadcS=dK8q|E<}B8ee9!wr#SB%=HZc86fP>s%LI3^BGhKF6K&iKhlfffl zsn(i2f>wTU6>+;Geftkxp%qQ9OebgKvbY=M8kMZXBD?#FX zq+K?0+&?ObJW7cgli#zwY$o<`cU-o|~BOVv~uzf~qLvv#DC_!)ELn9!b4e-#4J1&a!#7cME?((oG#*(P%+a{77nvG&!=<(Nbdhs9(nMQ{Y-1*h!B z9V$lDeL1Tvl0i_6w$9>w%38hD^gXc()m!TDXmgWF&kjcaepO!&Ee;2kpRA7*mh*M* zHEQ2z7=nfqc!zc&xf?k!7+=kvVp?Cvb`lf-?*HQO@#AT~k9>*k3b0Ml(ztMPi0xuy zIygtmMm$QZjE%F9SD{)u_7O0$-KPALA3tH7uJVg)G{-IHrO69iy&tw+p_%I<^GaSV zvLZHf?Iq^K5VP0z@ouuUxaItl);|bsxeR6BN)CcpOXX=ViC%oIcXd=pKUE>!>X|u` zB<9HwL!x$namnUyrPcd)ls&3udLc3)>{7DL{^4ii?f&G-UVF_0&1bLojM75AW2R8K zsOrm#ShI!Mm1iU&PqhTuXSc=Iyd?=3UZ8<^<5uI#dj@4!u+s=z!)&kZUZij}p=wY} zW=j-bz~ug0eBc!&56Ap`{7_ii&pkG{`Vj@@iyel*e$qu1c9ptaG$(IXGtUZ`Qj7^W z!`N0T^v$PkGE$HWql%n>@%FXYb|js-7(z`|&TWCT#$4bPGI69i2vW#HTXi@y8|@G` zXRbK#r8d6^Ji94TB$I5*yqzZvy4fGLW2-pB*aNzNS9#0xjz!S8E^rPUzI0`xdI^Y9 zMvoq;;11Z<0=bnH2a)+>u3e=4FLK{yspkiEK2SiQ=Xu!34D}=?9fC@<8nh^K-q9-}O034kN6WukUlo z4G@Al)NA`w4<)H$$R`U(cVZV8;oWKa)M&cWtxDzjeY>xfTV#;D z?EK=o*6yBB)bnrid+fTa=>0g9svSe%Ez$e`5%T5T63O@ z_C1rfik34)X@WrZp6ZH|^lfzYRQu6Y7W^op<)s_L!PUZm2!McVH=^JX-=exuA~_`_ zfh7Q$;M#UD8vq)tx7)J2k&A2QcK+vEKZQP9ONOQRUy&>%zuKoKtGYw_J>+bMuGX zC>>0@6IVW3l8)w-lJewKd+d;cwd`yrV7qoO(WCc0RFozi7cSFq?U+>2-W z+}_MvsMvo@jSu(ak*=Z@Zrh{jcO}svJ+?A~*K|J{-=#D@^)-vZ2hdJXK5=-!cCCzn# zWHwNbjo~`Adm@SOl-_8|U0H%{QFxr7Z7OJ9@OW^y#WJ1oj^#jhJ9O;uO5X--%U`}9 zn`%EysP|n|wNH7e-UdkyxYzeEks^0lzp%HmVNsVL>)WKdUH$o7b@FHzNc!t^zvU~?mw*N+M7l#d%kOb_};e(9_$r%Im#+h zMe^EjPVL7>-;a$y^OV-4eI*W%z!+07yeUq?9TTp;yo%zS$USSawiO@A9BwwaRzGxB zM+i>Xw=5;ny+n67>ie-E&b>A~&t@bxhkD5sIodVa!DJ^rkDbIwBAMV{a z)#mjD@{!G2DdL;~pO}2Bdmt;U)HfEX=Uqw)(%y8v<=oR{=}VT{?X4Z(TWWjGo?znD zvX^_ML%~Au5bsZ+m64L07qU(lVa+>~ZUmlB0k+lrnSSpSMuOam)lW!OxbwZ8M5TlY zEz(-Y&&`5yg{c;6+g}J&I|=0y|M?**A}NL&A666EHTD~>p&OgF^p>0&)B% z{gbk5YRvAY=f%~*lep@7&>V}nf9%9JrrUG=d`&CZker04izK(D{kzk!#PCmSt)uft+f(2=pOgV4%*W-whu!uyfQI`94~)A)@*M8>(17@NrG(vw^ttfJ{KH6I zid+REZe_K%Z=0$iP3O_SH62AHG_2PE^!a5dLh|+op?vW8GRS9i`rbY{I=?-yICwTrmkVVC2#@sV=RCl6{llb7ezAU%6eoe`0CX-RC#9AJ;Pl zkBjWh`Xs z{?mlk<#Y$)kLsu>{BS;*>S9TP>Pb5_0x<07f>T4qf_7|=3k5W$my2{zbySQm@cyKD zpLaP$yS>nfote>VdR$|vkzIDXtnx#UuK#5}*dI-ANTm3pf(fF#8H-m%@RSn=J#1gZ zF3K|Pz1Pi7PnVD(aG|S~cVFCnEi2onn%W?Xm+s6L;#pIi{PalB2kn* zO$(j8B4IT^nU<}3MY$SbyjUY)D%eXSsu-bg5q8}Zg7aX3yoFu9rE~XD{KEpvE*$-{ zs&6SJ<1!QT;$mj<*SYQSc|kSMNTQ>jA~QDbBU2;81Vzgp%=GDJLy}U_i*#F2&K?iO zyR`Wx70p*DwA`FXZA+Ivezk6~7GiU_zHll?XM_0Z89NQ$&)8P4=}1{n_k7IC zI{~Y%;p~QEN&&$pg&u$2*}9j(NxgXqt%mD^_{%FLtf)#XR4L03Eysm^z^>#9PGz?p z{+_I(eIb==;^+O~EnpN4i?kOVLg$!NVfh1?>wH?*dCViGFF4S0Lh_~h0NHdMC*(g= z#?)P3nbmp8{MPq%$2*3A=7hpdGWmMgGdX!*2O+dpgG`!&u1iaX7c(X*k)N)l7I=_S z%}Y;;u8zCKGs}l-acsTvZ)|kx?0F$C1sm6^JfgOd=|`#`HC(tp9z z0}4K|ncbUqHMz)D^)cpdW4Le%b>3WBR2L~(r1EGcgMK*F2_%jp;?OnyFNIV=s_e$K z50$^ZUpA6xTv-U@I1$}jprCpX%G(pxu;DUa`ktjM(pp4JxIOkZ&NGv?KKnC71n_?0;M1^MwE>6Tl@ zZqDLW6?a$}0xCO*L#Irjd=K1$-UAhjMaJRPk>9?4yppzWAnj8YfaIbl9}i3S;-sfn zXRwqch$3&`Q_v{fG%ZGChKr6--H)RIq64he35~U zg@${E?0-gti*7O$imTts!7OLcI&zfH)=1W=zCD|1kIA?~weTfvq9hUT9ocl{T z(fPZ{4l89DgbB`pKO8Zf>k1&}2Y6ME-dk61+eV7>Avq-?kIEbZ*2^~Tmi-!B7mPu5 z3`0&jUc`}HBNPQ=MTJ{y%a5^c`QbiLi-3zwUd%fCmKkii@hVd)p@b5*f}w5YcK>r_ z4Tr^yfI~Ufm>jfGa4y?or^Wu>{2WwOeHhsNx>XVUGQ~yI$}&l;F(CKp)sNQPl}9D< zs%q_Ezkmwp5F6&-j8s8|qBX?jU8VZWlcmr*%DeET*d{^GYFeV`j}q&KvJypF;1EI< z_NN~oN2J$SVy`@2v17I9QiWeZ3Dp+6PTy+yhse~bu091li3)BnzgzRmK5Vb(1-wn7!F}O0TFCU)?RPQgk9heUd70>5_lObKFgFv1Ogh5>Efs zDy#{z0)I4~t*k)XEoRJAv^|yeG`JwQMq!>G1?-kYcQ<=3@Rh1`_`WZJ=`_u)D|$pw z|MAr6IS3-Qr|p-Z;dU#-wE#-|5;azlM>N^pCak=A6iP98{MBq&saVKdS?+m29!nMv zD@!c?$4z{!fdnVDCEF0~?Mk-uCTX3aUGOMnz%waG275-omD z@;7~T?KZVFA`=!5?2{*E zFW{89v73#f>S9NSz^V0mGyFI3@7gaHEF(+vNjzcDfO=f17|C_xQ_aLK1M_BE2X0P1 zE|5jPB65GuGvq-3fEHh3Ph}z+cXhc%uWd!3MI#H=q7&W+PZH4-V14rRNo~LZ?(o!Z z4o%l0ODtD?=qI<0gFiGid$)rP9*$i>({2!ToX45N!m}DXy1;mugalj4wq)yHY~tl( zlr;^#=trn@h}h$FzqnsimRzD$=36$^Eu;g+Ds{}ky^B@5PmkO|jC?<4x{J+3hEX{{ z0nnF9=L&3VjVr{{PAiHmcek-3I<7uW&z1KmlSIN=-qKMZaJ57`a*w{)0>a|&m+@tV zu^H%bDMrEhOCqagIk$p`Kdc|jAJpH+ylpr$_2WcS#g{H#6DBU2uz`%oQ|dl^MB!cZ z%JQw4f_^r?G*gJUS9Fi+aDur=U#Timq_5bCBYj3w90g_Ej)^kD-Du-FrMFjwsU`T- z7w7oSN7!@hDFqkgw{t4m_rkvw)uPEnrFTz=Zi@nSAW`ww(44?hYBjL6>}ZheKlK^# zyfaX{pU!dEAcKg#KJu!-kY;n@M}*GqWU(l~qE@5Afh;4Ga_&CdiA*CQ4uWPN!ddf8aKhr%6tHMq%2+)b-Sn}-)E7}RV1Y-%P?7GtEiJ->#G-?i*fM2DovkOsz(| zHPqOj&@Enb5ijEw^JUp7SjWq|WQ^bN8XR(deMlMM%wR6*y^D0=OTK*Ch1vv*ii%(6 zX^ak={qfrycB-*^=f3}?ICJneRv0jyNEHkV#QmOI;P=$9oku$>T@ex6Af;G{>%^#q z$INMR3@=h&Z|4{&6z;0b?rvUUMt>BET6~h_oqHq}7X7jmZ0lGhoQp*n-RR6+yS6#2 z3~DALu&&coS#yZ-bPaD$5Y zZF6)=Q-eYm@Pz4e)@DFJlxpmt7s=ig1q8`aH^lNoXk93Y4RRIMEgJPcz2#C!V>J5x z9$~m>e}a?K|Ga+|YUuneo!VB{Vf^c(q1MZSv{v4lksjG2I={CDn}7EElHXFm`HT?= zFr6&{&{ZM|NqPRtJt9UtSm#i^mT*Wca(^ILS)Q={kH~25+QDRt4=pB?bt6v68$iiO zCZ!8&fggfPQmqS*MYo>BIj&jc(45GWy{U0QYS-E2X`>hHj1m)#z@8g^`B2*IRi3nH zN6yE#_pX7;XJ@cnh{pn4-DqKarN-@&+^BUxn8a@ADM;HsS(0D!FKJz*LUtCgPaEk- z-X#~`KA8}wUwM4;wy}#C7%04}LIsCTb6VJTKGYpu+!(ti<9r!@;MN7!<8Q^Uw66@j z58K2Evzq(hf8_rA*bIJg;Fj0V-C9THUnByRNGyTR`tCQ`ZF=u1XQFYtgZ$7$1f#)4 z2q_Io_K1ByZhPt$D}#BxjrX1oj4hEY@v5XGk^@p0lBi&15Vls9Y{%MHB5!xKuXJ_% zdW(_Z`XdoX?!DTj=Fd3@5K>~Cs?mUyzlj~(Bue7ceZk<@& zGM<7ytrOz0l7E-fI2c#beLtim0_sWSh1ovD4G(3(W-V(c zvJUEd>_UXP@rwTDYBR6%9}ba8(x;i5K+}+kC~+zNxB!58xqAjf4~@7h6J=t_xX+L} zVkIQ0Q;~oPVdkyV8}qY=0Gq7)qGf*^9Z4%8*tk$MW>DKWGzrSuWZx^Tf#kh;AJvQE%Ve>e+SOklqN0N#Qy=Xi| zi=56g-V7%nDBCpHe{#&J2RE559O^qT*yNX!2<^ng9?yhz8=LCZ01p2!)e%-r(Sud= z+EbkP9>G8W1vM@;*0g3Nr}!yGZ`P8q=c*IpDsq;J99s&isz;)|rMZVfHkd9t-~gS{ zn41zl-725coasQY0jwl8mR>yVE`GY@SyzN{bAM^ap$Nh(x5)1Nbml-bu7z(aJQcEN z2YfE`=OjKLMv{Ec?Vs4M7kpnufA*)N|1COyWpM)k3ARdC8^-0-jP6Q_LQAeIopJT2 zAWM5uQzJtwzi1zBp2WW=5rp861c{BiUs@1lbyaGM1 z<48aR_zy?=F)BaS&Y8i46__gi)E)Lt&{6Q6omRlQKs{EEx)FAXD8~f5n#)|0LyqnU zO2sWENF3?Zb z;Hr`WPJpF_3Eg99%ToPL?0uGklMO7F1Hs%G-*3uZySYioo^KvMlzxDkq^!6pVSDvL zqvO5Xi0=opzxCp&ay1rms8a7gizzK44NUg@i!Fq;k$DieYR~|8_*p<9ybv8j=?CT!< z@k#Uwkrt$$Riz#0B@P<@?YdGr&l4XRb(yTZ^n$PPnjwA+R9P)A4Ur z37TS*8y{UwbQzj&gaoPG4E5!p+R1EK=_E1oa{)QRfRsSpZWC zo&_wstcU@--kAIaTOJ`%oyjd$9dU=WbKc7dd$-m|CH_adu~CP$1Wh|~@Kn7xcaGI2 zF>v62E!iU@{{KsMeCKbUs_p<^pG?QC5iHUc_!jIFQeF@JJ)UhiP&)tmRe7e$5xBYa zyW7(d#bBOQSU%OP*9?UJfx8{K1J^k1cZMSmlLZf9!r#ax%D#G}YYLT#c&lH17&J$0 zc|SdfwjSBadYn{u5Fcfy+>+ewMOXY?4;&gSgrq%szYAle6Rs+*>g=)pp z<|X{ew6pxhNy2){caO`oZ93!N)4raU-pI-I$v1^`r;qrXh4Y1Ed&ul}D>?xdB1#=% z6|VQT7i$}bi*)C502vNCC+nLW7S$o^dGCw6(^AGjuz6) z;phlgXRo3O9^sk+q4D{7gpFZ$L)s?K3nfL`5paf}(iUAYa*=A8m^HO92X2vY)+(&1 zC-yl@g^ev;pRE$K-=V;EZ}*`0ys}1gf8Z{~?cQ-mJOt6--F|cdBkKm!rb?D`Lw3C@ z51Lm#ZfcrF+Mog_B9~zs@R)d39~S z)^5)Ph0FE}T7>+sT>1ZzK|jjI+ljrS{KuKSMi7=j?;h|0UHGAP>gK`GMnCAgGToSQ zG2nJzd%d2L10C^QsZ}>nWjrse4u}*kFyW%gj+f+$4G^FJFN(5{OLV?;V+6*EIijgy zrTXl3S<4>vlTixepd|bhnNzo)q-;ES48b^uOqQ%oqjoX;p3w)5GefVV^8sG(;&(9l zcZ{CqAQ1Szc6DEfDRrz$x2DUymPn9TGX8TuAr~XK#pD>F)?tb&`XvVcRUhV2Bx3*C zQ|WZK(5D9ZxlTu)J2kK?Nj-@w=ewu8Q?vsUrRx&cu5N-={bccTeePG71$d5P)L)MX z?Bm_00WDJqRaFe=BFM>k;#l)NeRRHm-e$KvJc_QID8?VJh~Iopny0g}!$rP^7c z>QEPKL}L=A*L&qOVe3R?O2<#~4nzEE9ap9JQQ5k2L{HzE zSy@So{*kN%@q-a`Gk-Nn(y-LS6?1_emtA`u4oIB-UW>Sh%XGunqAxZ)o$?WmG~Abk zc>TS@f9;RKFOXLsdXZ%?l*GBQpbbA%Q?FqKcY7lJCtX?W@@)=v51{Dh>`H%BBBL`` z%Hz<&oY}|r)3D^q#cD){Lx#TC)Xuu&a$5I)I9(d~LB%vhRa1nPGIW zn2WX=OZgEs8^7cLbDVRa~o02yyO4^nQ-3ZY6$XTO-%nZGZ_4xAbZNCQaf zVp{b~a+>eT9>_n<8U_9QV+`}*lyst7hvo}&ys*?d>H1z(M_6sYOp3lR&=e6TjIFml zp7Q$X<%*&GyhPJq6`)ZiZ&16@$OHwje4wXZY zY|OeWr!__D9OpluILFzqj!QTs?URCl%I9#98bxHH8`pCKne3c@)P3br+HVb6><5{) z29lR#A9@*v3<8KKabzeb-P3;ImZA{3lXLFGAs+D9LPi^(f0*W1qGI-2-wGAhrgI_A zg97WFq>F!wcnD^r-yIBrZ?QGKT55gthtq{?#|@UwmfpimoHcUV9x1=Ck#?x$0ne?N zfJDSW>>zF%0DS54>Qx{V1JVr38@CQ`*tC?Di!WFzo%2OonF65-;McXGm2}br=xAw# zA8xNyD^iZaa%Hz~(vHukOzT0mLf_6Qe&u~f7%n9FxvukS;MCpVoARCLi+w-mv) z*qx}nYYVb|8R7l>T)igTv@R$m7T!4+vmlpQ$Xdt&ehy;E#QWM>v^#|r5iz8ED9RRZ zZ-=LNvKl)Ix;ckjHRakeOqA051UX!7ffYcYX{M)!f4xGR)HM_)^o-Y|bmQ=MnN;N! zH7PgLa~!r)0-GzbY?#jm*zwBI5^VdToL`Z}$4C)(S*|`jtqFFkIrjF7FgktT-e)(S z+Ecx zDcx$CJ=|U1LV3g@$<)MW2P_@&4>~|v+bo^Hq{mB_DVv{2s~8v=H^$e$>J6kj+VdDq zyi)xiIqbGbxb?v88$a3s!i97_f5-LxvXT=Q$8zP2B#M%nsjp%L^(j?q{;+|$o?nFz zUo74!-Yo>S;2F;0iOxq#%=W^)uiJl&6kN~10|4NZEFRmD11^nx{4tHpzqyBi<=@Gd z+0q*!r`i&`3TiB!#I0gysr)$|wv6-RJT<2kJLM3hSgcC2ud7bZYk+*4=GcobkIF5c z`}z^cgIl98H7*+^XCuzdZ70QOO&?V_CT`rfEPeVrgSVKuLD_h!wR zMbLb5RtzpZO;s&*!4|ickVy~P+Fkxvw5gsirs3|g*nb|TBIDB{`N-IW>%BFrF}t|; z6v?d*{pbVrDj{LFNdS?QmFn0%Iv9)y7~3LZEgqxa#*qIX96XW%L%>V{87&7(yEhDOn|33z)lmk@8Tkb zQfi>mYM-obz)RY(28T7&EyTIAOFHY|OHU+f1DSxdA($|X*le<}s1^31o=p_y_x=*u zpf<7GTfk*60s&R6So%zd>Bj-gS5NpJn;dfZ+i@3D3rgtZbELm4vw zs+?;J@)GyvO~IdhvwFU)l|sRgD)U%#=^Z8g{KZwal-gn6x)-S;N$d4~6@F_il(sFt zZ_QTsxvaoq0^w!g{+>vdPvvAm33R3`xQXMLKTeFA2D%|Ntxs%an|@VSIX*H?*9dzr zl%)MhZBZutBZaFgeZ*yvN5n}MRBSD@U~VefQ299v^9IwY9`nWL&?>FE&u(9m$Oeen zldUyBa<&QEYWsa&i%eIPgO_nd&Dg2NTrG4+emrTD^x-;NXmsC#L7Rqr3B@H`Osq^R z&u#CXgE(ShK7}e^S;<@fJ9w7r6v=hwv0zUv92P#hE=tMr ztnJg#ghUJbO}ZS>*HyE1)(;#xJD+J{H;3R^mYxi zfz&iV>`OP!OHh8XN71gfo(`YwQ1jXf3oU?xg_5jpPi1lS2qF)hpEC<=wXwSN zF^Lp=&-M%XC}(&6?&)6xX>r>dK9Jza9 zEg(l!j(4y|=yw7&a2PDA+_MlPhU2&l!zA@pyf0hdFl7_k@F3x@RZlW`9D!u0mDeGN z(oC_^d9JJ7e?8`-a7j|EGaK>#^+@(c++OU(=i^bPRZT>=BBv27!6zX(L@^=v@r4F3 z*{9Q--g~LBJuxp9v}-i?1_HZoU?q>kXRC3tNO|YRnZew;`uOqB6(7No!jfgr$^0$e zwLcvfoQs}$qu4o3FY>+weg_9|Qs0CU2R2`8@N_A&P}k3_0BMIcTG4wR#cNIsQkVzxTySkMqa zY4QJUe?dvmU%!&RM(Z{?>X*VW;ZKE(8rT* zNt3^V-C3U~m7NlayGN#ttwwMm39zvi%<(0~&No@g+~=CIaSr6$__Qat@RlSSDaR|{ z?c~0d#j>hzd|Y52QZ&G=H#)wr%4w2;K=K|h*cH)H;yV)oUknCX_&z#0KZTuRl_h*l zkL6FncK)b!w`!pa#R!+~RN~q=zb(py@7ZzEBYnDmC3U;L9P0H@8z0iz^q1x4xM&L! z_uC$=OPRIoC@Qu8? zYo}PRSs$Mg=L{a#)NH+i^kd%;R`PXyL9|8>)1>Y(FA6hwH>L0&&hGI3)vFt23XF|U z@A0eTZ`R??b&g8>DI@`96W>9MKIf8LR!){X8fEd|ZLL$5Ak3cPtCZR8><(a^OlJ%X zMDrRXBKe0>|CM6*&Qacd67rsn(%D{qkwIo)V8IHv7HTH}l za3^`BEvUhjn=Wc=EA^Z;dkITsg6FBe9>z>@7URy|e0M2PHqn2?jQm?lq&bU7%(hTy zXwDloLNk=*vx~>}KP*Ae3pajZFbzRp*O^(nJ&v7l|JqdVt|d!%p=s`Fe1}zJ-`aa>S;x`OdUuS{Gkxn%p4tQ9nx)Lmj))-Iv6P zO3i(|8oi25BJ(cz)x5*`5iztrd9d9%@qEVraJ*_?JGud5u%&XFBzSs{7fTGt_q&Jy z#!9EcT6#RfoANAi(*ggiWBQ@kC$Ry5=5?lYbqBeR%9k5%T^^&JnrZo-QsP_#n zi{$9q@=@rN&mQu?Zh8(3tu)edDt26fu1S1Eq#7$Y!0#f8>GUQ*`W`Lyrt8#&erY^L~eHF`j?KmAM-%Xa+yZLx3daZ!L)El8X z4?fr);a=0U7_}xY5z6OfD5H3Z{1zY(>c6KH@BP))TG4o);|#SYr*a0 zCH~~OQ|e}0D2oVuTq_!~y!xz>VxsR=51)%(Y3&~=n*_0eux;k(&uJq{`?lm&ZxYsO z8q_z~wGVs;nktjftJKmlUIp`%BHE7o1BK z^A<&Na5mc(ka2LnZSC_==#l7~DLNCswV+3+k1#SEEY7-tjYrx>UR*Uwvko>byrb0)ULYtuUy76?=0Pv$(mfh%-Hgc5#?JngG=F9Ck#`z zTa&#Or{Zsqf#gSuwC5IK1Y4ge3J1b=ni1bXdEWgYlPV(o%A&u|4R*2g5r+}xlrr?N zk}Iq3O-;M$&223Vg9$oNj1hFdi9U?bd4)_FeTNsY-jyJI1qFGg9{?({3C++ zuM^ir4o}vP==e=#&MUUDugFsh^4e0J;gSU?ByYLYA+Hw8Q_9oG2(=#e{qUI~;pPEi zO}VowR1&|UjihItUo-OB*XaIbDZcSpSJ#&mHE_D#97C~#6J>L$(A&%CxEvOgYY5T) zldS-Cw5;juu2;!1IDKT>FVUy`>0DtqhGIT0Lq3gD8=!}?RZnls2sLXb53o9t-SHYCL!X{%qMwUkA zY$y>#TG~I3D#;AG%hxb_t^aTuM&5SB@~%4jf;qqhGb0h#F|j8XWeaJgS^F#inu4rn z|A(}<4r=r3+D54&Ezn|x;#MFOTA;YKP$Z#P0-*$Jai>Vo0&TJ48Ym8h5Fi9ia4YWa z?pmO@)05xx$~n)>JM*6TzR5qywf0`QW$t_Lz4ltyMLon=w?65(*4#=Omz7^iCUhqA zR1E+IqLV7roIomHRi6s|=25F1F63*;;~|1lQAb=?Ll6CtHuM$9pX#_K1aqo==Enx- z<%o;kPvPhU|#Nd4u;m z0n}#d^QY8~JWFO?lP;`g?NR2O>toAcD(#Li_E;IhyJP*fYpN1He+eoFhazJW6zkmh z%*U{b&!2%VImKv}h^5es%W;ncKl>bm(}pm7EC)sHg4<|16`_zSB|u}QPr#>OuAan* zdbomJN!Qx>%(_Y1m0Qx9$U3mev!XxKK2X%TO;qS|oZ{KL$F;5g(|$_4#5ylOeXtua zK{`W;ouiZ7JKD}OeT`=HFiAIN^$KlTKRzKc=|p9hXje@J0T?J7yvR(;N7nVToc zZe_x7LpHC+`G>4`h2HfO`42Vw6$C4=bOYgH_PqjRnA+gCs3^&rb%sMrH& zpz$dtDeEk|9)WI5)QRIraq)athl*VZF>jm%KVQ>{x6kqmBdezXy|6v=wbph9^_RML z3PlQaLU|<1J(;`qZpiVBfk0D(ZzJgO(xOJY$*&xoR#M4n`Rti8Ow@LYh1*W3l~d}! z1Uyy_6*n(dKOHs<=_8HiJP@TBR9&&%U7yt3Ly8zk)Xqa?5%X8fy*DwTZ)PV3qEPLJ z&(?GFQh$aNhry>a`wcH}-Z2AI~(S${Mz#LWN%-_J`cUQ>Fn6VTVpf^Qig4 zoa>s+vlH5;p+NdB&|cmrn}}}vneW|YoUO=uxd!n@=tTbuuKlqafeB4_j`dWP#GsC` z+^8vvTpJL$-j?+s`V6P`38h)32f=PB)OPB|scwBqNYN|l?s!jtR3mTh)|3ElJ~6H_ zApbD`XmwX`B7)X7_x6`k=LY@3VJzcpZ_L&wgm>j13(c$k7n?PC4Qs=H3DzBXA7YGp zC3T>$CUFH+WVXkv$4`-=*H8D1D1$?taCZm7K%9SZ>h*{L-J@(^lpj#U9# z^aOVnvja=?{I==^Cwn#Z^pi+e6DZ`DnwAr=?M8S@iYZIN5nUUeI^OuZDMT~ev|z39 za(7%%GN;TiwsI;RZd=_vv(pKS-UU-u=$o$paT_tD__z*xg%Iw&df1n&wQj&?jNL@5 zXqoO;BJER2D~3E^(FmlKovtS6`x--i?Qsz^V?qQ_E1Y+}az$&3GR%G{`?J!#p?G5;6!HEdEWEpM8gcjXQfH8E(_T5+n>72QOj5P!Zz{hKS|ViEl*wIB=*{4r*Q+vGIaHd*|N8_C=L- zu@_U9>=ID^xybi)(Hb+wU6PAp3%0rI(`|(A_8i7@=3B-Olj6RCCp30|U3y$%uQ_Gv zQ+YkLGOlnP>tbe5g|0j5IRKWQ>QYvuJWHi9*&?5aL6EeJ@V@KyacyhRqd24u&c6NZ zO1~KqpF}xX(>u($)bb}sJQ?;BEE9;0!*4)GsY%vLgo9DvLwah9+THGGjT~7{j!EX5 zw}cDxXvhb5B|rG}YZBOTrr?On1h)u6UAd?;3jF;uEKE6$a?Q|Hc^_)6#@GAb#v}O{ zDp?s;Zbg#&)?)^XNF1@ztBS8?sRB9OT7Bq_W&=t@M23E~74jEkiasxgdTtgOk5qq}4jwe} zW18hRDPflXXf_x_F2FU+Lrie-ewy9bX1j*oevwO#%5=CZ9vv{x-|Zr`J29z!qO}JV zhuCq*Z7rZ{0~|;S=whm^dzaU7kj=J7g58xpp{x-K~ZkEuSpkeEir+ zaPEjA&Y$PaTMSp>4R!yNqzbW=FwA8Y)4&jxNBP_{{8E5hLy$fC9ACI1lXaziXf1{! z<;s&`rUt;IHBFXe&?Z`XCM+<)|3d z9IN(41r>DYa}4gS2k@aYLhM4#OHiPgfPt~U#pczPM2S85_;8U&ib6cBxKusb)ga!x z>wy6_8|WnAXD^7zzOM@cdBmg~-ecfpC#1(KZPBI_V4=fmFB&qT7&y)1{e#n#^;PBx z(vQ~f>=jCrVYdw&I3y(9zC+g=Bgs+$W~l|kOV_hO7PsI)yyEbIu!5~i@JtKy1^XWz zMZrNghE0sFh}2TwYkH=PkZD0ygj7p~DbFf})*DP*Snhj%(AQf4DHP^oN1sB^*Crs> z52rKm8q|NKs^^>dm;UN@P?K*oz_Qih!3;O+gbbZJn%l_O z@I>Pz=rj5H13`_YU;>2movO{R+Gc@%d9`oLz>cMCsXqK<(723S9hze7_J|(?AbXT1 z(K$d+fuiu9ZAzZCu6Um-`pL+wVt;XXal9s;63`bWX(=*+ONmt($bcp#`2isc()hI>XrtVRZ ziGU2;N$q>-1PJVG={p#dVK^RHa@SLI&IE!(9Ym{pI)qZ~|R34IF+rdq|pJmkILZ z@{k$7Y0DS)Hr*X?s-2p%S2^P5B1wdz@4IeYj>pZy{mlP-i{%YK5ox^~x&fzURsgEO$yxXUVSp>q=r7 zLpAaiztAHFYN}O0o4VoeG50OYg_*e6W7_aCnS3oi)1;In@`d&XU z>j-k={$C30HYKn(q+`PVy74ji3E|Q2s~qfXASPVF7KD zwuA28c_)>xH8(se!+qrS!e&utO@H*9Hv3xAtGMZHaQynCuAvwPko27t@0T6YpKW@( z!Z=0gh4-XW1YWRt#GcX+asG0Qi<_30j%s53JrrTPTcnJqCA-%4r8J~2KH4<*bfwOf zLjpzty1FNb!&jfTTXXeS1V`)H-8E8qeC+-2%rS_a#l~uHXx6FD7|$1qKHs>odz^TyJFNOqc#mJ z>qgv++TLShy~6G_{hlTdJWT|WIXL6RdPMBZxZ< zJOt^@Iv@}@XOFrl7s1r`U0gG&YXz<@81h=lW8%2g1PmO9ekjMH=%G6+j!dD`M4 zdh!5wiufn+f{WF)e+h<0#`?YFUJg1&5_(O|t}-)5hDw1V(PQr-n|W-OlBYx`pTr%R z#kaI&@w{Q-;6}&gK8hk1?{}T-HP(YZuz2pHV9|AhHtgFg9(w=7J-?-Lf7Q1Q>G1IE zqvZE-yVshY_76l{M=G94Mszeh>Jx3AXvS=BTrug2PrjBbOD;Z3Z|$IzgX z-M3*(>nyp?sqZd)QM`W+*rhAjk@@ncMovaN1iBp(bbb7>C&I$Th(jCCV$Jdklc;H|;cY7XYXIExqVVtXhQWs2T zwuX5r3Nb>6VX0zm=arXW0XyR6d)w2}=c=r_Ul{@4yJ+H04upE>33k=ZgS5XMQx8qi zgTzSUviK=H_lKlj>^K^ho^a6=4}JSQR~K4T-tlu#B>Y+KxTx^$R6A8gh$Dr+b6h3z zp%~#y4iw$$hLaoPp$RgyPB=h+_cDQ>JkrRqp6z{TtLAo5_n0w6{?oE_2asf%SMzK; z7x#j9|Cv0uD}erOPCAeBEqert{qyM=^eV!1H+wp~E-1J}(QfH9r98Jz4+s@3Tu{d^ zecghSBlK)~65!yw!q_T1Y+Xo=AnqPF<;J=slrJOe^QmS-ag(rLYI#OfU4^^>nbNvd zzIN@2t4ThE7gWezpL;hs>=lpc3}JGn0k)-ip(QUQlvgx%p?2}i*h124KYhs;_eC_6x z1#fv&lmU*78^2gSS_5uV$2;9=nbtHPK~*;7A9r>wgN_S=uESsO#730T8p0gR=9Nl|HXF zB_p@zxMf|vtbgyIb%rGDwM~GnHlmuYd~@DLCY_jAD`~2vveI*@iGnBTJiU*tRLuVp zh0Qh1;Cr4M$*|u>{ejX$6C<25qB5G5UupTb8-j4BzQM-vxvPpHk z<98yh*QO_u9zeF|K($V-} zF6XmR2v>WTG&0yT@ObP%lB)?Mo&;+oOreg@&nI2c<^-$lc>p}E@w%^&q5WD1HwP}Q z6bzw=u6Ub(zEytGrrn1m8y#Q3%vE-gWd-LO=L56y2`(f4an+Bkg-m*O(CIR_i4&h8 zTdca$E2t)^I+Aq=y!Y~jKZjr`P0?FkkGekhu^|wi#DC4hd2V-1myfGgB+H`JhPiKd zR)!)pxjtSqUJ+Y2=gX<5Sc}ev)n>Vjr44Ji!(I)Cb$=BC{sg0b5(OUN04|L*mmgB3 zDB@TRV;Z@epjiLhZLSwjF?76oZa)_<0Cu=$#p#5*$2Gv2DMT7YN^Ff&9(p-@1=AmN zZ*pK*oAtlv(f>>I`u`+OZCJSRmjKS`>mq#aElsZJ^gY|WT*wJFTxY5upFP&Jf<#$& zJ>d}Jbukk}Eb3*6avM?uMBiojVnAUzdh^@hEaRDr5(vBT%t7@??nDM04iF4^q621k zLbLjad^@;}`oym>Rr63HDnYC@ z?^~b}F5xdh-;xF@#12xu<(A#8Z-t>rb4V?#VrcOp8FN|Ggefoe?$PLe;$s>pkaLDe zwI9mM6Y0Xe?A6t5-9|ktC8!bkiZ|tUAp3B_KvXs}_31wUcHqz#hA+2fM6RfTzil5Z ztIyq-I&0=-Crtj~bAE*@wdsPN&6fE)9rCp@)=KP*Ra3n@Djw)m6j88R_;YNRBqceh z98PT(L2g0B&Q3`7!nXl}w7;Lm8sJ;D=PO`0OfyaEE*GY|quoYUqOffT}3xVR#w?(j%;3z z1*RItngH!q%|L$o>aOj{Kb#T$%?efA`}mf*TPks`W7AG?al9hsY@@U;pIb;9D~0q8b~X7;j&&vd{tfRj6;Q>a|)HoGdW-pg5{3<$1*AOumO( zn|S;q3iUM)rrSBqeQIiao9$x`M2ZhO#c8VVqEtM@te)YZe$PWgMXCTb9ZGgQA4#cB z9@=UtGfBFwRUm^=Pm_Z= z2-}6{(Z!64>XEP#I$%y#;}WP~CMjkSHKXjb&+lyiYNd_#C5$vP;m;&NnxTf`O4#}w z;{tT(TZ;41=|xp^uE>yOg*2;=^-SZkqGUu|X3i|#8iARDv{y$btxWY)s&Inn@~%j# z=##iZ6 zDqAdzw~UNz+BhY4gF@|$c7Fa(p_#3OwNMb@*6}HAQhm-l>;WIJLrkngoVwq-uZ6Qj zBp5o4E^7D$>19}quAFDcG6}D?l|1c*#nk2Ho*PBBQ|PVf8i#%n?_dS8M1iq!QQjX$ zJ>yo@)F`2r5x~~T_yju$T>{?*gfXPb4vDPpYPN_?PXxXv?#_sO>&)#G9yqP-p$JYf z*r6BZbP$($IfoV1R*Wi%iD6-f0ln7!Y z5U&24i;FQSw%;9V)E{H5_ez}lE`o;cbJZ zbaL<4BYSJ!ilmaU`XfKAFkXzhK^+u(p&_jXZ%Iw^%rld-g9S}r<_(I6P-Hth-(7se zPTM#G7w=$4!g=JJK#$dVuRL!E<>WyoimR zPpSZi6{msGzbw<$+wXX~n2G0F4FBdHItz8B*|)S3%+BMiEc~`eBF1vKv!ou>3Tw^B z#?30$&7mpOQexwVYfX?him3-_U~M$^4D{$rGJvvcnllrd$k>u{xoq-2BT4Prb3R65 zT6!+F!Kmb^YeA|Ymv+EIZ{;g$rwg_$Sn2J8p|vWdmu<_!DQ$vjh&!{oJ%X-bsHVg~ z!{LE7qP>E3fvD5;&tZ{)B|l8>nWkZ#>2ATkw>j2ZrI@mlM-jBY!P(}&vZ;AHW`T*L z`XVacA0RXz9i$)#&gKDeRh~lKa@>>?dekB55647P11HHn>L>_WMN|D)9vppAw4u9v zxGGKd!Gt=jnTO0qFR{x*B@FfBc)yR@3~rRziO^>x9X&m)FM%$v(@rpQnQ)Y5dcxb}QJP7wMJG<=c(2hdPpP!_f3hw#Gm6I5o{oM~Zh-%AOg( zeexyha*3jvV%NSCG4vr0mnBn!BIokmNi-X)gfZ7|B_a19RuHX42v`1J0&Bje-EGIA zZUtpISK_q};(6jbjG}wJdPr_?{?=;EmC>I9_o9y4Vdr?ZoxcPY*9u%#R3X zx~M&ij-Z$fNue$ZB4tI9HpeBKUn76KNFk5w?WRs`4B!p)7vB@Uz6c8YOTcvz_5`}! zzMFJ=-4+6pqbq;c71|PjcvYKXQg|ahI+y7mASIt)HJxy01F^99EmiVQ=$TN|_F%ez zB;}fq?zrpM78#&Q=w#t^%seETcLlS|#Y7nNCz%m)H@Dg$!l8KUXd_KNPT!QPCG5_- zgDrO>l%s+7Z~qN^ZqLt^KkN;0-dlYK2JbL6!CTka%7ZGTRDiYfyXyo5G5`n85$T%X z`p7wj9pUDZYGAus-AF%wj!bIHvCo(shH709WFHx!Id^~VSTqLD&OM_pa-D5wMW|;H zJE_ZJA*M!ZVd|ZP zfIE-s&}-n9lvSF6s!wXmw9X!X{H!#|*f)BcRO?eU@#@HCnBh88IRN8fp3JLF8h|1( zE0rQq_)wIl^5ZS{1_v^5NFDr$Td4O?N{f4&gydr>)yp@^Ga7(ceY$>$UpjqMTNPQb zLdXX_&a^22%;Qac6?eP5-?Bl{tKzc`SOKNwB~9y8Z0lld@2Zm0;c=8~>$Ukdncz)E z(oo!el1Kiz)zk@;eaDAmD11FfkiVIGGIQ(bRe z%5T@7d_0%G2M!-Uj7Mf^%*G|=2*{Dp|GKB!$#G}KcbYmYIV?<1l_+tf zuQ)ZU7!nqR&C@*_h3(~2GcgH%2ByuVMyI{s|4Q$Ce>BA%o^xR?1r=DDbnv;rcG<09 zhoEyL-h=at+KfQqRT@@RygYo6Gh(_N#mwvdk@LX^w3wv(2vvT5NlbTRz-rmRL_#k) zuiCbaYKlQx)b+3U)E79$k7G@pwA}py>XVOeJHYEzN?u zqeE(!%K&t8G%-@-*69t}`!y=}g7T_btVh!y99vx`GO<$!BKc+w0sTQ3Va;D z!G8|lDvtx}%4k+TB!3p}@g}h|;}`MgdEYTDPVnJu{WEl0#Zum)D>+5T+=>gH<*?t_ zCiH}X-7gNGwl&r{Be7UFk7p?z=5zA83o{|+Wk5@vi`^L{q^D*`zq8$Jxg$YKJQQF# z@4nN$b4+hs;__$6-tli3zI<0nOFUcu6YAvSDppz|iYe2S>L72KBPZBkgI$ zt!qhMuvKu`)2iZRvrduC;v7~^#w-WEpdpR&k!%c!?K%-lHp&}i9sTX|hn3;qF(6=} z)oLiTOx4BiY5OZqt|!?ss%{23)xxe-Xkbo}d1>VhnC4tm_08?Q?6la7U02!*$IyrL z70F#eG(sJo62m<2DiKl)Z(t)iAy9p1qSrjcLn>ax`SmVHx>+j=+7%#|FPEFUZuuFo zTX=d(HVGlB?r*|fvkeznMm*hKy$v*@KU?#scj#sxGs%{kjk1!& zp<0jySn=`AkHA~3pf!z^yDU~vLCn+1G#n!r>RwIf&#@DaS2cEA=vW;uNH-9yxk#va zx<@r$BYkQ2%ShF#N!9zXV97plbk5{=dU08D@|t&r$+Q#0!QlZqK}JmG7<7yRGo^4b z{oZ$M$Um)+dHNV6o??{6-F;??bTB9|m!J$EQ)9AB9-%i(sv%YKzyYx{94|DOjh~6^ zehXMAqbAbEPu$-TPW0SekZFR;L8!|2eu{ zmuj>G86HiKw7BQZfwHy+@G1{$T}P1pCFrzq-5<#J?J}J9DGQg(J@OhSeSVULoy=|v zfImi_oZR@d>5=CJQB1P7Q)uL*FcflIh-t*+hg%~6Dk&r5CK_5(-Vo4^RiVM>R1;KE z%(u`*y4I7t-jQQrUfu0qvo<-@ZT#HRXFt~BtVdDz6U#TJ1)rBJdu+y`G=k<_Bye$D z!#Z}G9|*LlGAM}TOt458(n{JaA?RNG#5&5cseeKZuj}4xS{wfy-{j?_ApLwF@hv z(k_45<~C-?G#CuuY=LezYz__@q0!2&+Pe7&83Gou6W@%vUgHdK?0`Phi)tBDt3)9!8+CH7v69gAK~`d;mFnmKZt z_$qBn9&1-MR}oVQIo)$9pnDge-}o*r{}-;yjTdU0sJvs{JIp;dF%~u}`1R&uFy`mi zxg4zdMut~r?j(TQXcI>9Gk9t+hDu$_d;_IXK>t2I|5pqcec$$V{;%XmvC;C+kOw)k z`1C+FUtik41ftQ7;RQ6tc{nOM90n@-_#t1iS~Jruer}c296k&;93~J zOoJ*lULk0Mq^k^XD7*V_MHjZ*Gf$XdnrQJHmA4ByI~SDZew4z+?up* z{i08;gWG>|cL#j(giWPbk6~c&?1EKv#qCic`APF!o=+Z6!kk%KzxiCNK8*<}H5EY8 zqA7oF(lZD?aLpmU%aEtS<#3^$m69%`3kEMu#wyk1(34o@KBfrZ;F`&eBK*2GmH%7{ zuAWHI40&4yXG~N|Y$tAe`5+wuJ3~s&{cdiCJTKjeKTnXAj=hH(4|BEF`$|t*&HXsy z_tP36fcLp-#mfcFGSi^P4<451gba5eIY(FUia_<(GS_xC^O@lz64U}QJ-~3FmJ853 z?*6pi7OV<yf*%gpFz2%O)9mUl+dNBk>3>zj;70u z9(D3dXzJpD78R-Ks^Hx2kY{LJ8QBE^S^ukQzl|+vqva8$7-?b)SO?uzGx?J9!L~z| z<*{$1W?1xw9K7Z0UxHgf`{L*D^#4RlHsp7o<`R zWqN|{1%IT@+3^FVOw&Z+#Bu+bgxeB^1otvYKC$*Z^psDRCKF*RDBxgM9j>WBuh=DZ zjq#a}6G$a!5|c*bWenTJbs|za0l(Vj9~DS(m_6@P-{0a_qT?QN(b7(rv8kFV2<1@N zp?a!P#C;dJu7%_)mW**O-fho?4*eQVjVm(ij@Iskb?QwYzIuW%J>{3!>N>0>5ixHE zxGG;rUK7H#5G3xtY)J!qw(|qH=@WJpDC+(3o{Oxp>^;4ekfKn|fyRGjXfUmPxl?zG z#`52ZZKW9%p5XKK*3qZEI_W9h0*9Jj1HPzK$?N^_8*SlCzn)9veLl{%W zH=GD7J3ilo2`ehKml@}ghC_3{PDLx)e+OcS!K_@4?@jY==MO})QRM#;e9NjgVvAtW z2^ooIWAbe69gjN{c8#~b!s(hoqG&GQaSsL|1=udC60 z=Wuvr9AnX;nD1*x-V@h`t66nbF6Y%WhR)WHzpr0hskODLAY5cLYZEj>%na@y7%1`} zTC{Nm0yQRfZb6sav(7>HkId3A3Un8|zaXT>LK%&Fwnb{^`&qb zkRhL;_MytXqV#>)L=H<*{@7>~AIsTyJ|9&R4_V-)(op4J0=!XW4Jto0X5$I{QT|;Z zX6aizU6{W!Gv(JR487A*$2!&#;R}SR*Q;KmI6e;^`8O`+-no;uS^SrvR7(h|eBt(` z%=vwCgVJ9D_TVk{t(?wbjI&j!ZoiiJjW*nq$(a2!NKd*dG?KEQgi|CTOWHAH7*k-% z2Y}ro9C_2K8W3g{hNR;~abIadXlFhl%$}HMz3`JswPAEFtjt@z)w=sg@2sycuw0Mb zm8O^5#a1sA^3fwo%ipz2PTq=OnM9N0h5e5rz-s;EXbGZ0oVz*#HaR7PHMpoij^&|G zQgfRfBQt}LD_k{QXXk37p02QqO-yu=JBK(QlU(y(f~BW^R~S!bynu$*UxE#zzXbeB zWb+qrqnk6|@8fg&u;oxeEN*Es&wagl#~EpAB>C*9JSE}rWf-1;uDmQO$!Lq>k@)(Er|N!$t2R4rr-EX|_Bt`r%|*<0Iv>jHzv zoI9w?Z9eCpmelV!@TQ9T5TgGsoj%=`7zkr2LbSfMZ2T|ZYN3}M3;nnU2ny4+~lWlpkc7|0s zCxWiXFIzTtQ)uls*ut@*Z#&-pW!6+PJ6^n#*4G9(XD0qqG6z26G!G&vk7c5l)}oVU z%IC^It=(7v%?8E?;&-Wj$$5;#NK2nX+iR+hICWYpTuAA<0oj_E+#YP3yljc+j>58 zM{3oFM`HEE3Ul63Z|%X+L6K}8#A_1{Da<5+!p^GAyinlmpRo)6Q9G|eUX&$|f%Q~{ zG+&W(eQHk|3rPN?jUHmbSBVTm^Kgv`=w!a&$g8%-CrZ7C%l##o4H{8=8F+%PXpB{V zqoM7iXO_DWh^c$qV2$qWlSq-LG_T{tR(3UggO+BH-J<)oFRTsf8Z&Rr98dbqbjunX zH#J0Hga)GXaxY~}ZMHC(!14I;XH#tbf z)>6Dk&!BCT=Sat_;MDm))6dT%xib~D`3QQd2(;%cJzHX{gI*Q~g4bDBPz79$pKT&= zX1Bd@12ZQyS^k;&U0jup^S=>CeZAIJS-BI=<)po;2;sa1(>s4ZA}87AbSDUF|He%-=P zJ_B}hvN#m(Mj)~{gXQ)>{~-9uCtG+Q4i8J9A;w@dgd-W+TAUxFCDJRM@Law1-Z{Z(%FJB(pIJZETA zXGa;&T~SigTy7$DSnF4kYW%uPD)Sq-8rtTMb1BFIgD#SyX*tAa_1G1G+P2>(Ih(66 zy>zVR<%-!z=vsITVqRC6rQipva7kzy_fjAcsLti3e6Oyc^Iw9v;b22-SvEr+P2f=G zf=WMgqf)#6Z}qgANTo7axyzdt>!wX zgoXA?b^j5QcV|1yoKb;|t79w>#Fa{#T$O~BFdFVnsPx9h_*a!~LSrf$`Qa!iT^vzI z0sW%^CNze$!>gAxn$%J`5}!iO@s?xEzr#-$&8ZZiohgX_mEHNs*#RbK8c9+Di{bFV zZy|BW_sZLlIT$>gaQ57IE}m=ND!kelF6{*nV`}f9JDt{G{yY+Qb)?;<`_V>pqkEyx zy|C&)2q$Af+41-+qEmy6cVg84G%ix&?v*t&qi$BuxlWMPYIDOJp4#tse#$vx8)5jp zwz*dVj<|dMt{IhQ8~g&>nW1S*B_AE%mxPAA*FPIAo;VEh(@g+1lgulmFLx_iZ@d!(XwwNf4_)hbxyxiz$v z9aV+r!a$GFgle8S1(%7#CTo#4A3YMh83Y$Y;BPy&BDpk0QK<^83ptm<)G`T8!8`=+ zw)X{a&iRX(Py|Sz*5uW&NyAt<|Fjo-t^CLAy&h?-ADG5h@i-qVbv_I&5^x3bA68vYQvKY)Pz?m%(BLx_xJ; z_!r>ISM%Zz--=EBkfbW4lZfCDBc4_0%h$(Rl(3lguRlJ?hE>enawOp|86H^ZscQdt zwqd)|=&p;Y&CO|)RT$bstw>C=@KU%4+c@5X z%TwT>W;pr@g>s~nb#@-IuF4QD6+|aY+gMw(;nh<(7DoOIJ{8eDX1#xKBl(SRk5Xgg zFpGW1*Q}k(t)IBJ?TV;=-#+q3*8q!9lDe>xo3}sAv#Fe#hNt zzs2_n(VWDVQ`H7K+LKf4tIwA6)%r{7z~1E}rDLx%UPy#0STnMW;--%S*G;Y0>4aDc zmq|O8^hi$mvC!x~znSb6=BF*SiPhjCm5{Z{ef>&VlLuYj@)(WJWMGaXWzg6EmG1q& zj1Kx~2Ca{%tp&1UYqmaezqA68K9n`cF@~ zIr*Wth<)C-KJ`ba-4&x%US4zj4kEh$%FdUJV_^56ZUc?j z0R_^WJ3LHF{GrmqZSk^;l?@4cnB<6?BH6`+j!A9Q<_jyi(?>3jn;7h`zXYU;SJkt& zzuiXE@s362hK~}k8NP;A6l%h0i89A)qN^ili)EjmzRfS9%P-Qi>yTB~4oGs=Qr)u_v}CCovVF#pM7 zMu49)@orh*uM+)Uo~O-Jh!ULo`(Fb6c=;PjlLNGwf2;R9ypyYNgr{NB$HJ@UT-%1~cQ@Knkbkq~Uz@gXe(Syb*}n>% z;|ab<^nGwndd;lrrOD@Z$qkg5cs_BguPb|_jrive8v?EZZz6N*avRSAT9qH$#qh-g z*=(zb`6T&@y+op1HGmh!ij$imM_xiEqX-2(ih}q&X9w(>@&16O%cf*S&k$m_U(76p zcS)h&zj}8(pHDwOmbfPmaT%1%{=m)<$q_9l5v9$x)SrFvper))^BZg#pTy5u6f*AH zas4^xW9U##Bdi0|UcmfCD?#e|9p8It>Ym(v=b*})AD*(OK3oTJ)oe4`M@Ge8_8tBO z%Krx_m^+FG;|rhvxnv$DSN7R!xdE5BSUBqp`ZVb-^?kYNfc>i_0xeX9-e~y9*~e>1 zIs9Eh>7VY1ywWTPzF}e?kEKvL{!%_wI`zcEesD$9&n{8-^i1Hikrn$5Q|J}aa*z!v zs}Sel$SWUPUON(6|9`uIpw(gp+YZI1Sh!wA;aTN(YO@Oi-!ObjI}-KNEf_ktkl@ES z?`YCo(`Wi?%VN?BWK>Z$HYwvEn`oV#>Hj{f%VWl4a)vWfIHeClv&EW0|U>gJ5U|6gIlp#QoOn8GlLf3P@se0=+6gPPB8 z{NvhXISl{jPJ@pl5<349Z0(3&7BL@ey9|bpsw-R)^NwD8_)B0=?RIL2_t{yP6M^^# z28~Wx98aPe;LA4#w%OH5657&Fewzkt^}bTyEK>K`#yg$`NvkqGtq(mB1mg^oui;ks zRfpwYf&@MDNQjbRQO0#x97Y>Oemwl)der1#+f3|OcxLp7xg=&Z-(~kN!L{ap;Nr_8 zT+{P9IhXI@ONs#*{VZ3shn@WKEeD1vBf3Y7(HGhOZT`OjU%w1LM7Wt$bUCKKj9_hdWkN@dL*-HRm1(?OdP`nPqSeeD%>-Y{u@iPnMP zkI4L9(eahlfQ~gz%+RVy(nE~p`JJdZzj~pO(dt+FhE`1KHaqT6zvji+;ia1vo1{wj zWz#?8VTbOlMRawgor$+rXonXAOv+88)X1H_68J6gx~s5PHBCzb==Df8fRp>`Su#PJ z4&3#0TiZ4e<82k`h7>c+!h`9+LyJaalhEEb1p`Rv+UNg=y!VcWv+MqarAj0u5hY59 zFwuepqn9Ash&C7uLlOiddhdx6(HS#Dk1`kxQD$_4=+O<)qxarx&fMj>pZ0s+&wGA< zoO9mu{%7oK@4fcEuD$nK-@Vp%3Ecg;-`}WO-;1nzooF<@w=*$yurJeRTvg2MXTcve*ziB*@M;mqr zCl8kR#uw|_Ap%5SoDU<$glwW}!E}0X=y?|96t})=Jjdy__jFgN?;QJ^LP89q@czAE z_xFO|JL&(u6W>2N*^nn5pugAX|1WAd4|tQ8{;A1HG8#{9{52MsGqICDs~jxUH%_kl zXV$sCCXzzvRW3^f{wdh4RMK0%#WaYsapIB6TN#;#kJ}?|nKx_YeyMX^ruoS0GClm~E9MLdg}hBW^Y!0S-N{Vb|9ZvD4W{!QjTrfk!0=Y+-b_bCIf zV2A?z+1hUcbg%whfQ&_0_8Igy)zOS#q&ddlN7M4CZ4mDn^q}1Y3MhNJaO<6l>C7Y> zS);vShnp>_P}U9-@;Jprmu9aRn_wBy}@JEwuliAFUGMqf&>yfAqA#bRsha5$<=>Ss~;1m_?3_s zALIB_EGpA5jVdLnk1}S9l3c&qBjJww7$1Ry*|}_ckhjwBmRQhn2I+d%Ika;~XN`u* z^~RpUt#Q>;9Bzg{KOA*5AWgU@?JT@KSO(K9BAacLK5PE1xU_QlJ!#VOGY$U(uoSdu zNc+0kVZ8Ku0AHo%_MlB=8is5#G_rTIc1f{=_%5%TEtX3sPM!5d#>T;9_;BI-PSTZk zwg(wt3YoYnX6cOA%qOx^#QdKMnUeXwB@exOetYnRIHDupeAm=?Yw^g^d4SD*_if3Z%NMHrR3h zm=I?&*j>B@<>fl4#9`a38fJ*ewnc@KJY#%swjYB?Pt~JFFiRt7`qh#NuxThl@)``XeQ-WbIcJ>oPZB#)j zWc9Va2_)Uelx@a2&&66Oqq%+DZ5Lt_q;lH1-BP4LH+dzy&{-TbFefifMYcIkKyPeFp*0gv*?Ea-V-{%2{`rDy=pI{UQ-`xGD+?iSd(RCqsQ)5aR=b>s*&3(f=X#i;%6Jcd+O02!n9H3S1quv3cV9<)swqW3lGq=GSYK0r z%BiH!!N+DdbxCNTi#u^@2 zg2W226USDT&~s(0=>&POp z%-GKIV6U|ddgoZ3w$^1lb3rOkVkoiUplYTYf~ZhSHcS*C7qe2vXD~%RHcsvvPvBTg zbO9FNx7qp&?M9*Sb;>QD$tKf9^n%7So9}zLAFIc5I5QP!-?8GuF0d>}BOS%@lU@tU z<+L;nVD9W3Iqi4B4c&L-U1%S&ucOz+N(i`M7^<8>2PHp8%C7iG=n(dw9L0+n(Ny)0 zC~URl(B$nG;L@io%DC0UW`p9|(IWmqCxUDwqT1OP^vNzTMI68zG{3!mQd*4x*O~Rz z)+F(n#iLzzp*`8ULi7<_pkB?2^Zz;jy})a`=;CWy_%)%=P^PC=WcUuejyI+JM5W`_)+`$LiD5%PE{y{@E{k0OmwL% zIm^%G1n{cwCm5Dk5KveLi842XX74MxyR@`UJjb2rM{sr=AbR`;i$B+;E*_8;{FZ}I z^?oE}F@>krB3nR??3b-^%_{e$aoz}?GMgrbOvG$#ZZ|Lp0;;jBcL!3|9FBA3{UY(? zHSeA5s{Mp&X}1a-GzQpkZu%*Tx{jIWMC9cC-<#|J)Kq2lFoIAgotdbJ0O8P1-*#d z%6ax4;zp-T1!9)gZzqEIE%>;M7{|R3INEC>@m2&-${8_hbnQ}Bm>Ix9n+(CUh7<)e zcDc(2gCazgCg!;iDa^OX=s_WH&Z9b<)u@5HwO}Q?t0zZ}4$@v{d2q){aL$HXZ=8GS zgsZdG+CZho?-xlYbCG2&o1KA{C05)inOS*B+DiC`u3%|B0tNVtR)o?l$O}@D`8kH& z=2t4yeZuB#256T!g-)1b?u{0*V@rF7m%~6S zbBgsol$)W!P_6ePuFwLnjAmtUDQ<|otL!C^iK{)I*EPOKd}MUewB?X+1QhOd_U1S_mu>vpe*}+t3(?HJt$LmYo~xgJk@evz=4bX!Gw z$1u<6&JIe2s{mP9$I}6AB zR?W<0WToy8sUtITJya&Q>Gbxi|9r+|@i+x>aQZ=W&3&@izP)s;QZ+ve} z7gHr+2BFemG^OG6-nYa@%I~n3{~t{4r9&NyX2tEx49H z<*kjBiH@|2IQxA%`@Na`S(%3J|M3E{jwP=uNEZA#RMlONn_-@Yu7AG4#Km2@d;eSe zFOm|~aE+A)@hCet5mYqtyYFH6~%*%GW24~OayS(+7bn*ZB- zKmTp)Rj0|njs4SnRu64B#}5w!B^OQ+N)ztn>chJOUJoGjMVVD z{nGaj3698Pl>c&0veIW$Vx+(QjN(eFtoNkw8D&w;N9KS0o%rMZ=>n6WPsJ|#_>ONc z=l{jUPs4qGo3OOE>SHryFA0{f09K)|5|$^wuCxb1Z9fqMdYAKaqhHP}MNO8ecs$NB z3xTyGKAkm>20Tjj*~s9Dczn?WRNltRI-p`7n{?6+q}hLvckUQTFKu{ycm1et z5lK9n7eux)_PW!gHWJT+iHGw4UyA8NiT(rvJE7<5gTj1qd4}TS!O?N+5K;mQo-{NV ze7iJqEyR8Wn*n^_=&bao>-0b3a8%AYf70LSK-Xg)$8p3lIF^kfm4EEfeHc7$UQFneC{pk7zDX;$Y&2nZlI|p~~K1Ch&kqa*b?GnX8=& z_CGm%JW}x1oB;KC+&_DbSL^!O4&USz;#l&r2Y&@aWgJPXS4k%yR(eVyFb3_j1!lAa zjvR!V@8h4xR={sh_lQGRZ%noc8&{G zG1BthMWP-H_Dmvg#u$d9aZeH-MTVKM#|oF_mjpEqeCq}PT%hPCkDJ*hwId1MXeu7E zWz;1{s%FsAK0jT9Mod_Fy3Pv=jY+y2VPlcmpelYZ1%BxZ1ukOO>$MlY z4#HG;>{V~pDOif5rYYyX2F#*(HiSUY;U7t&Bz>ZC358!%k{EOq_Ij#?VJYLB_S1@$ zYI5!=J4t!g$lJ=YGRseH@ds5)+OfqY83s^Jzx1g3upzjVY+~l{K*U=}0M)EJkhG`% z{*YoXh$i_XS~WW@+*7?e_3%>Ny(248{VZiCrv44-m!eydvGICs#GrKVg;i3Yr`!G9 zbbuaiB_lB61*x6n#_xrJ40!ka())(aAKKj;YG8ZV_^|wpeEN`o(&Rl*R8cbZ_jj)# zj_yBJC3|*VC5PgrD`S+;A8`2)vuBb4RBkM4-h!ESlBo<`l?q)D$b&s(15&$@*ZTJ6IQ zw{x-&b6JxJiSiY5`!BG*V1yOEM<3hc0)^vkPHNjWc%e0W`&;1rDW|}z7+%~zoo#k|f z^_Y!w|F$;&-RwEKv}0T@XVJ^3+n3NhbpOtMLUd*@wloRgz#9ABm5EEGwL4hNbD6;I z{L+s4#jTQ5eyaeXaL(EJ=E@gNyeGM)t-K(xx1i#yz2eyS>x`XP#c$C+xv+|^FI~=L z|2f3s&;5Z&wE4(Xi1#UTC}->}5v3^8cV{yBr1}-qPjLFH4*vYzO8ZA2v72>)uHKg{W9%VS#p*TuIJq6| zdVS@$k4(5@I)e-j>=DPL#>$olQj2f4I+!X@zerpk_rs2om>oQ}?K-vHi|d9F#t{U}&De>1a+K#%{2i3cv03QNjt z8=u${?s+%^7DQz!#()8%-fQ(z2{j_n_BIK_rG_K^F3_nCnlZ0})1V;KNVuYG_QY&j z`i7gaSLv8w?fYtYUh*Kbxl^)maqPA!{!?$f(k;w&S%}t%XnS&h*OVsRcz+UH3$5NB zla&B{gDfGaZiiSaa6TF|pU<9yauEEp!I`Hhy3z@JNSkT_c6okOdDy-Tky6|5qfTp; zVR&#R_p%4>vA7m{*CTrPy5Vp*2Vj2mCjZ7m18@{dY=iY>A>#tdusrKvD{IjmoKqst z%VVc*0Ei!#7fQ6;eM9hl%9%R>@`tMp~L3|vXYf=41b*Vi+ z*!^-gYiC^fz!e7z|)xF$2zN0qzkHmhIpV z#v|Rg#Q0E$c@ra&ZpLo;d-p}e^K)J2Vj(3%FfFxCV^m?9lmD!HP61Ejt7MamyPokc zO|%6}J*IcS>#HmH0W=m@iP|p30l3vUwF%G+u`e-wF(6x{t+fYk4q%bB z-iOaBoj7>tw=;(HEuEgtuQcW^afzsG1G3>3DBX0~gP!K!?e#8&hXVEm5HDe?p}t>S zOPp0jhE>)CmuXP!cA4Zz1V6cDd~O61l^nC7wr`oYqbg;Yl_0Dv!WHeRYgLgalzc+( zO>bo+)ZrE9#HQ+<=PY5q>s!_qB{()3Slf7%fAl@8!~4@*$c#v?7rsStT?kMb~&MvwO5hH79w*aJO~q(mzLo^O2S&>>zz43oUIH!iFw3L88p6 zsEl?_zPO2PPU10KVR+fh%PYsIZ6(*W^FEI=H5&p^8z20YTuxYj5yl@JTQ99Qdav@U zy;{YvV1G?E7fdomHpnzTAdtLyq0+KCqS&`rzU_buUXWY?tFRizFiPN*3zq;W*UE^L zns_3Q-e{U`hF3Blee~2736`Bit!73V6Iw}6qz+!F8Dp^^i zwLYKVnLjpW5|3_D7%n(+uhofhz?E)i5UCWnm8;~dD^hPv5Sb-1$BVPQz2XhDF#s}7 z4NeV_2YXa%$LY%QP33L+8CfFHjqIgm*GilE+P;1>TrJtnR0%k9!}FLQJ7oaols9;Z+y^03Hg}X) zCe}lJX(WlH@2{55wTWWZ2hXhU38Ka zt{jD)Sk>4)H89XE16oB^=jr<``_Z`r$T|0D8CkycSmDU#$z}z|k*}YPRl0gD6T(a*kQ3tZ8XwPCfs(=&7n7-vM9$+CUHo0%4 ztyv(n(sih!bg;T#RT^GtS(BD8a*1rp+tMX3Fi+8P)FraWs9;E?u`kK2Y_2KtyF1i+ z0h!I@G{qqUa`0}Kw*~hUepDTKnlr_0HlT}99$zwR-d7W|?m}^Mw}Y$?6f!ehPmB5? zBmJQqyo`Wi`JXX&KgCWw+b9XSehVD$OJEXd_ojdBGy){P-Ah_CYF$3 zqWzqpWoGaS_OpuT6BZOP0&|WF_}D4t-#P;)TWwd;YrsQj;c7h49+bSNezRzywUZV1 zj1AX%*StZ9Zryc-TM-e~9JK>`gTgz|nT)c|ZJU8xz^u3|TN+6R+cF)!L{&ez%;pqi zntTv(BOy(%4${!>y{=F3@(n&54Srga!O;#X4*D5A2XI9&_vqDCyuY}SB%M~_o(SXu+>*I+rOa7pO`v;mMjog^-st>g6j$hSs7dQhTCYLZ~D zN-!wOUH#!1ffbTu7ML`>4YC#HZju+*AI_dct+Xgw1Jv@%2B!OxEb%dOk9(BIVZi*D z62$yrQ;lnrXRTk=*bgJWV)bGfitoH-l4c+ zf#j2Y?Xt=>2weKAk(M#(a~7-M(AGHhoQ95wtge94(Ok%Bqt{gQCs8#(oqi zq;t{ImaB_mymWz%kGl+tR`v%PIiXt2KuX}6o*&jrmy8a++FtvD5|ZGU&dq73hp%N* zIl2^(WqcDurjNu{(kpoTEx_N33Qay@HT}sskBn0Ppj4REGji{RcCkhtom6m^ow+O) z;NFBD)8An3DLkG%=gNC)yQu5?qrLB^9(RC(4exEMQ6E%achje!NZY3qX8h6Lk(~Gs zV8@|esl(CQJRSHxuVzBn+ph2_QY!42@bi`weEJ^6G?FLy?TpA}KjEb!(fcy@a#5CI zOZp>Cg`%)~yk*nWm4qDjaWp@xas{Ui&ibVp559IU9KU)0%)>bv%Bh%^hlmJk&X=$# z`*HWNVE+mqnzKt3q@m}t^}}aXq|#;rE6*sz$wGEy0(q3@CKE+g zVwN$i7R$oXPejEkxn`!WL6dk3WG=sSi*Pm{AsJs@RcsBxkI%DgJe zej8$AorLd*GHbP;V`Iyo4cN`67j|{fdHMBkpF9-Dy!df)jC6*pKyyc*>M%ATsb|SR zeaWTiY&G;;9?01nnGh1f@b@pd!>Nv(_c&`}b{_m`>uyw#Q7grrin)WL!RqGz&7kWg zT)B6*vkuW6)$4E1Vhos)Vmg=#<0F<0tP+ftKk_4~w1u3d77|6~fW5<`3JeM<+hpUj zo{Dd@hx;^ zU9sc?CfsY%{Ev6)cVC@{n(SMi0!zJSZ>ASsTH5%o@rxwFcvJY?Babk9E1O{W_p$wP ztMu2}^{PL@{UX@{p40szX(fah*6)zzUs_-I-t~*botZ+q!T1oFo2}LLa_KniKexep zlqJ0}HZ6T9OpKcd)#W_OVXO!LVg3F~Dll`88%74Zc>ifhgaN-H3d0kf_S}F|S(avO zo{gg%^!`#b`ocR`*0(lKb<8v9twNH_mNhWU*7G&Gdl+}>gTfEWibL#IYm8L*-3(2N zTlx*D%D5hHp9fcgQtdUY84K{Mcq1kA{&rOR$ou*0bgYhpSdCnaNzSy{e8UsJaUwoirCfk$~P_q zf@>dU(x4vACr%gS_Zt$B&>_Xdf}|Fgff8PNJnU30<@Df9F8ob5!ZERYD1)$3~SVbwea+`G@0UyXJ8ki8w)2Q9*iJ4U9N zjLtUJ4hJh*v*=z?g7x5*e)?6|xOlZQun?KCff*o_7;XmO0R}xW9C#R$mHPHgiIh~o zGN@qQUwx+t4z^7qWbkRHQPXBsj>9)BijP!=?-RT?x$EA{ zF#owakoq1B*205usZ=e`Q_-tcMsphZhoxvjJwFcCazDKan7aiZm$9spgSC`EqsH{Q zOBcOgd6sK0D?PZKPwDOfVOLwe6CMl2Wv3V86x}j$xQe`Chqn`yrDJGsOIiA=susYg z2h5$%h%cQJee}$7VJ}~$;nmo;H|2JMeo;`{r0@G2jl|41EoLK(3ld{h+Y9iR+hrxq z?b7`q{>ay17-3&+<{R5X$q+2@j!ksmsPmG>;+bv3$(0X#ywoEDs2I){(Y(EeF zEJ~p$f}KS!YG;lo6_1|aSfo8djY@P9fS3W$k)!cRPm*Mpu8?F<`z86sybm#WXm1Yh zv9H?F$zBnycz}XlJj+R#YZOUDTx_hKwaulDk^Ez|!rY3>z=6D$+X*GfB3g#0!wc2P zaS(*^Fh^c37~BDJGHc->-fJre!JI-|U8-yYao8S1&naB(QNuV4V?a=YOVU}W#&_sc zGMYU{#18x-F=64SI))&S)k&pLi6-V0Hg4-8&hF;>ygS@MfP!?##pPCK zwNe~k*T~b9>`N-WUitv2im+|q=l=D8GxoC#8%)42GBd&(->vT z_^JY-m?~9EPx0YN?bS7_8s=}}sv&*zsWhR9LzczZJM-fc28+(u5|*?=tgo;xX=M5N z1#9Tp-Nj#Qr)Iy#_fQmkerBJ>9qK~qwAwELq48%#k-|eDArhnlAVZqtd(IJaN zp$}P%cI~L(fuSbz3yDnQo6E4Ve=6^!zOSJo-E3WVtu-6X;c*uA)xg2%vMqR%inxqujV zI-T@NLE=&&)TdHadFLe1u~e81+(nokYTyJ8#wb7pvq-Ya>;YAy8L#cQdjPotE( zXHC?V>)!nAi@WG}AhqrHfoxCwSXO3?^$IcH)S7+*2E>Hd7QTqQl4A@w$A*S>-uV~2iW9m=rYh(O4d&M~`S3B?;XhJT=7CRjq z8b?9vJ@-*W0S$`9Tg<6s$I;m@IAQCd9TDc%oLbQ#|AdGCi2?u5lNDSA7;gSMfc!VL zhJR%7;##)!bLI1&zI4DJ!>Q;v*O9RFm4w|(nhE3z7C<`eiyv>kJQjE+Ajck0okK?* zE;9wpQH)P3n$m&a63ruVgxq5!ymQ%zA&tF{&Eh#WfGWIt*LR0Wa9!gz_$np!Pj7Dt zFRLBt!1D{!PqtIU&4oF{@fC#$l7pAv&6V1@)x`$_)z%gta&mm`TF9wIyiF77^rCPt zv~&=6s9EixsU7g}eXciW%va<8G+v#5+|DGsaOxuV=jLIUncmdqQias@o5Nbx!>sd> z$OYuq48w;G%YZRSiH`aKj8en6Ml0!na3R6xsv8|oFd(9-eGfX-cjl?iQo5h;P0?PZ zb7f#byrQ%4yh1u8_xOYGt`u(5{8QY;Cc}pUEG53OzAJ=7Os;eFwB9EFICsH1y=L~X z8969yA@d#rk;&3Em+2Py@xWgrM!^OU;dMkS8VN#fr$#M@3{H1}g7fLi9OQ5QsR>HT zQZ4rduwg(V*DpC(+zgp%tdX-U%YB<@72XVzMShn3BB4YI%taa$n{H=-xdjwN4Q~H~ z5=nzqJboyAaN)2$59u{1F9pcT78HZ@AH#}#JsWgd6VH-ABncMBtb!PbYu4?!W1D!*HRTf?B>Tin}I! z@5k%)khs66zIIGeFJgPIJ2KqMm?5><9Fn)4Qg>-l#EjlDCr@5dGFxOTMbHh3d7)(1 ztTlY>W8V(WN63tRma05n@GH@3n0HV$-c0VI`C)^$n1>pSV)C(FW7D#xpoqYWBaoo` z$Pw+#=%l37IwQPDt3Ic_lr0!1(%CE#QYeAi=azN>ZVyg~D}^>cP=75K;{H~uK4M!V zPSoA+J*cEzhDihnN9hrCg9RUD6$I~bKKR{yxl?kqEN#j`;W^}+9WHma6@9Lw!!Yf* zupn?h{+Jkv`Gb2Cg4oed3)8v%pBBXhA?8KA^qbU11I4aq?OdBuDW^@h4v9>|mwXp; zYmA;9d+YpVD*bC4q~DnniG)9Qji*vi!}ZYLnV;l-m0I`uzHtz}Idcm5MG_3kb(WZ? zNF~zL{bkbpWnBE;8fk-cg30+=7cpin)LkYVIZhK7MUK}^n?nxLGrVF&>>_7ai zea!Tp_nj0;#iF}XUkYo~iJg7=r)n=2{vUhWf?zC{8_q8zG^Xj;6FbbzPOo9SIHU4R za`|4)+;zn+g|_UkC@3A(RRb6a%xPmWSb9u-=27K|z;5ySi6#=3SNoQ@yymTFFC`S& zxvBEr641L?WXG*>z3KJ5Ci%;@IV(FNU_+8`$Z+Xh<&%}J$CfML=&t%GCNJN%j6U57 z>X~ZZ5ov{0_?}jY71xHZJz?0%^)M&9-fC4UX3MtSUujcloaV;%U7_iVTJuF`0FN$# zFNJNRwDsO;Q&$u=H~aH?J=Gn9zx6ggCL|Yj#H;23Z9Z*(`WZeIDu_pmKID35&YH~K z48FE5Q7=vF{p8Tg)?XZ&RCLE4$rfL!@vRR|v4xP*0!5TN7`>_wqSu!V%4eiMD^tj~ z>JQhmL#TRmf9m3;wD;1KcR3Fv(h9I|>1fPI%dHq+Rph-AQf~T2?#($dzJ4fgOG|sj z{aevb9qp^rze85UiCMm#O@kylyJ>zUu~EH%-zB}(RO4@#GAWpjFi;$9iL6_}!nMOM zC&dpmzDmLsRSRO@cPe}sc~KgdYPYiaZ-?Ljf$5!FDp0+A$^gZNs1UyNODo{h>LMHpK4 zC}`<7W$>VHF2_Z8(x!?+mNJ(;$xj)wDL6p3tCi%{_Tfl6pjf5cv{RmaQ|xJ?8J>*( z<45A6n|l0i#jSN&d7_pRqJ|bD6p`a+YrNEL)w-w#oK)t%Myhs%@Zhx@)oofoUf6m0 zB&n1b0h1XrM13_+8>QIfaYPA7pv0#@;xmZbPW~XbMx$dB{yz-nA^0SWX zf&;j<^2_@w?kp~(N&DdS$j7gr)PX`SYZ;GFj^$D(TV8WbPXubJhN z4ar|I;tBap9r<5`zFbr(PI$$o6#=-euEX(@tS#Iq^AqhyVTibez`ajHL-*`>r0=1_ zstN##Qiq+7U!P^94jtsdUZm_CuXxfgyN`IRXnNXTaofm;zf}-}$gGikeqexkONqYx zzJhH~1Wr@Xn(6Nr==`?gstM)jq3DY``J%bC?=SBKG+$oN!cT{h# z^cun+tDz8?zQYs*2}lNqCCjL8>5R8*@dm1DL$dQZ0?va4(^*T$if3Ys#0Cqro5#I zorP53&A(QTSliFG&P%jf#rSBhjO1%6tAYUT?T{jrUMb^^%vzln+HdYg^v*@eD%kf^ z_xMlGuErIPseH(gc(L6!7b$f3(E1li5Pk*Lmc`nw{Y?VQVCTWgHe(+NvlML+f?C(^ z4mB}MFFh8-s=@7-Lr|OO>*bFG`Zh0qgd(nSGNPZaN2j2~()3pzVOLJTTrX|Ib1{u- zuB-CI!}wWaiNx*E;?xKiUJOdO-7$PSx$J7Lt?BG^`jB^RbH|VG!lB9{s>)K$wE%_i zDSv3~_Q175>;-df=jXTI3A1MhDjM9*k?BM(DWKhR*i27fYaG?=HiwDh zxJ{IBDE||#>H93t%y2zdRzM$aRuHoaSl)kM4}Lcp4;&gsWYZTr(}TuNdh-)iWNUA_ z6&IpYMP=#1n-E5j!_(=E5N*sAs13iNM+^v(mCC>HaM(7SOU}pbnkKkwkE- zbYy(V2^HL9hVKvL@cweGt^LD-RAnJ3*BG}cAkwS~H)eseQX8krU+}#0_$JtyMwk1P ztR#cM-mJIwVYgpj5?mfbK}ku^wJHsPN6%qMx3aZKzMbK(T%BzRjHkVQxbM zhs|v5%q!(l3OW^+*hO1F8DNAH0N~0CTB0^9!HA5PtqDC!9-z1Vn516vG}qaS?xsXr z_(Gg$Mo9$HkrM!CAKSYi%8;5(tVzmzjc{P{8{>-B=3tE zsmp|%-mLV@#5#{N4;93%L5=yq%{vLa(by zOqPD=|7H*yS5f9zGB)}i@LA4=zv%mgd#sWk)*2>H++gSrW3LA-cKf4y8@lvFxsYaW z^lXL}Hp)2p7YuKSna3hL1^>( zkM*-!P#<{8@++mxO7b$kcleN}P*sukinwQu=_fB$LxCDPy%u(L_a&S1l_mQYDhSSz z4WZmNQF%K*ryd-t3^0v*u9Miw&MB!s_bm-#dV3LErG3nzEDb7{s8;JvQYNP!!g)-Jj=%gvQ z`4N6q(@r@WQ=AO)`x>3a$}-Qupgx3H6lIbZ-J|Lcyq>43La8y?_=Wtm`x8vA(3RDq zFK+i)N^-4(F9TF$!Ku{T$?Ue5+R4qW>8v>?AtayX?S1A zgDQ}c*IDDeI?E;Ot_m2cCWfNu6vA*}sU@z|%)~qR@ zfHfNOWi%)U^nNMf_}i1an%kM~ocdKw^tAexaiwoCm3p&cK@;zeKWSn8DAUE8;Ym{n zHNI%NH-EE+E)sHxXtKijPiZ~Ez5^Fg2yUllyxhN@o_^~SlvE?`8UeAfLee_RhgQ?k7_QvdN7aSwLMP)x-DoY*(o2@`H49K7PEUeU!kIvGyh?S!9aQgggKHv^C?pM)#Ywjv%Jz!^e#u5`tcg zm`>zF9TpsI#+igI76HA(_^6AKLJB|6jyJNF3LmMLAHksg6YWCt=j?GEaaT2B5#cPE zEf$%PpG_~@Tm@C^OwJf=JW7dq8?2jD`o!j;mAG2^(Di-JPg`q6)4Q#YSWk0vg}*Iy zcfAo8*d-dWUvz(B0rMqt_i`Uhrl?G)I*8QeJcRM(S1~IJuv~LDiRb#{-gm<~x>k|} zMUi}UzVgT8yWb>sc66&3OrF9699p{GaJLxU;{I@)K3nzL&{OSbH2leQv34t&i0n?C zTEO1H@?#_Fo*4Tb6+!sM!@_R_T-Rfw68+ zcIfbOLJhAW$nAwnZeprdJa>Ro6Uk?;HJaeEl_Ue_N`V-5WjnzRa(1rYq6{F#h>)tE zDj?*Fs#aFP%r8^w^(fr{NNLrf<8ECaTCSaj!b%#->a_w8>RI! z?;KltHF;i`O zkBL0Z@W%lb0=-9=Pi)tqEqQ z{pfMN-y}-+a$4-xewXVnlHSg@tL4dILLFFR{UeTftZxC1nfgaLxr#kB{gHTquqD6VDx3%a)HbfFW zD(PZWfl=nh`ytHwL}rqismgRI+*r`L@pKweE?$rD4KSi)!ie z^4M2>EMV;=!~ya-R)a6^+%$hRsku3=XCQr}D}k@bdFT#6EKs`ek>D-#Fwky}{jwR; z?D2DRYR25mQU&&R4YjuweCs3F;PHme{e$K>s-wY*R@B0s%yvo*Sp%+Tmoup_Y&WNi z)YL$$KdmKrxC942mnWyB_?1Zv^9=R%0N~e^mX(*}7-6wlm4k-%#g-|(9}8||4y+A7 z@uo^$L-l<|>D;I2qBR@(Cb(v5X)sAuSlRB-`%p3QIfva*2~&u7eY3jOCc#{@GlKvg zF173JhdBCDI6JQ>j-Wv$hO^JyT}l0_sDIu`+4@DYGMTrnYkBuE4}EZjjKI@!ccm4# z>fo~F);`M2i#iWIG%_nDk{l9>bL2CchOqR`jM}tcx&A`JA3D2A}I#$jH^ERQQaH?)0NNc2FD{5SJc8lNUEfd=$AC--38|F>yeIk$0wg}OELNe z)NOI$HojPN~Yp0baz#^!HnI-l|`v$~INRTx?ik{AncgYclirwHLiJ1z*O zkrYzB+dfk$KWF??H)UHdgvxR&32RfUQdZmCG*J88!#g#B)?#YB_KxC>byXmSK|QHF z^9BgYE0*#jrx1z7mC|;0F0n0$6C|h(tf;o?ddxdJ4xC^D@=^;eNk7V}(LpJkMy=-;2X~I9DaSl@pg|*O;|9|M0&J8y zLC?4#B#$z(8Rc3ajq3ZX3|K+;tmH`y53B|qg2-UJFCpvW7+Y z+f<>qLUBR{nkV`%*|3r!cLQ%Tu74%dA0wc_I#xP?`KUQ2+lQ@*wz)`by)ojkc9>;P zpu$GI%0VIuVfePMPTb1Hk_qVk*j~MD0*F_??GzSzStVp(%<`cMWjwTxUjxz@3epLS zLfuxn{O*~^FvK5IS&OgBE5TOmR@PAoJG52fv-`lKRaV)Rd&(`Jyz5=7mPRK zM#CpHCNAAvmVO)a;3$zx_L*(xaD!n30&SXew>x4AM&>m05q@VI8kXo~ixTxHg&ZUu z6995M;p4*8HgTxLIxNv!!hFo`r%U{F5Dm`usvGH7Icvf(#A6)gOw3i5Tsae+Tt!jOK^90>*4#`=kBq`*>|6F&%XaAYtFUSTq9%6 zJn!dy9-F#yZO3;Qd`@!mb+1q%$P~-@2;+uDK=XWxdvp8~S_a zO$INj^vzGRzssI2TJXw~8UOYF)WH7BU--WcAPA++mEG1lFNg>Q0#$5hpWP}tdVzNDW z3PvT*=8WT(@AOq*cW){of4(w7wQ-Y);cb=3^9YZR?n3^AxV2S@&p`evonOUHf-Iq# zTe2cdKQKiiuPGTUd^N_;S;fFOU1oaQno#L* zwLTW1+32#zmVl&5eoa&XsXF5NUWO45NZ8A)PBCVjPqHwnEI)P55gL% zd66qb=(y0WW(86Y>xufliYLR##94BV#Wu{Lo#*cmrO{S+W z*=QANu%S$4WB=@#>9%#YCL~l+8=OVRCj$o|3KflZjH&dr-mp6kU&l3_he#{ECj>6Y)ke&SxJn9uXVd zqa~zTdU(V(H#22~ip!DfMQ!WK$#9dDXA$~urSGY9w<9de?3cole?JMevk5VbpeVF) z%0C5or6n7sn=UW!sr2@^gF1>fv@4{daN*z3u|ZA?AB#O@S^P97&ryU1~z!9b%t`#Ia~J-b`H2zM^rQ{wZo3(cAGPhDopa`y=8 zP;#h}e9ZF;;!`_5h5=a-z;W0;2Bc{1T*2&{Jli@pF_BO>g-`+9Yy|0$;8Y<~9Xbd- zU;Xk$9O<|UV?@8kCwv$nLvRSETElxlZ6#VwRSHMAHzu=1N1mQJmJcRxXH@jl{IOU3 zwO4MPgwQOwP+KSQO(aEmTa27&8c~Mxr|p-l7*#?mX49+_B(+WY{nr>$?9uUZ59s1$u-l%h z0|2XLX84<(-HMQw2$o7MV4c2X&B^Dzea#;Ez+o~~=cz|Yq=7NHj7t;cC5xCv|HS~6 zF43sM!e^x9+ya}@a;d8GHVPmqB%@Ov{v1mQNnh2FqbMZ4I#aVn2B*X88tO8KBeQU? z8Udp_BE&dHMJc>CxB4A#rKa}3)VF~}4;=sXf9|eOz4&j1Y8+SQuh?mkh3-(@G@()t z5QUVXs_J;jQ(m6_j63Z|gX!1Q@Xk8X#}MEx6$r+hOlzp{`A8RgO$!)FI^=Vz{jb!&RI zbW6$Uel`J)`{wl`+G6clM(wQtaCP4BHO0sTHd01Q>?>Mo5E~JShYDAQ-o+`KSRH<` zY&sFRfgi9BkWo{}myq4!aSnt$S_3pxrb3euFCUZ%*QDdKU1r}epJ*VveBqK-w@}#` zG~l$98JNO+<}~)MlAfDJEkRpuCMfe@F-zaWMq0s`3Ey?79H=BM@65Ym^{=J5dskFj zy&r!5vzE9+LoaW&0&sAby^w=JXJK|CuKv8d4!2Uvqvazb<^SicLJ{phWIc+(`fBlL z?rSs)xWJh{(UjCrBw*9*M1+YlIIP~gUi^&P;0Jdn@#{|2s~OxbIbtW((Bo>>Uu530 zpwr%)Cptp~=tO^J*ys zkK}2>wXQ(D*j?bAg28)dD`|)8=ATS7x8qYA^)gi*EcrbQFF7SwD0<#K-o0P15xH0d zM(i**eEC!s7JWp_n{oHPf-IPVBf_RXb5)^Y056eKOoJzcPBkglulmZZsIfkr%PJ<leu$3M+3mdY_BaIspZC%{KCDQ%6Bd!t z)3rhfKC6|q1Yd`~HGPG3?)caRwJ@+_kAoQd(kPHZ_1g$UtIks}rDJ^A+U+{%+!WH1 z)HmGsRV$(fB1tqGa(W`Q-uPa2hyBYPok`or(aK0qpv&X-5Op(tCiO7Vlcvb$WytzX zUgwtY^Udp^FQ!9Oef^>+t#_xoMY7iZyTUh5yte$P^gKTZ? z^#=CV2{IDio=B@{zjXMScak2|VfPevdUo}MCTR;sSU!Pd`*1Em`?&0V__C3&q`OX&zS#ka1b2D>E0ZIk>!@kftGVl~ZIf^mqdmN!0NBtyH%WehtXeRk+} z=n>YEX3Uw)`^Er~IJraJ$!$V+NYnq?bQVB?vSnAFoFTrjLC$L8;Y8oKZamceWT$!K90J%I~%n6NEy~6x2u|_y(La zGWf5K`8OapOosd6ehIZSF;l+}UoGUiZ5OcSSOeR!cgy}&jOeEn=_Tmr!mI0yU&p?f zrO$_N7X~t$r8C=P8N0$*s-&DsB{~L39sA;=4kGuetvPZGR4cu`@C&!u$tc5fqoy`@ zqw0hw`w008C)PN4tES)&*{VU^)bTzfLNaSvC8`iRg(jNdCV5br;!=|ue15Z6;fDoZ zUjRYu4>9Jkz@P^)r`Ob}uGB*2vftYlkc-HA*O$}I;)vnOW6j);fKZ@K?GrBlZ}qXo zrhcz>OK%9uQRXq}#{00huH4F_moUB&)+{A)6H=Izf5*ho{lpQsps%Ih{6$B}JYJcb zxh!^+EIlQ+Ff7IWKDb;k^Ms@0LpRPdB6UAg-v{bu%o%ZeZ(jjb3W{{LYnYyP$boQv zu_Ur|j>UM@dM)OS9f-L7B&CekH@8y3r!hb8aUQ8q-TjMmvPt$G#Ve(u!xSRfSit*H zKTJ8J(KoG@VUBiZ1~P7-TEgVcsQU?XP@*dJd`HEsiX8r#KNn79?89E>*o^;h8&?mZ z%?GROUUJjWVBhzAu`MjgpyM{hfLoDYK@KxrCK2csukc)&MN8Rf) zJ4iZp@!F_kJfQmM!T&qLC^(a>(LWko!`Ud70UWbMzu_5>Wy9g1 z%Q$o&@WW21qYAsxF=_z?8w*P>+a}{&TV4PZ6{RAUJ>-c6rkZ>0qfZ%sI5;)&E34?^{ z6iU$J2>cSXWkuDH`$w6S=Q${%^9PJ=#%|X9yaT`o-*L-?iZE7(dvEKsOEfYA zd2MDsE|tc+kBPtkBafabvl}rva947`i}cmu-|;A^h2@-(`~RH0Vs%@ser}`$HcNEE z@39G_u4XLGM}C0i(;>veb6Q6-$v?qOHw97!#>GM3^k=)w9*Z`Xzo-% zl^FsCwQyIE&9l0u^tLJOQ|NseCMX{%e|9_p#S{6n`;C ze^RDJd~5*xnXo$FC_?uMpSu|&cBQz??CPDZK1=6-4zE&Buaa?It`gf_CX~I_6{Lo| zj!lFYv;3Yx;iOXG0-9B#Y!GkG2-~n|;B_U#_6V7<79r@`QjVV_P zj7?=yagmX5C05jh${CpBD!Op^;GCh&o^6ly^=@gCWkddHevw<0K~bX{rKf4MGpzB* zYS{zl)KE(FH&iV%tV5O-j{@`O&;_F*5PwuB-J=5^*qEyruGFd1GP1Mn5pa9S&f&Bvb(i5v|dNwQm4L18f%25AJ z=KD!f#%)CT{w+au@D1<{YL%yq!vOrEboyRGTcEQodsRuU$E+S;ha}eH-3aEO-&06U z7sb1K69SCXJ0M844!TmbqKk|x)yurO1PCYOY zHWq|qyilGRd}q4Ioc$Yeg262XB2P!>Oc*V5fkmMB@{zj*n_ze{vDqB6;y&-XtV?eG z<;K8_YUE}Hp>z83OOrQ%qwy>A)F=iZ__1<6{;_i5(od@?mrC9|k-3A>g^9dZ0&1LU z_iGg6RdSs}NgWm{Q@h6)H$B;p|_ymw&>gEstnbmWSYQ8lgf_D=_B1D0n z4GMTvyrd?-E$cT%m0t^Y1DfQtM>lMxL68CWK~Af~2=F@QRYy)75AVcjm*$o9_g|SQ zpuVe}6l^hmXJOHsESV*^OF%IP%>r9ZrN8HS}B`w-j%TY#PEDksXR?rAQwpI6a^fv?eIn+Vdja zbT{JImVsYSbLOMlP)5^Kd4IJ6FmVhPB`_2?nw~-EplU#AF|Vc6v^nCX#GJ~I@kM@J zVcAienvy`MWg)`YWK1T)|e7ED&G~2qI&7)hQ_B9DThup{mh3 zK%)jxZo2N}WqB#s;hM* zU7uB!7=lrn)BM?D2nnV{MM=Aw^{%Q;=W0(_MUbH$yn!$!rza*}g3-!r-nAXAWYgbL zqu}E5o|kiBtL_>w3sr^gjj}7s#rqsl6cHbpFTAu~i=jSWN?1*Qv5g5YX%}KbPUWbo zHM=^~)OVQ5NKVYF!Pz5QvUC$#eozYQs$Y_vE8&iQ)xQflwW3mT`Co^w86_&CFKp@{A;NR2F zb@F|n3;x6Vkwl3t>9SbHl;3_``Ns1n86UVNU4aHyn8ZP6>^?KYs!HzKo5u6$vbvp8J=|r47B{t?+_mdL>3_|DqBJV24reoHGc_V^^3XOau2lZ`hAPBvx+m786@O$-!V}(bU%}BMe7vs|mmsWTnw)B~;+h}op zBGSro#PG#W|DqxldlImEf$eh2T_jE?pQWij@3Ylb~%e6J5zBgShEc_CxS#I5nB!sn!9pqw=)PT0=|QS z3{qgpHU1B2EJqZSPub2LfpeCgzxveOLf;YThG#kvq>5x5)Cp~Eq4pc!xdJs77$@wB zf^1BwZFolw!j2Zq7_u5sA}`Ogo5ygg8px`UHD4(v&tFVT7%J|oTD0!aik?-}Ke-&?D z%tluYwq=!GzzNo2n<$7-`Gqgv1&NmB_awRuYj2o~`vn1wdxLp0kW8JU0%sB7sxS`B zp&nT1urZ?{O240R@iK36o;fe1JRz)qIzHq{6owst?oB1B`X)(oOT}pg(dYP3OZPD|*nc(r0|yO~CXS z0&?gM275T+%A}{*sZ>^XAGk)ooi?!M8#2ld5fY(-IaNp6j~FSlPH3;gJ?r(sVd?=*CXKb^Z*oPisA}OP6_|s>ZlZNqYItA$R#^7 z7bWM1d`~%h-Bh0D3yS;iUg&gk!AFdA1jP$WJe%Ir3}rauRhSByH9RB9UZ)Ng>uDM| z?z)T^+c-asW7C(Ub4$`KzhuZLqz)E(&uenGW+QHwx4bWl>U_nTLJ<0rz}a56L7QCJ zp?BSV#U_|7CG6&Vk&%NPfSqSuL{OlrtTE5&VS`>D#qVZFbo;9ZFoX5Dxvk<3@_75A zcYG}PLR8shPCiTLgs#y-7UP<%0{ud+FJ38h@MD^_eco}9Ojl*O^zf6oGs zc3ZYk17DkGqt}@hz?8vdNWfrhex-%|^d3IInF*$I@ zDgmq^X%NV}K(yRemMU@yqzuUfRslNtlaz?dZ2Kou(T%yIarB)cEMLJ8Ne7wMMw+^_ zBAvt|4^`j-Y6QtCsyNP=luyT2wW_M}N_?wqPE6EiL4B&nH6ukmc}DVGJpSIm#a|q) z79Zn^D4V3>IMdOjKm4bu=I+CZ7@?s>mA8pemsx%txe1P*xmnRF4bgVE>-|thc8~F+%kY20FkDG*exgNtTy@%pS7hMR_40)gc;tS)!%{N1+WG+Ec%6@CKaM-U6B zRW#8zNl-S%0~E+4IWciN&GY?DN~L0_Gt}}z0I8xC@w|=UZt-{KF%%&R1N>TeCokMf zc^x+Ht=rXxmBBpn(p!(&n*InDZm=l_o>Ebl8DxL}(y3dk6UXxt=N5Mc=lUSMK`QSS z6wX!M5zo(A+18l-QzZBEAp} znO!hJ!5g7m4OCbVz$`B0FAo1{H2p^%yG{xbH<5f?s#}lwz=QDWV|_c+ti;mjm6GfV z^$NB5q7Qn+ra~r*V)BsM)!HwSsiQ?wu7y+?LiD&}EbAGJwFWXia)1m83(_!6`L=Hn z=2&an#^!Un9tK(D?)@!i1_d%!LDHRBJ+H2=>NS6~+E+^A8#dG&oTbdl#H(3=P`%c& zOi=mi8RvAiqpXidtR^#iyGj=8^)p(HUrxj$zg^f_?kAd$xIPizz$-tN&5PO0!p8hm z&fRh~I1(2FpAsBS4|m%XPL{V6JAuTHV^Orqb3N8i%r(3z-z|-n_{b}H*sh-m@j&Yl zf~(idhk?C6*Z#wmihxf=Z*6y|BtxraqPg9+-Q@^`u8)4>EssDyQl&c~yY}Rl8 zDCLg1YOk)yQ-`h|2l$q?-E4LayOwyBeL2|lpJh2$Nu4zb2@)CLXq`(%CRKo$B*ax9BW}1~D9)#nDeg5;cfd z$Tlio$51EJ`iwoKFNjx%7arpfb{DR&ws1n+Q zRn|f0s@?&+)|kS%VVC#fdBROhwbm|sRu^K#i|cai{ZdTdmuR+4_%+wExTE*Kk5>El z!J@KcCy=`!Us}Ot#yfwG9gV99mP5etZ0~Kg^7+yc4MX@P@-DEKINgxMul%&=raj?; z^wQq!FOCl4+VLXhdApDLU1V>_09V-i$tw-t#qR5HAAyR$I3;Sgg4dm)i_JxbEw@r@ zFWa)VeTsfMn%+u_r~UC8zcVkU@-=C5G}Pc)@M8ch1V=3*2u@ZI8WIa;i+jw|)rB7# zp&QC=u`qf$2(`__J39;0=W(g=uiedB?g|{dGb1_!qLk319fr)ocJN$U>YbS*_$)%n zX*04W()ZJ~#F!4VJz*L~NB7&5#~%W>9iw411N4Rd@w+vANMdnxzX*|D6s+&QqpjV6 z6&dN#Z)<9M8oSMDSNGM@1kmPcTz`nOwk=DZ+xU#w&1wDol=pHXtngug{5q~KJ+LV( zCU^IyXL7yXU)mt4YIR_c3bc*0L{YSV>Sg|4EAb@1%)51=Y=~yyOtMd1omXA&c3aJIShmW~? z_R}}!u=Z#>H3?dm**1?TUU@qYB;ciBf@)uj4wwuN5V+AS2S^-{L5)^|;f;s7)#ui~ zH#%#kb&@b?!!>qCMh@Y<_YZ8w#J#VS1Xji3$>rK&^(zOp36Cw& zGM$=@1PaZ`Y1e}{%AldT)r<(1Ha(^s?j^Tq`tEzc!M8mXA08fK#n_r4d~|s&J=bL6 z&ZxYmlXn-IljAUWU4?;brx@c!T3{lvzJ%1XA~x+@fKZchaxoelu#@?^6!~i&09?k) zq3&EPnTC^M1t1!Xun7Htwe9+G^61ut2Pt?gp20yD8Uogz;)}UC;r&~dJL18Iqwybb z_5BESlzOz4;tzSM?(o{?vCJ_`y@X+@tXHod6@wDf?WzGiP!SHI;H=g(?|!aFW0v1j zw9Xf5mH_A≀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 F{uj$LE@1!w diff --git a/docs/index.md b/docs/index.md index 6558be1b..c9e763bd 100644 --- a/docs/index.md +++ b/docs/index.md @@ -5,31 +5,31 @@ title: Home # Welcome to the TagStudio Documentation! !!! warning - This documentation is still a work in progress, and is intended to aide with deconstructing and understanding of the core mechanics of TagStudio and how it operates. +This documentation is still a work in progress, and is intended to aide with deconstructing and understanding of the core mechanics of TagStudio and how it operates. ![TagStudio Alpha](assets/github_header.png) -TagStudio is a photo & file organization application with an underlying system that focuses on giving freedom and flexibility to the user. No proprietary programs or formats, no sea of sidecar files, and no complete upheaval of your filesystem structure. +TagStudio is a photo & file organization application with an underlying tag-based system that focuses on giving freedom and flexibility to the user. No proprietary programs or formats, no sea of sidecar files, and no complete upheaval of your filesystem structure. -

    +
    ![TagStudio screenshot](assets/screenshot.jpg) -
    TagStudio Alpha v9.1.0 running on Windows 10
    +
    TagStudio Alpha v9.4.2 running on Windows 10
    ## Goals -- To achieve a portable, privacy-oriented, open, extensible, and feature-rich system of organizing and rediscovering files. -- To provide powerful methods for organization, notably the concept of tag composition, or “taggable tags”. -- To create an implementation of such a system that is resilient against a user’s actions outside the program (modifying, moving, or renaming files) while also not burdening the user with mandatory sidecar files or otherwise requiring them to change their existing file structures and workflows. -- To support a wide range of users spanning across different platforms, multi-user setups, and those with large (several terabyte) libraries. -- To make the darn thing look like nice, too. It’s 2024, not 1994. +- To achieve a portable, private, extensible, open-format, and feature-rich system of organizing and rediscovering files. +- To provide powerful methods for organization, notably the concept of tag inheritance, or “taggable tags” _(and in the near future, the combination of composition-based tags)._ +- To create an implementation of such a system that is resilient against a user’s actions outside the program (modifying, moving, or renaming files) while also not burdening the user with mandatory sidecar files or requiring them to change their existing file structures and workflows. +- To support a wide range of users spanning across different platforms, multi-user setups, and those with large (several terabyte) libraries. +- To make the darn thing look like nice, too. It’s 2024, not 1994. ## Priorities -1. **The concept.** Even if TagStudio as a project or application fails, I’d hope that the idea lives on in a superior project. The [goals](#goals) outlined above don’t reference TagStudio once - _TagStudio_ is what references the _goals._ +1. **The concept.** Even if TagStudio as an application fails, I’d hope that the idea lives on in a superior project. The [goals](#goals) outlined above don’t reference TagStudio once - _TagStudio_ is what references the _goals._ 2. **The system.** Frontends and implementations can vary, as they should. The core underlying metadata management system is what should be interoperable between different frontends, programs, and operating systems. A standard implementation for this should settle as development continues. This opens up the doors for improved and varied clients, integration with third-party applications, and more. 3. **The application.** If nothing else, TagStudio the application serves as the first (and so far only) implementation for this system of metadata management. This has the responsibility of doing the idea justice and showing just what’s possible when it comes to user file management. -4. (The name.) I think it’s fine for an app or client, but it doesn’t really make sense for a system or standard. I suppose this will evolve with time. +4. (The name.) I think it’s fine for an app or client, but it doesn’t really make sense for a system or standard. I suppose this will evolve with time... ## Feature Roadmap @@ -37,11 +37,32 @@ The [Feature Roadmap](updates/roadmap.md) lists all of the planned core features ## Current Features -- Create libraries/vaults centered around a system directory. Libraries contain a series of entries: the representations of your files combined with metadata fields. Each entry represents a file in your library’s directory, and is linked to its location. -- Add metadata to your library entries, including: - - Name, Author, Artist (Single-Line Text Fields) - - Description, Notes (Multiline Text Fields) - - Tags, Meta Tags, Content Tags (Tag Boxes) -- Create rich tags composed of a name, a list of aliases, and a list of “subtags” - being tags in which these tags inherit values from. -- Search for entries based on tags, ~~metadata~~ (TBA), or filenames/filetypes (using `filename: `) -- Special search conditions for entries that are: `untagged`/`no tags` and `empty`/`no fields`. +### Libraries + +- Create libraries/vaults centered around a system directory. Libraries contain a series of entries: the representations of your files combined with metadata fields. Each entry represents a file in your library’s directory, and is linked to its location. +- Address moved, deleted, or otherwise "unlinked" files by using the "Fix Unlinked Entries" option in the Tools menu. + +### Metadata + Tagging + +- Add metadata to your library entries, including: + - Name, Author, Artist (Single-Line Text Fields) + - Description, Notes (Multiline Text Fields) + - Tags, Meta Tags, Content Tags (Tag Boxes) +- Create rich tags composed of a name, a list of aliases, and a list of “parent tags” - being tags in which these tags inherit values from. +- Copy and paste tags and fields across file entries +- Generate tags from your existing folder structure with the "Folders to Tags" macro (NOTE: these tags do NOT sync with folders after they are created) + +### Search + +- Search for entries based on tags, ~~metadata~~ (TBA), or filenames/filetypes (using `filename: `). +- Special search conditions for entries that are: `untagged` and `empty`. + +### File Entries + +- All\* file types are supported in TagStudio libraries - just not all have dedicated thumbnail support. +- Preview most image file types, animated GIFs, videos, plain text documents, audio files\*\*, Blender projects, and more! +- Open files or file locations by right-clicking on thumbnails and previews and selecting the respective context menu options. You can also click on the preview panel image to open the file, and click the file path label to open its location. +- Delete files from both your library and drive by right-clicking the thumbnail(s) and selecting the "Move to Trash"/"Move to Recycle Bin" option. + +> - _\* Weird files with no extension or files such as ".\_DS_Store" currently have limited support._ +> - _\*\* Audio playback coming in v9.5_ From 7d7c8b234838b4b740cedd485a0d1f7560a74e77 Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Tue, 3 Dec 2024 13:04:02 -0800 Subject: [PATCH 60/82] docs: adjust formatting --- README.md | 13 +++++++------ docs/index.md | 7 ++++--- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index e865bae7..2317af95 100644 --- a/README.md +++ b/README.md @@ -29,9 +29,9 @@ TagStudio is a photo & file organization application with an underlying tag-base

    TagStudio Screenshot

    -
    -
    TagStudio Alpha v9.4.2 running on Windows 10.
    -
    +

    + TagStudio Alpha v9.4.2 running on Windows 10. +

    ## Contents @@ -93,8 +93,9 @@ Translation hosting generously provided by [Weblate](https://weblate.org/en/). C - Open files or file locations by right-clicking on thumbnails and previews and selecting the respective context menu options. You can also click on the preview panel image to open the file, and click the file path label to open its location. - Delete files from both your library and drive by right-clicking the thumbnail(s) and selecting the "Move to Trash"/"Move to Recycle Bin" option. -> - _\* Weird files with no extension or files such as ".\_DS_Store" currently have limited support._ -> - _\*\* Audio playback coming in v9.5_ +> _\* Weird files with no extension or files such as ".\_DS_Store" currently have limited support._ +> +> _\*\* Audio playback coming in v9.5_ > [!NOTE] > For more information on the project itself, please see the [FAQ](#faq) section as well as the [documentation](https://docs.tagstud.io/). @@ -118,7 +119,7 @@ Arguments available to pass to the program, either via the command line or a sho > `--open ` / `-o ` > Path to a TagStudio Library folder to open on start. - +> > `--config-file ` / `-c ` > Path to the TagStudio config file to load. diff --git a/docs/index.md b/docs/index.md index c9e763bd..907f74ec 100644 --- a/docs/index.md +++ b/docs/index.md @@ -5,7 +5,7 @@ title: Home # Welcome to the TagStudio Documentation! !!! warning -This documentation is still a work in progress, and is intended to aide with deconstructing and understanding of the core mechanics of TagStudio and how it operates. + This documentation is still a work in progress, and is intended to aide with deconstructing and understanding of the core mechanics of TagStudio and how it operates. ![TagStudio Alpha](assets/github_header.png) @@ -64,5 +64,6 @@ The [Feature Roadmap](updates/roadmap.md) lists all of the planned core features - Open files or file locations by right-clicking on thumbnails and previews and selecting the respective context menu options. You can also click on the preview panel image to open the file, and click the file path label to open its location. - Delete files from both your library and drive by right-clicking the thumbnail(s) and selecting the "Move to Trash"/"Move to Recycle Bin" option. -> - _\* Weird files with no extension or files such as ".\_DS_Store" currently have limited support._ -> - _\*\* Audio playback coming in v9.5_ +> _\* Weird files with no extension or files such as ".\_DS_Store" currently have limited support._ +> +> _\*\* Audio playback coming in v9.5_ From 4c33901a471e39e9f4b41faf8b6b3a55a7989e76 Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Wed, 4 Dec 2024 11:16:47 -0800 Subject: [PATCH 61/82] chore: format with ruff --- tagstudio/src/core/library/alchemy/library.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tagstudio/src/core/library/alchemy/library.py b/tagstudio/src/core/library/alchemy/library.py index 16d5f9c3..d960afbd 100644 --- a/tagstudio/src/core/library/alchemy/library.py +++ b/tagstudio/src/core/library/alchemy/library.py @@ -2,11 +2,12 @@ import re import shutil import time import unicodedata +from collections.abc import Iterator from dataclasses import dataclass from datetime import UTC, datetime from os import makedirs from pathlib import Path -from typing import Any, Iterator, Type +from typing import Any from uuid import uuid4 import structlog @@ -687,7 +688,7 @@ class Library: def update_field_position( self, - field_class: Type[BaseField], + field_class: type[BaseField], field_type: str, entry_ids: list[int] | int, ): From b72a2f233141db4db6aa6be8796b626ebd3f0756 Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Wed, 4 Dec 2024 11:23:42 -0800 Subject: [PATCH 62/82] add ".DS_Store" to GLOBAL_IGNORE_SET --- tagstudio/src/core/utils/refresh_dir.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tagstudio/src/core/utils/refresh_dir.py b/tagstudio/src/core/utils/refresh_dir.py index 11980329..6bd5ba00 100644 --- a/tagstudio/src/core/utils/refresh_dir.py +++ b/tagstudio/src/core/utils/refresh_dir.py @@ -19,6 +19,7 @@ GLOBAL_IGNORE_SET: set[str] = set( ".fseventsd", ".Spotlight-V100", "System Volume Information", + ".DS_Store", ] ) From bea691381476f6b53d43852e180f92a1445c3588 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= <88423841+Roc25@users.noreply.github.com> Date: Thu, 5 Dec 2024 08:53:44 +0300 Subject: [PATCH 63/82] fix: add check to see if library is loaded in filter_items (#547) * Added a check to see if the library is loaded in filter_items * Returned check to see if there is an engine --------- Co-authored-by: gred --- tagstudio/src/qt/ts_qt.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index c1e0b934..d1d09d43 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -1115,6 +1115,9 @@ class QtDriver(DriverMixin, QObject): self.item_thumbs[grid_idx].refresh_badge(entry) def filter_items(self, filter: FilterState | None = None) -> None: + if not self.lib.library_dir: + logger.info("Library not loaded") + return assert self.lib.engine if filter: From 3196678666b8541270872f566c2bb3da0dac4bcf Mon Sep 17 00:00:00 2001 From: Jann Stute <46534683+Computerdores@users.noreply.github.com> Date: Thu, 5 Dec 2024 09:43:39 +0100 Subject: [PATCH 64/82] fix: multiple macro errors (#612) * port fixes from json branch * fix: correctly pass grid_idx in autofill macro * fix(BUILD_URL macro): only add url if url was successfully built * fix(AUTOFILL macro): error when trying to add tag with name that already exists * fix: test was wrongly renaming sidecar file --- tagstudio/src/core/library/alchemy/library.py | 9 +++++++++ tagstudio/src/core/ts_core.py | 2 +- tagstudio/src/qt/ts_qt.py | 18 ++++++++++-------- tagstudio/tests/macros/test_sidecar.py | 2 +- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/tagstudio/src/core/library/alchemy/library.py b/tagstudio/src/core/library/alchemy/library.py index d960afbd..a5398a6d 100644 --- a/tagstudio/src/core/library/alchemy/library.py +++ b/tagstudio/src/core/library/alchemy/library.py @@ -998,6 +998,15 @@ class Library: return tag + def get_tag_by_name(self, tag_name: str) -> Tag | None: + with Session(self.engine) as session: + statement = ( + select(Tag) + .outerjoin(TagAlias) + .where(or_(Tag.name == tag_name, TagAlias.name == tag_name)) + ) + return session.scalar(statement) + def get_alias(self, tag_id: int, alias_id: int) -> TagAlias: with Session(self.engine) as session: alias_query = select(TagAlias).where(TagAlias.id == alias_id, TagAlias.tag_id == tag_id) diff --git a/tagstudio/src/core/ts_core.py b/tagstudio/src/core/ts_core.py index 9611397e..aaae942e 100644 --- a/tagstudio/src/core/ts_core.py +++ b/tagstudio/src/core/ts_core.py @@ -24,7 +24,7 @@ class TagStudioCore: Return a formatted object with notable values or an empty object if none is found. """ info = {} - _filepath = filepath.parent / (filepath.stem + ".json") + _filepath = filepath.parent / (filepath.name + ".json") # NOTE: This fixes an unknown (recent?) bug in Gallery-DL where Instagram sidecar # files may be downloaded with indices starting at 1 rather than 0, unlike the posts. diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index d1d09d43..c6ef2034 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -72,7 +72,7 @@ from src.core.library.alchemy.enums import ( SearchMode, ) from src.core.library.alchemy.fields import _FieldID -from src.core.library.alchemy.library import LibraryStatus +from src.core.library.alchemy.library import Entry, Library, LibraryStatus from src.core.media_types import MediaCategories from src.core.ts_core import TagStudioCore from src.core.utils.refresh_dir import RefreshDirTracker @@ -130,6 +130,7 @@ class QtDriver(DriverMixin, QObject): SIGTERM = Signal() preview_panel: PreviewPanel + lib: Library def __init__(self, backend, args): super().__init__() @@ -788,9 +789,9 @@ class QtDriver(DriverMixin, QObject): def run_macro(self, name: MacroID, grid_idx: int): """Run a specific Macro on an Entry given a Macro name.""" - entry = self.frame_content[grid_idx] - ful_path = self.lib.library_dir / entry.path - source = entry.path.parts[0] + entry: Entry = self.frame_content[grid_idx] + full_path = self.lib.library_dir / entry.path + source = "" if entry.path.parent == Path(".") else entry.path.parts[0].lower() logger.info( "running macro", @@ -804,10 +805,10 @@ class QtDriver(DriverMixin, QObject): for macro_id in MacroID: if macro_id == MacroID.AUTOFILL: continue - self.run_macro(macro_id, entry.id) + self.run_macro(macro_id, grid_idx) elif name == MacroID.SIDECAR: - parsed_items = TagStudioCore.get_gdl_sidecar(ful_path, source) + parsed_items = TagStudioCore.get_gdl_sidecar(full_path, source) for field_id, value in parsed_items.items(): if isinstance(value, list) and len(value) > 0 and isinstance(value[0], str): value = self.lib.tag_from_strings(value) @@ -818,8 +819,9 @@ class QtDriver(DriverMixin, QObject): ) elif name == MacroID.BUILD_URL: - url = TagStudioCore.build_url(entry.id, source) - self.lib.add_entry_field_type(entry.id, field_id=_FieldID.SOURCE, value=url) + url = TagStudioCore.build_url(entry, source) + if url is not None: + self.lib.add_entry_field_type(entry.id, field_id=_FieldID.SOURCE, value=url) elif name == MacroID.MATCH: TagStudioCore.match_conditions(self.lib, entry.id) elif name == MacroID.CLEAN_URL: diff --git a/tagstudio/tests/macros/test_sidecar.py b/tagstudio/tests/macros/test_sidecar.py index 700169f4..2bea7ba8 100644 --- a/tagstudio/tests/macros/test_sidecar.py +++ b/tagstudio/tests/macros/test_sidecar.py @@ -12,7 +12,7 @@ def test_sidecar_macro(qt_driver, library, cwd, entry_full): entry_full.path = Path("newgrounds/foo.txt") fixture = cwd / "fixtures/sidecar_newgrounds.json" - dst = library.library_dir / "newgrounds" / (entry_full.path.stem + ".json") + dst = library.library_dir / "newgrounds" / (entry_full.path.name + ".json") dst.parent.mkdir() shutil.copy(fixture, dst) From 056e6004665be3932b4d50cf8a6ff62d0fbb2f98 Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Thu, 5 Dec 2024 01:30:18 -0800 Subject: [PATCH 65/82] bump numpy to version 2.1.0 --- requirements.txt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/requirements.txt b/requirements.txt index cd0ddcb4..c2ca5132 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,9 +2,8 @@ chardet==5.2.0 ffmpeg-python==0.2.0 humanfriendly==10.0 mutagen==1.47.0 -numpy==1.26.4 -numpy==1.26.4 -opencv_python>=4.8.0.74,<=4.9.0.80 +numpy==2.1.0 +opencv_python==4.10.0.84 pillow-heif==0.16.0 pillow-jxl-plugin==1.3.0 Pillow==10.3.0 @@ -12,7 +11,7 @@ pydub==0.25.1 PySide6_Addons==6.7.1 PySide6_Essentials==6.7.1 PySide6==6.7.1 -rawpy==0.21.0 +rawpy==0.22.0 SQLAlchemy==2.0.34 structlog==24.4.0 typing_extensions>=3.10.0.0,<=4.11.0 From a535ed12b01ce46f7efc6c5c75e641e0a105ca97 Mon Sep 17 00:00:00 2001 From: Jann Stute <46534683+Computerdores@users.noreply.github.com> Date: Sat, 7 Dec 2024 00:43:08 +0100 Subject: [PATCH 66/82] feat: implement query language (#606) * add files * fix: term was parsing ANDList instead of ORList * make mypy happy * ruff format * add missing todo * add more constraint types * add parent property to AST * add BaseVisitor class * make mypy happy * add __init__.py * Revert "make mypy happy" This reverts commit 926d0dd2e79d06203e84e2f83c06c7fe5b33de23. * refactoring and fixes * rudimentary search field integration * fix: check for None properly * fix: Entries without Tags are now searchable * make mypy happy * Revert "fix: Entries without Tags are now searchable" This reverts commit 19b40af7480b0c068b81b642b51536a9ec96d030. * fix: changed joins to outerjoins and added missing outerjoin * use query lang instead of tag_id FIlterState * add todos * fix: remove uncecessary line that broke search when searching for exact name * fix tag search * refactoring * fix: path now uses GLOB operator for proper GLOBs * refactoring: remove FilterState.id and implement Library.get_entry_full as replacement * fix: use default value notation instead of if None statement in __post_init__ * remove obsolete Search Mode UI and related code * ruff fixes * remove obsolete tests * fix: item_thumb didn't query entries correctly * fix: search_library now correctly returns the number of *unique* entries * make mypy happy * implement NOT * remove obsolete filename search * remove summary as it is not applicable anymore * finish refactoring of FilterState * implement special:untagged * fix: make mypy happy * Revert changes to search_tags in favor of changes from #604 * fix: also port test changes * fix: remove unneccessary import * fix: remove unused dataclass * fix: AND now works correctly with tags * simplify structure of parsed AST * add performance logging * perf: Improve performance of search by reducing number of required joins from 4 to 1 * perf: double NOT is now optimized out of the AST * fix: bug where pages would show less than the configured number of entries * Revert "add performance logging" This reverts commit c3c7d7546d285c6dad51872cbf80bc6070262570. * fix: tag_id search was broken * somewhat adapt the existing autocompletion to this PR * perf: Use Relational Division Queries to improve Query Execution Time * fix: raise Exception so as to not fail silently * fix: Parser bug broke parentheses * little bit of clean up * remove unnecessary comment * add library for testing search * feat: add basic tests * fix: and queries containing just one tag were broken * chore: remove debug code * feat: more tests * refactor: more consistent name for variable Co-authored-by: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> * fix: ruff check complaint over double import --------- Co-authored-by: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> --- tagstudio/src/core/library/alchemy/enums.py | 110 +++++-------- tagstudio/src/core/library/alchemy/library.py | 89 ++++------- .../src/core/library/alchemy/visitors.py | 125 +++++++++++++++ tagstudio/src/core/query_lang/__init__.py | 11 ++ tagstudio/src/core/query_lang/ast.py | 126 +++++++++++++++ tagstudio/src/core/query_lang/parser.py | 120 ++++++++++++++ tagstudio/src/core/query_lang/tokenizer.py | 147 ++++++++++++++++++ tagstudio/src/core/query_lang/util.py | 15 ++ tagstudio/src/core/utils/dupe_files.py | 2 +- tagstudio/src/qt/main_window.py | 11 -- tagstudio/src/qt/ts_qt.py | 82 +++++----- tagstudio/src/qt/widgets/item_thumb.py | 5 +- tagstudio/src/qt/widgets/preview_panel.py | 11 +- tagstudio/src/qt/widgets/tag_box.py | 2 +- tagstudio/tests/conftest.py | 9 +- .../search_library/.TagStudio/ts_library.json | 1 + .../.TagStudio/ts_library.sqlite | Bin 0 -> 86016 bytes .../comp colors shapes/r_circle_b_square.png | Bin 0 -> 3617 bytes .../comp colors shapes/r_circle_g_square.png | Bin 0 -> 3737 bytes .../comp colors shapes/r_circle_o_square.png | Bin 0 -> 3672 bytes .../comp colors shapes/r_circle_r_square.png | Bin 0 -> 3266 bytes .../comp colors shapes/r_circle_y_square.png | Bin 0 -> 3624 bytes .../inherit colors shapes/blue.jpg | Bin 0 -> 6073 bytes .../inherit colors shapes/blue_circle.jpg | Bin 0 -> 8601 bytes .../inherit colors shapes/blue_ellipse.png | Bin 0 -> 5570 bytes .../inherit colors shapes/blue_square.jpg | Bin 0 -> 8314 bytes .../inherit colors shapes/circle.png | Bin 0 -> 4911 bytes .../inherit colors shapes/ellipse.png | Bin 0 -> 5440 bytes .../inherit colors shapes/green.png | Bin 0 -> 8333 bytes .../inherit colors shapes/green_circle.png | Bin 0 -> 15946 bytes .../inherit colors shapes/green_ellipse.png | Bin 0 -> 15794 bytes .../inherit colors shapes/green_square.png | Bin 0 -> 8559 bytes .../inherit colors shapes/orange.png | Bin 0 -> 9149 bytes .../inherit colors shapes/orange_circle.png | Bin 0 -> 16167 bytes .../inherit colors shapes/orange_ellipse.png | Bin 0 -> 16250 bytes .../inherit colors shapes/orange_square.png | Bin 0 -> 9382 bytes .../inherit colors shapes/red.jpg | Bin 0 -> 9889 bytes .../inherit colors shapes/red_circle.jpg | Bin 0 -> 8295 bytes .../inherit colors shapes/red_ellipse.png | Bin 0 -> 5956 bytes .../inherit colors shapes/red_square.jpg | Bin 0 -> 8016 bytes .../inherit colors shapes/shape.png | Bin 0 -> 3571 bytes .../inherit colors shapes/square.png | Bin 0 -> 4084 bytes .../inherit colors shapes/yellow.png | Bin 0 -> 3677 bytes .../inherit colors shapes/yellow_circle.png | Bin 0 -> 6656 bytes .../inherit colors shapes/yellow_ellipse.png | Bin 0 -> 6310 bytes .../inherit colors shapes/yellow_square.png | Bin 0 -> 3878 bytes tagstudio/tests/macros/test_missing_files.py | 2 +- tagstudio/tests/qt/test_qt_driver.py | 4 +- tagstudio/tests/test_filter_state.py | 36 ----- tagstudio/tests/test_library.py | 76 ++++----- tagstudio/tests/test_search.py | 124 +++++++++++++++ 51 files changed, 831 insertions(+), 277 deletions(-) create mode 100644 tagstudio/src/core/library/alchemy/visitors.py create mode 100644 tagstudio/src/core/query_lang/__init__.py create mode 100644 tagstudio/src/core/query_lang/ast.py create mode 100644 tagstudio/src/core/query_lang/parser.py create mode 100644 tagstudio/src/core/query_lang/tokenizer.py create mode 100644 tagstudio/src/core/query_lang/util.py create mode 100644 tagstudio/tests/fixtures/search_library/.TagStudio/ts_library.json create mode 100644 tagstudio/tests/fixtures/search_library/.TagStudio/ts_library.sqlite create mode 100644 tagstudio/tests/fixtures/search_library/comp colors shapes/r_circle_b_square.png create mode 100644 tagstudio/tests/fixtures/search_library/comp colors shapes/r_circle_g_square.png create mode 100644 tagstudio/tests/fixtures/search_library/comp colors shapes/r_circle_o_square.png create mode 100644 tagstudio/tests/fixtures/search_library/comp colors shapes/r_circle_r_square.png create mode 100644 tagstudio/tests/fixtures/search_library/comp colors shapes/r_circle_y_square.png create mode 100644 tagstudio/tests/fixtures/search_library/inherit colors shapes/blue.jpg create mode 100644 tagstudio/tests/fixtures/search_library/inherit colors shapes/blue_circle.jpg create mode 100644 tagstudio/tests/fixtures/search_library/inherit colors shapes/blue_ellipse.png create mode 100644 tagstudio/tests/fixtures/search_library/inherit colors shapes/blue_square.jpg create mode 100644 tagstudio/tests/fixtures/search_library/inherit colors shapes/circle.png create mode 100644 tagstudio/tests/fixtures/search_library/inherit colors shapes/ellipse.png create mode 100644 tagstudio/tests/fixtures/search_library/inherit colors shapes/green.png create mode 100644 tagstudio/tests/fixtures/search_library/inherit colors shapes/green_circle.png create mode 100644 tagstudio/tests/fixtures/search_library/inherit colors shapes/green_ellipse.png create mode 100644 tagstudio/tests/fixtures/search_library/inherit colors shapes/green_square.png create mode 100644 tagstudio/tests/fixtures/search_library/inherit colors shapes/orange.png create mode 100644 tagstudio/tests/fixtures/search_library/inherit colors shapes/orange_circle.png create mode 100644 tagstudio/tests/fixtures/search_library/inherit colors shapes/orange_ellipse.png create mode 100644 tagstudio/tests/fixtures/search_library/inherit colors shapes/orange_square.png create mode 100644 tagstudio/tests/fixtures/search_library/inherit colors shapes/red.jpg create mode 100644 tagstudio/tests/fixtures/search_library/inherit colors shapes/red_circle.jpg create mode 100644 tagstudio/tests/fixtures/search_library/inherit colors shapes/red_ellipse.png create mode 100644 tagstudio/tests/fixtures/search_library/inherit colors shapes/red_square.jpg create mode 100644 tagstudio/tests/fixtures/search_library/inherit colors shapes/shape.png create mode 100644 tagstudio/tests/fixtures/search_library/inherit colors shapes/square.png create mode 100644 tagstudio/tests/fixtures/search_library/inherit colors shapes/yellow.png create mode 100644 tagstudio/tests/fixtures/search_library/inherit colors shapes/yellow_circle.png create mode 100644 tagstudio/tests/fixtures/search_library/inherit colors shapes/yellow_ellipse.png create mode 100644 tagstudio/tests/fixtures/search_library/inherit colors shapes/yellow_square.png delete mode 100644 tagstudio/tests/test_filter_state.py create mode 100644 tagstudio/tests/test_search.py diff --git a/tagstudio/src/core/library/alchemy/enums.py b/tagstudio/src/core/library/alchemy/enums.py index 7c70f92e..0036fbbd 100644 --- a/tagstudio/src/core/library/alchemy/enums.py +++ b/tagstudio/src/core/library/alchemy/enums.py @@ -1,7 +1,10 @@ import enum -from dataclasses import dataclass +from dataclasses import dataclass, replace from pathlib import Path +from src.core.query_lang import AST as Query # noqa: N811 +from src.core.query_lang import Constraint, ConstraintType, Parser + class TagColor(enum.IntEnum): DEFAULT = 1 @@ -50,13 +53,6 @@ class TagColor(enum.IntEnum): return TagColor.DEFAULT -class SearchMode(enum.IntEnum): - """Operational modes for item searching.""" - - AND = 0 - OR = 1 - - class ItemType(enum.Enum): ENTRY = 0 COLLATION = 1 @@ -68,71 +64,12 @@ class FilterState: """Represent a state of the Library grid view.""" # these should remain - page_index: int | None = None - page_size: int | None = None - search_mode: SearchMode = SearchMode.AND # TODO - actually implement this + page_index: int | None = 0 + page_size: int | None = 500 # these should be erased on update - # tag name - tag: str | None = None - # tag ID - tag_id: int | None = None - - # entry id - id: int | None = None - # whole path - path: Path | str | None = None - # file name - name: str | None = None - # file type - filetype: str | None = None - mediatype: str | None = None - - # a generic query to be parsed - query: str | None = None - - def __post_init__(self): - # strip values automatically - if query := (self.query and self.query.strip()): - # parse the value - if ":" in query: - kind, _, value = query.partition(":") - value = value.replace('"', "") - else: - # default to tag search - kind, value = "tag", query - - if kind == "tag_id": - self.tag_id = int(value) - elif kind == "tag": - self.tag = value - elif kind == "path": - self.path = value - elif kind == "name": - self.name = value - elif kind == "id": - self.id = int(self.id) if str(self.id).isnumeric() else self.id - elif kind == "filetype": - self.filetype = value - elif kind == "mediatype": - self.mediatype = value - - else: - self.tag = self.tag and self.tag.strip() - self.tag_id = int(self.tag_id) if str(self.tag_id).isnumeric() else self.tag_id - self.path = self.path and str(self.path).strip() - self.name = self.name and self.name.strip() - self.id = int(self.id) if str(self.id).isnumeric() else self.id - - if self.page_index is None: - self.page_index = 0 - if self.page_size is None: - self.page_size = 500 - - @property - def summary(self): - """Show query summary.""" - return self.query or self.tag or self.name or self.tag_id or self.path or self.id + # Abstract Syntax Tree Of the current Search Query + ast: Query = None @property def limit(self): @@ -142,6 +79,37 @@ class FilterState: def offset(self): return self.page_size * self.page_index + @classmethod + def show_all(cls) -> "FilterState": + return FilterState() + + @classmethod + def from_search_query(cls, search_query: str) -> "FilterState": + return cls(ast=Parser(search_query).parse()) + + @classmethod + def from_tag_id(cls, tag_id: int | str) -> "FilterState": + return cls(ast=Constraint(ConstraintType.TagID, str(tag_id), [])) + + @classmethod + def from_path(cls, path: Path | str) -> "FilterState": + return cls(ast=Constraint(ConstraintType.Path, str(path).strip(), [])) + + @classmethod + def from_mediatype(cls, mediatype: str) -> "FilterState": + return cls(ast=Constraint(ConstraintType.MediaType, mediatype, [])) + + @classmethod + def from_filetype(cls, filetype: str) -> "FilterState": + return cls(ast=Constraint(ConstraintType.FileType, filetype, [])) + + @classmethod + def from_tag_name(cls, tag_name: str) -> "FilterState": + return cls(ast=Constraint(ConstraintType.Tag, tag_name, [])) + + def with_page_size(self, page_size: int) -> "FilterState": + return replace(self, page_size=page_size) + class FieldTypeEnum(enum.Enum): TEXT_LINE = "Text Line" diff --git a/tagstudio/src/core/library/alchemy/library.py b/tagstudio/src/core/library/alchemy/library.py index a5398a6d..56b114ff 100644 --- a/tagstudio/src/core/library/alchemy/library.py +++ b/tagstudio/src/core/library/alchemy/library.py @@ -28,7 +28,6 @@ from sqlalchemy import ( from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import ( Session, - aliased, contains_eager, make_transient, selectinload, @@ -42,7 +41,6 @@ from ...constants import ( TS_FOLDER_NAME, ) from ...enums import LibraryPrefs -from ...media_types import MediaCategories from .db import make_tables from .enums import FieldTypeEnum, FilterState, TagColor from .fields import ( @@ -54,6 +52,7 @@ from .fields import ( ) from .joins import TagField, TagSubtag from .models import Entry, Folder, Preferences, Tag, TagAlias, ValueType +from .visitors import SQLBoolExpressionBuilder logger = structlog.get_logger(__name__) @@ -402,6 +401,29 @@ class Library: make_transient(entry) return entry + def get_entry_full(self, entry_id: int) -> Entry | None: + """Load entry an join with all joins and all tags.""" + with Session(self.engine) as session: + statement = select(Entry).where(Entry.id == entry_id) + statement = ( + statement.outerjoin(Entry.text_fields) + .outerjoin(Entry.datetime_fields) + .outerjoin(Entry.tag_box_fields) + ) + statement = statement.options( + selectinload(Entry.text_fields), + selectinload(Entry.datetime_fields), + selectinload(Entry.tag_box_fields) + .joinedload(TagBoxField.tags) + .options(selectinload(Tag.aliases), selectinload(Tag.subtags)), + ) + entry = session.scalar(statement) + if not entry: + return None + session.expunge(entry) + make_transient(entry) + return entry + @property def entries_count(self) -> int: with Session(self.engine) as session: @@ -518,63 +540,18 @@ class Library: with Session(self.engine, expire_on_commit=False) as session: statement = select(Entry) - if search.tag: - SubtagAlias = aliased(Tag) # noqa: N806 - statement = ( - statement.join(Entry.tag_box_fields) - .join(TagBoxField.tags) - .outerjoin(Tag.aliases) - .outerjoin(SubtagAlias, Tag.subtags) - .where( - or_( - Tag.name.ilike(search.tag), - Tag.shorthand.ilike(search.tag), - TagAlias.name.ilike(search.tag), - SubtagAlias.name.ilike(search.tag), - ) - ) - ) - elif search.tag_id: - statement = ( - statement.join(Entry.tag_box_fields) - .join(TagBoxField.tags) - .where(Tag.id == search.tag_id) - ) - - elif search.id: - statement = statement.where(Entry.id == search.id) - elif search.name: - statement = select(Entry).where( - and_( - Entry.path.ilike(f"%{search.name}%"), - # dont match directory name (ie. has following slash) - ~Entry.path.ilike(f"%{search.name}%/%"), - ) - ) - elif search.path: - search_str = str(search.path).replace("*", "%") - statement = statement.where(Entry.path.ilike(search_str)) - elif search.filetype: - statement = statement.where(Entry.suffix.ilike(f"{search.filetype}")) - elif search.mediatype: - extensions: set[str] = set[str]() - for media_cat in MediaCategories.ALL_CATEGORIES: - if search.mediatype == media_cat.name: - extensions = extensions | media_cat.extensions - break - # just need to map it to search db - suffixes do not have '.' - statement = statement.where( - Entry.suffix.in_(map(lambda x: x.replace(".", ""), extensions)) + if search.ast: + statement = statement.outerjoin(Entry.tag_box_fields).where( + SQLBoolExpressionBuilder(self).visit(search.ast) ) extensions = self.prefs(LibraryPrefs.EXTENSION_LIST) is_exclude_list = self.prefs(LibraryPrefs.IS_EXCLUDE_LIST) - if not search.id: # if `id` is set, we don't need to filter by extensions - if extensions and is_exclude_list: - statement = statement.where(Entry.suffix.notin_(extensions)) - elif extensions: - statement = statement.where(Entry.suffix.in_(extensions)) + if extensions and is_exclude_list: + statement = statement.where(Entry.suffix.notin_(extensions)) + elif extensions: + statement = statement.where(Entry.suffix.in_(extensions)) statement = statement.options( selectinload(Entry.text_fields), @@ -584,6 +561,8 @@ class Library: .options(selectinload(Tag.aliases), selectinload(Tag.subtags)), ) + statement = statement.distinct(Entry.id) + query_count = select(func.count()).select_from(statement.alias("entries")) count_all: int = session.execute(query_count).scalar() @@ -597,7 +576,7 @@ class Library: res = SearchResult( total_count=count_all, - items=list(session.scalars(statement).unique()), + items=list(session.scalars(statement)), ) session.expunge_all() diff --git a/tagstudio/src/core/library/alchemy/visitors.py b/tagstudio/src/core/library/alchemy/visitors.py new file mode 100644 index 00000000..6f73a45a --- /dev/null +++ b/tagstudio/src/core/library/alchemy/visitors.py @@ -0,0 +1,125 @@ +from typing import TYPE_CHECKING + +from sqlalchemy import and_, distinct, func, or_, select +from sqlalchemy.orm import Session +from sqlalchemy.sql.expression import BinaryExpression, ColumnExpressionArgument +from src.core.media_types import MediaCategories +from src.core.query_lang import BaseVisitor +from src.core.query_lang.ast import AST, ANDList, Constraint, ConstraintType, Not, ORList, Property + +from .joins import TagField +from .models import Entry, Tag, TagAlias, TagBoxField + +# workaround to have autocompletion in the Editor +if TYPE_CHECKING: + from .library import Library +else: + Library = None # don't import .library because of circular imports + + +class SQLBoolExpressionBuilder(BaseVisitor[ColumnExpressionArgument]): + def __init__(self, lib: Library) -> None: + super().__init__() + self.lib = lib + + def visit_or_list(self, node: ORList) -> ColumnExpressionArgument: + return or_(*[self.visit(element) for element in node.elements]) + + def visit_and_list(self, node: ANDList) -> ColumnExpressionArgument: + tag_ids: list[int] = [] + bool_expressions: list[ColumnExpressionArgument] = [] + + # Search for TagID / unambigous Tag Constraints and store the respective tag ids seperately + for term in node.terms: + if isinstance(term, Constraint) and len(term.properties) == 0: + match term.type: + case ConstraintType.TagID: + tag_ids.append(int(term.value)) + continue + case ConstraintType.Tag: + if len(ids := self.__get_tag_ids(term.value)) == 1: + tag_ids.append(ids[0]) + continue + + bool_expressions.append(self.__entry_satisfies_ast(term)) + + # If there are at least two tag ids use a relational division query + # to efficiently check all of them + if len(tag_ids) > 1: + bool_expressions.append(self.__entry_has_all_tags(tag_ids)) + # If there is just one tag id, check the normal way + elif len(tag_ids) == 1: + bool_expressions.append( + self.__entry_satisfies_expression(TagField.tag_id == tag_ids[0]) + ) + + return and_(*bool_expressions) + + def visit_constraint(self, node: Constraint) -> ColumnExpressionArgument: + if len(node.properties) != 0: + raise NotImplementedError("Properties are not implemented yet") # TODO TSQLANG + + if node.type == ConstraintType.Tag: + return TagBoxField.tags.any(Tag.id.in_(self.__get_tag_ids(node.value))) + elif node.type == ConstraintType.TagID: + return TagBoxField.tags.any(Tag.id == int(node.value)) + elif node.type == ConstraintType.Path: + return Entry.path.op("GLOB")(node.value) + elif node.type == ConstraintType.MediaType: + extensions: set[str] = set[str]() + for media_cat in MediaCategories.ALL_CATEGORIES: + if node.value == media_cat.name: + extensions = extensions | media_cat.extensions + break + return Entry.suffix.in_(map(lambda x: x.replace(".", ""), extensions)) + elif node.type == ConstraintType.FileType: + return Entry.suffix.ilike(node.value) + elif node.type == ConstraintType.Special: # noqa: SIM102 unnecessary once there is a second special constraint + if node.value.lower() == "untagged": + return ~Entry.id.in_( + select(Entry.id).join(Entry.tag_box_fields).join(TagBoxField.tags) + ) + + # raise exception if Constraint stays unhandled + raise NotImplementedError("This type of constraint is not implemented yet") + + def visit_property(self, node: Property) -> None: + raise NotImplementedError("This should never be reached!") + + def visit_not(self, node: Not) -> ColumnExpressionArgument: + return ~self.__entry_satisfies_ast(node.child) + + def __get_tag_ids(self, tag_name: str) -> list[int]: + """Given a tag name find the ids of all tags that this name could refer to.""" + with Session(self.lib.engine, expire_on_commit=False) as session: + return list( + session.scalars( + select(Tag.id) + .where(or_(Tag.name.ilike(tag_name), Tag.shorthand.ilike(tag_name))) + .union(select(TagAlias.tag_id).where(TagAlias.name.ilike(tag_name))) + ) + ) + + def __entry_has_all_tags(self, tag_ids: list[int]) -> BinaryExpression[bool]: + """Returns Binary Expression that is true if the Entry has all provided tag ids.""" + # Relational Division Query + return Entry.id.in_( + select(Entry.id) + .outerjoin(TagBoxField) + .outerjoin(TagField) + .where(TagField.tag_id.in_(tag_ids)) + .group_by(Entry.id) + .having(func.count(distinct(TagField.tag_id)) == len(tag_ids)) + ) + + def __entry_satisfies_ast(self, partial_query: AST) -> BinaryExpression[bool]: + """Returns Binary Expression that is true if the Entry satisfies the partial query.""" + return self.__entry_satisfies_expression(self.visit(partial_query)) + + def __entry_satisfies_expression( + self, expr: ColumnExpressionArgument + ) -> BinaryExpression[bool]: + """Returns Binary Expression that is true if the Entry satisfies the column expression.""" + return Entry.id.in_( + select(Entry.id).outerjoin(Entry.tag_box_fields).outerjoin(TagField).where(expr) + ) diff --git a/tagstudio/src/core/query_lang/__init__.py b/tagstudio/src/core/query_lang/__init__.py new file mode 100644 index 00000000..9f1afca1 --- /dev/null +++ b/tagstudio/src/core/query_lang/__init__.py @@ -0,0 +1,11 @@ +from src.core.query_lang.ast import ( # noqa + AST, + ANDList, + BaseVisitor, + Constraint, + ConstraintType, + ORList, + Property, +) +from src.core.query_lang.parser import Parser # noqa +from src.core.query_lang.util import ParsingError # noqa diff --git a/tagstudio/src/core/query_lang/ast.py b/tagstudio/src/core/query_lang/ast.py new file mode 100644 index 00000000..9ebab448 --- /dev/null +++ b/tagstudio/src/core/query_lang/ast.py @@ -0,0 +1,126 @@ +from abc import ABC, abstractmethod +from enum import Enum +from typing import Generic, TypeVar + + +class ConstraintType(Enum): + Tag = 0 + TagID = 1 + MediaType = 2 + FileType = 3 + Path = 4 + Special = 5 + + @staticmethod + def from_string(text: str) -> "ConstraintType": + return { + "tag": ConstraintType.Tag, + "tag_id": ConstraintType.TagID, + "mediatype": ConstraintType.MediaType, + "filetype": ConstraintType.FileType, + "path": ConstraintType.Path, + "special": ConstraintType.Special, + }.get(text.lower(), None) + + +class AST: + parent: "AST" = None + + def __str__(self): + class_name = self.__class__.__name__ + fields = vars(self) # Get all instance variables as a dictionary + field_str = ", ".join(f"{key}={value}" for key, value in fields.items()) + return f"{class_name}({field_str})" + + def __repr__(self) -> str: + return self.__str__() + + +class ANDList(AST): + terms: list[AST] + + def __init__(self, terms: list[AST]) -> None: + super().__init__() + for term in terms: + term.parent = self + self.terms = terms + + +class ORList(AST): + elements: list[AST] + + def __init__(self, elements: list[AST]) -> None: + super().__init__() + for element in elements: + element.parent = self + self.elements = elements + + +class Constraint(AST): + type: ConstraintType + value: str + properties: list["Property"] + + def __init__(self, type: ConstraintType, value: str, properties: list["Property"]) -> None: + super().__init__() + for prop in properties: + prop.parent = self + self.type = type + self.value = value + self.properties = properties + + +class Property(AST): + key: str + value: str + + def __init__(self, key: str, value: str) -> None: + super().__init__() + self.key = key + self.value = value + + +class Not(AST): + child: AST + + def __init__(self, child: AST) -> None: + super().__init__() + self.child = child + + +T = TypeVar("T") + + +class BaseVisitor(ABC, Generic[T]): + def visit(self, node: AST) -> T: + if isinstance(node, ANDList): + return self.visit_and_list(node) + elif isinstance(node, ORList): + return self.visit_or_list(node) + elif isinstance(node, Constraint): + return self.visit_constraint(node) + elif isinstance(node, Property): + return self.visit_property(node) + elif isinstance(node, Not): + return self.visit_not(node) + raise Exception(f"Unknown Node Type of {node}") # pragma: nocover + + @abstractmethod + def visit_and_list(self, node: ANDList) -> T: + raise NotImplementedError() # pragma: nocover + + @abstractmethod + def visit_or_list(self, node: ORList) -> T: + raise NotImplementedError() # pragma: nocover + + @abstractmethod + def visit_constraint(self, node: Constraint) -> T: + raise NotImplementedError() # pragma: nocover + + @abstractmethod + def visit_property(self, node: Property) -> T: + raise NotImplementedError() # pragma: nocover + + @abstractmethod + def visit_not(self, node: Not) -> T: + raise NotImplementedError() # pragma: nocover diff --git a/tagstudio/src/core/query_lang/parser.py b/tagstudio/src/core/query_lang/parser.py new file mode 100644 index 00000000..7194faad --- /dev/null +++ b/tagstudio/src/core/query_lang/parser.py @@ -0,0 +1,120 @@ +from .ast import AST, ANDList, Constraint, Not, ORList, Property +from .tokenizer import ConstraintType, Token, Tokenizer, TokenType +from .util import ParsingError + + +class Parser: + text: str + tokenizer: Tokenizer + next_token: Token + + last_constraint_type: ConstraintType = ConstraintType.Tag + + def __init__(self, text: str) -> None: + self.text = text + self.tokenizer = Tokenizer(self.text) + self.next_token = self.tokenizer.get_next_token() + + def parse(self) -> AST: + if self.next_token.type == TokenType.EOF: + return ORList([]) + out = self.__or_list() + if self.next_token.type != TokenType.EOF: + raise ParsingError(self.next_token.start, self.next_token.end, "Syntax Error") + return out + + def __or_list(self) -> AST: + terms = [self.__and_list()] + + while self.__is_next_or(): + self.__eat(TokenType.ULITERAL) + terms.append(self.__and_list()) + + return ORList(terms) if len(terms) > 1 else terms[0] + + def __is_next_or(self) -> bool: + return self.next_token.type == TokenType.ULITERAL and self.next_token.value.upper() == "OR" + + def __and_list(self) -> AST: + elements = [self.__term()] + while ( + self.next_token.type + in [ + TokenType.QLITERAL, + TokenType.ULITERAL, + TokenType.CONSTRAINTTYPE, + TokenType.RBRACKETO, + ] + and not self.__is_next_or() + ): + self.__skip_and() + elements.append(self.__term()) + return ANDList(elements) if len(elements) > 1 else elements[0] + + def __skip_and(self) -> None: + if self.__is_next_and(): + self.__eat(TokenType.ULITERAL) + + if self.__is_next_and(): + raise self.__syntax_error("Unexpected AND") + + def __is_next_and(self) -> bool: + return self.next_token.type == TokenType.ULITERAL and self.next_token.value.upper() == "AND" + + def __term(self) -> AST: + if self.__is_next_not(): + self.__eat(TokenType.ULITERAL) + term = self.__term() + if isinstance(term, Not): # instead of Not(Not(child)) return child + return term.child + return Not(term) + if self.next_token.type == TokenType.RBRACKETO: + self.__eat(TokenType.RBRACKETO) + out = self.__or_list() + self.__eat(TokenType.RBRACKETC) + return out + else: + return self.__constraint() + + def __is_next_not(self) -> bool: + return self.next_token.type == TokenType.ULITERAL and self.next_token.value.upper() == "NOT" + + def __constraint(self) -> Constraint: + if self.next_token.type == TokenType.CONSTRAINTTYPE: + self.last_constraint_type = self.__eat(TokenType.CONSTRAINTTYPE).value + + value = self.__literal() + + properties = [] + if self.next_token.type == TokenType.SBRACKETO: + self.__eat(TokenType.SBRACKETO) + properties.append(self.__property()) + + while self.next_token.type == TokenType.COMMA: + self.__eat(TokenType.COMMA) + properties.append(self.__property()) + + self.__eat(TokenType.SBRACKETC) + + return Constraint(self.last_constraint_type, value, properties) + + def __property(self) -> Property: + key = self.__eat(TokenType.ULITERAL).value + self.__eat(TokenType.EQUALS) + value = self.__literal() + return Property(key, value) + + def __literal(self) -> str: + if self.next_token.type in [TokenType.QLITERAL, TokenType.ULITERAL]: + return self.__eat(self.next_token.type).value + raise self.__syntax_error() + + def __eat(self, type: TokenType) -> Token: + if self.next_token.type != type: + raise self.__syntax_error(f"expected {type} found {self.next_token.type}") + out = self.next_token + self.next_token = self.tokenizer.get_next_token() + return out + + def __syntax_error(self, msg: str = "Syntax Error") -> ParsingError: + return ParsingError(self.next_token.start, self.next_token.end, msg) diff --git a/tagstudio/src/core/query_lang/tokenizer.py b/tagstudio/src/core/query_lang/tokenizer.py new file mode 100644 index 00000000..ba86abdf --- /dev/null +++ b/tagstudio/src/core/query_lang/tokenizer.py @@ -0,0 +1,147 @@ +from enum import Enum +from typing import Any + +from .ast import ConstraintType +from .util import ParsingError + + +class TokenType(Enum): + EOF = -1 + QLITERAL = 0 # Quoted Literal + ULITERAL = 1 # Unquoted Literal (does not contain ":", " ", "[", "]", "(", ")", "=", ",") + RBRACKETO = 2 # Round Bracket Open + RBRACKETC = 3 # Round Bracket Close + SBRACKETO = 4 # Square Bracket Open + SBRACKETC = 5 # Square Bracket Close + CONSTRAINTTYPE = 6 + COLON = 10 + COMMA = 11 + EQUALS = 12 + + +class Token: + type: TokenType + value: Any + + start: int + end: int + + def __init__(self, type: TokenType, value: Any, start: int = None, end: int = None) -> None: + self.type = type + self.value = value + self.start = start + self.end = end + + @staticmethod + def from_type(type: TokenType, pos: int = None) -> "Token": + return Token(type, None, pos, pos) + + @staticmethod + def EOF() -> "Token": # noqa: N802 + return Token.from_type(TokenType.EOF) + + def __str__(self) -> str: + return f"Token({self.type}, {self.value}, {self.start}, {self.end})" # pragma: nocover + + def __repr__(self) -> str: + return self.__str__() # pragma: nocover + + +class Tokenizer: + text: str + pos: int + current_char: str + + ESCAPABLE_CHARS = ["\\", '"', '"'] + NOT_IN_ULITERAL = [":", " ", "[", "]", "(", ")", "=", ","] + + def __init__(self, text: str) -> None: + self.text = text + self.pos = 0 + self.current_char = self.text[self.pos] if len(text) > 0 else None + + def get_next_token(self) -> Token: + self.__skip_whitespace() + if self.current_char is None: + return Token.EOF() + + if self.current_char in ("'", '"'): + return self.__quoted_string() + elif self.current_char == "(": + self.__advance() + return Token.from_type(TokenType.RBRACKETO, self.pos - 1) + elif self.current_char == ")": + self.__advance() + return Token.from_type(TokenType.RBRACKETC, self.pos - 1) + elif self.current_char == "[": + self.__advance() + return Token.from_type(TokenType.SBRACKETO, self.pos - 1) + elif self.current_char == "]": + self.__advance() + return Token.from_type(TokenType.SBRACKETC, self.pos - 1) + elif self.current_char == ",": + self.__advance() + return Token.from_type(TokenType.COMMA, self.pos - 1) + elif self.current_char == "=": + self.__advance() + return Token.from_type(TokenType.EQUALS, self.pos - 1) + else: + return self.__unquoted_string_or_constraint_type() + + def __unquoted_string_or_constraint_type(self) -> Token: + out = "" + + start = self.pos + + while self.current_char not in self.NOT_IN_ULITERAL and self.current_char is not None: + out += self.current_char + self.__advance() + + end = self.pos - 1 + + if self.current_char == ":": + if len(out) == 0: + raise ParsingError(self.pos, self.pos) + self.__advance() + constraint_type = ConstraintType.from_string(out) + if constraint_type is None: + raise ParsingError(start, end, f'Invalid ContraintType "{out}"') + return Token(TokenType.CONSTRAINTTYPE, constraint_type, start, end) + else: + return Token(TokenType.ULITERAL, out, start, end) + + def __quoted_string(self) -> Token: + start = self.pos + quote = self.current_char + self.__advance() + escape = False + out = "" + + while escape or self.current_char != quote: + if escape: + escape = False + if self.current_char not in Tokenizer.ESCAPABLE_CHARS: + out += "\\" + else: + out += self.current_char + self.__advance() + continue + if self.current_char == "\\": + escape = True + else: + out += self.current_char + self.__advance() + end = self.pos + self.__advance() + return Token(TokenType.QLITERAL, out, start, end) + + def __advance(self) -> None: + if self.pos < len(self.text) - 1: + self.pos += 1 + self.current_char = self.text[self.pos] + else: + self.current_char = None + + def __skip_whitespace(self) -> None: + while self.current_char is not None and self.current_char.isspace(): + self.__advance() diff --git a/tagstudio/src/core/query_lang/util.py b/tagstudio/src/core/query_lang/util.py new file mode 100644 index 00000000..8deaecf2 --- /dev/null +++ b/tagstudio/src/core/query_lang/util.py @@ -0,0 +1,15 @@ +class ParsingError(BaseException): + start: int + end: int + msg: str + + def __init__(self, start: int, end: int, msg: str = "Syntax Error") -> None: + self.start = start + self.end = end + self.msg = msg + + def __str__(self) -> str: + return f"Syntax Error {self.start}->{self.end}: {self.msg}" # pragma: nocover + + def __repr__(self) -> str: + return self.__str__() # pragma: nocover diff --git a/tagstudio/src/core/utils/dupe_files.py b/tagstudio/src/core/utils/dupe_files.py index 2d0a074b..3c1d55d1 100644 --- a/tagstudio/src/core/utils/dupe_files.py +++ b/tagstudio/src/core/utils/dupe_files.py @@ -50,7 +50,7 @@ class DupeRegistry: continue results = self.library.search_library( - FilterState(path=path_relative), + FilterState.from_path(path_relative), ) if not results: diff --git a/tagstudio/src/qt/main_window.py b/tagstudio/src/qt/main_window.py index 621ed9cf..3de0118d 100644 --- a/tagstudio/src/qt/main_window.py +++ b/tagstudio/src/qt/main_window.py @@ -74,14 +74,6 @@ class Ui_MainWindow(QMainWindow): spacerItem = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout_3.addItem(spacerItem) - # Search type selector - self.comboBox_2 = QComboBox(self.centralwidget) - self.comboBox_2.setMinimumSize(QSize(165, 0)) - self.comboBox_2.setObjectName("comboBox_2") - self.comboBox_2.addItem("") - self.comboBox_2.addItem("") - self.horizontalLayout_3.addWidget(self.comboBox_2) - # Thumbnail Size placeholder self.thumb_size_combobox = QComboBox(self.centralwidget) self.thumb_size_combobox.setObjectName(u"thumbSizeComboBox") @@ -214,9 +206,6 @@ class Ui_MainWindow(QMainWindow): self.searchButton.setText( QCoreApplication.translate("MainWindow", u"Search", None)) - # Search type selector - self.comboBox_2.setItemText(0, QCoreApplication.translate("MainWindow", "And (Includes All Tags)")) - self.comboBox_2.setItemText(1, QCoreApplication.translate("MainWindow", "Or (Includes Any Tag)")) self.thumb_size_combobox.setCurrentText("") # Thumbnail size selector diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index c6ef2034..4e3cfaed 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -65,14 +65,14 @@ from src.core.constants import ( ) from src.core.driver import DriverMixin from src.core.enums import LibraryPrefs, MacroID, SettingItems +from src.core.library.alchemy import Library from src.core.library.alchemy.enums import ( FieldTypeEnum, FilterState, ItemType, - SearchMode, ) from src.core.library.alchemy.fields import _FieldID -from src.core.library.alchemy.library import Entry, Library, LibraryStatus +from src.core.library.alchemy.library import Entry, LibraryStatus from src.core.media_types import MediaCategories from src.core.ts_core import TagStudioCore from src.core.utils.refresh_dir import RefreshDirTracker @@ -140,7 +140,7 @@ class QtDriver(DriverMixin, QObject): self.rm: ResourceManager = ResourceManager() self.args = args self.frame_content = [] - self.filter = FilterState() + self.filter = FilterState.show_all() self.pages_count = 0 self.scrollbar_pos = 0 @@ -468,7 +468,7 @@ class QtDriver(DriverMixin, QObject): ] self.item_thumbs: list[ItemThumb] = [] self.thumb_renderers: list[ThumbRenderer] = [] - self.filter = FilterState() + self.filter = FilterState.show_all() self.init_library_window() self.migration_modal: JsonMigrationModal = None @@ -510,18 +510,17 @@ class QtDriver(DriverMixin, QObject): # Search Button search_button: QPushButton = self.main_window.searchButton search_button.clicked.connect( - lambda: self.filter_items(FilterState(query=self.main_window.searchField.text())) + lambda: self.filter_items( + FilterState.from_search_query(self.main_window.searchField.text()) + ) ) # Search Field search_field: QLineEdit = self.main_window.searchField search_field.returnPressed.connect( # TODO - parse search field for filters - lambda: self.filter_items(FilterState(query=self.main_window.searchField.text())) - ) - # Search Type Selector - search_type_selector: QComboBox = self.main_window.comboBox_2 - search_type_selector.currentIndexChanged.connect( - lambda: self.set_search_type(SearchMode(search_type_selector.currentIndex())) + lambda: self.filter_items( + FilterState.from_search_query(self.main_window.searchField.text()) + ) ) # Thumbnail Size ComboBox thumb_size_combobox: QComboBox = self.main_window.thumb_size_combobox @@ -963,11 +962,20 @@ class QtDriver(DriverMixin, QObject): self.autofill_action.setDisabled(not self.selected) def update_completions_list(self, text: str) -> None: - matches = re.search(r"(mediatype|filetype|path|tag):(\"?[A-Za-z0-9\ \t]+\"?)?", text) + matches = re.search( + r"((?:.* )?)(mediatype|filetype|path|tag|tag_id):(\"?[A-Za-z0-9\ \t]+\"?)?", text + ) completion_list: list[str] = [] if len(text) < 3: - completion_list = ["mediatype:", "filetype:", "path:", "tag:"] + completion_list = [ + "mediatype:", + "filetype:", + "path:", + "tag:", + "tag_id:", + "special:untagged", + ] self.main_window.searchFieldCompletionList.setStringList(completion_list) if not matches: @@ -975,26 +983,28 @@ class QtDriver(DriverMixin, QObject): query_type: str query_value: str | None - query_type, query_value = matches.groups() + prefix, query_type, query_value = matches.groups() if not query_value: return if query_type == "tag": - completion_list = list(map(lambda x: "tag:" + x.name, self.lib.tags)) + completion_list = list(map(lambda x: prefix + "tag:" + x.name, self.lib.tags)) + elif query_type == "tag_id": + completion_list = list(map(lambda x: prefix + "tag_id:" + str(x.id), self.lib.tags)) elif query_type == "path": - completion_list = list(map(lambda x: "path:" + x, self.lib.get_paths())) + completion_list = list(map(lambda x: prefix + "path:" + x, self.lib.get_paths())) elif query_type == "mediatype": single_word_completions = map( - lambda x: "mediatype:" + x.name, + lambda x: prefix + "mediatype:" + x.name, filter(lambda y: " " not in y.name, MediaCategories.ALL_CATEGORIES), ) single_word_completions_quoted = map( - lambda x: 'mediatype:"' + x.name + '"', + lambda x: prefix + 'mediatype:"' + x.name + '"', filter(lambda y: " " not in y.name, MediaCategories.ALL_CATEGORIES), ) multi_word_completions = map( - lambda x: 'mediatype:"' + x.name + '"', + lambda x: prefix + 'mediatype:"' + x.name + '"', filter(lambda y: " " in y.name, MediaCategories.ALL_CATEGORIES), ) @@ -1008,7 +1018,9 @@ class QtDriver(DriverMixin, QObject): extensions_list: set[str] = set() for media_cat in MediaCategories.ALL_CATEGORIES: extensions_list = extensions_list | media_cat.extensions - completion_list = list(map(lambda x: "filetype:" + x.replace(".", ""), extensions_list)) + completion_list = list( + map(lambda x: prefix + "filetype:" + x.replace(".", ""), extensions_list) + ) update_completion_list: bool = ( completion_list != self.main_window.searchFieldCompletionList.stringList() @@ -1125,8 +1137,12 @@ class QtDriver(DriverMixin, QObject): if filter: self.filter = dataclasses.replace(self.filter, **dataclasses.asdict(filter)) - self.main_window.statusbar.showMessage(f'Searching Library: "{self.filter.summary}"') + # inform user about running search + self.main_window.statusbar.showMessage("Searching Library...") self.main_window.statusbar.repaint() + + # search the library + start_time = time.time() results = self.lib.search_library(self.filter) @@ -1134,17 +1150,11 @@ class QtDriver(DriverMixin, QObject): logger.info("items to render", count=len(results)) end_time = time.time() - if self.filter.summary: - # fmt: off - self.main_window.statusbar.showMessage( - f"{results.total_count} Results Found for \"{self.filter.summary}\"" - f" ({format_timespan(end_time - start_time)})" - ) - # fmt: on - else: - self.main_window.statusbar.showMessage( - f"{results.total_count} Results ({format_timespan(end_time - start_time)})" - ) + + # inform user about completed search + self.main_window.statusbar.showMessage( + f"{results.total_count} Results Found ({format_timespan(end_time - start_time)})" + ) # update page content self.frame_content = results.items @@ -1156,14 +1166,6 @@ class QtDriver(DriverMixin, QObject): self.pages_count, self.filter.page_index, emit=False ) - def set_search_type(self, mode: SearchMode = SearchMode.AND): - self.filter_items( - FilterState( - search_mode=mode, - path=self.main_window.searchField.text(), - ) - ) - def remove_recent_library(self, item_key: str): self.settings.beginGroup(SettingItems.LIBS_LIST) self.settings.remove(item_key) diff --git a/tagstudio/src/qt/widgets/item_thumb.py b/tagstudio/src/qt/widgets/item_thumb.py index a6983959..07bf4862 100644 --- a/tagstudio/src/qt/widgets/item_thumb.py +++ b/tagstudio/src/qt/widgets/item_thumb.py @@ -25,7 +25,6 @@ from src.core.constants import ( TAG_FAVORITE, ) from src.core.library import Entry, ItemType, Library -from src.core.library.alchemy.enums import FilterState from src.core.library.alchemy.fields import _FieldID from src.core.media_types import MediaCategories, MediaType from src.qt.flowlayout import FlowWidget @@ -453,9 +452,7 @@ class ItemThumb(FlowWidget): entry, toggle_value, tag_id, _FieldID.TAGS_META.name, create_field=True ) # update the entry - self.driver.frame_content[idx] = self.lib.search_library( - FilterState(id=entry.id) - ).items[0] + self.driver.frame_content[idx] = self.lib.get_entry_full(entry.id) self.driver.update_badges(update_items) diff --git a/tagstudio/src/qt/widgets/preview_panel.py b/tagstudio/src/qt/widgets/preview_panel.py index 70fce9b5..7e8e0c8b 100644 --- a/tagstudio/src/qt/widgets/preview_panel.py +++ b/tagstudio/src/qt/widgets/preview_panel.py @@ -36,7 +36,6 @@ from src.core.constants import ( TS_FOLDER_NAME, ) from src.core.enums import SettingItems, Theme -from src.core.library.alchemy.enums import FilterState from src.core.library.alchemy.fields import ( BaseField, DatetimeField, @@ -295,14 +294,13 @@ class PreviewPanel(QWidget): def update_selected_entry(self, driver: "QtDriver"): for grid_idx in driver.selected: entry = driver.frame_content[grid_idx] - results = self.lib.search_library(FilterState(id=entry.id)) + result = self.lib.get_entry_full(entry.id) logger.info( "found item", - entries=len(results.items), grid_idx=grid_idx, lookup_id=entry.id, ) - self.driver.frame_content[grid_idx] = results[0] + 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}"?' @@ -564,14 +562,13 @@ class PreviewPanel(QWidget): # TODO - Entry reload is maybe not necessary for grid_idx in self.driver.selected: entry = self.driver.frame_content[grid_idx] - results = self.lib.search_library(FilterState(id=entry.id)) + result = self.lib.get_entry_full(entry.id) logger.info( "found item", - entries=len(results.items), grid_idx=grid_idx, lookup_id=entry.id, ) - self.driver.frame_content[grid_idx] = results[0] + self.driver.frame_content[grid_idx] = result if len(self.driver.selected) == 1: # 1 Selected Entry diff --git a/tagstudio/src/qt/widgets/tag_box.py b/tagstudio/src/qt/widgets/tag_box.py index c4496e62..a1c7301b 100755 --- a/tagstudio/src/qt/widgets/tag_box.py +++ b/tagstudio/src/qt/widgets/tag_box.py @@ -100,7 +100,7 @@ class TagBoxWidget(FieldWidget): tag_widget.on_click.connect( lambda tag_id=tag.id: ( self.driver.main_window.searchField.setText(f"tag_id:{tag_id}"), - self.driver.filter_items(FilterState(tag_id=tag_id)), + self.driver.filter_items(FilterState.from_tag_id(tag_id)), ) ) diff --git a/tagstudio/tests/conftest.py b/tagstudio/tests/conftest.py index 39c3f753..7a59d05e 100644 --- a/tagstudio/tests/conftest.py +++ b/tagstudio/tests/conftest.py @@ -117,13 +117,20 @@ def library(request): yield lib +@pytest.fixture +def search_library() -> Library: + lib = Library() + lib.open_library(pathlib.Path(CWD / "fixtures" / "search_library")) + return lib + + @pytest.fixture def entry_min(library): yield next(library.get_entries()) @pytest.fixture -def entry_full(library): +def entry_full(library: Library): yield next(library.get_entries(with_joins=True)) diff --git a/tagstudio/tests/fixtures/search_library/.TagStudio/ts_library.json b/tagstudio/tests/fixtures/search_library/.TagStudio/ts_library.json new file mode 100644 index 00000000..ff3fb742 --- /dev/null +++ b/tagstudio/tests/fixtures/search_library/.TagStudio/ts_library.json @@ -0,0 +1 @@ +{"ts-version":"9.4.2","ext_list":[".json",".xmp",".aae",".txt"],"is_exclude_list":true,"tags":[{"id":0,"name":"Archived","aliases":["Archive"],"color":"Red"},{"id":1,"name":"Favorite","aliases":["Favorited","Favorites"],"color":"Yellow"},{"id":1000,"name":"Parent","aliases":[""],"subtag_ids":[1000]},{"id":1001,"name":"Default","aliases":[""]},{"id":1002,"name":"Black","aliases":[""],"subtag_ids":[1040],"color":"black"},{"id":1003,"name":"Dark Gray","aliases":["Dark Grey"],"subtag_ids":[1040,1002,1004],"color":"dark gray"},{"id":1004,"name":"Gray","aliases":["Grey"],"subtag_ids":[1040,1002,1006],"color":"gray"},{"id":1005,"name":"Light Gray","aliases":["Light Grey"],"subtag_ids":[1040,1006,1004],"color":"light gray"},{"id":1006,"name":"White","aliases":[""],"subtag_ids":[1040],"color":"white"},{"id":1007,"name":"Light Pink","aliases":[""],"subtag_ids":[1040,1009,1006],"color":"light pink"},{"id":1008,"name":"Pink","aliases":[""],"subtag_ids":[1040,1006,1009],"color":"pink"},{"id":1009,"name":"Red","aliases":[""],"subtag_ids":[1040],"color":"red"},{"id":1010,"name":"Red Orange","aliases":[""],"subtag_ids":[1040,1009,1011],"color":"red orange"},{"id":1011,"name":"Orange","aliases":[""],"subtag_ids":[1040,1009,1013],"color":"orange"},{"id":1012,"name":"Yellow Orange","aliases":[""],"subtag_ids":[1040,1011],"color":"yellow orange"},{"id":1013,"name":"Yellow","aliases":[""],"subtag_ids":[1040],"color":"yellow"},{"id":1014,"name":"Lime","aliases":[""],"subtag_ids":[1040,1017,1006],"color":"lime"},{"id":1015,"name":"Light Green","aliases":[""],"color":"light green"},{"id":1016,"name":"Mint","aliases":[""],"subtag_ids":[1040,1017,1019],"color":"mint"},{"id":1017,"name":"Green","aliases":[""],"subtag_ids":[1040,1021,1013],"color":"green"},{"id":1018,"name":"Teal","aliases":[""],"subtag_ids":[1040,1017,1021],"color":"teal"},{"id":1019,"name":"Cyan","aliases":[""],"subtag_ids":[1040,1017,1021],"color":"cyan"},{"id":1020,"name":"Light Blue","aliases":[""],"subtag_ids":[1040,1021,1006],"color":"light blue"},{"id":1021,"name":"Blue","aliases":[""],"subtag_ids":[1040],"color":"blue"},{"id":1022,"name":"Blue Violet","aliases":[""],"subtag_ids":[1040,1021,1023],"color":"blue violet"},{"id":1023,"name":"Violet","aliases":[""],"subtag_ids":[1040,1009,1021],"color":"violet"},{"id":1024,"name":"Purple","aliases":[""],"subtag_ids":[1040,1009,1021],"color":"purple"},{"id":1025,"name":"Lavender","aliases":[""],"subtag_ids":[1040,1024,1006],"color":"lavender"},{"id":1026,"name":"Berry","aliases":[""],"color":"berry"},{"id":1027,"name":"Magenta","aliases":[""],"color":"magenta"},{"id":1028,"name":"Salmon","aliases":[""],"color":"salmon"},{"id":1029,"name":"Auburn","aliases":[""],"color":"auburn"},{"id":1030,"name":"Dark Brown","aliases":[""],"color":"dark brown"},{"id":1031,"name":"Brown","aliases":[""],"color":"brown"},{"id":1032,"name":"Light Brown","aliases":[""],"color":"light brown"},{"id":1033,"name":"Blonde","aliases":[""],"color":"blonde"},{"id":1034,"name":"Peach","aliases":[""],"color":"peach"},{"id":1035,"name":"Warm Gray","aliases":["Warm Grey"],"subtag_ids":[1040,1004,1011],"color":"warm gray"},{"id":1036,"name":"Cool Gray","aliases":["Cool Grey"],"subtag_ids":[1040,1004,1021],"color":"cool gray"},{"id":1037,"name":"Olive","aliases":[""],"subtag_ids":[1040,1017,1004],"color":"olive"},{"id":1038,"name":"Square","aliases":[""],"subtag_ids":[1039]},{"id":1039,"name":"Shape","aliases":[""]},{"id":1040,"name":"Color","aliases":[""]},{"id":1041,"name":"Circle","aliases":[""],"subtag_ids":[1039,1042]},{"id":1042,"name":"Ellipse","aliases":[""],"subtag_ids":[1039,1043]},{"id":1043,"name":"Round","aliases":[""]}],"collations":[],"fields":[],"macros":[],"entries":[{"id":0,"filename":"red.jpg","path":"inherit colors shapes"},{"id":1,"filename":"red_square.jpg","path":"inherit colors shapes","fields":[{"6":[1009,1038]}]},{"id":2,"filename":"red_circle.jpg","path":"inherit colors shapes","fields":[{"6":[1041,1009]}]},{"id":3,"filename":"blue_circle.jpg","path":"inherit colors shapes","fields":[{"6":[1021,1041]}]},{"id":4,"filename":"blue_square.jpg","path":"inherit colors shapes","fields":[{"6":[1021,1038]}]},{"id":5,"filename":"blue.jpg","path":"inherit colors shapes","fields":[{"6":[1021]}]},{"id":10,"filename":"green_circle.png","path":"inherit colors shapes","fields":[{"6":[1041,1017]}]},{"id":11,"filename":"green.png","path":"inherit colors shapes","fields":[{"6":[1017]}]},{"id":12,"filename":"green_square.png","path":"inherit colors shapes","fields":[{"6":[1017,1038]}]},{"id":13,"filename":"yellow_circle.png","path":"inherit colors shapes","fields":[{"6":[1041,1013]}]},{"id":14,"filename":"yellow_square.png","path":"inherit colors shapes","fields":[{"6":[1038,1013]}]},{"id":15,"filename":"yellow.png","path":"inherit colors shapes","fields":[{"6":[1013]}]},{"id":16,"filename":"square.png","path":"inherit colors shapes","fields":[{"6":[1038]}]},{"id":17,"filename":"circle.png","path":"inherit colors shapes","fields":[{"6":[1041]}]},{"id":18,"filename":"shape.png","path":"inherit colors shapes","fields":[{"6":[1039]}]},{"id":19,"filename":"orange_circle.png","path":"inherit colors shapes","fields":[{"6":[1041,1011]}]},{"id":20,"filename":"orange_square.png","path":"inherit colors shapes","fields":[{"6":[1011,1038]}]},{"id":21,"filename":"orange.png","path":"inherit colors shapes","fields":[{"6":[1011]}]},{"id":22,"filename":"yellow_ellipse.png","path":"inherit colors shapes","fields":[{"6":[1042,1013]}]},{"id":23,"filename":"ellipse.png","path":"inherit colors shapes","fields":[{"6":[1042]}]},{"id":24,"filename":"red_ellipse.png","path":"inherit colors shapes","fields":[{"6":[1042,1009]}]},{"id":25,"filename":"blue_ellipse.png","path":"inherit colors shapes","fields":[{"6":[1021,1042]}]},{"id":26,"filename":"green_ellipse.png","path":"inherit colors shapes","fields":[{"6":[1042,1017]}]},{"id":27,"filename":"orange_ellipse.png","path":"inherit colors shapes","fields":[{"6":[1042,1011]}]},{"id":30,"filename":"r_circle_b_square.png","path":"comp colors shapes","fields":[{"6":[1021,1041,1009,1038]}]},{"id":31,"filename":"r_circle_g_square.png","path":"comp colors shapes","fields":[{"6":[1041,1017,1009,1038]}]},{"id":32,"filename":"r_circle_y_square.png","path":"comp colors shapes","fields":[{"6":[1041,1009,1038,1013]}]},{"id":33,"filename":"r_circle_o_square.png","path":"comp colors shapes","fields":[{"6":[1041,1011,1009,1038]}]},{"id":34,"filename":"r_circle_r_square.png","path":"comp colors shapes","fields":[{"6":[1041,1009,1038]}]}]} \ No newline at end of file diff --git a/tagstudio/tests/fixtures/search_library/.TagStudio/ts_library.sqlite b/tagstudio/tests/fixtures/search_library/.TagStudio/ts_library.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..449f380b02fad6ca8fbcc08dddf2ca8d99116aaf GIT binary patch literal 86016 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 TZ;*GE|JoT5&GpN4kB9vaG5Ohp literal 0 HcmV?d00001 diff --git a/tagstudio/tests/fixtures/search_library/comp colors shapes/r_circle_g_square.png b/tagstudio/tests/fixtures/search_library/comp colors shapes/r_circle_g_square.png new file mode 100644 index 0000000000000000000000000000000000000000..0df75c52512230f865e944e48beb95d79741e3ef GIT binary patch literal 3737 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 literal 0 HcmV?d00001 diff --git a/tagstudio/tests/fixtures/search_library/comp colors shapes/r_circle_o_square.png b/tagstudio/tests/fixtures/search_library/comp colors shapes/r_circle_o_square.png new file mode 100644 index 0000000000000000000000000000000000000000..d49991095c166afb60b7d6c84a34f919e82d8486 GIT binary patch literal 3672 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 LX=hPl<{kS#i`Vv) literal 0 HcmV?d00001 diff --git a/tagstudio/tests/fixtures/search_library/comp colors shapes/r_circle_r_square.png b/tagstudio/tests/fixtures/search_library/comp colors shapes/r_circle_r_square.png new file mode 100644 index 0000000000000000000000000000000000000000..5a3b5ee99117f2689ad200699fe8449e01f3134d GIT binary patch literal 3266 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 literal 0 HcmV?d00001 diff --git a/tagstudio/tests/fixtures/search_library/comp colors shapes/r_circle_y_square.png b/tagstudio/tests/fixtures/search_library/comp colors shapes/r_circle_y_square.png new file mode 100644 index 0000000000000000000000000000000000000000..170279182496b11e36de47d13fe8086d476c736b GIT binary patch literal 3624 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 TCCGVx=9iQ75C4$}ZT0^bloX2b literal 0 HcmV?d00001 diff --git a/tagstudio/tests/fixtures/search_library/inherit colors shapes/blue_ellipse.png b/tagstudio/tests/fixtures/search_library/inherit colors shapes/blue_ellipse.png new file mode 100644 index 0000000000000000000000000000000000000000..e73e917113476fd2b729485fd486dce7529f1da2 GIT binary patch literal 5570 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 E0FE(v&;S4c literal 0 HcmV?d00001 diff --git a/tagstudio/tests/fixtures/search_library/inherit colors shapes/blue_square.jpg b/tagstudio/tests/fixtures/search_library/inherit colors shapes/blue_square.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d5589a7cbe007e87e2b399a32cc92303f4a30271 GIT binary patch literal 8314 zcmeHK2{@GP*T3yTZ&|WMjX`!ZM#R`&yCGSJQYvN!BV(8u#*k3GmP+$#uboco+}pZlEiJkL4I4rU)% zYi)tC0Bq1uWm5%!`3jsh4Q)QPmm=UNr3Ne62B>Tfy8a+J8K{Nw6 zwDXclq=0W~|Mcw3i~&Am8ky=t{sH^9iC&C9<6O)eh!Ya|$_fPu??LnUADO=$AI)N2vIWYH9~-hFU`qBQQy`llyEWmk z6*|V$)Sg22BKkoKR7Xn_7{=UGTSHe{TMebI!HVvpbJ12rDveBGe9adpLf}{AM}#f< z6YYUx#ohoOKq2FUa0ER3E1gRAqR~Al1Y>W=i3V_EFE64$k;Z`8vjPo+o+Bs^wU(Lb zJ_Ja`KOX0MZy}&v5v=rDG63=4ZChOXE)|#Aq5NjSZx4zg?C1FDfuA1u>4Bdf`00V4 z9{B&~ft6C5;15+$bf}PKegLYARSB#7glVcHfsP5rmQ$Wpx`VZC(#JXzKso17gsmXFl}-y_;Zz8V z;Cwvr5WWCmRSIMvgxgqj&m}y_!rn`Gj)f`Cj;7Gr)xoewTe&Vmo)-w#YDu##Y99!C8gyzO0Jic5*3B1 z!elooC@CvRY*a(4DI(<+l@wV@*m!t&_;~q*`S^qtB}F9_|Mp0EZwj0(JK$ zbRR`78upKqR0p9kri&2$Y@}H+@vzLMd?gFIprF|Gj0AP+_IB!te$!$3g+}{6^v$$) zSsYb)MygIz?}zQ=PR41uCf*LBt2{>Ygqbc8Wd%1CjfwwKI>31M>qj5Lkpn$hn0`;W z_T8pz?cHVigVG-aF4=WmF4R9}mRa1m_p8dB6H2qeK?+H+DOiR8k1OTY_*r@ds@}-I z`P`U>kZ+kxTQo={boD#z>yFUitLl4wuDfQv{pY6tNz;-{;AL$ttNU-bB%-0v#pZV|+?!nDWg{-iu+N7ab zZdyT9Ldp)tF@`JEY`lzKi83(S+noAIV{9KnW7!^V%Yye3t!KCmZ3%BR2Hcy3o2z>J z8Ykutp`C93$ixg|@AiBLvE5FIe_*8s2I*eN50za>rAjK8%48HuYZsm{C8AtWED$Vl zrqS(4JSDfU;C+p!l~)qpS0#PG@Z5a1M)_3y0Yt{=*!CA!uCDo@I z#Bj&;L9*JH^4|5)3G#<@dIr@H8ou$43PHw}Pd)`~DPJ{yy!Tv3E9>37Jos!jKXTjS z9NlBp^t;c@v~(wCZ}XN=ew#;bdCqY?_6`&KrB=T`xc|+yLha45k?hG$nxg6LGS?h6 z_emNa;0bozt{LBZuytJYLOY!9EE2wvha(J@t@B~nHXaUJ-UGUyyS%kNf6|K7cI-t% zLUvS7>Is22^s^PW>Wj3jvf8;eTGrm~ZB+QbdKe!UDlSpWU8LT4z0s~Jey2D$+tf^Z zjKleHhYQs_My``)SNT0VWsmZWR97zyMby_{P$ebBPVPMZ0QYL*WmGUcz3|nhZLlgy zCw#KQTwuO6-01C|HkYH%D%V)J^|`?3$qVa*uYY*P-#UdJ7t#^S%$(f# zcxDpkDj~5y>3EmabMtu5-t^tsR3ol{i_SGycWQY(HZq+NR*nbh)zjMkISJyoXcO|Y{lU8VTjF3XeA z_r1KVG44SFb9)l2+>36cd0}33tF#M^jDA5J)YDhe{Did|Nwx90;+eN_#q0Sq5k%Vz zA-rMt+!iJnl;82t=7G53^p>88vGBT0dg~ZPbs?cCcXexpT~FEESP&C8+4k{NJTA?< zq-2dvmv_xrHUGZ7o(FPGo~jnPS~>A$8av0Gyk#d-14}%3D=nfdH=$$SlX*)6i>I;4 zQk>Uam>{B{FFH)c(@O|FwqZGOwMUi`w?d-fqcM?j)Y&&luZYhu;ZRgnqTT7>$xRJO zYk%-2bKC9NE_rU-@WF(i>?U$x}2WrjgB%w|!z8`N5Ur*%D#Yo0Koz2eq zh3}Hj@rT1Anb_+kwb*{*ukGQdxD4ODxfCiI=&iXb-`KV8t_`8^uy*RpGd8ac;V6fm zp`pN@&+{HzE)-3LJ__tqwRNqYT~PnBKWt&HD&fR-Y4+mYYcg?IYAj$6PY@S?-7tlX)K<9ScXb%w}>iT#zB*;8UiANLrIGQk}kCNPfZ zSa>`yrfgI&KDU9kF;^nyyi#_jwdR8Uwl6VnuRfm9qhDi!RINNF@To~wxl@fdCzg(C zYgdu;x*D=l%l0;xzDc$GVB&ToVlbv5qM_!JUGc)lvF%+=nQiUi-fNIa#uXFFu*Ca? z6M@P z*SxgIn+5!~Ub`!Y$8(ID)}y+uyMiuX#~5v%x4Osg9G4Orf2lG33iet-U+ZrVy3~d~ zqY-O@ny~sM>r^uDnQhH)HZAd=8K@tS2va%QU1nrcRb~DX+p4O)bAzF1-i9OT?vry7 z$$C;_2Gi<0TOO0Fu{`ouW>N*N@cOS4B&n(8b#hnac$t4P^EEPVc|sC$BdVUjR&}T> ztaF-H+1BPa95nhVn`E_*C+BAa%st_zLl*+qol{}^9Z%-j;oae zwbdUBYRcWm8NU2DoTrB4c*U_lxa}`CU)kDvkuq6gG^}<9B|G!V+9~|yBbS6H)}Lid zsKuqT5z56KQ&(qGzDRlo3R|7*Y(1aC<0>ffW+AND;Y*2YFRp@+m2@{YPTg0&(f%$r zSm;btMBT1(*_g-qQuLUvh!IW3pQQWg-55kv&bEnjQ+hTEv}vpM>XG!9b4d?L`#MT2=8~rzd{g*%vkyC? zyoA!*8!iMPqO7pbB@>H}k31M@eE973lw{iDZS^iU%!2u!j*N$fH>ytM$8-(wXJpmX z-m%&3m3-bU@<>=)4>dA5EkcZse==bvLqI27LM~ah%1m%1kv5=-V8eQ{J}UIxOKudCyq)IJ0NyHob-NAtCbs}=)v$8564Pn66#%izwW!_ z7P=65VgeHuA8J&fP~a9gW*eQZ?EZ0bF7dIi-|w{+-KL$(g=x=HVe0Z%#nIm@iB^i7 zzgZmp)A_kr->q!(_bR>rpNG_lD%9j^G_@m*)mcy_sEWZL_xr#y@4V<)$37TG43m$Tn6 c`^xXWT7?uD$&!WPfDH+eE6>+A#KY|TFHE8f^#A|> literal 0 HcmV?d00001 diff --git a/tagstudio/tests/fixtures/search_library/inherit colors shapes/circle.png b/tagstudio/tests/fixtures/search_library/inherit colors shapes/circle.png new file mode 100644 index 0000000000000000000000000000000000000000..722f9f3653d1ade89ce4bf49a52e9e667e0a10f9 GIT binary patch literal 4911 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 XzUAEO@uLgt|8p7W;&qC&ox}eF@XBol literal 0 HcmV?d00001 diff --git a/tagstudio/tests/fixtures/search_library/inherit colors shapes/ellipse.png b/tagstudio/tests/fixtures/search_library/inherit colors shapes/ellipse.png new file mode 100644 index 0000000000000000000000000000000000000000..43f903e734d877e4fec36778f3b1198622f4b23a GIT binary patch literal 5440 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 k)k^>Rs>XPKjG%PIVS00?VgyZ`_I literal 0 HcmV?d00001 diff --git a/tagstudio/tests/fixtures/search_library/inherit colors shapes/green.png b/tagstudio/tests/fixtures/search_library/inherit colors shapes/green.png new file mode 100644 index 0000000000000000000000000000000000000000..96020e586985903879dc75adfc0b64ebb00d8915 GIT binary patch literal 8333 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 literal 0 HcmV?d00001 diff --git a/tagstudio/tests/fixtures/search_library/inherit colors shapes/green_circle.png b/tagstudio/tests/fixtures/search_library/inherit colors shapes/green_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..faaf1f1931075850b00ad6ce1df46a463368c9bc GIT binary patch literal 15946 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 CQ41;n literal 0 HcmV?d00001 diff --git a/tagstudio/tests/fixtures/search_library/inherit colors shapes/green_square.png b/tagstudio/tests/fixtures/search_library/inherit colors shapes/green_square.png new file mode 100644 index 0000000000000000000000000000000000000000..5080b3df479beb33d88944565454bd3aa4eebd93 GIT binary patch literal 8559 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 XZ2G}g^8@w&CZMgUuTgZxCgi^W#4=uG literal 0 HcmV?d00001 diff --git a/tagstudio/tests/fixtures/search_library/inherit colors shapes/orange_circle.png b/tagstudio/tests/fixtures/search_library/inherit colors shapes/orange_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..780eddbbf122373ea71c2f7191217d37cf5ac02d GIT binary patch literal 16167 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 literal 0 HcmV?d00001 diff --git a/tagstudio/tests/fixtures/search_library/inherit colors shapes/orange_ellipse.png b/tagstudio/tests/fixtures/search_library/inherit colors shapes/orange_ellipse.png new file mode 100644 index 0000000000000000000000000000000000000000..7496518bb181d72b75c20f6325aea49a89725185 GIT binary patch literal 16250 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 literal 0 HcmV?d00001 diff --git a/tagstudio/tests/fixtures/search_library/inherit colors shapes/orange_square.png b/tagstudio/tests/fixtures/search_library/inherit colors shapes/orange_square.png new file mode 100644 index 0000000000000000000000000000000000000000..8929649d18267770b6db48ef453f0260c1d00b2b GIT binary patch literal 9382 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

    NNOC~wgw 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 I%Ngze0)uXgV*mgE literal 0 HcmV?d00001 diff --git a/tagstudio/tests/fixtures/search_library/inherit colors shapes/red_circle.jpg b/tagstudio/tests/fixtures/search_library/inherit colors shapes/red_circle.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4edd09cebba10cfc7ec6d8e1e399eed637ed0a0b GIT binary patch literal 8295 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 E0@E&D2><{9 literal 0 HcmV?d00001 diff --git a/tagstudio/tests/fixtures/search_library/inherit colors shapes/red_square.jpg b/tagstudio/tests/fixtures/search_library/inherit colors shapes/red_square.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c2c6568c35e30a6a796c29dfd69a3194ca8452e2 GIT binary patch literal 8016 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 literal 0 HcmV?d00001 diff --git a/tagstudio/tests/fixtures/search_library/inherit colors shapes/square.png b/tagstudio/tests/fixtures/search_library/inherit colors shapes/square.png new file mode 100644 index 0000000000000000000000000000000000000000..dd6014c4262002add34f760d7190346347587f46 GIT binary patch literal 4084 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 literal 0 HcmV?d00001 diff --git a/tagstudio/tests/fixtures/search_library/inherit colors shapes/yellow.png b/tagstudio/tests/fixtures/search_library/inherit colors shapes/yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..38f2434e9706da6211115efb46183d7af693e43b GIT binary patch literal 3677 zcmd5j z6eTShp&JG05G5A zV7C?ej*~708R&Dfza$3$& zGnnSck@^cr1cPdh^fDr2$ZT6Mgy9gy0o|gU-Gie-gH5PNOAEM}hyW=F2YD2PC_IeG zC5X(CGkOWoZ|N}_iI}1ALd}uhWLJbOivuEzP(~;W(gKb!<4|dYt#&_u5r%f=$PgZn zO+cfCLLo|MfMRjzXsn5e2^xb#<8b;AL!TSTZluz3s?6Cu?} z31abi=13%jBmVL%oc&cfllvulC=X~6g^k9dFzD~e><|`@#SLNojmTGcjvy#ve2d`+ zGg4#@oyVa44PA=Np+mVQlm9u2@bDi3;qr(AC=p+h`h!D%#m#k(WP|9fAeY7G1cO8Y z$mD6ykl4V4F#!lV2*{I3ZoNZGSaL8bYR9(|LsWreXgkaJKB1~cZrK_pvSR}PED z2!k;0R(l%+iD+w#H8D2U$Dyz@TW4eGVeMqcFa-$UT@0=vHwvF3bpdf5V_4F&OlB zmVD-7(#AoU&6E?tfx+dmIFU0)v)$wdM$GPJw_%K#HbNj~iito8mU>{0WOGr<-+2k93~4F+$BjShKmqSBUeCd5k>KL#kBB6_uM zRMETl>f%Z-9v`<#<@PNLtu>y5%v_l-=Y;v2ABWTJifZYfM)>kB%Lq`=t33&p9qg_GqWBf4qPnP`VBz z@6An5Eeer*W(B^#^U|TH?y~B2bmE&{Ree)e)bi%8Qd7HDxcxDe|zx!T!%eBDIP3SyP~uP`FP91f*4FQdV7!^86fUGcEwJ?X0%yBtI@&6 z@X)|Dog_qc^}BmRsP66KSzW3IM^Hmzf$;tDClf_lwB82Ou^VI2DLZ>7PUd6Nl@e7F z>R_3sdU5JYt(27ziSlZfW%f{DS55*!-T?N0d;H9CBJIeLw<##a#=eD@-x5E=hr)}~ zfdiTA-sz=!bFgrDLjJu>9QhS1bE-8Bmv>F&#m&~@pA8;o>J&LL&i;9$;jx>B25xCa zsqR}PyQhoJ8e+q;9L~KuutR=(z3sntgRL&S;kqgOI!q0Ie^bEc7|EdT5Q`bP zVCzwFbFx=|n-GTY(i6rmc|G}hJPcByFr&W+IuY5Scz zh6HkxZ;xz30?M*g+tYf2`gF}%A*Vy9*EzL!hiWIO9s=Gfog9s+IPLhb%Csh&tK2Bj zKUF`x|N61pz~X4RI9IiRBN)!@2S}K^=Z1!;swlqn_|xHp7SX*UhX{q*2 zi~I8*k7?AzUCNEofIDh?Rp+JwYd3G*`JNVin71;&z~0K*dO)WAS8@KHB(H(HZ;F$* zgl-cETa#Z8P0*+F7t@<#Q;OFvPX-!CHxfaQk!O#LJBQ6JcPy*zU$w6MVxAnk(nm(! z+!J=IcP&g#wkD3^E(7#fkTonxu+jI+PQ_a+YHT?FroetPpsL?hsg8Zw&|g#gV9R0e z;{#Ew$GVj#Q&z5|($%2^Ma%IV05Y8nXxnd$GuM!xT-a!|DE-Q7<#e8GA${)>mwWNs zTJ9c8=d{ifj9(bPXx%jh!#|2|O0ae^t15jyzN22T>R7vLxEKt>dwlZ6E`{4Q7)emA9#B4jBd$ig62A(O~ zqzT)>SbHzpGW#W?EQF6d~T~EzO|JW(8 zKG1S9tFkn6``wtM^*!CSV#0^?jC4gn|9ZPG->FqT?umAKim`pcmdK}Bih1~CJ>}&+ z`wpA52(mXVb}N}8>jj|B_~+kzq*JV?Ti&~~W{WQ=E@Ne8#&02V^p(^`)xyk#)$uYM z&Y(2eX2%o z(qGHoB`8P5Q0Di37?4v~r#jNGWGE0X+!cEDw7c$!V;#bweHs=aKTV3F0~Wumu#8O& z{n*xSu9T+;y8a0QcG9gHWL zAE!>2`yU_ub#OJQj@yWS7NLmP=!a)b<;+`-vn!ma+Yl_1b?3~gl00kq|Fb7#_A#53 Ye;w=D=3r2tD*abTB0Aeu+H4d58=VKXmjD0& literal 0 HcmV?d00001 diff --git a/tagstudio/tests/fixtures/search_library/inherit colors shapes/yellow_circle.png b/tagstudio/tests/fixtures/search_library/inherit colors shapes/yellow_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..5d4666dd966f3013148016799125c997c273bd8f GIT binary patch literal 6656 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 bq(kC2_S;JSH-euX|8b+EVW?iO>J;@q=o5&7 literal 0 HcmV?d00001 diff --git a/tagstudio/tests/fixtures/search_library/inherit colors shapes/yellow_ellipse.png b/tagstudio/tests/fixtures/search_library/inherit colors shapes/yellow_ellipse.png new file mode 100644 index 0000000000000000000000000000000000000000..c1950355e0e2aa92e8003dbfac337250932e169b GIT binary patch literal 6310 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 literal 0 HcmV?d00001 diff --git a/tagstudio/tests/fixtures/search_library/inherit colors shapes/yellow_square.png b/tagstudio/tests/fixtures/search_library/inherit colors shapes/yellow_square.png new file mode 100644 index 0000000000000000000000000000000000000000..3080357d8d5670cba72ad8098f92ef1687c70143 GIT binary patch literal 3878 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 IVD1<5Uv^ Date: Mon, 9 Dec 2024 11:44:51 -0800 Subject: [PATCH 67/82] fix: don't allow blank tag alias values in db (#628) --- tagstudio/src/core/library/alchemy/library.py | 5 +++++ tagstudio/src/core/library/alchemy/models.py | 2 +- tagstudio/src/qt/widgets/migration_modal.py | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/tagstudio/src/core/library/alchemy/library.py b/tagstudio/src/core/library/alchemy/library.py index 56b114ff..a2734b1b 100644 --- a/tagstudio/src/core/library/alchemy/library.py +++ b/tagstudio/src/core/library/alchemy/library.py @@ -169,6 +169,8 @@ class Library: # Tag Aliases for tag in json_lib.tags: for alias in tag.aliases: + if not alias: + break self.add_alias(name=alias, tag_id=tag.id) # Tag Subtags @@ -1015,6 +1017,9 @@ class Library: def add_alias(self, name: str, tag_id: int) -> bool: with Session(self.engine) as session: + if not name: + logger.warning("[LIBRARY][add_alias] Alias value must not be empty") + return False alias = TagAlias( name=name, tag_id=tag_id, diff --git a/tagstudio/src/core/library/alchemy/models.py b/tagstudio/src/core/library/alchemy/models.py index 8da0c470..1c06e0fd 100644 --- a/tagstudio/src/core/library/alchemy/models.py +++ b/tagstudio/src/core/library/alchemy/models.py @@ -23,7 +23,7 @@ class TagAlias(Base): id: Mapped[int] = mapped_column(primary_key=True) - name: Mapped[str] + name: Mapped[str] = mapped_column(nullable=False) tag_id: Mapped[int] = mapped_column(ForeignKey("tags.id")) tag: Mapped["Tag"] = relationship(back_populates="aliases") diff --git a/tagstudio/src/qt/widgets/migration_modal.py b/tagstudio/src/qt/widgets/migration_modal.py index 2af7d94a..a2978f56 100644 --- a/tagstudio/src/qt/widgets/migration_modal.py +++ b/tagstudio/src/qt/widgets/migration_modal.py @@ -699,7 +699,7 @@ class JsonMigrationModal(QObject): sql_aliases = set( session.scalars(select(TagAlias.name).where(TagAlias.tag_id == tag.id)) ) - json_aliases = set(self.json_lib.get_tag(tag_id).aliases) + json_aliases = set([x for x in self.json_lib.get_tag(tag_id).aliases if x]) logger.info( "[Alias Parity]", From a1daf5ab6ac6420566fe3b31ab44e924740980c3 Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Mon, 9 Dec 2024 11:51:36 -0800 Subject: [PATCH 68/82] fix: use absolute ffprobe path on macos (Fix #511) (#629) * bump pyside version to 6.8.0.1 * fix: try for absolute ffprobe path on macos --- requirements.txt | 6 +++--- tagstudio/src/qt/helpers/vendored/ffmpeg.py | 23 ++++++++++++++++++++- tagstudio/src/qt/widgets/thumb_renderer.py | 12 +++++------ 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/requirements.txt b/requirements.txt index c2ca5132..9eb29039 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,9 +8,9 @@ pillow-heif==0.16.0 pillow-jxl-plugin==1.3.0 Pillow==10.3.0 pydub==0.25.1 -PySide6_Addons==6.7.1 -PySide6_Essentials==6.7.1 -PySide6==6.7.1 +PySide6_Addons==6.8.0.1 +PySide6_Essentials==6.8.0.1 +PySide6==6.8.0.1 rawpy==0.22.0 SQLAlchemy==2.0.34 structlog==24.4.0 diff --git a/tagstudio/src/qt/helpers/vendored/ffmpeg.py b/tagstudio/src/qt/helpers/vendored/ffmpeg.py index 097e78a2..05e1d258 100644 --- a/tagstudio/src/qt/helpers/vendored/ffmpeg.py +++ b/tagstudio/src/qt/helpers/vendored/ffmpeg.py @@ -3,13 +3,34 @@ # Vendored from ffmpeg-python and ffmpeg-python PR#790 by amamic1803 import json +import platform +import shutil import subprocess import ffmpeg +import structlog from src.qt.helpers.silent_popen import promptless_Popen +logger = structlog.get_logger(__name__) -def _probe(filename, cmd="ffprobe", timeout=None, **kwargs): +FFMPEG_MACOS_LOCATIONS: list[str] = ["", "/opt/homebrew/bin/", "/usr/local/bin/"] + + +def _get_ffprobe_location() -> str: + cmd: str = "ffprobe" + if platform.system() == "Darwin": + for loc in FFMPEG_MACOS_LOCATIONS: + if shutil.which(loc + cmd): + cmd = loc + cmd + break + logger.info(f"[FFPROBE] Using FFmpeg location: {cmd}") + return cmd + + +FFPROBE_CMD = _get_ffprobe_location() + + +def _probe(filename, cmd=FFPROBE_CMD, timeout=None, **kwargs): """Run ffprobe on the specified file and return a JSON representation of the output. Raises: diff --git a/tagstudio/src/qt/widgets/thumb_renderer.py b/tagstudio/src/qt/widgets/thumb_renderer.py index f78724ae..ac0abb96 100644 --- a/tagstudio/src/qt/widgets/thumb_renderer.py +++ b/tagstudio/src/qt/widgets/thumb_renderer.py @@ -812,8 +812,8 @@ class ThumbRenderer(QObject): """ im: Image.Image = None # Create an image to draw the svg to and a painter to do the drawing - image: QImage = QImage(size, size, QImage.Format.Format_ARGB32) - image.fill("#1e1e1e") + q_image: QImage = QImage(size, size, QImage.Format.Format_ARGB32) + q_image.fill("#1e1e1e") # Create an svg renderer, then render to the painter svg: QSvgRenderer = QSvgRenderer(str(filepath)) @@ -821,7 +821,7 @@ class ThumbRenderer(QObject): if not svg.isValid(): raise UnidentifiedImageError - painter: QPainter = QPainter(image) + painter: QPainter = QPainter(q_image) svg.setAspectRatioMode(Qt.AspectRatioMode.KeepAspectRatio) svg.render(painter) painter.end() @@ -829,7 +829,7 @@ class ThumbRenderer(QObject): # Write the image to a buffer as png buffer: QBuffer = QBuffer() buffer.open(QBuffer.OpenModeFlag.ReadWrite) - image.save(buffer, "PNG") + q_image.save(buffer, "PNG") # type: ignore[call-overload] # Load the image from the buffer im = Image.new("RGB", (size, size), color="#1e1e1e") @@ -907,11 +907,11 @@ class ThumbRenderer(QObject): | QPdfDocumentRenderOptions.RenderFlag.PathAliased ) # Convert QImage to PIL Image - qimage: QImage = document.render(0, page_size.toSize(), render_options) + q_image: QImage = document.render(0, page_size.toSize(), render_options) buffer: QBuffer = QBuffer() buffer.open(QBuffer.OpenModeFlag.ReadWrite) try: - qimage.save(buffer, "PNG") + q_image.save(buffer, "PNG") # type: ignore[call-overload] im = Image.open(BytesIO(buffer.buffer().data())) finally: buffer.close() From 385aaf42d8c0bd791a4b5eaee2bda1a6379fc794 Mon Sep 17 00:00:00 2001 From: Sean Krueger Date: Wed, 11 Dec 2024 16:00:27 -0800 Subject: [PATCH 69/82] feat: reimplement drag drop files (Port #153) (#528) * feat: Drag and drop files in and out of TagStudio (#153) * Ability to drop local files in to TagStudio to add to library * Added renaming option to drop import * Improved readability and switched to pathLib * format * Apply suggestions from code review Co-authored-by: yed podtrzitko * Revert Change * Update tagstudio/src/qt/modals/drop_import.py Co-authored-by: yed podtrzitko * Added support for folders * formatting * Progress bars added * Added Ability to Drag out of window * f * format * Ability to drop local files in to TagStudio to add to library * Added renaming option to drop import * Improved readability and switched to pathLib * format * Apply suggestions from code review Co-authored-by: yed podtrzitko * Revert Change * Update tagstudio/src/qt/modals/drop_import.py Co-authored-by: yed podtrzitko * Added support for folders * formatting * Progress bars added * Added Ability to Drag out of window * f * format * format * formatting and refactor * format again * formatting for mypy * convert lambda to func for clarity * mypy fixes * fixed dragout only worked on selected * Refactor typo, Add license * Reformat QMessageBox * Disable drops when no library is open Co-authored-by: Sean Krueger * Rebased onto SQL migration * Updated logic to based on selected grid_idx instead of selected ids * Add newly dragged-in files to SQL database * Fix buttons being inconsistant across platforms * Fix ruff formatting * Rename "override" button to "overwrite" --------- Co-authored-by: yed podtrzitko Co-authored-by: Travis Abendshien Co-authored-by: Sean Krueger * refactor: Update dialog and simplify drop import logic * Handle Qt events for main window in ts_qt.py * Replace magic values with enums * Match import duplicate file dialog to delete missing entry dialog * Remove excessive progess widgets * Add docstrings and logging * refactor: add function for common ProgressWidget use Extracts the create_progress_bar function from drop_import to the ProgressWidget class. Instead of creating a ProgressWidget, FunctionIterator, and CustomRunnable every time a thread-safe progress widget is needed, the from_iterable function in ProgressWidget now handles all of that. --------- Co-authored-by: Creepler13 Co-authored-by: yed podtrzitko Co-authored-by: Travis Abendshien --- tagstudio/src/qt/modals/delete_unlinked.py | 31 +-- tagstudio/src/qt/modals/drop_import.py | 229 ++++++++++++++++++ tagstudio/src/qt/modals/fix_unlinked.py | 32 +-- tagstudio/src/qt/modals/merge_dupe_entries.py | 16 +- tagstudio/src/qt/modals/mirror_entities.py | 30 +-- tagstudio/src/qt/modals/relink_unlinked.py | 31 +-- tagstudio/src/qt/ts_qt.py | 68 +++--- tagstudio/src/qt/widgets/item_thumb.py | 31 ++- tagstudio/src/qt/widgets/progress.py | 30 ++- 9 files changed, 361 insertions(+), 137 deletions(-) create mode 100644 tagstudio/src/qt/modals/drop_import.py diff --git a/tagstudio/src/qt/modals/delete_unlinked.py b/tagstudio/src/qt/modals/delete_unlinked.py index 04b7f8f5..b382d083 100644 --- a/tagstudio/src/qt/modals/delete_unlinked.py +++ b/tagstudio/src/qt/modals/delete_unlinked.py @@ -4,7 +4,7 @@ import typing -from PySide6.QtCore import Qt, QThreadPool, Signal +from PySide6.QtCore import Qt, Signal from PySide6.QtGui import QStandardItem, QStandardItemModel from PySide6.QtWidgets import ( QHBoxLayout, @@ -15,8 +15,6 @@ from PySide6.QtWidgets import ( QWidget, ) from src.core.utils.missing_files import MissingRegistry -from src.qt.helpers.custom_runnable import CustomRunnable -from src.qt.helpers.function_iterator import FunctionIterator from src.qt.widgets.progress import ProgressWidget # Only import for type checking/autocompletion, will not be imported at runtime. @@ -77,9 +75,14 @@ class DeleteUnlinkedEntriesModal(QWidget): self.model.clear() for i in self.tracker.missing_files: - self.model.appendRow(QStandardItem(str(i.path))) + item = QStandardItem(str(i.path)) + item.setEditable(False) + self.model.appendRow(item) def delete_entries(self): + def displayed_text(x): + return f"Deleting {x}/{self.tracker.missing_files_count} Unlinked Entries" + pw = ProgressWidget( window_title="Deleting Entries", label_text="", @@ -87,23 +90,5 @@ class DeleteUnlinkedEntriesModal(QWidget): minimum=0, maximum=self.tracker.missing_files_count, ) - pw.show() - iterator = FunctionIterator(self.tracker.execute_deletion) - files_count = self.tracker.missing_files_count - iterator.value.connect( - lambda idx: ( - pw.update_progress(idx), - pw.update_label(f"Deleting {idx}/{files_count} Unlinked Entries"), - ) - ) - - r = CustomRunnable(iterator.run) - QThreadPool.globalInstance().start(r) - r.done.connect( - lambda: ( - pw.hide(), - pw.deleteLater(), - self.done.emit(), - ) - ) + pw.from_iterable_function(self.tracker.execute_deletion, displayed_text, self.done.emit) diff --git a/tagstudio/src/qt/modals/drop_import.py b/tagstudio/src/qt/modals/drop_import.py new file mode 100644 index 00000000..ec94a3e5 --- /dev/null +++ b/tagstudio/src/qt/modals/drop_import.py @@ -0,0 +1,229 @@ +# Licensed under the GPL-3.0 License. +# Created for TagStudio: https://github.com/CyanVoxel/TagStudio + +import enum +import shutil +from pathlib import Path +from typing import TYPE_CHECKING + +import structlog +from PySide6.QtCore import Qt, QUrl +from PySide6.QtGui import QStandardItem, QStandardItemModel +from PySide6.QtWidgets import ( + QHBoxLayout, + QLabel, + QListView, + QPushButton, + QVBoxLayout, + QWidget, +) +from src.qt.widgets.progress import ProgressWidget + +if TYPE_CHECKING: + from src.qt.ts_qt import QtDriver + +logger = structlog.get_logger(__name__) + + +class DuplicateChoice(enum.StrEnum): + SKIP = "Skipped" + OVERWRITE = "Overwritten" + RENAME = "Renamed" + CANCEL = "Cancelled" + + +class DropImportModal(QWidget): + DUPE_NAME_LIMT: int = 5 + + def __init__(self, driver: "QtDriver"): + super().__init__() + + self.driver: QtDriver = driver + + # Widget ====================== + self.setWindowTitle("Conflicting File(s)") + self.setWindowModality(Qt.WindowModality.ApplicationModal) + self.setMinimumSize(500, 400) + self.root_layout = QVBoxLayout(self) + self.root_layout.setContentsMargins(6, 6, 6, 6) + + self.desc_widget = QLabel() + self.desc_widget.setObjectName("descriptionLabel") + self.desc_widget.setWordWrap(True) + self.desc_widget.setText("The following files have filenames already exist in the library") + self.desc_widget.setAlignment(Qt.AlignmentFlag.AlignCenter) + + # Duplicate File List ======== + self.list_view = QListView() + self.model = QStandardItemModel() + self.list_view.setModel(self.model) + + # Buttons ==================== + self.button_container = QWidget() + self.button_layout = QHBoxLayout(self.button_container) + self.button_layout.setContentsMargins(6, 6, 6, 6) + self.button_layout.addStretch(1) + + self.skip_button = QPushButton() + self.skip_button.setText("&Skip") + self.skip_button.setDefault(True) + self.skip_button.clicked.connect(lambda: self.begin_transfer(DuplicateChoice.SKIP)) + self.button_layout.addWidget(self.skip_button) + + self.overwrite_button = QPushButton() + self.overwrite_button.setText("&Overwrite") + self.overwrite_button.clicked.connect( + lambda: self.begin_transfer(DuplicateChoice.OVERWRITE) + ) + self.button_layout.addWidget(self.overwrite_button) + + self.rename_button = QPushButton() + self.rename_button.setText("&Rename") + self.rename_button.clicked.connect(lambda: self.begin_transfer(DuplicateChoice.RENAME)) + self.button_layout.addWidget(self.rename_button) + + self.cancel_button = QPushButton() + self.cancel_button.setText("&Cancel") + self.cancel_button.clicked.connect(lambda: self.begin_transfer(DuplicateChoice.CANCEL)) + self.button_layout.addWidget(self.cancel_button) + + # Layout ===================== + self.root_layout.addWidget(self.desc_widget) + self.root_layout.addWidget(self.list_view) + self.root_layout.addWidget(self.button_container) + + def import_urls(self, urls: list[QUrl]): + """Add a colleciton of urls to the library.""" + self.files: list[Path] = [] + self.dirs_in_root: list[Path] = [] + self.duplicate_files: list[Path] = [] + + self.collect_files_to_import(urls) + + if len(self.duplicate_files) > 0: + self.ask_duplicates_choice() + else: + self.begin_transfer() + + def collect_files_to_import(self, urls: list[QUrl]): + """Collect one or more files from drop event urls.""" + for url in urls: + if not url.isLocalFile(): + continue + + file = Path(url.toLocalFile()) + + if file.is_dir(): + for f in file.glob("**/*"): + if f.is_dir(): + continue + + self.files.append(f) + if (self.driver.lib.library_dir / self._get_relative_path(file)).exists(): + self.duplicate_files.append(f) + + self.dirs_in_root.append(file.parent) + else: + self.files.append(file) + + if file.parent not in self.dirs_in_root: + self.dirs_in_root.append( + file.parent + ) # to create relative path of files not in folder + + if (Path(self.driver.lib.library_dir) / file.name).exists(): + self.duplicate_files.append(file) + + def ask_duplicates_choice(self): + """Display the message widgeth with a list of the duplicated files.""" + self.desc_widget.setText( + f"The following {len(self.duplicate_files)} file(s) have filenames already exist in the library." # noqa: E501 + ) + + self.model.clear() + for dupe in self.duplicate_files: + item = QStandardItem(str(self._get_relative_path(dupe))) + item.setEditable(False) + self.model.appendRow(item) + + self.driver.main_window.raise_() + self.show() + + def begin_transfer(self, choice: DuplicateChoice | None = None): + """Display a progress bar and begin copying files into library.""" + self.hide() + self.choice: DuplicateChoice | None = choice + logger.info("duplicated choice selected", choice=self.choice) + if self.choice == DuplicateChoice.CANCEL: + return + + def displayed_text(x): + text = ( + f"Importing New Files...\n{x[0] + 1} File{'s' if x[0] + 1 != 1 else ''} Imported." + ) + if self.choice: + text += f" {x[1]} {self.choice.value}" + + return text + + pw = ProgressWidget( + window_title="Import Files", + label_text="Importing New Files...", + cancel_button_text=None, + minimum=0, + maximum=len(self.files), + ) + + pw.from_iterable_function( + self.copy_files, + displayed_text, + self.driver.add_new_files_callback, + self.deleteLater, + ) + + def copy_files(self): + """Copy files from original location to the library directory.""" + file_count = 0 + duplicated_files_progress = 0 + for file in self.files: + if file.is_dir(): + continue + + dest_file = self._get_relative_path(file) + + if file in self.duplicate_files: + duplicated_files_progress += 1 + if self.choice == DuplicateChoice.SKIP: + file_count += 1 + continue + elif self.choice == DuplicateChoice.RENAME: + new_name = self._get_renamed_duplicate_filename(dest_file) + dest_file = dest_file.with_name(new_name) + + (self.driver.lib.library_dir / dest_file).parent.mkdir(parents=True, exist_ok=True) + shutil.copyfile(file, self.driver.lib.library_dir / dest_file) + + file_count += 1 + yield [file_count, duplicated_files_progress] + + def _get_relative_path(self, path: Path) -> Path: + for dir in self.dirs_in_root: + if path.is_relative_to(dir): + return path.relative_to(dir) + return Path(path.name) + + def _get_renamed_duplicate_filename(self, filepath: Path) -> str: + index = 2 + o_filename = filepath.name + + try: + dot_idx = o_filename.index(".") + except ValueError: + dot_idx = len(o_filename) + + while (self.driver.lib.library_dir / filepath).exists(): + filepath = filepath.with_name( + o_filename[:dot_idx] + f" ({index})" + o_filename[dot_idx:] + ) + index += 1 + return filepath.name diff --git a/tagstudio/src/qt/modals/fix_unlinked.py b/tagstudio/src/qt/modals/fix_unlinked.py index 0e51144f..3c4627df 100644 --- a/tagstudio/src/qt/modals/fix_unlinked.py +++ b/tagstudio/src/qt/modals/fix_unlinked.py @@ -5,12 +5,10 @@ import typing -from PySide6.QtCore import Qt, QThreadPool +from PySide6.QtCore import Qt from PySide6.QtWidgets import QHBoxLayout, QLabel, QPushButton, QVBoxLayout, QWidget from src.core.library import Library from src.core.utils.missing_files import MissingRegistry -from src.qt.helpers.custom_runnable import CustomRunnable -from src.qt.helpers.function_iterator import FunctionIterator from src.qt.modals.delete_unlinked import DeleteUnlinkedEntriesModal from src.qt.modals.merge_dupe_entries import MergeDuplicateEntries from src.qt.modals.relink_unlinked import RelinkUnlinkedEntries @@ -85,7 +83,7 @@ class FixUnlinkedEntriesModal(QWidget): self.delete_modal = DeleteUnlinkedEntriesModal(self.driver, self.tracker) self.delete_modal.done.connect( lambda: ( - self.set_missing_count(self.tracker.missing_files_count), + self.set_missing_count(), # refresh the grid self.driver.filter_items(), ) @@ -125,23 +123,19 @@ class FixUnlinkedEntriesModal(QWidget): maximum=self.lib.entries_count, ) - pw.show() - - iterator = FunctionIterator(self.tracker.refresh_missing_files) - iterator.value.connect(lambda v: pw.update_progress(v + 1)) - r = CustomRunnable(iterator.run) - QThreadPool.globalInstance().start(r) - r.done.connect( - lambda: ( - pw.hide(), - pw.deleteLater(), - self.set_missing_count(self.tracker.missing_files_count), - self.delete_modal.refresh_list(), - ) + pw.from_iterable_function( + self.tracker.refresh_missing_files, + None, + self.set_missing_count, + self.delete_modal.refresh_list, ) - def set_missing_count(self, count: int): - self.missing_count = count + def set_missing_count(self, count: int | None = None): + if count is not None: + self.missing_count = count + else: + self.missing_count = self.tracker.missing_files_count + if self.missing_count < 0: self.search_button.setDisabled(True) self.delete_button.setDisabled(True) diff --git a/tagstudio/src/qt/modals/merge_dupe_entries.py b/tagstudio/src/qt/modals/merge_dupe_entries.py index cc81949d..66c94dda 100644 --- a/tagstudio/src/qt/modals/merge_dupe_entries.py +++ b/tagstudio/src/qt/modals/merge_dupe_entries.py @@ -4,11 +4,9 @@ import typing -from PySide6.QtCore import QObject, QThreadPool, Signal +from PySide6.QtCore import QObject, Signal from src.core.library import Library from src.core.utils.dupe_files import DupeRegistry -from src.qt.helpers.custom_runnable import CustomRunnable -from src.qt.helpers.function_iterator import FunctionIterator from src.qt.widgets.progress import ProgressWidget # Only import for type checking/autocompletion, will not be imported at runtime. @@ -26,20 +24,12 @@ class MergeDuplicateEntries(QObject): self.tracker = DupeRegistry(library=self.lib) def merge_entries(self): - iterator = FunctionIterator(self.tracker.merge_dupe_entries) - pw = ProgressWidget( window_title="Merging Duplicate Entries", - label_text="", + label_text="Merging Duplicate Entries...", cancel_button_text=None, minimum=0, maximum=self.tracker.groups_count, ) - pw.show() - iterator.value.connect(lambda x: pw.update_progress(x)) - iterator.value.connect(lambda: (pw.update_label("Merging Duplicate Entries..."))) - - r = CustomRunnable(iterator.run) - r.done.connect(lambda: (pw.hide(), pw.deleteLater(), self.done.emit())) - QThreadPool.globalInstance().start(r) + pw.from_iterable_function(self.tracker.merge_dupe_entries, None, self.done.emit) diff --git a/tagstudio/src/qt/modals/mirror_entities.py b/tagstudio/src/qt/modals/mirror_entities.py index d7178ec4..6ab19957 100644 --- a/tagstudio/src/qt/modals/mirror_entities.py +++ b/tagstudio/src/qt/modals/mirror_entities.py @@ -6,7 +6,7 @@ import typing from time import sleep -from PySide6.QtCore import Qt, QThreadPool, Signal +from PySide6.QtCore import Qt, Signal from PySide6.QtGui import QStandardItem, QStandardItemModel from PySide6.QtWidgets import ( QHBoxLayout, @@ -17,8 +17,6 @@ from PySide6.QtWidgets import ( QWidget, ) from src.core.utils.dupe_files import DupeRegistry -from src.qt.helpers.custom_runnable import CustomRunnable -from src.qt.helpers.function_iterator import FunctionIterator from src.qt.widgets.progress import ProgressWidget # Only import for type checking/autocompletion, will not be imported at runtime. @@ -83,28 +81,22 @@ class MirrorEntriesModal(QWidget): self.model.appendRow(QStandardItem(str(i))) def mirror_entries(self): - iterator = FunctionIterator(self.mirror_entries_runnable) + def displayed_text(x): + return f"Mirroring {x + 1}/{self.tracker.groups_count} Entries..." + pw = ProgressWidget( window_title="Mirroring Entries", - label_text=f"Mirroring 1/{self.tracker.groups_count} Entries...", + label_text="", cancel_button_text=None, minimum=0, maximum=self.tracker.groups_count, ) - pw.show() - iterator.value.connect(lambda x: pw.update_progress(x + 1)) - iterator.value.connect( - lambda x: pw.update_label(f"Mirroring {x + 1}/{self.tracker.groups_count} Entries...") - ) - r = CustomRunnable(iterator.run) - QThreadPool.globalInstance().start(r) - r.done.connect( - lambda: ( - pw.hide(), - pw.deleteLater(), - self.driver.preview_panel.update_widgets(), - self.done.emit(), - ) + + pw.from_iterable_function( + self.mirror_entries_runnable, + displayed_text, + self.driver.preview_panel.update_widgets, + self.done.emit, ) def mirror_entries_runnable(self): diff --git a/tagstudio/src/qt/modals/relink_unlinked.py b/tagstudio/src/qt/modals/relink_unlinked.py index e567f8b5..ab2a1d40 100644 --- a/tagstudio/src/qt/modals/relink_unlinked.py +++ b/tagstudio/src/qt/modals/relink_unlinked.py @@ -3,10 +3,8 @@ # Created for TagStudio: https://github.com/CyanVoxel/TagStudio -from PySide6.QtCore import QObject, QThreadPool, Signal +from PySide6.QtCore import QObject, Signal from src.core.utils.missing_files import MissingRegistry -from src.qt.helpers.custom_runnable import CustomRunnable -from src.qt.helpers.function_iterator import FunctionIterator from src.qt.widgets.progress import ProgressWidget @@ -18,7 +16,10 @@ class RelinkUnlinkedEntries(QObject): self.tracker = tracker def repair_entries(self): - iterator = FunctionIterator(self.tracker.fix_missing_files) + def displayed_text(x): + text = f"Attempting to Relink {x}/{self.tracker.missing_files_count} Entries. \n" + text += f"{self.tracker.files_fixed_count} Successfully Relinked." + return text pw = ProgressWidget( window_title="Relinking Entries", @@ -28,24 +29,4 @@ class RelinkUnlinkedEntries(QObject): maximum=self.tracker.missing_files_count, ) - pw.show() - - iterator.value.connect( - lambda idx: ( - pw.update_progress(idx), - pw.update_label( - f"Attempting to Relink {idx}/{self.tracker.missing_files_count} Entries. " - f"{self.tracker.files_fixed_count} Successfully Relinked." - ), - ) - ) - - r = CustomRunnable(iterator.run) - r.done.connect( - lambda: ( - pw.hide(), - pw.deleteLater(), - self.done.emit(), - ) - ) - QThreadPool.globalInstance().start(r) + pw.from_iterable_function(self.tracker.fix_missing_files, displayed_text, self.done.emit) diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index 4e3cfaed..a16f8910 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -37,6 +37,9 @@ from PySide6.QtCore import ( from PySide6.QtGui import ( QAction, QColor, + QDragEnterEvent, + QDragMoveEvent, + QDropEvent, QFontDatabase, QGuiApplication, QIcon, @@ -82,6 +85,7 @@ from src.qt.helpers.custom_runnable import CustomRunnable from src.qt.helpers.function_iterator import FunctionIterator from src.qt.main_window import Ui_MainWindow from src.qt.modals.build_tag import BuildTagPanel +from src.qt.modals.drop_import import DropImportModal from src.qt.modals.file_extension import FileExtensionModal from src.qt.modals.fix_dupes import FixDupeFilesModal from src.qt.modals.fix_unlinked import FixUnlinkedEntriesModal @@ -234,19 +238,10 @@ class QtDriver(DriverMixin, QObject): # self.main_window = loader.load(home_path) self.main_window = Ui_MainWindow(self) self.main_window.setWindowTitle(self.base_title) - self.main_window.mousePressEvent = self.mouse_navigation # type: ignore - # self.main_window.setStyleSheet( - # f'QScrollBar::{{background:red;}}' - # ) - - # # self.main_window.windowFlags() & - # # self.main_window.setWindowFlag(Qt.WindowType.FramelessWindowHint, True) - # self.main_window.setWindowFlag(Qt.WindowType.NoDropShadowWindowHint, True) - # self.main_window.setWindowFlag(Qt.WindowType.WindowTransparentForInput, False) - # self.main_window.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground) - - # self.windowFX = WindowEffect() - # self.windowFX.setAcrylicEffect(self.main_window.winId()) + self.main_window.mousePressEvent = self.mouse_navigation # type: ignore[method-assign] + self.main_window.dragEnterEvent = self.drag_enter_event # type: ignore[method-assign] + self.main_window.dragMoveEvent = self.drag_move_event # type: ignore[method-assign] + self.main_window.dropEvent = self.drop_event # type: ignore[method-assign] splash_pixmap = QPixmap(":/images/splash.png") splash_pixmap.setDevicePixelRatio(self.main_window.devicePixelRatio()) @@ -716,26 +711,6 @@ class QtDriver(DriverMixin, QObject): Threaded method. """ - # pb = QProgressDialog( - # f"Running Configured Macros on 1/{len(new_ids)} New Entries", None, 0, len(new_ids) - # ) - # pb.setFixedSize(432, 112) - # pb.setWindowFlags(pb.windowFlags() & ~Qt.WindowType.WindowCloseButtonHint) - # pb.setWindowTitle('Running Macros') - # pb.setWindowModality(Qt.WindowModality.ApplicationModal) - # pb.show() - - # r = CustomRunnable(lambda: self.new_file_macros_runnable(pb, new_ids)) - # r.done.connect(lambda: (pb.hide(), pb.deleteLater(), self.filter_items(''))) - # r.run() - # # QThreadPool.globalInstance().start(r) - - # # self.main_window.statusbar.showMessage( - # # f"Running configured Macros on {len(new_ids)} new Entries...", 3 - # # ) - - # # pb.hide() - files_count = tracker.files_count iterator = FunctionIterator(tracker.save_new_files) @@ -747,6 +722,7 @@ class QtDriver(DriverMixin, QObject): maximum=files_count, ) pw.show() + iterator.value.connect( lambda x: ( pw.update_progress(x + 1), @@ -905,6 +881,7 @@ class QtDriver(DriverMixin, QObject): item_thumb = ItemThumb( None, self.lib, self, (self.thumb_size, self.thumb_size), grid_idx ) + layout.addWidget(item_thumb) self.item_thumbs.append(item_thumb) @@ -1234,6 +1211,7 @@ class QtDriver(DriverMixin, QObject): self.update_libs_list(path) title_text = f"{self.base_title} - Library '{self.lib.library_dir}'" self.main_window.setWindowTitle(title_text) + self.main_window.setAcceptDrops(True) self.selected.clear() self.preview_panel.update_widgets() @@ -1243,3 +1221,27 @@ class QtDriver(DriverMixin, QObject): self.main_window.toggle_landing_page(enabled=False) return open_status + + def drop_event(self, event: QDropEvent): + if event.source() is self: + return + + if not event.mimeData().hasUrls(): + return + + urls = event.mimeData().urls() + logger.info("New items dragged in", urls=urls) + drop_import = DropImportModal(self) + drop_import.import_urls(urls) + + def drag_enter_event(self, event: QDragEnterEvent): + if event.mimeData().hasUrls(): + event.accept() + else: + event.ignore() + + def drag_move_event(self, event: QDragMoveEvent): + if event.mimeData().hasUrls(): + event.accept() + else: + event.ignore() diff --git a/tagstudio/src/qt/widgets/item_thumb.py b/tagstudio/src/qt/widgets/item_thumb.py index 07bf4862..ab8b44ef 100644 --- a/tagstudio/src/qt/widgets/item_thumb.py +++ b/tagstudio/src/qt/widgets/item_thumb.py @@ -10,8 +10,8 @@ from typing import TYPE_CHECKING import structlog from PIL import Image, ImageQt -from PySide6.QtCore import QEvent, QSize, Qt -from PySide6.QtGui import QAction, QEnterEvent, QPixmap +from PySide6.QtCore import QEvent, QMimeData, QSize, Qt, QUrl +from PySide6.QtGui import QAction, QDrag, QEnterEvent, QPixmap from PySide6.QtWidgets import ( QBoxLayout, QCheckBox, @@ -127,6 +127,7 @@ class ItemThumb(FlowWidget): self.thumb_size: tuple[int, int] = thumb_size self.setMinimumSize(*thumb_size) self.setMaximumSize(*thumb_size) + self.setMouseTracking(True) check_size = 24 # +----------+ @@ -480,3 +481,29 @@ class ItemThumb(FlowWidget): if self.driver.preview_panel.is_open: self.driver.preview_panel.update_widgets() + + def mouseMoveEvent(self, event): # noqa: N802 + if event.buttons() is not Qt.MouseButton.LeftButton: + return + + drag = QDrag(self.driver) + paths = [] + mimedata = QMimeData() + + selected_idxs = self.driver.selected + if self.grid_idx not in selected_idxs: + selected_idxs = [self.grid_idx] + + for grid_idx in selected_idxs: + id = self.driver.item_thumbs[grid_idx].item_id + entry = self.lib.get_entry(id) + if not entry: + continue + + url = QUrl.fromLocalFile(Path(self.lib.library_dir) / entry.path) + paths.append(url) + + mimedata.setUrls(paths) + drag.setMimeData(mimedata) + drag.exec(Qt.DropAction.CopyAction) + logger.info("dragged files to external program", thumbnail_indexs=selected_idxs) diff --git a/tagstudio/src/qt/widgets/progress.py b/tagstudio/src/qt/widgets/progress.py index 8adfb094..f9247ebd 100644 --- a/tagstudio/src/qt/widgets/progress.py +++ b/tagstudio/src/qt/widgets/progress.py @@ -2,11 +2,12 @@ # Licensed under the GPL-3.0 License. # Created for TagStudio: https://github.com/CyanVoxel/TagStudio +from typing import Callable, Optional -from typing import Optional - -from PySide6.QtCore import Qt +from PySide6.QtCore import Qt, QThreadPool from PySide6.QtWidgets import QProgressDialog, QVBoxLayout, QWidget +from src.qt.helpers.custom_runnable import CustomRunnable +from src.qt.helpers.function_iterator import FunctionIterator class ProgressWidget(QWidget): @@ -39,3 +40,26 @@ class ProgressWidget(QWidget): def update_progress(self, value: int): self.pb.setValue(value) + + def _update_progress_unknown_iterable(self, value): + if hasattr(value, "__getitem__"): + self.update_progress(value[0] + 1) + else: + self.update_progress(value + 1) + + def from_iterable_function( + self, function: Callable, update_label_callback: Callable | None, *done_callbacks + ): + """Display the progress widget from a threaded iterable function.""" + iterator = FunctionIterator(function) + iterator.value.connect(lambda x: self._update_progress_unknown_iterable(x)) + if update_label_callback: + iterator.value.connect(lambda x: self.update_label(update_label_callback(x))) + + self.show() + + r = CustomRunnable(lambda: iterator.run()) + r.done.connect( + lambda: (self.hide(), self.deleteLater(), [callback() for callback in done_callbacks]) + ) + QThreadPool.globalInstance().start(r) From a519c9a737f4bda19dafe9c9f1cf17afe6c00618 Mon Sep 17 00:00:00 2001 From: python357-1 <30739625+python357-1@users.noreply.github.com> Date: Wed, 11 Dec 2024 19:04:53 -0600 Subject: [PATCH 70/82] chore: update pytest workflow to 24.04 (#639) * fix: try fixing pytest workflow * chore: update pytest workflow to 24.04 * fix: fix libglx package name * fix: try a different package * fix: try apt-update first * Revert "fix: try apt-update first" This reverts commit 34c04f985b30a600328d55b70faa39113c3d0cc9. * Reapply "fix: try apt-update first" This reverts commit 775bc2634d27801a5a4e80b46dad7c70d5136f10. --- .github/workflows/pytest.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pytest.yaml b/.github/workflows/pytest.yaml index bb266050..6788cce4 100644 --- a/.github/workflows/pytest.yaml +++ b/.github/workflows/pytest.yaml @@ -5,7 +5,7 @@ on: [ push, pull_request ] jobs: pytest: name: Run tests - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - name: Checkout repo @@ -20,11 +20,12 @@ jobs: - name: Install system dependencies run: | # dont run update, it is slow - # sudo apt-get update + sudo apt-get update sudo apt-get install -y --no-install-recommends \ libxkbcommon-x11-0 \ x11-utils \ libyaml-dev \ + libgl1 \ libegl1 \ libxcb-icccm4 \ libxcb-image0 \ From dec9f1dd28f8f14e4459a1c57958a22c1cf3bd78 Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Wed, 11 Dec 2024 18:28:09 -0800 Subject: [PATCH 71/82] docs: add additional detail to ffmpeg help --- docs/assets/ffmpeg_windows_download.png | Bin 0 -> 55250 bytes docs/help/ffmpeg.md | 31 +++++++++++++++++------- 2 files changed, 22 insertions(+), 9 deletions(-) create mode 100644 docs/assets/ffmpeg_windows_download.png diff --git a/docs/assets/ffmpeg_windows_download.png b/docs/assets/ffmpeg_windows_download.png new file mode 100644 index 0000000000000000000000000000000000000000..3a079d9e0aea776e7780b00a5ab373ddb9dd3adf GIT binary patch literal 55250 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

    j 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/help/ffmpeg.md b/docs/help/ffmpeg.md index 4678de3f..a5e52513 100644 --- a/docs/help/ffmpeg.md +++ b/docs/help/ffmpeg.md @@ -3,19 +3,29 @@ FFmpeg is required for thumbnail previews and playback features on audio and video files. FFmpeg is a free Open Source project dedicated to the handling of multimedia (video, audio, etc) files. For more information, see their official website at [ffmpeg.org](https://www.ffmpeg.org/). ## Installation on Windows + ### Prebuilt Binaries -Pre-built binaries from trusted sources are available on the [FFmpeg website](https://www.ffmpeg.org/download.html#build-windows). To install: + +Pre-built binaries from trusted sources are available on the [FFmpeg website](https://www.ffmpeg.org/download.html). Under "More downloading options" click on the Windows section, then under "Windows EXE Files" select a source to download a build from. Follow any further download instructions from whichever build website you choose. + +![Windows Download Location](../assets/ffmpeg_windows_download.png) + +!!! note + Do NOT download the source code by mistake! + +To Install: 1. Download 7z or zip file and extract it (right click > Extract All) 2. Move extracted contents to a unique folder (i.e; `c:\ffmpeg` or `c:\Program Files\ffmpeg`) -3. Add FFmpeg to your PATH +3. Add FFmpeg to your system PATH - 1. Go to "Edit the system environment variables" - 2. Under "User Variables", select "Path" then edit - 3. Click new and add `\bin` (e.g; `c:\ffmpeg\bin` or `c:\Program Files\ffmpeg\bin`) - 4. Click okay + 1. In Windows, search for or go to "Edit the system environment variables" under the Control Panel + 2. Under "User Variables", select "Path" then edit + 3. Click new and add `\bin` (e.g; `c:\ffmpeg\bin` or `c:\Program Files\ffmpeg\bin`) + 4. Click "Okay" ### Package Managers + FFmpeg is also available from: 1. WinGet (`winget install ffmpeg`) @@ -23,13 +33,15 @@ FFmpeg is also available from: 3. Chocolatey (`choco install ffmpeg-full`) ## Installation on Mac -### Homebrew -FFmpeg is available via [Homebrew](https://brew.sh/) and can be installed via: -`brew install ffmpeg` +### Homebrew + +FFmpeg is available under the macOS section of the [FFmpeg website](https://www.ffmpeg.org/download.html) or can be installed via [Homebrew](https://brew.sh/) using `brew install ffmpeg`. ## Installation on Linux + ### Package Managers + FFmpeg may be installed by default on some Linux distributions, but if not, it is available via your distro's package manager of choice: 1. Debian/Ubuntu (`sudo apt install ffmpeg`) @@ -37,4 +49,5 @@ FFmpeg may be installed by default on some Linux distributions, but if not, it i 3. Arch (`sudo pacman -S ffmpeg`) # Help + For additional help, please join the [Discord](https://discord.gg/hRNnVKhF2G) or create an Issue on the [GitHub repository](https://github.com/TagStudioDev/TagStudio) From ebc487eac412db696419c143c76684ecf6b52acd Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Thu, 12 Dec 2024 21:43:13 -0800 Subject: [PATCH 72/82] docs: add refactor warning to CONTRIBUTING.md --- CONTRIBUTING.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d65f5f86..50d1b2dc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ # Contributing to TagStudio -_Last Updated: November 19th, 2024_ +_Last Updated: December 12th, 2024_ Thank you so much for showing interest in contributing to TagStudio! Here are a set of instructions and guidelines for contributing code or documentation to the project. This document will change over time, so make sure that your contributions still line up with the requirements here before submitting a pull request. @@ -14,6 +14,7 @@ Thank you so much for showing interest in contributing to TagStudio! Here are a - Check the [Feature Roadmap](/docs/updates/roadmap.md) page to see what priority features there are, the [FAQ](/README.md/#faq), as well as the open [Issues](https://github.com/TagStudioDev/TagStudio/issues) and [Pull Requests](https://github.com/TagStudioDev/TagStudio/pulls). - If you'd like to add a feature that isn't on the feature roadmap or doesn't have an open issue, **PLEASE create a feature request** issue for it discussing your intentions so any feedback or important information can be given by the team first. - We don't want you wasting time developing a feature or making a change that can't/won't be added for any reason ranging from pre-existing refactors to design philosophy differences. +- **Please don't** create pull requests that consist of large refactors, *especially* without discussing them with us first. These end up doing more harm than good for the project by continuously delaying progress and disrupting everyone else's work. - If you wish to discuss TagStudio further, feel free to join the [Discord Server](https://discord.com/invite/hRNnVKhF2G) ### Contribution Checklist From c33d0203e458e3da5662825e5fe4cc75f8ca3fe2 Mon Sep 17 00:00:00 2001 From: DandyDev01 <37933054+DandyDev01@users.noreply.github.com> Date: Sat, 14 Dec 2024 12:40:48 -0700 Subject: [PATCH 73/82] fix: editing tags from preview panel updates database (#641) * fix: bug where preview_panel tag was out of date compared to tag in database after edits where made using the tagDatabasePanel * fix: changes made in the preview panel are saved to the database --- tagstudio/src/qt/ts_qt.py | 6 +++++- tagstudio/src/qt/widgets/tag_box.py | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index a16f8910..0f7f2a27 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -656,7 +656,11 @@ class QtDriver(DriverMixin, QObject): def show_tag_database(self): self.modal = PanelModal( - TagDatabasePanel(self.lib), "Library Tags", "Library Tags", has_save=False + widget=TagDatabasePanel(self.lib), + title="Library Tags", + window_title="Library Tags", + done_callback=self.preview_panel.update_widgets, + has_save=False, ) self.modal.show() diff --git a/tagstudio/src/qt/widgets/tag_box.py b/tagstudio/src/qt/widgets/tag_box.py index a1c7301b..a26ec33a 100755 --- a/tagstudio/src/qt/widgets/tag_box.py +++ b/tagstudio/src/qt/widgets/tag_box.py @@ -139,7 +139,9 @@ class TagBoxWidget(FieldWidget): self.edit_modal.saved.connect( lambda: self.driver.lib.update_tag( build_tag_panel.build_tag(), - subtag_ids=build_tag_panel.subtag_ids, + subtag_ids=set(build_tag_panel.subtag_ids), + alias_names=set(build_tag_panel.alias_names), + alias_ids=set(build_tag_panel.alias_ids), ) ) self.edit_modal.show() From 9e0c4f39b8c120aec32f2539d9e5093e2ec0d7d5 Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Sat, 14 Dec 2024 11:42:17 -0800 Subject: [PATCH 74/82] docs: remove closed pr warning from CONTRIBUTING.md --- CONTRIBUTING.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 50d1b2dc..5c1ab5e4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -151,9 +151,6 @@ Most of the style guidelines can be checked, fixed, and enforced via Ruff. Older ### Commit and Pull Request Style -> [!CAUTION] -> Please do not close and re-open pull requests. This makes it **much** more difficult to re-pull during reviews. If you would like to signal that your pull request is not ready, please mark is as a draft instead. - - Use [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0) as a guideline for commit messages. This allows us to easily generate changelogs for releases. - See some [examples](https://www.conventionalcommits.org/en/v1.0.0/#examples) of what this looks like in practice. - Use clear and concise commit messages. If your commit does too much, either consider breaking it up into smaller commits or providing extra detail in the commit description. From 24fa76ee30860877057d68f2b6bf7064859ab4b5 Mon Sep 17 00:00:00 2001 From: python357-1 <30739625+python357-1@users.noreply.github.com> Date: Fri, 20 Dec 2024 16:03:11 -0600 Subject: [PATCH 75/82] tests(fix): stop updating sqlite db during tests (#648) * fix: stop sqlite db from being updated while running tests * refactor: small refactor in db checking code --- tagstudio/src/core/library/alchemy/db.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tagstudio/src/core/library/alchemy/db.py b/tagstudio/src/core/library/alchemy/db.py index f1a23f5d..2152d424 100644 --- a/tagstudio/src/core/library/alchemy/db.py +++ b/tagstudio/src/core/library/alchemy/db.py @@ -37,10 +37,14 @@ def make_tables(engine: Engine) -> None: # tag IDs < 1000 are reserved # create tag and delete it to bump the autoincrement sequence # TODO - find a better way + # is this the better way? with engine.connect() as conn: - conn.execute(text("INSERT INTO tags (id, name, color) VALUES (999, 'temp', 1)")) - conn.execute(text("DELETE FROM tags WHERE id = 999")) - conn.commit() + result = conn.execute(text("SELECT SEQ FROM sqlite_sequence WHERE name='tags'")) + autoincrement_val = result.scalar() + if not autoincrement_val or autoincrement_val < 1000: + conn.execute(text("INSERT INTO tags (id, name, color) VALUES (999, 'temp', 1)")) + conn.execute(text("DELETE FROM tags WHERE id = 999")) + conn.commit() def drop_tables(engine: Engine) -> None: From 8387676d795a8f814f131c5cb27cacc95c0d5979 Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Fri, 20 Dec 2024 14:34:05 -0800 Subject: [PATCH 76/82] feat(ui): show filenames in thumbnail grid (Closes #85) (#633) * feat(ui): add filename label under thumbnails * refactor(ui): organize menu items * feat: make thumbnail filenames toggleable * refactor variables, tweak spacing * fix(ui): only change cursor on thumb_button * revert changes to ../search_library/../ts_library.sqlite * fix: don't ever call .setHidden(False) on visible widgets * refactor: rename filename toggles to setters * fix: remove duplicate open_on_start_action --- tagstudio/src/core/enums.py | 1 + tagstudio/src/qt/ts_qt.py | 94 ++++++++++++---------- tagstudio/src/qt/widgets/item_thumb.py | 86 ++++++++++++++++---- tagstudio/src/qt/widgets/thumb_renderer.py | 11 ++- 4 files changed, 134 insertions(+), 58 deletions(-) diff --git a/tagstudio/src/core/enums.py b/tagstudio/src/core/enums.py index d4a9aa3d..416e8c64 100644 --- a/tagstudio/src/core/enums.py +++ b/tagstudio/src/core/enums.py @@ -10,6 +10,7 @@ class SettingItems(str, enum.Enum): LAST_LIBRARY = "last_library" LIBS_LIST = "libs_list" WINDOW_SHOW_LIBS = "window_show_libs" + SHOW_FILENAMES = "show_filenames" AUTOPLAY = "autoplay_videos" diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index 0f7f2a27..4a568b57 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -25,15 +25,7 @@ import src.qt.resources_rc # noqa: F401 import structlog from humanfriendly import format_timespan from PySide6 import QtCore -from PySide6.QtCore import ( - QObject, - QSettings, - Qt, - QThread, - QThreadPool, - QTimer, - Signal, -) +from PySide6.QtCore import QObject, QSettings, Qt, QThread, QThreadPool, QTimer, Signal from PySide6.QtGui import ( QAction, QColor, @@ -264,15 +256,12 @@ class QtDriver(DriverMixin, QObject): file_menu = QMenu("&File", menu_bar) edit_menu = QMenu("&Edit", menu_bar) + view_menu = QMenu("&View", menu_bar) tools_menu = QMenu("&Tools", menu_bar) macros_menu = QMenu("&Macros", menu_bar) - window_menu = QMenu("&Window", menu_bar) help_menu = QMenu("&Help", menu_bar) # File Menu ============================================================ - # file_menu.addAction(QAction('&New Library', menu_bar)) - # file_menu.addAction(QAction('&Open Library', menu_bar)) - open_library_action = QAction("&Open/Create Library", menu_bar) open_library_action.triggered.connect(lambda: self.open_library_from_dialog()) open_library_action.setShortcut( @@ -302,8 +291,6 @@ class QtDriver(DriverMixin, QObject): file_menu.addSeparator() - # refresh_lib_action = QAction('&Refresh Directories', self.main_window) - # refresh_lib_action.triggered.connect(lambda: self.lib.refresh_dir()) add_new_files_action = QAction("&Refresh Directories", menu_bar) add_new_files_action.triggered.connect( lambda: self.callback_library_needed_check(self.add_new_files_callback) @@ -315,13 +302,23 @@ class QtDriver(DriverMixin, QObject): ) ) add_new_files_action.setStatusTip("Ctrl+R") - # file_menu.addAction(refresh_lib_action) file_menu.addAction(add_new_files_action) file_menu.addSeparator() close_library_action = QAction("&Close Library", menu_bar) close_library_action.triggered.connect(self.close_library) file_menu.addAction(close_library_action) + file_menu.addSeparator() + + open_on_start_action = QAction("Open Library on Start", self) + open_on_start_action.setCheckable(True) + open_on_start_action.setChecked( + bool(self.settings.value(SettingItems.START_LOAD_LAST, defaultValue=True, type=bool)) + ) + open_on_start_action.triggered.connect( + lambda checked: self.settings.setValue(SettingItems.START_LOAD_LAST, checked) + ) + file_menu.addAction(open_on_start_action) # Edit Menu ============================================================ new_tag_action = QAction("New &Tag", menu_bar) @@ -364,15 +361,32 @@ class QtDriver(DriverMixin, QObject): tag_database_action.triggered.connect(lambda: self.show_tag_database()) edit_menu.addAction(tag_database_action) - check_action = QAction("Open library on start", self) - check_action.setCheckable(True) - check_action.setChecked( - bool(self.settings.value(SettingItems.START_LOAD_LAST, defaultValue=True, type=bool)) + # View Menu ============================================================ + show_libs_list_action = QAction("Show Recent Libraries", menu_bar) + show_libs_list_action.setCheckable(True) + show_libs_list_action.setChecked( + bool(self.settings.value(SettingItems.WINDOW_SHOW_LIBS, defaultValue=True, type=bool)) ) - check_action.triggered.connect( - lambda checked: self.settings.setValue(SettingItems.START_LOAD_LAST, checked) + show_libs_list_action.triggered.connect( + lambda checked: ( + self.settings.setValue(SettingItems.WINDOW_SHOW_LIBS, checked), + self.toggle_libs_list(checked), + ) ) - window_menu.addAction(check_action) + view_menu.addAction(show_libs_list_action) + + show_filenames_action = QAction("Show Filenames in Grid", menu_bar) + show_filenames_action.setCheckable(True) + show_filenames_action.setChecked( + bool(self.settings.value(SettingItems.SHOW_FILENAMES, defaultValue=True, type=bool)) + ) + show_filenames_action.triggered.connect( + lambda checked: ( + self.settings.setValue(SettingItems.SHOW_FILENAMES, checked), + self.show_grid_filenames(checked), + ) + ) + view_menu.addAction(show_filenames_action) # Tools Menu =========================================================== def create_fix_unlinked_entries_modal(): @@ -407,19 +421,6 @@ class QtDriver(DriverMixin, QObject): ) macros_menu.addAction(self.autofill_action) - show_libs_list_action = QAction("Show Recent Libraries", menu_bar) - show_libs_list_action.setCheckable(True) - show_libs_list_action.setChecked( - bool(self.settings.value(SettingItems.WINDOW_SHOW_LIBS, defaultValue=True, type=bool)) - ) - show_libs_list_action.triggered.connect( - lambda checked: ( - self.settings.setValue(SettingItems.WINDOW_SHOW_LIBS, checked), - self.toggle_libs_list(checked), - ) - ) - window_menu.addAction(show_libs_list_action) - def create_folders_tags_modal(): if not hasattr(self, "folders_modal"): self.folders_modal = FoldersToTagsModal(self.lib, self) @@ -429,7 +430,7 @@ class QtDriver(DriverMixin, QObject): folders_to_tags_action.triggered.connect(create_folders_tags_modal) macros_menu.addAction(folders_to_tags_action) - # Help Menu ========================================================== + # Help Menu ============================================================ self.repo_action = QAction("Visit GitHub Repository", menu_bar) self.repo_action.triggered.connect( lambda: webbrowser.open("https://github.com/TagStudioDev/TagStudio") @@ -439,9 +440,9 @@ class QtDriver(DriverMixin, QObject): menu_bar.addMenu(file_menu) menu_bar.addMenu(edit_menu) + menu_bar.addMenu(view_menu) menu_bar.addMenu(tools_menu) menu_bar.addMenu(macros_menu) - menu_bar.addMenu(window_menu) menu_bar.addMenu(help_menu) self.main_window.searchField.textChanged.connect(self.update_completions_list) @@ -551,6 +552,10 @@ class QtDriver(DriverMixin, QObject): self.preview_panel.libs_flow_container.hide() self.preview_panel.update() + def show_grid_filenames(self, value: bool): + for thumb in self.item_thumbs: + thumb.set_filename_visibility(value) + def callback_library_needed_check(self, func): """Check if loaded library has valid path before executing the button function.""" if self.lib.library_dir: @@ -833,9 +838,9 @@ class QtDriver(DriverMixin, QObject): it.thumb_button.setIcon(blank_icon) it.resize(self.thumb_size, self.thumb_size) it.thumb_size = (self.thumb_size, self.thumb_size) - it.setMinimumSize(self.thumb_size, self.thumb_size) - it.setMaximumSize(self.thumb_size, self.thumb_size) + it.setFixedSize(self.thumb_size, self.thumb_size) it.thumb_button.thumb_size = (self.thumb_size, self.thumb_size) + it.set_filename_visibility(it.show_filename_label) self.flow_container.layout().setSpacing( min(self.thumb_size // spacing_divisor, min_spacing) ) @@ -883,7 +888,14 @@ class QtDriver(DriverMixin, QObject): # TODO - init after library is loaded, it can have different page_size for grid_idx in range(self.filter.page_size): item_thumb = ItemThumb( - None, self.lib, self, (self.thumb_size, self.thumb_size), grid_idx + None, + self.lib, + self, + (self.thumb_size, self.thumb_size), + grid_idx, + bool( + self.settings.value(SettingItems.SHOW_FILENAMES, defaultValue=True, type=bool) + ), ) layout.addWidget(item_thumb) diff --git a/tagstudio/src/qt/widgets/item_thumb.py b/tagstudio/src/qt/widgets/item_thumb.py index ab8b44ef..9935fe4e 100644 --- a/tagstudio/src/qt/widgets/item_thumb.py +++ b/tagstudio/src/qt/widgets/item_thumb.py @@ -110,6 +110,8 @@ class ItemThumb(FlowWidget): "padding-left: 1px;" ) + filename_style = "font-size:10px;" + def __init__( self, mode: ItemType, @@ -117,6 +119,7 @@ class ItemThumb(FlowWidget): driver: "QtDriver", thumb_size: tuple[int, int], grid_idx: int, + show_filename_label: bool = False, ): super().__init__() self.grid_idx = grid_idx @@ -125,10 +128,24 @@ class ItemThumb(FlowWidget): self.driver = driver self.item_id: int | None = None self.thumb_size: tuple[int, int] = thumb_size + self.show_filename_label: bool = show_filename_label + self.label_height = 12 + self.label_spacing = 4 self.setMinimumSize(*thumb_size) self.setMaximumSize(*thumb_size) self.setMouseTracking(True) check_size = 24 + self.setFixedSize( + thumb_size[0], + thumb_size[1] + + ((self.label_height + self.label_spacing) if show_filename_label else 0), + ) + + self.thumb_container = QWidget() + self.base_layout = QVBoxLayout(self) + self.base_layout.setContentsMargins(0, 0, 0, 0) + self.base_layout.setSpacing(0) + self.setLayout(self.base_layout) # +----------+ # | ARC FAV| Top Right: Favorite & Archived Badges @@ -136,6 +153,8 @@ class ItemThumb(FlowWidget): # | | # |EXT #| Lower Left: File Type, Tag Group Icon, or Collation Icon # +----------+ Lower Right: Collation Count, Video Length, or Word Count + # + # Filename Underneath: (Optional) Filename # Thumbnail ============================================================ @@ -145,9 +164,9 @@ class ItemThumb(FlowWidget): # || || # |*--------*| # +----------+ - self.base_layout = QVBoxLayout(self) - self.base_layout.setObjectName("baseLayout") - self.base_layout.setContentsMargins(0, 0, 0, 0) + self.thumb_layout = QVBoxLayout(self.thumb_container) + self.thumb_layout.setObjectName("baseLayout") + self.thumb_layout.setContentsMargins(0, 0, 0, 0) # +----------+ # |[~~~~~~~~]| @@ -160,7 +179,7 @@ class ItemThumb(FlowWidget): self.top_layout.setContentsMargins(6, 6, 6, 6) self.top_container = QWidget() self.top_container.setLayout(self.top_layout) - self.base_layout.addWidget(self.top_container) + self.thumb_layout.addWidget(self.top_container) # +----------+ # |[~~~~~~~~]| @@ -168,7 +187,7 @@ class ItemThumb(FlowWidget): # | | | # | v | # +----------+ - self.base_layout.addStretch(2) + self.thumb_layout.addStretch(2) # +----------+ # |[~~~~~~~~]| @@ -181,19 +200,20 @@ class ItemThumb(FlowWidget): self.bottom_layout.setContentsMargins(6, 6, 6, 6) self.bottom_container = QWidget() self.bottom_container.setLayout(self.bottom_layout) - self.base_layout.addWidget(self.bottom_container) + self.thumb_layout.addWidget(self.bottom_container) - self.thumb_button = ThumbButton(self, thumb_size) + self.thumb_button = ThumbButton(self.thumb_container, thumb_size) self.renderer = ThumbRenderer() self.renderer.updated.connect( - lambda ts, i, s, ext: ( + lambda ts, i, s, fn, ext: ( self.update_thumb(ts, image=i), self.update_size(ts, size=s), + self.set_filename_text(fn), self.set_extension(ext), ) ) self.thumb_button.setFlat(True) - self.thumb_button.setLayout(self.base_layout) + self.thumb_button.setLayout(self.thumb_layout) self.thumb_button.setContextMenuPolicy(Qt.ContextMenuPolicy.ActionsContextMenu) self.opener = FileOpenerHelper("") @@ -285,6 +305,16 @@ class ItemThumb(FlowWidget): self.badges[badge_type] = badge self.cb_layout.addWidget(badge) + # Filename Label ======================================================= + self.file_label = QLabel(text="Filename") + self.file_label.setStyleSheet(ItemThumb.filename_style) + self.file_label.setMaximumHeight(self.label_height) + if not show_filename_label: + self.file_label.setHidden(True) + + self.base_layout.addWidget(self.thumb_container) + self.base_layout.addWidget(self.file_label) + self.set_mode(mode) @property @@ -298,11 +328,11 @@ class ItemThumb(FlowWidget): def set_mode(self, mode: ItemType | None) -> None: if mode is None: self.setAttribute(Qt.WidgetAttribute.WA_TransparentForMouseEvents, on=True) - self.unsetCursor() + self.thumb_button.unsetCursor() self.thumb_button.setHidden(True) elif mode == ItemType.ENTRY and self.mode != ItemType.ENTRY: self.setAttribute(Qt.WidgetAttribute.WA_TransparentForMouseEvents, on=False) - self.setCursor(Qt.CursorShape.PointingHandCursor) + self.thumb_button.setCursor(Qt.CursorShape.PointingHandCursor) self.thumb_button.setHidden(False) self.cb_container.setHidden(False) # Count Badge depends on file extension (video length, word count) @@ -312,7 +342,7 @@ class ItemThumb(FlowWidget): self.ext_badge.setHidden(True) elif mode == ItemType.COLLATION and self.mode != ItemType.COLLATION: self.setAttribute(Qt.WidgetAttribute.WA_TransparentForMouseEvents, on=False) - self.setCursor(Qt.CursorShape.PointingHandCursor) + self.thumb_button.setCursor(Qt.CursorShape.PointingHandCursor) self.thumb_button.setHidden(False) self.cb_container.setHidden(True) self.ext_badge.setHidden(True) @@ -321,7 +351,7 @@ class ItemThumb(FlowWidget): self.item_type_badge.setHidden(False) elif mode == ItemType.TAG_GROUP and self.mode != ItemType.TAG_GROUP: self.setAttribute(Qt.WidgetAttribute.WA_TransparentForMouseEvents, on=False) - self.setCursor(Qt.CursorShape.PointingHandCursor) + self.thumb_button.setCursor(Qt.CursorShape.PointingHandCursor) self.thumb_button.setHidden(False) self.ext_badge.setHidden(True) self.count_badge.setHidden(False) @@ -366,14 +396,40 @@ class ItemThumb(FlowWidget): self.ext_badge.setHidden(True) self.count_badge.setHidden(True) + def set_filename_text(self, filename: Path | str | None): + self.file_label.setText(str(filename)) + + def set_filename_visibility(self, set_visible: bool): + """Toggle the visibility of the filename label. + + Args: + set_visible (bool): Show the filename, true or false. + """ + if set_visible: + if self.file_label.isHidden(): + self.file_label.setHidden(False) + self.setFixedHeight(self.thumb_size[1] + self.label_height + self.label_spacing) + else: + self.file_label.setHidden(True) + self.setFixedHeight(self.thumb_size[1]) + self.show_filename_label = set_visible + def update_thumb(self, timestamp: float, image: QPixmap | None = None): """Update attributes of a thumbnail element.""" if timestamp > ItemThumb.update_cutoff: self.thumb_button.setIcon(image if image else QPixmap()) def update_size(self, timestamp: float, size: QSize): - """Updates attributes of a thumbnail element.""" - if timestamp > ItemThumb.update_cutoff and self.thumb_button.iconSize != size: + """Updates attributes of a thumbnail element. + + Args: + timestamp (float | None): The UTC timestamp for when this call was + originally dispatched. Used to skip outdated jobs. + + size (QSize): The new thumbnail size to set. + """ + if timestamp > ItemThumb.update_cutoff: + self.thumb_size = size.toTuple() # type: ignore self.thumb_button.setIconSize(size) self.thumb_button.setMinimumSize(size) self.thumb_button.setMaximumSize(size) diff --git a/tagstudio/src/qt/widgets/thumb_renderer.py b/tagstudio/src/qt/widgets/thumb_renderer.py index ac0abb96..b17f519a 100644 --- a/tagstudio/src/qt/widgets/thumb_renderer.py +++ b/tagstudio/src/qt/widgets/thumb_renderer.py @@ -72,7 +72,7 @@ class ThumbRenderer(QObject): """A class for rendering image and file thumbnails.""" rm: ResourceManager = ResourceManager() - updated = Signal(float, QPixmap, QSize, str) + updated = Signal(float, QPixmap, QSize, str, str) updated_ratio = Signal(float) def __init__(self) -> None: @@ -1208,8 +1208,15 @@ class ThumbRenderer(QObject): math.ceil(adj_size / pixel_ratio), math.ceil(final.size[1] / pixel_ratio), ), + str(_filepath.name), _filepath.suffix.lower(), ) else: - self.updated.emit(timestamp, QPixmap(), QSize(*base_size), _filepath.suffix.lower()) + self.updated.emit( + timestamp, + QPixmap(), + QSize(*base_size), + str(_filepath.name), + _filepath.suffix.lower(), + ) From fdfd6490bdf2ac55bcf2040c38092ce86017e27c Mon Sep 17 00:00:00 2001 From: DandyDev01 <37933054+DandyDev01@users.noreply.github.com> Date: Fri, 20 Dec 2024 16:22:23 -0700 Subject: [PATCH 77/82] feat: delete and create tags from tag database panel (#569) * [feat] can now add a new tag from the tag library panel * [feat] can remove tags from the tag library panel [fix] library panel updates tag list when a new tag is create * [test] added test for library->remove_tag * [fix] type error * removed redundant lambda Co-authored-by: VasigaranAndAngel <72515046+VasigaranAndAngel@users.noreply.github.com> * fix: tags with a reserved id could be edited or removed, now they cannot. * fix: when a tag is removed or edited the preivew panel will update to reflect the changes Co-authored-by: Sean Krueger * fix: mypy check * fix: aliases and subtags not being removed from DB when tag they reference was removed. * feat: added a confirmation message box when removing tags. * fix: mypy --------- Co-authored-by: VasigaranAndAngel <72515046+VasigaranAndAngel@users.noreply.github.com> Co-authored-by: Sean Krueger --- tagstudio/src/core/constants.py | 1 + tagstudio/src/core/library/alchemy/library.py | 33 +++++++++++ tagstudio/src/qt/modals/tag_database.py | 56 ++++++++++++++++++- tagstudio/src/qt/widgets/panel.py | 4 ++ tagstudio/src/qt/widgets/thumb_renderer.py | 1 - tagstudio/tests/test_library.py | 11 ++++ 6 files changed, 104 insertions(+), 2 deletions(-) diff --git a/tagstudio/src/core/constants.py b/tagstudio/src/core/constants.py index 0ca05377..07ed3814 100644 --- a/tagstudio/src/core/constants.py +++ b/tagstudio/src/core/constants.py @@ -13,3 +13,4 @@ FONT_SAMPLE_SIZES: list[int] = [10, 15, 20] TAG_FAVORITE = 1 TAG_ARCHIVED = 0 +RESERVED_TAG_IDS = range(0, 999) diff --git a/tagstudio/src/core/library/alchemy/library.py b/tagstudio/src/core/library/alchemy/library.py index a2734b1b..b12c93e8 100644 --- a/tagstudio/src/core/library/alchemy/library.py +++ b/tagstudio/src/core/library/alchemy/library.py @@ -657,6 +657,39 @@ class Library: session.execute(update_stmt) session.commit() + def remove_tag(self, tag: Tag): + with Session(self.engine, expire_on_commit=False) as session: + try: + subtags = session.scalars( + select(TagSubtag).where(TagSubtag.parent_id == tag.id) + ).all() + + tags_query = select(Tag).options( + selectinload(Tag.subtags), selectinload(Tag.aliases) + ) + tag = session.scalar(tags_query.where(Tag.id == tag.id)) + + aliases = session.scalars(select(TagAlias).where(TagAlias.tag_id == tag.id)) + + for alias in aliases or []: + session.delete(alias) + + for subtag in subtags or []: + session.delete(subtag) + session.expunge(subtag) + + session.delete(tag) + + session.commit() + + session.expunge(tag) + return tag + + except IntegrityError as e: + logger.exception(e) + session.rollback() + return None + def remove_tag_from_field(self, tag: Tag, field: TagBoxField) -> None: with Session(self.engine) as session: field_ = session.scalars(select(TagBoxField).where(TagBoxField.id == field.id)).one() diff --git a/tagstudio/src/qt/modals/tag_database.py b/tagstudio/src/qt/modals/tag_database.py index 937b4fb2..6c5195f3 100644 --- a/tagstudio/src/qt/modals/tag_database.py +++ b/tagstudio/src/qt/modals/tag_database.py @@ -9,10 +9,13 @@ from PySide6.QtWidgets import ( QFrame, QHBoxLayout, QLineEdit, + QMessageBox, + QPushButton, QScrollArea, QVBoxLayout, QWidget, ) +from src.core.constants import RESERVED_TAG_IDS from src.core.library import Library, Tag from src.qt.modals.build_tag import BuildTagPanel from src.qt.widgets.panel import PanelModal, PanelWidget @@ -59,8 +62,32 @@ class TagDatabasePanel(PanelWidget): self.scroll_area.setFrameShape(QFrame.Shape.NoFrame) self.scroll_area.setWidget(self.scroll_contents) + self.create_tag_button = QPushButton() + self.create_tag_button.setText("Create Tag") + self.create_tag_button.clicked.connect(self.build_tag) + self.root_layout.addWidget(self.search_field) self.root_layout.addWidget(self.scroll_area) + self.root_layout.addWidget(self.create_tag_button) + self.update_tags() + + def build_tag(self): + self.modal = PanelModal( + BuildTagPanel(self.lib), + "New Tag", + "Add Tag", + has_save=True, + ) + + panel: BuildTagPanel = self.modal.widget + self.modal.saved.connect( + lambda: ( + self.lib.add_tag(panel.build_tag(), panel.subtag_ids), + self.modal.hide(), + self.update_tags(), + ) + ) + self.modal.show() def on_return(self, text: str): if text and self.first_tag_id >= 0: @@ -84,14 +111,41 @@ class TagDatabasePanel(PanelWidget): row = QHBoxLayout(container) row.setContentsMargins(0, 0, 0, 0) row.setSpacing(3) - tag_widget = TagWidget(tag, has_edit=True, has_remove=False) + + if tag.id in RESERVED_TAG_IDS: + tag_widget = TagWidget(tag, has_edit=False, has_remove=False) + else: + tag_widget = TagWidget(tag, has_edit=True, has_remove=True) + tag_widget.on_edit.connect(lambda checked=False, t=tag: self.edit_tag(t)) + tag_widget.on_remove.connect(lambda t=tag: self.remove_tag(t)) row.addWidget(tag_widget) self.scroll_layout.addWidget(container) self.search_field.setFocus() + def remove_tag(self, tag: Tag): + if tag.id in RESERVED_TAG_IDS: + return + + message_box = QMessageBox() + message_box.setWindowTitle("Remove tag") + message_box.setText("Are you sure you want to remove " + tag.name + "?") + message_box.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) # type: ignore + message_box.setIcon(QMessageBox.Question) # type: ignore + + result = message_box.exec() + + if result != QMessageBox.Ok: # type: ignore + return + + self.lib.remove_tag(tag) + self.update_tags() + def edit_tag(self, tag: Tag): + if tag.id in RESERVED_TAG_IDS: + return + build_tag_panel = BuildTagPanel(self.lib, tag=tag) self.edit_modal = PanelModal( diff --git a/tagstudio/src/qt/widgets/panel.py b/tagstudio/src/qt/widgets/panel.py index d16803c7..b164acc9 100755 --- a/tagstudio/src/qt/widgets/panel.py +++ b/tagstudio/src/qt/widgets/panel.py @@ -91,6 +91,10 @@ class PanelModal(QWidget): self.root_layout.setStretch(1, 2) self.root_layout.addWidget(self.button_container) + def closeEvent(self, event): # noqa: N802 + self.done_button.click() + event.accept() + class PanelWidget(QWidget): """Used for widgets that go in a modal panel, ex. for editing or searching.""" diff --git a/tagstudio/src/qt/widgets/thumb_renderer.py b/tagstudio/src/qt/widgets/thumb_renderer.py index b17f519a..45550a84 100644 --- a/tagstudio/src/qt/widgets/thumb_renderer.py +++ b/tagstudio/src/qt/widgets/thumb_renderer.py @@ -12,7 +12,6 @@ from pathlib import Path import cv2 import numpy as np -import pillow_jxl # noqa: F401 import rawpy import structlog from mutagen import MutagenError, flac, id3, mp4 diff --git a/tagstudio/tests/test_library.py b/tagstudio/tests/test_library.py index 04fa965e..82f9522e 100644 --- a/tagstudio/tests/test_library.py +++ b/tagstudio/tests/test_library.py @@ -213,6 +213,17 @@ def test_subtags_add(library, generate_tag): assert tag.subtag_ids +def test_remove_tag(library, generate_tag): + tag = library.add_tag(generate_tag("food", id=123)) + + assert tag + + tag_count = len(library.tags) + + library.remove_tag(tag) + assert len(library.tags) == tag_count - 1 + + @pytest.mark.parametrize("is_exclude", [True, False]) def test_search_filter_extensions(library, is_exclude): # Given From 2903dd22c45c02498687073d075bb88886de6b62 Mon Sep 17 00:00:00 2001 From: Travis Abendshien Date: Fri, 20 Dec 2024 15:56:23 -0800 Subject: [PATCH 78/82] fix: tags created from tag database now add aliases --- tagstudio/src/qt/modals/tag_database.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tagstudio/src/qt/modals/tag_database.py b/tagstudio/src/qt/modals/tag_database.py index 6c5195f3..e8f7cea4 100644 --- a/tagstudio/src/qt/modals/tag_database.py +++ b/tagstudio/src/qt/modals/tag_database.py @@ -82,7 +82,12 @@ class TagDatabasePanel(PanelWidget): panel: BuildTagPanel = self.modal.widget self.modal.saved.connect( lambda: ( - self.lib.add_tag(panel.build_tag(), panel.subtag_ids), + self.lib.add_tag( + tag=panel.build_tag(), + subtag_ids=panel.subtag_ids, + alias_names=panel.alias_names, + alias_ids=panel.alias_ids, + ), self.modal.hide(), self.update_tags(), ) From 933af1c40559547e2fd9079c6f5060195b8e5ff1 Mon Sep 17 00:00:00 2001 From: Travis Abendshien Date: Fri, 20 Dec 2024 16:00:44 -0800 Subject: [PATCH 79/82] ui: update remove tag message box text --- tagstudio/src/qt/modals/tag_database.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tagstudio/src/qt/modals/tag_database.py b/tagstudio/src/qt/modals/tag_database.py index e8f7cea4..88d99b57 100644 --- a/tagstudio/src/qt/modals/tag_database.py +++ b/tagstudio/src/qt/modals/tag_database.py @@ -134,8 +134,8 @@ class TagDatabasePanel(PanelWidget): return message_box = QMessageBox() - message_box.setWindowTitle("Remove tag") - message_box.setText("Are you sure you want to remove " + tag.name + "?") + message_box.setWindowTitle("Remove Tag") + message_box.setText(f'Are you sure you want to delete the tag "{tag.name}"?') message_box.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) # type: ignore message_box.setIcon(QMessageBox.Question) # type: ignore From d6280f7ead359d190c3ac25fedf7cab6885385d6 Mon Sep 17 00:00:00 2001 From: Travis Abendshien Date: Fri, 20 Dec 2024 16:07:19 -0800 Subject: [PATCH 80/82] style: remove whitespace --- tagstudio/src/core/library/alchemy/library.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/tagstudio/src/core/library/alchemy/library.py b/tagstudio/src/core/library/alchemy/library.py index b12c93e8..043d9262 100644 --- a/tagstudio/src/core/library/alchemy/library.py +++ b/tagstudio/src/core/library/alchemy/library.py @@ -663,12 +663,10 @@ class Library: subtags = session.scalars( select(TagSubtag).where(TagSubtag.parent_id == tag.id) ).all() - tags_query = select(Tag).options( selectinload(Tag.subtags), selectinload(Tag.aliases) ) tag = session.scalar(tags_query.where(Tag.id == tag.id)) - aliases = session.scalars(select(TagAlias).where(TagAlias.tag_id == tag.id)) for alias in aliases or []: @@ -679,15 +677,15 @@ class Library: session.expunge(subtag) session.delete(tag) - session.commit() - session.expunge(tag) + return tag except IntegrityError as e: logger.exception(e) session.rollback() + return None def remove_tag_from_field(self, tag: Tag, field: TagBoxField) -> None: @@ -919,7 +917,6 @@ class Library: self.update_aliases(tag, alias_ids, alias_names, session) session.commit() - session.expunge(tag) return tag From 36c1c180b3370e349f805e47bce28b3d8638fafb Mon Sep 17 00:00:00 2001 From: Travis Abendshien Date: Fri, 20 Dec 2024 16:24:04 -0800 Subject: [PATCH 81/82] refactor: consolidate reserved tag values as ints --- tagstudio/src/core/constants.py | 3 ++- tagstudio/src/core/library/alchemy/db.py | 9 ++++++--- tagstudio/src/qt/modals/tag_database.py | 8 ++++---- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/tagstudio/src/core/constants.py b/tagstudio/src/core/constants.py index 07ed3814..335df553 100644 --- a/tagstudio/src/core/constants.py +++ b/tagstudio/src/core/constants.py @@ -13,4 +13,5 @@ FONT_SAMPLE_SIZES: list[int] = [10, 15, 20] TAG_FAVORITE = 1 TAG_ARCHIVED = 0 -RESERVED_TAG_IDS = range(0, 999) +RESERVED_TAG_START = 0 +RESERVED_TAG_END = 999 diff --git a/tagstudio/src/core/library/alchemy/db.py b/tagstudio/src/core/library/alchemy/db.py index 2152d424..f48ed2b5 100644 --- a/tagstudio/src/core/library/alchemy/db.py +++ b/tagstudio/src/core/library/alchemy/db.py @@ -3,6 +3,7 @@ from pathlib import Path import structlog from sqlalchemy import Dialect, Engine, String, TypeDecorator, create_engine, text from sqlalchemy.orm import DeclarativeBase +from src.core.constants import RESERVED_TAG_END logger = structlog.getLogger(__name__) @@ -41,9 +42,11 @@ def make_tables(engine: Engine) -> None: with engine.connect() as conn: result = conn.execute(text("SELECT SEQ FROM sqlite_sequence WHERE name='tags'")) autoincrement_val = result.scalar() - if not autoincrement_val or autoincrement_val < 1000: - conn.execute(text("INSERT INTO tags (id, name, color) VALUES (999, 'temp', 1)")) - conn.execute(text("DELETE FROM tags WHERE id = 999")) + if not autoincrement_val or autoincrement_val <= RESERVED_TAG_END: + conn.execute( + text(f"INSERT INTO tags (id, name, color) VALUES ({RESERVED_TAG_END}, 'temp', 1)") + ) + conn.execute(text(f"DELETE FROM tags WHERE id = {RESERVED_TAG_END}")) conn.commit() diff --git a/tagstudio/src/qt/modals/tag_database.py b/tagstudio/src/qt/modals/tag_database.py index 88d99b57..168420d5 100644 --- a/tagstudio/src/qt/modals/tag_database.py +++ b/tagstudio/src/qt/modals/tag_database.py @@ -15,7 +15,7 @@ from PySide6.QtWidgets import ( QVBoxLayout, QWidget, ) -from src.core.constants import RESERVED_TAG_IDS +from src.core.constants import RESERVED_TAG_END, RESERVED_TAG_START from src.core.library import Library, Tag from src.qt.modals.build_tag import BuildTagPanel from src.qt.widgets.panel import PanelModal, PanelWidget @@ -117,7 +117,7 @@ class TagDatabasePanel(PanelWidget): row.setContentsMargins(0, 0, 0, 0) row.setSpacing(3) - if tag.id in RESERVED_TAG_IDS: + if tag.id in range(RESERVED_TAG_START, RESERVED_TAG_END): tag_widget = TagWidget(tag, has_edit=False, has_remove=False) else: tag_widget = TagWidget(tag, has_edit=True, has_remove=True) @@ -130,7 +130,7 @@ class TagDatabasePanel(PanelWidget): self.search_field.setFocus() def remove_tag(self, tag: Tag): - if tag.id in RESERVED_TAG_IDS: + if tag.id in range(RESERVED_TAG_START, RESERVED_TAG_END): return message_box = QMessageBox() @@ -148,7 +148,7 @@ class TagDatabasePanel(PanelWidget): self.update_tags() def edit_tag(self, tag: Tag): - if tag.id in RESERVED_TAG_IDS: + if tag.id in range(RESERVED_TAG_START, RESERVED_TAG_END): return build_tag_panel = BuildTagPanel(self.lib, tag=tag) From 934c98a4d486e36257054022c44b3901eae12596 Mon Sep 17 00:00:00 2001 From: SkeleyM <86805089+SkeleyM@users.noreply.github.com> Date: Sat, 21 Dec 2024 01:00:33 +0000 Subject: [PATCH 82/82] fix: enter/return adds top result tag (#651) * fix return not adding searched tag * add first_tag_id type hint --- tagstudio/src/qt/modals/tag_search.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tagstudio/src/qt/modals/tag_search.py b/tagstudio/src/qt/modals/tag_search.py index adcfb7d0..72f3650b 100644 --- a/tagstudio/src/qt/modals/tag_search.py +++ b/tagstudio/src/qt/modals/tag_search.py @@ -33,7 +33,7 @@ class TagSearchPanel(PanelWidget): self.lib = library self.exclude = exclude self.is_initialized: bool = False - self.first_tag_id = None + self.first_tag_id: int = None self.setMinimumSize(300, 400) self.root_layout = QVBoxLayout(self) self.root_layout.setContentsMargins(6, 0, 6, 0) @@ -69,7 +69,7 @@ class TagSearchPanel(PanelWidget): self.update_tags() else: self.search_field.setFocus() - self.parentWidget().hide() + self.parentWidget().hide() def update_tags(self, query: str | None = None): logger.info("[Tag Search Modal] Updating Tags") @@ -77,6 +77,10 @@ class TagSearchPanel(PanelWidget): self.scroll_layout.takeAt(0).widget().deleteLater() tag_results = self.lib.search_tags(name=query) + if len(tag_results) > 0: + self.first_tag_id = tag_results[0].id + else: + self.first_tag_id = None for tag in tag_results: if self.exclude is not None and tag.id in self.exclude:

    $=Xvq` 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 diff --git a/tagstudio/resources/qt/images/thumb_loading_dark_512.png b/tagstudio/resources/qt/images/thumb_loading_dark_512.png deleted file mode 100644 index 7dcd99db78373733cc38310a1ebc5f4a166bdd09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11270 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 diff --git a/tagstudio/resources/qt/images/thumb_mask_128.png b/tagstudio/resources/qt/images/thumb_mask_128.png deleted file mode 100644 index 52a0a1353c955e7a7215bb1378fb3f9ad98e3a09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2245 zcmeHJ`%@EF7+pbL0mdrUA_KBr>fnoP5+;GHNkCqbYA7HKi4Vpl*(3`|c1<=Az)?h{ zLw$@$r7aIpr&>l3wU$;bQzBGl%2>pf+A30U5NBE~l{#WUv3C;+QndXC`onJa-gCaQ z-|K#x(&VI-zMKFK1VO&?#JE)OTf|`g!#f~o<{2_g$tV@8F*Rl6;uxk-;xp5SY|Rkqn`Nr=VjAJ(*ZwCe{=rrKt;Y)M5=1CF4kJ z7!WWL3=Z3j29pJ|NfC!G2An)Vlm1SpaMY{V1!xnO$=@eGg(4d38zLJVNsh&njt9@ z%xdCUl$DVp2*BZSal%GUs+%n1;e$k=EQ0d6JoH66Luy|^XOU@iT2C>QMNiQa0Ze(t z1U$_Ur0?Y>Hk^JLS)urMy3sf#3=0#V3lcG&)G0pw{Q^r`K24yhgoU!2)kJ(QVPZlY znPBsRC6hM7po}ApgvkQ3D@FK%$bX=!SD~?#fikZFZAAbxhY_1QOm4(=L>ZQ;`Eii|F3Q7aq3wKyeLh{(y zWHY5D4FI#Gu8e`@@v$PlSR@J)aGjxm!ePLc)aJ+G3}6X(g77e&IE)vO#us722rOI# zo-v-&9|s$p2Mx~P|HWs!8kPVHg#t??EevJOcWgOZeGRe6xpFQIq@%}S*imT=SF=fy zBD9&(Sk;8a5f+ehq83Wad??} z$58gr{q30qo#wm5L3rVm0z2m(IQ?LZpc8WhEG8xqVFKgF4CYL7d#FDI&DchQs!Xc} z1T8AFmbI*kNtt^&io~OK7w-rNcljni7;eso!#yRbdG>)y%e2M-UGaoc!+oApG6^ zdoS(m+_9l@ee#oUzgI8ZA{3|Jp~{=+tFtO{aozFv)aeZ$H#MAUuI@Ex(-;4Id2^|> ztjb${fA(NPXd)Dxbj<&9r|0(F-$;t9-gMW*@7df*jV)WczrMZU)4i7ji?8)>Dm}lX z+iy~rNQ_>`B>}Fyp~4^zuqhT zB&lfF9$@nhjQV4B=H4*c%}~^7zf!xPy2!H8qbK6|-TOsno~fb)Gd_53FTR2gWNjS? zJRRvFdu>;Seb()pUk_Dn^=&9=d_Q*7tNEacyE*8qPEKTv$~3xZ?K}3ok$PQIjncHU zta2r~?=&a65$gZ{_F@jS8KiNjkV9LKHVIUfd2Tj=A5f+==SfmX?AmHq}vap q;w=LoH3zP%*fr+<#HB~_bm$HHd^ewzL*icc--kRtDXuYQWAR@VJTlw> diff --git a/tagstudio/resources/qt/images/thumb_mask_512.png b/tagstudio/resources/qt/images/thumb_mask_512.png deleted file mode 100644 index ce641abc48961a476b30cd87ea346c215ad834db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4902 zcmeHLX;f3!7Cr$P1T0IjMHC^%K%7WI5RjMnKF}WmxBsa|f2~dnu<@qXD zZxkp)X|)cupcF+#sen`?l|gN(78R#d>Qfo5G$r7>2@dtyzW3+-WUXZ7ob!Eq-#wk3 zz3%pysIW9N6~FNCojlORwiq;v`;Jw2VA?n6doe2RBKKmdhGqtIwx7{g1hmMAzXFNu7%NyV6s zU|7zT38e}lBEg$2^LpLFB z(WL@Jfyf1j^pyi|JmMAnmLL|szZOw(q<=+bv;R9?EPlfcxgsPD3&e|{zG2hL2gu{p zQkW78%MqoF3x}k^62)wDBusIk#|TxhC?QxVh9z<=x=ezvH|;;r#J@v>5D_9*Vl|+d7GiHKWDB(56B>2;?!ZIb@ z3?=?0^ePv0vwduYhneSNmU<0AK|wJxBv~lJFnMg)GCUL#5RWq{+-4z`mAA41z?@ymUG)*mR!r5ggdEn6Egwyv zPCN`X*_|t}-oN0GweQ80E8RzzJn8>z@|Eew?W|Tr)NlL4K4nsI&gXNs2r6q2?bj>U z+b!4EmSzSHW%dT#%p@nAbMg54S|+~aQfi~7J-|It+PPkEE|j$1bwx-#f0+{}rL&u< zOs-Rw)TERTUwi-F#C4lbhu-xL=@>YtJ@-SZxP<5Z`Zuu|bvweZmOvNdO9_d|uFn~%&pC1@->F>g-F1z6;qa%{nb<;w;w&gUJI22XM3 zdq$E6Gvpgk!-s)VXL&EPJMc{R;_lM!()}%6GE@#lc_zAK&bvM?pY#G0kMQsI(iuHL!XKj}F`(bO% z>LG2`ZvD4Jgk)%6m`2ZoGIr~0h%9KpIQ5wg5cP(l?j%D9nz^%jU)UtgAe3FK|8aJY z4Y*#P3Ux&er38c-HRLKUnHtN(6000~_T!iR?k-wOhoa#M+Ec z@(~4%Fz=9N+Ct07>K{9sy-u5th20pzb|P%GK{6 zn#F%KW6e(B${r9ht~!Hv_RWCSU#z0v`C>LezSBE`+>Y%I@(IjK^cV9L8^hxo?a&gYjlC-VFW^ z%|Ni5C%%#cz=IU=ZvC^pVK~szQMm$L^Rb&1pvGgbE$k*@Lp>3I&o5)gkH(I#6`~7B z214^LD@SWk^zCoNc1f2_lCm)e2OivC?$=}a3DKP_BZ7vTSw+N%8Jk?A2Mh)EI89S` zHoAwH?za=%j2h^_cfk^yeZrs~q9e=U*IVazSb-v~jeO*%pwTdGRu3XtYRuz` z9X?uYxU&fw-J}1-%E1m4Rl0i`h99`!cOJ<@jkBA-Qs>)(qOVe+C{pc7!v(=(`ysS0 zpnWn9_zdk6eQMN}6^^WfWN8nYa3ERi+g#i4pKhmdaw)KKEBWOgK=bKoY~CXJ>sZrR zR#gu}QEcq&b+EAlEo~WSe08h7oKa_&bh9p=?&TF?cS$%CAd$B+MLDEbYKvh11&KAxBJ-z%K$nE)XoM<%)~W+iyv(ONeg zU?rgGR)IV`>HZrRd z*;m^=)N`A+I^>dGPVVh}NoO5VBe}Uu_`HEJ8nL0RkJqS$R-aINwR0Rm->Jk1S!&6( i-yEEWDq9D1&mHN|OK7-%wu6+%TvGuSW= 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 ON%Hdb%w4^E|Gxp|9T9&3 diff --git a/tagstudio/src/core/constants.py b/tagstudio/src/core/constants.py index aceac14a..48c087fd 100644 --- a/tagstudio/src/core/constants.py +++ b/tagstudio/src/core/constants.py @@ -6,118 +6,10 @@ TS_FOLDER_NAME: str = ".TagStudio" BACKUP_FOLDER_NAME: str = "backups" COLLAGE_FOLDER_NAME: str = "collages" -# TODO: Turn this whitelist into a user-configurable blacklist. -IMAGE_TYPES: list[str] = [ - ".png", - ".jpg", - ".jpeg", - ".jpg_large", - ".jpeg_large", - ".jfif", - ".gif", - ".tif", - ".tiff", - ".heic", - ".heif", - ".webp", - ".bmp", - ".svg", - ".avif", - ".apng", - ".jp2", - ".j2k", - ".jpg2", -] -RAW_IMAGE_TYPES: list[str] = [ - ".raw", - ".dng", - ".rw2", - ".nef", - ".arw", - ".crw", - ".cr2", - ".cr3", -] -VIDEO_TYPES: list[str] = [ - ".mp4", - ".webm", - ".mov", - ".hevc", - ".mkv", - ".avi", - ".wmv", - ".flv", - ".gifv", - ".m4p", - ".m4v", - ".3gp", -] -AUDIO_TYPES: list[str] = [ - ".mp3", - ".mp4", - ".mpeg4", - ".m4a", - ".aac", - ".wav", - ".flac", - ".alac", - ".wma", - ".ogg", - ".aiff", -] -DOC_TYPES: list[str] = [ - ".txt", - ".rtf", - ".md", - ".doc", - ".docx", - ".pdf", - ".tex", - ".odt", - ".pages", -] -PLAINTEXT_TYPES: list[str] = [ - ".txt", - ".md", - ".css", - ".html", - ".xml", - ".json", - ".js", - ".ts", - ".ini", - ".htm", - ".csv", - ".php", - ".sh", - ".bat", -] -SPREADSHEET_TYPES: list[str] = [".csv", ".xls", ".xlsx", ".numbers", ".ods"] -PRESENTATION_TYPES: list[str] = [".ppt", ".pptx", ".key", ".odp"] -ARCHIVE_TYPES: list[str] = [ - ".zip", - ".rar", - ".tar", - ".tar", - ".gz", - ".tgz", - ".7z", - ".s7z", -] -PROGRAM_TYPES: list[str] = [".exe", ".app"] -SHORTCUT_TYPES: list[str] = [".lnk", ".desktop", ".url"] - -ALL_FILE_TYPES: list[str] = ( - IMAGE_TYPES - + VIDEO_TYPES - + AUDIO_TYPES - + DOC_TYPES - + SPREADSHEET_TYPES - + PRESENTATION_TYPES - + ARCHIVE_TYPES - + PROGRAM_TYPES - + SHORTCUT_TYPES +FONT_SAMPLE_TEXT: str = ( + """ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!?@$%(){}[]""" ) +FONT_SAMPLE_SIZES: list[int] = [10, 15, 20] TAG_FAVORITE = 1 TAG_ARCHIVED = 0 diff --git a/tagstudio/src/core/enums.py b/tagstudio/src/core/enums.py index d457f716..d4a9aa3d 100644 --- a/tagstudio/src/core/enums.py +++ b/tagstudio/src/core/enums.py @@ -14,7 +14,11 @@ class SettingItems(str, enum.Enum): class Theme(str, enum.Enum): + COLOR_BG_DARK = "#65000000" + COLOR_BG_LIGHT = "#22000000" + COLOR_DARK_LABEL = "#DD000000" COLOR_BG = "#65000000" + COLOR_HOVER = "#65AAAAAA" COLOR_PRESSED = "#65EEEEEE" COLOR_DISABLED = "#65F39CAA" diff --git a/tagstudio/src/core/media_types.py b/tagstudio/src/core/media_types.py new file mode 100644 index 00000000..bb190700 --- /dev/null +++ b/tagstudio/src/core/media_types.py @@ -0,0 +1,507 @@ +# Copyright (C) 2024 Travis Abendshien (CyanVoxel). +# Licensed under the GPL-3.0 License. +# Created for TagStudio: https://github.com/CyanVoxel/TagStudio + +import logging +import mimetypes +from dataclasses import dataclass +from enum import Enum +from pathlib import Path + +logging.basicConfig(format="%(message)s", level=logging.INFO) + + +class MediaType(str, Enum): + """Names of media types.""" + + ADOBE_PHOTOSHOP: str = "adobe_photoshop" + AFFINITY_PHOTO: str = "affinity_photo" + ARCHIVE: str = "archive" + AUDIO_MIDI: str = "audio_midi" + AUDIO: str = "audio" + BLENDER: str = "blender" + DATABASE: str = "database" + DISK_IMAGE: str = "disk_image" + DOCUMENT: str = "document" + FONT: str = "font" + IMAGE_ANIMATED: str = "image_animated" + IMAGE_RAW: str = "image_raw" + IMAGE_VECTOR: str = "image_vector" + IMAGE: str = "image" + INSTALLER: str = "installer" + MATERIAL: str = "material" + MODEL: str = "model" + PACKAGE: str = "package" + PDF: str = "pdf" + PLAINTEXT: str = "plaintext" + PRESENTATION: str = "presentation" + PROGRAM: str = "program" + SHORTCUT: str = "shortcut" + SOURCE_ENGINE: str = "source_engine" + SPREADSHEET: str = "spreadsheet" + TEXT: str = "text" + VIDEO: str = "video" + + +@dataclass(frozen=True) +class MediaCategory: + """An object representing a category of media. + + Includes a MediaType identifier, extensions set, and IANA status flag. + + Args: + media_type (MediaType): The MediaType Enum representing this category. + + extensions (set[str]): The set of file extensions associated with this category. + Includes leading ".", all lowercase, and does not need to be unique to this category. + + is_iana (bool): Represents whether or not this is an IANA registered category. + """ + + media_type: MediaType + extensions: set[str] + is_iana: bool = False + + +class MediaCategories: + """Contain pre-made MediaCategory objects as well as methods to interact with them.""" + + # These sets are used either individually or together to form the final sets + # for the MediaCategory(s). + # These sets may be combined and are NOT 1:1 with the final categories. + _ADOBE_PHOTOSHOP_SET: set[str] = { + ".pdd", + ".psb", + ".psd", + } + _AFFINITY_PHOTO_SET: set[str] = {".afphoto"} + _ARCHIVE_SET: set[str] = { + ".7z", + ".gz", + ".rar", + ".s7z", + ".tar", + ".tgz", + ".zip", + } + _AUDIO_MIDI_SET: set[str] = { + ".mid", + ".midi", + } + _AUDIO_SET: set[str] = { + ".aac", + ".aif", + ".aiff", + ".alac", + ".flac", + ".m4a", + ".m4p", + ".mp3", + ".mpeg4", + ".ogg", + ".wav", + ".wma", + } + _BLENDER_SET: set[str] = { + ".blen_tc", + ".blend", + ".blend1", + ".blend2", + ".blend3", + ".blend4", + ".blend5", + ".blend6", + ".blend7", + ".blend8", + ".blend9", + ".blend10", + ".blend11", + ".blend12", + ".blend13", + ".blend14", + ".blend15", + ".blend16", + ".blend17", + ".blend18", + ".blend19", + ".blend20", + ".blend21", + ".blend22", + ".blend23", + ".blend24", + ".blend25", + ".blend26", + ".blend27", + ".blend28", + ".blend29", + ".blend30", + ".blend31", + ".blend32", + } + _DATABASE_SET: set[str] = { + ".accdb", + ".mdb", + ".sqlite", + ".sqlite3", + } + _DISK_IMAGE_SET: set[str] = {".bios", ".dmg", ".iso"} + _DOCUMENT_SET: set[str] = { + ".doc", + ".docm", + ".docx", + ".dot", + ".dotm", + ".dotx", + ".odt", + ".pages", + ".pdf", + ".rtf", + ".tex", + ".wpd", + ".wps", + } + _FONT_SET: set[str] = { + ".fon", + ".otf", + ".ttc", + ".ttf", + ".woff", + ".woff2", + } + _IMAGE_ANIMATED_SET: set[str] = { + ".apng", + ".gif", + ".webp", + ".jxl", + } + _IMAGE_RAW_SET: set[str] = { + ".arw", + ".cr2", + ".cr3", + ".crw", + ".dng", + ".nef", + ".orf", + ".raf", + ".raw", + ".rw2", + } + _IMAGE_VECTOR_SET: set[str] = {".svg"} + _IMAGE_SET: set[str] = { + ".apng", + ".avif", + ".bmp", + ".exr", + ".gif", + ".heic", + ".heif", + ".j2k", + ".jfif", + ".jp2", + ".jpeg_large", + ".jpeg", + ".jpg_large", + ".jpg", + ".jpg2", + ".jxl", + ".png", + ".psb", + ".psd", + ".tif", + ".tiff", + ".webp", + } + _INSTALLER_SET: set[str] = {".appx", ".msi", ".msix"} + _MATERIAL_SET: set[str] = {".mtl"} + _MODEL_SET: set[str] = {".3ds", ".fbx", ".obj", ".stl"} + _PACKAGE_SET: set[str] = { + ".aab", + ".akp", + ".apk", + ".apkm", + ".apks", + ".pkg", + ".xapk", + } + _PDF_SET: set[str] = { + ".pdf", + } + _PLAINTEXT_SET: set[str] = { + ".bat", + ".cfg", + ".conf", + ".cpp", + ".cs", + ".css", + ".csv", + ".fgd", + ".gi", + ".h", + ".hpp", + ".htm", + ".html", + ".inf", + ".ini", + ".js", + ".json", + ".jsonc", + ".kv3", + ".lua", + ".md", + ".nut", + ".php", + ".plist", + ".prefs", + ".py", + ".pyc", + ".qss", + ".sh", + ".toml", + ".ts", + ".txt", + ".vcfg", + ".vdf", + ".vmt", + ".vqlayout", + ".vsc", + ".vsnd_template", + ".xml", + ".yaml", + ".yml", + } + _PRESENTATION_SET: set[str] = { + ".key", + ".odp", + ".ppt", + ".pptx", + } + _PROGRAM_SET: set[str] = {".app", ".exe"} + _SOURCE_ENGINE_SET: set[str] = { + ".vtf", + } + _SHORTCUT_SET: set[str] = {".desktop", ".lnk", ".url"} + _SPREADSHEET_SET: set[str] = { + ".csv", + ".numbers", + ".ods", + ".xls", + ".xlsx", + } + _VIDEO_SET: set[str] = { + ".3gp", + ".avi", + ".flv", + ".gifv", + ".hevc", + ".m4p", + ".m4v", + ".mkv", + ".mov", + ".mp4", + ".webm", + ".wmv", + } + + ADOBE_PHOTOSHOP_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.ADOBE_PHOTOSHOP, + extensions=_ADOBE_PHOTOSHOP_SET, + is_iana=False, + ) + AFFINITY_PHOTO_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.AFFINITY_PHOTO, + extensions=_AFFINITY_PHOTO_SET, + is_iana=False, + ) + ARCHIVE_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.ARCHIVE, + extensions=_ARCHIVE_SET, + is_iana=False, + ) + AUDIO_MIDI_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.AUDIO_MIDI, + extensions=_AUDIO_MIDI_SET, + is_iana=False, + ) + AUDIO_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.AUDIO, + extensions=_AUDIO_SET | _AUDIO_MIDI_SET, + is_iana=True, + ) + BLENDER_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.BLENDER, + extensions=_BLENDER_SET, + is_iana=False, + ) + DATABASE_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.DATABASE, + extensions=_DATABASE_SET, + is_iana=False, + ) + DISK_IMAGE_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.DISK_IMAGE, + extensions=_DISK_IMAGE_SET, + is_iana=False, + ) + DOCUMENT_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.DOCUMENT, + extensions=_DOCUMENT_SET, + is_iana=False, + ) + FONT_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.FONT, + extensions=_FONT_SET, + is_iana=True, + ) + IMAGE_ANIMATED_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.IMAGE_ANIMATED, + extensions=_IMAGE_ANIMATED_SET, + is_iana=False, + ) + IMAGE_RAW_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.IMAGE_RAW, + extensions=_IMAGE_RAW_SET, + is_iana=False, + ) + IMAGE_VECTOR_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.IMAGE_VECTOR, + extensions=_IMAGE_VECTOR_SET, + is_iana=False, + ) + IMAGE_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.IMAGE, + extensions=_IMAGE_SET | _IMAGE_RAW_SET | _IMAGE_VECTOR_SET, + is_iana=True, + ) + INSTALLER_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.INSTALLER, + extensions=_INSTALLER_SET, + is_iana=False, + ) + MATERIAL_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.MATERIAL, + extensions=_MATERIAL_SET, + is_iana=False, + ) + MODEL_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.MODEL, + extensions=_MODEL_SET, + is_iana=True, + ) + PACKAGE_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.PACKAGE, + extensions=_PACKAGE_SET, + is_iana=False, + ) + PDF_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.PDF, + extensions=_PDF_SET, + is_iana=False, + ) + PLAINTEXT_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.PLAINTEXT, + extensions=_PLAINTEXT_SET, + is_iana=False, + ) + PRESENTATION_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.PRESENTATION, + extensions=_PRESENTATION_SET, + is_iana=False, + ) + PROGRAM_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.PROGRAM, + extensions=_PROGRAM_SET, + is_iana=False, + ) + SHORTCUT_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.SHORTCUT, + extensions=_SHORTCUT_SET, + is_iana=False, + ) + SOURCE_ENGINE_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.SOURCE_ENGINE, + extensions=_SOURCE_ENGINE_SET, + is_iana=False, + ) + SPREADSHEET_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.SPREADSHEET, + extensions=_SPREADSHEET_SET, + is_iana=False, + ) + TEXT_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.TEXT, + extensions=_DOCUMENT_SET | _PLAINTEXT_SET, + is_iana=True, + ) + VIDEO_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.VIDEO, + extensions=_VIDEO_SET, + is_iana=True, + ) + + ALL_CATEGORIES: list[MediaCategory] = [ + ADOBE_PHOTOSHOP_TYPES, + AFFINITY_PHOTO_TYPES, + ARCHIVE_TYPES, + AUDIO_MIDI_TYPES, + AUDIO_TYPES, + BLENDER_TYPES, + DATABASE_TYPES, + DISK_IMAGE_TYPES, + DOCUMENT_TYPES, + FONT_TYPES, + IMAGE_ANIMATED_TYPES, + IMAGE_RAW_TYPES, + IMAGE_TYPES, + IMAGE_VECTOR_TYPES, + INSTALLER_TYPES, + MATERIAL_TYPES, + MODEL_TYPES, + PACKAGE_TYPES, + PDF_TYPES, + PLAINTEXT_TYPES, + PRESENTATION_TYPES, + PROGRAM_TYPES, + SHORTCUT_TYPES, + SOURCE_ENGINE_TYPES, + SPREADSHEET_TYPES, + TEXT_TYPES, + VIDEO_TYPES, + ] + + @staticmethod + def get_types(ext: str, mime_fallback: bool = False) -> set[MediaType]: + """Return a set of MediaTypes given a file extension. + + Args: + ext (str): File extension with a leading "." and in all lowercase. + mime_fallback (bool): Flag to guess MIME type if no set matches are made. + """ + media_types: set[MediaType] = set() + # mime_guess: bool = False + + for cat in MediaCategories.ALL_CATEGORIES: + if ext in cat.extensions: + media_types.add(cat.media_type) + elif mime_fallback and cat.is_iana: + mime_type: str = mimetypes.guess_type(Path("x" + ext), strict=False)[0] + if mime_type and mime_type.startswith(cat.media_type.value): + media_types.add(cat.media_type) + # mime_guess = True + return media_types + + @staticmethod + def is_ext_in_category(ext: str, media_cat: MediaCategory, mime_fallback: bool = False) -> bool: + """Check if an extension is a member of a MediaCategory. + + Args: + ext (str): File extension with a leading "." and in all lowercase. + media_cat (MediaCategory): The MediaCategory to to check for extension membership. + mime_fallback (bool): Flag to guess MIME type if no set matches are made. + """ + if ext in media_cat.extensions: + return True + elif mime_fallback and media_cat.is_iana: + mime_type: str = mimetypes.guess_type(Path("x" + ext), strict=False)[0] + if mime_type and mime_type.startswith(media_cat.media_type.value): + return True + return False diff --git a/tagstudio/src/core/palette.py b/tagstudio/src/core/palette.py index f104b692..422b35f7 100644 --- a/tagstudio/src/core/palette.py +++ b/tagstudio/src/core/palette.py @@ -19,6 +19,15 @@ class ColorType(IntEnum): DARK_ACCENT = 4 +class UiColor(IntEnum): + DEFAULT = 0 + THEME_DARK = 1 + THEME_LIGHT = 2 + RED = 3 + GREEN = 4 + PURPLE = 5 + + TAG_COLORS: dict[TagColor, dict[ColorType, Any]] = { TagColor.DEFAULT: { ColorType.PRIMARY: "#1e1e1e", @@ -283,8 +292,56 @@ TAG_COLORS: dict[TagColor, dict[ColorType, Any]] = { }, } +UI_COLORS: dict[UiColor, dict[ColorType, Any]] = { + UiColor.DEFAULT: { + ColorType.PRIMARY: "#333333", + ColorType.BORDER: "#555555", + ColorType.LIGHT_ACCENT: "#FFFFFF", + ColorType.DARK_ACCENT: "#1e1e1e", + }, + UiColor.RED: { + ColorType.PRIMARY: "#e22c3c", + ColorType.BORDER: "#e54252", + ColorType.LIGHT_ACCENT: "#f39caa", + ColorType.DARK_ACCENT: "#440d12", + }, + UiColor.GREEN: { + ColorType.PRIMARY: "#28bb48", + ColorType.BORDER: "#43c568", + ColorType.LIGHT_ACCENT: "#DDFFCC", + ColorType.DARK_ACCENT: "#0d3828", + }, + UiColor.PURPLE: { + ColorType.PRIMARY: "#C76FF3", + ColorType.BORDER: "#c364f2", + ColorType.LIGHT_ACCENT: "#EFD4FB", + ColorType.DARK_ACCENT: "#3E1555", + }, + UiColor.THEME_DARK: { + ColorType.PRIMARY: "#333333", + ColorType.BORDER: "#555555", + ColorType.LIGHT_ACCENT: "#FFFFFF", + ColorType.DARK_ACCENT: "#1e1e1e", + }, + UiColor.THEME_LIGHT: { + ColorType.PRIMARY: "#FFFFFF", + ColorType.BORDER: "#333333", + ColorType.LIGHT_ACCENT: "#999999", + ColorType.DARK_ACCENT: "#888888", + }, +} + def get_tag_color(color_type: ColorType, color_id: TagColor) -> str: + """Return a hex value given a tag color name and ColorType. + + Args: + color_type (ColorType): The ColorType category to retrieve from. + color_id (ColorType): The color name enum to retrieve from. + + Return: + A hex value string representing a color with a leading "#". + """ try: if color_type == ColorType.TEXT: text_account: ColorType = TAG_COLORS[color_id][color_type] @@ -293,5 +350,23 @@ def get_tag_color(color_type: ColorType, color_id: TagColor) -> str: return TAG_COLORS[color_id][color_type] except KeyError: traceback.print_stack() - logger.error("Color not found", color_id=color_id) + logger.error("[PALETTE] Tag color not found.", color_id=color_id) + return "#FF00FF" + + +def get_ui_color(color_type: ColorType, color_id: UiColor) -> str: + """Return a hex value given a UI color name and ColorType. + + Args: + color_type (ColorType): The ColorType category to retrieve from. + color_id (UiColor): The color name enum to retrieve from. + + Return: + A hex value string representing a color with a leading "#". + """ + try: + return UI_COLORS[color_id][color_type] + except KeyError: + traceback.print_stack() + logger.error("[PALETTE] UI color not found", color_id=color_id) return "#FF00FF" diff --git a/tagstudio/src/qt/helpers/blender_thumbnailer.py b/tagstudio/src/qt/helpers/blender_thumbnailer.py new file mode 100644 index 00000000..2df0a350 --- /dev/null +++ b/tagstudio/src/qt/helpers/blender_thumbnailer.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python3 + +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +# + + +## This file is a modified script that gets the thumbnail data stored in a blend file + + +import gzip +import os +import struct +from io import BufferedReader + +from PIL import ( + Image, + ImageOps, +) + + +def blend_extract_thumb(path): + rend = b"REND" + test = b"TEST" + + blendfile: BufferedReader | gzip.GzipFile = open(path, "rb") # noqa: SIM115 + + head = blendfile.read(12) + + if head[0:2] == b"\x1f\x8b": # gzip magic + blendfile.close() + blendfile = gzip.GzipFile("", "rb", 0, open(path, "rb")) # noqa: SIM115 + head = blendfile.read(12) + + if not head.startswith(b"BLENDER"): + blendfile.close() + return None, 0, 0 + + is_64_bit = head[7] == b"-"[0] + + # true for PPC, false for X86 + is_big_endian = head[8] == b"V"[0] + + # blender pre 2.5 had no thumbs + if head[9:11] <= b"24": + return None, 0, 0 + + sizeof_bhead = 24 if is_64_bit else 20 + int_endian = ">i" if is_big_endian else " Image.Image: +def theme_fg_overlay(image: Image.Image, use_alpha: bool = True) -> Image.Image: """Overlay the foreground theme color onto an image. Args: image (Image): The PIL Image object to apply an overlay to. + use_alpha (bool): Option to retain the base image's alpha value when applying the overlay. """ + dark_fg: str = _THEME_DARK_FG[:-2] if not use_alpha else _THEME_DARK_FG + light_fg: str = _THEME_LIGHT_FG[:-2] if not use_alpha else _THEME_LIGHT_FG + overlay_color = ( - _THEME_DARK_FG - if QGuiApplication.styleHints().colorScheme() is Qt.ColorScheme.Dark - else _THEME_LIGHT_FG + dark_fg if QGuiApplication.styleHints().colorScheme() is Qt.ColorScheme.Dark else light_fg ) + im = Image.new(mode="RGBA", size=image.size, color=overlay_color) return _apply_overlay(image, im) @@ -42,7 +47,7 @@ def gradient_overlay(image: Image.Image, gradient=list[str]) -> Image.Image: def _apply_overlay(image: Image.Image, overlay: Image.Image) -> Image.Image: - """Apply an overlay on top of an image, using the image's alpha channel as a mask. + """Apply an overlay on top of an image using the image's alpha channel as a mask. Args: image (Image): The PIL Image object to apply an overlay to. diff --git a/tagstudio/src/qt/helpers/file_tester.py b/tagstudio/src/qt/helpers/file_tester.py new file mode 100644 index 00000000..022ac191 --- /dev/null +++ b/tagstudio/src/qt/helpers/file_tester.py @@ -0,0 +1,32 @@ +# Copyright (C) 2024 Travis Abendshien (CyanVoxel). +# Licensed under the GPL-3.0 License. +# Created for TagStudio: https://github.com/CyanVoxel/TagStudio + + +from pathlib import Path + +import ffmpeg +from src.qt.helpers.vendored.ffmpeg import _probe + + +def is_readable_video(filepath: Path | str): + """Test if a video is in a readable format. + + Examples of unreadable videos include files with undetermined codecs and DRM-protected content. + + Args: + filepath (Path | str): The filepath of the video to check. + """ + try: + probe = _probe(Path(filepath)) + for stream in probe["streams"]: + # DRM check + if stream.get("codec_tag_string") in [ + "drma", + "drms", + "drmi", + ]: + return False + except ffmpeg.Error: + return False + return True diff --git a/tagstudio/src/qt/helpers/gradient.py b/tagstudio/src/qt/helpers/gradient.py index a5f3b9fa..fe3f7c7d 100644 --- a/tagstudio/src/qt/helpers/gradient.py +++ b/tagstudio/src/qt/helpers/gradient.py @@ -2,26 +2,14 @@ # Licensed under the GPL-3.0 License. # Created for TagStudio: https://github.com/CyanVoxel/TagStudio -from PIL import Image, ImageChops, ImageEnhance +from PIL import Image -def four_corner_gradient_background(image: Image.Image, adj_size, mask, hl) -> Image.Image: - if image.size != (adj_size, adj_size): - # Old 1 color method. - # bg_col = image.copy().resize((1, 1)).getpixel((0,0)) - # bg = Image.new(mode='RGB',size=(adj_size,adj_size),color=bg_col) - # bg.thumbnail((1, 1)) - # bg = bg.resize((adj_size,adj_size), resample=Image.Resampling.NEAREST) - - # Small gradient background. Looks decent, and is only a one-liner. - # bg = ( - # image.copy() - # .resize((2, 2), resample=Image.Resampling.BILINEAR) - # .resize((adj_size, adj_size), resample=Image.Resampling.BILINEAR) - # ) - +def four_corner_gradient( + image: Image.Image, size: tuple[int, int], mask: Image.Image +) -> Image.Image: + if image.size != size: # Four-Corner Gradient Background. - # Not exactly a one-liner, but it's (subjectively) really cool. tl = image.getpixel((0, 0)) tr = image.getpixel(((image.size[0] - 1), 0)) bl = image.getpixel((0, (image.size[1] - 1))) @@ -31,26 +19,25 @@ def four_corner_gradient_background(image: Image.Image, adj_size, mask, hl) -> I bg.paste(tr, (1, 0, 2, 2)) bg.paste(bl, (0, 1, 2, 2)) bg.paste(br, (1, 1, 2, 2)) - bg = bg.resize((adj_size, adj_size), resample=Image.Resampling.BICUBIC) - + bg = bg.resize(size, resample=Image.Resampling.BICUBIC) bg.paste( image, box=( - (adj_size - image.size[0]) // 2, - (adj_size - image.size[1]) // 2, + (size[0] - image.size[0]) // 2, + (size[1] - image.size[1]) // 2, ), ) - bg.putalpha(mask) - final = bg + final = Image.new("RGBA", bg.size, (0, 0, 0, 0)) + final.paste(bg, mask=mask.getchannel(0)) else: - image.putalpha(mask) - final = image + final = Image.new("RGBA", size, (0, 0, 0, 0)) + final.paste(image, mask=mask.getchannel(0)) + + if final.mode != "RGBA": + final = final.convert("RGBA") - hl_soft = hl.copy() - hl_soft.putalpha(ImageEnhance.Brightness(hl.getchannel(3)).enhance(0.5)) - final.paste(ImageChops.soft_light(final, hl_soft), mask=hl_soft.getchannel(3)) return final diff --git a/tagstudio/src/qt/helpers/rounded_pixmap_style.py b/tagstudio/src/qt/helpers/rounded_pixmap_style.py new file mode 100644 index 00000000..36c33c79 --- /dev/null +++ b/tagstudio/src/qt/helpers/rounded_pixmap_style.py @@ -0,0 +1,29 @@ +# Based on the implementation by eyllanesc: +# https://stackoverflow.com/questions/54230005/qmovie-with-border-radius +# Licensed under the Creative Commons CC BY-SA 4.0 License: +# https://creativecommons.org/licenses/by-sa/4.0/ +# Modified for TagStudio: https://github.com/CyanVoxel/TagStudio + +from PySide6.QtGui import QBrush, QColor, QPainter, QPixmap +from PySide6.QtWidgets import ( + QProxyStyle, +) + + +class RoundedPixmapStyle(QProxyStyle): + def __init__(self, radius=8): + super().__init__() + self._radius = radius + + def drawItemPixmap(self, painter, rectangle, alignment, pixmap): # noqa: N802 + painter.save() + pix = QPixmap(pixmap.size()) + pix.fill(QColor("transparent")) + p = QPainter(pix) + p.setBrush(QBrush(pixmap)) + p.setPen(QColor("transparent")) + p.setRenderHint(QPainter.RenderHint.Antialiasing) + p.drawRoundedRect(pixmap.rect(), self._radius, self._radius) + p.end() + super().drawItemPixmap(painter, rectangle, alignment, pix) + painter.restore() diff --git a/tagstudio/src/qt/helpers/silent_popen.py b/tagstudio/src/qt/helpers/silent_popen.py new file mode 100644 index 00000000..df426fe5 --- /dev/null +++ b/tagstudio/src/qt/helpers/silent_popen.py @@ -0,0 +1,70 @@ +# Copyright (C) 2024 Travis Abendshien (CyanVoxel). +# Licensed under the GPL-3.0 License. +# Created for TagStudio: https://github.com/CyanVoxel/TagStudio +import subprocess +import sys + +"""Implementation of subprocess.Popen that does not spawn console windows or log output.""" + + +def promptless_Popen( # noqa: N802 + args, + bufsize=-1, + executable=None, + stdin=None, + stdout=None, + stderr=None, + preexec_fn=None, + close_fds=True, + shell=False, + cwd=None, + env=None, + universal_newlines=None, + startupinfo=None, + restore_signals=True, + start_new_session=False, + pass_fds=(), + *, + group=None, + extra_groups=None, + user=None, + umask=-1, + encoding=None, + errors=None, + text=None, + pipesize=-1, + process_group=None, +): + """Call subprocess.Popen without creating a console window.""" + creation_flags = 0 + if sys.platform == "win32": + creation_flags = subprocess.CREATE_NO_WINDOW + + return subprocess.Popen( + args=args, + bufsize=bufsize, + executable=executable, + stdin=stdin, + stdout=stdout, + stderr=stderr, + preexec_fn=preexec_fn, + close_fds=close_fds, + shell=shell, + cwd=cwd, + env=env, + universal_newlines=universal_newlines, + startupinfo=startupinfo, + creationflags=creation_flags, + restore_signals=restore_signals, + start_new_session=start_new_session, + pass_fds=pass_fds, + group=group, + extra_groups=extra_groups, + user=user, + umask=umask, + encoding=encoding, + errors=errors, + text=text, + pipesize=pipesize, + process_group=process_group, + ) diff --git a/tagstudio/src/qt/helpers/text_wrapper.py b/tagstudio/src/qt/helpers/text_wrapper.py new file mode 100644 index 00000000..073f6e15 --- /dev/null +++ b/tagstudio/src/qt/helpers/text_wrapper.py @@ -0,0 +1,49 @@ +# Copyright (C) 2024 Travis Abendshien (CyanVoxel). +# Licensed under the GPL-3.0 License. +# Created for TagStudio: https://github.com/CyanVoxel/TagStudio + +from PIL import Image, ImageDraw, ImageFont + + +def wrap_line( # type: ignore + text: str, + font: ImageFont.ImageFont, + width: int = 256, + draw: ImageDraw.ImageDraw = None, +) -> int: + """Take in a single text line and return the index it should be broken up at. + + Only splits once. + """ + if draw is None: + bg = Image.new("RGB", (width, width), color="#1e1e1e") + draw = ImageDraw.Draw(bg) + if draw.textlength(text, font=font) > width: + for i in range( + int(len(text) / int(draw.textlength(text, font=font)) * width) - 2, + 0, + -1, + ): + if draw.textlength(text[:i], font=font) < width: + return i + else: + return -1 + + +def wrap_full_text( + text: str, + font: ImageFont.ImageFont, + width: int = 256, + draw: ImageDraw.ImageDraw = None, +) -> str: + """Break up a string to fit the canvas given a kerning value, font size, etc.""" + lines = [] + i = 0 + last_i = 0 + while wrap_line(text[i:], font=font, width=width, draw=draw) > 0: + i = wrap_line(text[i:], font=font, width=width, draw=draw) + last_i + lines.append(text[last_i:i]) + last_i = i + lines.append(text[last_i:]) + text_wrapped = "\n".join(lines) + return text_wrapped diff --git a/tagstudio/src/qt/helpers/vendored/ffmpeg.py b/tagstudio/src/qt/helpers/vendored/ffmpeg.py new file mode 100644 index 00000000..097e78a2 --- /dev/null +++ b/tagstudio/src/qt/helpers/vendored/ffmpeg.py @@ -0,0 +1,33 @@ +# Copyright (C) 2022 Karl Kroening (kkroening). +# Licensed under the GPL-3.0 License. +# Vendored from ffmpeg-python and ffmpeg-python PR#790 by amamic1803 + +import json +import subprocess + +import ffmpeg +from src.qt.helpers.silent_popen import promptless_Popen + + +def _probe(filename, cmd="ffprobe", timeout=None, **kwargs): + """Run ffprobe on the specified file and return a JSON representation of the output. + + Raises: + :class:`ffmpeg.Error`: if ffprobe returns a non-zero exit code, + an :class:`Error` is returned with a generic error message. + The stderr output can be retrieved by accessing the + ``stderr`` property of the exception. + """ + args = [cmd, "-show_format", "-show_streams", "-of", "json"] + args += ffmpeg._utils.convert_kwargs_to_cmd_line_args(kwargs) + args += [filename] + + # PATCHED + p = promptless_Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + communicate_kwargs = {} + if timeout is not None: + communicate_kwargs["timeout"] = timeout + out, err = p.communicate(**communicate_kwargs) + if p.returncode != 0: + raise ffmpeg.Error("ffprobe", out, err) + return json.loads(out.decode("utf-8")) diff --git a/tagstudio/src/qt/helpers/vendored/pydub/audio_segment.py b/tagstudio/src/qt/helpers/vendored/pydub/audio_segment.py new file mode 100644 index 00000000..a43ea5b3 --- /dev/null +++ b/tagstudio/src/qt/helpers/vendored/pydub/audio_segment.py @@ -0,0 +1,1444 @@ +# type: ignore +# Copyright (C) 2022 James Robert (jiaaro). +# Licensed under the MIT License. +# Vendored from pydub + + +import array +import base64 +import os +import struct +import subprocess +import sys +import wave +from collections import namedtuple +from io import BytesIO, StringIO +from tempfile import NamedTemporaryFile + +from pydub.logging_utils import log_conversion, log_subprocess_output +from pydub.utils import fsdecode + +try: + from itertools import izip +except Exception: + izip = zip + +from pydub.exceptions import ( + CouldntDecodeError, + CouldntEncodeError, + InvalidDuration, + InvalidID3TagVersion, + InvalidTag, + MissingAudioParameter, + TooManyMissingFrames, +) +from pydub.utils import ( + _fd_or_path_or_tempfile, + audioop, + db_to_float, + get_array_type, + get_encoder_name, + ratio_to_db, +) +from src.qt.helpers.silent_popen import promptless_Popen +from src.qt.helpers.vendored.pydub.utils import _mediainfo_json + +basestring = str +xrange = range +StringIO = BytesIO # noqa: F811 + + +class ClassPropertyDescriptor: + def __init__(self, fget, fset=None): + self.fget = fget + self.fset = fset + + def __get__(self, obj, klass=None): + if klass is None: + klass = type(obj) + return self.fget.__get__(obj, klass)() + + def __set__(self, obj, value): + if not self.fset: + raise AttributeError("can't set attribute") + type_ = type(obj) + return self.fset.__get__(obj, type_)(value) + + def setter(self, func): + if not isinstance(func, (classmethod, staticmethod)): + func = classmethod(func) + self.fset = func + return self + + +def classproperty(func): + if not isinstance(func, (classmethod, staticmethod)): + func = classmethod(func) + + return ClassPropertyDescriptor(func) + + +AUDIO_FILE_EXT_ALIASES = { + "m4a": "mp4", + "wave": "wav", +} + +WavSubChunk = namedtuple("WavSubChunk", ["id", "position", "size"]) +WavData = namedtuple( + "WavData", ["audio_format", "channels", "sample_rate", "bits_per_sample", "raw_data"] +) + + +def extract_wav_headers(data): + # def search_subchunk(data, subchunk_id): + pos = 12 # The size of the RIFF chunk descriptor + subchunks = [] + while pos + 8 <= len(data) and len(subchunks) < 10: + subchunk_id = data[pos : pos + 4] + subchunk_size = struct.unpack_from(" 2**32: + raise CouldntDecodeError("Unable to process >4GB files") + + # Set the file size in the RIFF chunk descriptor + data[4:8] = struct.pack(" b"\x7f"[0]]) + old_bytes = struct.pack(pack_fmt, b0, b1, b2) + byte_buffer.write(old_bytes) + + self._data = byte_buffer.getvalue() + self.sample_width = 4 + self.frame_width = self.channels * self.sample_width + + super(_AudioSegment, self).__init__(*args, **kwargs) + + @property + def raw_data(self): + """Public access to the raw audio data as a bytestring.""" + return self._data + + def get_array_of_samples(self, array_type_override=None): + """Return the raw_data as an array of samples.""" + if array_type_override is None: + array_type_override = self.array_type + return array.array(array_type_override, self._data) + + @property + def array_type(self): + return get_array_type(self.sample_width * 8) + + def __len__(self): + """Return the length of this audio segment in milliseconds.""" + return round(1000 * (self.frame_count() / self.frame_rate)) + + def __eq__(self, other): + try: + return self._data == other._data + except Exception: + return False + + def __hash__(self): + return hash(_AudioSegment) ^ hash( + (self.channels, self.frame_rate, self.sample_width, self._data) + ) + + def __ne__(self, other): + return not (self == other) + + def __iter__(self): + return (self[i] for i in xrange(len(self))) + + def __getitem__(self, millisecond): + if isinstance(millisecond, slice): + if millisecond.step: + return ( + self[i : i + millisecond.step] for i in xrange(*millisecond.indices(len(self))) + ) + + start = millisecond.start if millisecond.start is not None else 0 + end = millisecond.stop if millisecond.stop is not None else len(self) + + start = min(start, len(self)) + end = min(end, len(self)) + else: + start = millisecond + end = millisecond + 1 + + start = self._parse_position(start) * self.frame_width + end = self._parse_position(end) * self.frame_width + data = self._data[start:end] + + # ensure the output is as long as the requester is expecting + expected_length = end - start + missing_frames = (expected_length - len(data)) // self.frame_width + if missing_frames: + if missing_frames > self.frame_count(ms=2): + raise TooManyMissingFrames( + "You should never be filling in " # noqa: UP031 + " more than 2 ms with silence here, " + "missing frames: %s" % missing_frames + ) + silence = audioop.mul(data[: self.frame_width], self.sample_width, 0) + data += silence * missing_frames + + return self._spawn(data) + + def get_sample_slice(self, start_sample=None, end_sample=None): + """Get a section of the audio segment by sample index. + + NOTE: Negative indices do *not* address samples backword + from the end of the audio segment like a python list. + This is intentional. + """ + max_val = int(self.frame_count()) + + def bounded(val, default): + if val is None: + return default + if val < 0: + return 0 + if val > max_val: + return max_val + return val + + start_i = bounded(start_sample, 0) * self.frame_width + end_i = bounded(end_sample, max_val) * self.frame_width + + data = self._data[start_i:end_i] + return self._spawn(data) + + def __add__(self, arg): + if isinstance(arg, _AudioSegment): + return self.append(arg, crossfade=0) + else: + return self.apply_gain(arg) + + def __radd__(self, rarg): + """Permit use of sum() builtin with an iterable of AudioSegments.""" + if rarg == 0: + return self + raise TypeError("Gains must be the second addend after the " "AudioSegment") + + def __sub__(self, arg): + if isinstance(arg, _AudioSegment): + raise TypeError("AudioSegment objects can't be subtracted from " "each other") + else: + return self.apply_gain(-arg) + + def __mul__(self, arg): + """If the argument is an AudioSegment, overlay the multiplied audio segment. + + If it's a number, just use the string multiply operation to repeat the + audio. + + The following would return an AudioSegment that contains the + audio of audio_seg eight times + + `audio_seg * 8` + """ + if isinstance(arg, _AudioSegment): + return self.overlay(arg, position=0, loop=True) + else: + return self._spawn(data=self._data * arg) + + def _spawn(self, data, overrides={}): # noqa: B006 + """Create a new audio segment using the metadata from the current one & the data passed in. + + Should be used whenever an AudioSegment is being returned by an operation that would alters + the current one, since AudioSegment objects are immutable. + """ + # accept lists of data chunks + if isinstance(data, list): + data = b"".join(data) + + if isinstance(data, array.array): + try: + data = data.tobytes() + except Exception: + data = data.tostring() + + # accept file-like objects + if hasattr(data, "read"): + if hasattr(data, "seek"): + data.seek(0) + data = data.read() + + metadata = { + "sample_width": self.sample_width, + "frame_rate": self.frame_rate, + "frame_width": self.frame_width, + "channels": self.channels, + } + metadata.update(overrides) + return self.__class__(data=data, metadata=metadata) + + @classmethod + def _sync(cls, *segs): + channels = max(seg.channels for seg in segs) + frame_rate = max(seg.frame_rate for seg in segs) + sample_width = max(seg.sample_width for seg in segs) + + return tuple( + seg.set_channels(channels).set_frame_rate(frame_rate).set_sample_width(sample_width) + for seg in segs + ) + + def _parse_position(self, val): + if val < 0: + val = len(self) - abs(val) + val = self.frame_count(ms=len(self)) if val == float("inf") else self.frame_count(ms=val) + return int(val) + + @classmethod + def empty(cls): + return cls( + b"", metadata={"channels": 1, "sample_width": 1, "frame_rate": 1, "frame_width": 1} + ) + + @classmethod + def silent(cls, duration=1000, frame_rate=11025): + """Generate a silent audio segment. + + Duration specified in milliseconds (default duration: 1000ms, default frame_rate: 11025). + """ + frames = int(frame_rate * (duration / 1000.0)) + data = b"\0\0" * frames + return cls( + data, + metadata={"channels": 1, "sample_width": 2, "frame_rate": frame_rate, "frame_width": 2}, + ) + + @classmethod + def from_mono_audiosegments(cls, *mono_segments): + if not len(mono_segments): + raise ValueError("At least one AudioSegment instance is required") + + segs = cls._sync(*mono_segments) + + if segs[0].channels != 1: + raise ValueError( + "AudioSegment.from_mono_audiosegments requires all " + "arguments are mono AudioSegment instances" + ) + + channels = len(segs) + sample_width = segs[0].sample_width + frame_rate = segs[0].frame_rate + + frame_count = max(int(seg.frame_count()) for seg in segs) + data = array.array(segs[0].array_type, b"\0" * (frame_count * sample_width * channels)) + + for i, seg in enumerate(segs): + data[i::channels] = seg.get_array_of_samples() + + return cls( + data, + channels=channels, + sample_width=sample_width, + frame_rate=frame_rate, + ) + + @classmethod + def from_file_using_temporary_files( + cls, + file, + format=None, + codec=None, + parameters=None, + start_second=None, + duration=None, + **kwargs, + ): + orig_file = file + file, close_file = _fd_or_path_or_tempfile(file, "rb", tempfile=False) + + if format: + format = format.lower() + format = AUDIO_FILE_EXT_ALIASES.get(format, format) + + def is_format(f): + f = f.lower() + if format == f: + return True + if isinstance(orig_file, basestring): + return orig_file.lower().endswith(f".{f}") + if isinstance(orig_file, bytes): + return orig_file.lower().endswith((f".{f}").encode()) + return False + + if is_format("wav"): + try: + obj = cls._from_safe_wav(file) + if close_file: + file.close() + if start_second is None and duration is None: + return obj + elif start_second is not None and duration is None: + return obj[start_second * 1000 :] + elif start_second is None and duration is not None: + return obj[: duration * 1000] + else: + return obj[start_second * 1000 : (start_second + duration) * 1000] + except Exception: + file.seek(0) + elif is_format("raw") or is_format("pcm"): + sample_width = kwargs["sample_width"] + frame_rate = kwargs["frame_rate"] + channels = kwargs["channels"] + metadata = { + "sample_width": sample_width, + "frame_rate": frame_rate, + "channels": channels, + "frame_width": channels * sample_width, + } + obj = cls(data=file.read(), metadata=metadata) + if close_file: + file.close() + if start_second is None and duration is None: + return obj + elif start_second is not None and duration is None: + return obj[start_second * 1000 :] + elif start_second is None and duration is not None: + return obj[: duration * 1000] + else: + return obj[start_second * 1000 : (start_second + duration) * 1000] + + input_file = NamedTemporaryFile(mode="wb", delete=False) + try: + input_file.write(file.read()) + except OSError: + input_file.flush() + input_file.close() + input_file = NamedTemporaryFile(mode="wb", delete=False, buffering=2**31 - 1) + if close_file: + file.close() + close_file = True + file = open(orig_file, buffering=2**13 - 1, mode="rb") + reader = file.read(2**31 - 1) + while reader: + input_file.write(reader) + reader = file.read(2**31 - 1) + input_file.flush() + if close_file: + file.close() + + output = NamedTemporaryFile(mode="rb", delete=False) + + conversion_command = [ + cls.converter, + "-y", # always overwrite existing files + ] + + # If format is not defined + # ffmpeg/avconv will detect it automatically + if format: + conversion_command += ["-f", format] + + if codec: + # force audio decoder + conversion_command += ["-acodec", codec] + + conversion_command += [ + "-i", + input_file.name, # input_file options (filename last) + "-vn", # Drop any video streams if there are any + "-f", + "wav", # output options (filename last) + ] + + if start_second is not None: + conversion_command += ["-ss", str(start_second)] + + if duration is not None: + conversion_command += ["-t", str(duration)] + + conversion_command += [output.name] + + if parameters is not None: + # extend arguments with arbitrary set + conversion_command.extend(parameters) + + log_conversion(conversion_command) + + with open(os.devnull, "rb") as devnull: + # PATCHED + p = promptless_Popen( + conversion_command, stdin=devnull, stdout=subprocess.PIPE, stderr=subprocess.PIPE + ) + p_out, p_err = p.communicate() + + log_subprocess_output(p_out) + log_subprocess_output(p_err) + + try: + if p.returncode != 0: + raise CouldntDecodeError( + "Decoding failed. ffmpeg returned error code: " # noqa: UP030 + "{0}\n\nOutput from ffmpeg/avlib:\n\n{1}".format( + p.returncode, p_err.decode(errors="ignore") + ) + ) + obj = cls._from_safe_wav(output) + finally: + input_file.close() + output.close() + os.unlink(input_file.name) + os.unlink(output.name) + + if start_second is None and duration is None: + return obj + elif start_second is not None and duration is None: + return obj[0:] + elif start_second is None and duration is not None: + return obj[: duration * 1000] + else: + return obj[0 : duration * 1000] + + @classmethod + def from_file( + cls, + file, + format=None, + codec=None, + parameters=None, + start_second=None, + duration=None, + **kwargs, + ): + orig_file = file + try: + filename = fsdecode(file) + except TypeError: + filename = None + file, close_file = _fd_or_path_or_tempfile(file, "rb", tempfile=False) + + if format: + format = format.lower() + format = AUDIO_FILE_EXT_ALIASES.get(format, format) + + def is_format(f): + f = f.lower() + if format == f: + return True + + if filename: + return filename.lower().endswith(f".{f}") + + return False + + if is_format("wav"): + try: + if start_second is None and duration is None: + return cls._from_safe_wav(file) + elif start_second is not None and duration is None: + return cls._from_safe_wav(file)[start_second * 1000 :] + elif start_second is None and duration is not None: + return cls._from_safe_wav(file)[: duration * 1000] + else: + return cls._from_safe_wav(file)[ + start_second * 1000 : (start_second + duration) * 1000 + ] + except Exception: + file.seek(0) + elif is_format("raw") or is_format("pcm"): + sample_width = kwargs["sample_width"] + frame_rate = kwargs["frame_rate"] + channels = kwargs["channels"] + metadata = { + "sample_width": sample_width, + "frame_rate": frame_rate, + "channels": channels, + "frame_width": channels * sample_width, + } + if start_second is None and duration is None: + return cls(data=file.read(), metadata=metadata) + elif start_second is not None and duration is None: + return cls(data=file.read(), metadata=metadata)[start_second * 1000 :] + elif start_second is None and duration is not None: + return cls(data=file.read(), metadata=metadata)[: duration * 1000] + else: + return cls(data=file.read(), metadata=metadata)[ + start_second * 1000 : (start_second + duration) * 1000 + ] + + conversion_command = [ + cls.converter, + "-y", # always overwrite existing files + ] + + # If format is not defined + # ffmpeg/avconv will detect it automatically + if format: + conversion_command += ["-f", format] + + if codec: + # force audio decoder + conversion_command += ["-acodec", codec] + + read_ahead_limit = kwargs.get("read_ahead_limit", -1) + if filename: + conversion_command += ["-i", filename] + stdin_parameter = None + stdin_data = None + else: + if cls.converter == "ffmpeg": + conversion_command += [ + "-read_ahead_limit", + str(read_ahead_limit), + "-i", + "cache:pipe:0", + ] + else: + conversion_command += ["-i", "-"] + stdin_parameter = subprocess.PIPE + stdin_data = file.read() + + if codec: + info = None + else: + # PATCHED + try: + info = _mediainfo_json(orig_file, read_ahead_limit=read_ahead_limit) + except FileNotFoundError: + raise ChildProcessError + if info: + audio_streams = [x for x in info["streams"] if x["codec_type"] == "audio"] + # This is a workaround for some ffprobe versions that always say + # that mp3/mp4/aac/webm/ogg files contain fltp samples + audio_codec = audio_streams[0].get("codec_name") + if audio_streams[0].get("sample_fmt") == "fltp" and audio_codec in [ + "mp3", + "mp4", + "aac", + "webm", + "ogg", + ]: + bits_per_sample = 16 + else: + bits_per_sample = audio_streams[0]["bits_per_sample"] + acodec = "pcm_u8" if bits_per_sample == 8 else "pcm_s%dle" % bits_per_sample + + conversion_command += ["-acodec", acodec] + + conversion_command += [ + "-vn", # Drop any video streams if there are any + "-f", + "wav", # output options (filename last) + ] + + if start_second is not None: + conversion_command += ["-ss", str(start_second)] + + if duration is not None: + conversion_command += ["-t", str(duration)] + + conversion_command += ["-"] + + if parameters is not None: + # extend arguments with arbitrary set + conversion_command.extend(parameters) + + log_conversion(conversion_command) + + # PATCHED + p = promptless_Popen( + conversion_command, + stdin=stdin_parameter, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + p_out, p_err = p.communicate(input=stdin_data) + + if p.returncode != 0 or len(p_out) == 0: + if close_file: + file.close() + raise CouldntDecodeError( + "Decoding failed. ffmpeg returned error code: " # noqa: UP030 + "{0}\n\nOutput from ffmpeg/avlib:\n\n{1}".format( + p.returncode, p_err.decode(errors="ignore") + ) + ) + + p_out = bytearray(p_out) + fix_wav_headers(p_out) + p_out = bytes(p_out) + obj = cls(p_out) + + if close_file: + file.close() + + if start_second is None and duration is None: + return obj + elif start_second is not None and duration is None: + return obj[0:] + elif start_second is None and duration is not None: + return obj[: duration * 1000] + else: + return obj[0 : duration * 1000] + + @classmethod + def from_mp3(cls, file, parameters=None): + return cls.from_file(file, "mp3", parameters=parameters) + + @classmethod + def from_flv(cls, file, parameters=None): + return cls.from_file(file, "flv", parameters=parameters) + + @classmethod + def from_ogg(cls, file, parameters=None): + return cls.from_file(file, "ogg", parameters=parameters) + + @classmethod + def from_wav(cls, file, parameters=None): + return cls.from_file(file, "wav", parameters=parameters) + + @classmethod + def from_raw(cls, file, **kwargs): + return cls.from_file( + file, + "raw", + sample_width=kwargs["sample_width"], + frame_rate=kwargs["frame_rate"], + channels=kwargs["channels"], + ) + + @classmethod + def _from_safe_wav(cls, file): + file, close_file = _fd_or_path_or_tempfile(file, "rb", tempfile=False) + file.seek(0) + obj = cls(data=file) + if close_file: + file.close() + return obj + + def export( + self, + out_f=None, + format="mp3", + codec=None, + bitrate=None, + parameters=None, + tags=None, + id3v2_version="4", + cover=None, + ): + """Export an AudioSegment to a file with the given options. + + out_f (string): + Path to destination audio file. Also accepts os.PathLike objects on + python >= 3.6 + + format (string) + Format for destination audio file. + ('mp3', 'wav', 'raw', 'ogg' or other ffmpeg/avconv supported files) + + codec (string) + Codec used to encode the destination file. + + bitrate (string) + Bitrate used when encoding destination file. (64, 92, 128, 256, 312k...) + Each codec accepts different bitrate arguments so take a look at the + ffmpeg documentation for details (bitrate usually shown as -b, -ba or + -a:b). + + parameters (list of strings) + Aditional ffmpeg/avconv parameters + + tags (dict) + Set metadata information to destination files + usually used as tags. ({title='Song Title', artist='Song Artist'}) + + id3v2_version (string) + Set ID3v2 version for tags. (default: '4') + + cover (file) + Set cover for audio file from image file. (png or jpg) + """ + id3v2_allowed_versions = ["3", "4"] + + if format == "raw" and (codec is not None or parameters is not None): + raise AttributeError( + 'Can not invoke ffmpeg when export format is "raw"; ' + 'specify an ffmpeg raw format like format="s16le" instead ' + 'or call export(format="raw") with no codec or parameters' + ) + + out_f, _ = _fd_or_path_or_tempfile(out_f, "wb+") + out_f.seek(0) + + if format == "raw": + out_f.write(self._data) + out_f.seek(0) + return out_f + + # wav with no ffmpeg parameters can just be written directly to out_f + easy_wav = format == "wav" and codec is None and parameters is None + + data = out_f if easy_wav else NamedTemporaryFile(mode="wb", delete=False) + + pcm_for_wav = self._data + if self.sample_width == 1: + # convert to unsigned integers for wav + pcm_for_wav = audioop.bias(self._data, 1, 128) + + wave_data = wave.open(data, "wb") + wave_data.setnchannels(self.channels) + wave_data.setsampwidth(self.sample_width) + wave_data.setframerate(self.frame_rate) + # For some reason packing the wave header struct with + # a float in python 2 doesn't throw an exception + wave_data.setnframes(int(self.frame_count())) + wave_data.writeframesraw(pcm_for_wav) + wave_data.close() + + # for easy wav files, we're done (wav data is written directly to out_f) + if easy_wav: + out_f.seek(0) + return out_f + + output = NamedTemporaryFile(mode="w+b", delete=False) + + # build converter command to export + conversion_command = [ + self.converter, + "-y", # always overwrite existing files + "-f", + "wav", + "-i", + data.name, # input options (filename last) + ] + + if codec is None: + codec = self.DEFAULT_CODECS.get(format, None) + + if cover is not None: + if ( + cover.lower().endswith((".png", ".jpg", ".jpeg", ".bmp", ".tif", ".tiff")) + and format == "mp3" + ): + conversion_command.extend(["-i", cover, "-map", "0", "-map", "1", "-c:v", "mjpeg"]) + else: + raise AttributeError( + "Currently cover images are only supported by MP3 files. The allowed image " + "formats are: .tif, .jpg, .bmp, .jpeg and .png." + ) + + if codec is not None: + # force audio encoder + conversion_command.extend(["-acodec", codec]) + + if bitrate is not None: + conversion_command.extend(["-b:a", bitrate]) + + if parameters is not None: + # extend arguments with arbitrary set + conversion_command.extend(parameters) + + if tags is not None: + if not isinstance(tags, dict): + raise InvalidTag("Tags must be a dictionary.") + else: + # Extend converter command with tags + # print(tags) + for key, value in tags.items(): + conversion_command.extend(["-metadata", f"{key}={value}"]) + + if format == "mp3": + # set id3v2 tag version + if id3v2_version not in id3v2_allowed_versions: + raise InvalidID3TagVersion( + "id3v2_version not allowed, allowed versions: %s" # noqa: UP031 + % id3v2_allowed_versions + ) + conversion_command.extend(["-id3v2_version", id3v2_version]) + + if sys.platform == "darwin" and codec == "mp3": + conversion_command.extend(["-write_xing", "0"]) + + conversion_command.extend( + [ + "-f", + format, + output.name, # output options (filename last) + ] + ) + + log_conversion(conversion_command) + + # read stdin / write stdout + with open(os.devnull, "rb") as devnull: + # PATCHED + p = promptless_Popen( + conversion_command, stdin=devnull, stdout=subprocess.PIPE, stderr=subprocess.PIPE + ) + p_out, p_err = p.communicate() + + log_subprocess_output(p_out) + log_subprocess_output(p_err) + + try: + if p.returncode != 0: + raise CouldntEncodeError( + "Encoding failed. ffmpeg/avlib returned error code: " # noqa: UP030 + "{0}\n\nCommand:{1}\n\nOutput from ffmpeg/avlib:\n\n{2}".format( + p.returncode, conversion_command, p_err.decode(errors="ignore") + ) + ) + + output.seek(0) + out_f.write(output.read()) + + finally: + data.close() + output.close() + os.unlink(data.name) + os.unlink(output.name) + + out_f.seek(0) + return out_f + + def get_frame(self, index): + frame_start = index * self.frame_width + frame_end = frame_start + self.frame_width + return self._data[frame_start:frame_end] + + def frame_count(self, ms=None): + """Return the number of frames for the given number of milliseconds. + + If not specified, return the number of frames in the whole AudioSegment + """ + if ms is not None: + return ms * (self.frame_rate / 1000.0) + else: + return float(len(self._data) // self.frame_width) + + def set_sample_width(self, sample_width): + if sample_width == self.sample_width: + return self + + frame_width = self.channels * sample_width + + return self._spawn( + audioop.lin2lin(self._data, self.sample_width, sample_width), + overrides={"sample_width": sample_width, "frame_width": frame_width}, + ) + + def set_frame_rate(self, frame_rate): + if frame_rate == self.frame_rate: + return self + + if self._data: + converted, _ = audioop.ratecv( + self._data, self.sample_width, self.channels, self.frame_rate, frame_rate, None + ) + else: + converted = self._data + + return self._spawn(data=converted, overrides={"frame_rate": frame_rate}) + + def set_channels(self, channels): + if channels == self.channels: + return self + + if channels == 2 and self.channels == 1: + fn = audioop.tostereo + frame_width = self.frame_width * 2 + fac = 1 + converted = fn(self._data, self.sample_width, fac, fac) + elif channels == 1 and self.channels == 2: + fn = audioop.tomono + frame_width = self.frame_width // 2 + fac = 0.5 + converted = fn(self._data, self.sample_width, fac, fac) + elif channels == 1: + channels_data = [seg.get_array_of_samples() for seg in self.split_to_mono()] + frame_count = int(self.frame_count()) + converted = array.array( + channels_data[0].typecode, b"\0" * (frame_count * self.sample_width) + ) + for raw_channel_data in channels_data: + for i in range(frame_count): + converted[i] += raw_channel_data[i] // self.channels + frame_width = self.frame_width // self.channels + elif self.channels == 1: + dup_channels = [self for iChannel in range(channels)] + return _AudioSegment.from_mono_audiosegments(*dup_channels) + else: + raise ValueError( + "AudioSegment.set_channels only supports mono-to-multi channel " + "and multi-to-mono channel conversion" + ) + + return self._spawn( + data=converted, overrides={"channels": channels, "frame_width": frame_width} + ) + + def split_to_mono(self): + if self.channels == 1: + return [self] + + samples = self.get_array_of_samples() + + mono_channels = [] + for i in range(self.channels): + samples_for_current_channel = samples[i :: self.channels] + + try: + mono_data = samples_for_current_channel.tobytes() + except AttributeError: + mono_data = samples_for_current_channel.tostring() + + mono_channels.append( + self._spawn(mono_data, overrides={"channels": 1, "frame_width": self.sample_width}) + ) + + return mono_channels + + @property + def rms(self): + return audioop.rms(self._data, self.sample_width) + + @property + def dBFS(self): # noqa: N802 + rms = self.rms + if not rms: + return -float("infinity") + return ratio_to_db(self.rms / self.max_possible_amplitude) + + @property + def max(self): + return audioop.max(self._data, self.sample_width) + + @property + def max_possible_amplitude(self): + bits = self.sample_width * 8 + max_possible_val = 2**bits + + # since half is above 0 and half is below the max amplitude is divided + return max_possible_val / 2 + + @property + def max_dBFS(self): + return ratio_to_db(self.max, self.max_possible_amplitude) + + @property + def duration_seconds(self): + return self.frame_rate and self.frame_count() / self.frame_rate or 0.0 + + def get_dc_offset(self, channel=1): + """Return a value between -1.0 and 1.0 representing the DC offset of a channel. + + 1 for left, 2 for right. + """ + if not 1 <= channel <= 2: + raise ValueError("channel value must be 1 (left) or 2 (right)") + + if self.channels == 1: + data = self._data + elif channel == 1: + data = audioop.tomono(self._data, self.sample_width, 1, 0) + else: + data = audioop.tomono(self._data, self.sample_width, 0, 1) + + return float(audioop.avg(data, self.sample_width)) / self.max_possible_amplitude + + def remove_dc_offset(self, channel=None, offset=None): + """Remove DC offset of given channel. Calculates offset if it's not given. + + Offset values must be in range -1.0 to 1.0. If channel is None, removes + DC offset from all available channels. + """ + if channel and not 1 <= channel <= 2: + raise ValueError("channel value must be None, 1 (left) or 2 (right)") + + if offset and not -1.0 <= offset <= 1.0: + raise ValueError("offset value must be in range -1.0 to 1.0") + + if offset: + offset = int(round(offset * self.max_possible_amplitude)) + + def remove_data_dc(data, off): + if not off: + off = audioop.avg(data, self.sample_width) + return audioop.bias(data, self.sample_width, -off) + + if self.channels == 1: + return self._spawn(data=remove_data_dc(self._data, offset)) + + left_channel = audioop.tomono(self._data, self.sample_width, 1, 0) + right_channel = audioop.tomono(self._data, self.sample_width, 0, 1) + + if not channel or channel == 1: + left_channel = remove_data_dc(left_channel, offset) + + if not channel or channel == 2: + right_channel = remove_data_dc(right_channel, offset) + + left_channel = audioop.tostereo(left_channel, self.sample_width, 1, 0) + right_channel = audioop.tostereo(right_channel, self.sample_width, 0, 1) + + return self._spawn(data=audioop.add(left_channel, right_channel, self.sample_width)) + + def apply_gain(self, volume_change): + return self._spawn( + data=audioop.mul(self._data, self.sample_width, db_to_float(float(volume_change))) + ) + + def overlay(self, seg, position=0, loop=False, times=None, gain_during_overlay=None): + """Overlay the provided segment on to this segment. + + Starts at the specified position and uses the specified looping behavior. + + seg (AudioSegment): + The audio segment to overlay on to this one. + + position (optional int): + The position to start overlaying the provided segment in to this + one. + + loop (optional bool): + Loop seg as many times as necessary to match this segment's length. + Overrides loops param. + + times (optional int): + Loop seg the specified number of times or until it matches this + segment's length. 1 means once, 2 means twice, ... 0 would make the + call a no-op + gain_during_overlay (optional int): + Changes this segment's volume by the specified amount during the + duration of time that seg is overlaid on top of it. When negative, + this has the effect of 'ducking' the audio under the overlay. + """ + if loop: + # match loop=True's behavior with new times (count) mechanism. + times = -1 + elif times is None: + # no times specified, just once through + times = 1 + elif times == 0: + # it's a no-op, make a copy since we never mutate + return self._spawn(self._data) + + output = StringIO() + + seg1, seg2 = _AudioSegment._sync(self, seg) + sample_width = seg1.sample_width + spawn = seg1._spawn + + output.write(seg1[:position]._data) + + # drop down to the raw data + seg1 = seg1[position:]._data + seg2 = seg2._data + pos = 0 + seg1_len = len(seg1) + seg2_len = len(seg2) + while times: + remaining = max(0, seg1_len - pos) + if seg2_len >= remaining: + seg2 = seg2[:remaining] + seg2_len = remaining + # we've hit the end, we're done looping (if we were) and this + # is our last go-around + times = 1 + + if gain_during_overlay: + seg1_overlaid = seg1[pos : pos + seg2_len] + seg1_adjusted_gain = audioop.mul( + seg1_overlaid, self.sample_width, db_to_float(float(gain_during_overlay)) + ) + output.write(audioop.add(seg1_adjusted_gain, seg2, sample_width)) + else: + output.write(audioop.add(seg1[pos : pos + seg2_len], seg2, sample_width)) + pos += seg2_len + + # dec times to break our while loop (eventually) + times -= 1 + + output.write(seg1[pos:]) + + return spawn(data=output) + + def append(self, seg, crossfade=100): + seg1, seg2 = _AudioSegment._sync(self, seg) + + if not crossfade: + return seg1._spawn(seg1._data + seg2._data) + elif crossfade > len(self): + raise ValueError( + f"Crossfade is longer than the original AudioSegment ({crossfade}ms > {len(self)}ms)" + ) + elif crossfade > len(seg): + raise ValueError( + f"Crossfade is longer than the appended AudioSegment ({crossfade}ms > {len(seg)}ms)" + ) + + xf = seg1[-crossfade:].fade(to_gain=-120, start=0, end=float("inf")) + xf *= seg2[:crossfade].fade(from_gain=-120, start=0, end=float("inf")) + + output = BytesIO() + + output.write(seg1[:-crossfade]._data) + output.write(xf._data) + output.write(seg2[crossfade:]._data) + + output.seek(0) + obj = seg1._spawn(data=output) + output.close() + return obj + + def fade(self, to_gain=0, from_gain=0, start=None, end=None, duration=None): + """Fade the volume of this audio segment. + + to_gain (float): + resulting volume_change in db + + start (int): + default = beginning of the segment + when in this segment to start fading in milliseconds + + end (int): + default = end of the segment + when in this segment to start fading in milliseconds + + duration (int): + default = until the end of the audio segment + the duration of the fade + """ + if None not in [duration, end, start]: + raise TypeError( + 'Only two of the three arguments, "start", ' + '"end", and "duration" may be specified' + ) + + # no fade == the same audio + if to_gain == 0 and from_gain == 0: + return self + + start = min(len(self), start) if start is not None else None + end = min(len(self), end) if end is not None else None + + if start is not None and start < 0: + start += len(self) + if end is not None and end < 0: + end += len(self) + + if duration is not None and duration < 0: + raise InvalidDuration("duration must be a positive integer") + + if duration: + if start is not None: + end = start + duration + elif end is not None: + start = end - duration + else: + duration = end - start + + from_power = db_to_float(from_gain) + + output = [] + + # original data - up until the crossfade portion, as is + before_fade = self[:start]._data + if from_gain != 0: + before_fade = audioop.mul(before_fade, self.sample_width, from_power) + output.append(before_fade) + + gain_delta = db_to_float(to_gain) - from_power + + # fades longer than 100ms can use coarse fading (one gain step per ms), + # shorter fades will have audible clicks so they use precise fading + # (one gain step per sample) + if duration > 100: + scale_step = gain_delta / duration + + for i in range(duration): + volume_change = from_power + (scale_step * i) + chunk = self[start + i] + chunk = audioop.mul(chunk._data, self.sample_width, volume_change) + + output.append(chunk) + else: + start_frame = self.frame_count(ms=start) + end_frame = self.frame_count(ms=end) + fade_frames = end_frame - start_frame + scale_step = gain_delta / fade_frames + + for i in range(int(fade_frames)): + volume_change = from_power + (scale_step * i) + sample = self.get_frame(int(start_frame + i)) + sample = audioop.mul(sample, self.sample_width, volume_change) + + output.append(sample) + + # original data after the crossfade portion, at the new volume + after_fade = self[end:]._data + if to_gain != 0: + after_fade = audioop.mul(after_fade, self.sample_width, db_to_float(to_gain)) + output.append(after_fade) + + return self._spawn(data=output) + + def fade_out(self, duration): + return self.fade(to_gain=-120, duration=duration, end=float("inf")) + + def fade_in(self, duration): + return self.fade(from_gain=-120, duration=duration, start=0) + + def reverse(self): + return self._spawn(data=audioop.reverse(self._data, self.sample_width)) + + def _repr_html_(self): + src = """ + + """ + fh = self.export() + data = base64.b64encode(fh.read()).decode("ascii") + return src.format(base64=data) diff --git a/tagstudio/src/qt/helpers/vendored/pydub/utils.py b/tagstudio/src/qt/helpers/vendored/pydub/utils.py new file mode 100644 index 00000000..5c9e3c4b --- /dev/null +++ b/tagstudio/src/qt/helpers/vendored/pydub/utils.py @@ -0,0 +1,89 @@ +import json +import re +import subprocess + +from pydub.utils import ( + _fd_or_path_or_tempfile, + fsdecode, + get_extra_info, + get_prober_name, +) +from src.qt.helpers.silent_popen import promptless_Popen + + +def _mediainfo_json(filepath, read_ahead_limit=-1): + """Return json dictionary with media info(codec, duration, size, bitrate...) from filepath.""" + prober = get_prober_name() + command_args = [ + "-v", + "info", + "-show_format", + "-show_streams", + ] + try: + command_args += [fsdecode(filepath)] + stdin_parameter = None + stdin_data = None + except TypeError: + if prober == "ffprobe": + command_args += ["-read_ahead_limit", str(read_ahead_limit), "cache:pipe:0"] + else: + command_args += ["-"] + stdin_parameter = subprocess.PIPE + file, close_file = _fd_or_path_or_tempfile(filepath, "rb", tempfile=False) + file.seek(0) + stdin_data = file.read() + if close_file: + file.close() + + command = [prober, "-of", "json"] + command_args + # PATCHED + res = promptless_Popen( + command, stdin=stdin_parameter, stdout=subprocess.PIPE, stderr=subprocess.PIPE + ) + output, stderr = res.communicate(input=stdin_data) + output = output.decode("utf-8", "ignore") + stderr = stderr.decode("utf-8", "ignore") + + try: + info = json.loads(output) + except json.decoder.JSONDecodeError: + # If ffprobe didn't give any information, just return it + # (for example, because the file doesn't exist) + return None + if not info: + return info + + extra_info = get_extra_info(stderr) + + audio_streams = [x for x in info["streams"] if x["codec_type"] == "audio"] + if len(audio_streams) == 0: + return info + + # We just operate on the first audio stream in case there are more + stream = audio_streams[0] + + def set_property(stream, prop, value): + if prop not in stream or stream[prop] == 0: + stream[prop] = value + + for token in extra_info[stream["index"]]: + m = re.match(r"([su]([0-9]{1,2})p?) \(([0-9]{1,2}) bit\)$", token) + m2 = re.match(r"([su]([0-9]{1,2})p?)( \(default\))?$", token) + if m: + set_property(stream, "sample_fmt", m.group(1)) + set_property(stream, "bits_per_sample", int(m.group(2))) + set_property(stream, "bits_per_raw_sample", int(m.group(3))) + elif m2: + set_property(stream, "sample_fmt", m2.group(1)) + set_property(stream, "bits_per_sample", int(m2.group(2))) + set_property(stream, "bits_per_raw_sample", int(m2.group(2))) + elif re.match(r"(flt)p?( \(default\))?$", token): + set_property(stream, "sample_fmt", token) + set_property(stream, "bits_per_sample", 32) + set_property(stream, "bits_per_raw_sample", 32) + elif re.match(r"(dbl)p?( \(default\))?$", token): + set_property(stream, "sample_fmt", token) + set_property(stream, "bits_per_sample", 64) + set_property(stream, "bits_per_raw_sample", 64) + return info diff --git a/tagstudio/src/qt/main_window.py b/tagstudio/src/qt/main_window.py index ce6b1e33..d3274c7e 100644 --- a/tagstudio/src/qt/main_window.py +++ b/tagstudio/src/qt/main_window.py @@ -36,7 +36,7 @@ class Ui_MainWindow(QMainWindow): def __init__(self, driver: "QtDriver", parent=None) -> None: super().__init__(parent) - self.driver = driver + self.driver: "QtDriver" = driver self.setupUi(self) # NOTE: These are old attempts to allow for a translucent/acrylic @@ -66,7 +66,7 @@ class Ui_MainWindow(QMainWindow): self.horizontalLayout = QHBoxLayout() self.horizontalLayout.setObjectName(u"horizontalLayout") - # ComboBox goup for search type and thumbnail size + # ComboBox group for search type and thumbnail size self.horizontalLayout_3 = QHBoxLayout() self.horizontalLayout_3.setObjectName("horizontalLayout_3") @@ -74,7 +74,7 @@ class Ui_MainWindow(QMainWindow): spacerItem = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout_3.addItem(spacerItem) - # Search type selector + # Search type selector self.comboBox_2 = QComboBox(self.centralwidget) self.comboBox_2.setMinimumSize(QSize(165, 0)) self.comboBox_2.setObjectName("comboBox_2") @@ -83,17 +83,17 @@ class Ui_MainWindow(QMainWindow): self.horizontalLayout_3.addWidget(self.comboBox_2) # Thumbnail Size placeholder - self.comboBox = QComboBox(self.centralwidget) - self.comboBox.setObjectName(u"comboBox") + self.thumb_size_combobox = QComboBox(self.centralwidget) + self.thumb_size_combobox.setObjectName(u"thumbSizeComboBox") sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( - self.comboBox.sizePolicy().hasHeightForWidth()) - self.comboBox.setSizePolicy(sizePolicy) - self.comboBox.setMinimumWidth(128) - self.comboBox.setMaximumWidth(128) - self.horizontalLayout_3.addWidget(self.comboBox) + self.thumb_size_combobox.sizePolicy().hasHeightForWidth()) + self.thumb_size_combobox.setSizePolicy(sizePolicy) + self.thumb_size_combobox.setMinimumWidth(128) + self.thumb_size_combobox.setMaximumWidth(352) + self.horizontalLayout_3.addWidget(self.thumb_size_combobox) self.gridLayout.addLayout(self.horizontalLayout_3, 5, 0, 1, 1) self.splitter = QSplitter() @@ -212,10 +212,10 @@ class Ui_MainWindow(QMainWindow): # Search type selector self.comboBox_2.setItemText(0, QCoreApplication.translate("MainWindow", "And (Includes All Tags)")) self.comboBox_2.setItemText(1, QCoreApplication.translate("MainWindow", "Or (Includes Any Tag)")) - self.comboBox.setCurrentText("") + self.thumb_size_combobox.setCurrentText("") # Thumbnail size selector - self.comboBox.setPlaceholderText( + self.thumb_size_combobox.setPlaceholderText( QCoreApplication.translate("MainWindow", u"Thumbnail Size", None)) # retranslateUi @@ -236,3 +236,4 @@ class Ui_MainWindow(QMainWindow): self.landing_widget.setHidden(True) self.landing_widget.set_status_label("") self.scrollArea.setHidden(False) + \ No newline at end of file diff --git a/tagstudio/src/qt/platform_strings.py b/tagstudio/src/qt/platform_strings.py new file mode 100644 index 00000000..9eda3ef8 --- /dev/null +++ b/tagstudio/src/qt/platform_strings.py @@ -0,0 +1,16 @@ +# Copyright (C) 2024 Travis Abendshien (CyanVoxel). +# Licensed under the GPL-3.0 License. +# Created for TagStudio: https://github.com/CyanVoxel/TagStudio + +"""A collection of platform-dependant strings.""" + +import platform + + +class PlatformStrings: + open_file_str: str = "Open in file explorer" + + if platform.system() == "Windows": + open_file_str = "Open in Explorer" + elif platform.system() == "Darwin": + open_file_str = "Reveal in Finder" diff --git a/tagstudio/src/qt/resource_manager.py b/tagstudio/src/qt/resource_manager.py index a9826e72..d9929e7b 100644 --- a/tagstudio/src/qt/resource_manager.py +++ b/tagstudio/src/qt/resource_manager.py @@ -7,6 +7,7 @@ from typing import Any import structlog import ujson +from PIL import Image logger = structlog.get_logger(__name__) @@ -17,6 +18,7 @@ class ResourceManager: _map: dict = {} _cache: dict[str, Any] = {} _initialized: bool = False + _res_folder: Path = Path(__file__).parents[2] def __init__(self) -> None: # Load JSON resource map @@ -26,6 +28,21 @@ class ResourceManager: logger.info("resources registered", count=len(ResourceManager._map.items())) ResourceManager._initialized = True + @staticmethod + def get_path(id: str) -> Path | None: + """Get a resource's path from the ResourceManager. + + Args: + id (str): The name of the resource. + + Returns: + Path: The resource path if found, else None. + """ + res: dict = ResourceManager._map.get(id) + if res: + return ResourceManager._res_folder / "resources" / res.get("path") + return None + def get(self, id: str) -> Any: """Get a resource from the ResourceManager. @@ -43,19 +60,29 @@ class ResourceManager: return cached_res else: res: dict = ResourceManager._map.get(id) - if res.get("mode") in ["r", "rb"]: - with open( - (Path(__file__).parents[2] / "resources" / res.get("path")), - res.get("mode"), - ) as f: - data = f.read() - if res.get("mode") == "rb": - data = bytes(data) - ResourceManager._cache[id] = data + if not res: + return None + try: + if res.get("mode") in ["r", "rb"]: + with open( + (ResourceManager._res_folder / "resources" / res.get("path")), + res.get("mode"), + ) as f: + data = f.read() + if res.get("mode") == "rb": + data = bytes(data) + ResourceManager._cache[id] = data + return data + elif res and res.get("mode") == "pil": + data = Image.open(ResourceManager._res_folder / "resources" / res.get("path")) return data - elif res.get("mode") in ["qt"]: - # TODO: Qt resource loading logic - pass + elif res.get("mode") in ["qt"]: + # TODO: Qt resource loading logic + pass + except FileNotFoundError: + path: Path = ResourceManager._res_folder / "resources" / res.get("path") + logger.error("[ResourceManager][ERROR]: Could not find resource: ", path) + return None def __getattr__(self, __name: str) -> Any: attr = self.get(__name) diff --git a/tagstudio/src/qt/resources.json b/tagstudio/src/qt/resources.json index 1f8663d3..e5857909 100644 --- a/tagstudio/src/qt/resources.json +++ b/tagstudio/src/qt/resources.json @@ -14,5 +14,85 @@ "volume_mute_icon": { "path": "qt/images/volume_mute.svg", "mode": "rb" + }, + "broken_link_icon": { + "path": "qt/images/broken_link_icon.png", + "mode": "pil" + }, + "adobe_illustrator": { + "path": "qt/images/file_icons/adobe_illustrator.png", + "mode": "pil" + }, + "adobe_photoshop": { + "path": "qt/images/file_icons/adobe_photoshop.png", + "mode": "pil" + }, + "affinity_photo": { + "path": "qt/images/file_icons/affinity_photo.png", + "mode": "pil" + }, + "audio": { + "path": "qt/images/file_icons/audio.png", + "mode": "pil" + }, + "blender": { + "path": "qt/images/file_icons/blender.png", + "mode": "pil" + }, + "document": { + "path": "qt/images/file_icons/document.png", + "mode": "pil" + }, + "file_generic": { + "path": "qt/images/file_icons/file_generic.png", + "mode": "pil" + }, + "font": { + "path": "qt/images/file_icons/font.png", + "mode": "pil" + }, + "image": { + "path": "qt/images/file_icons/image.png", + "mode": "pil" + }, + "image_vector": { + "path": "qt/images/file_icons/image_vector.png", + "mode": "pil" + }, + "material": { + "path": "qt/images/file_icons/material.png", + "mode": "pil" + }, + "model": { + "path": "qt/images/file_icons/model.png", + "mode": "pil" + }, + "presentation": { + "path": "qt/images/file_icons/presentation.png", + "mode": "pil" + }, + "program": { + "path": "qt/images/file_icons/program.png", + "mode": "pil" + }, + "spreadsheet": { + "path": "qt/images/file_icons/spreadsheet.png", + "mode": "pil" + }, + "text": { + "path": "qt/images/file_icons/text.png", + "mode": "pil" + }, + "video": { + "path": "qt/images/file_icons/video.png", + "mode": "pil" + }, + "thumb_loading": { + "path": "qt/images/thumb_loading.png", + "mode": "pil" + }, + "placeholder_mp4": { + "path": "qt/videos/placeholder.mp4", + "mode": "rb" } } diff --git a/tagstudio/src/qt/resources_rc.py b/tagstudio/src/qt/resources_rc.py index f11bf7fb..c2d3874d 100644 --- a/tagstudio/src/qt/resources_rc.py +++ b/tagstudio/src/qt/resources_rc.py @@ -1,6 +1,6 @@ # Resource object code (Python 3) # Created by: object code -# Created by: The Resource Compiler for Qt version 6.6.3 +# Created by: The Resource Compiler for Qt version 6.7.1 # WARNING! All changes made in this file will be lost! from PySide6 import QtCore @@ -16240,7 +16240,7 @@ qt_resource_struct = b"\ \x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ \x00\x00\x01\x8a\xfb\xc6\x86\xda\ \x00\x00\x00H\x00\x00\x00\x00\x00\x01\x00\x00\x22\x83\ -\x00\x00\x01\x8e\xfd%\xc3\xc7\ +\x00\x00\x01\x92\x0cdgU\ " def qInitResources(): diff --git a/tagstudio/src/qt/ts_qt.py b/tagstudio/src/qt/ts_qt.py index 9490e783..e80aa84e 100644 --- a/tagstudio/src/qt/ts_qt.py +++ b/tagstudio/src/qt/ts_qt.py @@ -453,7 +453,13 @@ class QtDriver(DriverMixin, QObject): str(Path(__file__).parents[2] / "resources/qt/fonts/Oxanium-Bold.ttf") ) - self.thumb_size = 128 + self.thumb_sizes: list[tuple[str, int]] = [ + ("Extra Large Thumbnails", 256), + ("Large Thumbnails", 192), + ("Medium Thumbnails", 128), + ("Small Thumbnails", 96), + ("Mini Thumbnails", 76), + ] self.item_thumbs: list[ItemThumb] = [] self.thumb_renderers: list[ThumbRenderer] = [] self.filter = FilterState() @@ -488,26 +494,37 @@ class QtDriver(DriverMixin, QObject): def init_library_window(self): # self._init_landing_page() # Taken care of inside the widget now - self._init_thumb_grid() # TODO: Put this into its own method that copies the font file(s) into memory # so the resource isn't being used, then store the specific size variations # in a global dict for methods to access for different DPIs. # adj_font_size = math.floor(12 * self.main_window.devicePixelRatio()) + # Search Button search_button: QPushButton = self.main_window.searchButton search_button.clicked.connect( lambda: self.filter_items(FilterState(query=self.main_window.searchField.text())) ) + # Search Field search_field: QLineEdit = self.main_window.searchField search_field.returnPressed.connect( # TODO - parse search field for filters lambda: self.filter_items(FilterState(query=self.main_window.searchField.text())) ) + # Search Type Selector search_type_selector: QComboBox = self.main_window.comboBox_2 search_type_selector.currentIndexChanged.connect( lambda: self.set_search_type(SearchMode(search_type_selector.currentIndex())) ) + # Thumbnail Size ComboBox + thumb_size_combobox: QComboBox = self.main_window.thumb_size_combobox + for size in self.thumb_sizes: + thumb_size_combobox.addItem(size[0]) + thumb_size_combobox.setCurrentIndex(2) # Default: Medium + thumb_size_combobox.currentIndexChanged.connect( + lambda: self.thumb_size_callback(thumb_size_combobox.currentIndex()) + ) + self._init_thumb_grid() back_button: QPushButton = self.main_window.backButton back_button.clicked.connect(lambda: self.page_move(-1)) @@ -802,6 +819,34 @@ class QtDriver(DriverMixin, QObject): content=strip_web_protocol(field.value), ) + def thumb_size_callback(self, index: int): + """Perform actions needed when the thumbnail size selection is changed. + + Args: + index (int): The index of the item_thumbs/ComboBox list to use. + """ + spacing_divisor: int = 10 + min_spacing: int = 12 + # Index 2 is the default (Medium) + if index < len(self.thumb_sizes) and index >= 0: + self.thumb_size = self.thumb_sizes[index][1] + else: + logger.error(f"ERROR: Invalid thumbnail size index ({index}). Defaulting to 128px.") + self.thumb_size = 128 + + self.update_thumbs() + blank_icon: QIcon = QIcon() + for it in self.item_thumbs: + it.thumb_button.setIcon(blank_icon) + it.resize(self.thumb_size, self.thumb_size) + it.thumb_size = (self.thumb_size, self.thumb_size) + it.setMinimumSize(self.thumb_size, self.thumb_size) + it.setMaximumSize(self.thumb_size, self.thumb_size) + it.thumb_button.thumb_size = (self.thumb_size, self.thumb_size) + self.flow_container.layout().setSpacing( + min(self.thumb_size // spacing_divisor, min_spacing) + ) + def mouse_navigation(self, event: QMouseEvent): # print(event.button()) if event.button() == Qt.MouseButton.ForwardButton: diff --git a/tagstudio/src/qt/widgets/collage_icon.py b/tagstudio/src/qt/widgets/collage_icon.py index f3e1b364..e15cdd52 100644 --- a/tagstudio/src/qt/widgets/collage_icon.py +++ b/tagstudio/src/qt/widgets/collage_icon.py @@ -2,6 +2,7 @@ # Licensed under the GPL-3.0 License. # Created for TagStudio: https://github.com/CyanVoxel/TagStudio +import math from pathlib import Path import cv2 @@ -12,9 +13,10 @@ from PySide6.QtCore import ( QObject, Signal, ) -from src.core.constants import DOC_TYPES, IMAGE_TYPES, VIDEO_TYPES from src.core.library import Library from src.core.library.alchemy.fields import _FieldID +from src.core.media_types import MediaCategories +from src.qt.helpers.file_tester import is_readable_video logger = structlog.get_logger(__name__) @@ -74,7 +76,8 @@ class CollageIconRenderer(QObject): color=self.get_file_color(filepath.suffix.lower()), ) - if filepath.suffix.lower() in IMAGE_TYPES: + ext: str = filepath.suffix.lower() + if MediaCategories.is_ext_in_category(ext, MediaCategories.IMAGE_TYPES): try: with Image.open(str(self.lib.library_dir / entry.path)) as pic: if keep_aspect: @@ -84,23 +87,34 @@ class CollageIconRenderer(QObject): if data_tint_mode and color: pic = pic.convert(mode="RGB") pic = ImageChops.hard_light(pic, Image.new("RGB", size, color)) - # collage.paste(pic, (y*thumb_size, x*thumb_size)) self.rendered.emit(pic) - except DecompressionBombError: - logger.exception("One of the images was too big", entry=entry.path) - elif filepath.suffix.lower() in VIDEO_TYPES: - video = cv2.VideoCapture(str(filepath)) + except DecompressionBombError as e: + logger.info(f"[ERROR] One of the images was too big ({e})") + elif MediaCategories.is_ext_in_category( + ext, MediaCategories.VIDEO_TYPES + ) and is_readable_video(filepath): + video = cv2.VideoCapture(str(filepath), cv2.CAP_FFMPEG) video.set( cv2.CAP_PROP_POS_FRAMES, (video.get(cv2.CAP_PROP_FRAME_COUNT) // 2), ) success, frame = video.read() - if not success: - # Depending on the video format, compression, and frame - # count, seeking halfway does not work and the thumb - # must be pulled from the earliest available frame. - video.set(cv2.CAP_PROP_POS_FRAMES, 0) + # NOTE: Depending on the video format, compression, and + # frame count, seeking halfway does not work and the thumb + # must be pulled from the earliest available frame. + max_frame_seek: int = 10 + for i in range( + 0, + min( + max_frame_seek, + math.floor(video.get(cv2.CAP_PROP_FRAME_COUNT)), + ), + ): success, frame = video.read() + if not success: + video.set(cv2.CAP_PROP_POS_FRAMES, i) + else: + break frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) with Image.fromarray(frame, mode="RGB") as pic: if keep_aspect: @@ -109,7 +123,6 @@ class CollageIconRenderer(QObject): pic = pic.resize(size) if data_tint_mode and color: pic = ImageChops.hard_light(pic, Image.new("RGB", size, color)) - # collage.paste(pic, (y*thumb_size, x*thumb_size)) self.rendered.emit(pic) except (UnidentifiedImageError, FileNotFoundError): logger.error("Couldn't read entry", entry=entry.path) @@ -130,13 +143,13 @@ class CollageIconRenderer(QObject): self.done.emit() def get_file_color(self, ext: str): - if ext.lower().replace(".", "", 1) == "gif": + if ext.lower() == "gif": return "\033[93m" - if ext.lower().replace(".", "", 1) in IMAGE_TYPES: + if MediaCategories.is_ext_in_category(ext, MediaCategories.IMAGE_TYPES): return "\033[37m" - elif ext.lower().replace(".", "", 1) in VIDEO_TYPES: + elif MediaCategories.is_ext_in_category(ext, MediaCategories.VIDEO_TYPES): return "\033[96m" - elif ext.lower().replace(".", "", 1) in DOC_TYPES: + elif MediaCategories.is_ext_in_category(ext, MediaCategories.PLAINTEXT_TYPES): return "\033[92m" else: return "\033[97m" diff --git a/tagstudio/src/qt/widgets/item_thumb.py b/tagstudio/src/qt/widgets/item_thumb.py index 005cf1b0..da82a19d 100644 --- a/tagstudio/src/qt/widgets/item_thumb.py +++ b/tagstudio/src/qt/widgets/item_thumb.py @@ -21,17 +21,16 @@ from PySide6.QtWidgets import ( QWidget, ) from src.core.constants import ( - AUDIO_TYPES, - IMAGE_TYPES, TAG_ARCHIVED, TAG_FAVORITE, - VIDEO_TYPES, ) from src.core.library import Entry, ItemType, Library from src.core.library.alchemy.enums import FilterState from src.core.library.alchemy.fields import _FieldID +from src.core.media_types import MediaCategories, MediaType from src.qt.flowlayout import FlowWidget from src.qt.helpers.file_opener import FileOpenerHelper +from src.qt.platform_strings import PlatformStrings from src.qt.widgets.thumb_button import ThumbButton from src.qt.widgets.thumb_renderer import ThumbRenderer @@ -88,6 +87,7 @@ class ItemThumb(FlowWidget): small_text_style = ( "background-color:rgba(0, 0, 0, 192);" + "color:#FFFFFF;" "font-family:Oxanium;" "font-weight:bold;" "font-size:12px;" @@ -100,6 +100,7 @@ class ItemThumb(FlowWidget): med_text_style = ( "background-color:rgba(0, 0, 0, 192);" + "color:#FFFFFF;" "font-family:Oxanium;" "font-weight:bold;" "font-size:18px;" @@ -198,7 +199,7 @@ class ItemThumb(FlowWidget): self.opener = FileOpenerHelper("") open_file_action = QAction("Open file", self) open_file_action.triggered.connect(self.opener.open_file) - open_explorer_action = QAction("Open file in explorer", self) + open_explorer_action = QAction(PlatformStrings.open_file_str, self) open_explorer_action.triggered.connect(self.opener.open_explorer) self.thumb_button.addAction(open_file_action) self.thumb_button.addAction(open_explorer_action) @@ -330,10 +331,26 @@ class ItemThumb(FlowWidget): def set_extension(self, ext: str) -> None: if ext and ext.startswith(".") is False: ext = "." + ext - if ext and ext not in IMAGE_TYPES or ext in [".gif", ".apng"]: + media_types: set[MediaType] = MediaCategories.get_types(ext) + if ( + ext + and not MediaCategories.is_ext_in_category(ext, MediaCategories.IMAGE_TYPES) + or MediaCategories.is_ext_in_category(ext, MediaCategories.IMAGE_RAW_TYPES) + or MediaCategories.is_ext_in_category(ext, MediaCategories.IMAGE_VECTOR_TYPES) + or MediaCategories.is_ext_in_category(ext, MediaCategories.ADOBE_PHOTOSHOP_TYPES) + or ext + in [ + ".apng", + ".avif", + ".exr", + ".gif", + ".jxl", + ".webp", + ] + ): self.ext_badge.setHidden(False) self.ext_badge.setText(ext.upper()[1:]) - if ext in VIDEO_TYPES + AUDIO_TYPES: + if MediaType.VIDEO in media_types or MediaType.AUDIO in media_types: self.count_badge.setHidden(False) else: if self.mode == ItemType.ENTRY: diff --git a/tagstudio/src/qt/widgets/preview_panel.py b/tagstudio/src/qt/widgets/preview_panel.py index f595644f..b38fc6c1 100644 --- a/tagstudio/src/qt/widgets/preview_panel.py +++ b/tagstudio/src/qt/widgets/preview_panel.py @@ -1,6 +1,8 @@ # Copyright (C) 2024 Travis Abendshien (CyanVoxel). # Licensed under the GPL-3.0 License. # Created for TagStudio: https://github.com/CyanVoxel/TagStudio +import os +import platform import sys import time import typing @@ -12,10 +14,10 @@ import cv2 import rawpy import structlog from humanfriendly import format_size -from PIL import Image, UnidentifiedImageError +from PIL import Image, ImageFont, UnidentifiedImageError from PIL.Image import DecompressionBombError -from PySide6.QtCore import QSize, Qt, Signal -from PySide6.QtGui import QAction, QResizeEvent +from PySide6.QtCore import QBuffer, QByteArray, QSize, Qt, Signal +from PySide6.QtGui import QAction, QGuiApplication, QMovie, QResizeEvent from PySide6.QtWidgets import ( QFrame, QHBoxLayout, @@ -28,7 +30,9 @@ from PySide6.QtWidgets import ( QVBoxLayout, QWidget, ) -from src.core.constants import IMAGE_TYPES, RAW_IMAGE_TYPES, TS_FOLDER_NAME, VIDEO_TYPES +from src.core.constants import ( + TS_FOLDER_NAME, +) from src.core.enums import SettingItems, Theme from src.core.library.alchemy.enums import FilterState from src.core.library.alchemy.fields import ( @@ -40,9 +44,13 @@ from src.core.library.alchemy.fields import ( _FieldID, ) from src.core.library.alchemy.library import Library +from src.core.media_types import MediaCategories from src.qt.helpers.file_opener import FileOpenerHelper, FileOpenerLabel, open_file +from src.qt.helpers.file_tester import is_readable_video from src.qt.helpers.qbutton_wrapper import QPushButtonWrapper +from src.qt.helpers.rounded_pixmap_style import RoundedPixmapStyle from src.qt.modals.add_field import AddFieldModal +from src.qt.platform_strings import PlatformStrings from src.qt.widgets.fields import FieldContainer from src.qt.widgets.panel import PanelModal from src.qt.widgets.tag_box import TagBoxWidget @@ -80,8 +88,6 @@ class PreviewPanel(QWidget): self.driver: QtDriver = driver self.initialized = False self.is_open: bool = False - # self.filepath = None - # self.item = None # DEPRECATED, USE self.selected self.common_fields: list = [] self.mixed_fields: list = [] self.selected: list[int] = [] # New way of tracking items @@ -91,20 +97,55 @@ class PreviewPanel(QWidget): self.img_button_size: tuple[int, int] = (266, 266) self.image_ratio: float = 1.0 + self.label_bg_color = ( + Theme.COLOR_BG_DARK.value + if QGuiApplication.styleHints().colorScheme() is Qt.ColorScheme.Dark + else Theme.COLOR_DARK_LABEL.value + ) + self.panel_bg_color = ( + Theme.COLOR_BG_DARK.value + if QGuiApplication.styleHints().colorScheme() is Qt.ColorScheme.Dark + else Theme.COLOR_BG_LIGHT.value + ) + self.image_container = QWidget() image_layout = QHBoxLayout(self.image_container) image_layout.setContentsMargins(0, 0, 0, 0) + file_label_style = "font-size: 12px" + properties_style = ( + f"background-color:{self.label_bg_color};" + "color:#FFFFFF;" + "font-family:Oxanium;" + "font-weight:bold;" + "font-size:12px;" + "border-radius:3px;" + "padding-top: 4px;" + "padding-right: 1px;" + "padding-bottom: 1px;" + "padding-left: 1px;" + ) + date_style = "font-size:12px;" + self.open_file_action = QAction("Open file", self) - self.open_explorer_action = QAction("Open file in explorer", self) + self.open_explorer_action = QAction(PlatformStrings.open_file_str, self) self.preview_img = QPushButtonWrapper() self.preview_img.setMinimumSize(*self.img_button_size) self.preview_img.setFlat(True) self.preview_img.setContextMenuPolicy(Qt.ContextMenuPolicy.ActionsContextMenu) - self.preview_img.addAction(self.open_file_action) self.preview_img.addAction(self.open_explorer_action) + + self.preview_gif = QLabel() + self.preview_gif.setMinimumSize(*self.img_button_size) + self.preview_gif.setContextMenuPolicy(Qt.ContextMenuPolicy.ActionsContextMenu) + self.preview_gif.setCursor(Qt.CursorShape.ArrowCursor) + self.preview_gif.addAction(self.open_file_action) + self.preview_gif.addAction(self.open_explorer_action) + self.preview_gif.hide() + self.gif_buffer: QBuffer = QBuffer() + self.preview_vid = VideoPlayer(driver) self.preview_vid.hide() self.thumb_renderer = ThumbRenderer() @@ -124,31 +165,29 @@ class PreviewPanel(QWidget): image_layout.addWidget(self.preview_img) image_layout.setAlignment(self.preview_img, Qt.AlignmentFlag.AlignCenter) + image_layout.addWidget(self.preview_gif) + image_layout.setAlignment(self.preview_gif, Qt.AlignmentFlag.AlignCenter) image_layout.addWidget(self.preview_vid) image_layout.setAlignment(self.preview_vid, Qt.AlignmentFlag.AlignCenter) self.image_container.setMinimumSize(*self.img_button_size) - self.file_label = FileOpenerLabel("Filename") + self.file_label = FileOpenerLabel("filename") + self.file_label.setTextFormat(Qt.TextFormat.RichText) self.file_label.setWordWrap(True) self.file_label.setTextInteractionFlags(Qt.TextInteractionFlag.TextSelectableByMouse) - self.file_label.setStyleSheet("font-weight: bold; font-size: 12px") + self.file_label.setStyleSheet(file_label_style) - self.dimensions_label = QLabel("Dimensions") + self.date_created_label = QLabel("dateCreatedLabel") + self.date_created_label.setAlignment(Qt.AlignmentFlag.AlignLeft) + self.date_created_label.setTextFormat(Qt.TextFormat.RichText) + self.date_created_label.setStyleSheet(date_style) + + self.date_modified_label = QLabel("dateModifiedLabel") + self.date_modified_label.setAlignment(Qt.AlignmentFlag.AlignLeft) + self.date_modified_label.setTextFormat(Qt.TextFormat.RichText) + self.date_modified_label.setStyleSheet(date_style) + + self.dimensions_label = QLabel("dimensionsLabel") self.dimensions_label.setWordWrap(True) - # self.dim_label.setTextInteractionFlags( - # Qt.TextInteractionFlag.TextSelectableByMouse) - - properties_style = ( - f"background-color:{Theme.COLOR_BG.value};" - f"font-family:Oxanium;" - f"font-weight:bold;" - f"font-size:12px;" - f"border-radius:6px;" - f"padding-top: 4px;" - f"padding-right: 1px;" - f"padding-bottom: 1px;" - f"padding-left: 1px;" - ) - self.dimensions_label.setStyleSheet(properties_style) self.scroll_layout = QVBoxLayout() @@ -175,15 +214,24 @@ class PreviewPanel(QWidget): # background and NOT the scroll container background, so that the # rounded corners are maintained when scrolling. I was unable to # find the right trick to only select that particular element. + scroll_area.setStyleSheet( "QWidget#entryScrollContainer{" - f"background: {Theme.COLOR_BG.value};" + f"background:{self.panel_bg_color};" "border-radius:6px;" "}" ) scroll_area.setWidget(scroll_container) + date_container = QWidget() + date_layout = QVBoxLayout(date_container) + date_layout.setContentsMargins(0, 2, 0, 0) + date_layout.setSpacing(0) + date_layout.addWidget(self.date_created_label) + date_layout.addWidget(self.date_modified_label) + info_layout.addWidget(self.file_label) + info_layout.addWidget(date_container) info_layout.addWidget(self.dimensions_label) info_layout.addWidget(scroll_area) @@ -326,11 +374,11 @@ class PreviewPanel(QWidget): return lambda: self.driver.open_library(Path(path)) button.clicked.connect(open_library_button_clicked(full_val)) - set_button_style(button) - button_remove = QPushButton("➖") + set_button_style(button, ["padding-left: 6px;", "text-align: left;"]) + button_remove = QPushButton("—") button_remove.setCursor(Qt.CursorShape.PointingHandCursor) - button_remove.setFixedWidth(30) - set_button_style(button_remove) + button_remove.setFixedWidth(24) + set_button_style(button_remove, ["font-weight:bold;", "text-align:center;"]) def remove_recent_library_clicked(key: str): return lambda: ( @@ -364,19 +412,14 @@ class PreviewPanel(QWidget): def update_image_size(self, size: tuple[int, int], ratio: float = None): if ratio: self.set_image_ratio(ratio) - # self.img_button_size = size - # logging.info(f'') - # self.preview_img.setMinimumSize(64,64) adj_width: float = size[0] adj_height: float = size[1] # Landscape if self.image_ratio > 1: - # logging.info('Landscape') adj_height = size[0] * (1 / self.image_ratio) # Portrait elif self.image_ratio <= 1: - # logging.info('Portrait') adj_width = size[1] * self.image_ratio if adj_width > size[0]: @@ -386,11 +429,6 @@ class PreviewPanel(QWidget): adj_width = adj_width * (size[1] / adj_height) adj_height = size[1] - # adj_width = min(adj_width, self.image_container.size().width()) - # adj_height = min(adj_width, self.image_container.size().height()) - - # self.preview_img.setMinimumSize(s) - # self.preview_img.setMaximumSize(s_max) adj_size = QSize(int(adj_width), int(adj_height)) self.img_button_size = (int(adj_width), int(adj_height)) self.preview_img.setMaximumSize(adj_size) @@ -398,7 +436,14 @@ class PreviewPanel(QWidget): self.preview_vid.resize_video(adj_size) self.preview_vid.setMaximumSize(adj_size) self.preview_vid.setMinimumSize(adj_size) - # self.preview_img.setMinimumSize(adj_size) + self.preview_gif.setMaximumSize(adj_size) + self.preview_gif.setMinimumSize(adj_size) + proxy_style = RoundedPixmapStyle(radius=8) + self.preview_gif.setStyle(proxy_style) + self.preview_vid.setStyle(proxy_style) + m = self.preview_gif.movie() + if m: + m.setScaledSize(adj_size) def place_add_field_button(self): self.scroll_layout.addWidget(self.afb_container) @@ -410,11 +455,7 @@ class PreviewPanel(QWidget): self.add_field_button.clicked.disconnect() self.add_field_modal.done.connect( - lambda items: ( - self.add_field_to_selected(items), - update_selected_entry(self.driver), - self.update_widgets(), - ) + lambda f: (self.add_field_to_selected(f), self.update_widgets()) ) self.add_field_modal.is_connected = True self.add_field_button.clicked.connect(self.add_field_modal.show) @@ -430,6 +471,32 @@ class PreviewPanel(QWidget): field_id=field_item.data(Qt.ItemDataRole.UserRole), ) + def update_date_label(self, filepath: Path | None = None) -> None: + """Update the "Date Created" and "Date Modified" file property labels.""" + if filepath and filepath.is_file(): + created: dt = None + if platform.system() == "Windows" or platform.system() == "Darwin": + created = dt.fromtimestamp(filepath.stat().st_birthtime) # type: ignore[attr-defined] + else: + created = dt.fromtimestamp(filepath.stat().st_ctime) + modified: dt = dt.fromtimestamp(filepath.stat().st_mtime) + self.date_created_label.setText( + f"Date Created: {dt.strftime(created, "%a, %x, %X")}" + ) + self.date_modified_label.setText( + f"Date Modified: {dt.strftime(modified, "%a, %x, %X")}" + ) + self.date_created_label.setHidden(False) + self.date_modified_label.setHidden(False) + elif filepath: + self.date_created_label.setText("Date Created: N/A") + self.date_modified_label.setText("Date Modified: N/A") + self.date_created_label.setHidden(False) + self.date_modified_label.setHidden(False) + else: + self.date_created_label.setHidden(True) + self.date_modified_label.setHidden(True) + def update_widgets(self) -> bool: """Render the panel widgets with the newest data from the Library.""" logger.info("update_widgets", selected=self.driver.selected) @@ -442,11 +509,12 @@ class PreviewPanel(QWidget): if not self.driver.selected: if self.selected or not self.initialized: - self.file_label.setText("No Items Selected") + self.file_label.setText("No Items Selected") self.file_label.set_file_path("") self.file_label.setCursor(Qt.CursorShape.ArrowCursor) self.dimensions_label.setText("") + self.update_date_label() self.preview_img.setContextMenuPolicy(Qt.ContextMenuPolicy.NoContextMenu) self.preview_img.setCursor(Qt.CursorShape.ArrowCursor) @@ -466,6 +534,7 @@ class PreviewPanel(QWidget): self.preview_img.show() self.preview_vid.stop() self.preview_vid.hide() + self.preview_gif.hide() self.selected = list(self.driver.selected) self.add_field_button.setHidden(True) @@ -497,6 +566,7 @@ class PreviewPanel(QWidget): self.preview_img.show() self.preview_vid.stop() self.preview_vid.hide() + self.preview_gif.hide() # If a new selection is made, update the thumbnail and filepath. if not self.selected or self.selected != self.driver.selected: @@ -510,7 +580,15 @@ class PreviewPanel(QWidget): ratio, update_on_ratio_change=True, ) - self.file_label.setText("\u200b".join(str(filepath))) + file_str: str = "" + separator: str = f"{os.path.sep}" # Gray + for i, part in enumerate(filepath.parts): + part_ = part.strip(os.path.sep) + if i != len(filepath.parts) - 1: + file_str += f"{"\u200b".join(part_)}{separator}" + else: + file_str += f"
    {"\u200b".join(part_)}" + self.file_label.setText(file_str) self.file_label.setCursor(Qt.CursorShape.PointingHandCursor) self.preview_img.setContextMenuPolicy(Qt.ContextMenuPolicy.ActionsContextMenu) @@ -520,12 +598,42 @@ class PreviewPanel(QWidget): self.open_file_action.triggered.connect(self.opener.open_file) self.open_explorer_action.triggered.connect(self.opener.open_explorer) - # TODO: Do this somewhere else, this is just here temporarily. + # TODO: Do this all somewhere else, this is just here temporarily. + ext: str = filepath.suffix.lower() try: - image = None - if filepath.suffix.lower() in IMAGE_TYPES: + if filepath.suffix.lower() in [".gif"]: + with open(filepath, mode="rb") as file: + if self.preview_gif.movie(): + self.preview_gif.movie().stop() + self.gif_buffer.close() + + ba = file.read() + self.gif_buffer.setData(ba) + movie = QMovie(self.gif_buffer, QByteArray()) + self.preview_gif.setMovie(movie) + movie.start() + image = Image.open(str(filepath)) - elif filepath.suffix.lower() in RAW_IMAGE_TYPES: + self.resizeEvent( + QResizeEvent( + QSize(image.width, image.height), + QSize(image.width, image.height), + ) + ) + self.preview_img.hide() + self.preview_vid.hide() + self.preview_gif.show() + + image = None + if ( + MediaCategories.is_ext_in_category(ext, MediaCategories.IMAGE_TYPES) + and MediaCategories.is_ext_in_category(ext, MediaCategories.IMAGE_RAW_TYPES) + and MediaCategories.is_ext_in_category( + ext, MediaCategories.IMAGE_VECTOR_TYPES + ) + ): + image = Image.open(str(filepath)) + elif MediaCategories.is_ext_in_category(ext, MediaCategories.IMAGE_RAW_TYPES): try: with rawpy.imread(str(filepath)) as raw: rgb = raw.postprocess() @@ -535,11 +643,14 @@ class PreviewPanel(QWidget): rawpy._rawpy.LibRawFileUnsupportedError, ): pass - elif filepath.suffix.lower() in VIDEO_TYPES: - video = cv2.VideoCapture(str(filepath)) - if video.get(cv2.CAP_PROP_FRAME_COUNT) <= 0: - raise cv2.error("File is invalid or has 0 frames") - video.set(cv2.CAP_PROP_POS_FRAMES, 0) + elif MediaCategories.is_ext_in_category( + ext, MediaCategories.VIDEO_TYPES + ) and is_readable_video(filepath): + video = cv2.VideoCapture(str(filepath), cv2.CAP_FFMPEG) + video.set( + cv2.CAP_PROP_POS_FRAMES, + (video.get(cv2.CAP_PROP_FRAME_COUNT) // 2), + ) success, frame = video.read() frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) image = Image.fromarray(frame) @@ -555,35 +666,60 @@ class PreviewPanel(QWidget): self.preview_vid.show() # Stats for specific file types are displayed here. - if image and filepath.suffix.lower() in ( - IMAGE_TYPES + VIDEO_TYPES + RAW_IMAGE_TYPES + if image and ( + MediaCategories.is_ext_in_category( + ext, MediaCategories.IMAGE_TYPES, mime_fallback=True + ) + or MediaCategories.is_ext_in_category( + ext, MediaCategories.VIDEO_TYPES, mime_fallback=True + ) + or MediaCategories.is_ext_in_category( + ext, MediaCategories.IMAGE_RAW_TYPES, mime_fallback=True + ) ): self.dimensions_label.setText( - f"{filepath.suffix.upper()[1:]}" - f" • {format_size(filepath.stat().st_size)}\n{image.width} " - f"x {image.height} px" + f"{ext.upper()[1:]} • {format_size(filepath.stat().st_size)}\n" + f"{image.width} x {image.height} px" ) + elif MediaCategories.is_ext_in_category( + ext, MediaCategories.FONT_TYPES, mime_fallback=True + ): + try: + font = ImageFont.truetype(filepath) + self.dimensions_label.setText( + f"{ext.upper()[1:]} • {format_size(filepath.stat().st_size)}\n" + f"{font.getname()[0]} ({font.getname()[1]}) " + ) + except OSError: + self.dimensions_label.setText( + f"{ext.upper()[1:]} • {format_size(filepath.stat().st_size)}" + ) + logger.info( + f"[PreviewPanel][ERROR] Couldn't read font file: {filepath}" + ) else: + self.dimensions_label.setText(f"{ext.upper()[1:]}") self.dimensions_label.setText( - f"{filepath.suffix.upper()[1:]}" - f" • {format_size(filepath.stat().st_size)}" + f"{ext.upper()[1:]} • {format_size(filepath.stat().st_size)}" ) + self.update_date_label(filepath) if not filepath.is_file(): raise FileNotFoundError except (FileNotFoundError, cv2.error) as e: - self.dimensions_label.setText(f"{filepath.suffix.upper()}") - logger.error("Couldn't Render thumbnail", filepath=filepath, error=e) - + self.dimensions_label.setText(f"{ext.upper()[1:]}") + logger.error("Couldn't render thumbnail", filepath=filepath, error=e) + self.update_date_label() except ( UnidentifiedImageError, DecompressionBombError, ) as e: self.dimensions_label.setText( - f"{filepath.suffix.upper()[1:]} • {format_size(filepath.stat().st_size)}" + f"{ext.upper()[1:]} • {format_size(filepath.stat().st_size)}" ) - logger.error("Couldn't Render thumbnail", filepath=filepath, error=e) + logger.error("Couldn't render thumbnail", filepath=filepath, error=e) + self.update_date_label(filepath) if self.preview_img.is_connected: self.preview_img.clicked.disconnect() @@ -610,10 +746,12 @@ class PreviewPanel(QWidget): # Multiple Selected Items elif len(self.driver.selected) > 1: self.preview_img.show() + self.preview_gif.hide() self.preview_vid.stop() self.preview_vid.hide() + self.update_date_label() if self.selected != self.driver.selected: - self.file_label.setText(f"{len(self.driver.selected)} Items Selected") + self.file_label.setText(f"{len(self.driver.selected)} Items Selected") self.file_label.setCursor(Qt.CursorShape.ArrowCursor) self.file_label.set_file_path("") self.dimensions_label.setText("") diff --git a/tagstudio/src/qt/widgets/thumb_button.py b/tagstudio/src/qt/widgets/thumb_button.py index e56408b7..cf8dae37 100644 --- a/tagstudio/src/qt/widgets/thumb_button.py +++ b/tagstudio/src/qt/widgets/thumb_button.py @@ -5,19 +5,51 @@ from PySide6 import QtCore from PySide6.QtCore import QEvent -from PySide6.QtGui import QColor, QEnterEvent, QPainter, QPainterPath, QPaintEvent, QPen +from PySide6.QtGui import ( + QColor, + QEnterEvent, + QPainter, + QPainterPath, + QPaintEvent, + QPalette, + QPen, +) from PySide6.QtWidgets import QWidget from src.qt.helpers.qbutton_wrapper import QPushButtonWrapper class ThumbButton(QPushButtonWrapper): - def __init__(self, parent: QWidget, thumb_size: tuple[int, int]) -> None: + def __init__(self, parent: QWidget, thumb_size: tuple[int, int]) -> None: # noqa: N802 super().__init__(parent) self.thumb_size: tuple[int, int] = thumb_size self.hovered = False self.selected = False - # self.clicked.connect(lambda checked: self.set_selected(True)) + self.select_color: QColor = QPalette.color( + self.palette(), + QPalette.ColorGroup.Active, + QPalette.ColorRole.Accent, + ) + + self.select_color_faded: QColor = QColor(self.select_color) + self.select_color_faded.setHsl( + self.select_color_faded.hslHue(), + self.select_color_faded.hslSaturation(), + max(self.select_color_faded.lightness(), 127), + 127, + ) + + self.hover_color: QColor = QPalette.color( + self.palette(), + QPalette.ColorGroup.Active, + QPalette.ColorRole.Accent, + ) + self.hover_color.setHsl( + self.hover_color.hslHue(), + self.hover_color.hslSaturation(), + min(self.hover_color.lightness() + 80, 255), + self.hover_color.alpha(), + ) def paintEvent(self, event: QPaintEvent) -> None: # noqa: N802 super().paintEvent(event) @@ -25,7 +57,6 @@ class ThumbButton(QPushButtonWrapper): painter = QPainter() painter.begin(self) painter.setRenderHint(QPainter.RenderHint.Antialiasing) - # painter.setCompositionMode(QPainter.CompositionMode.CompositionMode_Source) path = QPainterPath() width = 3 radius = 6 @@ -40,32 +71,24 @@ class ThumbButton(QPushButtonWrapper): radius, ) - # color = QColor('#bb4ff0') if self.selected else QColor('#55bbf6') - # pen = QPen(color, width) - # painter.setPen(pen) - # # brush.setColor(fill) - # painter.drawPath(path) - if self.selected: painter.setCompositionMode(QPainter.CompositionMode.CompositionMode_HardLight) - color = QColor("#bb4ff0") - color.setAlphaF(0.5) - pen = QPen(color, width) + pen = QPen(self.select_color_faded, width) painter.setPen(pen) - painter.fillPath(path, color) + painter.fillPath(path, self.select_color_faded) painter.drawPath(path) painter.setCompositionMode(QPainter.CompositionMode.CompositionMode_Source) - color = QColor("#bb4ff0") if not self.hovered else QColor("#55bbf6") + color: QColor = self.select_color if not self.hovered else self.hover_color pen = QPen(color, width) painter.setPen(pen) painter.drawPath(path) elif self.hovered: painter.setCompositionMode(QPainter.CompositionMode.CompositionMode_Source) - color = QColor("#55bbf6") - pen = QPen(color, width) + pen = QPen(self.hover_color, width) painter.setPen(pen) painter.drawPath(path) + painter.end() def enterEvent(self, event: QEnterEvent) -> None: # noqa: N802 @@ -78,6 +101,6 @@ class ThumbButton(QPushButtonWrapper): self.repaint() return super().leaveEvent(event) - def set_selected(self, value: bool) -> None: + def set_selected(self, value: bool) -> None: # noqa: N802 self.selected = value self.repaint() diff --git a/tagstudio/src/qt/widgets/thumb_renderer.py b/tagstudio/src/qt/widgets/thumb_renderer.py index ff9a99b0..83eb1c57 100644 --- a/tagstudio/src/qt/widgets/thumb_renderer.py +++ b/tagstudio/src/qt/widgets/thumb_renderer.py @@ -4,14 +4,21 @@ import math +import struct +from copy import deepcopy +from io import BytesIO from pathlib import Path import cv2 +import numpy as np import rawpy import structlog +from mutagen import MutagenError, flac, id3, mp4 from PIL import ( Image, + ImageChops, ImageDraw, + ImageEnhance, ImageFile, ImageFont, ImageOps, @@ -20,68 +27,842 @@ from PIL import ( ) from PIL.Image import DecompressionBombError from pillow_heif import register_avif_opener, register_heif_opener -from PySide6.QtCore import QObject, QSize, Signal -from PySide6.QtGui import QPixmap -from src.core.constants import ( - IMAGE_TYPES, - PLAINTEXT_TYPES, - RAW_IMAGE_TYPES, - VIDEO_TYPES, -) +from pydub import exceptions +from PySide6.QtCore import QObject, QSize, Qt, Signal +from PySide6.QtGui import QGuiApplication, QPixmap +from src.core.constants import FONT_SAMPLE_SIZES, FONT_SAMPLE_TEXT +from src.core.media_types import MediaCategories, MediaType +from src.core.palette import ColorType, UiColor, get_ui_color from src.core.utils.encoding import detect_char_encoding -from src.qt.helpers.gradient import four_corner_gradient_background +from src.qt.helpers.blender_thumbnailer import blend_thumb +from src.qt.helpers.color_overlay import theme_fg_overlay +from src.qt.helpers.file_tester import is_readable_video +from src.qt.helpers.gradient import four_corner_gradient +from src.qt.helpers.text_wrapper import wrap_full_text +from src.qt.helpers.vendored.pydub.audio_segment import ( # type: ignore + _AudioSegment as AudioSegment, +) +from src.qt.resource_manager import ResourceManager +from vtf2img import Parser ImageFile.LOAD_TRUNCATED_IMAGES = True - logger = structlog.get_logger(__name__) - register_heif_opener() register_avif_opener() class ThumbRenderer(QObject): - # finished = Signal() + """A class for rendering image and file thumbnails.""" + + rm: ResourceManager = ResourceManager() updated = Signal(float, QPixmap, QSize, str) updated_ratio = Signal(float) - # updatedImage = Signal(QPixmap) - # updatedSize = Signal(QSize) - thumb_mask_512: Image.Image = Image.open( - Path(__file__).parents[3] / "resources/qt/images/thumb_mask_512.png" - ) - thumb_mask_512.load() + def __init__(self) -> None: + """Initialize the class.""" + super().__init__() - thumb_mask_hl_512: Image.Image = Image.open( - Path(__file__).parents[3] / "resources/qt/images/thumb_mask_hl_512.png" - ) - thumb_mask_hl_512.load() + # Cached thumbnail elements. + # Key: Size + Pixel Ratio Tuple + Radius Scale + # (Ex. (512, 512, 1.25, 4)) + self.thumb_masks: dict = {} + self.raised_edges: dict = {} - thumb_loading_512: Image.Image = Image.open( - Path(__file__).parents[3] / "resources/qt/images/thumb_loading_512.png" - ) - thumb_loading_512.load() + # Key: ("name", UiColor, 512, 512, 1.25) + self.icons: dict = {} - thumb_broken_512: Image.Image = Image.open( - Path(__file__).parents[3] / "resources/qt/images/thumb_broken_512.png" - ) - thumb_broken_512.load() + def _get_resource_id(self, url: Path) -> str: + """Return the name of the icon resource to use for a file type. - thumb_file_default_512: Image.Image = Image.open( - Path(__file__).parents[3] / "resources/qt/images/thumb_file_default_512.png" - ) - thumb_file_default_512.load() + Special terms will return special resources. - # thumb_debug: Image.Image = Image.open(Path( - # f'{Path(__file__).parents[2]}/resources/qt/images/temp.jpg')) - # thumb_debug.load() + Args: + url (Path): The file url to assess. "$LOADING" will return the loading graphic. + """ + ext = url.suffix.lower() + types: set[MediaType] = MediaCategories.get_types(ext, mime_fallback=True) - # TODO: Make dynamic font sized given different pixel ratios - font_pixel_ratio: float = 1 - ext_font = ImageFont.truetype( - Path(__file__).parents[3] / "resources/qt/fonts/Oxanium-Bold.ttf", - math.floor(12 * font_pixel_ratio), - ) + # Loop though the specific (non-IANA) categories and return the string + # name of the first matching category found. + for cat in MediaCategories.ALL_CATEGORIES: + if not cat.is_iana and cat.media_type in types: + return cat.media_type.value + + # If the type is broader (IANA registered) then search those types. + for cat in MediaCategories.ALL_CATEGORIES: + if cat.is_iana and cat.media_type in types: + return cat.media_type.value + + return "file_generic" + + def _get_mask( + self, size: tuple[int, int], pixel_ratio: float, scale_radius: bool = False + ) -> Image.Image: + """Return a thumbnail mask given a size, pixel ratio, and radius scaling option. + + If one is not already cached, a new one will be rendered. + + Args: + size (tuple[int, int]): The size of the graphic. + pixel_ratio (float): The screen pixel ratio. + scale_radius (bool): Option to scale the radius up (Used for Preview Panel). + """ + thumb_scale: int = 512 + radius_scale: float = 1 + if scale_radius: + radius_scale = max(size[0], size[1]) / thumb_scale + + item: Image.Image = self.thumb_masks.get((*size, pixel_ratio, radius_scale)) + if not item: + item = self._render_mask(size, pixel_ratio, radius_scale) + self.thumb_masks[(*size, pixel_ratio, radius_scale)] = item + return item + + def _get_edge( + self, size: tuple[int, int], pixel_ratio: float + ) -> tuple[Image.Image, Image.Image]: + """Return a thumbnail edge given a size, pixel ratio, and radius scaling option. + + If one is not already cached, a new one will be rendered. + + Args: + size (tuple[int, int]): The size of the graphic. + pixel_ratio (float): The screen pixel ratio. + """ + item: tuple[Image.Image, Image.Image] = self.raised_edges.get((*size, pixel_ratio)) + if not item: + item = self._render_edge(size, pixel_ratio) + self.raised_edges[(*size, pixel_ratio)] = item + return item + + def _get_icon( + self, name: str, color: UiColor, size: tuple[int, int], pixel_ratio: float = 1.0 + ) -> Image.Image: + """Return an icon given a size, pixel ratio, and radius scaling option. + + Args: + name (str): The name of the icon resource. "thumb_loading" will not draw a border. + color (str): The color to use for the icon. + size (tuple[int,int]): The size of the icon. + pixel_ratio (float): The screen pixel ratio. + """ + draw_border: bool = True + if name == "thumb_loading": + draw_border = False + + item: Image.Image = self.icons.get((name, color, *size, pixel_ratio)) + if not item: + item_flat: Image.Image = self._render_icon(name, color, size, pixel_ratio, draw_border) + edge: tuple[Image.Image, Image.Image] = self._get_edge(size, pixel_ratio) + item = self._apply_edge(item_flat, edge, faded=True) + self.icons[(name, color, *size, pixel_ratio)] = item + return item + + def _render_mask( + self, size: tuple[int, int], pixel_ratio: float, radius_scale: float = 1 + ) -> Image.Image: + """Render a thumbnail mask graphic. + + Args: + size (tuple[int,int]): The size of the graphic. + pixel_ratio (float): The screen pixel ratio. + radius_scale (float): The scale factor of the border radius (Used by Preview Panel). + """ + smooth_factor: int = 2 + radius_factor: int = 8 + + im: Image.Image = Image.new( + mode="L", + size=tuple([d * smooth_factor for d in size]), # type: ignore + color="black", + ) + draw = ImageDraw.Draw(im) + draw.rounded_rectangle( + (0, 0) + tuple([d - 1 for d in im.size]), + radius=math.ceil(radius_factor * smooth_factor * pixel_ratio * radius_scale), + fill="white", + ) + im = im.resize( + size, + resample=Image.Resampling.BILINEAR, + ) + return im + + def _render_edge( + self, size: tuple[int, int], pixel_ratio: float + ) -> tuple[Image.Image, Image.Image]: + """Render a thumbnail edge graphic. + + Args: + size (tuple[int,int]): The size of the graphic. + pixel_ratio (float): The screen pixel ratio. + """ + smooth_factor: int = 2 + radius_factor: int = 8 + width: int = math.floor(pixel_ratio * 2) + + # Highlight + im_hl: Image.Image = Image.new( + mode="RGBA", + size=tuple([d * smooth_factor for d in size]), # type: ignore + color="#00000000", + ) + draw = ImageDraw.Draw(im_hl) + draw.rounded_rectangle( + (width, width) + tuple([d - (width + 1) for d in im_hl.size]), + radius=math.ceil((radius_factor * smooth_factor * pixel_ratio) - (pixel_ratio * 3)), + fill=None, + outline="white", + width=width, + ) + im_hl = im_hl.resize( + size, + resample=Image.Resampling.BILINEAR, + ) + + # Shadow + im_sh: Image.Image = Image.new( + mode="RGBA", + size=tuple([d * smooth_factor for d in size]), # type: ignore + color="#00000000", + ) + draw = ImageDraw.Draw(im_sh) + draw.rounded_rectangle( + (0, 0) + tuple([d - 1 for d in im_sh.size]), + radius=math.ceil(radius_factor * smooth_factor * pixel_ratio), + fill=None, + outline="black", + width=width, + ) + im_sh = im_sh.resize( + size, + resample=Image.Resampling.BILINEAR, + ) + + return (im_hl, im_sh) + + def _render_icon( + self, + name: str, + color: UiColor, + size: tuple[int, int], + pixel_ratio: float, + draw_border: bool = True, + ) -> Image.Image: + """Render a thumbnail icon. + + Args: + name (str): The name of the icon resource. + color (UiColor): The color to use for the icon. + size (tuple[int,int]): The size of the icon. + pixel_ratio (float): The screen pixel ratio. + draw_border (bool): Option to draw a border. + """ + border_factor: int = 5 + smooth_factor: int = math.ceil(2 * pixel_ratio) + radius_factor: int = 8 + icon_ratio: float = 1.75 + + # Create larger blank image based on smooth_factor + im: Image.Image = Image.new( + "RGBA", + size=tuple([d * smooth_factor for d in size]), # type: ignore + color="#00000000", + ) + + # Create solid background color + bg: Image.Image = Image.new( + "RGB", + size=tuple([d * smooth_factor for d in size]), # type: ignore + color="#000000", + ) + + # Paste background color with rounded rectangle mask onto blank image + im.paste( + bg, + (0, 0), + mask=self._get_mask( + tuple([d * smooth_factor for d in size]), # type: ignore + (pixel_ratio * smooth_factor), + ), + ) + + # Draw rounded rectangle border + if draw_border: + draw = ImageDraw.Draw(im) + draw.rounded_rectangle( + (0, 0) + tuple([d - 1 for d in im.size]), + radius=math.ceil( + (radius_factor * smooth_factor * pixel_ratio) + (pixel_ratio * 1.5) + ), + fill="black", + outline="#FF0000", + width=math.floor( + (border_factor * smooth_factor * pixel_ratio) - (pixel_ratio * 1.5) + ), + ) + + # Resize image to final size + im = im.resize( + size, + resample=Image.Resampling.BILINEAR, + ) + fg: Image.Image = Image.new( + "RGB", + size=size, + color="#00FF00", + ) + + # Get icon by name + icon: Image.Image = self.rm.get(name) + if not icon: + icon = self.rm.get("file_generic") + if not icon: + icon = Image.new(mode="RGBA", size=(32, 32), color="magenta") + + # Resize icon to fit icon_ratio + icon = icon.resize((math.ceil(size[0] // icon_ratio), math.ceil(size[1] // icon_ratio))) + + # Paste icon centered + im.paste( + im=fg.resize((math.ceil(size[0] // icon_ratio), math.ceil(size[1] // icon_ratio))), + box=( + math.ceil((size[0] - (size[0] // icon_ratio)) // 2), + math.ceil((size[1] - (size[1] // icon_ratio)) // 2), + ), + mask=icon.getchannel(3), + ) + + # Apply color overlay + im = self._apply_overlay_color( + im, + color, + ) + + return im + + def _apply_overlay_color(self, image: Image.Image, color: UiColor) -> Image.Image: + """Apply a color overlay effect to an image based on its color channel data. + + Red channel for foreground, green channel for outline, none for background. + + Args: + image (Image.Image): The image to apply an overlay to. + color (UiColor): The name of the ColorType color to use. + """ + bg_color: str = ( + get_ui_color(ColorType.DARK_ACCENT, color) + if QGuiApplication.styleHints().colorScheme() is Qt.ColorScheme.Dark + else get_ui_color(ColorType.PRIMARY, color) + ) + fg_color: str = ( + get_ui_color(ColorType.PRIMARY, color) + if QGuiApplication.styleHints().colorScheme() is Qt.ColorScheme.Dark + else get_ui_color(ColorType.LIGHT_ACCENT, color) + ) + ol_color: str = ( + get_ui_color(ColorType.BORDER, color) + if QGuiApplication.styleHints().colorScheme() is Qt.ColorScheme.Dark + else get_ui_color(ColorType.LIGHT_ACCENT, color) + ) + + bg: Image.Image = Image.new(image.mode, image.size, color=bg_color) + fg: Image.Image = Image.new(image.mode, image.size, color=fg_color) + ol: Image.Image = Image.new(image.mode, image.size, color=ol_color) + + bg.paste(fg, (0, 0), mask=image.getchannel(0)) + bg.paste(ol, (0, 0), mask=image.getchannel(1)) + + if image.mode == "RGBA": + alpha_bg: Image.Image = bg.copy() + alpha_bg.convert("RGBA") + alpha_bg.putalpha(0) + alpha_bg.paste(bg, (0, 0), mask=image.getchannel(3)) + bg = alpha_bg + + return bg + + def _apply_edge( + self, + image: Image.Image, + edge: tuple[Image.Image, Image.Image], + faded: bool = False, + ): + """Apply a given edge effect to an image. + + Args: + image (Image.Image): The image to apply the edge to. + edge (tuple[Image.Image, Image.Image]): The edge images to apply. + Item 0 is the inner highlight, and item 1 is the outer shadow. + faded (bool): Whether or not to apply a faded version of the edge. + Used for light themes. + """ + opacity: float = 1.0 if not faded else 0.8 + shade_reduction: float = ( + 0 if QGuiApplication.styleHints().colorScheme() is Qt.ColorScheme.Dark else 0.3 + ) + im: Image.Image = image + im_hl, im_sh = deepcopy(edge) + + # Configure and apply a soft light overlay. + # This makes up the bulk of the effect. + im_hl.putalpha(ImageEnhance.Brightness(im_hl.getchannel(3)).enhance(opacity)) + im.paste(ImageChops.soft_light(im, im_hl), mask=im_hl.getchannel(3)) + + # Configure and apply a normal shading overlay. + # This helps with contrast. + im_sh.putalpha( + ImageEnhance.Brightness(im_sh.getchannel(3)).enhance(max(0, opacity - shade_reduction)) + ) + im.paste(im_sh, mask=im_sh.getchannel(3)) + + return im + + def _audio_album_thumb(self, filepath: Path, ext: str) -> Image.Image | None: + """Return an album cover thumb from an audio file if a cover is present. + + Args: + filepath (Path): The path of the file. + ext (str): The file extension (with leading "."). + """ + image: Image.Image = None + try: + if not filepath.is_file(): + raise FileNotFoundError + + artwork = None + if ext in [".mp3"]: + id3_tags: id3.ID3 = id3.ID3(filepath) + id3_covers: list = id3_tags.getall("APIC") + if id3_covers: + artwork = Image.open(BytesIO(id3_covers[0].data)) + elif ext in [".flac"]: + flac_tags: flac.FLAC = flac.FLAC(filepath) + flac_covers: list = flac_tags.pictures + if flac_covers: + artwork = Image.open(BytesIO(flac_covers[0].data)) + elif ext in [".mp4", ".m4a", ".aac"]: + mp4_tags: mp4.MP4 = mp4.MP4(filepath) + mp4_covers: list = mp4_tags.get("covr") + if mp4_covers: + artwork = Image.open(BytesIO(mp4_covers[0])) + if artwork: + image = artwork + except ( + mp4.MP4MetadataError, + mp4.MP4StreamInfoError, + id3.ID3NoHeaderError, + MutagenError, + ) as e: + logger.error("Couldn't read album artwork", path=filepath, error=e) + return image + + def _audio_waveform_thumb( + self, filepath: Path, ext: str, size: int, pixel_ratio: float + ) -> Image.Image | None: + """Render a waveform image from an audio file. + + Args: + filepath (Path): The path of the file. + ext (str): The file extension (with leading "."). + size (tuple[int,int]): The size of the thumbnail. + pixel_ratio (float): The screen pixel ratio. + """ + # BASE_SCALE used for drawing on a larger image and resampling down + # to provide an antialiased effect. + base_scale: int = 2 + samples_per_bar: int = 3 + size_scaled: int = size * base_scale + allow_small_min: bool = False + im: Image.Image = None + + try: + bar_count: int = min(math.floor((size // pixel_ratio) / 5), 64) + audio: AudioSegment = AudioSegment.from_file(filepath, ext[1:]) + data = np.fromstring(audio._data, np.int16) # type: ignore + data_indices = np.linspace(1, len(data), num=bar_count * samples_per_bar) + bar_margin: float = ((size_scaled / (bar_count * 3)) * base_scale) / 2 + line_width: float = ((size_scaled - bar_margin) / (bar_count * 3)) * base_scale + bar_height: float = (size_scaled) - (size_scaled // bar_margin) + + count: int = 0 + maximum_item: int = 0 + max_array: list = [] + highest_line: int = 0 + + for i in range(-1, len(data_indices)): + d = data[math.ceil(data_indices[i]) - 1] + if count < samples_per_bar: + count = count + 1 + if abs(d) > maximum_item: + maximum_item = abs(d) + else: + max_array.append(maximum_item) + + if maximum_item > highest_line: + highest_line = maximum_item + + maximum_item = 0 + count = 1 + + line_ratio = max(highest_line / bar_height, 1) + + im = Image.new("RGB", (size_scaled, size_scaled), color="#000000") + draw = ImageDraw.Draw(im) + + current_x = bar_margin + for item in max_array: + item_height = item / line_ratio + + # If small minimums are not allowed, raise all values + # smaller than the line width to the same value. + if not allow_small_min: + item_height = max(item_height, line_width) + + current_y = (bar_height - item_height + (size_scaled // bar_margin)) // 2 + + draw.rounded_rectangle( + ( + current_x, + current_y, + (current_x + line_width), + (current_y + item_height), + ), + radius=100 * base_scale, + fill=("#FF0000"), + outline=("#FFFF00"), + width=max(math.ceil(line_width / 6), base_scale), + ) + + current_x = current_x + line_width + bar_margin + + im.resize((size, size), Image.Resampling.BILINEAR) + + except exceptions.CouldntDecodeError as e: + logger.error("Couldn't render waveform", path=filepath.name, error=e) + + return im + + def _blender(self, filepath: Path) -> Image.Image: + """Get an emended thumbnail from a Blender file, if a thumbnail is present. + + Args: + filepath (Path): The path of the file. + """ + bg_color: str = ( + "#1e1e1e" + if QGuiApplication.styleHints().colorScheme() is Qt.ColorScheme.Dark + else "#FFFFFF" + ) + im: Image.Image = None + try: + blend_image = blend_thumb(str(filepath)) + + bg = Image.new("RGB", blend_image.size, color=bg_color) + bg.paste(blend_image, mask=blend_image.getchannel(3)) + im = bg + + except ( + AttributeError, + UnidentifiedImageError, + FileNotFoundError, + TypeError, + ) as e: + if str(e) == "expected string or buffer": + logger.info( + f"[ThumbRenderer][BLENDER][INFO] {filepath.name} " + f"Doesn't have an embedded thumbnail. ({type(e).__name__})" + ) + + else: + logger.error("Couldn't render thumbnail", filepath=filepath, error=e) + return im + + def _source_engine(self, filepath: Path) -> Image.Image: + """This is a function to convert the VTF (Valve Texture Format) files to thumbnails. + + It works using the VTF2IMG library for PILLOW. + """ + parser = Parser(filepath) + im: Image.Image = None + try: + im = parser.get_image() + + except ( + AttributeError, + UnidentifiedImageError, + FileNotFoundError, + TypeError, + struct.error, + ) as e: + if str(e) == "expected string or buffer": + logger.error("Couldn't render thumbnail", filepath=filepath, error=e) + + else: + logger.error("Couldn't render thumbnail", filepath=filepath, error=e) + return im + + def _font_short_thumb(self, filepath: Path, size: int) -> Image.Image: + """Render a small font preview ("Aa") thumbnail from a font file. + + Args: + filepath (Path): The path of the file. + size (tuple[int,int]): The size of the thumbnail. + """ + im: Image.Image = None + try: + bg = Image.new("RGB", (size, size), color="#000000") + raw = Image.new("RGB", (size * 3, size * 3), color="#000000") + draw = ImageDraw.Draw(raw) + font = ImageFont.truetype(filepath, size=size) + # NOTE: While a stroke effect is desired, the text + # method only allows for outer strokes, which looks + # a bit weird when rendering fonts. + draw.text( + (size // 8, size // 8), + "Aa", + font=font, + fill="#FF0000", + # stroke_width=math.ceil(size / 96), + # stroke_fill="#FFFF00", + ) + # NOTE: Change to getchannel(1) if using an outline. + data = np.asarray(raw.getchannel(0)) + + m, n = data.shape[:2] + col: np.ndarray = data.any(0) + row: np.ndarray = data.any(1) + cropped_data = np.asarray(raw)[ + row.argmax() : m - row[::-1].argmax(), + col.argmax() : n - col[::-1].argmax(), + ] + cropped_im: Image.Image = Image.fromarray(cropped_data, "RGB") + + margin: int = math.ceil(size // 16) + + orig_x, orig_y = cropped_im.size + new_x, new_y = (size, size) + if orig_x > orig_y: + new_x = size + new_y = math.ceil(size * (orig_y / orig_x)) + elif orig_y > orig_x: + new_y = size + new_x = math.ceil(size * (orig_x / orig_y)) + + cropped_im = cropped_im.resize( + size=(new_x - (margin * 2), new_y - (margin * 2)), + resample=Image.Resampling.BILINEAR, + ) + bg.paste( + cropped_im, + box=(margin, margin + ((size - new_y) // 2)), + ) + im = self._apply_overlay_color(bg, UiColor.PURPLE) + except OSError as e: + logger.error("Couldn't render thumbnail", filepath=filepath, error=e) + return im + + def _font_long_thumb(self, filepath: Path, size: int) -> Image.Image: + """Render a large font preview ("Alphabet") thumbnail from a font file. + + Args: + filepath (Path): The path of the file. + size (tuple[int,int]): The size of the thumbnail. + """ + # Scale the sample font sizes to the preview image + # resolution,assuming the sizes are tuned for 256px. + im: Image.Image = None + try: + scaled_sizes: list[int] = [math.floor(x * (size / 256)) for x in FONT_SAMPLE_SIZES] + bg = Image.new("RGBA", (size, size), color="#00000000") + draw = ImageDraw.Draw(bg) + lines_of_padding = 2 + y_offset = 0 + + for font_size in scaled_sizes: + font = ImageFont.truetype(filepath, size=font_size) + text_wrapped: str = wrap_full_text( + FONT_SAMPLE_TEXT, font=font, width=size, draw=draw + ) + draw.multiline_text((0, y_offset), text_wrapped, font=font) + y_offset += (len(text_wrapped.split("\n")) + lines_of_padding) * draw.textbbox( + (0, 0), "A", font=font + )[-1] + im = theme_fg_overlay(bg, use_alpha=False) + except OSError as e: + logger.error("Couldn't render thumbnail", filepath=filepath, error=e) + return im + + def _image_raw_thumb(self, filepath: Path) -> Image.Image: + """Render a thumbnail for a RAW image type. + + Args: + filepath (Path): The path of the file. + """ + im: Image.Image = None + try: + with rawpy.imread(str(filepath)) as raw: + rgb = raw.postprocess() + im = Image.frombytes( + "RGB", + (rgb.shape[1], rgb.shape[0]), + rgb, + decoder_name="raw", + ) + except DecompressionBombError as e: + logger.error("Couldn't render thumbnail", filepath=filepath, error=e) + except ( + rawpy._rawpy.LibRawIOError, + rawpy._rawpy.LibRawFileUnsupportedError, + ) as e: + logger.error("Couldn't render thumbnail", filepath=filepath, error=e) + return im + + def _image_thumb(self, filepath: Path) -> Image.Image: + """Render a thumbnail for a standard image type. + + Args: + filepath (Path): The path of the file. + """ + im: Image.Image = None + try: + im = Image.open(filepath) + if im.mode != "RGB" and im.mode != "RGBA": + im = im.convert(mode="RGBA") + if im.mode == "RGBA": + new_bg = Image.new("RGB", im.size, color="#1e1e1e") + new_bg.paste(im, mask=im.getchannel(3)) + im = new_bg + + im = ImageOps.exif_transpose(im) + except ( + UnidentifiedImageError, + DecompressionBombError, + ) as e: + logger.error("Couldn't render thumbnail", filepath=filepath, error=e) + return im + + def _image_vector_thumb(self, filepath: Path, size: int) -> Image.Image: + """Render a thumbnail for a vector image, such as SVG. + + Args: + filepath (Path): The path of the file. + size (tuple[int,int]): The size of the thumbnail. + """ + # TODO: Implement. + im: Image.Image = None + return im + + def _model_stl_thumb(self, filepath: Path, size: int) -> Image.Image: + """Render a thumbnail for an STL file. + + Args: + filepath (Path): The path of the file. + size (tuple[int,int]): The size of the icon. + """ + # TODO: Implement. + # The following commented code describes a method for rendering via + # matplotlib. + # This implementation did not play nice with multithreading. + im: Image.Image = None + # # Create a new plot + # matplotlib.use('agg') + # figure = plt.figure() + # axes = figure.add_subplot(projection='3d') + + # # Load the STL files and add the vectors to the plot + # your_mesh = mesh.Mesh.from_file(_filepath) + + # poly_collection = mplot3d.art3d.Poly3DCollection(your_mesh.vectors) + # poly_collection.set_color((0,0,1)) # play with color + # scale = your_mesh.points.flatten() + # axes.auto_scale_xyz(scale, scale, scale) + # axes.add_collection3d(poly_collection) + # # plt.show() + # img_buf = io.BytesIO() + # plt.savefig(img_buf, format='png') + # im = Image.open(img_buf) + + return im + + def _text_thumb(self, filepath: Path) -> Image.Image: + """Render a thumbnail for a plaintext file. + + Args: + filepath (Path): The path of the file. + """ + im: Image.Image = None + + bg_color: str = ( + "#1e1e1e" + if QGuiApplication.styleHints().colorScheme() is Qt.ColorScheme.Dark + else "#FFFFFF" + ) + fg_color: str = ( + "#FFFFFF" + if QGuiApplication.styleHints().colorScheme() is Qt.ColorScheme.Dark + else "#111111" + ) + + try: + encoding = detect_char_encoding(filepath) + with open(filepath, encoding=encoding) as text_file: + text = text_file.read(256) + bg = Image.new("RGB", (256, 256), color=bg_color) + draw = ImageDraw.Draw(bg) + draw.text((16, 16), text, fill=fg_color) + im = bg + except ( + UnidentifiedImageError, + cv2.error, + DecompressionBombError, + UnicodeDecodeError, + OSError, + ) as e: + logger.error("Couldn't render thumbnail", filepath=filepath, error=e) + return im + + def _video_thumb(self, filepath: Path) -> Image.Image: + """Render a thumbnail for a video file. + + Args: + filepath (Path): The path of the file. + """ + im: Image.Image = None + try: + if is_readable_video(filepath): + video = cv2.VideoCapture(str(filepath), cv2.CAP_FFMPEG) + # TODO: Move this check to is_readable_video() + if video.get(cv2.CAP_PROP_FRAME_COUNT) <= 0: + raise cv2.error("File is invalid or has 0 frames") + video.set( + cv2.CAP_PROP_POS_FRAMES, + (video.get(cv2.CAP_PROP_FRAME_COUNT) // 2), + ) + # NOTE: Depending on the video format, compression, and + # frame count, seeking halfway does not work and the thumb + # must be pulled from the earliest available frame. + max_frame_seek: int = 10 + for i in range( + 0, + min(max_frame_seek, math.floor(video.get(cv2.CAP_PROP_FRAME_COUNT))), + ): + success, frame = video.read() + if not success: + video.set(cv2.CAP_PROP_POS_FRAMES, i) + else: + break + frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) + im = Image.fromarray(frame) + except ( + UnidentifiedImageError, + cv2.error, + DecompressionBombError, + OSError, + ) as e: + logger.error("Couldn't render thumbnail", filepath=filepath, error=e) + return im def render( self, @@ -90,29 +871,42 @@ class ThumbRenderer(QObject): base_size: tuple[int, int], pixel_ratio: float, is_loading: bool = False, - gradient: bool = False, + is_grid_thumb: bool = False, update_on_ratio_change: bool = False, ): - """Internal renderer. Render an entry/element thumbnail for the GUI.""" - logger.debug("rendering thumbnail", path=filepath) + """Render a thumbnail or preview image. + Args: + timestamp (float): The timestamp for which this this job was dispatched. + filepath (str | Path): The path of the file to render a thumbnail for. + base_size (tuple[int,int]): The unmodified base size of the thumbnail. + pixel_ratio (float): The screen pixel ratio. + is_loading (bool): Is this a loading graphic? + is_grid_thumb (bool): Is this a thumbnail for the thumbnail grid? + Or else the Preview Pane? + update_on_ratio_change (bool): Should an updated ratio signal be sent? + + """ + adj_size = math.ceil(max(base_size[0], base_size[1]) * pixel_ratio) image: Image.Image = None pixmap: QPixmap = None final: Image.Image = None _filepath: Path = Path(filepath) resampling_method = Image.Resampling.BILINEAR - if ThumbRenderer.font_pixel_ratio != pixel_ratio: - ThumbRenderer.font_pixel_ratio = pixel_ratio - ThumbRenderer.ext_font = ImageFont.truetype( - Path(__file__).parents[3] / "resources/qt/fonts/Oxanium-Bold.ttf", - math.floor(12 * ThumbRenderer.font_pixel_ratio), - ) - adj_size = math.ceil(max(base_size[0], base_size[1]) * pixel_ratio) + theme_color: UiColor = ( + UiColor.THEME_LIGHT + if QGuiApplication.styleHints().colorScheme() == Qt.ColorScheme.Light + else UiColor.THEME_DARK + ) + + # Initialize "Loading" thumbnail + loading_thumb: Image.Image = self._get_icon( + "thumb_loading", theme_color, (adj_size, adj_size), pixel_ratio + ) + if is_loading: - final = ThumbRenderer.thumb_loading_512.resize( - (adj_size, adj_size), resample=Image.Resampling.BILINEAR - ) + final = loading_thumb.resize((adj_size, adj_size), resample=Image.Resampling.BILINEAR) qim = ImageQt.ImageQt(final) pixmap = QPixmap.fromImage(qim) pixmap.setDevicePixelRatio(pixel_ratio) @@ -120,92 +914,69 @@ class ThumbRenderer(QObject): self.updated_ratio.emit(1) elif _filepath: try: + ext: str = _filepath.suffix.lower() # Images ======================================================= - if _filepath.suffix.lower() in IMAGE_TYPES: - try: - image = Image.open(_filepath) - if image.mode != "RGB" and image.mode != "RGBA": - image = image.convert(mode="RGBA") - if image.mode == "RGBA": - new_bg = Image.new("RGB", image.size, color="#1e1e1e") - new_bg.paste(image, mask=image.getchannel(3)) - image = new_bg - - image = ImageOps.exif_transpose(image) - except DecompressionBombError as e: - logger.error("Couldn't Render thumbnail", filepath=filepath, error=e) - - elif _filepath.suffix.lower() in RAW_IMAGE_TYPES: - try: - with rawpy.imread(str(_filepath)) as raw: - rgb = raw.postprocess() - image = Image.frombytes( - "RGB", - (rgb.shape[1], rgb.shape[0]), - rgb, - decoder_name="raw", - ) - except DecompressionBombError as e: - logger.error("Couldn't Render thumbnail", filepath=filepath, error=e) - - except ( - rawpy._rawpy.LibRawIOError, - rawpy._rawpy.LibRawFileUnsupportedError, - ) as e: - logger.error("Couldn't Render thumbnail", filepath=filepath, error=e) - + if MediaCategories.is_ext_in_category( + ext, MediaCategories.IMAGE_TYPES, mime_fallback=True + ): + # Raw Images ----------------------------------------------- + if MediaCategories.is_ext_in_category( + ext, MediaCategories.IMAGE_RAW_TYPES, mime_fallback=True + ): + image = self._image_raw_thumb(_filepath) + elif MediaCategories.is_ext_in_category( + ext, MediaCategories.IMAGE_VECTOR_TYPES, mime_fallback=True + ): + image = self._image_vector_thumb(_filepath, adj_size) + # Normal Images -------------------------------------------- + else: + image = self._image_thumb(_filepath) # Videos ======================================================= - elif _filepath.suffix.lower() in VIDEO_TYPES: - video = cv2.VideoCapture(str(_filepath)) - frame_count = video.get(cv2.CAP_PROP_FRAME_COUNT) - if frame_count <= 0: - raise cv2.error("File is invalid or has 0 frames") - video.set(cv2.CAP_PROP_POS_FRAMES, frame_count // 2) - success, frame = video.read() - if not success: - # Depending on the video format, compression, and frame - # count, seeking halfway does not work and the thumb - # must be pulled from the earliest available frame. - video.set(cv2.CAP_PROP_POS_FRAMES, 0) - success, frame = video.read() - frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) - image = Image.fromarray(frame) - + if MediaCategories.is_ext_in_category( + ext, MediaCategories.VIDEO_TYPES, mime_fallback=True + ): + image = self._video_thumb(_filepath) # Plain Text =================================================== - elif _filepath.suffix.lower() in PLAINTEXT_TYPES: - encoding = detect_char_encoding(_filepath) - with open(_filepath, encoding=encoding) as text_file: - text = text_file.read(256) - bg = Image.new("RGB", (256, 256), color="#1e1e1e") - draw = ImageDraw.Draw(bg) - draw.text((16, 16), text, file=(255, 255, 255)) - image = bg - # 3D =========================================================== - # elif extension == 'stl': - # # Create a new plot - # matplotlib.use('agg') - # figure = plt.figure() - # axes = figure.add_subplot(projection='3d') + if MediaCategories.is_ext_in_category( + ext, MediaCategories.PLAINTEXT_TYPES, mime_fallback=True + ): + image = self._text_thumb(_filepath) + # Fonts ======================================================== + if MediaCategories.is_ext_in_category( + ext, MediaCategories.FONT_TYPES, mime_fallback=True + ): + if is_grid_thumb: + # Short (Aa) Preview + image = self._font_short_thumb(_filepath, adj_size) + else: + # Large (Full Alphabet) Preview + image = self._font_long_thumb(_filepath, adj_size) + # Audio ======================================================== + if MediaCategories.is_ext_in_category( + ext, MediaCategories.AUDIO_TYPES, mime_fallback=True + ): + image = self._audio_album_thumb(_filepath, ext) + if image is None: + image = self._audio_waveform_thumb(_filepath, ext, adj_size, pixel_ratio) + if image is not None: + image = self._apply_overlay_color(image, UiColor.GREEN) - # # Load the STL files and add the vectors to the plot - # your_mesh = mesh.Mesh.from_file(_filepath) + # Blender =========================================================== + if MediaCategories.is_ext_in_category( + ext, MediaCategories.BLENDER_TYPES, mime_fallback=True + ): + image = self._blender(_filepath) + + # VTF ========================================================== + if MediaCategories.is_ext_in_category( + ext, MediaCategories.SOURCE_ENGINE_TYPES, mime_fallback=True + ): + image = self._source_engine(_filepath) - # poly_collection = mplot3d.art3d.Poly3DCollection(your_mesh.vectors) - # poly_collection.set_color((0,0,1)) # play with color - # scale = your_mesh.points.flatten() - # axes.auto_scale_xyz(scale, scale, scale) - # axes.add_collection3d(poly_collection) - # # plt.show() - # img_buf = io.BytesIO() - # plt.savefig(img_buf, format='png') - # image = Image.open(img_buf) # No Rendered Thumbnail ======================================== - else: - image = ThumbRenderer.thumb_file_default_512.resize( - (adj_size, adj_size), resample=Image.Resampling.BILINEAR - ) - - if not image: + if not _filepath.exists(): + raise FileNotFoundError + elif not image: raise UnidentifiedImageError orig_x, orig_y = image.size @@ -227,47 +998,46 @@ class ThumbRenderer(QObject): else Image.Resampling.BILINEAR ) image = image.resize((new_x, new_y), resample=resampling_method) - if gradient: - mask: Image.Image = ThumbRenderer.thumb_mask_512.resize( - (adj_size, adj_size), resample=Image.Resampling.BILINEAR - ).getchannel(3) - hl: Image.Image = ThumbRenderer.thumb_mask_hl_512.resize( - (adj_size, adj_size), resample=Image.Resampling.BILINEAR + mask: Image.Image = None + if is_grid_thumb: + mask = self._get_mask((adj_size, adj_size), pixel_ratio) + edge: tuple[Image.Image, Image.Image] = self._get_edge( + (adj_size, adj_size), pixel_ratio + ) + final = self._apply_edge( + four_corner_gradient(image, (adj_size, adj_size), mask), + edge, ) - final = four_corner_gradient_background(image, adj_size, mask, hl) else: - scalar = 4 - rec: Image.Image = Image.new( - "RGB", - tuple([d * scalar for d in image.size]), # type: ignore - "black", - ) - draw = ImageDraw.Draw(rec) - draw.rounded_rectangle( - (0, 0) + rec.size, - (base_size[0] // 32) * scalar * pixel_ratio, - fill="red", - ) - rec = rec.resize( - tuple([d // scalar for d in rec.size]), - resample=Image.Resampling.BILINEAR, - ) + mask = self._get_mask(image.size, pixel_ratio, scale_radius=True) final = Image.new("RGBA", image.size, (0, 0, 0, 0)) - final.paste(image, mask=rec.getchannel(0)) + final.paste(image, mask=mask.getchannel(0)) + + except FileNotFoundError as e: + logger.error("Couldn't render thumbnail", filepath=filepath, error=e) + if update_on_ratio_change: + self.updated_ratio.emit(1) + final = self._get_icon( + name="broken_link_icon", + color=UiColor.RED, + size=(adj_size, adj_size), + pixel_ratio=pixel_ratio, + ) except ( UnidentifiedImageError, - FileNotFoundError, - cv2.error, DecompressionBombError, - UnicodeDecodeError, + ValueError, + ChildProcessError, ) as e: - if e is not UnicodeDecodeError: - logger.error("Couldn't Render thumbnail", filepath=filepath, error=e) + logger.error("Couldn't render thumbnail", filepath=filepath, error=e) if update_on_ratio_change: self.updated_ratio.emit(1) - final = ThumbRenderer.thumb_broken_512.resize( - (adj_size, adj_size), resample=resampling_method + final = self._get_icon( + name=self._get_resource_id(_filepath), + color=theme_color, + size=(adj_size, adj_size), + pixel_ratio=pixel_ratio, ) qim = ImageQt.ImageQt(final) if image: diff --git a/tagstudio/src/qt/widgets/video_player.py b/tagstudio/src/qt/widgets/video_player.py index e1a4c141..2b4434b1 100644 --- a/tagstudio/src/qt/widgets/video_player.py +++ b/tagstudio/src/qt/widgets/video_player.py @@ -30,6 +30,7 @@ from PySide6.QtSvgWidgets import QSvgWidget from PySide6.QtWidgets import QGraphicsScene, QGraphicsView from src.core.enums import SettingItems from src.qt.helpers.file_opener import FileOpenerHelper +from src.qt.platform_strings import PlatformStrings if typing.TYPE_CHECKING: from src.qt.ts_qt import QtDriver @@ -75,6 +76,8 @@ class VideoPlayer(QGraphicsView): self.scene().addItem(self.video_preview) self.video_preview.setAcceptedMouseButtons(Qt.MouseButton.LeftButton) + self.setStyleSheet("border-style:solid;border-width:0px;") + # Set up the video tint. self.video_tint = self.scene().addRect( 0, @@ -116,14 +119,16 @@ class VideoPlayer(QGraphicsView): autoplay_action.setCheckable(True) self.addAction(autoplay_action) autoplay_action.setChecked( - bool(self.driver.settings.value(SettingItems.AUTOPLAY, defaultValue=True, type=bool)) + self.driver.settings.value(SettingItems.AUTOPLAY, defaultValue=True, type=bool) # type: ignore ) autoplay_action.triggered.connect(lambda: self.toggle_autoplay()) self.autoplay = autoplay_action open_file_action = QAction("Open file", self) open_file_action.triggered.connect(self.opener.open_file) - open_explorer_action = QAction("Open file in explorer", self) + + open_explorer_action = QAction(PlatformStrings.open_file_str, self) + open_explorer_action.triggered.connect(self.opener.open_explorer) self.addAction(open_file_action) self.addAction(open_explorer_action) diff --git a/tagstudio/tests/qt/test_preview_panel.py b/tagstudio/tests/qt/test_preview_panel.py index 3b612e32..f8550b86 100644 --- a/tagstudio/tests/qt/test_preview_panel.py +++ b/tagstudio/tests/qt/test_preview_panel.py @@ -16,7 +16,7 @@ def test_update_widgets_not_selected(qt_driver, library): panel.update_widgets() assert panel.preview_img.isVisible() - assert panel.file_label.text() == "No Items Selected" + assert panel.file_label.text() == "No Items Selected" @pytest.mark.parametrize("library", [TemporaryDirectory()], indirect=True) From 7574ad38465dff5e00ac7accec8dbfd9b86d058f Mon Sep 17 00:00:00 2001 From: yed Date: Tue, 8 Oct 2024 08:56:02 +0700 Subject: [PATCH 09/82] fix: don't check db version with new library (#536) --- tagstudio/src/core/library/alchemy/library.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tagstudio/src/core/library/alchemy/library.py b/tagstudio/src/core/library/alchemy/library.py index e2e973f6..34267eab 100644 --- a/tagstudio/src/core/library/alchemy/library.py +++ b/tagstudio/src/core/library/alchemy/library.py @@ -1,6 +1,5 @@ import re import shutil -import sys import unicodedata from dataclasses import dataclass from datetime import UTC, datetime @@ -143,9 +142,11 @@ class Library: def open_library(self, library_dir: Path, storage_path: str | None = None) -> LibraryStatus: if storage_path == ":memory:": self.storage_path = storage_path + is_new = True else: self.verify_ts_folders(library_dir) self.storage_path = library_dir / TS_FOLDER_NAME / self.FILENAME + is_new = not self.storage_path.exists() connection_string = URL.create( drivername="sqlite", @@ -165,13 +166,13 @@ class Library: # default tags may exist already session.rollback() - if "pytest" not in sys.modules: + # dont check db version when creating new library + if not is_new: db_version = session.scalar( select(Preferences).where(Preferences.key == LibraryPrefs.DB_VERSION.name) ) if not db_version: - # TODO - remove after #503 is merged and LibraryPrefs.DB_VERSION increased again return LibraryStatus( success=False, message=( From c348c763f85f310d88ed2af2575bbd2121aa96ba Mon Sep 17 00:00:00 2001 From: Jann Stute <46534683+Computerdores@users.noreply.github.com> Date: Tue, 8 Oct 2024 04:04:22 +0200 Subject: [PATCH 10/82] fix: enable mypy to run from project directory (#520) --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index ca949c6b..05e1a51b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,6 +39,7 @@ disable_error_code = ["func-returns-value", "import-untyped"] explicit_package_bases = true warn_unused_ignores = true check_untyped_defs = true +mypy_path = ["tagstudio"] [[tool.mypy.overrides]] module = "tests.*" From 68c166d8d34c3935324b485b92aed5803589b173 Mon Sep 17 00:00:00 2001 From: Travis Abendshien Date: Thu, 10 Oct 2024 12:40:09 -0700 Subject: [PATCH 11/82] Bump version to v9.5.0 Experimental --- tagstudio/src/core/constants.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tagstudio/src/core/constants.py b/tagstudio/src/core/constants.py index 48c087fd..0ca05377 100644 --- a/tagstudio/src/core/constants.py +++ b/tagstudio/src/core/constants.py @@ -1,5 +1,5 @@ -VERSION: str = "9.3.2" # Major.Minor.Patch -VERSION_BRANCH: str = "" # Usually "" or "Pre-Release" +VERSION: str = "9.5.0" # Major.Minor.Patch +VERSION_BRANCH: str = "EXPERIMENTAL" # Usually "" or "Pre-Release" # The folder & file names where TagStudio keeps its data relative to a library. TS_FOLDER_NAME: str = ".TagStudio" From 7c253226d529f0a799c438aca0965723e4e29544 Mon Sep 17 00:00:00 2001 From: xarvex Date: Fri, 11 Oct 2024 17:01:49 -0500 Subject: [PATCH 12/82] fix(ci): replace obselete package --- .github/workflows/pytest.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pytest.yaml b/.github/workflows/pytest.yaml index 93f54e61..ea958060 100644 --- a/.github/workflows/pytest.yaml +++ b/.github/workflows/pytest.yaml @@ -19,13 +19,13 @@ jobs: - name: Install system dependencies run: | - # dont run update, it is slow + # dont run update, it is slow # sudo apt-get update sudo apt-get install -y --no-install-recommends \ libxkbcommon-x11-0 \ x11-utils \ libyaml-dev \ - libegl1-mesa \ + libegl-mesa0 \ libxcb-icccm4 \ libxcb-image0 \ libxcb-keysyms1 \ From abeb0c1ce3f8d89ef8736a7c0ef1df10f1c615d2 Mon Sep 17 00:00:00 2001 From: xarvex Date: Fri, 11 Oct 2024 17:10:17 -0500 Subject: [PATCH 13/82] fix(ci): complete 7c253226d529f0a799c438aca0965723e4e29544 --- .github/workflows/pytest.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pytest.yaml b/.github/workflows/pytest.yaml index ea958060..d10298d3 100644 --- a/.github/workflows/pytest.yaml +++ b/.github/workflows/pytest.yaml @@ -25,7 +25,7 @@ jobs: libxkbcommon-x11-0 \ x11-utils \ libyaml-dev \ - libegl-mesa0 \ + libegl1 \ libxcb-icccm4 \ libxcb-image0 \ libxcb-keysyms1 \ From 5b85462cfa7b8e29218ad57de4024c176f598646 Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Sat, 12 Oct 2024 23:59:08 -0700 Subject: [PATCH 14/82] ci: pin pytest ubuntu version to 22..04 (#544) --- .github/workflows/pytest.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pytest.yaml b/.github/workflows/pytest.yaml index d10298d3..bb266050 100644 --- a/.github/workflows/pytest.yaml +++ b/.github/workflows/pytest.yaml @@ -5,7 +5,7 @@ on: [ push, pull_request ] jobs: pytest: name: Run tests - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Checkout repo From 9255a86ad1d0800e663fb984065dd7e3362b2916 Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Mon, 14 Oct 2024 13:30:46 -0700 Subject: [PATCH 15/82] feat: add svg thumbnail support (port #442) (#540) * feat: add svg thumbnail support Co-Authored-By: Tyrannicodin <86689800+Tyrannicodin@users.noreply.github.com> * flip `svg.isValid()` logic check * tests: add test comparing svg to png snapshot Co-Authored-By: yed --------- Co-authored-by: Tyrannicodin <86689800+Tyrannicodin@users.noreply.github.com> Co-authored-by: yed --- tagstudio/src/qt/widgets/thumb_renderer.py | 33 ++++++++++++++++-- tagstudio/tests/fixtures/sample.svg | 8 +++++ .../test_thumb_renderer/test_svg_preview.png | Bin 0 -> 5248 bytes tagstudio/tests/qt/test_thumb_renderer.py | 21 +++++++++++ 4 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 tagstudio/tests/fixtures/sample.svg create mode 100644 tagstudio/tests/qt/__snapshots__/test_thumb_renderer/test_svg_preview.png create mode 100644 tagstudio/tests/qt/test_thumb_renderer.py diff --git a/tagstudio/src/qt/widgets/thumb_renderer.py b/tagstudio/src/qt/widgets/thumb_renderer.py index 83eb1c57..377a5f73 100644 --- a/tagstudio/src/qt/widgets/thumb_renderer.py +++ b/tagstudio/src/qt/widgets/thumb_renderer.py @@ -28,8 +28,9 @@ from PIL import ( from PIL.Image import DecompressionBombError from pillow_heif import register_avif_opener, register_heif_opener from pydub import exceptions -from PySide6.QtCore import QObject, QSize, Qt, Signal -from PySide6.QtGui import QGuiApplication, QPixmap +from PySide6.QtCore import QBuffer, QObject, QSize, Qt, Signal +from PySide6.QtGui import QGuiApplication, QImage, QPainter, QPixmap +from PySide6.QtSvg import QSvgRenderer from src.core.constants import FONT_SAMPLE_SIZES, FONT_SAMPLE_TEXT from src.core.media_types import MediaCategories, MediaType from src.core.palette import ColorType, UiColor, get_ui_color @@ -750,8 +751,33 @@ class ThumbRenderer(QObject): filepath (Path): The path of the file. size (tuple[int,int]): The size of the thumbnail. """ - # TODO: Implement. im: Image.Image = None + # Create an image to draw the svg to and a painter to do the drawing + image: QImage = QImage(size, size, QImage.Format.Format_ARGB32) + image.fill("#1e1e1e") + + # Create an svg renderer, then render to the painter + svg: QSvgRenderer = QSvgRenderer(str(filepath)) + + if not svg.isValid(): + raise UnidentifiedImageError + + painter: QPainter = QPainter(image) + svg.setAspectRatioMode(Qt.AspectRatioMode.KeepAspectRatio) + svg.render(painter) + painter.end() + + # Write the image to a buffer as png + buffer: QBuffer = QBuffer() + buffer.open(QBuffer.OpenModeFlag.ReadWrite) + image.save(buffer, "PNG") + + # Load the image from the buffer + im = Image.new("RGB", (size, size), color="#1e1e1e") + im.paste(Image.open(BytesIO(buffer.data().data()))) + im = im.convert(mode="RGB") + + buffer.close() return im def _model_stl_thumb(self, filepath: Path, size: int) -> Image.Image: @@ -924,6 +950,7 @@ class ThumbRenderer(QObject): ext, MediaCategories.IMAGE_RAW_TYPES, mime_fallback=True ): image = self._image_raw_thumb(_filepath) + # Vector Images -------------------------------------------- elif MediaCategories.is_ext_in_category( ext, MediaCategories.IMAGE_VECTOR_TYPES, mime_fallback=True ): diff --git a/tagstudio/tests/fixtures/sample.svg b/tagstudio/tests/fixtures/sample.svg new file mode 100644 index 00000000..99c924a8 --- /dev/null +++ b/tagstudio/tests/fixtures/sample.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/tagstudio/tests/qt/__snapshots__/test_thumb_renderer/test_svg_preview.png b/tagstudio/tests/qt/__snapshots__/test_thumb_renderer/test_svg_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..ebd90431406e2658126b2619644d61f4940091b1 GIT binary patch literal 5248 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 literal 0 HcmV?d00001 diff --git a/tagstudio/tests/qt/test_thumb_renderer.py b/tagstudio/tests/qt/test_thumb_renderer.py new file mode 100644 index 00000000..c9f67595 --- /dev/null +++ b/tagstudio/tests/qt/test_thumb_renderer.py @@ -0,0 +1,21 @@ +# Copyright (C) 2024 Travis Abendshien (CyanVoxel). +# Licensed under the GPL-3.0 License. +# Created for TagStudio: https://github.com/CyanVoxel/TagStudio + +import io +from pathlib import Path + +from PIL import Image +from src.qt.widgets.thumb_renderer import ThumbRenderer +from syrupy.extensions.image import PNGImageSnapshotExtension + + +def test_svg_preview(cwd, snapshot): + file_path: Path = cwd / "fixtures" / "sample.svg" + renderer = ThumbRenderer() + img: Image.Image = renderer._image_vector_thumb(file_path, 200) + + img_bytes = io.BytesIO() + img.save(img_bytes, format="PNG") + img_bytes.seek(0) + assert img_bytes.read() == snapshot(extension_class=PNGImageSnapshotExtension) From 3d7629bc731286d2721f19cc60bb8bb42e6facf5 Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Mon, 14 Oct 2024 16:34:49 -0700 Subject: [PATCH 16/82] feat: add pdf thumbnail support (port #378) (#543) * feat: add pdf thumbnail support Co-Authored-By: Heiholf <71659566+heiholf@users.noreply.github.com> * fix: remove redef * tests: add test comparing pdf to png snapshot Co-Authored-By: yed * fix: fix info in docstrings * fix: remove sample png generation * fix: change the pdf snapshot to use a black square * chore: fix whitespace --------- Co-authored-by: Heiholf <71659566+heiholf@users.noreply.github.com> Co-authored-by: yed --- tagstudio/src/qt/helpers/image_effects.py | 27 ++++++ tagstudio/src/qt/widgets/thumb_renderer.py | 81 +++++++++++++++--- tagstudio/tests/fixtures/sample.pdf | Bin 0 -> 5389 bytes .../test_thumb_renderer/test_pdf_preview.png | Bin 0 -> 1860 bytes tagstudio/tests/qt/test_thumb_renderer.py | 11 +++ 5 files changed, 109 insertions(+), 10 deletions(-) create mode 100644 tagstudio/src/qt/helpers/image_effects.py create mode 100644 tagstudio/tests/fixtures/sample.pdf create mode 100644 tagstudio/tests/qt/__snapshots__/test_thumb_renderer/test_pdf_preview.png diff --git a/tagstudio/src/qt/helpers/image_effects.py b/tagstudio/src/qt/helpers/image_effects.py new file mode 100644 index 00000000..139d5274 --- /dev/null +++ b/tagstudio/src/qt/helpers/image_effects.py @@ -0,0 +1,27 @@ +# Copyright (C) 2024 Travis Abendshien (CyanVoxel). +# Licensed under the GPL-3.0 License. +# Created for TagStudio: https://github.com/CyanVoxel/TagStudio + +import numpy as np +from PIL import Image + + +def replace_transparent_pixels( + img: Image.Image, color: tuple[int, int, int, int] = (255, 255, 255, 255) +) -> Image.Image: + """Replace (copying/without mutating) all transparent pixels in an image with the color. + + Args: + img (Image.Image): + The source image + color (tuple[int, int, int, int]): + The color (RGBA, 0 to 255) which transparent pixels should be set to. + Defaults to white (255, 255, 255, 255) + + Returns: + Image.Image: + A copy of img with the pixels replaced. + """ + pixel_array = np.asarray(img.convert("RGBA")).copy() + pixel_array[pixel_array[:, :, 3] == 0] = color + return Image.fromarray(pixel_array) diff --git a/tagstudio/src/qt/widgets/thumb_renderer.py b/tagstudio/src/qt/widgets/thumb_renderer.py index 377a5f73..2818f378 100644 --- a/tagstudio/src/qt/widgets/thumb_renderer.py +++ b/tagstudio/src/qt/widgets/thumb_renderer.py @@ -28,8 +28,19 @@ from PIL import ( from PIL.Image import DecompressionBombError from pillow_heif import register_avif_opener, register_heif_opener from pydub import exceptions -from PySide6.QtCore import QBuffer, QObject, QSize, Qt, Signal +from PySide6.QtCore import ( + QBuffer, + QFile, + QFileDevice, + QIODeviceBase, + QObject, + QSize, + QSizeF, + Qt, + Signal, +) from PySide6.QtGui import QGuiApplication, QImage, QPainter, QPixmap +from PySide6.QtPdf import QPdfDocument, QPdfDocumentRenderOptions from PySide6.QtSvg import QSvgRenderer from src.core.constants import FONT_SAMPLE_SIZES, FONT_SAMPLE_TEXT from src.core.media_types import MediaCategories, MediaType @@ -39,6 +50,7 @@ from src.qt.helpers.blender_thumbnailer import blend_thumb from src.qt.helpers.color_overlay import theme_fg_overlay from src.qt.helpers.file_tester import is_readable_video from src.qt.helpers.gradient import four_corner_gradient +from src.qt.helpers.image_effects import replace_transparent_pixels from src.qt.helpers.text_wrapper import wrap_full_text from src.qt.helpers.vendored.pydub.audio_segment import ( # type: ignore _AudioSegment as AudioSegment, @@ -812,6 +824,52 @@ class ThumbRenderer(QObject): return im + def _pdf_thumb(self, filepath: Path, size: int) -> Image.Image: + """Render a thumbnail for a PDF file. + + filepath (Path): The path of the file. + size (int): The size of the icon. + """ + im: Image.Image = None + + file: QFile = QFile(filepath) + success: bool = file.open( + QIODeviceBase.OpenModeFlag.ReadOnly, QFileDevice.Permission.ReadUser + ) + if not success: + logger.error("Couldn't render thumbnail", filepath=filepath) + return im + document: QPdfDocument = QPdfDocument() + document.load(file) + # Transform page_size in points to pixels with proper aspect ratio + page_size: QSizeF = document.pagePointSize(0) + ratio_hw: float = page_size.height() / page_size.width() + if ratio_hw >= 1: + page_size *= size / page_size.height() + else: + page_size *= size / page_size.width() + # Enlarge image for antialiasing + scale_factor = 2.5 + page_size *= scale_factor + # Render image with no anti-aliasing for speed + render_options: QPdfDocumentRenderOptions = QPdfDocumentRenderOptions() + render_options.setRenderFlags( + QPdfDocumentRenderOptions.RenderFlag.TextAliased + | QPdfDocumentRenderOptions.RenderFlag.ImageAliased + | QPdfDocumentRenderOptions.RenderFlag.PathAliased + ) + # Convert QImage to PIL Image + qimage: QImage = document.render(0, page_size.toSize(), render_options) + buffer: QBuffer = QBuffer() + buffer.open(QBuffer.OpenModeFlag.ReadWrite) + try: + qimage.save(buffer, "PNG") + im = Image.open(BytesIO(buffer.buffer().data())) + finally: + buffer.close() + # Replace transparent pixels with white (otherwise Background defaults to transparent) + return replace_transparent_pixels(im) + def _text_thumb(self, filepath: Path) -> Image.Image: """Render a thumbnail for a plaintext file. @@ -959,17 +1017,17 @@ class ThumbRenderer(QObject): else: image = self._image_thumb(_filepath) # Videos ======================================================= - if MediaCategories.is_ext_in_category( + elif MediaCategories.is_ext_in_category( ext, MediaCategories.VIDEO_TYPES, mime_fallback=True ): image = self._video_thumb(_filepath) # Plain Text =================================================== - if MediaCategories.is_ext_in_category( + elif MediaCategories.is_ext_in_category( ext, MediaCategories.PLAINTEXT_TYPES, mime_fallback=True ): image = self._text_thumb(_filepath) # Fonts ======================================================== - if MediaCategories.is_ext_in_category( + elif MediaCategories.is_ext_in_category( ext, MediaCategories.FONT_TYPES, mime_fallback=True ): if is_grid_thumb: @@ -979,7 +1037,7 @@ class ThumbRenderer(QObject): # Large (Full Alphabet) Preview image = self._font_long_thumb(_filepath, adj_size) # Audio ======================================================== - if MediaCategories.is_ext_in_category( + elif MediaCategories.is_ext_in_category( ext, MediaCategories.AUDIO_TYPES, mime_fallback=True ): image = self._audio_album_thumb(_filepath, ext) @@ -987,15 +1045,18 @@ class ThumbRenderer(QObject): image = self._audio_waveform_thumb(_filepath, ext, adj_size, pixel_ratio) if image is not None: image = self._apply_overlay_color(image, UiColor.GREEN) - - # Blender =========================================================== - if MediaCategories.is_ext_in_category( + # Blender ====================================================== + elif MediaCategories.is_ext_in_category( ext, MediaCategories.BLENDER_TYPES, mime_fallback=True ): image = self._blender(_filepath) - + # PDF ========================================================== + elif MediaCategories.is_ext_in_category( + ext, MediaCategories.PDF_TYPES, mime_fallback=True + ): + image = self._pdf_thumb(_filepath, adj_size) # VTF ========================================================== - if MediaCategories.is_ext_in_category( + elif MediaCategories.is_ext_in_category( ext, MediaCategories.SOURCE_ENGINE_TYPES, mime_fallback=True ): image = self._source_engine(_filepath) diff --git a/tagstudio/tests/fixtures/sample.pdf b/tagstudio/tests/fixtures/sample.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0293578a2a59d6e36a2b18472ae9d4bf1aaaf635 GIT binary patch literal 5389 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 X*K972P4S25B6QFYb#*g4bI88|aLs^8 literal 0 HcmV?d00001 diff --git a/tagstudio/tests/qt/__snapshots__/test_thumb_renderer/test_pdf_preview.png b/tagstudio/tests/qt/__snapshots__/test_thumb_renderer/test_pdf_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..0ba9ea61890a903765262c53768b037ed6fb49a4 GIT binary patch literal 1860 zcmeAS@N?(olHy`uVBq!ia0y~yU~B^7FC1(@5rampPzDBeZci7-kcv5PuW#f%;=seQ zaew>o{K&iqPRv|wYZ5jeoHui(JVWIFw~P#LgqRvE6d5{%N2$>uz?lkmq*pVPKcDlK z^TW=WH|HH_b!QMzXJIIG8l^^qfUc?Fdk+7DytHlV41#iu4s!$;j&P1rqd|Z-73@9A X#QRicv4jb*c4Y8$^>bP0l+XkKSx0;n literal 0 HcmV?d00001 diff --git a/tagstudio/tests/qt/test_thumb_renderer.py b/tagstudio/tests/qt/test_thumb_renderer.py index c9f67595..c4f794d4 100644 --- a/tagstudio/tests/qt/test_thumb_renderer.py +++ b/tagstudio/tests/qt/test_thumb_renderer.py @@ -10,6 +10,17 @@ from src.qt.widgets.thumb_renderer import ThumbRenderer from syrupy.extensions.image import PNGImageSnapshotExtension +def test_pdf_preview(cwd, snapshot): + file_path: Path = cwd / "fixtures" / "sample.pdf" + renderer = ThumbRenderer() + img: Image.Image = renderer._pdf_thumb(file_path, 200) + + img_bytes = io.BytesIO() + img.save(img_bytes, format="PNG") + img_bytes.seek(0) + assert img_bytes.read() == snapshot(extension_class=PNGImageSnapshotExtension) + + def test_svg_preview(cwd, snapshot): file_path: Path = cwd / "fixtures" / "sample.svg" renderer = ThumbRenderer() From d3c3e634b93353750c9fc810af9973e64e21de71 Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Thu, 17 Oct 2024 15:15:51 -0700 Subject: [PATCH 17/82] feat: add ePub thumbnail support (port #387) (#539) * feat: add ePub thumbnail support Co-Authored-By: Jorge Rui Da Silva Barrios <29062316+jorgerui@users.noreply.github.com> * tests: compare epub cover against png snapshot Co-Authored-By: yed * test: optimize epub test file --------- Co-authored-by: Jorge Rui Da Silva Barrios <29062316+jorgerui@users.noreply.github.com> Co-authored-by: yed --- tagstudio/src/core/media_types.py | 26 +++++++++++++++ tagstudio/src/qt/widgets/thumb_renderer.py | 30 +++++++++++++++++- tagstudio/tests/fixtures/sample.epub | Bin 0 -> 4413 bytes .../test_thumb_renderer/test_epub_preview.png | Bin 0 -> 3721 bytes tagstudio/tests/qt/test_thumb_renderer.py | 14 ++++++++ 5 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 tagstudio/tests/fixtures/sample.epub create mode 100644 tagstudio/tests/qt/__snapshots__/test_thumb_renderer/test_epub_preview.png diff --git a/tagstudio/src/core/media_types.py b/tagstudio/src/core/media_types.py index bb190700..04ea5e87 100644 --- a/tagstudio/src/core/media_types.py +++ b/tagstudio/src/core/media_types.py @@ -23,6 +23,7 @@ class MediaType(str, Enum): DATABASE: str = "database" DISK_IMAGE: str = "disk_image" DOCUMENT: str = "document" + EBOOK: str = "ebook" FONT: str = "font" IMAGE_ANIMATED: str = "image_animated" IMAGE_RAW: str = "image_raw" @@ -160,6 +161,25 @@ class MediaCategories: ".wpd", ".wps", } + _EBOOK_SET: set[str] = { + ".epub", + # ".azw", + # ".azw3", + # ".cb7", + # ".cba", + # ".cbr", + # ".cbt", + # ".cbz", + # ".djvu", + # ".fb2", + # ".ibook", + # ".inf", + # ".kfx", + # ".lit", + # ".mobi", + # ".pdb" + # ".prc", + } _FONT_SET: set[str] = { ".fon", ".otf", @@ -347,6 +367,11 @@ class MediaCategories: extensions=_DOCUMENT_SET, is_iana=False, ) + EBOOK_TYPES: MediaCategory = MediaCategory( + media_type=MediaType.EBOOK, + extensions=_EBOOK_SET, + is_iana=False, + ) FONT_TYPES: MediaCategory = MediaCategory( media_type=MediaType.FONT, extensions=_FONT_SET, @@ -448,6 +473,7 @@ class MediaCategories: DATABASE_TYPES, DISK_IMAGE_TYPES, DOCUMENT_TYPES, + EBOOK_TYPES, FONT_TYPES, IMAGE_ANIMATED_TYPES, IMAGE_RAW_TYPES, diff --git a/tagstudio/src/qt/widgets/thumb_renderer.py b/tagstudio/src/qt/widgets/thumb_renderer.py index 2818f378..7cac38fc 100644 --- a/tagstudio/src/qt/widgets/thumb_renderer.py +++ b/tagstudio/src/qt/widgets/thumb_renderer.py @@ -5,6 +5,7 @@ import math import struct +import zipfile from copy import deepcopy from io import BytesIO from pathlib import Path @@ -616,6 +617,29 @@ class ThumbRenderer(QObject): logger.error("Couldn't render thumbnail", filepath=filepath, error=e) return im + def _epub_cover(self, filepath: Path) -> Image.Image: + """Extracts and returns the first image found in the ePub file at the given filepath. + + Args: + filepath (Path): The path to the ePub file. + + Returns: + Image: The first image found in the ePub file, or None by default. + """ + im: Image.Image = None + try: + with zipfile.ZipFile(filepath, "r") as zip_file: + for file_name in zip_file.namelist(): + if file_name.lower().endswith( + (".png", ".jpg", ".jpeg", ".gif", ".bmp", ".svg") + ): + image_data = zip_file.read(file_name) + im = Image.open(BytesIO(image_data)) + except Exception as e: + logger.error("Couldn't render thumbnail", filepath=filepath, error=e) + + return im + def _font_short_thumb(self, filepath: Path, size: int) -> Image.Image: """Render a small font preview ("Aa") thumbnail from a font file. @@ -1045,6 +1069,11 @@ class ThumbRenderer(QObject): image = self._audio_waveform_thumb(_filepath, ext, adj_size, pixel_ratio) if image is not None: image = self._apply_overlay_color(image, UiColor.GREEN) + # Ebooks ======================================================= + elif MediaCategories.is_ext_in_category( + ext, MediaCategories.EBOOK_TYPES, mime_fallback=True + ): + image = self._epub_cover(_filepath) # Blender ====================================================== elif MediaCategories.is_ext_in_category( ext, MediaCategories.BLENDER_TYPES, mime_fallback=True @@ -1060,7 +1089,6 @@ class ThumbRenderer(QObject): ext, MediaCategories.SOURCE_ENGINE_TYPES, mime_fallback=True ): image = self._source_engine(_filepath) - # No Rendered Thumbnail ======================================== if not _filepath.exists(): raise FileNotFoundError diff --git a/tagstudio/tests/fixtures/sample.epub b/tagstudio/tests/fixtures/sample.epub new file mode 100644 index 0000000000000000000000000000000000000000..b625b67b2848ff0c97a18f213ee167ab52ed1326 GIT binary patch literal 4413 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 Date: Mon, 28 Oct 2024 13:01:13 -0700 Subject: [PATCH 18/82] docs: add feature roadmap --- docs/index.md | 33 ++--- docs/updates/roadmap.md | 265 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 283 insertions(+), 15 deletions(-) create mode 100644 docs/updates/roadmap.md diff --git a/docs/index.md b/docs/index.md index 9f8240b4..eb22662a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -5,11 +5,10 @@ title: Home # Welcome to the TagStudio Documentation! !!! warning - This documentation is still a work in progress, and is intended to aide with deconstructing and understanding of the core mechanics of TagStudio and how it operates. +This documentation is still a work in progress, and is intended to aide with deconstructing and understanding of the core mechanics of TagStudio and how it operates. ![TagStudio Alpha](assets/github_header.png) - TagStudio is a photo & file organization application with an underlying system that focuses on giving freedom and flexibility to the user. No proprietary programs or formats, no sea of sidecar files, and no complete upheaval of your filesystem structure.