GameSentenceMiner 2.12.12.post1__py3-none-any.whl → 2.13.1__py3-none-any.whl

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.
@@ -0,0 +1,592 @@
1
+ {
2
+ "python": {
3
+ "config": {
4
+ "app": {
5
+ "title": "GameSentenceMiner 配置",
6
+ "title_with_profile": "GameSentenceMiner 配置 - {profile_name}"
7
+ },
8
+ "buttons": {
9
+ "save": "保存设置",
10
+ "sync_changes": {
11
+ "label": "同步更改到配置文件",
12
+ "tooltip": "将更改同步到所有配置文件。"
13
+ },
14
+ "reset_to_default": {
15
+ "text": "重置为默认值",
16
+ "tooltip": "将当前选项卡的设置重置为默认值。"
17
+ },
18
+ "browse": "浏览",
19
+ "ok": "确定",
20
+ "run_function": "运行功能"
21
+ },
22
+ "tabs": {
23
+ "key_settings": {
24
+ "title": "关键设置",
25
+ "description": "一个简化的配置界面,用于快速设置。",
26
+ "key_settings": {
27
+ "label": "关键设置",
28
+ "tooltip": "这些是快速设置中最重要的设置。所有这些设置都在其他选项卡中重复。"
29
+ },
30
+ "anki_enabled": {
31
+ "label": "启用 Anki:",
32
+ "tooltip": "启用或禁用 Anki 集成。"
33
+ },
34
+ "obs_enabled": {
35
+ "label": "启用 OBS:",
36
+ "tooltip": "启用或禁用 OBS 集成。"
37
+ },
38
+ "audio_enabled": {
39
+ "label": "启用音频:",
40
+ "tooltip": "启用或禁用音频处理。"
41
+ },
42
+ "screenshot_enabled": {
43
+ "label": "启用截图:",
44
+ "tooltip": "启用或禁用截图处理。"
45
+ },
46
+ "vad_enabled": {
47
+ "label": "启用 VAD:",
48
+ "tooltip": "启用或禁用语音活动检测 (VAD) 处理。"
49
+ },
50
+ "ai_enabled": {
51
+ "label": "启用 AI:",
52
+ "tooltip": "启用或禁用 AI 集成。"
53
+ }
54
+ },
55
+ "general": {
56
+ "title": "通用",
57
+ "websocket_enabled": {
58
+ "label": "启用 WebSocket:",
59
+ "tooltip": "启用或禁用 WebSocket 通信。启用此项将禁用剪贴板监视器。"
60
+ },
61
+ "clipboard_enabled": {
62
+ "label": "启用剪贴板:",
63
+ "tooltip": "启用或禁用剪贴板监视。"
64
+ },
65
+ "allow_both_simultaneously": {
66
+ "label": "允许同时使用:",
67
+ "tooltip": "允许 GSM 同时接受剪贴板和 WebSocket 输入。"
68
+ },
69
+ "merge_sequential_text": {
70
+ "label": "合并连续匹配文本:",
71
+ "tooltip": "将连续匹配的文本合并为单个条目。这是一个非常特殊的功能。"
72
+ },
73
+ "websocket_uri": {
74
+ "label": "WebSocket URI:",
75
+ "tooltip": "用于连接的 WebSocket URI。允许使用逗号分隔的值连接多个。"
76
+ },
77
+ "texthook_regex": {
78
+ "label": "TextHook 替换 Regex:",
79
+ "tooltip": "对 TextHook 输入运行替换的正则表达式(Regex)。"
80
+ },
81
+ "open_config_on_startup": {
82
+ "label": "启动时打开配置:",
83
+ "tooltip": "脚本启动时是否打开配置窗口。"
84
+ },
85
+ "open_texthooker_on_startup": {
86
+ "label": "启动时打开 GSM Texthooker:",
87
+ "tooltip": "脚本启动时是否打开 Texthooker 页面。"
88
+ },
89
+ "texthooker_port": {
90
+ "label": "GSM Texthooker 端口:",
91
+ "tooltip": "Texthooker 运行的端口。如果您不清楚,请勿更改。"
92
+ },
93
+ "current_version": {
94
+ "label": "当前版本:",
95
+ "tooltip": "应用程序的当前版本。"
96
+ },
97
+ "latest_version": {
98
+ "label": "最新版本:",
99
+ "tooltip": "可用的最新版本。"
100
+ },
101
+ "native_language": {
102
+ "label": "母语:",
103
+ "tooltip": "选择您的母语。此设置用于多种功能,但不会改变 GSM 的界面语言。"
104
+ },
105
+ "legend": {
106
+ "important": "表示重要/必需的设置。",
107
+ "advanced": "突出显示可能导致问题的进阶功能。",
108
+ "recommended": "表示推荐但完全可选的设置。",
109
+ "tooltip_info": "将鼠标悬停在设置中的每个标签上,都会有更多信息的工具提示。"
110
+ },
111
+ "locale": {
112
+ "label": "语言:",
113
+ "tooltip": "选择应用程序的语言。这将更改界面的语言。"
114
+ }
115
+ },
116
+ "paths": {
117
+ "title": "路径",
118
+ "folder_to_watch": {
119
+ "label": "监视文件夹:",
120
+ "tooltip": "OBS 录像回放的保存路径。"
121
+ },
122
+ "audio_destination": {
123
+ "label": "音频保存位置:",
124
+ "tooltip": "剪切后音频的保存路径。"
125
+ },
126
+ "screenshot_destination": {
127
+ "label": "截图保存位置:",
128
+ "tooltip": "截图的保存路径。"
129
+ },
130
+ "remove_video": {
131
+ "label": "删除视频:",
132
+ "tooltip": "处理后删除视频文件。"
133
+ },
134
+ "remove_audio": {
135
+ "label": "删除音频:",
136
+ "tooltip": "处理后删除音频文件。"
137
+ },
138
+ "remove_screenshot": {
139
+ "label": "删除截图:",
140
+ "tooltip": "处理后删除截图文件。"
141
+ }
142
+ },
143
+ "anki": {
144
+ "title": "Anki",
145
+ "update_anki": {
146
+ "label": "更新 Anki:",
147
+ "tooltip": "使用新数据自动更新 Anki。"
148
+ },
149
+ "url": {
150
+ "label": "Anki URL:",
151
+ "tooltip": "连接到您的 Anki 实例的 URL。"
152
+ },
153
+ "sentence_field": {
154
+ "label": "句子字段:",
155
+ "tooltip": "Anki 中用于主句子的字段。"
156
+ },
157
+ "sentence_audio_field": {
158
+ "label": "句子音频字段:",
159
+ "tooltip": "Anki 中用于句子相关音频的字段。留空以禁用音频处理。"
160
+ },
161
+ "picture_field": {
162
+ "label": "图片字段:",
163
+ "tooltip": "Anki 中用于相关图片的字段。"
164
+ },
165
+ "word_field": {
166
+ "label": "单词字段:",
167
+ "tooltip": "Anki 中用于单个单词的字段。"
168
+ },
169
+ "previous_sentence_field": {
170
+ "label": "上一句字段:",
171
+ "tooltip": "Anki 中用于上一句对话的字段。如果为空,则不填充。"
172
+ },
173
+ "previous_image_field": {
174
+ "label": "上一句截图字段:",
175
+ "tooltip": "Anki 中用于上一句截图的字段。如果为空,则不填充。"
176
+ },
177
+ "custom_tags": {
178
+ "label": "添加标签:",
179
+ "tooltip": "Anki 卡片的自定义标签(以逗号分隔)。"
180
+ },
181
+ "tags_to_check": {
182
+ "label": "处理的标签:",
183
+ "tooltip": "脚本将只对带有这些标签的卡片进行一键操作(建议留空)。"
184
+ },
185
+ "add_game_tag": {
186
+ "label": "添加游戏为标签:",
187
+ "tooltip": "在 Anki 卡片上包含游戏标签。"
188
+ },
189
+ "parent_tag": {
190
+ "label": "游戏父标签:",
191
+ "tooltip": "游戏标签的父标签。如果为空,则不添加父标签。例如:Game::{Game_Title}。"
192
+ },
193
+ "overwrite_audio": {
194
+ "label": "覆盖音频:",
195
+ "tooltip": "覆盖 Anki 卡片中现有的音频。"
196
+ },
197
+ "overwrite_picture": {
198
+ "label": "覆盖图片:",
199
+ "tooltip": "覆盖 Anki 卡片中现有的图片。"
200
+ },
201
+ "multi_overwrites_sentence": {
202
+ "label": "多行挖掘覆盖句子:",
203
+ "tooltip": "使用多行挖掘时,用所选行的串联覆盖句子。"
204
+ }
205
+ },
206
+ "vad": {
207
+ "title": "VAD",
208
+ "do_postprocessing": {
209
+ "label": "语音检测后处理:",
210
+ "tooltip": "对音频进行后处理,仅修剪出语音部分。"
211
+ },
212
+ "language": {
213
+ "label": "语言:",
214
+ "tooltip": "为 VAD 选择语言。仅用于 Whisper。"
215
+ },
216
+ "whisper_model": {
217
+ "label": "Whisper 模型:",
218
+ "tooltip": "为 VAD 选择 Whisper 模型大小。"
219
+ },
220
+ "selected_model": {
221
+ "label": "选择 VAD 模型:",
222
+ "tooltip": "选择要使用的 VAD 模型。"
223
+ },
224
+ "backup_model": {
225
+ "label": "备用 VAD 模型:",
226
+ "tooltip": "在未找到音频时选择备用模型。"
227
+ },
228
+ "add_on_no_results": {
229
+ "label": "无结果时添加音频:",
230
+ "tooltip": "即使 VAD 未找到结果,也添加音频。"
231
+ },
232
+ "audio_end_offset": {
233
+ "label": "音频结束偏移量:",
234
+ "tooltip": "从视频末尾提取的偏移秒数。"
235
+ },
236
+ "trim_beginning": {
237
+ "label": "修剪开头:",
238
+ "tooltip": "VAD 修剪后的开始偏移量。仅在“修剪开头”开启时有效。负值 = 开头时间更长。"
239
+ },
240
+ "beginning_offset": {
241
+ "label": "开始偏移量:",
242
+ "tooltip": "VAD 修剪后的开始偏移量。仅在“修剪开头”开启时有效。负值 = 开头时间更长。"
243
+ },
244
+ "cut_and_splice": {
245
+ "label": "剪切和拼接片段:",
246
+ "tooltip": "剪切检测到的语音片段并将其重新拼接。更多填充 = 语音间距更大。"
247
+ },
248
+ "splice_padding": {
249
+ "label": "填充:",
250
+ "tooltip": "剪切检测到的语音片段并将其重新拼接。更多填充 = 语音间距更大。"
251
+ }
252
+ },
253
+ "features": {
254
+ "title": "功能",
255
+ "notify_on_update": {
256
+ "label": "更新时通知:",
257
+ "tooltip": "发生更新时通知用户。"
258
+ },
259
+ "open_anki_edit": {
260
+ "label": "打开 Anki 编辑:",
261
+ "tooltip": "更新后自动打开 Anki 进行编辑。"
262
+ },
263
+ "open_anki_browser": {
264
+ "label": "在浏览器中打开 Anki 笔记:",
265
+ "tooltip": "更新后在浏览器中打开 Anki 笔记。"
266
+ },
267
+ "browser_query": {
268
+ "label": "浏览器查询:",
269
+ "tooltip": "在浏览器中打开 Anki 笔记时使用的查询。例如:'added:1'。"
270
+ },
271
+ "backfill_audio": {
272
+ "label": "回填音频:",
273
+ "tooltip": "为现有条目填充音频数据。"
274
+ },
275
+ "full_auto": {
276
+ "label": "全自动模式:",
277
+ "tooltip": "Yomitan 一键创建 Anki 卡片。"
278
+ }
279
+ },
280
+ "screenshot": {
281
+ "title": "截图",
282
+ "enabled": {
283
+ "label": "启用:",
284
+ "tooltip": "启用或禁用截图处理。"
285
+ },
286
+ "width": {
287
+ "label": "宽度:",
288
+ "tooltip": "截图的宽度(像素)。"
289
+ },
290
+ "height": {
291
+ "label": "高度:",
292
+ "tooltip": "截图的高度(像素)。"
293
+ },
294
+ "quality": {
295
+ "label": "质量:",
296
+ "tooltip": "截图的质量(0-100)。"
297
+ },
298
+ "extension": {
299
+ "label": "扩展名:",
300
+ "tooltip": "截图格式的文件扩展名。"
301
+ },
302
+ "ffmpeg_options": {
303
+ "label": "FFmpeg 重编码选项:",
304
+ "tooltip": "用于重编码截图的自定义 FFmpeg 选项。"
305
+ },
306
+ "timing": {
307
+ "label": "截图时机:",
308
+ "tooltip": "选择相对于句子何时截图:开始、中间或结束。"
309
+ },
310
+ "offset": {
311
+ "label": "截图偏移量:",
312
+ "tooltip": "根据上述时机设置偏移截图的时间(秒)。"
313
+ },
314
+ "use_selector": {
315
+ "label": "为每张卡片使用截图选择器:",
316
+ "tooltip": "启用截图选择器为每张卡片选择截图点。"
317
+ },
318
+ "hotkey": {
319
+ "label": "截图热键:",
320
+ "tooltip": "截图的热键。"
321
+ },
322
+ "hotkey_updates_anki": {
323
+ "label": "截图热键更新 Anki:",
324
+ "tooltip": "允许截图热键/按钮更新最新的 Anki 卡片。"
325
+ }
326
+ },
327
+ "audio": {
328
+ "title": "音频",
329
+ "enabled": {
330
+ "label": "启用:",
331
+ "tooltip": "启用或禁用音频处理。"
332
+ },
333
+ "extension": {
334
+ "label": "音频扩展名:",
335
+ "tooltip": "音频文件的文件扩展名。"
336
+ },
337
+ "beginning_offset": {
338
+ "label": "音频提取开始偏移量:",
339
+ "tooltip": "从视频开头提取的偏移秒数(通常为负数或0)。"
340
+ },
341
+ "find_offset_button": "查找偏移量 (WIP)",
342
+ "end_offset": {
343
+ "label": "音频提取结束偏移量:",
344
+ "tooltip": "在 VAD 处理开始前从末尾修剪的偏移秒数。警告:如果为负数,可能导致音频丢失。"
345
+ },
346
+ "ffmpeg_preset": {
347
+ "label": "FFmpeg 预设选项:",
348
+ "tooltip": "为重编码截图选择一个预设的 FFmpeg 选项。",
349
+ "options": {
350
+ "no_reencode": "不重编码",
351
+ "fade_in": "简单淡入,避免音频削波(默认)",
352
+ "loudness_norm": "简单响度归一化(最简单,从此开始)",
353
+ "downmix_norm": "下混到单声道并归一化(推荐?)",
354
+ "downmix_norm_low_bitrate": "下混到单声道,30kbps,归一化(最优?)",
355
+ "custom": "自定义"
356
+ }
357
+ },
358
+ "ffmpeg_options": {
359
+ "label": "FFmpeg 重编码选项:",
360
+ "tooltip": "用于重编码音频文件的自定义 FFmpeg 选项。"
361
+ },
362
+ "anki_media_collection": {
363
+ "label": "Anki 媒体集:",
364
+ "tooltip": "Anki 媒体集的路径,用于外部修剪工具。末尾不要加斜杠。"
365
+ },
366
+ "external_tool": {
367
+ "label": "外部音频编辑工具:",
368
+ "tooltip": "打开音频进行手动修剪的外部工具路径。我推荐使用 OcenAudio 进行原地编辑。"
369
+ },
370
+ "external_tool_enabled": {
371
+ "label": "启用:",
372
+ "tooltip": "将音频发送到外部工具进行编辑。"
373
+ },
374
+ "install_ocenaudio_button": "安装 Ocenaudio",
375
+ "get_anki_media_button": "获取 Anki 媒体集"
376
+ },
377
+ "obs": {
378
+ "title": "OBS",
379
+ "enabled": {
380
+ "label": "启用:",
381
+ "tooltip": "启用或禁用 OBS 集成。"
382
+ },
383
+ "open_obs": {
384
+ "label": "打开 OBS:",
385
+ "tooltip": "GSM 启动时打开 OBS。"
386
+ },
387
+ "close_obs": {
388
+ "label": "关闭 OBS:",
389
+ "tooltip": "GSM 关闭时关闭 OBS。"
390
+ },
391
+ "host": {
392
+ "label": "主机:",
393
+ "tooltip": "OBS WebSocket 服务器的主机地址。"
394
+ },
395
+ "port": {
396
+ "label": "端口:",
397
+ "tooltip": "OBS WebSocket 服务器的端口号。"
398
+ },
399
+ "password": {
400
+ "label": "密码:",
401
+ "tooltip": "OBS WebSocket 服务器的密码。"
402
+ },
403
+ "game_from_scene": {
404
+ "label": "从场景名称获取游戏:",
405
+ "tooltip": "将当前游戏更改为场景名称。"
406
+ },
407
+ "min_replay_size": {
408
+ "label": "最小回放大小 (KB):",
409
+ "tooltip": "OBS 录像回放的最小大小(KB)。如果回放小于此大小,将不抓取音频/截图。"
410
+ }
411
+ },
412
+ "profiles": {
413
+ "title": "配置文件",
414
+ "select_profile": {
415
+ "label": "选择配置文件:",
416
+ "tooltip": "选择一个配置文件以加载其设置。"
417
+ },
418
+ "add_button": "添加配置文件",
419
+ "copy_button": "复制配置文件",
420
+ "delete_button": "删除配置",
421
+ "obs_scene": {
422
+ "label": "OBS 场景 (自动切换):",
423
+ "tooltip": "选择一个 OBS 场景与此配置文件关联(可选)。"
424
+ },
425
+ "refresh_scenes_button": "刷新场景",
426
+ "switch_to_default": {
427
+ "label": "未找到时切换到默认:",
428
+ "tooltip": "如果未找到所选的 OBS 场景,则切换到默认配置文件。"
429
+ }
430
+ },
431
+ "advanced": {
432
+ "title": "高级",
433
+ "player_note": "注意:这些选项中只有一个会生效,优先考虑音频。",
434
+ "audio_player_path": {
435
+ "label": "音频播放器路径:",
436
+ "tooltip": "音频播放器可执行文件的路径。将打开修剪后的音频。"
437
+ },
438
+ "video_player_path": {
439
+ "label": "视频播放器路径:",
440
+ "tooltip": "视频播放器可执行文件的路径。将跳转到录像回放中句子的位置。"
441
+ },
442
+ "play_latest_hotkey": {
443
+ "label": "播放最新视频/音频热键:",
444
+ "tooltip": "修剪并播放最新音频的热键。"
445
+ },
446
+ "multiline_linebreak": {
447
+ "label": "多行换行符:",
448
+ "tooltip": "多行挖掘的换行符。此符号将插入每个句子之间。"
449
+ },
450
+ "multiline_storage_field": {
451
+ "label": "多行句子存储字段:",
452
+ "tooltip": "Anki 中用于临时存储多行句子的字段。"
453
+ },
454
+ "ocr_port": {
455
+ "label": "OCR WebSocket 端口:",
456
+ "tooltip": "OCR WebSocket 通信的端口。GSM 也将在此端口上侦听。"
457
+ },
458
+ "texthooker_comm_port": {
459
+ "label": "Texthooker 通信 WebSocket 端口:",
460
+ "tooltip": "GSM Texthooker WebSocket 通信的端口。目前不起作用,硬编码为 55001。"
461
+ },
462
+ "plaintext_export_port": {
463
+ "label": "纯文本 WebSocket 导出端口:",
464
+ "tooltip": "GSM 纯文本 WebSocket 导出通信的端口。目前不起作用,硬编码为 55002。"
465
+ },
466
+ "reset_line_hotkey": {
467
+ "label": "重置行热键:",
468
+ "tooltip": "重置当前对话行的热键。"
469
+ },
470
+ "polling_rate": {
471
+ "label": "轮询率:",
472
+ "tooltip": "Anki 检查更新的速率(毫秒)。"
473
+ }
474
+ },
475
+ "ai": {
476
+ "title": "AI",
477
+ "enabled": {
478
+ "label": "启用:",
479
+ "tooltip": "启用或禁用 AI 集成。"
480
+ },
481
+ "provider": {
482
+ "label": "提供商:",
483
+ "tooltip": "选择 AI 提供商。"
484
+ },
485
+ "gemini_model": {
486
+ "label": "Gemini AI 模型:",
487
+ "tooltip": "选择要使用的 AI 模型。"
488
+ },
489
+ "gemini_api_key": {
490
+ "label": "Gemini API 密钥:",
491
+ "tooltip": "所选 AI 提供商的 API 密钥(目前仅限 Gemini)。"
492
+ },
493
+ "groq_model": {
494
+ "label": "Groq AI 模型:",
495
+ "tooltip": "选择要使用的 Groq AI 模型。"
496
+ },
497
+ "groq_api_key": {
498
+ "label": "Groq API 密钥:",
499
+ "tooltip": "Groq AI 提供商的 API 密钥。"
500
+ },
501
+ "local_model": {
502
+ "label": "本地 AI 模型:",
503
+ "tooltip": "要使用的本地 AI 模型,目前仅支持非常基本的翻译。"
504
+ },
505
+ "anki_field": {
506
+ "label": "Anki 字段:",
507
+ "tooltip": "Anki 中用于 AI 生成内容的字段。"
508
+ },
509
+ "context_length": {
510
+ "label": "对话上下文长度:",
511
+ "tooltip": "作为 AI 上下文包含的前后行数。0 表示禁用。-1 表示尽可能多(请谨慎使用)。"
512
+ },
513
+ "use_canned_translation": {
514
+ "label": "使用预设翻译提示:",
515
+ "tooltip": "为 AI 使用预定义的翻译提示。"
516
+ },
517
+ "use_canned_context": {
518
+ "label": "使用预设上下文提示:",
519
+ "tooltip": "为 AI 使用预定义的上下文提示。"
520
+ },
521
+ "custom_prompt": {
522
+ "label": "自定义提示:",
523
+ "tooltip": "用于 AI 处理的自定义提示。"
524
+ }
525
+ },
526
+ "wip": {
527
+ "title": "WIP",
528
+ "warning_experimental": "警告:这些功能是实验性的,可能无法按预期工作。",
529
+ "warning_overlay_deps": "覆盖层需要安装 OwOCR 依赖项,并需要运行一个外部应用程序。",
530
+ "overlay_port": {
531
+ "label": "覆盖层 WebSocket 端口:",
532
+ "tooltip": "用于实验性覆盖层功能的覆盖层 WebSocket 通信端口。"
533
+ },
534
+ "overlay_send": {
535
+ "label": "覆盖层 WebSocket 发送:",
536
+ "tooltip": "启用通过 WebSocket 发送覆盖层数据。实验性功能。"
537
+ },
538
+ "monitor_capture": {
539
+ "label": "捕获的显示器:",
540
+ "tooltip": "选择要捕获的显示器(从1开始的索引)。",
541
+ "not_detected": "未检测到 OwOCR"
542
+ },
543
+ "error_setup": "设置 WIP 选项卡时出错"
544
+ }
545
+ },
546
+ "dialogs": {
547
+ "reset_to_default": {
548
+ "title": "重置为默认值",
549
+ "message": "您确定要将此选项卡中的所有设置重置为默认值吗?"
550
+ },
551
+ "select_profile": {
552
+ "title": "选择配置文件",
553
+ "message": "多个配置文件与当前场景匹配。请选择配置文件:"
554
+ },
555
+ "config_error": {
556
+ "title": "配置错误",
557
+ "full_auto_and_backfill": "不能同时开启全自动模式和回填模式!注意:回填是一个非常特殊的工作流程。",
558
+ "no_input_method": "不能同时禁用剪贴板和 WebSocket。"
559
+ },
560
+ "offset_copied": {
561
+ "title": "剪贴板",
562
+ "message": "偏移量已复制到剪贴板!"
563
+ },
564
+ "add_profile": {
565
+ "title": "输入",
566
+ "prompt": "输入新的配置文件名称:"
567
+ },
568
+ "copy_profile": {
569
+ "title": "输入",
570
+ "prompt": "输入新的配置文件名称:"
571
+ },
572
+ "delete_profile": {
573
+ "title": "确认删除",
574
+ "message": "您确定要删除配置文件 '{profile_name}' 吗?",
575
+ "error_title": "错误",
576
+ "error_cannot_delete_default": "无法删除默认配置文件。"
577
+ },
578
+ "install_ocenaudio": {
579
+ "title": "下载 OcenAudio?",
580
+ "message": "您想下载并安装 OcenAudio 吗?它是一款免费的音频编辑软件,与 GSM 配合得非常好。",
581
+ "downloading_message": "正在下载 OcenAudio...",
582
+ "success_title": "OcenAudio 已下载",
583
+ "success_message": "OcenAudio 已下载并安装。您可以在 {path} 找到它。"
584
+ },
585
+ "set_anki_media": {
586
+ "title": "设置默认 Anki 媒体集?",
587
+ "message": "您想设置默认的 Anki 媒体集路径吗?这将帮助脚本找到用于外部修剪的媒体集。\n\n默认值:%APPDATA%/Anki2/User 1/collection.media"
588
+ }
589
+ }
590
+ }
591
+ }
592
+ }
@@ -58,6 +58,39 @@ def is_linux():
58
58
  def is_windows():
