GameSentenceMiner 2.18.11__tar.gz → 2.18.13__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 GameSentenceMiner might be problematic. Click here for more details.

Files changed (139) hide show
  1. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/anki.py +1 -1
  2. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/locales/en_us.json +2 -2
  3. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/locales/ja_jp.json +4 -4
  4. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/locales/zh_cn.json +4 -4
  5. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/ui/anki_confirmation.py +9 -20
  6. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/ui/config_gui.py +2 -2
  7. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/ui/screenshot_selector.py +6 -19
  8. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/util/configuration.py +10 -7
  9. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/texthooking_page.py +6 -1
  10. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner.egg-info/PKG-INFO +1 -1
  11. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/PKG-INFO +1 -1
  12. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/pyproject.toml +1 -1
  13. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/__init__.py +0 -0
  14. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/ai/__init__.py +0 -0
  15. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/ai/ai_prompting.py +0 -0
  16. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/assets/__init__.py +0 -0
  17. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/assets/icon.png +0 -0
  18. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/assets/icon128.png +0 -0
  19. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/assets/icon256.png +0 -0
  20. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/assets/icon32.png +0 -0
  21. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/assets/icon512.png +0 -0
  22. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/assets/icon64.png +0 -0
  23. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/assets/pickaxe.png +0 -0
  24. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/gametext.py +0 -0
  25. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/gsm.py +0 -0
  26. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/obs.py +0 -0
  27. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/ocr/__init__.py +0 -0
  28. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/ocr/gsm_ocr_config.py +0 -0
  29. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/ocr/ocrconfig.py +0 -0
  30. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/ocr/owocr_area_selector.py +0 -0
  31. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/ocr/owocr_helper.py +0 -0
  32. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/ocr/ss_picker.py +0 -0
  33. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/owocr/owocr/__init__.py +0 -0
  34. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/owocr/owocr/__main__.py +0 -0
  35. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/owocr/owocr/config.py +0 -0
  36. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/owocr/owocr/lens_betterproto.py +0 -0
  37. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/owocr/owocr/ocr.py +0 -0
  38. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/owocr/owocr/run.py +0 -0
  39. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/owocr/owocr/screen_coordinate_picker.py +0 -0
  40. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/tools/__init__.py +0 -0
  41. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/tools/audio_offset_selector.py +0 -0
  42. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/tools/furigana_filter_preview.py +0 -0
  43. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/tools/ss_selector.py +0 -0
  44. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/tools/window_transparency.py +0 -0
  45. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/ui/__init__.py +0 -0
  46. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/ui/furigana_filter_preview.py +0 -0
  47. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/util/__init__.py +0 -0
  48. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/util/audio_player.py +0 -0
  49. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/util/communication/__init__.py +0 -0
  50. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/util/communication/send.py +0 -0
  51. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/util/communication/websocket.py +0 -0
  52. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/util/db.py +0 -0
  53. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/util/downloader/Untitled_json.py +0 -0
  54. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/util/downloader/__init__.py +0 -0
  55. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/util/downloader/download_tools.py +0 -0
  56. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/util/downloader/oneocr_dl.py +0 -0
  57. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/util/electron_config.py +0 -0
  58. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/util/ffmpeg.py +0 -0
  59. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/util/get_overlay_coords.py +0 -0
  60. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/util/gsm_utils.py +0 -0
  61. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/util/model.py +0 -0
  62. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/util/notification.py +0 -0
  63. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/util/text_log.py +0 -0
  64. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/util/win10toast/__init__.py +0 -0
  65. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/util/win10toast/__main__.py +0 -0
  66. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/vad.py +0 -0
  67. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/__init__.py +0 -0
  68. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/database_api.py +0 -0
  69. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/events.py +0 -0
  70. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/gsm_websocket.py +0 -0
  71. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/service.py +0 -0
  72. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/static/__init__.py +0 -0
  73. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/static/apple-touch-icon.png +0 -0
  74. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/static/css/dashboard-shared.css +0 -0
  75. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/static/css/kanji-grid.css +0 -0
  76. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/static/css/overview.css +0 -0
  77. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/static/css/popups-shared.css +0 -0
  78. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/static/css/search.css +0 -0
  79. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/static/css/shared.css +0 -0
  80. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/static/css/stats.css +0 -0
  81. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/static/favicon-96x96.png +0 -0
  82. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/static/favicon.ico +0 -0
  83. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/static/favicon.svg +0 -0
  84. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/static/js/anki_stats.js +0 -0
  85. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/static/js/database.js +0 -0
  86. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/static/js/goals.js +0 -0
  87. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/static/js/kanji-grid.js +0 -0
  88. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/static/js/overview.js +0 -0
  89. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/static/js/search.js +0 -0
  90. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/static/js/shared.js +0 -0
  91. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/static/js/stats.js +0 -0
  92. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/static/site.webmanifest +0 -0
  93. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/static/style.css +0 -0
  94. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/static/web-app-manifest-192x192.png +0 -0
  95. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/static/web-app-manifest-512x512.png +0 -0
  96. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/stats.py +0 -0
  97. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/anki_stats.html +0 -0
  98. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/components/kanji_grid/basic_kanji_book_bkb_v1_v2.json +0 -0
  99. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/components/kanji_grid/duolingo_kanji.json +0 -0
  100. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/components/kanji_grid/grade.json +0 -0
  101. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/components/kanji_grid/hk_primary_learning.json +0 -0
  102. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/components/kanji_grid/hkscs2016.json +0 -0
  103. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/components/kanji_grid/hsk_levels.json +0 -0
  104. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/components/kanji_grid/humanum_frequency_list.json +0 -0
  105. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/components/kanji_grid/jis_levels.json +0 -0
  106. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/components/kanji_grid/jlpt_level.json +0 -0
  107. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/components/kanji_grid/jpdb_kanji_frequency_list.json +0 -0
  108. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/components/kanji_grid/jpdbv2_kanji_frequency_list.json +0 -0
  109. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/components/kanji_grid/jun_das_modern_chinese_character_frequency_list.json +0 -0
  110. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/components/kanji_grid/kanji_in_context_revised_edition.json +0 -0
  111. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/components/kanji_grid/kanji_kentei_level.json +0 -0
  112. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/components/kanji_grid/mainland_china_elementary_textbook_characters.json +0 -0
  113. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/components/kanji_grid/moe_way_quiz.json +0 -0
  114. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/components/kanji_grid/official_kanji.json +0 -0
  115. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/components/kanji_grid/remembering_the_kanji.json +0 -0
  116. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/components/kanji_grid/standard_form_of_national_characters.json +0 -0
  117. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/components/kanji_grid/table_of_general_standard_chinese_characters.json +0 -0
  118. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/components/kanji_grid/the_kodansha_kanji_learners_course_klc.json +0 -0
  119. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/components/kanji_grid/thousand_character_classic.json +0 -0
  120. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/components/kanji_grid/wanikani_levels.json +0 -0
  121. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/components/kanji_grid/words_hk_frequency_list.json +0 -0
  122. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/components/navigation.html +0 -0
  123. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/components/theme-styles.html +0 -0
  124. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/database.html +0 -0
  125. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/goals.html +0 -0
  126. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/index.html +0 -0
  127. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/overview.html +0 -0
  128. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/search.html +0 -0
  129. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/stats.html +0 -0
  130. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/web/templates/utility.html +0 -0
  131. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner/wip/__init___.py +0 -0
  132. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner.egg-info/SOURCES.txt +0 -0
  133. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner.egg-info/dependency_links.txt +0 -0
  134. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner.egg-info/entry_points.txt +0 -0
  135. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner.egg-info/requires.txt +0 -0
  136. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/GameSentenceMiner.egg-info/top_level.txt +0 -0
  137. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/LICENSE +0 -0
  138. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/README.md +0 -0
  139. {gamesentenceminer-2.18.11 → gamesentenceminer-2.18.13}/setup.cfg +0 -0
