supervertaler 1.9.175__tar.gz → 1.9.177b0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/CHANGELOG.md +24 -2
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/PKG-INFO +1 -1
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/Supervertaler.py +347 -30
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/index.html +4 -4
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/database_manager.py +169 -64
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/pyproject.toml +1 -1
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/supervertaler.egg-info/PKG-INFO +1 -1
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/FAQ.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/LICENSE +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/MANIFEST.in +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/README.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/ICON_CONVERSION_GUIDE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/MB.ico +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/README.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/generate_icons.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/icon.ico +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/icon_128.png +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/icon_24.png +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/icon_256.png +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/icon_32.png +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/icon_48.png +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/icon_64.png +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/icon_preview.html +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/icon_sv_modern.svg +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/icon_sv_modern_paths.svg +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/icon_sv_simple.svg +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/patent-drawing-1951.jpg +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/supervertaler_icon_colours.png +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/.nojekyll +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/CNAME +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/SIMILAR_APPS.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/apple-touch-icon.png +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/BUGFIX_README.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/CHANGELIST.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/CHANGELOG_Old.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/FAQ.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/INSTALLATION_v1.7.8.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/PROJECT_ORGANIZATION.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/TERMBASE_REFACTORING_SUMMARY.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/USER_GUIDE_v1.7.8.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/VERIFICATION_CHECKLIST.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/BEFORE_AFTER_COMPARISON.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/BUGFIX_SESSION_SUMMARY.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/COLOR_SCHEME_REFERENCE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/COMPACT_LAYOUT_CHANGELOG.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/COMPACT_LAYOUT_DOCUMENTATION_INDEX.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/COMPACT_LAYOUT_IMPLEMENTATION_SUMMARY.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/COMPACT_LAYOUT_UPDATE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/COMPLETE_IMPLEMENTATION_SUMMARY.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/COMPLETE_PROJECT_SUMMARY.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/DATABASE_FINAL_SUMMARY.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/DATABASE_IMPLEMENTATION.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/DATABASE_PRODUCTION_READY.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/DATABASE_QUICK_REFERENCE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/DUAL_VERSION_STRATEGY.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/FINAL_SESSION_SUMMARY.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/FOLDER_STRUCTURE_UPDATE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/GITHUB_PAGES_SETUP.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/IMPLEMENTATION_CHECKLIST.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/IMPLEMENTATION_COMPLETE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/IMPLEMENTATION_COMPLETE_COMPACT_LAYOUT.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/IMPLEMENTATION_READY.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/IMPLEMENTATION_STATUS_PHASE2_READY.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/KEYBOARD_SHORTCUTS_MATCHES.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/LAYOUT_BEFORE_AFTER.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/MASTER_INDEX.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/MATCH_DISPLAY_IMPROVEMENTS.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/MATCH_DISPLAY_LONG_SEGMENTS_UPDATE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/MATCH_DISPLAY_QUICK_REFERENCE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/MATCH_INSERTION_FEATURES.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/MATCH_SHORTCUTS_QUICK_REF.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/MODULAR_ARCHITECTURE_GUIDE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/PHASE2_IMPLEMENTATION_CHECKLIST.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/PHASE2_IMPLEMENTATION_DETAILED_CHECKLIST.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/PHASE2_IMPLEMENTATION_IN_PROGRESS.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/PHASE2_NEXT_STEPS.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/PHASE2_READY_TO_IMPLEMENT.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/PHASE2_START_HERE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/QT_MIGRATION_PLAN.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/QT_SESSION_SUMMARY.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/QUICK_SESSION_SUMMARY.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/RELEASE_Qt_v1.0.0_Phase5.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/RELEASE_v1.9.38.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/RELEASE_v3.7.1.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/RELEASE_v3.7.6.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/RELEASE_v3.7.7.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/RESTRUCTURE_COMPLETE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/SESSION_DOCUMENTATION_INDEX.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/SESSION_IMPLEMENTATION_SUMMARY.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/SESSION_LONG_SEGMENTS_COMPLETE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/SESSION_MATCH_FEATURES_COMPLETE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/SESSION_STATUS.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/SESSION_SUMMARY_Phase5.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/START_HERE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/START_IMPLEMENTATION_HERE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/STYLE_GUIDES_DELIVERABLES.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/STYLE_GUIDES_DOCUMENTATION_INDEX.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/STYLE_GUIDES_FEATURE_SUMMARY.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/STYLE_GUIDES_IMPLEMENTATION.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/STYLE_GUIDES_PROJECT_COMPLETION.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/STYLE_GUIDES_QUICK_REFERENCE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/STYLE_GUIDES_VISUAL_ARCHITECTURE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TERMBASE_FIXES.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TERMBASE_IMPLEMENTATION.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TERMBASE_QUICK_START.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TMX_CONCORDANCE_STYLE_HIGHLIGHTING.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TMX_DUAL_HIGHLIGHTING.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TMX_EDITOR_HIGHLIGHTING_UPDATE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TMX_EDITOR_IMPLEMENTATION.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TMX_EDITOR_WORD_HIGHLIGHTING.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TMX_TABLE_LAYOUT_INTEGRATED_EDIT.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TMX_TREEVIEW_GRID_RESIZABLE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TMX_WORD_HIGHLIGHTING_IMPLEMENTATION_COMPLETE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TMX_WORD_HIGHLIGHTING_SUMMARY.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TM_MATCH_PANE_CHECKLIST.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TM_MATCH_PANE_IMPLEMENTATION.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TM_MATCH_PANE_VISUAL_GUIDE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/VISUAL_COLOR_REFERENCE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/VISUAL_IMPLEMENTATION_SUMMARY.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/sessions/COLOR_FIX_EXPLANATION.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/sessions/DATABASE_CONSOLIDATION_REPORT.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/sessions/DUAL_EDITOR_WORKFLOW.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/sessions/DUAL_SELECTION_SYSTEM.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/sessions/IMPROVEMENTS_SUMMARY.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/sessions/ISSUES_FIXES_PROGRESS.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/sessions/MATCH_DISPLAY_COMPACT_FIXES.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/sessions/README_SESSION_TERMBASE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/sessions/SAFE_DELETION_REMINDER.txt +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/sessions/SESSION_SUMMARY.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/sessions/TERMBASE_FIXES_APPLIED.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/sessions/TESTING_CHECKLIST.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/sessions/TMX_EDITOR_ANNOUNCEMENT.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/sessions/TRANSLATION_RESULTS_IMPROVEMENTS.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/assets/Figure1.png +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/assets/patent-drawing-1951.jpg +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/changelog.html +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/dev-notes/QA.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/dev-notes/STYLE_GUIDES_UI_TEMPLATE.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/dev-notes/_Notes_2025-11-21.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/dev-notes/_things_to_remind_AIs_of_when_translating.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/dev-notes/issue_28.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/dev-notes/openai_debug.txt +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/dev-notes/pre-translation-dialog-enhancement.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/emoji_mockup.html +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/favicon.ico +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/guides/AI_PROMPT_ASSISTANT_USER_GUIDE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/guides/ENCODING_REPAIR_TOOL.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/guides/FAQ.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/guides/GLOSSARY_OF_SUPERVERTALER_TERMINOLOGY.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/guides/JSON_EDITORS_AND_HUMAN_READABLE_FORMAT.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/guides/KEYBOARD_SHORTCUTS.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/guides/PDF_RESCUE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/guides/PROMPT_ASSISTANT_USER_GUIDE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/guides/QT_SETTINGS_DIALOG_GUIDE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/guides/TERM_EXTRACTION_GUIDE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/guides/USER_DATA_FOLDER_SETUP.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/idea_beijer.bot_integration_idea/BEIJERBOT_FEATURE_ANALYSIS.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/idea_beijer.bot_integration_idea/CLI_BRIDGE_SPECIFICATION.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/idea_beijer.bot_integration_idea/IMPLEMENTATION_ROADMAP.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/idea_beijer.bot_integration_idea/QUICKMENU_INTEGRATION_PLAN.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/idea_beijer.bot_integration_idea/README.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/idea_tag-cleaner/tag_cleaner.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/idea_use_vscode_as_cat_tool/ai-agent-translation-workflow.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/logo.png +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/2025-10-13_00-46-16.jpg +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/Superlookup_Web_resources.jpg +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/Supervertaler_AI-Assistant.jpg +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/Supervertaler_CLASSIC_v2.4.1_(tkinter).jpg +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/Supervertaler_Prompt_Manager_2026-01-14.png +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/Supervertaler_Qt_LLM_LeaderboardResults_2025-11-12.jpg +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/Supervertaler_Qt_LLM_Leaderboard_2025-11-12.jpg +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/Supervertaler_Superbrowser.jpg +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/Supervertaler_dark_mode_2025-12-16.jpg +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/Supervertaler_dark_mode_2025-12-17.jpg +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/Supervertaler_grid.jpg +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/Supervertaler_tkinter (v3.7.7).jpg +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/Supervertaler_v1.9.102_compare_panel_2026-01-14.png +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/Supervertaler_v1.9.102_grid_2026-01-14.png +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/new/Supervertaler-grid.jpg +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/new/Supervertaler_AI-Assistant.jpg +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/new/Supervertaler_Prompt-Library.jpg +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/new/Supervertaler_Qt_LLM_LeaderboardResults_2025-11-12.jpg +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/new/Supervertaler_Qt_LLM_Leaderboard_2025-11-12.jpg +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/new/Supervertaler_Superbrowser.jpg +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/old/2025-10-13_00-50-24.jpg +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/old/Supervertaler_Qt_2025-11-12.jpg +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/script.js +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/site.webmanifest +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/specifications/AI_ASSISTANT_PHASE2_IMPLEMENTATION.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/specifications/AI_PROMPT_ASSISTANT.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/specifications/AI_PROMPT_ASSISTANT_IMPLEMENTATION.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/specifications/EXPORT_MENU_UPDATE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/specifications/IMPLEMENTATION_SUMMARY.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/specifications/QT_PHASE2_COMPLETE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/specifications/QT_PHASE3_COMPLETE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/specifications/SUPERVERTALER_DATA_FORMAT.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/specifications/TASK_TYPE_SYSTEM.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/specifications/TERMINOLOGY_UPDATE_SUMMARY.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/specifications/opus-api-integration.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/styles.css +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/.gitbook/assets/supervertaler-logo.png +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/.gitbook/assets/sv-icon.svg +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/GITBOOK_LANDING_DRAFT.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/README.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/SUMMARY.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/ai-translation/batch-translation.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/ai-translation/ollama.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/ai-translation/overview.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/ai-translation/prompt-library.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/ai-translation/prompts.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/ai-translation/providers.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/ai-translation/single-segment.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/cat-tools/cafetran.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/cat-tools/memoq.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/cat-tools/overview.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/cat-tools/phrase.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/cat-tools/trados.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/editor/editing-confirming.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/editor/filtering.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/editor/find-replace.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/editor/keyboard-shortcuts.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/editor/navigation.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/editor/pagination.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/editor/translation-grid.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/get-started/api-keys.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/get-started/first-project.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/get-started/installation.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/get-started/quick-start.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/glossaries/basics.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/glossaries/creating.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/glossaries/extraction.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/glossaries/highlighting.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/glossaries/importing.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/import-export/bilingual-tables.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/import-export/docx-import.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/import-export/exporting.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/import-export/formats.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/import-export/multi-file.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/import-export/txt-import.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/qa/non-translatables.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/qa/spellcheck.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/qa/tag-validation.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/reference/changelog.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/reference/contributing.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/reference/faq.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/reference/file-formats.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/settings/fonts.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/settings/general.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/settings/shortcuts.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/settings/theme.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/settings/view.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/superlookup/glossary-search.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/superlookup/mt.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/superlookup/overview.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/superlookup/tm-search.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/superlookup/web-resources.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/tools/autofingers.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/tools/image-extractor.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/tools/pdf-rescue.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/tools/tmx-editor.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/tools/voice-commands.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/translation-memory/basics.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/translation-memory/fuzzy-matching.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/translation-memory/importing-tmx.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/translation-memory/managing-tms.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/translation-memory/supermemory.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/troubleshooting/api-issues.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/troubleshooting/common-issues.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/troubleshooting/import-export-errors.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/troubleshooting/linux.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/troubleshooting/performance.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/sv-icon.svg +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/technical/AI_ASSISTANT_GUIDE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/technical/AI_ASSISTANT_IMPLEMENTATION.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/technical/AI_ASSISTANT_INTEGRATION.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/technical/AI_ASSISTANT_QUICK_REFERENCE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/technical/DATABASE_LOCATIONS.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/technical/FILTER_HIGHLIGHTING_FIX.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/technical/MODULE_HEADER_PATTERN.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/technical/README.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/technical/SUPERBROWSER_GUIDE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/technical/SUPERVOICE_TROUBLESHOOTING.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/technical/UNIFIED_PROMPT_LIBRARY_GUIDE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/technical/VOICE_DICTATION_GUIDE.md +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/tests/test_encoding_corruption.txt +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/web-app-manifest-192x192.png +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/web-app-manifest-512x512.png +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/__init__.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/ai_actions.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/ai_attachment_manager.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/ai_file_viewer_dialog.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/autofingers_engine.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/cafetran_docx_handler.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/config_manager.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/database_migrations.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/dejavurtf_handler.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/document_analyzer.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/docx_handler.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/encoding_repair.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/encoding_repair_Qt.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/encoding_repair_ui.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/feature_manager.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/figure_context_manager.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/file_dialog_helper.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/find_replace.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/find_replace_qt.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/glossary_manager.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/image_extractor.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/keyboard_shortcuts_widget.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/llm_clients.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/llm_leaderboard.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/llm_superbench_ui.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/local_llm_setup.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/model_update_dialog.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/model_version_checker.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/mqxliff_handler.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/non_translatables_manager.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/pdf_rescue_Qt.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/pdf_rescue_tkinter.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/phrase_docx_handler.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/project_home_panel.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/prompt_assistant.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/prompt_library.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/prompt_library_migration.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/quick_access_sidebar.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/ribbon_widget.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/sdlppx_handler.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/setup_wizard.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/shortcut_manager.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/simple_segmenter.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/spellcheck_manager.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/statuses.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/style_guide_manager.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/superbench_ui.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/superbrowser.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/supercleaner.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/supercleaner_ui.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/superdocs.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/superdocs_viewer_qt.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/superlookup.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/tag_cleaner.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/tag_manager.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/term_extractor.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/termbase_entry_editor.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/termbase_import_export.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/termbase_manager.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/termview_widget.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/theme_manager.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/tm_editor_dialog.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/tm_manager_qt.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/tm_metadata_manager.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/tmx_editor.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/tmx_editor_qt.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/tmx_generator.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/tracked_changes.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/trados_docx_handler.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/translation_memory.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/translation_results_panel.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/translation_services.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/unified_prompt_library.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/unified_prompt_manager_qt.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/voice_commands.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/voice_dictation.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/voice_dictation_lite.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/setup.cfg +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/setup.py +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/supervertaler.egg-info/SOURCES.txt +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/supervertaler.egg-info/dependency_links.txt +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/supervertaler.egg-info/entry_points.txt +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/supervertaler.egg-info/not-zip-safe +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/supervertaler.egg-info/requires.txt +0 -0
- {supervertaler-1.9.175 → supervertaler-1.9.177b0}/supervertaler.egg-info/top_level.txt +0 -0
|
@@ -2,11 +2,33 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to Supervertaler are documented in this file.
|
|
4
4
|
|
|
5
|
-
**Current Version:** v1.9.
|
|
5
|
+
**Current Version:** v1.9.177-beta (January 28, 2026)
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
## v1.9.
|
|
9
|
+
## v1.9.177-beta - January 28, 2026
|
|
10
|
+
|
|
11
|
+
### ✨ New Features
|
|
12
|
+
|
|
13
|
+
- **Bidirectional Termbase Matching**: Glossaries now work like memoQ and Trados - a termbase created for NL→EN will also find matches when working on EN→NL projects (and vice versa). This "direction-insensitive" behavior means you no longer need separate termbases for different language directions. When a match is found on the target side, source and target are automatically swapped in the results.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## v1.9.176-beta - January 28, 2026
|
|
18
|
+
|
|
19
|
+
### ✨ New Features
|
|
20
|
+
|
|
21
|
+
- **Unified Setup Wizard**: Combined the first-run data folder selection and features introduction into a single, streamlined wizard. New users now see a clear 2-step wizard (data folder → features), while existing users see a 1-step version with their current data folder displayed. The wizard is also accessible anytime from **Help → Setup Wizard**.
|
|
22
|
+
|
|
23
|
+
### 🎨 UI Improvements
|
|
24
|
+
|
|
25
|
+
- **Clickable Data Folder Path**: In the Setup Wizard, the data folder path is now a clickable link that opens the folder in your system's file manager (Windows Explorer, Finder, etc.).
|
|
26
|
+
|
|
27
|
+
- **Help Menu Enhancement**: Added "🚀 Setup Wizard..." menu item to the Help menu, allowing users to re-run the setup wizard at any time.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## v1.9.175-beta - January 28, 2026
|
|
10
32
|
|
|
11
33
|
### ✨ New Features
|
|
12
34
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: supervertaler
|
|
3
|
-
Version: 1.9.
|
|
3
|
+
Version: 1.9.177b0
|
|
4
4
|
Summary: Professional AI-enhanced translation workbench with multi-LLM support, glossary system, TM, spellcheck, voice commands, and PyQt6 interface. Batteries included (core).
|
|
5
5
|
Home-page: https://supervertaler.com
|
|
6
6
|
Author: Michael Beijer
|
|
@@ -34,7 +34,7 @@ License: MIT
|
|
|
34
34
|
"""
|
|
35
35
|
|
|
36
36
|
# Version Information.
|
|
37
|
-
__version__ = "1.9.
|
|
37
|
+
__version__ = "1.9.176-beta"
|
|
38
38
|
__phase__ = "0.9"
|
|
39
39
|
__release_date__ = "2026-01-28"
|
|
40
40
|
__edition__ = "Qt"
|
|
@@ -6435,13 +6435,10 @@ class SupervertalerQt(QMainWindow):
|
|
|
6435
6435
|
from PyQt6.QtCore import QTimer
|
|
6436
6436
|
QTimer.singleShot(2000, lambda: self._check_for_new_models(force=False)) # 2 second delay
|
|
6437
6437
|
|
|
6438
|
-
# First-run check - show
|
|
6439
|
-
if self._needs_data_location_dialog:
|
|
6438
|
+
# First-run check - show unified setup wizard
|
|
6439
|
+
if self._needs_data_location_dialog or not general_settings.get('first_run_completed', False):
|
|
6440
6440
|
from PyQt6.QtCore import QTimer
|
|
6441
|
-
QTimer.singleShot(300, self.
|
|
6442
|
-
elif not general_settings.get('first_run_completed', False):
|
|
6443
|
-
from PyQt6.QtCore import QTimer
|
|
6444
|
-
QTimer.singleShot(500, self._show_first_run_welcome)
|
|
6441
|
+
QTimer.singleShot(300, lambda: self._show_setup_wizard(is_first_run=True))
|
|
6445
6442
|
|
|
6446
6443
|
def _show_data_location_dialog(self):
|
|
6447
6444
|
"""Show dialog to let user choose their data folder location on first run."""
|
|
@@ -6672,7 +6669,273 @@ class SupervertalerQt(QMainWindow):
|
|
|
6672
6669
|
self.log("✅ First-run welcome shown (will show again next time)")
|
|
6673
6670
|
except Exception as e:
|
|
6674
6671
|
self.log(f"⚠️ First-run welcome error: {e}")
|
|
6675
|
-
|
|
6672
|
+
|
|
6673
|
+
def _show_setup_wizard(self, is_first_run: bool = False):
|
|
6674
|
+
"""
|
|
6675
|
+
Show unified setup wizard that combines data folder selection and features intro.
|
|
6676
|
+
|
|
6677
|
+
Args:
|
|
6678
|
+
is_first_run: If True, this is an automatic first-run trigger. If False, user
|
|
6679
|
+
manually invoked from menu (skip data folder if already configured).
|
|
6680
|
+
"""
|
|
6681
|
+
try:
|
|
6682
|
+
from PyQt6.QtWidgets import (QDialog, QVBoxLayout, QHBoxLayout, QLabel,
|
|
6683
|
+
QPushButton, QLineEdit, QFileDialog, QStackedWidget,
|
|
6684
|
+
QWidget, QFrame, QCheckBox)
|
|
6685
|
+
from PyQt6.QtCore import Qt
|
|
6686
|
+
|
|
6687
|
+
dialog = QDialog(self)
|
|
6688
|
+
dialog.setWindowTitle("Supervertaler Setup Wizard")
|
|
6689
|
+
dialog.setMinimumWidth(600)
|
|
6690
|
+
dialog.setMinimumHeight(450)
|
|
6691
|
+
dialog.setModal(True)
|
|
6692
|
+
|
|
6693
|
+
main_layout = QVBoxLayout(dialog)
|
|
6694
|
+
main_layout.setSpacing(15)
|
|
6695
|
+
main_layout.setContentsMargins(20, 20, 20, 20)
|
|
6696
|
+
|
|
6697
|
+
# Stacked widget for wizard pages
|
|
6698
|
+
stacked = QStackedWidget()
|
|
6699
|
+
|
|
6700
|
+
# Determine if we need to show data folder page
|
|
6701
|
+
show_data_folder_page = is_first_run and self._needs_data_location_dialog
|
|
6702
|
+
|
|
6703
|
+
# ==================== PAGE 1: Data Folder Selection ====================
|
|
6704
|
+
page1 = QWidget()
|
|
6705
|
+
page1_layout = QVBoxLayout(page1)
|
|
6706
|
+
page1_layout.setSpacing(15)
|
|
6707
|
+
|
|
6708
|
+
# Step indicator
|
|
6709
|
+
step1_indicator = QLabel("<span style='color: #888;'>Step 1 of 2</span>")
|
|
6710
|
+
page1_layout.addWidget(step1_indicator)
|
|
6711
|
+
|
|
6712
|
+
# Title
|
|
6713
|
+
page1_title = QLabel("<h2>📁 Choose Your Data Folder</h2>")
|
|
6714
|
+
page1_layout.addWidget(page1_title)
|
|
6715
|
+
|
|
6716
|
+
# Explanation
|
|
6717
|
+
page1_msg = QLabel(
|
|
6718
|
+
"Supervertaler stores your data in a folder of your choice:<br><br>"
|
|
6719
|
+
"• <b>API keys</b> – Your LLM provider credentials<br>"
|
|
6720
|
+
"• <b>Translation memories</b> – Reusable translation pairs<br>"
|
|
6721
|
+
"• <b>Glossaries</b> – Terminology databases<br>"
|
|
6722
|
+
"• <b>Prompts</b> – Custom AI prompts<br>"
|
|
6723
|
+
"• <b>Settings</b> – Application configuration<br><br>"
|
|
6724
|
+
"Choose a location that's easy to find and backup."
|
|
6725
|
+
)
|
|
6726
|
+
page1_msg.setWordWrap(True)
|
|
6727
|
+
page1_layout.addWidget(page1_msg)
|
|
6728
|
+
|
|
6729
|
+
# Path input with browse button
|
|
6730
|
+
path_layout = QHBoxLayout()
|
|
6731
|
+
path_edit = QLineEdit()
|
|
6732
|
+
default_path = get_default_user_data_path()
|
|
6733
|
+
path_edit.setText(str(default_path))
|
|
6734
|
+
path_edit.setMinimumWidth(350)
|
|
6735
|
+
path_layout.addWidget(path_edit)
|
|
6736
|
+
|
|
6737
|
+
browse_btn = QPushButton("Browse...")
|
|
6738
|
+
def browse_folder():
|
|
6739
|
+
folder = QFileDialog.getExistingDirectory(
|
|
6740
|
+
dialog,
|
|
6741
|
+
"Choose Data Folder",
|
|
6742
|
+
str(Path.home())
|
|
6743
|
+
)
|
|
6744
|
+
if folder:
|
|
6745
|
+
folder_path = Path(folder)
|
|
6746
|
+
if folder_path.name != "Supervertaler":
|
|
6747
|
+
folder_path = folder_path / "Supervertaler"
|
|
6748
|
+
path_edit.setText(str(folder_path))
|
|
6749
|
+
|
|
6750
|
+
browse_btn.clicked.connect(browse_folder)
|
|
6751
|
+
path_layout.addWidget(browse_btn)
|
|
6752
|
+
page1_layout.addLayout(path_layout)
|
|
6753
|
+
|
|
6754
|
+
# Tip
|
|
6755
|
+
page1_tip = QLabel(
|
|
6756
|
+
"💡 <b>Tip:</b> The default location is in your home folder, "
|
|
6757
|
+
"making it easy to find and backup."
|
|
6758
|
+
)
|
|
6759
|
+
page1_tip.setWordWrap(True)
|
|
6760
|
+
page1_tip.setStyleSheet("color: #666;")
|
|
6761
|
+
page1_layout.addWidget(page1_tip)
|
|
6762
|
+
|
|
6763
|
+
page1_layout.addStretch()
|
|
6764
|
+
stacked.addWidget(page1)
|
|
6765
|
+
|
|
6766
|
+
# ==================== PAGE 2: Features Introduction ====================
|
|
6767
|
+
page2 = QWidget()
|
|
6768
|
+
page2_layout = QVBoxLayout(page2)
|
|
6769
|
+
page2_layout.setSpacing(15)
|
|
6770
|
+
|
|
6771
|
+
# Step indicator
|
|
6772
|
+
step2_label = "Step 2 of 2" if show_data_folder_page else "Setup"
|
|
6773
|
+
step2_indicator = QLabel(f"<span style='color: #888;'>{step2_label}</span>")
|
|
6774
|
+
page2_layout.addWidget(step2_indicator)
|
|
6775
|
+
|
|
6776
|
+
# Data folder info (shown when skipping page 1)
|
|
6777
|
+
if not show_data_folder_page:
|
|
6778
|
+
from PyQt6.QtGui import QDesktopServices
|
|
6779
|
+
from PyQt6.QtCore import QUrl
|
|
6780
|
+
|
|
6781
|
+
data_folder_path = str(self.user_data_path)
|
|
6782
|
+
data_folder_info = QLabel(
|
|
6783
|
+
f"<b>📁 Data Folder:</b> <a href='file:///{data_folder_path}' "
|
|
6784
|
+
f"style='color: #3b82f6;'>{data_folder_path}</a><br>"
|
|
6785
|
+
"<span style='color: #666; font-size: 0.9em;'>"
|
|
6786
|
+
"Your settings, TMs, glossaries and prompts are stored here. "
|
|
6787
|
+
"Change in Settings → General.</span>"
|
|
6788
|
+
)
|
|
6789
|
+
data_folder_info.setWordWrap(True)
|
|
6790
|
+
data_folder_info.setTextFormat(Qt.TextFormat.RichText)
|
|
6791
|
+
data_folder_info.setOpenExternalLinks(False) # Handle clicks ourselves
|
|
6792
|
+
data_folder_info.linkActivated.connect(
|
|
6793
|
+
lambda url: QDesktopServices.openUrl(QUrl.fromLocalFile(data_folder_path))
|
|
6794
|
+
)
|
|
6795
|
+
data_folder_info.setStyleSheet(
|
|
6796
|
+
"background: #f0f4ff; padding: 12px; border-radius: 6px; "
|
|
6797
|
+
"border-left: 4px solid #3b82f6; margin-bottom: 10px;"
|
|
6798
|
+
)
|
|
6799
|
+
page2_layout.addWidget(data_folder_info)
|
|
6800
|
+
|
|
6801
|
+
# Title
|
|
6802
|
+
page2_title = QLabel("<h2>✨ Modular Features</h2>")
|
|
6803
|
+
page2_layout.addWidget(page2_title)
|
|
6804
|
+
|
|
6805
|
+
# Message
|
|
6806
|
+
page2_msg = QLabel(
|
|
6807
|
+
"Supervertaler uses a <b>modular architecture</b> – you can install "
|
|
6808
|
+
"only the features you need.<br><br>"
|
|
6809
|
+
"<b>Core features</b> (always available):<br>"
|
|
6810
|
+
"• AI translation with OpenAI, Claude, Gemini, Ollama<br>"
|
|
6811
|
+
"• Translation Memory and Glossaries<br>"
|
|
6812
|
+
"• XLIFF, SDLXLIFF, memoQ support<br>"
|
|
6813
|
+
"• Basic spellchecking<br><br>"
|
|
6814
|
+
"<b>Optional features</b> (install via pip):<br>"
|
|
6815
|
+
"• <code>openai-whisper</code> – Local voice dictation (no API needed)<br><br>"
|
|
6816
|
+
"You can view and manage features in <b>Settings → Features</b>."
|
|
6817
|
+
)
|
|
6818
|
+
page2_msg.setWordWrap(True)
|
|
6819
|
+
page2_msg.setTextFormat(Qt.TextFormat.RichText)
|
|
6820
|
+
page2_layout.addWidget(page2_msg)
|
|
6821
|
+
|
|
6822
|
+
# Checkbox
|
|
6823
|
+
dont_show_checkbox = CheckmarkCheckBox("Don't show this wizard on startup")
|
|
6824
|
+
dont_show_checkbox.setChecked(True)
|
|
6825
|
+
page2_layout.addWidget(dont_show_checkbox)
|
|
6826
|
+
|
|
6827
|
+
# Open Features tab checkbox
|
|
6828
|
+
open_features_checkbox = CheckmarkCheckBox("Open Features tab after closing")
|
|
6829
|
+
open_features_checkbox.setChecked(True)
|
|
6830
|
+
page2_layout.addWidget(open_features_checkbox)
|
|
6831
|
+
|
|
6832
|
+
page2_layout.addStretch()
|
|
6833
|
+
stacked.addWidget(page2)
|
|
6834
|
+
|
|
6835
|
+
main_layout.addWidget(stacked)
|
|
6836
|
+
|
|
6837
|
+
# ==================== Navigation Buttons ====================
|
|
6838
|
+
nav_layout = QHBoxLayout()
|
|
6839
|
+
|
|
6840
|
+
back_btn = QPushButton("← Back")
|
|
6841
|
+
back_btn.setVisible(False) # Hidden on first page
|
|
6842
|
+
|
|
6843
|
+
next_btn = QPushButton("Next →")
|
|
6844
|
+
finish_btn = QPushButton("Finish")
|
|
6845
|
+
finish_btn.setVisible(False)
|
|
6846
|
+
finish_btn.setDefault(True)
|
|
6847
|
+
|
|
6848
|
+
# Use Default button (only on page 1)
|
|
6849
|
+
default_btn = QPushButton("Use Default")
|
|
6850
|
+
default_btn.clicked.connect(lambda: path_edit.setText(str(default_path)))
|
|
6851
|
+
|
|
6852
|
+
nav_layout.addWidget(default_btn)
|
|
6853
|
+
nav_layout.addStretch()
|
|
6854
|
+
nav_layout.addWidget(back_btn)
|
|
6855
|
+
nav_layout.addWidget(next_btn)
|
|
6856
|
+
nav_layout.addWidget(finish_btn)
|
|
6857
|
+
|
|
6858
|
+
main_layout.addLayout(nav_layout)
|
|
6859
|
+
|
|
6860
|
+
# Track chosen path for later
|
|
6861
|
+
chosen_path_holder = [None]
|
|
6862
|
+
|
|
6863
|
+
def go_to_page(page_index):
|
|
6864
|
+
stacked.setCurrentIndex(page_index)
|
|
6865
|
+
if page_index == 0:
|
|
6866
|
+
back_btn.setVisible(False)
|
|
6867
|
+
next_btn.setVisible(True)
|
|
6868
|
+
finish_btn.setVisible(False)
|
|
6869
|
+
default_btn.setVisible(True)
|
|
6870
|
+
else:
|
|
6871
|
+
back_btn.setVisible(show_data_folder_page)
|
|
6872
|
+
next_btn.setVisible(False)
|
|
6873
|
+
finish_btn.setVisible(True)
|
|
6874
|
+
default_btn.setVisible(False)
|
|
6875
|
+
|
|
6876
|
+
def on_next():
|
|
6877
|
+
# Save the data folder choice
|
|
6878
|
+
chosen_path = Path(path_edit.text())
|
|
6879
|
+
chosen_path_holder[0] = chosen_path
|
|
6880
|
+
|
|
6881
|
+
# Create the folder and save config
|
|
6882
|
+
chosen_path.mkdir(parents=True, exist_ok=True)
|
|
6883
|
+
save_user_data_path(chosen_path)
|
|
6884
|
+
|
|
6885
|
+
# Update our path if different
|
|
6886
|
+
if chosen_path != self.user_data_path:
|
|
6887
|
+
self.user_data_path = chosen_path
|
|
6888
|
+
self._reinitialize_with_new_data_path()
|
|
6889
|
+
else:
|
|
6890
|
+
if hasattr(self, 'db_manager') and self.db_manager and not self.db_manager.connection:
|
|
6891
|
+
self.db_manager.connect()
|
|
6892
|
+
|
|
6893
|
+
self.log(f"📁 Data folder set to: {chosen_path}")
|
|
6894
|
+
go_to_page(1)
|
|
6895
|
+
|
|
6896
|
+
def on_back():
|
|
6897
|
+
go_to_page(0)
|
|
6898
|
+
|
|
6899
|
+
def on_finish():
|
|
6900
|
+
# Save first_run preference
|
|
6901
|
+
if dont_show_checkbox.isChecked():
|
|
6902
|
+
settings = self.load_general_settings()
|
|
6903
|
+
settings['first_run_completed'] = True
|
|
6904
|
+
self.save_general_settings(settings)
|
|
6905
|
+
self.log("✅ Setup wizard completed (won't show again on startup)")
|
|
6906
|
+
else:
|
|
6907
|
+
self.log("✅ Setup wizard shown (will show again next time)")
|
|
6908
|
+
|
|
6909
|
+
dialog.accept()
|
|
6910
|
+
|
|
6911
|
+
# Navigate to Features tab if checkbox is checked
|
|
6912
|
+
if open_features_checkbox.isChecked():
|
|
6913
|
+
self.main_tabs.setCurrentIndex(4) # Settings tab
|
|
6914
|
+
if hasattr(self, 'settings_tabs'):
|
|
6915
|
+
for i in range(self.settings_tabs.count()):
|
|
6916
|
+
if "Features" in self.settings_tabs.tabText(i):
|
|
6917
|
+
self.settings_tabs.setCurrentIndex(i)
|
|
6918
|
+
break
|
|
6919
|
+
|
|
6920
|
+
back_btn.clicked.connect(on_back)
|
|
6921
|
+
next_btn.clicked.connect(on_next)
|
|
6922
|
+
finish_btn.clicked.connect(on_finish)
|
|
6923
|
+
|
|
6924
|
+
# Start on appropriate page
|
|
6925
|
+
if show_data_folder_page:
|
|
6926
|
+
go_to_page(0)
|
|
6927
|
+
else:
|
|
6928
|
+
# Skip to features page if data folder already configured
|
|
6929
|
+
go_to_page(1)
|
|
6930
|
+
step2_indicator.setText("<span style='color: #888;'>Supervertaler Setup</span>")
|
|
6931
|
+
|
|
6932
|
+
dialog.exec()
|
|
6933
|
+
|
|
6934
|
+
except Exception as e:
|
|
6935
|
+
self.log(f"⚠️ Setup wizard error: {e}")
|
|
6936
|
+
import traceback
|
|
6937
|
+
traceback.print_exc()
|
|
6938
|
+
|
|
6676
6939
|
def _check_for_new_models(self, force: bool = False):
|
|
6677
6940
|
"""
|
|
6678
6941
|
Check for new LLM models from providers
|
|
@@ -7936,6 +8199,11 @@ class SupervertalerQt(QMainWindow):
|
|
|
7936
8199
|
superdocs_action.triggered.connect(lambda: self._open_url("https://supervertaler.gitbook.io/superdocs/"))
|
|
7937
8200
|
help_menu.addAction(superdocs_action)
|
|
7938
8201
|
|
|
8202
|
+
setup_wizard_action = QAction("🚀 Setup Wizard...", self)
|
|
8203
|
+
setup_wizard_action.setToolTip("Run the initial setup wizard (data folder location, features overview)")
|
|
8204
|
+
setup_wizard_action.triggered.connect(lambda: self._show_setup_wizard(is_first_run=False))
|
|
8205
|
+
help_menu.addAction(setup_wizard_action)
|
|
8206
|
+
|
|
7939
8207
|
help_menu.addSeparator()
|
|
7940
8208
|
|
|
7941
8209
|
shortcuts_action = QAction("⌨️ Keyboard Shortcuts", self)
|
|
@@ -22051,20 +22319,24 @@ class SupervertalerQt(QMainWindow):
|
|
|
22051
22319
|
"""
|
|
22052
22320
|
Search termbases using a provided cursor (thread-safe for background threads).
|
|
22053
22321
|
This method allows background workers to query the database without SQLite threading errors.
|
|
22054
|
-
|
|
22322
|
+
|
|
22323
|
+
Implements BIDIRECTIONAL matching: searches both source_term and target_term columns.
|
|
22324
|
+
When a match is found on target_term, source and target are swapped in the result.
|
|
22325
|
+
This matches memoQ/Trados behavior where a NL→EN termbase also works for EN→NL projects.
|
|
22326
|
+
|
|
22055
22327
|
Args:
|
|
22056
22328
|
source_text: The source text to search for
|
|
22057
22329
|
cursor: A database cursor from a thread-local connection
|
|
22058
22330
|
source_lang: Source language code
|
|
22059
22331
|
target_lang: Target language code
|
|
22060
22332
|
project_id: Current project ID (required to filter by activated termbases)
|
|
22061
|
-
|
|
22333
|
+
|
|
22062
22334
|
Returns:
|
|
22063
22335
|
Dictionary of {term: translation} matches
|
|
22064
22336
|
"""
|
|
22065
22337
|
if not source_text or not cursor:
|
|
22066
22338
|
return {}
|
|
22067
|
-
|
|
22339
|
+
|
|
22068
22340
|
try:
|
|
22069
22341
|
# Convert language names to codes (match interactive search logic)
|
|
22070
22342
|
source_lang_code = self._convert_language_to_code(source_lang) if source_lang else None
|
|
@@ -22084,20 +22356,26 @@ class SupervertalerQt(QMainWindow):
|
|
|
22084
22356
|
try:
|
|
22085
22357
|
# JOIN termbases AND termbase_activation to filter by activated termbases
|
|
22086
22358
|
# This matches the logic in database_manager.py search_termbases()
|
|
22359
|
+
# BIDIRECTIONAL: Search both source_term (forward) and target_term (reverse)
|
|
22360
|
+
# Using UNION to combine both directions
|
|
22087
22361
|
query = """
|
|
22088
|
-
SELECT
|
|
22089
|
-
|
|
22090
|
-
|
|
22091
|
-
|
|
22092
|
-
|
|
22093
|
-
|
|
22094
|
-
|
|
22095
|
-
|
|
22096
|
-
|
|
22097
|
-
|
|
22362
|
+
SELECT * FROM (
|
|
22363
|
+
-- Forward match: search source_term
|
|
22364
|
+
SELECT
|
|
22365
|
+
t.id, t.source_term, t.target_term, t.termbase_id, t.priority,
|
|
22366
|
+
t.domain, t.notes, t.project, t.client, t.forbidden,
|
|
22367
|
+
tb.is_project_termbase, tb.name as termbase_name,
|
|
22368
|
+
COALESCE(ta.priority, tb.ranking) as ranking,
|
|
22369
|
+
'source' as match_direction
|
|
22370
|
+
FROM termbase_terms t
|
|
22371
|
+
LEFT JOIN termbases tb ON CAST(t.termbase_id AS INTEGER) = tb.id
|
|
22372
|
+
LEFT JOIN termbase_activation ta ON ta.termbase_id = tb.id AND ta.project_id = ? AND ta.is_active = 1
|
|
22373
|
+
WHERE LOWER(t.source_term) LIKE ?
|
|
22374
|
+
AND (ta.is_active = 1 OR tb.is_project_termbase = 1)
|
|
22098
22375
|
"""
|
|
22099
22376
|
params = [project_id if project_id else 0, f"%{clean_word.lower()}%"]
|
|
22100
22377
|
|
|
22378
|
+
# Language filters for forward query
|
|
22101
22379
|
if source_lang_code:
|
|
22102
22380
|
query += " AND (t.source_lang = ? OR (t.source_lang IS NULL AND tb.source_lang = ?) OR (t.source_lang IS NULL AND tb.source_lang IS NULL))"
|
|
22103
22381
|
params.extend([source_lang_code, source_lang_code])
|
|
@@ -22105,15 +22383,45 @@ class SupervertalerQt(QMainWindow):
|
|
|
22105
22383
|
query += " AND (t.target_lang = ? OR (t.target_lang IS NULL AND tb.target_lang = ?) OR (t.target_lang IS NULL AND tb.target_lang IS NULL))"
|
|
22106
22384
|
params.extend([target_lang_code, target_lang_code])
|
|
22107
22385
|
|
|
22108
|
-
#
|
|
22109
|
-
query += "
|
|
22386
|
+
# Reverse match: search target_term, swap source/target in output
|
|
22387
|
+
query += """
|
|
22388
|
+
UNION ALL
|
|
22389
|
+
-- Reverse match: search target_term, swap columns
|
|
22390
|
+
SELECT
|
|
22391
|
+
t.id, t.target_term as source_term, t.source_term as target_term,
|
|
22392
|
+
t.termbase_id, t.priority,
|
|
22393
|
+
t.domain, t.notes, t.project, t.client, t.forbidden,
|
|
22394
|
+
tb.is_project_termbase, tb.name as termbase_name,
|
|
22395
|
+
COALESCE(ta.priority, tb.ranking) as ranking,
|
|
22396
|
+
'target' as match_direction
|
|
22397
|
+
FROM termbase_terms t
|
|
22398
|
+
LEFT JOIN termbases tb ON CAST(t.termbase_id AS INTEGER) = tb.id
|
|
22399
|
+
LEFT JOIN termbase_activation ta ON ta.termbase_id = tb.id AND ta.project_id = ? AND ta.is_active = 1
|
|
22400
|
+
WHERE LOWER(t.target_term) LIKE ?
|
|
22401
|
+
AND (ta.is_active = 1 OR tb.is_project_termbase = 1)
|
|
22402
|
+
"""
|
|
22403
|
+
params.extend([project_id if project_id else 0, f"%{clean_word.lower()}%"])
|
|
22404
|
+
|
|
22405
|
+
# Language filters for reverse query (swapped)
|
|
22406
|
+
if source_lang_code:
|
|
22407
|
+
# For reverse: source_lang filters target_lang column
|
|
22408
|
+
query += " AND (t.target_lang = ? OR (t.target_lang IS NULL AND tb.target_lang = ?) OR (t.target_lang IS NULL AND tb.target_lang IS NULL))"
|
|
22409
|
+
params.extend([source_lang_code, source_lang_code])
|
|
22410
|
+
if target_lang_code:
|
|
22411
|
+
# For reverse: target_lang filters source_lang column
|
|
22412
|
+
query += " AND (t.source_lang = ? OR (t.source_lang IS NULL AND tb.source_lang = ?) OR (t.source_lang IS NULL AND tb.source_lang IS NULL))"
|
|
22413
|
+
params.extend([target_lang_code, target_lang_code])
|
|
22414
|
+
|
|
22415
|
+
# Close UNION and limit
|
|
22416
|
+
query += ") combined LIMIT 30"
|
|
22110
22417
|
cursor.execute(query, params)
|
|
22111
22418
|
results = cursor.fetchall()
|
|
22112
22419
|
|
|
22113
22420
|
for row in results:
|
|
22114
|
-
# Uniform access
|
|
22421
|
+
# Uniform access (columns are already swapped for reverse matches)
|
|
22115
22422
|
source_term = row[1] if isinstance(row, tuple) else row['source_term']
|
|
22116
22423
|
target_term = row[2] if isinstance(row, tuple) else row['target_term']
|
|
22424
|
+
match_direction = row[13] if isinstance(row, tuple) else row.get('match_direction', 'source')
|
|
22117
22425
|
if not source_term or not target_term:
|
|
22118
22426
|
continue
|
|
22119
22427
|
|
|
@@ -22137,8 +22445,10 @@ class SupervertalerQt(QMainWindow):
|
|
|
22137
22445
|
existing = matches.get(source_term.strip())
|
|
22138
22446
|
# Deduplicate: keep numerically lowest ranking (highest priority)
|
|
22139
22447
|
# For project termbases, ranking is None so they always win
|
|
22448
|
+
# Also prefer 'source' matches over 'target' matches when equal
|
|
22140
22449
|
if existing:
|
|
22141
22450
|
existing_ranking = existing.get('ranking', None)
|
|
22451
|
+
existing_direction = existing.get('match_direction', 'source')
|
|
22142
22452
|
if is_project_tb:
|
|
22143
22453
|
# Project termbase always wins
|
|
22144
22454
|
pass
|
|
@@ -22147,8 +22457,12 @@ class SupervertalerQt(QMainWindow):
|
|
|
22147
22457
|
continue
|
|
22148
22458
|
elif existing_ranking is not None and ranking is not None:
|
|
22149
22459
|
# Both have rankings, keep lower (higher priority)
|
|
22150
|
-
if existing_ranking
|
|
22460
|
+
if existing_ranking < ranking:
|
|
22151
22461
|
continue
|
|
22462
|
+
elif existing_ranking == ranking:
|
|
22463
|
+
# Same ranking: prefer source match over target match
|
|
22464
|
+
if existing_direction == 'source' and match_direction == 'target':
|
|
22465
|
+
continue
|
|
22152
22466
|
|
|
22153
22467
|
matches[source_term.strip()] = {
|
|
22154
22468
|
'translation': target_term.strip(),
|
|
@@ -22163,15 +22477,18 @@ class SupervertalerQt(QMainWindow):
|
|
|
22163
22477
|
'forbidden': forbidden or False,
|
|
22164
22478
|
'is_project_termbase': bool(is_project_tb),
|
|
22165
22479
|
'termbase_name': termbase_name or '',
|
|
22166
|
-
'target_synonyms': [] # Will be populated below
|
|
22480
|
+
'target_synonyms': [], # Will be populated below
|
|
22481
|
+
'match_direction': match_direction # Track if this was a reverse match
|
|
22167
22482
|
}
|
|
22168
|
-
|
|
22483
|
+
|
|
22169
22484
|
# Fetch synonyms for this term
|
|
22485
|
+
# For reverse matches, fetch 'source' synonyms since they become targets
|
|
22170
22486
|
try:
|
|
22487
|
+
synonym_lang = 'source' if match_direction == 'target' else 'target'
|
|
22171
22488
|
cursor.execute("""
|
|
22172
|
-
SELECT synonym_text FROM termbase_synonyms
|
|
22173
|
-
WHERE term_id = ? AND language =
|
|
22174
|
-
""", (term_id,))
|
|
22489
|
+
SELECT synonym_text FROM termbase_synonyms
|
|
22490
|
+
WHERE term_id = ? AND language = ? AND forbidden = 0
|
|
22491
|
+
""", (term_id, synonym_lang))
|
|
22175
22492
|
synonym_rows = cursor.fetchall()
|
|
22176
22493
|
for syn_row in synonym_rows:
|
|
22177
22494
|
synonym = syn_row[0] if isinstance(syn_row, tuple) else syn_row['synonym_text']
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
<link rel="apple-touch-icon" href="apple-touch-icon.png">
|
|
18
18
|
<link rel="manifest" href="site.webmanifest">
|
|
19
19
|
|
|
20
|
-
<link rel="stylesheet" href="styles.css?v=1.9.
|
|
20
|
+
<link rel="stylesheet" href="styles.css?v=1.9.177-beta">
|
|
21
21
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
22
22
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
23
23
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap"
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
class="nav-discussions">💬 Discussions</a></li>
|
|
51
51
|
<li class="nav-action">
|
|
52
52
|
<a href="https://github.com/michaelbeijer/Supervertaler/blob/main/CHANGELOG.md" target="_blank"
|
|
53
|
-
class="nav-version" title="Current version">v1.9.
|
|
53
|
+
class="nav-version" title="Current version">v1.9.177-beta</a>
|
|
54
54
|
</li>
|
|
55
55
|
<li class="nav-action">
|
|
56
56
|
<a href="https://github.com/michaelbeijer/Supervertaler" target="_blank" class="nav-icon-link"
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
Supervertaler
|
|
75
75
|
<span class="gradient-text">The Ultimate Translation Workbench</span>
|
|
76
76
|
</h1>
|
|
77
|
-
<p class="version-badge">v1.9.
|
|
77
|
+
<p class="version-badge">v1.9.177-beta</p>
|
|
78
78
|
<p class="hero-subtitle">
|
|
79
79
|
AI-enhanced translation workbench. Work with ChatGPT, Claude, and Gemini simultaneously.
|
|
80
80
|
Built by translators, for translators and writers.
|
|
@@ -711,7 +711,7 @@
|
|
|
711
711
|
<div style="text-align: center; margin: 40px 0;">
|
|
712
712
|
<div class="download-card featured"
|
|
713
713
|
style="border: 3px solid #6366F1; max-width: 700px; margin: 0 auto;">
|
|
714
|
-
<div class="download-badge" style="background: #6366F1;">v1.9.
|
|
714
|
+
<div class="download-badge" style="background: #6366F1;">v1.9.177-beta</div>
|
|
715
715
|
<h3>🎨 Supervertaler</h3>
|
|
716
716
|
<p class="download-description" style="font-weight: 600; color: #6366F1; margin-bottom: 10px;">
|
|
717
717
|
Modern Professional Interface
|