59
59
  return platform == 'win32'
60
60
 
61
+ class Locale(Enum):
62
+ English = 'en_us'
63
+ 日本語 = 'ja_jp'
64
+ 한국어 = 'ko_kr'
65
+ 中文 = 'zh_cn'
66
+ Español = 'es_es'
67
+ Français = 'fr_fr'
68
+ Deutsch = 'de_de'
69
+ Italiano = 'it_it'
70
+ Русский = 'ru_ru'
71
+
72
+ @classmethod
73
+ def from_any(cls, value: str) -> 'Locale':
74
+ """
75
+ Lookup Locale by either enum name (e.g. 'English') or value (e.g. 'en_us').
76
+ Case-insensitive.
77
+ """
78
+ value_lower = value.lower()
79
+ for locale in cls:
80
+ if locale.name.lower() == value_lower or locale.value.lower() == value_lower:
81
+ return locale
82
+ raise KeyError(f"Locale '{value}' not found.")
83
+
84
+ def __getitem__(cls, item):
85
+ try:
86
+ return cls.from_any(item)
87
+ except KeyError:
88
+ raise
89
+
90
+
91
+ # Patch Enum's __getitem__ for this class
92
+ Locale.__getitem__ = classmethod(Locale.__getitem__)
93
+
61
94
 