@@ -134,7 +134,7 @@ def _prepare_anki_note_fields(note: Dict, last_note: 'AnkiCard', assets: MediaAs
134
134
  if game_name_field := config.anki.game_name_field:
135
135
  note['fields'][game_name_field] = get_current_game()
136
136
 
137
- if config.ai.enabled:
137
+ if config.ai.add_to_anki:
138
138
  sentence_field = note['fields'].get(config.anki.sentence_field, {})
139
139
  sentence_to_translate = sentence_field or last_note.get_field(config.anki.sentence_field)
140
140
  translation = get_ai_prompt_result(get_all_lines(), sentence_to_translate, game_line, get_current_game())
@@ -515,8 +515,8 @@
515
515
  "ai": {
516
516
  "title": "AI",
517
517
  "enabled": {
518
- "label": "Enabled:",
519
- "tooltip": "Enable or disable AI integration."
518
+ "label": "Add To Anki:",
519
+ "tooltip": "Enable or disable Adding AI Result to Anki."
520
520
  },
521
521
  "provider": {
522
522
  "label": "Provider:",
@@ -513,10 +513,10 @@
513
513
  },
514
514
  "ai": {
515
515
  "title": "AI",
516
- "enabled": {
517
- "label": "有効化:",
518
- "tooltip": "AI連携を有効化します。"
519
- },
516
+ "enabled": {
517
+ "label": "Ankiに追加:",
518
+ "tooltip": "AI結果をAnkiに追加するかどうかを有効化します。"
519
+ },
520
520
  "provider": {
521
521
  "label": "プロバイダー:",
522
522
  "tooltip": "AIプロバイダーを選択。"
@@ -444,10 +444,10 @@
444
444
  "label": "最小回放大小 (KB):",
445
445
  "tooltip": "OBS 录像回放的最小大小(KB)。如果回放小于此大小,将不抓取音频/截图。"
446
446
  },
447
- "turn_off_replay_buffer_management": {
447
+ "turn_off_replay_buffer_management": {
448
448
  "label": "关闭回放缓冲区管理:",
449
449
  "tooltip": "禁用 OBS 回放缓冲区管理。如果您想在 OBS 中手动管理回放缓冲区,这将很有用。"
450
- }
450
+ }
451
451
  },
452
452
  "profiles": {
453
453
  "title": "配置文件",
@@ -515,8 +515,8 @@
515
515
  "ai": {
516
516
  "title": "AI",
517
517
  "enabled": {
518
- "label": "启用:",
519
- "tooltip": "启用或禁用 AI 集成。"
518
+ "label": "添加到 Anki:",
519
+ "tooltip": "启用或禁用将 AI 结果添加到 Anki。"
520
520
  },
521
521
  "provider": {
522
522
  "label": "提供商:",
@@ -46,28 +46,17 @@ class AnkiConfirmationDialog(tk.Toplevel):
46
46
  # --- Create and lay out widgets ---
47
47
  self._create_widgets(expression, sentence, screenshot_path, audio_path, translation)
48
48
 
49
- # --- Smarter Centering Logic ---
49
+ # --- Center the dialog on screen ---
50
50
  self.update_idletasks()
51
51
 
52
- if parent.state() == 'withdrawn':
53
- screen_width = self.winfo_screenwidth()
54
- screen_height = self.winfo_screenheight()
55
- dialog_width = self.winfo_width()
56
- dialog_height = self.winfo_height()
57
- x = (screen_width // 2) - (dialog_width // 2)
58
- y = (screen_height // 2) - (dialog_height // 2)
59
- self.geometry(f'+{x}+{y}')
60
- else:
61
- self.transient(parent)
62
- parent_x = parent.winfo_x()
63
- parent_y = parent.winfo_y()
64
- parent_width = parent.winfo_width()
65
- parent_height = parent.winfo_height()
66
- dialog_width = self.winfo_width()
67
- dialog_height = self.winfo_height()
68
- x = parent_x + (parent_width // 2) - (dialog_width // 2)
69
- y = parent_y + (parent_height // 2) - (dialog_height // 2)
70
- self.geometry(f'+{x}+{y}')
52
+ dialog_width = self.winfo_width()
53
+ dialog_height = self.winfo_height()
54
+ screen_width = self.winfo_screenwidth()
55
+ screen_height = self.winfo_screenheight()
56
+
57
+ x = (screen_width // 2) - (dialog_width // 2)
58
+ y = (screen_height // 2) - (dialog_height // 2)
59
+ self.geometry(f'+{x}+{y}')
71
60
 
72
61
  self.protocol("WM_DELETE_WINDOW", self._on_cancel)
73
62
  self.attributes('-topmost', True)
@@ -473,7 +473,7 @@ class ConfigApp:
473
473
  self.localhost_bind_address_value = tk.StringVar(value=self.settings.advanced.localhost_bind_address)
474
474
 
475
475
  # AI Settings
476
- self.ai_enabled_value = tk.BooleanVar(value=self.settings.ai.enabled)
476
+ self.ai_enabled_value = tk.BooleanVar(value=self.settings.ai.add_to_anki)
477
477
  self.ai_provider_value = tk.StringVar(value=self.settings.ai.provider)
478
478
  self.gemini_model_value = tk.StringVar(value=self.settings.ai.gemini_model)
479
479
  self.use_cpu_for_inference_value = tk.BooleanVar(value=self.settings.vad.use_cpu_for_inference)
@@ -714,7 +714,7 @@ class ConfigApp:
714
714
  localhost_bind_address=self.localhost_bind_address_value.get(),
715
715
  ),
716
716
  ai=Ai(
717
- enabled=self.ai_enabled_value.get(),
717
+ add_to_anki=self.ai_enabled_value.get(),
718
718
  provider=self.ai_provider_value.get(),
719
719
  gemini_model=self.gemini_model_value.get(),
720
720
  groq_model=self.groq_model_value.get(),
@@ -169,30 +169,17 @@ class ScreenshotSelectorDialog(tk.Toplevel):
169
169
 
170
170
  def _center_window(self):
171
171
  """
172
- Smarter centering logic. Centers on the parent if it's visible,
173
- otherwise centers on the screen.
172
+ Centers the dialog on the screen regardless of parent state.
174
173
  """
175
174
  self.update_idletasks()
176
175
 
177
- parent = self.parent_window
178
176
  dialog_width = self.winfo_width()
179
177
  dialog_height = self.winfo_height()
180
-
181
- if parent.state() == 'withdrawn':
182
- # PARENT IS HIDDEN: Center the dialog on the screen
183
- screen_width = self.winfo_screenwidth()
184
- screen_height = self.winfo_screenheight()
185
- x = (screen_width // 2) - (dialog_width // 2)
186
- y = (screen_height // 2) - (dialog_height // 2)
187
- else:
188
- # PARENT IS VISIBLE: Center relative to the parent window
189
- self.transient(parent) # Associate dialog with its parent
190
- parent_x = parent.winfo_x()
191
- parent_y = parent.winfo_y()
192
- parent_width = parent.winfo_width()
193
- parent_height = parent.winfo_height()
194
- x = parent_x + (parent_width // 2) - (dialog_width // 2)
195
- y = parent_y + (parent_height // 2) - (dialog_height // 2)
178
+ screen_width = self.winfo_screenwidth()
179
+ screen_height = self.winfo_screenheight()
180
+
181
+ x = (screen_width // 2) - (dialog_width // 2)
182
+ y = (screen_height // 2) - (dialog_height // 2)
196
183
 
197
184
  self.geometry(f'+{x}+{y}')
198
185
 
@@ -619,6 +619,7 @@ class Advanced:
619
619
  @dataclass
620
620
  class Ai:
621
621
  enabled: bool = False
622
+ add_to_anki: bool = False
622
623
  anki_field: str = ''
623
624
  provider: str = AI_GEMINI
624
625
  gemini_model: str = 'gemini-2.5-flash-lite'
@@ -645,19 +646,21 @@ class Ai:
645
646
  self.gemini_model = 'gemini-2.5-flash-lite'
646
647
  if self.groq_model in ['RECOMMENDED', 'OTHER']:
647
648
  self.groq_model = 'meta-llama/llama-4-scout-17b-16e-instruct'
649
+
650
+ if self.enabled:
651
+ self.add_to_anki = True
648
652
 
649
653
  # Change Legacy Model Name
650
654
  if self.gemini_model == 'gemini-2.5-flash-lite-preview-06-17':
651
655
  self.gemini_model = 'gemini-2.5-flash-lite'
652
656
 
653
657
  def is_configured(self) -> bool:
654
- if self.enabled:
655
- if self.provider == AI_GEMINI and self.gemini_api_key and self.gemini_model:
656
- return True
657
- if self.provider == AI_GROQ and self.groq_api_key and self.groq_model:
658
- return True
659
- if self.provider == AI_OPENAI and self.open_ai_api_key and self.open_ai_model and self.open_ai_url:
660
- return True
658
+ if self.provider == AI_GEMINI and self.gemini_api_key and self.gemini_model:
659
+ return True
660
+ if self.provider == AI_GROQ and self.groq_api_key and self.groq_model:
661
+ return True
662
+ if self.provider == AI_OPENAI and self.open_ai_api_key and self.open_ai_model and self.open_ai_url:
663
+ return True
661
664
  return False
662
665
 
663
666
 
@@ -235,14 +235,19 @@ def translate_multiple():
235
235
  event_ids = data.get('ids', [])
236
236
  if not event_ids:
237
237
  return jsonify({'error': 'Missing ids'}), 400
238
+
239
+ if not get_config().ai.is_configured():
240
+ return jsonify({'error': 'AI translation is not properly configured. Please check your settings in the "AI" Tab.'}), 400
238
241
 
239
242
  lines = [get_line_by_id(event_id) for event_id in event_ids if get_line_by_id(event_id) is not None]
240
243
 
241
244
  text = "\n".join(line.text for line in lines)
242
245
 
246
+ language = get_config().general.get_native_language_name() if get_config().general.native_language else "English"
247
+
243
248
  translate_multiple_lines_prompt = f"""
244
249
  **Professional Game Localization Task**
245
- Translate the following lines of game dialogue into natural-sounding, context-aware {get_config().general.get_native_language_name()}:
250
+ Translate the following lines of game dialogue into natural-sounding, context-aware {language}:
246
251
 
247
252
  **Output Requirements**
248
253
  - Maintain the original tone and style of the dialogue.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GameSentenceMiner
3
- Version: 2.18.11
3
+ Version: 2.18.13
4
4
  Summary: A tool for mining sentences from games. Update: Overlay?
5
5
  Author-email: Beangate <bpwhelan95@gmail.com>
6
6
  License: MIT License
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GameSentenceMiner
3
- Version: 2.18.11
3
+ Version: 2.18.13
4
4
  Summary: A tool for mining sentences from games. Update: Overlay?
5
5
  Author-email: Beangate <bpwhelan95@gmail.com>
6
6
  License: MIT License
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
7
7
 
8
8
  [project]
9
9
  name = "GameSentenceMiner"
10
- version = "2.18.11"
10
+ version = "2.18.13"
11
11
  description = "A tool for mining sentences from games. Update: Overlay?"
12
12
  readme = "README.md"
13
13
  requires-python = ">=3.10"