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.
Files changed (372) hide show
  1. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/CHANGELOG.md +24 -2
  2. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/PKG-INFO +1 -1
  3. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/Supervertaler.py +347 -30
  4. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/index.html +4 -4
  5. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/database_manager.py +169 -64
  6. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/pyproject.toml +1 -1
  7. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/supervertaler.egg-info/PKG-INFO +1 -1
  8. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/FAQ.md +0 -0
  9. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/LICENSE +0 -0
  10. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/MANIFEST.in +0 -0
  11. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/README.md +0 -0
  12. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/ICON_CONVERSION_GUIDE.md +0 -0
  13. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/MB.ico +0 -0
  14. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/README.md +0 -0
  15. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/generate_icons.py +0 -0
  16. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/icon.ico +0 -0
  17. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/icon_128.png +0 -0
  18. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/icon_24.png +0 -0
  19. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/icon_256.png +0 -0
  20. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/icon_32.png +0 -0
  21. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/icon_48.png +0 -0
  22. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/icon_64.png +0 -0
  23. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/icon_preview.html +0 -0
  24. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/icon_sv_modern.svg +0 -0
  25. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/icon_sv_modern_paths.svg +0 -0
  26. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/icon_sv_simple.svg +0 -0
  27. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/patent-drawing-1951.jpg +0 -0
  28. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/assets/supervertaler_icon_colours.png +0 -0
  29. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/.nojekyll +0 -0
  30. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/CNAME +0 -0
  31. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/SIMILAR_APPS.md +0 -0
  32. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/apple-touch-icon.png +0 -0
  33. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/BUGFIX_README.md +0 -0
  34. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/CHANGELIST.md +0 -0
  35. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/CHANGELOG_Old.md +0 -0
  36. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/FAQ.md +0 -0
  37. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/INSTALLATION_v1.7.8.md +0 -0
  38. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/PROJECT_ORGANIZATION.md +0 -0
  39. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/TERMBASE_REFACTORING_SUMMARY.md +0 -0
  40. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/USER_GUIDE_v1.7.8.md +0 -0
  41. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/VERIFICATION_CHECKLIST.md +0 -0
  42. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/BEFORE_AFTER_COMPARISON.md +0 -0
  43. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/BUGFIX_SESSION_SUMMARY.md +0 -0
  44. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/COLOR_SCHEME_REFERENCE.md +0 -0
  45. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/COMPACT_LAYOUT_CHANGELOG.md +0 -0
  46. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/COMPACT_LAYOUT_DOCUMENTATION_INDEX.md +0 -0
  47. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/COMPACT_LAYOUT_IMPLEMENTATION_SUMMARY.md +0 -0
  48. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/COMPACT_LAYOUT_UPDATE.md +0 -0
  49. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/COMPLETE_IMPLEMENTATION_SUMMARY.md +0 -0
  50. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/COMPLETE_PROJECT_SUMMARY.md +0 -0
  51. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/DATABASE_FINAL_SUMMARY.md +0 -0
  52. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/DATABASE_IMPLEMENTATION.md +0 -0
  53. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/DATABASE_PRODUCTION_READY.md +0 -0
  54. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/DATABASE_QUICK_REFERENCE.md +0 -0
  55. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/DUAL_VERSION_STRATEGY.md +0 -0
  56. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/FINAL_SESSION_SUMMARY.md +0 -0
  57. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/FOLDER_STRUCTURE_UPDATE.md +0 -0
  58. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/GITHUB_PAGES_SETUP.md +0 -0
  59. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/IMPLEMENTATION_CHECKLIST.md +0 -0
  60. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/IMPLEMENTATION_COMPLETE.md +0 -0
  61. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/IMPLEMENTATION_COMPLETE_COMPACT_LAYOUT.md +0 -0
  62. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/IMPLEMENTATION_READY.md +0 -0
  63. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/IMPLEMENTATION_STATUS_PHASE2_READY.md +0 -0
  64. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/KEYBOARD_SHORTCUTS_MATCHES.md +0 -0
  65. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/LAYOUT_BEFORE_AFTER.md +0 -0
  66. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/MASTER_INDEX.md +0 -0
  67. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/MATCH_DISPLAY_IMPROVEMENTS.md +0 -0
  68. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/MATCH_DISPLAY_LONG_SEGMENTS_UPDATE.md +0 -0
  69. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/MATCH_DISPLAY_QUICK_REFERENCE.md +0 -0
  70. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/MATCH_INSERTION_FEATURES.md +0 -0
  71. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/MATCH_SHORTCUTS_QUICK_REF.md +0 -0
  72. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/MODULAR_ARCHITECTURE_GUIDE.md +0 -0
  73. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/PHASE2_IMPLEMENTATION_CHECKLIST.md +0 -0
  74. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/PHASE2_IMPLEMENTATION_DETAILED_CHECKLIST.md +0 -0
  75. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/PHASE2_IMPLEMENTATION_IN_PROGRESS.md +0 -0
  76. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/PHASE2_NEXT_STEPS.md +0 -0
  77. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/PHASE2_READY_TO_IMPLEMENT.md +0 -0
  78. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/PHASE2_START_HERE.md +0 -0
  79. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/QT_MIGRATION_PLAN.md +0 -0
  80. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/QT_SESSION_SUMMARY.md +0 -0
  81. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/QUICK_SESSION_SUMMARY.md +0 -0
  82. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/RELEASE_Qt_v1.0.0_Phase5.md +0 -0
  83. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/RELEASE_v1.9.38.md +0 -0
  84. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/RELEASE_v3.7.1.md +0 -0
  85. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/RELEASE_v3.7.6.md +0 -0
  86. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/RELEASE_v3.7.7.md +0 -0
  87. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/RESTRUCTURE_COMPLETE.md +0 -0
  88. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/SESSION_DOCUMENTATION_INDEX.md +0 -0
  89. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/SESSION_IMPLEMENTATION_SUMMARY.md +0 -0
  90. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/SESSION_LONG_SEGMENTS_COMPLETE.md +0 -0
  91. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/SESSION_MATCH_FEATURES_COMPLETE.md +0 -0
  92. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/SESSION_STATUS.md +0 -0
  93. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/SESSION_SUMMARY_Phase5.md +0 -0
  94. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/START_HERE.md +0 -0
  95. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/START_IMPLEMENTATION_HERE.md +0 -0
  96. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/STYLE_GUIDES_DELIVERABLES.md +0 -0
  97. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/STYLE_GUIDES_DOCUMENTATION_INDEX.md +0 -0
  98. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/STYLE_GUIDES_FEATURE_SUMMARY.md +0 -0
  99. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/STYLE_GUIDES_IMPLEMENTATION.md +0 -0
  100. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/STYLE_GUIDES_PROJECT_COMPLETION.md +0 -0
  101. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/STYLE_GUIDES_QUICK_REFERENCE.md +0 -0
  102. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/STYLE_GUIDES_VISUAL_ARCHITECTURE.md +0 -0
  103. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TERMBASE_FIXES.md +0 -0
  104. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TERMBASE_IMPLEMENTATION.md +0 -0
  105. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TERMBASE_QUICK_START.md +0 -0
  106. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TMX_CONCORDANCE_STYLE_HIGHLIGHTING.md +0 -0
  107. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TMX_DUAL_HIGHLIGHTING.md +0 -0
  108. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TMX_EDITOR_HIGHLIGHTING_UPDATE.md +0 -0
  109. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TMX_EDITOR_IMPLEMENTATION.md +0 -0
  110. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TMX_EDITOR_WORD_HIGHLIGHTING.md +0 -0
  111. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TMX_TABLE_LAYOUT_INTEGRATED_EDIT.md +0 -0
  112. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TMX_TREEVIEW_GRID_RESIZABLE.md +0 -0
  113. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TMX_WORD_HIGHLIGHTING_IMPLEMENTATION_COMPLETE.md +0 -0
  114. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TMX_WORD_HIGHLIGHTING_SUMMARY.md +0 -0
  115. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TM_MATCH_PANE_CHECKLIST.md +0 -0
  116. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TM_MATCH_PANE_IMPLEMENTATION.md +0 -0
  117. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/TM_MATCH_PANE_VISUAL_GUIDE.md +0 -0
  118. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/VISUAL_COLOR_REFERENCE.md +0 -0
  119. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/development/VISUAL_IMPLEMENTATION_SUMMARY.md +0 -0
  120. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/sessions/COLOR_FIX_EXPLANATION.md +0 -0
  121. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/sessions/DATABASE_CONSOLIDATION_REPORT.md +0 -0
  122. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/sessions/DUAL_EDITOR_WORKFLOW.md +0 -0
  123. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/sessions/DUAL_SELECTION_SYSTEM.md +0 -0
  124. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/sessions/IMPROVEMENTS_SUMMARY.md +0 -0
  125. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/sessions/ISSUES_FIXES_PROGRESS.md +0 -0
  126. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/sessions/MATCH_DISPLAY_COMPACT_FIXES.md +0 -0
  127. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/sessions/README_SESSION_TERMBASE.md +0 -0
  128. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/sessions/SAFE_DELETION_REMINDER.txt +0 -0
  129. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/sessions/SESSION_SUMMARY.md +0 -0
  130. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/sessions/TERMBASE_FIXES_APPLIED.md +0 -0
  131. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/sessions/TESTING_CHECKLIST.md +0 -0
  132. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/sessions/TMX_EDITOR_ANNOUNCEMENT.md +0 -0
  133. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/archive/sessions/TRANSLATION_RESULTS_IMPROVEMENTS.md +0 -0
  134. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/assets/Figure1.png +0 -0
  135. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/assets/patent-drawing-1951.jpg +0 -0
  136. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/changelog.html +0 -0
  137. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/dev-notes/QA.md +0 -0
  138. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/dev-notes/STYLE_GUIDES_UI_TEMPLATE.py +0 -0
  139. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/dev-notes/_Notes_2025-11-21.md +0 -0
  140. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/dev-notes/_things_to_remind_AIs_of_when_translating.md +0 -0
  141. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/dev-notes/issue_28.md +0 -0
  142. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/dev-notes/openai_debug.txt +0 -0
  143. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/dev-notes/pre-translation-dialog-enhancement.md +0 -0
  144. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/emoji_mockup.html +0 -0
  145. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/favicon.ico +0 -0
  146. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/guides/AI_PROMPT_ASSISTANT_USER_GUIDE.md +0 -0
  147. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/guides/ENCODING_REPAIR_TOOL.md +0 -0
  148. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/guides/FAQ.md +0 -0
  149. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/guides/GLOSSARY_OF_SUPERVERTALER_TERMINOLOGY.md +0 -0
  150. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/guides/JSON_EDITORS_AND_HUMAN_READABLE_FORMAT.md +0 -0
  151. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/guides/KEYBOARD_SHORTCUTS.md +0 -0
  152. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/guides/PDF_RESCUE.md +0 -0
  153. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/guides/PROMPT_ASSISTANT_USER_GUIDE.md +0 -0
  154. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/guides/QT_SETTINGS_DIALOG_GUIDE.md +0 -0
  155. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/guides/TERM_EXTRACTION_GUIDE.md +0 -0
  156. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/guides/USER_DATA_FOLDER_SETUP.md +0 -0
  157. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/idea_beijer.bot_integration_idea/BEIJERBOT_FEATURE_ANALYSIS.md +0 -0
  158. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/idea_beijer.bot_integration_idea/CLI_BRIDGE_SPECIFICATION.md +0 -0
  159. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/idea_beijer.bot_integration_idea/IMPLEMENTATION_ROADMAP.md +0 -0
  160. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/idea_beijer.bot_integration_idea/QUICKMENU_INTEGRATION_PLAN.md +0 -0
  161. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/idea_beijer.bot_integration_idea/README.md +0 -0
  162. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/idea_tag-cleaner/tag_cleaner.md +0 -0
  163. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/idea_use_vscode_as_cat_tool/ai-agent-translation-workflow.md +0 -0
  164. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/logo.png +0 -0
  165. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/2025-10-13_00-46-16.jpg +0 -0
  166. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/Superlookup_Web_resources.jpg +0 -0
  167. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/Supervertaler_AI-Assistant.jpg +0 -0
  168. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/Supervertaler_CLASSIC_v2.4.1_(tkinter).jpg +0 -0
  169. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/Supervertaler_Prompt_Manager_2026-01-14.png +0 -0
  170. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/Supervertaler_Qt_LLM_LeaderboardResults_2025-11-12.jpg +0 -0
  171. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/Supervertaler_Qt_LLM_Leaderboard_2025-11-12.jpg +0 -0
  172. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/Supervertaler_Superbrowser.jpg +0 -0
  173. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/Supervertaler_dark_mode_2025-12-16.jpg +0 -0
  174. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/Supervertaler_dark_mode_2025-12-17.jpg +0 -0
  175. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/Supervertaler_grid.jpg +0 -0
  176. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/Supervertaler_tkinter (v3.7.7).jpg +0 -0
  177. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/Supervertaler_v1.9.102_compare_panel_2026-01-14.png +0 -0
  178. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/Supervertaler_v1.9.102_grid_2026-01-14.png +0 -0
  179. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/new/Supervertaler-grid.jpg +0 -0
  180. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/new/Supervertaler_AI-Assistant.jpg +0 -0
  181. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/new/Supervertaler_Prompt-Library.jpg +0 -0
  182. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/new/Supervertaler_Qt_LLM_LeaderboardResults_2025-11-12.jpg +0 -0
  183. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/new/Supervertaler_Qt_LLM_Leaderboard_2025-11-12.jpg +0 -0
  184. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/new/Supervertaler_Superbrowser.jpg +0 -0
  185. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/old/2025-10-13_00-50-24.jpg +0 -0
  186. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/screenshots/old/Supervertaler_Qt_2025-11-12.jpg +0 -0
  187. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/script.js +0 -0
  188. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/site.webmanifest +0 -0
  189. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/specifications/AI_ASSISTANT_PHASE2_IMPLEMENTATION.md +0 -0
  190. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/specifications/AI_PROMPT_ASSISTANT.md +0 -0
  191. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/specifications/AI_PROMPT_ASSISTANT_IMPLEMENTATION.md +0 -0
  192. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/specifications/EXPORT_MENU_UPDATE.md +0 -0
  193. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/specifications/IMPLEMENTATION_SUMMARY.md +0 -0
  194. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/specifications/QT_PHASE2_COMPLETE.md +0 -0
  195. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/specifications/QT_PHASE3_COMPLETE.md +0 -0
  196. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/specifications/SUPERVERTALER_DATA_FORMAT.md +0 -0
  197. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/specifications/TASK_TYPE_SYSTEM.md +0 -0
  198. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/specifications/TERMINOLOGY_UPDATE_SUMMARY.md +0 -0
  199. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/specifications/opus-api-integration.md +0 -0
  200. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/styles.css +0 -0
  201. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/.gitbook/assets/supervertaler-logo.png +0 -0
  202. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/.gitbook/assets/sv-icon.svg +0 -0
  203. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/GITBOOK_LANDING_DRAFT.md +0 -0
  204. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/README.md +0 -0
  205. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/SUMMARY.md +0 -0
  206. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/ai-translation/batch-translation.md +0 -0
  207. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/ai-translation/ollama.md +0 -0
  208. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/ai-translation/overview.md +0 -0
  209. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/ai-translation/prompt-library.md +0 -0
  210. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/ai-translation/prompts.md +0 -0
  211. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/ai-translation/providers.md +0 -0
  212. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/ai-translation/single-segment.md +0 -0
  213. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/cat-tools/cafetran.md +0 -0
  214. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/cat-tools/memoq.md +0 -0
  215. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/cat-tools/overview.md +0 -0
  216. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/cat-tools/phrase.md +0 -0
  217. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/cat-tools/trados.md +0 -0
  218. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/editor/editing-confirming.md +0 -0
  219. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/editor/filtering.md +0 -0
  220. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/editor/find-replace.md +0 -0
  221. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/editor/keyboard-shortcuts.md +0 -0
  222. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/editor/navigation.md +0 -0
  223. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/editor/pagination.md +0 -0
  224. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/editor/translation-grid.md +0 -0
  225. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/get-started/api-keys.md +0 -0
  226. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/get-started/first-project.md +0 -0
  227. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/get-started/installation.md +0 -0
  228. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/get-started/quick-start.md +0 -0
  229. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/glossaries/basics.md +0 -0
  230. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/glossaries/creating.md +0 -0
  231. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/glossaries/extraction.md +0 -0
  232. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/glossaries/highlighting.md +0 -0
  233. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/glossaries/importing.md +0 -0
  234. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/import-export/bilingual-tables.md +0 -0
  235. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/import-export/docx-import.md +0 -0
  236. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/import-export/exporting.md +0 -0
  237. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/import-export/formats.md +0 -0
  238. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/import-export/multi-file.md +0 -0
  239. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/import-export/txt-import.md +0 -0
  240. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/qa/non-translatables.md +0 -0
  241. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/qa/spellcheck.md +0 -0
  242. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/qa/tag-validation.md +0 -0
  243. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/reference/changelog.md +0 -0
  244. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/reference/contributing.md +0 -0
  245. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/reference/faq.md +0 -0
  246. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/reference/file-formats.md +0 -0
  247. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/settings/fonts.md +0 -0
  248. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/settings/general.md +0 -0
  249. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/settings/shortcuts.md +0 -0
  250. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/settings/theme.md +0 -0
  251. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/settings/view.md +0 -0
  252. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/superlookup/glossary-search.md +0 -0
  253. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/superlookup/mt.md +0 -0
  254. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/superlookup/overview.md +0 -0
  255. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/superlookup/tm-search.md +0 -0
  256. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/superlookup/web-resources.md +0 -0
  257. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/tools/autofingers.md +0 -0
  258. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/tools/image-extractor.md +0 -0
  259. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/tools/pdf-rescue.md +0 -0
  260. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/tools/tmx-editor.md +0 -0
  261. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/tools/voice-commands.md +0 -0
  262. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/translation-memory/basics.md +0 -0
  263. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/translation-memory/fuzzy-matching.md +0 -0
  264. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/translation-memory/importing-tmx.md +0 -0
  265. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/translation-memory/managing-tms.md +0 -0
  266. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/translation-memory/supermemory.md +0 -0
  267. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/troubleshooting/api-issues.md +0 -0
  268. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/troubleshooting/common-issues.md +0 -0
  269. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/troubleshooting/import-export-errors.md +0 -0
  270. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/troubleshooting/linux.md +0 -0
  271. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/superdocs/troubleshooting/performance.md +0 -0
  272. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/sv-icon.svg +0 -0
  273. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/technical/AI_ASSISTANT_GUIDE.md +0 -0
  274. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/technical/AI_ASSISTANT_IMPLEMENTATION.md +0 -0
  275. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/technical/AI_ASSISTANT_INTEGRATION.md +0 -0
  276. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/technical/AI_ASSISTANT_QUICK_REFERENCE.md +0 -0
  277. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/technical/DATABASE_LOCATIONS.md +0 -0
  278. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/technical/FILTER_HIGHLIGHTING_FIX.md +0 -0
  279. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/technical/MODULE_HEADER_PATTERN.md +0 -0
  280. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/technical/README.md +0 -0
  281. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/technical/SUPERBROWSER_GUIDE.md +0 -0
  282. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/technical/SUPERVOICE_TROUBLESHOOTING.md +0 -0
  283. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/technical/UNIFIED_PROMPT_LIBRARY_GUIDE.md +0 -0
  284. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/technical/VOICE_DICTATION_GUIDE.md +0 -0
  285. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/tests/test_encoding_corruption.txt +0 -0
  286. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/web-app-manifest-192x192.png +0 -0
  287. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/docs/web-app-manifest-512x512.png +0 -0
  288. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/__init__.py +0 -0
  289. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/ai_actions.py +0 -0
  290. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/ai_attachment_manager.py +0 -0
  291. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/ai_file_viewer_dialog.py +0 -0
  292. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/autofingers_engine.py +0 -0
  293. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/cafetran_docx_handler.py +0 -0
  294. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/config_manager.py +0 -0
  295. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/database_migrations.py +0 -0
  296. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/dejavurtf_handler.py +0 -0
  297. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/document_analyzer.py +0 -0
  298. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/docx_handler.py +0 -0
  299. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/encoding_repair.py +0 -0
  300. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/encoding_repair_Qt.py +0 -0
  301. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/encoding_repair_ui.py +0 -0
  302. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/feature_manager.py +0 -0
  303. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/figure_context_manager.py +0 -0
  304. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/file_dialog_helper.py +0 -0
  305. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/find_replace.py +0 -0
  306. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/find_replace_qt.py +0 -0
  307. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/glossary_manager.py +0 -0
  308. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/image_extractor.py +0 -0
  309. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/keyboard_shortcuts_widget.py +0 -0
  310. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/llm_clients.py +0 -0
  311. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/llm_leaderboard.py +0 -0
  312. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/llm_superbench_ui.py +0 -0
  313. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/local_llm_setup.py +0 -0
  314. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/model_update_dialog.py +0 -0
  315. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/model_version_checker.py +0 -0
  316. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/mqxliff_handler.py +0 -0
  317. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/non_translatables_manager.py +0 -0
  318. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/pdf_rescue_Qt.py +0 -0
  319. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/pdf_rescue_tkinter.py +0 -0
  320. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/phrase_docx_handler.py +0 -0
  321. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/project_home_panel.py +0 -0
  322. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/prompt_assistant.py +0 -0
  323. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/prompt_library.py +0 -0
  324. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/prompt_library_migration.py +0 -0
  325. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/quick_access_sidebar.py +0 -0
  326. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/ribbon_widget.py +0 -0
  327. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/sdlppx_handler.py +0 -0
  328. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/setup_wizard.py +0 -0
  329. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/shortcut_manager.py +0 -0
  330. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/simple_segmenter.py +0 -0
  331. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/spellcheck_manager.py +0 -0
  332. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/statuses.py +0 -0
  333. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/style_guide_manager.py +0 -0
  334. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/superbench_ui.py +0 -0
  335. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/superbrowser.py +0 -0
  336. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/supercleaner.py +0 -0
  337. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/supercleaner_ui.py +0 -0
  338. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/superdocs.py +0 -0
  339. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/superdocs_viewer_qt.py +0 -0
  340. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/superlookup.py +0 -0
  341. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/tag_cleaner.py +0 -0
  342. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/tag_manager.py +0 -0
  343. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/term_extractor.py +0 -0
  344. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/termbase_entry_editor.py +0 -0
  345. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/termbase_import_export.py +0 -0
  346. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/termbase_manager.py +0 -0
  347. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/termview_widget.py +0 -0
  348. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/theme_manager.py +0 -0
  349. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/tm_editor_dialog.py +0 -0
  350. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/tm_manager_qt.py +0 -0
  351. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/tm_metadata_manager.py +0 -0
  352. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/tmx_editor.py +0 -0
  353. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/tmx_editor_qt.py +0 -0
  354. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/tmx_generator.py +0 -0
  355. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/tracked_changes.py +0 -0
  356. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/trados_docx_handler.py +0 -0
  357. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/translation_memory.py +0 -0
  358. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/translation_results_panel.py +0 -0
  359. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/translation_services.py +0 -0
  360. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/unified_prompt_library.py +0 -0
  361. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/unified_prompt_manager_qt.py +0 -0
  362. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/voice_commands.py +0 -0
  363. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/voice_dictation.py +0 -0
  364. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/modules/voice_dictation_lite.py +0 -0
  365. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/setup.cfg +0 -0
  366. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/setup.py +0 -0
  367. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/supervertaler.egg-info/SOURCES.txt +0 -0
  368. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/supervertaler.egg-info/dependency_links.txt +0 -0
  369. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/supervertaler.egg-info/entry_points.txt +0 -0
  370. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/supervertaler.egg-info/not-zip-safe +0 -0
  371. {supervertaler-1.9.175 → supervertaler-1.9.177b0}/supervertaler.egg-info/requires.txt +0 -0
  372. {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.175 (January 28, 2026)
5
+ **Current Version:** v1.9.177-beta (January 28, 2026)
6
6
 
7
7
 
8
8
 
9
- ## v1.9.175 - January 28, 2026
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.175
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.175"
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 data location dialog, then Features tab
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._show_data_location_dialog)
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
- t.id, t.source_term, t.target_term, t.termbase_id, t.priority,
22090
- t.domain, t.notes, t.project, t.client, t.forbidden,
22091
- tb.is_project_termbase, tb.name as termbase_name,
22092
- COALESCE(ta.priority, tb.ranking) as ranking
22093
- FROM termbase_terms t
22094
- LEFT JOIN termbases tb ON CAST(t.termbase_id AS INTEGER) = tb.id
22095
- LEFT JOIN termbase_activation ta ON ta.termbase_id = tb.id AND ta.project_id = ? AND ta.is_active = 1
22096
- WHERE LOWER(t.source_term) LIKE ?
22097
- AND (ta.is_active = 1 OR tb.is_project_termbase = 1)
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
- # Limit raw hits per word to keep batch worker light
22109
- query += " LIMIT 15"
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 <= 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 = 'target' AND forbidden = 0
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.175">
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.175</a>
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.175</p>
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.175</div>
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