62
95
  class Language(Enum):
63
96
  JAPANESE = "ja"
@@ -79,6 +112,8 @@ class Language(Enum):
79
112
  DANISH = "da"
80
113
  NORWEGIAN = "no"
81
114
 
115
+
116
+
82
117
 
83
118
  AVAILABLE_LANGUAGES = [lang.value for lang in Language]
84
119
  AVAILABLE_LANGUAGES_DICT = {lang.value: lang for lang in Language}
@@ -504,7 +539,7 @@ class Ai:
504
539
  enabled: bool = False
505
540
  anki_field: str = ''
506
541
  provider: str = AI_GEMINI
507
- gemini_model: str = 'gemini-2.5-flash'
542
+ gemini_model: str = 'gemini-2.5-flash-lite'
508
543
  local_model: str = OFF
509
544
  groq_model: str = 'meta-llama/llama-4-scout-17b-16e-instruct'
510
545
  api_key: str = '' # Deprecated
@@ -523,6 +558,10 @@ class Ai:
523
558
  if self.provider == 'groq':
524
559
  self.provider = AI_GROQ
525
560
 
561
+ # Change Legacy Model Name
562
+ if self.gemini_model == 'gemini-2.5-flash-lite-preview-06-17':
563
+ self.gemini_model = 'gemini-2.5-flash-lite'
564
+
526
565
 
527
566
  # Experimental Features section, will change often
528
567
  @dataclass_json
@@ -650,6 +689,7 @@ class Config:
650
689
  configs: Dict[str, ProfileConfig] = field(default_factory=dict)
651
690
  current_profile: str = DEFAULT_CONFIG
652
691
  switch_to_default_if_not_found: bool = True
692
+ locale: Locale = Locale.English
653
693
 
654
694
  @classmethod
655
695
  def new(cls):
@@ -371,7 +371,7 @@ async def do_work(sentence_to_check=None):
371
371
  cropped_image.save("C:\\Users\\Beangate\\GSM\\temp\\full_screenshot.png")
372
372
  # full_screenshot_image.show()
373
373
  if cropped_image:
374
- logger.info("Full screenshot captured successfully. Now performing local OCR...")
374
+ logger.info("Full screenshot captured successfully. Now performing OCR...")
375
375
  # ocr_results = oneocr(full_screenshot_image, return_coords=True)
376
376
  google_ocr_results = lens(cropped_image, return_coords=True)[2]
377
377