supervertaler 1.9.164__tar.gz → 1.9.168__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.
Potentially problematic release.
This version of supervertaler might be problematic. Click here for more details.
- {supervertaler-1.9.164 → supervertaler-1.9.168}/CHANGELOG.md +50 -1
- {supervertaler-1.9.164 → supervertaler-1.9.168}/PKG-INFO +14 -11
- {supervertaler-1.9.164 → supervertaler-1.9.168}/README.md +13 -10
- {supervertaler-1.9.164 → supervertaler-1.9.168}/Supervertaler.py +316 -40
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/index.html +3 -3
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/keyboard_shortcuts_widget.py +7 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/tm_metadata_manager.py +41 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/pyproject.toml +1 -1
- {supervertaler-1.9.164 → supervertaler-1.9.168}/supervertaler.egg-info/PKG-INFO +14 -11
- {supervertaler-1.9.164 → supervertaler-1.9.168}/FAQ.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/LICENSE +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/MANIFEST.in +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/assets/ICON_CONVERSION_GUIDE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/assets/MB.ico +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/assets/README.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/assets/generate_icons.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/assets/icon.ico +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/assets/icon_128.png +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/assets/icon_24.png +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/assets/icon_256.png +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/assets/icon_32.png +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/assets/icon_48.png +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/assets/icon_64.png +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/assets/icon_preview.html +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/assets/icon_sv_modern.svg +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/assets/icon_sv_modern_paths.svg +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/assets/icon_sv_simple.svg +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/assets/patent-drawing-1951.jpg +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/assets/supervertaler_icon_colours.png +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/.nojekyll +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/CNAME +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/SIMILAR_APPS.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/apple-touch-icon.png +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/BUGFIX_README.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/CHANGELIST.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/CHANGELOG_Old.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/FAQ.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/INSTALLATION_v1.7.8.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/PROJECT_ORGANIZATION.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/TERMBASE_REFACTORING_SUMMARY.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/USER_GUIDE_v1.7.8.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/VERIFICATION_CHECKLIST.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/BEFORE_AFTER_COMPARISON.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/BUGFIX_SESSION_SUMMARY.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/COLOR_SCHEME_REFERENCE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/COMPACT_LAYOUT_CHANGELOG.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/COMPACT_LAYOUT_DOCUMENTATION_INDEX.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/COMPACT_LAYOUT_IMPLEMENTATION_SUMMARY.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/COMPACT_LAYOUT_UPDATE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/COMPLETE_IMPLEMENTATION_SUMMARY.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/COMPLETE_PROJECT_SUMMARY.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/DATABASE_FINAL_SUMMARY.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/DATABASE_IMPLEMENTATION.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/DATABASE_PRODUCTION_READY.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/DATABASE_QUICK_REFERENCE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/DUAL_VERSION_STRATEGY.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/FINAL_SESSION_SUMMARY.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/FOLDER_STRUCTURE_UPDATE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/GITHUB_PAGES_SETUP.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/IMPLEMENTATION_CHECKLIST.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/IMPLEMENTATION_COMPLETE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/IMPLEMENTATION_COMPLETE_COMPACT_LAYOUT.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/IMPLEMENTATION_READY.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/IMPLEMENTATION_STATUS_PHASE2_READY.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/KEYBOARD_SHORTCUTS_MATCHES.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/LAYOUT_BEFORE_AFTER.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/MASTER_INDEX.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/MATCH_DISPLAY_IMPROVEMENTS.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/MATCH_DISPLAY_LONG_SEGMENTS_UPDATE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/MATCH_DISPLAY_QUICK_REFERENCE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/MATCH_INSERTION_FEATURES.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/MATCH_SHORTCUTS_QUICK_REF.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/MODULAR_ARCHITECTURE_GUIDE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/PHASE2_IMPLEMENTATION_CHECKLIST.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/PHASE2_IMPLEMENTATION_DETAILED_CHECKLIST.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/PHASE2_IMPLEMENTATION_IN_PROGRESS.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/PHASE2_NEXT_STEPS.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/PHASE2_READY_TO_IMPLEMENT.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/PHASE2_START_HERE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/QT_MIGRATION_PLAN.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/QT_SESSION_SUMMARY.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/QUICK_SESSION_SUMMARY.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/RELEASE_Qt_v1.0.0_Phase5.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/RELEASE_v1.9.38.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/RELEASE_v3.7.1.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/RELEASE_v3.7.6.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/RELEASE_v3.7.7.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/RESTRUCTURE_COMPLETE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/SESSION_DOCUMENTATION_INDEX.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/SESSION_IMPLEMENTATION_SUMMARY.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/SESSION_LONG_SEGMENTS_COMPLETE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/SESSION_MATCH_FEATURES_COMPLETE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/SESSION_STATUS.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/SESSION_SUMMARY_Phase5.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/START_HERE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/START_IMPLEMENTATION_HERE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/STYLE_GUIDES_DELIVERABLES.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/STYLE_GUIDES_DOCUMENTATION_INDEX.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/STYLE_GUIDES_FEATURE_SUMMARY.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/STYLE_GUIDES_IMPLEMENTATION.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/STYLE_GUIDES_PROJECT_COMPLETION.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/STYLE_GUIDES_QUICK_REFERENCE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/STYLE_GUIDES_VISUAL_ARCHITECTURE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/TERMBASE_FIXES.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/TERMBASE_IMPLEMENTATION.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/TERMBASE_QUICK_START.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/TMX_CONCORDANCE_STYLE_HIGHLIGHTING.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/TMX_DUAL_HIGHLIGHTING.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/TMX_EDITOR_HIGHLIGHTING_UPDATE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/TMX_EDITOR_IMPLEMENTATION.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/TMX_EDITOR_WORD_HIGHLIGHTING.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/TMX_TABLE_LAYOUT_INTEGRATED_EDIT.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/TMX_TREEVIEW_GRID_RESIZABLE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/TMX_WORD_HIGHLIGHTING_IMPLEMENTATION_COMPLETE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/TMX_WORD_HIGHLIGHTING_SUMMARY.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/TM_MATCH_PANE_CHECKLIST.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/TM_MATCH_PANE_IMPLEMENTATION.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/TM_MATCH_PANE_VISUAL_GUIDE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/VISUAL_COLOR_REFERENCE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/development/VISUAL_IMPLEMENTATION_SUMMARY.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/sessions/COLOR_FIX_EXPLANATION.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/sessions/DATABASE_CONSOLIDATION_REPORT.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/sessions/DUAL_EDITOR_WORKFLOW.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/sessions/DUAL_SELECTION_SYSTEM.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/sessions/IMPROVEMENTS_SUMMARY.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/sessions/ISSUES_FIXES_PROGRESS.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/sessions/MATCH_DISPLAY_COMPACT_FIXES.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/sessions/README_SESSION_TERMBASE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/sessions/SAFE_DELETION_REMINDER.txt +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/sessions/SESSION_SUMMARY.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/sessions/TERMBASE_FIXES_APPLIED.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/sessions/TESTING_CHECKLIST.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/sessions/TMX_EDITOR_ANNOUNCEMENT.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/archive/sessions/TRANSLATION_RESULTS_IMPROVEMENTS.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/assets/Figure1.png +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/assets/patent-drawing-1951.jpg +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/changelog.html +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/dev-notes/QA.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/dev-notes/STYLE_GUIDES_UI_TEMPLATE.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/dev-notes/_Notes_2025-11-21.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/dev-notes/_things_to_remind_AIs_of_when_translating.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/dev-notes/issue_28.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/dev-notes/openai_debug.txt +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/dev-notes/pre-translation-dialog-enhancement.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/emoji_mockup.html +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/favicon.ico +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/guides/AI_PROMPT_ASSISTANT_USER_GUIDE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/guides/ENCODING_REPAIR_TOOL.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/guides/FAQ.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/guides/GLOSSARY_OF_SUPERVERTALER_TERMINOLOGY.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/guides/JSON_EDITORS_AND_HUMAN_READABLE_FORMAT.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/guides/KEYBOARD_SHORTCUTS.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/guides/PDF_RESCUE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/guides/PROMPT_ASSISTANT_USER_GUIDE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/guides/QT_SETTINGS_DIALOG_GUIDE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/guides/TERM_EXTRACTION_GUIDE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/guides/USER_DATA_FOLDER_SETUP.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/idea_beijer.bot_integration_idea/BEIJERBOT_FEATURE_ANALYSIS.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/idea_beijer.bot_integration_idea/CLI_BRIDGE_SPECIFICATION.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/idea_beijer.bot_integration_idea/IMPLEMENTATION_ROADMAP.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/idea_beijer.bot_integration_idea/QUICKMENU_INTEGRATION_PLAN.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/idea_beijer.bot_integration_idea/README.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/idea_tag-cleaner/tag_cleaner.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/idea_use_vscode_as_cat_tool/ai-agent-translation-workflow.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/logo.png +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/screenshots/2025-10-13_00-46-16.jpg +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/screenshots/Superlookup_Web_resources.jpg +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/screenshots/Supervertaler_AI-Assistant.jpg +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/screenshots/Supervertaler_CLASSIC_v2.4.1_(tkinter).jpg +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/screenshots/Supervertaler_Prompt_Manager_2026-01-14.png +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/screenshots/Supervertaler_Qt_LLM_LeaderboardResults_2025-11-12.jpg +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/screenshots/Supervertaler_Qt_LLM_Leaderboard_2025-11-12.jpg +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/screenshots/Supervertaler_Superbrowser.jpg +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/screenshots/Supervertaler_dark_mode_2025-12-16.jpg +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/screenshots/Supervertaler_dark_mode_2025-12-17.jpg +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/screenshots/Supervertaler_grid.jpg +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/screenshots/Supervertaler_tkinter (v3.7.7).jpg +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/screenshots/Supervertaler_v1.9.102_compare_panel_2026-01-14.png +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/screenshots/Supervertaler_v1.9.102_grid_2026-01-14.png +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/screenshots/new/Supervertaler-grid.jpg +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/screenshots/new/Supervertaler_AI-Assistant.jpg +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/screenshots/new/Supervertaler_Prompt-Library.jpg +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/screenshots/new/Supervertaler_Qt_LLM_LeaderboardResults_2025-11-12.jpg +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/screenshots/new/Supervertaler_Qt_LLM_Leaderboard_2025-11-12.jpg +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/screenshots/new/Supervertaler_Superbrowser.jpg +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/screenshots/old/2025-10-13_00-50-24.jpg +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/screenshots/old/Supervertaler_Qt_2025-11-12.jpg +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/script.js +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/site.webmanifest +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/specifications/AI_ASSISTANT_PHASE2_IMPLEMENTATION.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/specifications/AI_PROMPT_ASSISTANT.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/specifications/AI_PROMPT_ASSISTANT_IMPLEMENTATION.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/specifications/EXPORT_MENU_UPDATE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/specifications/IMPLEMENTATION_SUMMARY.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/specifications/QT_PHASE2_COMPLETE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/specifications/QT_PHASE3_COMPLETE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/specifications/SUPERVERTALER_DATA_FORMAT.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/specifications/TASK_TYPE_SYSTEM.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/specifications/TERMINOLOGY_UPDATE_SUMMARY.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/specifications/opus-api-integration.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/styles.css +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/.gitbook/assets/supervertaler-logo.png +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/.gitbook/assets/sv-icon.svg +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/GITBOOK_LANDING_DRAFT.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/README.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/SUMMARY.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/ai-translation/batch-translation.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/ai-translation/ollama.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/ai-translation/overview.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/ai-translation/prompt-library.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/ai-translation/prompts.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/ai-translation/providers.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/ai-translation/single-segment.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/cat-tools/cafetran.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/cat-tools/memoq.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/cat-tools/overview.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/cat-tools/phrase.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/cat-tools/trados.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/editor/editing-confirming.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/editor/filtering.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/editor/find-replace.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/editor/keyboard-shortcuts.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/editor/navigation.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/editor/pagination.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/editor/translation-grid.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/get-started/api-keys.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/get-started/first-project.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/get-started/installation.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/get-started/quick-start.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/glossaries/basics.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/glossaries/creating.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/glossaries/extraction.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/glossaries/highlighting.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/glossaries/importing.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/import-export/bilingual-tables.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/import-export/docx-import.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/import-export/exporting.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/import-export/formats.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/import-export/multi-file.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/import-export/txt-import.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/qa/non-translatables.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/qa/spellcheck.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/qa/tag-validation.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/reference/changelog.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/reference/contributing.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/reference/faq.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/reference/file-formats.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/settings/fonts.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/settings/general.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/settings/shortcuts.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/settings/theme.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/settings/view.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/superlookup/glossary-search.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/superlookup/mt.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/superlookup/overview.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/superlookup/tm-search.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/superlookup/web-resources.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/tools/autofingers.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/tools/image-extractor.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/tools/pdf-rescue.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/tools/tmx-editor.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/tools/voice-commands.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/translation-memory/basics.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/translation-memory/fuzzy-matching.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/translation-memory/importing-tmx.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/translation-memory/managing-tms.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/translation-memory/supermemory.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/troubleshooting/api-issues.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/troubleshooting/common-issues.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/troubleshooting/import-export-errors.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/troubleshooting/linux.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/superdocs/troubleshooting/performance.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/sv-icon.svg +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/technical/AI_ASSISTANT_GUIDE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/technical/AI_ASSISTANT_IMPLEMENTATION.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/technical/AI_ASSISTANT_INTEGRATION.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/technical/AI_ASSISTANT_QUICK_REFERENCE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/technical/DATABASE_LOCATIONS.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/technical/FILTER_HIGHLIGHTING_FIX.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/technical/MODULE_HEADER_PATTERN.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/technical/README.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/technical/SUPERBROWSER_GUIDE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/technical/SUPERVOICE_TROUBLESHOOTING.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/technical/UNIFIED_PROMPT_LIBRARY_GUIDE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/technical/VOICE_DICTATION_GUIDE.md +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/tests/test_encoding_corruption.txt +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/web-app-manifest-192x192.png +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/docs/web-app-manifest-512x512.png +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/__init__.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/ai_actions.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/ai_attachment_manager.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/ai_file_viewer_dialog.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/autofingers_engine.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/cafetran_docx_handler.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/config_manager.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/database_manager.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/database_migrations.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/dejavurtf_handler.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/document_analyzer.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/docx_handler.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/encoding_repair.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/encoding_repair_Qt.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/encoding_repair_ui.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/feature_manager.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/figure_context_manager.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/file_dialog_helper.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/find_replace.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/find_replace_qt.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/glossary_manager.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/image_extractor.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/llm_clients.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/llm_leaderboard.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/llm_superbench_ui.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/local_llm_setup.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/model_update_dialog.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/model_version_checker.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/mqxliff_handler.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/non_translatables_manager.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/pdf_rescue_Qt.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/pdf_rescue_tkinter.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/phrase_docx_handler.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/project_home_panel.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/prompt_assistant.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/prompt_library.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/prompt_library_migration.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/quick_access_sidebar.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/ribbon_widget.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/sdlppx_handler.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/setup_wizard.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/shortcut_manager.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/simple_segmenter.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/spellcheck_manager.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/statuses.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/style_guide_manager.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/superbench_ui.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/superbrowser.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/supercleaner.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/supercleaner_ui.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/superdocs.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/superdocs_viewer_qt.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/superlookup.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/tag_cleaner.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/tag_manager.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/term_extractor.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/termbase_entry_editor.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/termbase_import_export.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/termbase_manager.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/termview_widget.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/theme_manager.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/tm_editor_dialog.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/tm_manager_qt.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/tmx_editor.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/tmx_editor_qt.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/tmx_generator.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/tracked_changes.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/trados_docx_handler.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/translation_memory.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/translation_results_panel.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/translation_services.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/unified_prompt_library.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/unified_prompt_manager_qt.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/voice_commands.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/voice_dictation.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/modules/voice_dictation_lite.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/setup.cfg +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/setup.py +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/supervertaler.egg-info/SOURCES.txt +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/supervertaler.egg-info/dependency_links.txt +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/supervertaler.egg-info/entry_points.txt +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/supervertaler.egg-info/not-zip-safe +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/supervertaler.egg-info/requires.txt +0 -0
- {supervertaler-1.9.164 → supervertaler-1.9.168}/supervertaler.egg-info/top_level.txt +0 -0
|
@@ -2,7 +2,56 @@
|
|
|
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.168 (January 27, 2026)
|
|
6
|
+
|
|
7
|
+
## v1.9.168 - January 27, 2026
|
|
8
|
+
|
|
9
|
+
### ✨ New Features
|
|
10
|
+
|
|
11
|
+
- **Markdown File Import Support**: Added `.md` file support to the text file importer. ([#127](https://github.com/michaelbeijer/Supervertaler/issues/127))
|
|
12
|
+
- **File Menu**: `Import → Text / Markdown File (TXT, MD)...`
|
|
13
|
+
- **File Filter**: Now shows "Text Files (*.txt *.md)", "Markdown (*.md)", "Plain Text (*.txt)"
|
|
14
|
+
- **Smart Dialog**: Detects Markdown files and shows Markdown-specific import instructions
|
|
15
|
+
- **Syntax Highlighting**: Markdown elements are highlighted with distinctive colors:
|
|
16
|
+
- **Headings** (`#`, `##`, etc.): Blue, bold
|
|
17
|
+
- **Bold/Italic markers** (`**`, `*`, `__`, `_`): Violet, bold
|
|
18
|
+
- **Code** (`` ` ``, `` ``` ``): Orange, bold
|
|
19
|
+
- **Links/Images** (`[]()`, `![]()`): Purple
|
|
20
|
+
- **Blockquotes** (`>`): Green, bold
|
|
21
|
+
- **Lists** (`-`, `*`, `+`, `1.`): Orange, bold
|
|
22
|
+
- **Round-trip Safe**: Markdown syntax is preserved as-is for clean export back to `.md`
|
|
23
|
+
- **Use Case**: Translate documentation, README files, AI prompts, and other Markdown content
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## v1.9.167 - January 27, 2026
|
|
28
|
+
|
|
29
|
+
### 🐛 Bug Fixes
|
|
30
|
+
|
|
31
|
+
- **Keyboard Shortcuts Panel Text Vanishing**: Fixed bug where UI text (Action, Shortcut, Status columns) would disappear after changing a shortcut. ([#125](https://github.com/michaelbeijer/Supervertaler/issues/125))
|
|
32
|
+
- **Root Cause**: Qt's sorting feature was interfering with table row modifications during `load_shortcuts()`, causing items to become disassociated from their rows.
|
|
33
|
+
- **Fix**: Disabled sorting during table modifications and re-enabled it after completion.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## v1.9.166 - January 27, 2026
|
|
38
|
+
|
|
39
|
+
### 🐛 Bug Fixes
|
|
40
|
+
|
|
41
|
+
- **CRITICAL: TM Write Checkbox Now Works**: Fixed confirmed translations going to "project" TM instead of user-designated TM. The Write checkbox (not Read) now determines where segments are saved. ([#126](https://github.com/michaelbeijer/Supervertaler/issues/126))
|
|
42
|
+
- **Root Cause**: `save_segment_to_activated_tms()` was using `get_active_tm_ids()` which only returns TMs with the Read checkbox enabled, ignoring the Write setting entirely.
|
|
43
|
+
- **Fix**: Added new `get_writable_tm_ids()` method that checks for TMs with Write enabled (`read_only = 0`), and updated save logic to use it.
|
|
44
|
+
- **Now**: Enabling Write checkbox alone (without Read) will save confirmed segments to that TM.
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## v1.9.165 - January 27, 2026
|
|
49
|
+
|
|
50
|
+
### ✨ New Features
|
|
51
|
+
|
|
52
|
+
- **Settings Panel Font Scaling**: Added UI Font Scale setting (80%-200%) in View Settings for better readability on high-DPI/4K displays. Especially useful for macOS users with Retina displays. Click "Apply" for instant preview or save to persist. ([#128](https://github.com/michaelbeijer/Supervertaler/issues/128))
|
|
53
|
+
|
|
54
|
+
---
|
|
6
55
|
|
|
7
56
|
## v1.9.164 - January 26, 2026
|
|
8
57
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: supervertaler
|
|
3
|
-
Version: 1.9.
|
|
3
|
+
Version: 1.9.168
|
|
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
|
|
@@ -71,7 +71,7 @@ Dynamic: home-page
|
|
|
71
71
|
Dynamic: license-file
|
|
72
72
|
Dynamic: requires-python
|
|
73
73
|
|
|
74
|
-
# 🚀 Supervertaler v1.9.
|
|
74
|
+
# 🚀 Supervertaler v1.9.168
|
|
75
75
|
|
|
76
76
|
[](https://pypi.org/project/Supervertaler/)
|
|
77
77
|
[](https://www.python.org/downloads/)
|
|
@@ -79,18 +79,21 @@ Dynamic: requires-python
|
|
|
79
79
|
|
|
80
80
|
AI-enhanced CAT tool with multi-LLM support (GPT-4, Claude, Gemini, Ollama), innovative Superlookup concordance system offering access to multiple terminology sources (TMs, glossaries, web resources, etc.), and seamless CAT tool integration (memoQ, Trados, CafeTran, Phrase).
|
|
81
81
|
|
|
82
|
-
**Current Version:** v1.9.
|
|
82
|
+
**Current Version:** v1.9.168 (January 27, 2026)
|
|
83
83
|
|
|
84
|
-
### NEW in v1.9.
|
|
84
|
+
### NEW in v1.9.168 - 📝 Markdown File Import with Syntax Highlighting
|
|
85
85
|
|
|
86
|
-
|
|
87
|
-
- **New Setting:** Settings → Experimental Performance → "Disable all caching systems"
|
|
88
|
-
- **What it does:** Bypasses termbase cache, TM/MT cache, and prefetch workers
|
|
89
|
-
- **Why:** Testing showed direct database lookups may be faster than cache overhead for some workflows
|
|
90
|
-
- **Proactive Highlighting:** Glossary terms now highlighted in upcoming segments while you're still editing the current one
|
|
91
|
-
- **Improved TM Matching:** Fixed fuzzy match issues with multi-TM projects
|
|
86
|
+
Import Markdown files (`.md`) with full syntax highlighting! Headings, bold/italic markers, code blocks, links, images, blockquotes, and lists are all highlighted with distinctive colors. ([#127](https://github.com/michaelbeijer/Supervertaler/issues/127))
|
|
92
87
|
|
|
93
|
-
### Previously in v1.9.
|
|
88
|
+
### Previously in v1.9.167 - 🐛 Keyboard Shortcuts Panel Fix
|
|
89
|
+
|
|
90
|
+
Fixed bug where UI text (Action, Shortcut, Status columns) would disappear after changing a shortcut. ([#125](https://github.com/michaelbeijer/Supervertaler/issues/125))
|
|
91
|
+
|
|
92
|
+
### Previously in v1.9.166 - 🐛 TM Write Checkbox Fix
|
|
93
|
+
|
|
94
|
+
Fixed critical bug where confirmed translations went to "project" TM instead of user-designated TM with Write enabled. ([#126](https://github.com/michaelbeijer/Supervertaler/issues/126))
|
|
95
|
+
|
|
96
|
+
### Previously in v1.9.162 - ⚡ Cache Kill Switch & Performance Testing
|
|
94
97
|
|
|
95
98
|
Streamlined the right panel by replacing Compare Panel with Match Panel:
|
|
96
99
|
- **Match Panel** combines Termview + TM Source/Target in one tab
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# 🚀 Supervertaler v1.9.
|
|
1
|
+
# 🚀 Supervertaler v1.9.168
|
|
2
2
|
|
|
3
3
|
[](https://pypi.org/project/Supervertaler/)
|
|
4
4
|
[](https://www.python.org/downloads/)
|
|
@@ -6,18 +6,21 @@
|
|
|
6
6
|
|
|
7
7
|
AI-enhanced CAT tool with multi-LLM support (GPT-4, Claude, Gemini, Ollama), innovative Superlookup concordance system offering access to multiple terminology sources (TMs, glossaries, web resources, etc.), and seamless CAT tool integration (memoQ, Trados, CafeTran, Phrase).
|
|
8
8
|
|
|
9
|
-
**Current Version:** v1.9.
|
|
9
|
+
**Current Version:** v1.9.168 (January 27, 2026)
|
|
10
10
|
|
|
11
|
-
### NEW in v1.9.
|
|
11
|
+
### NEW in v1.9.168 - 📝 Markdown File Import with Syntax Highlighting
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
- **New Setting:** Settings → Experimental Performance → "Disable all caching systems"
|
|
15
|
-
- **What it does:** Bypasses termbase cache, TM/MT cache, and prefetch workers
|
|
16
|
-
- **Why:** Testing showed direct database lookups may be faster than cache overhead for some workflows
|
|
17
|
-
- **Proactive Highlighting:** Glossary terms now highlighted in upcoming segments while you're still editing the current one
|
|
18
|
-
- **Improved TM Matching:** Fixed fuzzy match issues with multi-TM projects
|
|
13
|
+
Import Markdown files (`.md`) with full syntax highlighting! Headings, bold/italic markers, code blocks, links, images, blockquotes, and lists are all highlighted with distinctive colors. ([#127](https://github.com/michaelbeijer/Supervertaler/issues/127))
|
|
19
14
|
|
|
20
|
-
### Previously in v1.9.
|
|
15
|
+
### Previously in v1.9.167 - 🐛 Keyboard Shortcuts Panel Fix
|
|
16
|
+
|
|
17
|
+
Fixed bug where UI text (Action, Shortcut, Status columns) would disappear after changing a shortcut. ([#125](https://github.com/michaelbeijer/Supervertaler/issues/125))
|
|
18
|
+
|
|
19
|
+
### Previously in v1.9.166 - 🐛 TM Write Checkbox Fix
|
|
20
|
+
|
|
21
|
+
Fixed critical bug where confirmed translations went to "project" TM instead of user-designated TM with Write enabled. ([#126](https://github.com/michaelbeijer/Supervertaler/issues/126))
|
|
22
|
+
|
|
23
|
+
### Previously in v1.9.162 - ⚡ Cache Kill Switch & Performance Testing
|
|
21
24
|
|
|
22
25
|
Streamlined the right panel by replacing Compare Panel with Match Panel:
|
|
23
26
|
- **Match Panel** combines Termview + TM Source/Target in one tab
|
|
@@ -34,9 +34,9 @@ License: MIT
|
|
|
34
34
|
"""
|
|
35
35
|
|
|
36
36
|
# Version Information.
|
|
37
|
-
__version__ = "1.9.
|
|
37
|
+
__version__ = "1.9.168"
|
|
38
38
|
__phase__ = "0.9"
|
|
39
|
-
__release_date__ = "2026-01-
|
|
39
|
+
__release_date__ = "2026-01-27"
|
|
40
40
|
__edition__ = "Qt"
|
|
41
41
|
|
|
42
42
|
import sys
|
|
@@ -2286,12 +2286,13 @@ class ReadOnlyGridTextEditor(QTextEdit):
|
|
|
2286
2286
|
|
|
2287
2287
|
|
|
2288
2288
|
class TagHighlighter(QSyntaxHighlighter):
|
|
2289
|
-
"""Syntax highlighter for HTML/XML tags, CAT tool tags, CafeTran pipe symbols, and spell checking in text editors"""
|
|
2289
|
+
"""Syntax highlighter for HTML/XML tags, CAT tool tags, CafeTran pipe symbols, Markdown syntax, and spell checking in text editors"""
|
|
2290
2290
|
|
|
2291
2291
|
# Class-level reference to spellcheck manager (shared across all instances)
|
|
2292
2292
|
_spellcheck_manager = None
|
|
2293
2293
|
_spellcheck_enabled = False
|
|
2294
2294
|
_is_cafetran_project = False # Only highlight pipe symbols for CafeTran projects
|
|
2295
|
+
_is_markdown_project = False # Highlight Markdown syntax for Markdown imports
|
|
2295
2296
|
|
|
2296
2297
|
def __init__(self, document, tag_color='#7f0001', invisible_char_color='#999999', enable_spellcheck=False):
|
|
2297
2298
|
super().__init__(document)
|
|
@@ -2330,6 +2331,36 @@ class TagHighlighter(QSyntaxHighlighter):
|
|
|
2330
2331
|
self.spellcheck_format.setUnderlineColor(QColor('#FF0000'))
|
|
2331
2332
|
self.spellcheck_format.setUnderlineStyle(QTextCharFormat.UnderlineStyle.WaveUnderline)
|
|
2332
2333
|
|
|
2334
|
+
# Markdown syntax formats
|
|
2335
|
+
# Bold/Italic markers: ** __ * _
|
|
2336
|
+
self.md_bold_format = QTextCharFormat()
|
|
2337
|
+
self.md_bold_format.setForeground(QColor('#C71585')) # Medium violet red
|
|
2338
|
+
self.md_bold_format.setFontWeight(700) # Bold to make it stand out
|
|
2339
|
+
|
|
2340
|
+
# Heading markers: # ## ### etc.
|
|
2341
|
+
self.md_heading_format = QTextCharFormat()
|
|
2342
|
+
self.md_heading_format.setForeground(QColor('#0066CC')) # Blue
|
|
2343
|
+
self.md_heading_format.setFontWeight(700)
|
|
2344
|
+
|
|
2345
|
+
# Code markers: ` ```
|
|
2346
|
+
self.md_code_format = QTextCharFormat()
|
|
2347
|
+
self.md_code_format.setForeground(QColor('#D2691E')) # Chocolate/Orange
|
|
2348
|
+
self.md_code_format.setFontWeight(700)
|
|
2349
|
+
|
|
2350
|
+
# Link/Image syntax: []() ![]()
|
|
2351
|
+
self.md_link_format = QTextCharFormat()
|
|
2352
|
+
self.md_link_format.setForeground(QColor('#6A5ACD')) # Slate blue/Purple
|
|
2353
|
+
|
|
2354
|
+
# Blockquote markers: >
|
|
2355
|
+
self.md_quote_format = QTextCharFormat()
|
|
2356
|
+
self.md_quote_format.setForeground(QColor('#228B22')) # Forest green
|
|
2357
|
+
self.md_quote_format.setFontWeight(700)
|
|
2358
|
+
|
|
2359
|
+
# List markers: - * + 1. 2.
|
|
2360
|
+
self.md_list_format = QTextCharFormat()
|
|
2361
|
+
self.md_list_format.setForeground(QColor('#FF6600')) # Orange
|
|
2362
|
+
self.md_list_format.setFontWeight(700)
|
|
2363
|
+
|
|
2333
2364
|
def set_tag_color(self, color: str):
|
|
2334
2365
|
"""Update tag highlight color"""
|
|
2335
2366
|
self.tag_color = color
|
|
@@ -2393,6 +2424,10 @@ class TagHighlighter(QSyntaxHighlighter):
|
|
|
2393
2424
|
if char == '|':
|
|
2394
2425
|
self.setFormat(i, 1, self.pipe_format)
|
|
2395
2426
|
|
|
2427
|
+
# Markdown syntax highlighting - ONLY for Markdown projects
|
|
2428
|
+
if TagHighlighter._is_markdown_project:
|
|
2429
|
+
self._highlight_markdown_syntax(text)
|
|
2430
|
+
|
|
2396
2431
|
# Spell checking - only for target editors when enabled
|
|
2397
2432
|
if self._local_spellcheck_enabled and TagHighlighter._spellcheck_enabled and TagHighlighter._spellcheck_manager:
|
|
2398
2433
|
self._highlight_misspelled_words(text)
|
|
@@ -2455,6 +2490,96 @@ class TagHighlighter(QSyntaxHighlighter):
|
|
|
2455
2490
|
TagHighlighter._spellcheck_manager._crash_detected = True
|
|
2456
2491
|
TagHighlighter._spellcheck_manager.enabled = False
|
|
2457
2492
|
|
|
2493
|
+
def _highlight_markdown_syntax(self, text):
|
|
2494
|
+
"""Highlight Markdown syntax elements to make them visually distinct"""
|
|
2495
|
+
import re
|
|
2496
|
+
|
|
2497
|
+
# 1. Heading markers at start of line: # ## ### #### ##### ######
|
|
2498
|
+
# Only match at start of line (or after only whitespace)
|
|
2499
|
+
heading_pattern = re.compile(r'^(#{1,6})\s', re.MULTILINE)
|
|
2500
|
+
for match in heading_pattern.finditer(text):
|
|
2501
|
+
self.setFormat(match.start(1), len(match.group(1)), self.md_heading_format)
|
|
2502
|
+
|
|
2503
|
+
# 2. Bold markers: **text** or __text__
|
|
2504
|
+
# Highlight just the markers, not the content
|
|
2505
|
+
bold_pattern = re.compile(r'(\*\*|__)(?=\S)(.+?)(?<=\S)\1')
|
|
2506
|
+
for match in bold_pattern.finditer(text):
|
|
2507
|
+
# Opening marker
|
|
2508
|
+
self.setFormat(match.start(), 2, self.md_bold_format)
|
|
2509
|
+
# Closing marker
|
|
2510
|
+
self.setFormat(match.end() - 2, 2, self.md_bold_format)
|
|
2511
|
+
|
|
2512
|
+
# 3. Italic markers: *text* or _text_ (but not ** or __)
|
|
2513
|
+
# Must not be preceded/followed by same character
|
|
2514
|
+
italic_pattern = re.compile(r'(?<!\*)\*(?!\*)(?=\S)(.+?)(?<=\S)\*(?!\*)|(?<!_)_(?!_)(?=\S)(.+?)(?<=\S)_(?!_)')
|
|
2515
|
+
for match in italic_pattern.finditer(text):
|
|
2516
|
+
# Opening marker (1 char)
|
|
2517
|
+
self.setFormat(match.start(), 1, self.md_bold_format)
|
|
2518
|
+
# Closing marker (1 char)
|
|
2519
|
+
self.setFormat(match.end() - 1, 1, self.md_bold_format)
|
|
2520
|
+
|
|
2521
|
+
# 4. Inline code: `code`
|
|
2522
|
+
code_inline_pattern = re.compile(r'(`+)([^`]+)\1')
|
|
2523
|
+
for match in code_inline_pattern.finditer(text):
|
|
2524
|
+
# Highlight entire code span including backticks
|
|
2525
|
+
self.setFormat(match.start(), len(match.group(0)), self.md_code_format)
|
|
2526
|
+
|
|
2527
|
+
# 5. Code fence markers: ``` or ~~~
|
|
2528
|
+
code_fence_pattern = re.compile(r'^(`{3,}|~{3,}).*$', re.MULTILINE)
|
|
2529
|
+
for match in code_fence_pattern.finditer(text):
|
|
2530
|
+
self.setFormat(match.start(), len(match.group(0)), self.md_code_format)
|
|
2531
|
+
|
|
2532
|
+
# 6. Links: [text](url) - highlight brackets and parens, not the text
|
|
2533
|
+
link_pattern = re.compile(r'\[([^\]]+)\]\(([^\)]+)\)')
|
|
2534
|
+
for match in link_pattern.finditer(text):
|
|
2535
|
+
full_start = match.start()
|
|
2536
|
+
text_part = match.group(1)
|
|
2537
|
+
url_part = match.group(2)
|
|
2538
|
+
# [ bracket
|
|
2539
|
+
self.setFormat(full_start, 1, self.md_link_format)
|
|
2540
|
+
# ] bracket
|
|
2541
|
+
self.setFormat(full_start + 1 + len(text_part), 1, self.md_link_format)
|
|
2542
|
+
# ( and url and )
|
|
2543
|
+
url_start = full_start + 1 + len(text_part) + 1
|
|
2544
|
+
self.setFormat(url_start, len(url_part) + 2, self.md_link_format)
|
|
2545
|
+
|
|
2546
|
+
# 7. Images:  - same as links but with !
|
|
2547
|
+
image_pattern = re.compile(r'!\[([^\]]*)\]\(([^\)]+)\)')
|
|
2548
|
+
for match in image_pattern.finditer(text):
|
|
2549
|
+
full_start = match.start()
|
|
2550
|
+
alt_part = match.group(1)
|
|
2551
|
+
url_part = match.group(2)
|
|
2552
|
+
# ! and [
|
|
2553
|
+
self.setFormat(full_start, 2, self.md_link_format)
|
|
2554
|
+
# ]
|
|
2555
|
+
self.setFormat(full_start + 2 + len(alt_part), 1, self.md_link_format)
|
|
2556
|
+
# ( and url and )
|
|
2557
|
+
url_start = full_start + 2 + len(alt_part) + 1
|
|
2558
|
+
self.setFormat(url_start, len(url_part) + 2, self.md_link_format)
|
|
2559
|
+
|
|
2560
|
+
# 8. Blockquote markers: > at start of line
|
|
2561
|
+
quote_pattern = re.compile(r'^(>+)\s?', re.MULTILINE)
|
|
2562
|
+
for match in quote_pattern.finditer(text):
|
|
2563
|
+
self.setFormat(match.start(1), len(match.group(1)), self.md_quote_format)
|
|
2564
|
+
|
|
2565
|
+
# 9. Unordered list markers: - * + at start of line (with space after)
|
|
2566
|
+
ul_pattern = re.compile(r'^(\s*)([-*+])\s', re.MULTILINE)
|
|
2567
|
+
for match in ul_pattern.finditer(text):
|
|
2568
|
+
marker_start = match.start(2)
|
|
2569
|
+
self.setFormat(marker_start, 1, self.md_list_format)
|
|
2570
|
+
|
|
2571
|
+
# 10. Ordered list markers: 1. 2. 3. etc. at start of line
|
|
2572
|
+
ol_pattern = re.compile(r'^(\s*)(\d+\.)\s', re.MULTILINE)
|
|
2573
|
+
for match in ol_pattern.finditer(text):
|
|
2574
|
+
marker_start = match.start(2)
|
|
2575
|
+
marker_len = len(match.group(2))
|
|
2576
|
+
self.setFormat(marker_start, marker_len, self.md_list_format)
|
|
2577
|
+
|
|
2578
|
+
# 11. Horizontal rules: --- or *** or ___ (3+ chars)
|
|
2579
|
+
hr_pattern = re.compile(r'^([-*_]{3,})\s*$', re.MULTILINE)
|
|
2580
|
+
for match in hr_pattern.finditer(text):
|
|
2581
|
+
self.setFormat(match.start(1), len(match.group(1)), self.md_heading_format)
|
|
2582
|
+
|
|
2458
2583
|
|
|
2459
2584
|
class EditableGridTextEditor(QTextEdit):
|
|
2460
2585
|
"""Editable QTextEdit for target cells - allows text selection and editing"""
|
|
@@ -7040,7 +7165,7 @@ class SupervertalerQt(QMainWindow):
|
|
|
7040
7165
|
import_docx_action.setShortcut("Ctrl+O")
|
|
7041
7166
|
import_menu.addAction(import_docx_action)
|
|
7042
7167
|
|
|
7043
|
-
import_txt_action = QAction("
|
|
7168
|
+
import_txt_action = QAction("&Text / Markdown File (TXT, MD)...", self)
|
|
7044
7169
|
import_txt_action.triggered.connect(self.import_simple_txt)
|
|
7045
7170
|
import_menu.addAction(import_txt_action)
|
|
7046
7171
|
|
|
@@ -14858,6 +14983,13 @@ class SupervertalerQt(QMainWindow):
|
|
|
14858
14983
|
|
|
14859
14984
|
layout.addWidget(settings_tabs)
|
|
14860
14985
|
|
|
14986
|
+
# Apply saved UI font scale on startup
|
|
14987
|
+
saved_scale = self._get_settings_ui_font_scale()
|
|
14988
|
+
if saved_scale != 100:
|
|
14989
|
+
# Defer application to ensure widgets are fully created
|
|
14990
|
+
from PyQt6.QtCore import QTimer
|
|
14991
|
+
QTimer.singleShot(100, lambda: self._apply_settings_ui_font_scale(saved_scale))
|
|
14992
|
+
|
|
14861
14993
|
return tab
|
|
14862
14994
|
|
|
14863
14995
|
def _wrap_in_scroll(self, widget):
|
|
@@ -17019,6 +17151,58 @@ class SupervertalerQt(QMainWindow):
|
|
|
17019
17151
|
termview_group.setLayout(termview_layout)
|
|
17020
17152
|
layout.addWidget(termview_group)
|
|
17021
17153
|
|
|
17154
|
+
# ===== UI Font Scale (for Settings panels) =====
|
|
17155
|
+
ui_scale_group = QGroupBox("🖥️ Settings Panel Font Size")
|
|
17156
|
+
ui_scale_layout = QVBoxLayout()
|
|
17157
|
+
|
|
17158
|
+
ui_scale_info = QLabel(
|
|
17159
|
+
"Adjust the font size for all Settings panel text. Useful for high-DPI/4K displays.\n"
|
|
17160
|
+
"Changes apply immediately. Default is 100%."
|
|
17161
|
+
)
|
|
17162
|
+
ui_scale_info.setWordWrap(True)
|
|
17163
|
+
ui_scale_layout.addWidget(ui_scale_info)
|
|
17164
|
+
|
|
17165
|
+
ui_scale_row = QHBoxLayout()
|
|
17166
|
+
ui_scale_row.addWidget(QLabel("UI Font Scale:"))
|
|
17167
|
+
ui_scale_spin = QSpinBox()
|
|
17168
|
+
ui_scale_spin.setMinimum(80)
|
|
17169
|
+
ui_scale_spin.setMaximum(200)
|
|
17170
|
+
ui_scale_spin.setValue(font_settings.get('settings_ui_font_scale', 100))
|
|
17171
|
+
ui_scale_spin.setSuffix("%")
|
|
17172
|
+
ui_scale_spin.setSingleStep(10)
|
|
17173
|
+
ui_scale_spin.setToolTip("Scale Settings panel text (80%-200%)")
|
|
17174
|
+
ui_scale_spin.setMinimumHeight(28)
|
|
17175
|
+
ui_scale_spin.setMinimumWidth(90)
|
|
17176
|
+
ui_scale_spin.setStyleSheet("""
|
|
17177
|
+
QSpinBox {
|
|
17178
|
+
padding-right: 20px;
|
|
17179
|
+
}
|
|
17180
|
+
QSpinBox::up-button {
|
|
17181
|
+
width: 20px;
|
|
17182
|
+
height: 14px;
|
|
17183
|
+
}
|
|
17184
|
+
QSpinBox::down-button {
|
|
17185
|
+
width: 20px;
|
|
17186
|
+
height: 14px;
|
|
17187
|
+
}
|
|
17188
|
+
""")
|
|
17189
|
+
ui_scale_row.addWidget(ui_scale_spin)
|
|
17190
|
+
|
|
17191
|
+
# Apply button for immediate feedback
|
|
17192
|
+
apply_scale_btn = QPushButton("Apply")
|
|
17193
|
+
apply_scale_btn.setToolTip("Apply font scale immediately")
|
|
17194
|
+
apply_scale_btn.clicked.connect(lambda: self._apply_settings_ui_font_scale(ui_scale_spin.value()))
|
|
17195
|
+
ui_scale_row.addWidget(apply_scale_btn)
|
|
17196
|
+
|
|
17197
|
+
ui_scale_row.addStretch()
|
|
17198
|
+
ui_scale_layout.addLayout(ui_scale_row)
|
|
17199
|
+
|
|
17200
|
+
# Store reference for saving
|
|
17201
|
+
self._ui_scale_spin = ui_scale_spin
|
|
17202
|
+
|
|
17203
|
+
ui_scale_group.setLayout(ui_scale_layout)
|
|
17204
|
+
layout.addWidget(ui_scale_group)
|
|
17205
|
+
|
|
17022
17206
|
# Quick Reference section
|
|
17023
17207
|
reference_group = QGroupBox("⌨️ Font Size Quick Reference")
|
|
17024
17208
|
reference_layout = QVBoxLayout()
|
|
@@ -17043,12 +17227,20 @@ class SupervertalerQt(QMainWindow):
|
|
|
17043
17227
|
# Save button
|
|
17044
17228
|
save_btn = QPushButton("💾 Save View Settings")
|
|
17045
17229
|
save_btn.setStyleSheet("font-weight: bold; padding: 8px;")
|
|
17046
|
-
|
|
17047
|
-
|
|
17048
|
-
|
|
17049
|
-
|
|
17050
|
-
|
|
17051
|
-
|
|
17230
|
+
|
|
17231
|
+
def save_view_settings_with_scale():
|
|
17232
|
+
# Save the UI scale setting first
|
|
17233
|
+
if hasattr(self, '_ui_scale_spin'):
|
|
17234
|
+
self._apply_settings_ui_font_scale(self._ui_scale_spin.value())
|
|
17235
|
+
# Then save other view settings
|
|
17236
|
+
self._save_view_settings_from_ui(
|
|
17237
|
+
grid_font_spin, match_font_spin, compare_font_spin, show_tags_check, tag_color_btn,
|
|
17238
|
+
alt_colors_check, even_color_btn, odd_color_btn, invisible_char_color_btn, grid_font_family_combo,
|
|
17239
|
+
termview_font_family_combo, termview_font_spin, termview_bold_check,
|
|
17240
|
+
border_color_btn, border_thickness_spin, badge_text_color_btn, tabs_above_check
|
|
17241
|
+
)
|
|
17242
|
+
|
|
17243
|
+
save_btn.clicked.connect(save_view_settings_with_scale)
|
|
17052
17244
|
layout.addWidget(save_btn)
|
|
17053
17245
|
|
|
17054
17246
|
layout.addStretch()
|
|
@@ -19167,6 +19359,73 @@ class SupervertalerQt(QMainWindow):
|
|
|
19167
19359
|
msg.setStandardButtons(QMessageBox.StandardButton.Ok)
|
|
19168
19360
|
msg.exec()
|
|
19169
19361
|
|
|
19362
|
+
def _apply_settings_ui_font_scale(self, scale_percent: int):
|
|
19363
|
+
"""Apply font scale to all Settings panels for better readability on high-DPI displays"""
|
|
19364
|
+
# Save the setting
|
|
19365
|
+
general_settings = self.load_general_settings()
|
|
19366
|
+
general_settings['settings_ui_font_scale'] = scale_percent
|
|
19367
|
+
self.save_general_settings(general_settings)
|
|
19368
|
+
|
|
19369
|
+
# Calculate base font size (default system font is typically 9-10pt)
|
|
19370
|
+
base_size = 10 # Base font size in points
|
|
19371
|
+
scaled_size = int(base_size * scale_percent / 100)
|
|
19372
|
+
|
|
19373
|
+
# Create stylesheet for Settings panels
|
|
19374
|
+
settings_stylesheet = f"""
|
|
19375
|
+
QGroupBox {{
|
|
19376
|
+
font-size: {scaled_size + 1}pt;
|
|
19377
|
+
font-weight: bold;
|
|
19378
|
+
}}
|
|
19379
|
+
QGroupBox QLabel {{
|
|
19380
|
+
font-size: {scaled_size}pt;
|
|
19381
|
+
}}
|
|
19382
|
+
QGroupBox QCheckBox {{
|
|
19383
|
+
font-size: {scaled_size}pt;
|
|
19384
|
+
}}
|
|
19385
|
+
QGroupBox QRadioButton {{
|
|
19386
|
+
font-size: {scaled_size}pt;
|
|
19387
|
+
}}
|
|
19388
|
+
QGroupBox QComboBox {{
|
|
19389
|
+
font-size: {scaled_size}pt;
|
|
19390
|
+
}}
|
|
19391
|
+
QGroupBox QSpinBox {{
|
|
19392
|
+
font-size: {scaled_size}pt;
|
|
19393
|
+
}}
|
|
19394
|
+
QGroupBox QLineEdit {{
|
|
19395
|
+
font-size: {scaled_size}pt;
|
|
19396
|
+
}}
|
|
19397
|
+
QGroupBox QPushButton {{
|
|
19398
|
+
font-size: {scaled_size}pt;
|
|
19399
|
+
}}
|
|
19400
|
+
QGroupBox QTextEdit {{
|
|
19401
|
+
font-size: {scaled_size}pt;
|
|
19402
|
+
}}
|
|
19403
|
+
QGroupBox QPlainTextEdit {{
|
|
19404
|
+
font-size: {scaled_size}pt;
|
|
19405
|
+
}}
|
|
19406
|
+
"""
|
|
19407
|
+
|
|
19408
|
+
# Apply to settings_tabs if it exists
|
|
19409
|
+
if hasattr(self, 'settings_tabs') and self.settings_tabs is not None:
|
|
19410
|
+
self.settings_tabs.setStyleSheet(
|
|
19411
|
+
"QTabBar::tab { outline: 0; font-size: " + str(scaled_size) + "pt; } "
|
|
19412
|
+
"QTabBar::tab:focus { outline: none; } "
|
|
19413
|
+
"QTabBar::tab:selected { border-bottom: 1px solid #2196F3; background-color: rgba(33, 150, 243, 0.08); }"
|
|
19414
|
+
)
|
|
19415
|
+
|
|
19416
|
+
# Apply to each tab's content
|
|
19417
|
+
for i in range(self.settings_tabs.count()):
|
|
19418
|
+
widget = self.settings_tabs.widget(i)
|
|
19419
|
+
if widget:
|
|
19420
|
+
widget.setStyleSheet(settings_stylesheet)
|
|
19421
|
+
|
|
19422
|
+
self.log(f"✓ Settings UI font scale set to {scale_percent}% (base: {scaled_size}pt)")
|
|
19423
|
+
|
|
19424
|
+
def _get_settings_ui_font_scale(self) -> int:
|
|
19425
|
+
"""Get the current Settings UI font scale percentage"""
|
|
19426
|
+
general_settings = self.load_general_settings()
|
|
19427
|
+
return general_settings.get('settings_ui_font_scale', 100)
|
|
19428
|
+
|
|
19170
19429
|
def create_grid_view_widget(self):
|
|
19171
19430
|
"""Create the Grid View widget (existing grid functionality)"""
|
|
19172
19431
|
widget = QWidget()
|
|
@@ -21933,7 +22192,10 @@ class SupervertalerQt(QMainWindow):
|
|
|
21933
22192
|
|
|
21934
22193
|
def save_segment_to_activated_tms(self, source: str, target: str):
|
|
21935
22194
|
"""
|
|
21936
|
-
Save segment to all
|
|
22195
|
+
Save segment to all writable TMs for current project.
|
|
22196
|
+
|
|
22197
|
+
Note: Uses get_writable_tm_ids() which checks the Write checkbox (read_only=0),
|
|
22198
|
+
NOT get_active_tm_ids() which checks the Read checkbox (is_active=1).
|
|
21937
22199
|
|
|
21938
22200
|
Args:
|
|
21939
22201
|
source: Source text
|
|
@@ -21945,7 +22207,7 @@ class SupervertalerQt(QMainWindow):
|
|
|
21945
22207
|
if not hasattr(self.current_project, 'source_lang') or not hasattr(self.current_project, 'target_lang'):
|
|
21946
22208
|
return
|
|
21947
22209
|
|
|
21948
|
-
# Get
|
|
22210
|
+
# Get WRITABLE TM IDs for this project (Write checkbox enabled)
|
|
21949
22211
|
tm_ids = []
|
|
21950
22212
|
|
|
21951
22213
|
if hasattr(self, 'tm_metadata_mgr') and self.tm_metadata_mgr:
|
|
@@ -21953,7 +22215,8 @@ class SupervertalerQt(QMainWindow):
|
|
|
21953
22215
|
project_id = self.current_project.id if hasattr(self.current_project, 'id') else None
|
|
21954
22216
|
|
|
21955
22217
|
if project_id:
|
|
21956
|
-
|
|
22218
|
+
# Use get_writable_tm_ids() to find TMs with Write enabled
|
|
22219
|
+
tm_ids = self.tm_metadata_mgr.get_writable_tm_ids(project_id)
|
|
21957
22220
|
else:
|
|
21958
22221
|
self.log(f"⚠️ Cannot save to TM: project has no 'id' attribute!")
|
|
21959
22222
|
else:
|
|
@@ -21961,23 +22224,16 @@ class SupervertalerQt(QMainWindow):
|
|
|
21961
22224
|
else:
|
|
21962
22225
|
self.log(f"⚠️ Cannot save to TM: TM metadata manager not available!")
|
|
21963
22226
|
|
|
21964
|
-
# If no TMs
|
|
22227
|
+
# If no TMs have Write enabled, skip saving
|
|
21965
22228
|
if not tm_ids:
|
|
21966
|
-
self.log("⚠️ No TMs
|
|
21967
|
-
self.log(f" - To fix: Go to Resources > Translation Memories > TM List and
|
|
22229
|
+
self.log("⚠️ No TMs with Write enabled - segment not saved to TM.")
|
|
22230
|
+
self.log(f" - To fix: Go to Resources > Translation Memories > TM List and enable the Write checkbox")
|
|
21968
22231
|
return
|
|
21969
22232
|
|
|
21970
|
-
# Save to each
|
|
22233
|
+
# Save to each writable TM
|
|
21971
22234
|
saved_count = 0
|
|
21972
|
-
skipped_readonly = 0
|
|
21973
22235
|
for tm_id in tm_ids:
|
|
21974
22236
|
try:
|
|
21975
|
-
# Check if TM is read-only
|
|
21976
|
-
tm_info = self.tm_metadata_mgr.get_tm_by_tm_id(tm_id)
|
|
21977
|
-
if tm_info and tm_info.get('read_only'):
|
|
21978
|
-
skipped_readonly += 1
|
|
21979
|
-
continue
|
|
21980
|
-
|
|
21981
22237
|
self.db_manager.add_translation_unit(
|
|
21982
22238
|
source=source,
|
|
21983
22239
|
target=target,
|
|
@@ -21991,13 +22247,9 @@ class SupervertalerQt(QMainWindow):
|
|
|
21991
22247
|
|
|
21992
22248
|
if saved_count > 0:
|
|
21993
22249
|
msg = f"💾 Saved segment to {saved_count} TM(s)"
|
|
21994
|
-
if skipped_readonly > 0:
|
|
21995
|
-
msg += f" (skipped {skipped_readonly} read-only)"
|
|
21996
22250
|
self._queue_tm_save_log(msg)
|
|
21997
22251
|
# Invalidate cache so prefetched segments get fresh TM matches
|
|
21998
22252
|
self.invalidate_translation_cache()
|
|
21999
|
-
elif skipped_readonly > 0:
|
|
22000
|
-
self.log(f"ℹ️ Segment not saved - {skipped_readonly} activated TM(s) are read-only")
|
|
22001
22253
|
|
|
22002
22254
|
def invalidate_translation_cache(self, smart_invalidation=True):
|
|
22003
22255
|
"""
|
|
@@ -22811,6 +23063,10 @@ class SupervertalerQt(QMainWindow):
|
|
|
22811
23063
|
segments=segments
|
|
22812
23064
|
)
|
|
22813
23065
|
|
|
23066
|
+
# Reset project-type specific highlighting flags
|
|
23067
|
+
TagHighlighter._is_cafetran_project = False
|
|
23068
|
+
TagHighlighter._is_markdown_project = False
|
|
23069
|
+
|
|
22814
23070
|
# Set as current project and load into grid
|
|
22815
23071
|
self.current_project = project
|
|
22816
23072
|
self.current_document_path = file_path # Store document path
|
|
@@ -22863,18 +23119,19 @@ class SupervertalerQt(QMainWindow):
|
|
|
22863
23119
|
|
|
22864
23120
|
def import_simple_txt(self):
|
|
22865
23121
|
"""
|
|
22866
|
-
Import a simple text file where each line is a source segment.
|
|
23122
|
+
Import a simple text file or Markdown file where each line is a source segment.
|
|
22867
23123
|
|
|
22868
23124
|
This is the simplest possible import format:
|
|
22869
23125
|
- Each line becomes one source segment
|
|
22870
23126
|
- Empty lines are preserved as empty segments (for structure)
|
|
22871
23127
|
- After translation, export produces a matching file with translations
|
|
23128
|
+
- Markdown files are imported as-is (syntax preserved for round-trip)
|
|
22872
23129
|
"""
|
|
22873
23130
|
file_path, _ = QFileDialog.getOpenFileName(
|
|
22874
23131
|
self,
|
|
22875
|
-
"Select
|
|
23132
|
+
"Select Text or Markdown File",
|
|
22876
23133
|
"",
|
|
22877
|
-
"Text Files (*.txt);;All Files (*.*)"
|
|
23134
|
+
"Text Files (*.txt *.md);;Markdown (*.md);;Plain Text (*.txt);;All Files (*.*)"
|
|
22878
23135
|
)
|
|
22879
23136
|
|
|
22880
23137
|
if not file_path:
|
|
@@ -22882,18 +23139,30 @@ class SupervertalerQt(QMainWindow):
|
|
|
22882
23139
|
|
|
22883
23140
|
# Show import options dialog
|
|
22884
23141
|
dialog = QDialog(self)
|
|
22885
|
-
dialog.setWindowTitle("Import
|
|
23142
|
+
dialog.setWindowTitle("Import Text / Markdown File")
|
|
22886
23143
|
dialog.setMinimumWidth(500)
|
|
22887
23144
|
|
|
22888
23145
|
layout = QVBoxLayout(dialog)
|
|
22889
23146
|
|
|
23147
|
+
# Detect if it's a Markdown file
|
|
23148
|
+
is_markdown = file_path.lower().endswith('.md')
|
|
23149
|
+
|
|
22890
23150
|
# Info message
|
|
22891
|
-
|
|
22892
|
-
|
|
22893
|
-
|
|
22894
|
-
|
|
22895
|
-
|
|
22896
|
-
|
|
23151
|
+
if is_markdown:
|
|
23152
|
+
info_label = QLabel(
|
|
23153
|
+
"📝 <b>Markdown File Import</b><br><br>"
|
|
23154
|
+
"Each line in the file will become one source segment.<br>"
|
|
23155
|
+
"Markdown syntax (<b>**bold**</b>, <i>*italic*</i>, # headings, etc.) is preserved.<br>"
|
|
23156
|
+
"After translation, export will produce a matching Markdown file.<br><br>"
|
|
23157
|
+
"<b>Tip:</b> Keep Markdown syntax intact when translating!"
|
|
23158
|
+
)
|
|
23159
|
+
else:
|
|
23160
|
+
info_label = QLabel(
|
|
23161
|
+
"📄 <b>Simple Text File Import</b><br><br>"
|
|
23162
|
+
"Each line in the file will become one source segment.<br>"
|
|
23163
|
+
"After translation, you can export a matching file with translations.<br><br>"
|
|
23164
|
+
"Empty lines are preserved to maintain document structure."
|
|
23165
|
+
)
|
|
22897
23166
|
info_label.setWordWrap(True)
|
|
22898
23167
|
info_label.setTextFormat(Qt.TextFormat.RichText)
|
|
22899
23168
|
layout.addWidget(info_label)
|
|
@@ -23019,7 +23288,7 @@ class SupervertalerQt(QMainWindow):
|
|
|
23019
23288
|
|
|
23020
23289
|
# Create new project
|
|
23021
23290
|
project = Project(
|
|
23022
|
-
name=f"TXT Import - {os.path.basename(file_path)}",
|
|
23291
|
+
name=f"{'MD' if is_markdown else 'TXT'} Import - {os.path.basename(file_path)}",
|
|
23023
23292
|
source_lang=source_lang,
|
|
23024
23293
|
target_lang=target_lang,
|
|
23025
23294
|
segments=segments
|
|
@@ -23028,6 +23297,10 @@ class SupervertalerQt(QMainWindow):
|
|
|
23028
23297
|
# Store original file path for export
|
|
23029
23298
|
project.original_txt_path = file_path
|
|
23030
23299
|
|
|
23300
|
+
# Reset project-type specific highlighting flags
|
|
23301
|
+
TagHighlighter._is_cafetran_project = False
|
|
23302
|
+
TagHighlighter._is_markdown_project = is_markdown
|
|
23303
|
+
|
|
23031
23304
|
# Set as current project and load into grid
|
|
23032
23305
|
self.current_project = project
|
|
23033
23306
|
self.current_document_path = file_path
|
|
@@ -23041,7 +23314,10 @@ class SupervertalerQt(QMainWindow):
|
|
|
23041
23314
|
|
|
23042
23315
|
# Update status
|
|
23043
23316
|
empty_count = sum(1 for seg in segments if not seg.source.strip())
|
|
23044
|
-
|
|
23317
|
+
file_type = "Markdown file" if is_markdown else "text file"
|
|
23318
|
+
self.log(f"✓ Loaded {len(segments)} lines from {file_type}")
|
|
23319
|
+
if is_markdown:
|
|
23320
|
+
self.log(f" 📝 Markdown syntax highlighting enabled")
|
|
23045
23321
|
if empty_count > 0:
|
|
23046
23322
|
self.log(f" ({empty_count} empty lines preserved for structure)")
|
|
23047
23323
|
self.log(f"📍 Project language pair: {source_lang.upper()} → {target_lang.upper()}")
|