hydro-ai-helper 2.3.0 → 2.4.0

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 (71) hide show
  1. package/README.md +1 -0
  2. package/dist/handlers/adminConfigHandler.js +30 -0
  3. package/dist/handlers/adminConfigHandler.js.map +1 -1
  4. package/dist/handlers/batchSummaryHandler.js +15 -8
  5. package/dist/handlers/batchSummaryHandler.js.map +1 -1
  6. package/dist/handlers/studentHandler.js +1 -1
  7. package/dist/handlers/studentHandler.js.map +1 -1
  8. package/dist/handlers/teachingSummaryHandler.js +38 -9
  9. package/dist/handlers/teachingSummaryHandler.js.map +1 -1
  10. package/dist/models/aiConfig.js +15 -2
  11. package/dist/models/aiConfig.js.map +1 -1
  12. package/dist/models/studentSummary.js +13 -0
  13. package/dist/models/studentSummary.js.map +1 -1
  14. package/dist/models/teachingSummary.js +2 -0
  15. package/dist/models/teachingSummary.js.map +1 -1
  16. package/dist/services/analyzers/errorClusterAnalyzer.js +1 -0
  17. package/dist/services/analyzers/errorClusterAnalyzer.js.map +1 -1
  18. package/dist/services/analyzers/findingConsolidator.js +172 -0
  19. package/dist/services/analyzers/findingConsolidator.js.map +1 -0
  20. package/dist/services/batchSummaryService.js +79 -38
  21. package/dist/services/batchSummaryService.js.map +1 -1
  22. package/dist/services/openaiClient.js +59 -28
  23. package/dist/services/openaiClient.js.map +1 -1
  24. package/dist/services/promptService.js +49 -24
  25. package/dist/services/promptService.js.map +1 -1
  26. package/dist/services/teachingAnalysisService.js +13 -2
  27. package/dist/services/teachingAnalysisService.js.map +1 -1
  28. package/dist/services/teachingSuggestionService.js +43 -44
  29. package/dist/services/teachingSuggestionService.js.map +1 -1
  30. package/frontend/admin/BudgetConfigForm.tsx +1 -1
  31. package/frontend/admin/ConfigPanel.tsx +53 -3
  32. package/frontend/admin/EndpointManager.tsx +1 -1
  33. package/frontend/admin/FeedbackForm.tsx +1 -1
  34. package/frontend/admin/JailbreakLogsViewer.tsx +1 -1
  35. package/frontend/admin/ScenarioModelSelector.tsx +238 -0
  36. package/frontend/admin/TelemetrySettings.tsx +1 -1
  37. package/frontend/admin/VersionBadge.tsx +1 -1
  38. package/frontend/admin/configTypes.ts +9 -0
  39. package/frontend/batchSummary/BatchSummaryPanel.tsx +29 -1
  40. package/frontend/batchSummary/StudentSummaryView.tsx +47 -14
  41. package/frontend/batchSummary/SummaryCard.tsx +1 -1
  42. package/frontend/batchSummary/useBatchSummary.ts +26 -8
  43. package/frontend/components/AIHelperDashboard.tsx +1 -1
  44. package/frontend/components/ErrorBoundary.tsx +1 -1
  45. package/frontend/components/ScoreboardTabContainer.tsx +1 -1
  46. package/frontend/generated/localeFallback.ts +1502 -0
  47. package/frontend/problem_detail.page.tsx +1 -1
  48. package/frontend/student/AIAssistantPanel.tsx +1 -1
  49. package/frontend/student/ChatInput.tsx +1 -1
  50. package/frontend/student/ChatMessageList.tsx +1 -1
  51. package/frontend/student/ThinkingBlock.tsx +1 -1
  52. package/frontend/student/hooks/useChatSession.ts +1 -1
  53. package/frontend/teacher/AnalyticsPage.tsx +1 -1
  54. package/frontend/teacher/ClassAnalyticsTable.tsx +1 -1
  55. package/frontend/teacher/ConversationDetail.tsx +1 -1
  56. package/frontend/teacher/ConversationDetailModal.tsx +1 -1
  57. package/frontend/teacher/ConversationList.tsx +1 -1
  58. package/frontend/teacher/CostDashboard.tsx +1 -1
  59. package/frontend/teacher/ExportDialog.tsx +1 -1
  60. package/frontend/teacher/MetricsPanel.tsx +1 -1
  61. package/frontend/teacher/ProblemAnalyticsTable.tsx +1 -1
  62. package/frontend/teacher/StudentAnalyticsTable.tsx +1 -1
  63. package/frontend/teacher/analyticsTypes.ts +1 -1
  64. package/frontend/teachingSummary/TeachingReviewPanel.tsx +1 -1
  65. package/frontend/teachingSummary/TeachingSummaryPanel.tsx +525 -175
  66. package/frontend/teachingSummary/useTeachingSummary.ts +10 -0
  67. package/frontend/utils/i18n.ts +32 -0
  68. package/frontend/utils/i18nFallbackCore.ts +30 -0
  69. package/locales/en.yaml +30 -6
  70. package/locales/zh.yaml +30 -6
  71. package/package.json +3 -1
@@ -0,0 +1,1502 @@
1
+ /**
2
+ * 自动生成文件,请勿手动修改 — 来源: locales/*.yaml
3
+ * 重新生成: npm run gen:locale
4
+ * 作用: 浏览器缓存了旧版翻译资源时的前端兜底字典(见 frontend/utils/i18n.ts)
5
+ */
6
+
7
+ export const LOCALE_FALLBACK: Record<'zh' | 'en', Record<string, string>> = {
8
+ "zh": {
9
+ "ai_helper_admin_apikey_decrypt_failed": "API Key 解密失败,请检查加密密钥配置",
10
+ "ai_helper_admin_budget_daily_domain": "全站日 Token 上限",
11
+ "ai_helper_admin_budget_daily_user": "每用户日 Token 上限",
12
+ "ai_helper_admin_budget_desc": "限制 AI 调用的 Token 用量,防止成本失控。设为 0 或留空表示不限制。",
13
+ "ai_helper_admin_budget_monthly_domain": "全站月 Token 上限",
14
+ "ai_helper_admin_budget_no_limit": "0 = 不限制",
15
+ "ai_helper_admin_budget_soft_limit": "软限阈值 (%)",
16
+ "ai_helper_admin_budget_soft_limit_hint": "达到此百分比时显示警告,100% 时硬拒绝",
17
+ "ai_helper_admin_budget_title": "Token 预算控制",
18
+ "ai_helper_admin_builtin_jailbreak_rules": "内置越狱规则(只读)",
19
+ "ai_helper_admin_config": "AI 配置",
20
+ "ai_helper_admin_config_incomplete": "AI 服务配置不完整,请先设置 API Base URL、模型名称和 API Key。",
21
+ "ai_helper_admin_config_not_exist": "AI 服务配置不存在,请先设置配置。",
22
+ "ai_helper_admin_config_subtitle": "管理 API 端点、模型选择与安全策略",
23
+ "ai_helper_admin_copied_to_clipboard": "已复制到剪贴板",
24
+ "ai_helper_admin_copy_fallback": "复制失败,请手动复制:",
25
+ "ai_helper_admin_copy_prompt": "请复制以下内容",
26
+ "ai_helper_admin_custom_jailbreak_rules": "自定义越狱规则(每行一个正则表达式)",
27
+ "ai_helper_admin_endpoint_add": "添加端点",
28
+ "ai_helper_admin_endpoint_add_first": "添加第一个端点",
29
+ "ai_helper_admin_endpoint_available_count": "{0} 个可用",
30
+ "ai_helper_admin_endpoint_click_fetch": "← 点击获取 API 支持的模型",
31
+ "ai_helper_admin_endpoint_complete_step2": "请先完成第 2 步",
32
+ "ai_helper_admin_endpoint_default_name": "端点",
33
+ "ai_helper_admin_endpoint_delete": "删除",
34
+ "ai_helper_admin_endpoint_enabled": "启用",
35
+ "ai_helper_admin_endpoint_fetch_models": "获取模型列表",
36
+ "ai_helper_admin_endpoint_fetching": "获取中...",
37
+ "ai_helper_admin_endpoint_key_configured": "已配置",
38
+ "ai_helper_admin_endpoint_key_keep": "留空保持不变",
39
+ "ai_helper_admin_endpoint_last_fetched": "上次获取",
40
+ "ai_helper_admin_endpoint_model_click_add": "点击添加到选中模型",
41
+ "ai_helper_admin_endpoint_model_selected": "已选中",
42
+ "ai_helper_admin_endpoint_models_fetched": "已获取 {0} 个模型",
43
+ "ai_helper_admin_endpoint_multi_config": "多端点配置",
44
+ "ai_helper_admin_endpoint_multi_desc": "支持多端点、自动故障转移、模型选择",
45
+ "ai_helper_admin_endpoint_name_placeholder": "端点名称",
46
+ "ai_helper_admin_endpoint_no_models_selected": "尚未选择模型。请在上方端点的可用模型列表中点击添加。",
47
+ "ai_helper_admin_endpoint_not_found": "端点不存在",
48
+ "ai_helper_admin_endpoint_priority_desc": "所有 AI 功能默认按此顺序调用模型,第一个失败自动切换下一个。如需让某个功能使用不同的模型,请在下方「场景模型分配」中单独指定,无需改动此列表。",
49
+ "ai_helper_admin_endpoint_priority_title": "全局默认模型(按顺序 Fallback)",
50
+ "ai_helper_admin_endpoint_quick_config": "快速配置(单端点)",
51
+ "ai_helper_admin_endpoint_recommended": "推荐",
52
+ "ai_helper_admin_endpoint_refetch": "重新获取",
53
+ "ai_helper_admin_endpoint_save_first": "请先保存端点",
54
+ "ai_helper_admin_endpoint_select_hint": "请至少点击一个模型以供学生使用",
55
+ "ai_helper_admin_endpoint_start_desc": "配置 API 端点以启用 AI 学习助手功能",
56
+ "ai_helper_admin_endpoint_start_title": "开始配置 AI 服务",
57
+ "ai_helper_admin_endpoint_step1": "填写端点信息",
58
+ "ai_helper_admin_endpoint_step2": "获取可用模型",
59
+ "ai_helper_admin_endpoint_step3": "选择启用的模型",
60
+ "ai_helper_admin_endpoint_title": "API 端点配置",
61
+ "ai_helper_admin_endpoint_unknown": "未知端点",
62
+ "ai_helper_admin_feedback_body": "详细描述",
63
+ "ai_helper_admin_feedback_body_placeholder": "详细描述遇到的问题、复现步骤或功能需求...",
64
+ "ai_helper_admin_feedback_desc": "向开发者提交 Bug 报告或功能建议。",
65
+ "ai_helper_admin_feedback_email": "联系邮箱",
66
+ "ai_helper_admin_feedback_email_placeholder": "方便开发者联系您",
67
+ "ai_helper_admin_feedback_network_error": "网络错误,请稍后再试",
68
+ "ai_helper_admin_feedback_optional": "可选",
69
+ "ai_helper_admin_feedback_subject": "主题",
70
+ "ai_helper_admin_feedback_subject_placeholder": "简要描述问题或建议",
71
+ "ai_helper_admin_feedback_submit": "提交反馈",
72
+ "ai_helper_admin_feedback_submitting": "提交中...",
73
+ "ai_helper_admin_feedback_title": "问题反馈",
74
+ "ai_helper_admin_feedback_type_bug": "Bug 报告",
75
+ "ai_helper_admin_feedback_type_feature": "功能建议",
76
+ "ai_helper_admin_feedback_type_label": "类型",
77
+ "ai_helper_admin_feedback_type_other": "其他",
78
+ "ai_helper_admin_feedback_warning": "请勿包含学生信息、API Key 或原始日志内容。",
79
+ "ai_helper_admin_fetch_models_failed": "获取模型列表失败",
80
+ "ai_helper_admin_fetch_models_params_missing": "请提供 endpointId 或者 apiBaseUrl + apiKey",
81
+ "ai_helper_admin_general_settings": "通用设置",
82
+ "ai_helper_admin_jailbreak_append_rule": "追加到自定义规则",
83
+ "ai_helper_admin_jailbreak_conversation_id": "会话 ID:",
84
+ "ai_helper_admin_jailbreak_copy_regex": "复制命中正则",
85
+ "ai_helper_admin_jailbreak_copy_text": "复制命中文本",
86
+ "ai_helper_admin_jailbreak_empty": "暂无命中记录,说明最近没有学生尝试修改系统提示词。",
87
+ "ai_helper_admin_jailbreak_load_failed": "加载日志失败",
88
+ "ai_helper_admin_jailbreak_matched_rule": "命中规则:",
89
+ "ai_helper_admin_jailbreak_next_page": "下一页",
90
+ "ai_helper_admin_jailbreak_page_info": "第 {0} / {1} 页",
91
+ "ai_helper_admin_jailbreak_pattern_placeholder": "忽略.*提示词",
92
+ "ai_helper_admin_jailbreak_prev_page": "上一页",
93
+ "ai_helper_admin_jailbreak_problem_id": "题目 ID:",
94
+ "ai_helper_admin_jailbreak_question_type": "问题类型:",
95
+ "ai_helper_admin_jailbreak_time": "时间:",
96
+ "ai_helper_admin_jailbreak_title": "越狱尝试记录",
97
+ "ai_helper_admin_jailbreak_total": "共 {0} 条记录",
98
+ "ai_helper_admin_jailbreak_user_id": "用户 ID:",
99
+ "ai_helper_admin_models_connection": "无法连接到 API 服务器,请检查 URL",
100
+ "ai_helper_admin_models_forbidden": "无权访问模型列表",
101
+ "ai_helper_admin_models_http_error": "获取模型列表失败: {0}",
102
+ "ai_helper_admin_models_invalid_key": "API Key 无效或已过期",
103
+ "ai_helper_admin_models_invalid_response": "API 返回格式无效:缺少 data 字段",
104
+ "ai_helper_admin_models_network_error": "网络错误: {0}",
105
+ "ai_helper_admin_models_not_supported": "该 API 不支持获取模型列表,请手动输入模型名称",
106
+ "ai_helper_admin_models_rate_limited": "获取模型列表请求太频繁,请稍后再试",
107
+ "ai_helper_admin_models_timeout": "请求超时 ({0} 秒)",
108
+ "ai_helper_admin_models_unknown_error": "获取模型列表失败: {0}",
109
+ "ai_helper_admin_no_builtin_rules": "暂无内置规则",
110
+ "ai_helper_admin_scenario_add_model": "+ 添加备选模型…",
111
+ "ai_helper_admin_scenario_add_model_override": "为此场景指定专属模型…",
112
+ "ai_helper_admin_scenario_custom": "已自定义",
113
+ "ai_helper_admin_scenario_desc": "仅当某个场景需要与全局不同的模型时才需在此配置(同样按顺序 Fallback)。保持「跟随全局」即使用上方「全局默认模型」列表。典型用法:强模型给低频的教学分析,性价比模型给高频的学生对话。",
114
+ "ai_helper_admin_scenario_effective_global": "当前生效(跟随全局):{0}",
115
+ "ai_helper_admin_scenario_follow_global": "跟随全局",
116
+ "ai_helper_admin_scenario_global_empty": "全局默认模型列表为空,该场景暂时无法调用 AI——请先在上方「全局默认模型」中添加模型。",
117
+ "ai_helper_admin_scenario_learning_summary": "学习总结",
118
+ "ai_helper_admin_scenario_learning_summary_desc": "批量为每位学生生成个性化学习总结。需要稳定遵循表格结构,按班级人数批量调用。",
119
+ "ai_helper_admin_scenario_no_models": "暂无可选模型:请先在上方端点中获取并保存模型列表。",
120
+ "ai_helper_admin_scenario_reset": "恢复跟随全局",
121
+ "ai_helper_admin_scenario_student_chat": "学生对话",
122
+ "ai_helper_admin_scenario_student_chat_desc": "学生答疑页面的多轮对话。调用量最大,建议选用响应快、中文自然的性价比模型。",
123
+ "ai_helper_admin_scenario_teaching_analysis": "教学分析",
124
+ "ai_helper_admin_scenario_teaching_analysis_desc": "生成班级问题发现报告、课后作业与深度诊断。每次作业仅调用数次,建议选用能力更强的模型。",
125
+ "ai_helper_admin_scenario_title": "场景模型分配",
126
+ "ai_helper_admin_system_prompt_placeholder": "你是一位耐心的算法学习导师...",
127
+ "ai_helper_admin_telemetry_data_1": "活跃用户数(7天内)、对话总数",
128
+ "ai_helper_admin_telemetry_data_2": "API 成功/失败率、平均响应时间",
129
+ "ai_helper_admin_telemetry_data_3": "插件版本、运行环境(Node.js 版本、操作系统)",
130
+ "ai_helper_admin_telemetry_data_4": "启用的功能(预算限制、多端点等)",
131
+ "ai_helper_admin_telemetry_data_5": "错误类型和频率(不含具体内容)",
132
+ "ai_helper_admin_telemetry_desc": "匿名使用数据帮助开发者改进插件。不采集学生对话内容、个人信息或 API 密钥。",
133
+ "ai_helper_admin_telemetry_disabled": "已禁用",
134
+ "ai_helper_admin_telemetry_enabled": "已启用",
135
+ "ai_helper_admin_telemetry_instance_id": "实例 ID",
136
+ "ai_helper_admin_telemetry_last_report": "最后上报",
137
+ "ai_helper_admin_telemetry_never": "从未",
138
+ "ai_helper_admin_telemetry_title": "遥测设置",
139
+ "ai_helper_admin_telemetry_update_failed": "更新遥测设置失败",
140
+ "ai_helper_admin_telemetry_version": "版本",
141
+ "ai_helper_admin_telemetry_what_collected": "采集了哪些数据?",
142
+ "ai_helper_admin_test_call_failed": "调用 AI 服务失败",
143
+ "ai_helper_admin_test_failed": "测试连接失败",
144
+ "ai_helper_admin_test_rate_limited": "测试连接请求太频繁,请稍后再试",
145
+ "ai_helper_admin_test_success": "连接成功!AI 服务配置正确。",
146
+ "ai_helper_admin_url_invalid": "API Base URL 不合法: {0}",
147
+ "ai_helper_admin_version_cached": "缓存",
148
+ "ai_helper_admin_version_cancel": "取消",
149
+ "ai_helper_admin_version_channel_edge": "开发版(edge)",
150
+ "ai_helper_admin_version_channel_edge_hint": "开发(edge)通道:跟踪 main 分支最新代码,仅建议开发者测试服务器使用。",
151
+ "ai_helper_admin_version_channel_stable": "稳定版",
152
+ "ai_helper_admin_version_channel_stable_hint": "稳定通道:只会更新到正式发布的版本(git tag)。",
153
+ "ai_helper_admin_version_checking": "检查中...",
154
+ "ai_helper_admin_version_checking_full": "正在检查版本...",
155
+ "ai_helper_admin_version_close": "关闭",
156
+ "ai_helper_admin_version_confirm": "确认更新",
157
+ "ai_helper_admin_version_confirm_title": "确认更新插件",
158
+ "ai_helper_admin_version_connection_lost": "连接中断(可能正在重启中),继续等待...",
159
+ "ai_helper_admin_version_current": "当前版本",
160
+ "ai_helper_admin_version_do_not_close": "正在执行更新,请勿关闭页面...",
161
+ "ai_helper_admin_version_force_update": "覆盖更新",
162
+ "ai_helper_admin_version_last_checked": "上次检查",
163
+ "ai_helper_admin_version_latest": "最新版本",
164
+ "ai_helper_admin_version_new_available": "有新版本可用!",
165
+ "ai_helper_admin_version_notice_1": "更新将执行 git pull、npm run build:plugin 和 pm2 restart",
166
+ "ai_helper_admin_version_notice_2": "HydroOJ 服务将短暂重启,可能导致数秒服务中断",
167
+ "ai_helper_admin_version_notice_3": "请确保当前没有重要操作正在进行",
168
+ "ai_helper_admin_version_notice_title": "注意事项",
169
+ "ai_helper_admin_version_one_click_update": "一键更新",
170
+ "ai_helper_admin_version_plugin_path": "插件路径",
171
+ "ai_helper_admin_version_refresh": "刷新",
172
+ "ai_helper_admin_version_server_error": "服务器错误",
173
+ "ai_helper_admin_version_server_error_continuing": "服务器响应异常(HTTP {0}),但更新仍在进行,继续等待...",
174
+ "ai_helper_admin_version_status": "状态",
175
+ "ai_helper_admin_version_success_message": "更新完成!页面将在 20 秒后自动刷新...",
176
+ "ai_helper_admin_version_target_edge": "当前为开发(edge)通道:本次将更新到 main 分支的最新代码,可能包含尚未测试的改动。",
177
+ "ai_helper_admin_version_target_stable": "本次将更新到最新正式发布版本(git tag vX.Y.Z)。",
178
+ "ai_helper_admin_version_title": "插件版本",
179
+ "ai_helper_admin_version_up_to_date": "已是最新版本",
180
+ "ai_helper_admin_version_update_failed_title": "更新失败",
181
+ "ai_helper_admin_version_update_request_failed": "更新请求失败",
182
+ "ai_helper_admin_version_update_success": "更新成功",
183
+ "ai_helper_admin_version_updating": "正在更新...",
184
+ "ai_helper_admin_version_view_release": "查看发布页",
185
+ "ai_helper_admin_version_waiting_output": "等待服务器输出...",
186
+ "ai_helper_analytics": "AI 使用统计",
187
+ "ai_helper_analytics_class_id": "班级",
188
+ "ai_helper_analytics_date_end": "结束日期",
189
+ "ai_helper_analytics_date_start": "开始日期",
190
+ "ai_helper_analytics_dimension_class": "按班级",
191
+ "ai_helper_analytics_dimension_label": "统计维度",
192
+ "ai_helper_analytics_dimension_problem": "按题目",
193
+ "ai_helper_analytics_dimension_student": "按学生",
194
+ "ai_helper_analytics_empty": "暂无数据,请调整筛选条件后重新查询。",
195
+ "ai_helper_analytics_error_prefix": "加载统计数据失败:",
196
+ "ai_helper_analytics_invalid_dimension": "dimension 参数必须为 class / problem / student 之一",
197
+ "ai_helper_analytics_loading": "加载中...",
198
+ "ai_helper_analytics_problem_id": "题目 ID",
199
+ "ai_helper_analytics_rate_limited": "统计请求太频繁,请稍后再试",
200
+ "ai_helper_analytics_search": "查询",
201
+ "ai_helper_analytics_title": "AI 使用统计",
202
+ "ai_helper_batch_summary": "AI 学习总结",
203
+ "ai_helper_batch_summary_cancel": "取消",
204
+ "ai_helper_batch_summary_collapse_all": "全部折叠",
205
+ "ai_helper_batch_summary_completed": "已完成",
206
+ "ai_helper_batch_summary_confirm_regenerate": "已有总结被编辑过,重新生成将覆盖。确认继续?",
207
+ "ai_helper_batch_summary_continue": "继续生成",
208
+ "ai_helper_batch_summary_delete": "删除",
209
+ "ai_helper_batch_summary_draft": "草稿",
210
+ "ai_helper_batch_summary_edit": "编辑",
211
+ "ai_helper_batch_summary_empty": "尚未生成 AI 学习总结,点击上方按钮开始生成",
212
+ "ai_helper_batch_summary_expand_all": "全部展开",
213
+ "ai_helper_batch_summary_export_csv": "导出 CSV",
214
+ "ai_helper_batch_summary_failed": "生成失败",
215
+ "ai_helper_batch_summary_generate": "生成 AI 学习总结",
216
+ "ai_helper_batch_summary_generate_new": "为 {0} 名新学生生成总结",
217
+ "ai_helper_batch_summary_generating": "正在生成 AI 总结...",
218
+ "ai_helper_batch_summary_loading": "加载中...",
219
+ "ai_helper_batch_summary_my_empty": "你的学习总结尚未发布。老师发布后会自动显示在这里。",
220
+ "ai_helper_batch_summary_my_load_failed": "学习总结加载失败,正在自动重试…",
221
+ "ai_helper_batch_summary_my_title": "AI 学习总结",
222
+ "ai_helper_batch_summary_no_new_students": "所有学生已生成总结,无需补充",
223
+ "ai_helper_batch_summary_no_students": "该作业暂无学生参与",
224
+ "ai_helper_batch_summary_pending": "待处理",
225
+ "ai_helper_batch_summary_progress": "已完成 {0} / {1} · {2} 失败",
226
+ "ai_helper_batch_summary_publish_all": "一键发布全部",
227
+ "ai_helper_batch_summary_publish_done": "已发布 {0} 份总结",
228
+ "ai_helper_batch_summary_publish_n_drafts": "发布 {0} 份草稿",
229
+ "ai_helper_batch_summary_publish_one": "发布",
230
+ "ai_helper_batch_summary_publish_skipped_failed": "{0} 名学生生成失败,未发布",
231
+ "ai_helper_batch_summary_publish_skipped_pending": "{0} 名学生尚未生成,未发布",
232
+ "ai_helper_batch_summary_published": "已发布",
233
+ "ai_helper_batch_summary_ref_submissions": "参考提交",
234
+ "ai_helper_batch_summary_regenerate": "重新生成",
235
+ "ai_helper_batch_summary_regenerate_all": "全部重新生成",
236
+ "ai_helper_batch_summary_regenerate_all_confirm": "将为所有学生重新生成总结,已编辑的内容将被覆盖。确认继续?",
237
+ "ai_helper_batch_summary_retry": "重试",
238
+ "ai_helper_batch_summary_retry_failed": "重试失败",
239
+ "ai_helper_batch_summary_retry_n_failed": "重试 {0} 个失败项",
240
+ "ai_helper_batch_summary_stats_completed": "已完成",
241
+ "ai_helper_batch_summary_stats_draft": "草稿",
242
+ "ai_helper_batch_summary_stats_failed": "失败",
243
+ "ai_helper_batch_summary_stats_not_generated": "未生成",
244
+ "ai_helper_batch_summary_stats_published": "已发布",
245
+ "ai_helper_batch_summary_stop": "停止",
246
+ "ai_helper_batch_summary_stopped_notice": "生成已停止,部分学生尚未处理。点击「继续生成」恢复。",
247
+ "ai_helper_budget_domain_daily_exceeded": "今日全站 AI 额度已用完,请明天再试",
248
+ "ai_helper_budget_domain_daily_warning": "全站 AI 额度即将用尽,请节约使用",
249
+ "ai_helper_budget_domain_monthly_exceeded": "本月全站 AI 额度已用完,请联系管理员",
250
+ "ai_helper_budget_domain_monthly_warning": "本月全站 AI 额度即将用尽",
251
+ "ai_helper_budget_user_daily_exceeded": "今天的 AI 额度已用完(已使用 {0} / {1} tokens)",
252
+ "ai_helper_budget_user_daily_warning": "AI 额度即将用尽(剩余约 {0} tokens)",
253
+ "ai_helper_config_advanced_section": "高级设置",
254
+ "ai_helper_config_api_base_url": "API Base URL",
255
+ "ai_helper_config_api_key_configured": "已配置:{0}",
256
+ "ai_helper_config_api_key_not_configured": "尚未配置 API Key",
257
+ "ai_helper_config_api_key_section": "API Key 设置",
258
+ "ai_helper_config_apikey_encrypt_failed": "API Key 加密失败",
259
+ "ai_helper_config_basic_section": "基础配置",
260
+ "ai_helper_config_current_api_key": "当前 API Key 状态",
261
+ "ai_helper_config_endpoint_encrypt_failed": "端点 \"{0}\" 的 API Key 加密失败",
262
+ "ai_helper_config_error_api_base_url_empty": "API Base URL 不能为空",
263
+ "ai_helper_config_error_load_failed": "加载配置失败:{0}",
264
+ "ai_helper_config_error_model_name_empty": "模型名称不能为空",
265
+ "ai_helper_config_error_rate_limit_invalid": "频率限制必须为非负整数(0 表示不限制)",
266
+ "ai_helper_config_error_save_failed": "保存配置失败:{0}",
267
+ "ai_helper_config_error_test_failed": "连接测试失败:{0}",
268
+ "ai_helper_config_error_timeout_invalid": "超时时间必须大于 0",
269
+ "ai_helper_config_get_failed": "获取配置失败",
270
+ "ai_helper_config_hide_api_key": "隐藏",
271
+ "ai_helper_config_jailbreak_logs_failed": "获取越狱日志失败",
272
+ "ai_helper_config_loading": "正在加载配置...",
273
+ "ai_helper_config_model_name": "模型名称",
274
+ "ai_helper_config_new_api_key": "新的 API Key(留空则不修改)",
275
+ "ai_helper_config_new_api_key_hint": "出于安全考虑,无法查看已保存的完整 API Key。输入新值将覆盖原有密钥,留空则保持不变。",
276
+ "ai_helper_config_rate_limit_hint": "每位学生每分钟最多可发送的 AI 对话次数,超出会提示稍后再试;填 0 表示不限制。仅作用于学生对话,不影响学习总结与教学分析。",
277
+ "ai_helper_config_rate_limit_invalid": "rateLimitPerMinute 必须为非负整数",
278
+ "ai_helper_config_rate_limit_per_minute": "学生对话频率限制(每人每分钟)",
279
+ "ai_helper_config_rate_limit_section": "频率限制",
280
+ "ai_helper_config_save": "保存配置",
281
+ "ai_helper_config_save_success": "配置已保存",
282
+ "ai_helper_config_saving": "保存中...",
283
+ "ai_helper_config_show_api_key": "显示",
284
+ "ai_helper_config_system_prompt": "System Prompt 模板",
285
+ "ai_helper_config_system_prompt_hint": "AI 助手的系统提示词,定义其角色和行为规范",
286
+ "ai_helper_config_test_connection": "测试连接",
287
+ "ai_helper_config_test_failed": "连接失败,AI 服务不可用",
288
+ "ai_helper_config_test_success": "连接成功,AI 服务可用",
289
+ "ai_helper_config_testing": "测试中...",
290
+ "ai_helper_config_timeout_hint": "等待 AI 返回单次回答的最长时间;慢速模型或长回答建议设为 60 秒以上。",
291
+ "ai_helper_config_timeout_invalid": "timeoutSeconds 必须大于 0",
292
+ "ai_helper_config_timeout_seconds": "AI 请求超时时间(秒)",
293
+ "ai_helper_config_title": "AI 学习助手配置",
294
+ "ai_helper_config_update_failed": "更新配置失败",
295
+ "ai_helper_conversations": "AI 对话记录",
296
+ "ai_helper_cost_rate_limited": "请求太频繁,请稍后再试",
297
+ "ai_helper_cost_user_fallback": "用户 {0}",
298
+ "ai_helper_dashboard_subtitle": "管理 AI 助手对话、查看统计数据及系统配置",
299
+ "ai_helper_dashboard_tab_analytics": "使用统计",
300
+ "ai_helper_dashboard_tab_config": "AI 配置",
301
+ "ai_helper_dashboard_tab_conversations": "对话记录",
302
+ "ai_helper_dashboard_tab_cost": "成本分析",
303
+ "ai_helper_dashboard_tab_teaching_review": "教学总结回顾",
304
+ "ai_helper_err_ai_aborted": "请求已取消",
305
+ "ai_helper_err_ai_auth": "AI 服务认证失败,请联系管理员检查配置",
306
+ "ai_helper_err_ai_client": "AI 服务配置错误,请联系管理员",
307
+ "ai_helper_err_ai_network": "无法连接到 AI 服务,请稍后再试",
308
+ "ai_helper_err_ai_rate_limit": "AI 服务繁忙,请稍后再试",
309
+ "ai_helper_err_ai_server": "AI 服务暂时不可用,请稍后再试",
310
+ "ai_helper_err_ai_timeout": "AI 服务响应超时,请稍后再试",
311
+ "ai_helper_err_ai_unavailable": "AI 服务暂时不可用,请稍后重试",
312
+ "ai_helper_err_ai_unknown": "AI 服务异常,请稍后再试",
313
+ "ai_helper_err_budget_exceeded": "AI 额度已用完,请稍后再试",
314
+ "ai_helper_err_chat_rate_limited": "提问太频繁了,请仔细思考后再提问",
315
+ "ai_helper_err_clarify_needs_conversation": "追问功能需要基于已有会话",
316
+ "ai_helper_err_clarify_needs_selection": "追问功能需要选中 AI 回复中的内容",
317
+ "ai_helper_err_clarify_off_topic": "这个内容与编程学习无关,我无法解释。请选中 AI 回复中与代码或算法相关的部分来追问。",
318
+ "ai_helper_err_clarify_source_invalid": "来源消息不存在或不是 AI 回复",
319
+ "ai_helper_err_clarify_source_mismatch": "来源消息不属于当前会话",
320
+ "ai_helper_err_clarify_text_not_found": "选中文本不在来源消息内容中",
321
+ "ai_helper_err_code_too_long": "代码片段过长(最多 {0} 字符)",
322
+ "ai_helper_err_code_truncated": "代码已截断到 {0} 字符",
323
+ "ai_helper_err_contest_check_failed": "比赛状态校验失败,请稍后重试",
324
+ "ai_helper_err_contest_restricted": "比赛期间 AI 助手不可用,请独立完成作答",
325
+ "ai_helper_err_conversation_access_denied": "无权访问此会话",
326
+ "ai_helper_err_conversation_not_found": "会话不存在",
327
+ "ai_helper_err_input_validation_failed": "输入验证失败",
328
+ "ai_helper_err_internal": "服务器内部错误,请稍后重试",
329
+ "ai_helper_err_invalid_conversation_id": "无效的会话 ID",
330
+ "ai_helper_err_invalid_message_source": "无效的消息来源 ID",
331
+ "ai_helper_err_invalid_problem_id": "无效的题目 ID",
332
+ "ai_helper_err_invalid_question_type": "无效的问题类型",
333
+ "ai_helper_err_jailbreak_detected": "当前输入中包含与系统规则冲突的指令。请专注描述你对题目的理解、思路或遇到的具体错误,而不要尝试修改系统设定。",
334
+ "ai_helper_err_off_topic_reply": "这个追问与当前编程题无关。请贴出你的代码片段、报错信息或你已尝试的思路,我再继续帮你。",
335
+ "ai_helper_err_optimize_requires_ac": "代码优化功能仅对已通过该题的用户开放",
336
+ "ai_helper_err_problem_not_found": "题目不存在",
337
+ "ai_helper_err_rate_limited": "请求太频繁,请稍后再试",
338
+ "ai_helper_err_thinking_too_long": "描述过长(最多 {0} 字)",
339
+ "ai_helper_export_button": "导出数据",
340
+ "ai_helper_export_cancel": "取消",
341
+ "ai_helper_export_confirm": "导出",
342
+ "ai_helper_export_failed": "数据导出失败",
343
+ "ai_helper_export_filters_label": "导出范围预览",
344
+ "ai_helper_export_format_csv": "CSV(兼容 Excel)",
345
+ "ai_helper_export_format_hint": "暂时仅支持 CSV 格式,后续可扩展为 Excel。",
346
+ "ai_helper_export_format_label": "导出格式",
347
+ "ai_helper_export_invalid_end_date": "无效的结束日期: {0}",
348
+ "ai_helper_export_invalid_start_date": "无效的开始日期: {0}",
349
+ "ai_helper_export_rate_limited": "导出请求太频繁,请稍后再试",
350
+ "ai_helper_export_sensitive_hint": "建议在对外分享时关闭此选项;关闭时会使用匿名 ID 替代真实学生账号。",
351
+ "ai_helper_export_sensitive_label": "包含真实学生 ID(敏感数据)",
352
+ "ai_helper_export_title": "导出对话数据",
353
+ "ai_helper_export_unsupported_format": "当前仅支持 CSV 导出(format=csv)",
354
+ "ai_helper_feedback_body_too_long": "描述不能超过 {0} 字符",
355
+ "ai_helper_feedback_failed": "提交反馈失败",
356
+ "ai_helper_feedback_invalid_type": "反馈类型必须为 bug、feature 或 other",
357
+ "ai_helper_feedback_subject_required": "请填写反馈主题",
358
+ "ai_helper_feedback_subject_too_long": "主题不能超过 {0} 字符",
359
+ "ai_helper_feedback_submit_failed": "反馈提交失败,请稍后再试",
360
+ "ai_helper_feedback_success": "反馈已提交,感谢您的意见!",
361
+ "ai_helper_problem_fallback_prefix": "题目",
362
+ "ai_helper_problem_fallback_title": "题目 {0}",
363
+ "ai_helper_safety_code_truncated": "代码已被截断(教学模式不展示完整实现)",
364
+ "ai_helper_safety_off_topic_replacement": "该话题",
365
+ "ai_helper_scoreboard_tab_learning": "学习总结",
366
+ "ai_helper_scoreboard_tab_main": "成绩表",
367
+ "ai_helper_scoreboard_tab_teaching": "教学分析",
368
+ "ai_helper_student_ai_assistant": "AI 助手",
369
+ "ai_helper_student_analyze_problem": "请帮我分析这道题",
370
+ "ai_helper_student_attach_code": "附带代码",
371
+ "ai_helper_student_attach_current_code": "附带当前代码",
372
+ "ai_helper_student_attached_code": "附带的代码",
373
+ "ai_helper_student_cancel": "取消",
374
+ "ai_helper_student_cannot_get_problem": "无法获取题目信息",
375
+ "ai_helper_student_chars": "字符",
376
+ "ai_helper_student_clarify_template": "我不太理解这段内容:「{text}」\n能再解释一下吗?",
377
+ "ai_helper_student_code_attached": "已附带代码",
378
+ "ai_helper_student_code_truncated": "代码已截断",
379
+ "ai_helper_student_collapse": "收起",
380
+ "ai_helper_student_collapse_panel": "收起面板",
381
+ "ai_helper_student_contest_desc_line1": "比赛期间 AI 助手不可用",
382
+ "ai_helper_student_contest_desc_line2": "请独立完成作答,加油!",
383
+ "ai_helper_student_contest_restricted": "比赛期间 AI 助手不可用",
384
+ "ai_helper_student_contest_title": "比赛模式",
385
+ "ai_helper_student_debug_auto_attach": "(将自动附带你的代码)",
386
+ "ai_helper_student_dont_understand": "这段没看懂",
387
+ "ai_helper_student_err_ai_service": "AI 服务异常,请稍后重试",
388
+ "ai_helper_student_err_bad_response": "AI 返回了无法解析的响应",
389
+ "ai_helper_student_err_cancelled": "请求已取消",
390
+ "ai_helper_student_err_empty_response": "AI 返回了空响应",
391
+ "ai_helper_student_err_enter_followup": "请输入追问内容",
392
+ "ai_helper_student_err_network_offline": "网络连接已断开,请检查网络后重试",
393
+ "ai_helper_student_err_paste_code": "请粘贴你的代码",
394
+ "ai_helper_student_err_read_problem": "无法读取题目信息,请手动输入",
395
+ "ai_helper_student_err_read_problem_failed": "读取题目信息失败",
396
+ "ai_helper_student_err_request_failed": "请求失败,请稍后重试",
397
+ "ai_helper_student_err_select_type": "请先选择问题类型",
398
+ "ai_helper_student_err_timeout": "请求超时,请稍后重试",
399
+ "ai_helper_student_followup_continue": "请继续",
400
+ "ai_helper_student_load_ac_code": "加载 AC 代码",
401
+ "ai_helper_student_load_ac_confirm": "检测到你有已通过的代码,是否加载到编辑器中进行优化?",
402
+ "ai_helper_student_load_ac_warning": "这会覆盖编辑器中当前的代码",
403
+ "ai_helper_student_loading": "AI 正在思考...",
404
+ "ai_helper_student_manual_title_placeholder": "请手动输入题目名称",
405
+ "ai_helper_student_me": "我",
406
+ "ai_helper_student_new_conversation": "新对话",
407
+ "ai_helper_student_open_panel": "打开 AI 助手面板",
408
+ "ai_helper_student_optimize_code_required": "代码优化需要附带代码",
409
+ "ai_helper_student_panel_title": "AI 学习助手",
410
+ "ai_helper_student_placeholder_first": "描述你对这道题的理解、已有思路或遇到的困惑...",
411
+ "ai_helper_student_placeholder_followup": "继续描述你的想法或疑问...",
412
+ "ai_helper_student_qt_debug": "调试代码",
413
+ "ai_helper_student_qt_optimize": "代码优化",
414
+ "ai_helper_student_qt_think": "没思路",
415
+ "ai_helper_student_qt_understand": "看不懂题",
416
+ "ai_helper_student_qtd_debug": "帮你分析代码中的逻辑错误",
417
+ "ai_helper_student_qtd_optimize": "帮你优化已通过的代码,提高效率或可读性",
418
+ "ai_helper_student_qtd_think": "引导你分析思路,不会直接给答案",
419
+ "ai_helper_student_qtd_understand": "帮你理解题意、分析输入输出样例",
420
+ "ai_helper_student_remove": "移除",
421
+ "ai_helper_student_render_error": "页面渲染出错",
422
+ "ai_helper_student_required": "必填",
423
+ "ai_helper_student_resize_panel": "拖拽调整宽度",
424
+ "ai_helper_student_retry": "重试",
425
+ "ai_helper_student_select_type": "选择问题类型",
426
+ "ai_helper_student_send_shortcut": "发送 (Ctrl+Enter)",
427
+ "ai_helper_student_thinking": "正在深度思考...",
428
+ "ai_helper_student_unknown_error": "未知错误",
429
+ "ai_helper_student_use_current_code": "使用当前代码",
430
+ "ai_helper_student_welcome_desc_line1": "选择问题类型,描述你的思路或困惑",
431
+ "ai_helper_student_welcome_desc_line2": "我会引导你一步步理解和解决问题",
432
+ "ai_helper_student_welcome_title": "你好,我是 AI 学习助手",
433
+ "ai_helper_teacher_analytics_ac_rate": "AC率",
434
+ "ai_helper_teacher_analytics_actions": "操作",
435
+ "ai_helper_teacher_analytics_avg_msgs": "平均消息数",
436
+ "ai_helper_teacher_analytics_avg_per_student": "人均对话数",
437
+ "ai_helper_teacher_analytics_avg_rounds": "平均轮次",
438
+ "ai_helper_teacher_analytics_avg_subs": "平均提交数",
439
+ "ai_helper_teacher_analytics_by_class": "按班级",
440
+ "ai_helper_teacher_analytics_by_problem": "按题目",
441
+ "ai_helper_teacher_analytics_by_student": "按学生",
442
+ "ai_helper_teacher_analytics_clarify": "追问",
443
+ "ai_helper_teacher_analytics_column_settings": "列设置",
444
+ "ai_helper_teacher_analytics_debug": "调试代码",
445
+ "ai_helper_teacher_analytics_dimension": "统计维度",
446
+ "ai_helper_teacher_analytics_effective_conversations": "深度互动数",
447
+ "ai_helper_teacher_analytics_effective_ratio": "深度互动率",
448
+ "ai_helper_teacher_analytics_last_used": "最近使用",
449
+ "ai_helper_teacher_analytics_load_failed": "加载统计数据失败",
450
+ "ai_helper_teacher_analytics_loading": "正在加载统计数据...",
451
+ "ai_helper_teacher_analytics_no_data": "暂无统计数据,请调整筛选条件后查询。",
452
+ "ai_helper_teacher_analytics_optimize": "优化",
453
+ "ai_helper_teacher_analytics_participating_students": "参与学生数",
454
+ "ai_helper_teacher_analytics_problem": "题目",
455
+ "ai_helper_teacher_analytics_show_columns": "显示列",
456
+ "ai_helper_teacher_analytics_student_count": "学生数",
457
+ "ai_helper_teacher_analytics_student_search": "搜索学生",
458
+ "ai_helper_teacher_analytics_student_search_placeholder": "输入学生姓名或ID...",
459
+ "ai_helper_teacher_analytics_subtitle": "查看学生使用 AI 助手的统计数据",
460
+ "ai_helper_teacher_analytics_think": "没思路",
461
+ "ai_helper_teacher_analytics_title": "使用统计",
462
+ "ai_helper_teacher_analytics_total_conversations": "总对话数",
463
+ "ai_helper_teacher_analytics_understand": "看不懂题",
464
+ "ai_helper_teacher_cancel": "取消",
465
+ "ai_helper_teacher_close": "关闭",
466
+ "ai_helper_teacher_conv_attached_code": "附带代码",
467
+ "ai_helper_teacher_conv_back_to_list": "返回列表",
468
+ "ai_helper_teacher_conv_col_class": "班级",
469
+ "ai_helper_teacher_conv_col_effective": "学习信号",
470
+ "ai_helper_teacher_conv_col_effective_tooltip": "消息互动深度 · 对话后提交行为 · AC状态",
471
+ "ai_helper_teacher_conv_col_messages": "消息数",
472
+ "ai_helper_teacher_conv_col_problem": "题目",
473
+ "ai_helper_teacher_conv_col_start_time": "开始时间",
474
+ "ai_helper_teacher_conv_col_student": "学生",
475
+ "ai_helper_teacher_conv_col_summary": "摘要",
476
+ "ai_helper_teacher_conv_content": "对话内容",
477
+ "ai_helper_teacher_conv_current_page_prefix": "当前第",
478
+ "ai_helper_teacher_conv_current_page_suffix": "页",
479
+ "ai_helper_teacher_conv_detail_subtitle": "查看完整的师生对话内容",
480
+ "ai_helper_teacher_conv_detail_title": "对话详情",
481
+ "ai_helper_teacher_conv_effective_conv": "有效对话",
482
+ "ai_helper_teacher_conv_empty": "暂无对话记录,请调整筛选条件后重新查询。",
483
+ "ai_helper_teacher_conv_end": "结束:",
484
+ "ai_helper_teacher_conv_end_time": "结束时间",
485
+ "ai_helper_teacher_conv_ineffective_conv": "无效对话",
486
+ "ai_helper_teacher_conv_loading": "正在加载对话记录...",
487
+ "ai_helper_teacher_conv_not_found": "对话不存在",
488
+ "ai_helper_teacher_conv_session_info": "会话信息",
489
+ "ai_helper_teacher_conv_start": "开始:",
490
+ "ai_helper_teacher_conv_student_code": "学生代码",
491
+ "ai_helper_teacher_conv_subtitle": "查看学生与 AI 助手的对话历史",
492
+ "ai_helper_teacher_conv_tags": "标签",
493
+ "ai_helper_teacher_conv_teacher_note": "教师备注",
494
+ "ai_helper_teacher_conv_title": "对话记录",
495
+ "ai_helper_teacher_conv_total_prefix": "共",
496
+ "ai_helper_teacher_conv_total_records": "条记录,",
497
+ "ai_helper_teacher_conv_view_problem": "查看题目",
498
+ "ai_helper_teacher_conversation_forbidden": "无权访问此对话",
499
+ "ai_helper_teacher_conversation_not_found": "会话不存在",
500
+ "ai_helper_teacher_cost_avg": "平均",
501
+ "ai_helper_teacher_cost_budget_usage": "预算使用",
502
+ "ai_helper_teacher_cost_col_cost": "费用",
503
+ "ai_helper_teacher_cost_col_model": "模型",
504
+ "ai_helper_teacher_cost_col_requests": "请求数",
505
+ "ai_helper_teacher_cost_col_user": "用户",
506
+ "ai_helper_teacher_cost_cost": "费用",
507
+ "ai_helper_teacher_cost_daily_trend": "日趋势",
508
+ "ai_helper_teacher_cost_model_distribution": "模型分布",
509
+ "ai_helper_teacher_cost_monthly_total": "本月累计",
510
+ "ai_helper_teacher_cost_not_set": "未设置",
511
+ "ai_helper_teacher_cost_per_request": "次",
512
+ "ai_helper_teacher_cost_requests": "次请求",
513
+ "ai_helper_teacher_cost_summary": "汇总",
514
+ "ai_helper_teacher_cost_this_month": "本月",
515
+ "ai_helper_teacher_cost_this_week": "本周",
516
+ "ai_helper_teacher_cost_title": "成本分析",
517
+ "ai_helper_teacher_cost_today": "今日",
518
+ "ai_helper_teacher_cost_top_users": "Top 用户",
519
+ "ai_helper_teacher_deleted_user": "已删除用户",
520
+ "ai_helper_teacher_effective": "积极探索",
521
+ "ai_helper_teacher_export_all": "导出全部数据",
522
+ "ai_helper_teacher_export_btn": "导出",
523
+ "ai_helper_teacher_export_csv_label": "CSV(兼容 Excel)",
524
+ "ai_helper_teacher_export_csv_note": "暂时仅支持 CSV 格式,后续可扩展为 Excel。",
525
+ "ai_helper_teacher_export_data": "导出数据",
526
+ "ai_helper_teacher_export_format": "导出格式",
527
+ "ai_helper_teacher_export_include_metrics": "包含对话信号数据",
528
+ "ai_helper_teacher_export_include_sensitive": "包含真实学生 ID(敏感数据)",
529
+ "ai_helper_teacher_export_metrics_note": "追加详细信号列(消息数、提交数、AC位置、题目难度)",
530
+ "ai_helper_teacher_export_preview": "导出范围预览",
531
+ "ai_helper_teacher_export_sensitive_note": "建议在对外分享时关闭此选项;关闭时会使用匿名 ID 替代真实学生账号。",
532
+ "ai_helper_teacher_export_time_range": "时间范围:",
533
+ "ai_helper_teacher_export_title": "导出对话数据",
534
+ "ai_helper_teacher_export_unlimited": "不限",
535
+ "ai_helper_teacher_filter_class_id": "班级",
536
+ "ai_helper_teacher_filter_class_id_optional": "可选",
537
+ "ai_helper_teacher_filter_end_date": "结束日期",
538
+ "ai_helper_teacher_filter_problem_id": "题目 ID",
539
+ "ai_helper_teacher_filter_problem_id_optional": "可选",
540
+ "ai_helper_teacher_filter_problem_id_placeholder": "输入题目 ID",
541
+ "ai_helper_teacher_filter_start_date": "开始日期",
542
+ "ai_helper_teacher_filter_student_id": "学生 ID",
543
+ "ai_helper_teacher_filter_title": "筛选条件",
544
+ "ai_helper_teacher_ineffective": "互动较少",
545
+ "ai_helper_teacher_invalid_conversation_id": "无效的会话 ID",
546
+ "ai_helper_teacher_load_failed": "加载失败:HTTP ",
547
+ "ai_helper_teacher_load_failed_network": "网络错误,加载失败",
548
+ "ai_helper_teacher_loading": "加载中...",
549
+ "ai_helper_teacher_metrics_avg_length": "平均消息长度",
550
+ "ai_helper_teacher_metrics_chars": "字符",
551
+ "ai_helper_teacher_metrics_context": "题目上下文",
552
+ "ai_helper_teacher_metrics_difficulty": "难度 (AC率)",
553
+ "ai_helper_teacher_metrics_disclaimer": "这些信号基于自动化行为分析,反映互动模式而非学习评分。不同学生有不同学习风格——低消息量可能代表本地实验型学习者,而非缺乏投入。",
554
+ "ai_helper_teacher_metrics_engagement": "互动深度",
555
+ "ai_helper_teacher_metrics_first_ac": "首次AC位置",
556
+ "ai_helper_teacher_metrics_msg_count": "学生消息数",
557
+ "ai_helper_teacher_metrics_none": "无",
558
+ "ai_helper_teacher_metrics_outcome": "学习结果",
559
+ "ai_helper_teacher_metrics_submission_n": "第{0}次提交",
560
+ "ai_helper_teacher_metrics_subs_after": "对话后提交次数",
561
+ "ai_helper_teacher_metrics_title": "学习信号",
562
+ "ai_helper_teacher_metrics_unknown": "未知",
563
+ "ai_helper_teacher_next_item": "下一条",
564
+ "ai_helper_teacher_next_page": "下一页",
565
+ "ai_helper_teacher_no": "否",
566
+ "ai_helper_teacher_no_data": "暂无数据",
567
+ "ai_helper_teacher_page_prefix": "第",
568
+ "ai_helper_teacher_page_suffix": "页",
569
+ "ai_helper_teacher_prev_item": "上一条",
570
+ "ai_helper_teacher_prev_page": "上一页",
571
+ "ai_helper_teacher_qtype_debug": "调试代码",
572
+ "ai_helper_teacher_qtype_think": "没思路",
573
+ "ai_helper_teacher_qtype_understand": "看不懂题",
574
+ "ai_helper_teacher_query": "查询",
575
+ "ai_helper_teacher_querying": "查询中...",
576
+ "ai_helper_teacher_request_failed": "请求失败",
577
+ "ai_helper_teacher_retry": "重试",
578
+ "ai_helper_teacher_role_ai": "AI 助手",
579
+ "ai_helper_teacher_role_student": "学生",
580
+ "ai_helper_teacher_search": "搜索",
581
+ "ai_helper_teacher_signal_ac": "AC",
582
+ "ai_helper_teacher_signal_messages": "消息",
583
+ "ai_helper_teacher_signal_no_ac": "未AC",
584
+ "ai_helper_teacher_signal_no_problem": "无关联题目",
585
+ "ai_helper_teacher_signal_no_submission": "无提交",
586
+ "ai_helper_teacher_signal_pending": "处理中",
587
+ "ai_helper_teacher_signal_pending_tooltip": "数据同步中(通常在对话后30分钟内完成)",
588
+ "ai_helper_teacher_signal_submissions": "提交",
589
+ "ai_helper_teacher_view_conversations": "查看对话",
590
+ "ai_helper_teacher_view_detail": "查看详情",
591
+ "ai_helper_teacher_yes": "是",
592
+ "ai_helper_teaching_ai_user_note": "基于 {0} 名使用 AI 助手的学生数据",
593
+ "ai_helper_teaching_code_samples": "代表性代码样本",
594
+ "ai_helper_teaching_copy_warning": "注意:高度一致的错误可能涉及代码共享",
595
+ "ai_helper_teaching_deep_dive": "深度分析",
596
+ "ai_helper_teaching_detail": "查看详情",
597
+ "ai_helper_teaching_exists_confirm": "该作业已有教学建议,是否重新生成?",
598
+ "ai_helper_teaching_feedback_prompt": "这份教学建议对您有帮助吗?",
599
+ "ai_helper_teaching_feedback_thanks": "感谢您的反馈!",
600
+ "ai_helper_teaching_findings": "发现的问题",
601
+ "ai_helper_teaching_focus_placeholder": "本次教学重点(可选)",
602
+ "ai_helper_teaching_generate": "生成教学建议",
603
+ "ai_helper_teaching_generating": "正在生成教学建议...",
604
+ "ai_helper_teaching_no_data": "参与人数过少,统计结果可能不具代表性",
605
+ "ai_helper_teaching_overview": "概览",
606
+ "ai_helper_teaching_regenerate": "重新生成",
607
+ "ai_helper_teaching_severity_high": "高优先",
608
+ "ai_helper_teaching_severity_low": "低优先",
609
+ "ai_helper_teaching_severity_medium": "中优先",
610
+ "ai_helper_teaching_snapshot_time": "数据截止时间",
611
+ "ai_helper_teaching_student_list": "涉及学生列表",
612
+ "ai_helper_teaching_students_affected": "涉及 {0} 名学生",
613
+ "ai_helper_teaching_suggestion": "AI 教学建议",
614
+ "ai_helper_update_adding_remote": "添加远程仓库",
615
+ "ai_helper_update_all_fetch_failed": "所有仓库 git fetch 均失败: {0}",
616
+ "ai_helper_update_all_repos_failed": "所有仓库连接测试失败,使用默认仓库",
617
+ "ai_helper_update_backing_up_version": "备份当前版本...",
618
+ "ai_helper_update_build_complete": "编译完成",
619
+ "ai_helper_update_build_failed": "npm run build:plugin 失败: {0}",
620
+ "ai_helper_update_building": "正在编译项目(原子化构建)...",
621
+ "ai_helper_update_cannot_acquire_lock": "无法获取更新锁",
622
+ "ai_helper_update_cannot_get_version": "无法获取当前版本(无法建立回滚点),已中止更新: {0}",
623
+ "ai_helper_update_cannot_list_tags": "无法获取版本标签列表: {0}",
624
+ "ai_helper_update_cannot_resolve_remote": "无法解析远程版本(origin/main): {0}",
625
+ "ai_helper_update_cannot_resolve_tag": "无法解析发布标签 {0}: {1}",
626
+ "ai_helper_update_channel": "更新通道: {0}",
627
+ "ai_helper_update_check_git_status_hint": "建议:检查 git 仓库状态(例如 git status / git rev-parse HEAD)后重试更新。",
628
+ "ai_helper_update_check_pm2_logs_hint": "如果更新后服务异常,请检查 pm2 日志: pm2 logs hydrooj",
629
+ "ai_helper_update_checking_git": "检查 git 是否已安装...",
630
+ "ai_helper_update_checking_write_permission": "正在检查写入权限...",
631
+ "ai_helper_update_checkout_failed": "切换到 main 分支失败: {0}",
632
+ "ai_helper_update_cleaning_deps": "正在清理依赖包...",
633
+ "ai_helper_update_cleaning_old_deps": "未找到 package-lock.json,正在清理旧依赖包...",
634
+ "ai_helper_update_code_rolled_back": "代码已回滚到更新前的版本",
635
+ "ai_helper_update_complete": "更新完成!页面将在 20 秒后自动刷新...",
636
+ "ai_helper_update_concurrent_in_memory": "更新操作正在进行中(进程内锁),请等待当前更新完成后再试",
637
+ "ai_helper_update_concurrent_rejected_file_lock": "并发更新被拒绝(文件锁)",
638
+ "ai_helper_update_concurrent_rejected_in_memory": "并发更新被拒绝(进程内锁)",
639
+ "ai_helper_update_current_version": "当前版本: {0}",
640
+ "ai_helper_update_deps_clean_warning": "清理依赖包警告",
641
+ "ai_helper_update_deps_cleaned": "依赖包已清理",
642
+ "ai_helper_update_deps_install_failed": "依赖安装失败: {0}",
643
+ "ai_helper_update_deps_install_failed_scripts_hint": "依赖安装失败(提示:默认禁用 npm scripts 以提高安全性;如确需启用,请设置 AI_HELPER_UPDATE_ALLOW_NPM_SCRIPTS=1): {0}",
644
+ "ai_helper_update_deps_installed": "依赖包安装完成",
645
+ "ai_helper_update_deps_reinstall_failed": "⚠️ 警告:依赖包重装失败,服务可能无法正常启动",
646
+ "ai_helper_update_deps_restored": "依赖包已恢复",
647
+ "ai_helper_update_detecting_best_repo": "正在检测最优仓库...",
648
+ "ai_helper_update_detecting_network": "正在检测网络环境...",
649
+ "ai_helper_update_detecting_path": "检测插件路径: {0}",
650
+ "ai_helper_update_dist_rebuild_failed": "⚠️ 警告:dist 重建失败,服务可能无法正常启动",
651
+ "ai_helper_update_dist_rebuilt": "dist 重建完成",
652
+ "ai_helper_update_failed": "更新失败",
653
+ "ai_helper_update_fallback_process_exit": "将改用进程退出触发 PM2 自动重启",
654
+ "ai_helper_update_fallback_success": "回退到 {0} 成功",
655
+ "ai_helper_update_fetch_complete": "远程代码获取完成",
656
+ "ai_helper_update_fetch_failed": "当前仓库 fetch 失败",
657
+ "ai_helper_update_fetching_latest": "正在获取远程最新代码...",
658
+ "ai_helper_update_fetching_remote": "正在获取远程代码...",
659
+ "ai_helper_update_fetching_tags": "正在获取发布标签(tag)...",
660
+ "ai_helper_update_fully_rolled_back": "已完全回滚到更新前的状态",
661
+ "ai_helper_update_git_detect_failed": "Git 仓库检测失败: {0}",
662
+ "ai_helper_update_git_init_complete": "git 仓库初始化完成(已获取远程对象,待签名验证通过后切换到 main)",
663
+ "ai_helper_update_git_init_failed": "git 仓库初始化失败",
664
+ "ai_helper_update_git_install_complete": "git 安装完成",
665
+ "ai_helper_update_git_install_failed": "自动安装 git 失败",
666
+ "ai_helper_update_git_installed": "git 已安装",
667
+ "ai_helper_update_git_installed_but_unusable": "git 安装完成但仍无法使用,可能需要重启终端",
668
+ "ai_helper_update_git_manual_install_required": "需要手动安装 Git",
669
+ "ai_helper_update_git_not_found": "未检测到 git,尝试自动安装...",
670
+ "ai_helper_update_git_not_installed": "git 未安装且无法自动安装",
671
+ "ai_helper_update_gpg_bad_signature": "GPG 签名无效(可能被篡改)。拒绝更新以保护系统安全。",
672
+ "ai_helper_update_gpg_no_fingerprint": "无法从签名中提取完整指纹。",
673
+ "ai_helper_update_gpg_no_pubkey": "无法验证签名:缺少公钥。请确认服务器已安装 gpg,且插件内置发布者公钥文件未缺失/未损坏。",
674
+ "ai_helper_update_gpg_no_signature": "上游仓库未启用 GPG 签名。为确保代码来源可信,请要求插件作者启用 commit 签名。",
675
+ "ai_helper_update_gpg_not_found": "未检测到可用的 gpg(GnuPG)。为保证一键更新安全性(强制签名校验),请先安装 gpg 后重试。",
676
+ "ai_helper_update_gpg_passed": "✓ GPG 签名验证通过,代码来源可信",
677
+ "ai_helper_update_gpg_untrusted_fingerprint": "签名指纹 {0} 不在信任列表中。这可能意味着代码不是由官方发布者签名。",
678
+ "ai_helper_update_gpg_verified": "✓ GPG 签名验证通过,代码来自可信发布者({0})",
679
+ "ai_helper_update_importing_pubkey": "正在导入发布者公钥...",
680
+ "ai_helper_update_info_failed": "获取更新信息失败",
681
+ "ai_helper_update_install_git_generic": "请手动安装 Git",
682
+ "ai_helper_update_install_git_linux": "Linux 系统请使用包管理器手动安装 Git:\n • Debian/Ubuntu: sudo apt-get install git\n • CentOS/RHEL: sudo yum install git\n • Fedora: sudo dnf install git\n • Arch: sudo pacman -S git\n • Alpine: sudo apk add git",
683
+ "ai_helper_update_install_git_macos": "macOS 系统请手动安装 Git:\n • 方法1: 下载官方安装包 https://git-scm.com/download/mac\n • 方法2: 使用 Homebrew: brew install git\n • 方法3: 安装 Xcode Command Line Tools",
684
+ "ai_helper_update_install_git_windows": "Windows 系统请手动安装 Git:\n • 下载官方安装包: https://git-scm.com/download/win\n • 或使用包管理器: winget install Git.Git",
685
+ "ai_helper_update_installing_deps": "正在安装依赖包...",
686
+ "ai_helper_update_lock_failed": "锁文件操作失败: {0}",
687
+ "ai_helper_update_lock_held_by_other": "更新锁被其他用户进程持有(PID: {0}),当前进程无权限探测其状态,请稍后重试",
688
+ "ai_helper_update_lock_in_progress": "更新正在进行中(PID: {0}),请稍后重试",
689
+ "ai_helper_update_lock_race_condition": "更新锁被其他进程持有,请稍后重试",
690
+ "ai_helper_update_lock_unknown": "更新锁状态未知(PID: {0}),为安全起见已拒绝并发更新,请稍后重试",
691
+ "ai_helper_update_manual_restart_needed": "请手动重启服务以使更新生效(pm2 restart hydrooj)",
692
+ "ai_helper_update_needs_git_init": "需要初始化 git 仓库",
693
+ "ai_helper_update_needs_git_init_auto": "需要初始化 git 仓库(将自动处理)",
694
+ "ai_helper_update_network_cn": "检测到国内网络环境",
695
+ "ai_helper_update_network_detect_error": "网络环境检测异常,使用默认配置",
696
+ "ai_helper_update_network_detect_failed": "网络环境检测失败,使用默认配置",
697
+ "ai_helper_update_network_global": "检测到国外网络环境",
698
+ "ai_helper_update_no_backup_cannot_rollback": "⚠️ 未能获取更新前的备份 commit,无法安全回滚。为保护当前版本,已中止更新且不会修改本地代码。",
699
+ "ai_helper_update_no_passwordless_sudo": "当前用户无 sudo 免密权限,请手动安装 git 或配置免密 sudo",
700
+ "ai_helper_update_no_pm2": "未检测到 PM2 托管环境,请手动重启服务以使更新生效(pm2 restart hydrooj)",
701
+ "ai_helper_update_no_release_tag": "未找到任何正式发布版本(git tag vX.Y.Z),稳定(stable)通道无法更新。请先发布一个版本;如需跟踪 main 分支测试,请在该服务器设置环境变量 AI_HELPER_UPDATE_CHANNEL=edge。",
702
+ "ai_helper_update_no_sudo": "未检测到 sudo,请手动安装 git 或确保当前用户拥有免密 sudo 权限",
703
+ "ai_helper_update_no_task": "暂无更新任务",
704
+ "ai_helper_update_no_write_permission": "当前进程对插件目录缺少写入权限: {0}",
705
+ "ai_helper_update_not_git_repo_initializing": "目录不是 git 仓库,正在初始化...",
706
+ "ai_helper_update_not_git_root": "安全检查失败:插件路径不是 git 仓库根目录(toplevel: {0})",
707
+ "ai_helper_update_npm_ci_fallback": "npm ci 失败,回退到 npm install...",
708
+ "ai_helper_update_package_json_not_found": "未找到 package.json: {0}",
709
+ "ai_helper_update_path_not_found": "插件路径不存在: {0}",
710
+ "ai_helper_update_path_valid": "路径验证通过",
711
+ "ai_helper_update_permission_execute": "执行插件更新需要管理员权限。更新操作会修改代码并重启服务,仅允许管理员执行。",
712
+ "ai_helper_update_permission_read": "读取更新进度需要管理员权限。",
713
+ "ai_helper_update_pm2_reload_done": "pm2 reload 已执行,服务即将重启",
714
+ "ai_helper_update_pm2_reload_failed": "pm2 reload 执行失败: {0}",
715
+ "ai_helper_update_preparing_restart": "准备重启 HydroOJ...",
716
+ "ai_helper_update_progress_failed": "获取更新进度失败",
717
+ "ai_helper_update_pubkey_file_missing": "⚠️ 未找到发布者公钥文件(assets/trusted-keys/publisher.asc)。当前使用隔离的 GNUPGHOME,无法从系统密钥环继承公钥,签名验证可能失败;请修复公钥文件后重试。",
718
+ "ai_helper_update_pubkey_import_warning": "公钥导入警告",
719
+ "ai_helper_update_pubkey_imported": "✓ 公钥导入完成",
720
+ "ai_helper_update_pull_complete": "代码拉取完成",
721
+ "ai_helper_update_rebuilding_dist": "正在重建 dist(原子化构建)...",
722
+ "ai_helper_update_reinstalling_deps": "正在重新安装依赖包...",
723
+ "ai_helper_update_remote_already_set": "远程仓库已设置",
724
+ "ai_helper_update_remote_fetched_pending_verify": "远程对象已获取完成,待签名验证通过后切换到最新版本",
725
+ "ai_helper_update_remote_switch_success": "远程仓库切换成功",
726
+ "ai_helper_update_remote_version": "远程版本: {0}",
727
+ "ai_helper_update_repo_connect_failed": "{0} 连接失败,尝试下一个...",
728
+ "ai_helper_update_repo_failed": "{0} 连接失败,尝试下一个...",
729
+ "ai_helper_update_repo_latency": "{0} 延迟: {1} ✓",
730
+ "ai_helper_update_reset_to_latest_failed": "切换到最新版本失败: {0}",
731
+ "ai_helper_update_resetting_local": "重置本地更改...",
732
+ "ai_helper_update_resolving_remote": "正在解析远程版本...",
733
+ "ai_helper_update_restart_error": "重启执行异常: {0}",
734
+ "ai_helper_update_restart_scheduled": "重启命令已安排,服务将在 {0} 秒后重启",
735
+ "ai_helper_update_rolling_back": "正在回滚到版本 {0}...",
736
+ "ai_helper_update_running_git_init": "执行 git init...",
737
+ "ai_helper_update_running_pm2_reload": "正在执行: pm2 reload \"{0}\"",
738
+ "ai_helper_update_selected_tag": "已选定最新发布版本: {0}",
739
+ "ai_helper_update_set_remote_failed": "设置远程仓库失败",
740
+ "ai_helper_update_signature_failed": "代码签名验证失败: {0}",
741
+ "ai_helper_update_started": "更新任务已开始",
742
+ "ai_helper_update_success": "插件更新成功",
743
+ "ai_helper_update_switching_remote": "切换远程仓库",
744
+ "ai_helper_update_switching_to_latest": "正在切换到最新版本...",
745
+ "ai_helper_update_tags_fetch_failed": "获取发布标签失败: {0}",
746
+ "ai_helper_update_testing_repo": "测试 {0} 连接...",
747
+ "ai_helper_update_testing_repos": "正在测试仓库连接...",
748
+ "ai_helper_update_trying_fallback": "尝试回退到备选仓库",
749
+ "ai_helper_update_using_repo": "使用仓库: {0} ({1})",
750
+ "ai_helper_update_verifying_git_root": "正在验证 Git 仓库根目录...",
751
+ "ai_helper_update_verifying_signature": "正在验证代码签名...",
752
+ "ai_helper_update_write_check_failed": "写权限检查失败",
753
+ "ai_helper_version_check_failed": "版本检查失败"
754
+ },
755
+ "en": {
756
+ "ai_helper_admin_apikey_decrypt_failed": "Failed to decrypt API Key. Please check the encryption key configuration.",
757
+ "ai_helper_admin_budget_daily_domain": "Site-wide Daily Token Limit",
758
+ "ai_helper_admin_budget_daily_user": "Daily Token Limit per User",
759
+ "ai_helper_admin_budget_desc": "Limit AI token usage to prevent cost overruns. Set to 0 or leave empty for no limit.",
760
+ "ai_helper_admin_budget_monthly_domain": "Site-wide Monthly Token Limit",
761
+ "ai_helper_admin_budget_no_limit": "0 = no limit",
762
+ "ai_helper_admin_budget_soft_limit": "Soft Limit Threshold (%)",
763
+ "ai_helper_admin_budget_soft_limit_hint": "Show warning at this percentage, hard reject at 100%",
764
+ "ai_helper_admin_budget_title": "Token Budget Control",
765
+ "ai_helper_admin_builtin_jailbreak_rules": "Built-in Jailbreak Rules (read-only)",
766
+ "ai_helper_admin_config": "AI Config",
767
+ "ai_helper_admin_config_incomplete": "AI service configuration is incomplete. Please set up API Base URL, model name and API Key first.",
768
+ "ai_helper_admin_config_not_exist": "AI service configuration does not exist. Please set up the configuration first.",
769
+ "ai_helper_admin_config_subtitle": "Manage API endpoints, model selection, and security policies",
770
+ "ai_helper_admin_copied_to_clipboard": "Copied to clipboard",
771
+ "ai_helper_admin_copy_fallback": "Copy failed, please copy manually:",
772
+ "ai_helper_admin_copy_prompt": "Please copy the following content",
773
+ "ai_helper_admin_custom_jailbreak_rules": "Custom Jailbreak Rules (one regex per line)",
774
+ "ai_helper_admin_endpoint_add": "Add Endpoint",
775
+ "ai_helper_admin_endpoint_add_first": "Add First Endpoint",
776
+ "ai_helper_admin_endpoint_available_count": "{0} available",
777
+ "ai_helper_admin_endpoint_click_fetch": "← Click to fetch models supported by the API",
778
+ "ai_helper_admin_endpoint_complete_step2": "Please complete step 2 first",
779
+ "ai_helper_admin_endpoint_default_name": "Endpoint",
780
+ "ai_helper_admin_endpoint_delete": "Delete",
781
+ "ai_helper_admin_endpoint_enabled": "Enabled",
782
+ "ai_helper_admin_endpoint_fetch_models": "Fetch Model List",
783
+ "ai_helper_admin_endpoint_fetching": "Fetching...",
784
+ "ai_helper_admin_endpoint_key_configured": "Configured",
785
+ "ai_helper_admin_endpoint_key_keep": "Leave empty to keep current",
786
+ "ai_helper_admin_endpoint_last_fetched": "Last fetched",
787
+ "ai_helper_admin_endpoint_model_click_add": "Click to add to selected models",
788
+ "ai_helper_admin_endpoint_model_selected": "Selected",
789
+ "ai_helper_admin_endpoint_models_fetched": "Fetched {0} models",
790
+ "ai_helper_admin_endpoint_multi_config": "Multi-Endpoint Configuration",
791
+ "ai_helper_admin_endpoint_multi_desc": "Supports multiple endpoints, automatic failover, model selection",
792
+ "ai_helper_admin_endpoint_name_placeholder": "Endpoint name",
793
+ "ai_helper_admin_endpoint_no_models_selected": "No models selected. Click on models in the endpoint list above to add them.",
794
+ "ai_helper_admin_endpoint_not_found": "Endpoint not found",
795
+ "ai_helper_admin_endpoint_priority_desc": "All AI features call models in this order by default, falling back to the next on failure. To give one feature a different model, assign it under Per-Scenario Model Assignment below — no need to change this list.",
796
+ "ai_helper_admin_endpoint_priority_title": "Global Default Models (Fallback Order)",
797
+ "ai_helper_admin_endpoint_quick_config": "Quick Setup (single endpoint)",
798
+ "ai_helper_admin_endpoint_recommended": "Recommended",
799
+ "ai_helper_admin_endpoint_refetch": "Refetch",
800
+ "ai_helper_admin_endpoint_save_first": "Please save the endpoint first",
801
+ "ai_helper_admin_endpoint_select_hint": "Please select at least one model for students to use",
802
+ "ai_helper_admin_endpoint_start_desc": "Configure API endpoints to enable AI learning assistant",
803
+ "ai_helper_admin_endpoint_start_title": "Start Configuring AI Service",
804
+ "ai_helper_admin_endpoint_step1": "Fill in endpoint info",
805
+ "ai_helper_admin_endpoint_step2": "Fetch available models",
806
+ "ai_helper_admin_endpoint_step3": "Select enabled models",
807
+ "ai_helper_admin_endpoint_title": "API Endpoint Configuration",
808
+ "ai_helper_admin_endpoint_unknown": "Unknown endpoint",
809
+ "ai_helper_admin_feedback_body": "Description",
810
+ "ai_helper_admin_feedback_body_placeholder": "Describe the issue in detail, reproduction steps, or feature requirements...",
811
+ "ai_helper_admin_feedback_desc": "Submit bug reports or feature suggestions to the developer.",
812
+ "ai_helper_admin_feedback_email": "Contact Email",
813
+ "ai_helper_admin_feedback_email_placeholder": "So the developer can reach you",
814
+ "ai_helper_admin_feedback_network_error": "Network error, please try again later",
815
+ "ai_helper_admin_feedback_optional": "optional",
816
+ "ai_helper_admin_feedback_subject": "Subject",
817
+ "ai_helper_admin_feedback_subject_placeholder": "Briefly describe the issue or suggestion",
818
+ "ai_helper_admin_feedback_submit": "Submit Feedback",
819
+ "ai_helper_admin_feedback_submitting": "Submitting...",
820
+ "ai_helper_admin_feedback_title": "Feedback",
821
+ "ai_helper_admin_feedback_type_bug": "Bug Report",
822
+ "ai_helper_admin_feedback_type_feature": "Feature Request",
823
+ "ai_helper_admin_feedback_type_label": "Type",
824
+ "ai_helper_admin_feedback_type_other": "Other",
825
+ "ai_helper_admin_feedback_warning": "Do not include student info, API Keys, or raw log content.",
826
+ "ai_helper_admin_fetch_models_failed": "Failed to fetch model list",
827
+ "ai_helper_admin_fetch_models_params_missing": "Please provide endpointId or apiBaseUrl + apiKey",
828
+ "ai_helper_admin_general_settings": "General Settings",
829
+ "ai_helper_admin_jailbreak_append_rule": "Append to Custom Rules",
830
+ "ai_helper_admin_jailbreak_conversation_id": "Conversation ID: ",
831
+ "ai_helper_admin_jailbreak_copy_regex": "Copy Matched Regex",
832
+ "ai_helper_admin_jailbreak_copy_text": "Copy Matched Text",
833
+ "ai_helper_admin_jailbreak_empty": "No matches found, indicating no recent jailbreak attempts by students.",
834
+ "ai_helper_admin_jailbreak_load_failed": "Failed to load logs",
835
+ "ai_helper_admin_jailbreak_matched_rule": "Matched rule: ",
836
+ "ai_helper_admin_jailbreak_next_page": "Next",
837
+ "ai_helper_admin_jailbreak_page_info": "Page {0} / {1}",
838
+ "ai_helper_admin_jailbreak_pattern_placeholder": "ignore.*prompt",
839
+ "ai_helper_admin_jailbreak_prev_page": "Previous",
840
+ "ai_helper_admin_jailbreak_problem_id": "Problem ID: ",
841
+ "ai_helper_admin_jailbreak_question_type": "Question type: ",
842
+ "ai_helper_admin_jailbreak_time": "Time: ",
843
+ "ai_helper_admin_jailbreak_title": "Jailbreak Attempt Logs",
844
+ "ai_helper_admin_jailbreak_total": "{0} records total",
845
+ "ai_helper_admin_jailbreak_user_id": "User ID: ",
846
+ "ai_helper_admin_models_connection": "Cannot connect to API server, please check the URL",
847
+ "ai_helper_admin_models_forbidden": "No permission to access model list",
848
+ "ai_helper_admin_models_http_error": "Failed to fetch models: {0}",
849
+ "ai_helper_admin_models_invalid_key": "API Key invalid or expired",
850
+ "ai_helper_admin_models_invalid_response": "Invalid API response: missing data field",
851
+ "ai_helper_admin_models_network_error": "Network error: {0}",
852
+ "ai_helper_admin_models_not_supported": "This API does not support fetching model list, please enter model name manually",
853
+ "ai_helper_admin_models_rate_limited": "Fetch models requests too frequent, please try again later",
854
+ "ai_helper_admin_models_timeout": "Request timeout ({0} seconds)",
855
+ "ai_helper_admin_models_unknown_error": "Failed to fetch models: {0}",
856
+ "ai_helper_admin_no_builtin_rules": "No built-in rules",
857
+ "ai_helper_admin_scenario_add_model": "+ Add fallback model…",
858
+ "ai_helper_admin_scenario_add_model_override": "Assign a dedicated model for this scenario…",
859
+ "ai_helper_admin_scenario_custom": "Customized",
860
+ "ai_helper_admin_scenario_desc": "Only configure a scenario here when it needs models different from the global list (also in fallback order). Leaving it as Following global uses the Global Default Models above. Typical setup: a stronger model for low-frequency teaching analysis, a cost-effective one for high-frequency student chat.",
861
+ "ai_helper_admin_scenario_effective_global": "Currently effective (following global): {0}",
862
+ "ai_helper_admin_scenario_follow_global": "Following global",
863
+ "ai_helper_admin_scenario_global_empty": "The global default model list is empty, so this scenario cannot call AI yet — add models under Global Default Models above first.",
864
+ "ai_helper_admin_scenario_learning_summary": "Learning Summary",
865
+ "ai_helper_admin_scenario_learning_summary_desc": "Batch-generates a personalized summary per student. Needs reliable table formatting; called once per student.",
866
+ "ai_helper_admin_scenario_no_models": "No models available: fetch and save the model list in an endpoint above first.",
867
+ "ai_helper_admin_scenario_reset": "Reset to global",
868
+ "ai_helper_admin_scenario_student_chat": "Student Chat",
869
+ "ai_helper_admin_scenario_student_chat_desc": "Multi-turn Q&A on the student page. Highest call volume — a fast, cost-effective model is recommended.",
870
+ "ai_helper_admin_scenario_teaching_analysis": "Teaching Analysis",
871
+ "ai_helper_admin_scenario_teaching_analysis_desc": "Generates the class report, homework and deep-dive diagnosis. Only a few calls per assignment — a stronger model is recommended.",
872
+ "ai_helper_admin_scenario_title": "Per-Scenario Model Assignment",
873
+ "ai_helper_admin_system_prompt_placeholder": "You are a patient algorithm tutor...",
874
+ "ai_helper_admin_telemetry_data_1": "Active users (7-day), total conversations",
875
+ "ai_helper_admin_telemetry_data_2": "API success/failure rate, average response time",
876
+ "ai_helper_admin_telemetry_data_3": "Plugin version, runtime environment (Node.js version, OS)",
877
+ "ai_helper_admin_telemetry_data_4": "Enabled features (budget limits, multi-endpoint, etc.)",
878
+ "ai_helper_admin_telemetry_data_5": "Error types and frequency (no specific content)",
879
+ "ai_helper_admin_telemetry_desc": "Anonymous usage data helps developers improve the plugin. No student conversations, personal info, or API keys are collected.",
880
+ "ai_helper_admin_telemetry_disabled": "Disabled",
881
+ "ai_helper_admin_telemetry_enabled": "Enabled",
882
+ "ai_helper_admin_telemetry_instance_id": "Instance ID",
883
+ "ai_helper_admin_telemetry_last_report": "Last report",
884
+ "ai_helper_admin_telemetry_never": "Never",
885
+ "ai_helper_admin_telemetry_title": "Telemetry Settings",
886
+ "ai_helper_admin_telemetry_update_failed": "Failed to update telemetry settings",
887
+ "ai_helper_admin_telemetry_version": "Version",
888
+ "ai_helper_admin_telemetry_what_collected": "What data is collected?",
889
+ "ai_helper_admin_test_call_failed": "Failed to call AI service",
890
+ "ai_helper_admin_test_failed": "Test connection failed",
891
+ "ai_helper_admin_test_rate_limited": "Test connection requests too frequent, please try again later",
892
+ "ai_helper_admin_test_success": "Connection successful! AI service configuration is correct.",
893
+ "ai_helper_admin_url_invalid": "Invalid API Base URL: {0}",
894
+ "ai_helper_admin_version_cached": "Cached",
895
+ "ai_helper_admin_version_cancel": "Cancel",
896
+ "ai_helper_admin_version_channel_edge": "Edge",
897
+ "ai_helper_admin_version_channel_edge_hint": "Edge channel: tracks the latest main branch code; intended for developer test servers only.",
898
+ "ai_helper_admin_version_channel_stable": "Stable",
899
+ "ai_helper_admin_version_channel_stable_hint": "Stable channel: updates only to official releases (git tags).",
900
+ "ai_helper_admin_version_checking": "Checking...",
901
+ "ai_helper_admin_version_checking_full": "Checking version...",
902
+ "ai_helper_admin_version_close": "Close",
903
+ "ai_helper_admin_version_confirm": "Confirm Update",
904
+ "ai_helper_admin_version_confirm_title": "Confirm Plugin Update",
905
+ "ai_helper_admin_version_connection_lost": "Connection lost (possibly restarting), continuing to wait...",
906
+ "ai_helper_admin_version_current": "Current version",
907
+ "ai_helper_admin_version_do_not_close": "Updating in progress, do not close this page...",
908
+ "ai_helper_admin_version_force_update": "Force Update",
909
+ "ai_helper_admin_version_last_checked": "Last checked",
910
+ "ai_helper_admin_version_latest": "Latest version",
911
+ "ai_helper_admin_version_new_available": "New version available!",
912
+ "ai_helper_admin_version_notice_1": "Update will execute git pull, npm run build:plugin, and pm2 restart",
913
+ "ai_helper_admin_version_notice_2": "HydroOJ service will briefly restart, causing a few seconds of downtime",
914
+ "ai_helper_admin_version_notice_3": "Please ensure no critical operations are in progress",
915
+ "ai_helper_admin_version_notice_title": "Important Notes",
916
+ "ai_helper_admin_version_one_click_update": "One-Click Update",
917
+ "ai_helper_admin_version_plugin_path": "Plugin path",
918
+ "ai_helper_admin_version_refresh": "Refresh",
919
+ "ai_helper_admin_version_server_error": "Server error",
920
+ "ai_helper_admin_version_server_error_continuing": "Server error (HTTP {0}), but update is still running, continuing to wait...",
921
+ "ai_helper_admin_version_status": "Status",
922
+ "ai_helper_admin_version_success_message": "Update complete! Page will auto-refresh in 20 seconds...",
923
+ "ai_helper_admin_version_target_edge": "Edge channel: this will update to the latest code on the main branch, which may include untested changes.",
924
+ "ai_helper_admin_version_target_stable": "This will update to the latest official release (git tag vX.Y.Z).",
925
+ "ai_helper_admin_version_title": "Plugin Version",
926
+ "ai_helper_admin_version_up_to_date": "Already up to date",
927
+ "ai_helper_admin_version_update_failed_title": "Update Failed",
928
+ "ai_helper_admin_version_update_request_failed": "Update request failed",
929
+ "ai_helper_admin_version_update_success": "Update Successful",
930
+ "ai_helper_admin_version_updating": "Updating...",
931
+ "ai_helper_admin_version_view_release": "View Release Page",
932
+ "ai_helper_admin_version_waiting_output": "Waiting for server output...",
933
+ "ai_helper_analytics": "AI Analytics",
934
+ "ai_helper_analytics_class_id": "Class",
935
+ "ai_helper_analytics_date_end": "End Date",
936
+ "ai_helper_analytics_date_start": "Start Date",
937
+ "ai_helper_analytics_dimension_class": "By Class",
938
+ "ai_helper_analytics_dimension_label": "Statistics Dimension",
939
+ "ai_helper_analytics_dimension_problem": "By Problem",
940
+ "ai_helper_analytics_dimension_student": "By Student",
941
+ "ai_helper_analytics_empty": "No data available. Please adjust filters and try again.",
942
+ "ai_helper_analytics_error_prefix": "Failed to load statistics: ",
943
+ "ai_helper_analytics_invalid_dimension": "dimension must be one of: class, problem, student",
944
+ "ai_helper_analytics_loading": "Loading...",
945
+ "ai_helper_analytics_problem_id": "Problem ID",
946
+ "ai_helper_analytics_rate_limited": "Analytics requests too frequent, please try again later",
947
+ "ai_helper_analytics_search": "Search",
948
+ "ai_helper_analytics_title": "AI Usage Statistics",
949
+ "ai_helper_batch_summary": "AI Learning Summary",
950
+ "ai_helper_batch_summary_cancel": "Cancel",
951
+ "ai_helper_batch_summary_collapse_all": "Collapse All",
952
+ "ai_helper_batch_summary_completed": "Completed",
953
+ "ai_helper_batch_summary_confirm_regenerate": "Some summaries have been edited. Regeneration will overwrite. Continue?",
954
+ "ai_helper_batch_summary_continue": "Continue",
955
+ "ai_helper_batch_summary_delete": "Delete",
956
+ "ai_helper_batch_summary_draft": "Draft",
957
+ "ai_helper_batch_summary_edit": "Edit",
958
+ "ai_helper_batch_summary_empty": "No AI summaries generated yet. Click the button above to start.",
959
+ "ai_helper_batch_summary_expand_all": "Expand All",
960
+ "ai_helper_batch_summary_export_csv": "Export CSV",
961
+ "ai_helper_batch_summary_failed": "Failed",
962
+ "ai_helper_batch_summary_generate": "Generate AI Summary",
963
+ "ai_helper_batch_summary_generate_new": "Generate for {0} new students",
964
+ "ai_helper_batch_summary_generating": "Generating AI summaries...",
965
+ "ai_helper_batch_summary_loading": "Loading...",
966
+ "ai_helper_batch_summary_my_empty": "Your learning summary has not been published yet. It will appear here once your teacher publishes it.",
967
+ "ai_helper_batch_summary_my_load_failed": "Failed to load your learning summary. Retrying automatically…",
968
+ "ai_helper_batch_summary_my_title": "AI Learning Summary",
969
+ "ai_helper_batch_summary_no_new_students": "All students already have summaries",
970
+ "ai_helper_batch_summary_no_students": "No students in this assignment",
971
+ "ai_helper_batch_summary_pending": "Pending",
972
+ "ai_helper_batch_summary_progress": "Completed {0} / {1} · {2} failed",
973
+ "ai_helper_batch_summary_publish_all": "Publish All",
974
+ "ai_helper_batch_summary_publish_done": "Published {0} summaries",
975
+ "ai_helper_batch_summary_publish_n_drafts": "Publish {0} drafts",
976
+ "ai_helper_batch_summary_publish_one": "Publish",
977
+ "ai_helper_batch_summary_publish_skipped_failed": "{0} students failed to generate and were not published",
978
+ "ai_helper_batch_summary_publish_skipped_pending": "{0} students have not been generated and were not published",
979
+ "ai_helper_batch_summary_published": "Published",
980
+ "ai_helper_batch_summary_ref_submissions": "Reference Submissions",
981
+ "ai_helper_batch_summary_regenerate": "Regenerate",
982
+ "ai_helper_batch_summary_regenerate_all": "Regenerate all",
983
+ "ai_helper_batch_summary_regenerate_all_confirm": "This will regenerate summaries for all students. Edited content will be overwritten. Continue?",
984
+ "ai_helper_batch_summary_retry": "Retry",
985
+ "ai_helper_batch_summary_retry_failed": "Retry Failed",
986
+ "ai_helper_batch_summary_retry_n_failed": "Retry {0} failed",
987
+ "ai_helper_batch_summary_stats_completed": "Completed",
988
+ "ai_helper_batch_summary_stats_draft": "Draft",
989
+ "ai_helper_batch_summary_stats_failed": "Failed",
990
+ "ai_helper_batch_summary_stats_not_generated": "Not generated",
991
+ "ai_helper_batch_summary_stats_published": "Published",
992
+ "ai_helper_batch_summary_stop": "Stop",
993
+ "ai_helper_batch_summary_stopped_notice": "Generation was stopped. Some students have not been processed yet. Click \"Continue\" to resume.",
994
+ "ai_helper_budget_domain_daily_exceeded": "Site-wide daily AI quota used up, please try again tomorrow",
995
+ "ai_helper_budget_domain_daily_warning": "Site-wide AI quota running low, please use sparingly",
996
+ "ai_helper_budget_domain_monthly_exceeded": "Site-wide monthly AI quota used up, please contact administrator",
997
+ "ai_helper_budget_domain_monthly_warning": "Site-wide monthly AI quota running low",
998
+ "ai_helper_budget_user_daily_exceeded": "Daily AI quota used up (used {0} / {1} tokens)",
999
+ "ai_helper_budget_user_daily_warning": "AI quota running low (approximately {0} tokens remaining)",
1000
+ "ai_helper_config_advanced_section": "Advanced Settings",
1001
+ "ai_helper_config_api_base_url": "API Base URL",
1002
+ "ai_helper_config_api_key_configured": "Configured: {0}",
1003
+ "ai_helper_config_api_key_not_configured": "API Key not configured",
1004
+ "ai_helper_config_api_key_section": "API Key Settings",
1005
+ "ai_helper_config_apikey_encrypt_failed": "Failed to encrypt API Key",
1006
+ "ai_helper_config_basic_section": "Basic Configuration",
1007
+ "ai_helper_config_current_api_key": "Current API Key Status",
1008
+ "ai_helper_config_endpoint_encrypt_failed": "Failed to encrypt API Key for endpoint \"{0}\"",
1009
+ "ai_helper_config_error_api_base_url_empty": "API Base URL cannot be empty",
1010
+ "ai_helper_config_error_load_failed": "Failed to load configuration: {0}",
1011
+ "ai_helper_config_error_model_name_empty": "Model name cannot be empty",
1012
+ "ai_helper_config_error_rate_limit_invalid": "Rate limit must be a non-negative integer (0 = unlimited)",
1013
+ "ai_helper_config_error_save_failed": "Failed to save configuration: {0}",
1014
+ "ai_helper_config_error_test_failed": "Connection test failed: {0}",
1015
+ "ai_helper_config_error_timeout_invalid": "Timeout must be greater than 0",
1016
+ "ai_helper_config_get_failed": "Failed to get configuration",
1017
+ "ai_helper_config_hide_api_key": "Hide",
1018
+ "ai_helper_config_jailbreak_logs_failed": "Failed to fetch jailbreak logs",
1019
+ "ai_helper_config_loading": "Loading configuration...",
1020
+ "ai_helper_config_model_name": "Model Name",
1021
+ "ai_helper_config_new_api_key": "New API Key (leave empty to keep current)",
1022
+ "ai_helper_config_new_api_key_hint": "For security, the full saved API Key cannot be viewed. Entering a new value will overwrite the existing key; leave empty to keep unchanged.",
1023
+ "ai_helper_config_rate_limit_hint": "Maximum AI chat requests each student can send per minute; exceeding it shows a retry-later notice. 0 = unlimited. Applies to student chat only, not learning summaries or teaching analysis.",
1024
+ "ai_helper_config_rate_limit_invalid": "rateLimitPerMinute must be a non-negative integer",
1025
+ "ai_helper_config_rate_limit_per_minute": "Student Chat Rate Limit (per user per minute)",
1026
+ "ai_helper_config_rate_limit_section": "Rate Limiting",
1027
+ "ai_helper_config_save": "Save Configuration",
1028
+ "ai_helper_config_save_success": "Configuration saved",
1029
+ "ai_helper_config_saving": "Saving...",
1030
+ "ai_helper_config_show_api_key": "Show",
1031
+ "ai_helper_config_system_prompt": "System Prompt Template",
1032
+ "ai_helper_config_system_prompt_hint": "System prompt for the AI assistant, defining its role and behavior",
1033
+ "ai_helper_config_test_connection": "Test Connection",
1034
+ "ai_helper_config_test_failed": "Connection failed, AI service is unavailable",
1035
+ "ai_helper_config_test_success": "Connection successful, AI service is available",
1036
+ "ai_helper_config_testing": "Testing...",
1037
+ "ai_helper_config_timeout_hint": "Maximum time to wait for a single AI response; use 60s+ for slow models or long answers.",
1038
+ "ai_helper_config_timeout_invalid": "timeoutSeconds must be greater than 0",
1039
+ "ai_helper_config_timeout_seconds": "AI Request Timeout (seconds)",
1040
+ "ai_helper_config_title": "AI Learning Assistant Configuration",
1041
+ "ai_helper_config_update_failed": "Failed to update configuration",
1042
+ "ai_helper_conversations": "AI Conversations",
1043
+ "ai_helper_cost_rate_limited": "Requests too frequent, please try again later",
1044
+ "ai_helper_cost_user_fallback": "User {0}",
1045
+ "ai_helper_dashboard_subtitle": "Manage AI assistant conversations, view statistics, and system configuration",
1046
+ "ai_helper_dashboard_tab_analytics": "Analytics",
1047
+ "ai_helper_dashboard_tab_config": "AI Config",
1048
+ "ai_helper_dashboard_tab_conversations": "Conversations",
1049
+ "ai_helper_dashboard_tab_cost": "Cost Analysis",
1050
+ "ai_helper_dashboard_tab_teaching_review": "Teaching Review",
1051
+ "ai_helper_err_ai_aborted": "Request cancelled",
1052
+ "ai_helper_err_ai_auth": "AI service authentication failed, please contact administrator",
1053
+ "ai_helper_err_ai_client": "AI service configuration error, please contact administrator",
1054
+ "ai_helper_err_ai_network": "Cannot connect to AI service, please try again later",
1055
+ "ai_helper_err_ai_rate_limit": "AI service is busy, please try again later",
1056
+ "ai_helper_err_ai_server": "AI service is temporarily unavailable, please try again later",
1057
+ "ai_helper_err_ai_timeout": "AI service response timed out, please try again later",
1058
+ "ai_helper_err_ai_unavailable": "AI service is temporarily unavailable, please try again later",
1059
+ "ai_helper_err_ai_unknown": "AI service error, please try again later",
1060
+ "ai_helper_err_budget_exceeded": "AI quota exhausted, please try again later",
1061
+ "ai_helper_err_chat_rate_limited": "Too many questions, please think carefully before asking again",
1062
+ "ai_helper_err_clarify_needs_conversation": "Follow-up requires an existing conversation",
1063
+ "ai_helper_err_clarify_needs_selection": "Follow-up requires selecting content from AI reply",
1064
+ "ai_helper_err_clarify_off_topic": "This content is unrelated to programming. Please select code or algorithm related content from the AI reply to ask about.",
1065
+ "ai_helper_err_clarify_source_invalid": "Source message does not exist or is not an AI reply",
1066
+ "ai_helper_err_clarify_source_mismatch": "Source message does not belong to the current conversation",
1067
+ "ai_helper_err_clarify_text_not_found": "Selected text not found in the source message",
1068
+ "ai_helper_err_code_too_long": "Code snippet too long (max {0} characters)",
1069
+ "ai_helper_err_code_truncated": "Code truncated to {0} characters",
1070
+ "ai_helper_err_contest_check_failed": "Contest status check failed, please try again later",
1071
+ "ai_helper_err_contest_restricted": "AI assistant is unavailable during contests, please complete the work independently",
1072
+ "ai_helper_err_conversation_access_denied": "Access denied for this conversation",
1073
+ "ai_helper_err_conversation_not_found": "Conversation not found",
1074
+ "ai_helper_err_input_validation_failed": "Input validation failed",
1075
+ "ai_helper_err_internal": "Internal server error, please try again later",
1076
+ "ai_helper_err_invalid_conversation_id": "Invalid conversation ID",
1077
+ "ai_helper_err_invalid_message_source": "Invalid message source ID",
1078
+ "ai_helper_err_invalid_problem_id": "Invalid problem ID",
1079
+ "ai_helper_err_invalid_question_type": "Invalid question type",
1080
+ "ai_helper_err_jailbreak_detected": "Your input contains instructions that conflict with system rules. Please focus on describing your understanding of the problem, your approach, or specific errors, rather than trying to modify system settings.",
1081
+ "ai_helper_err_off_topic_reply": "This question is unrelated to the current programming problem. Please share your code snippet, error message, or your attempted approach, and I will continue to help you.",
1082
+ "ai_helper_err_optimize_requires_ac": "Code optimization is only available for users who have passed this problem",
1083
+ "ai_helper_err_problem_not_found": "Problem not found",
1084
+ "ai_helper_err_rate_limited": "Too many requests, please try again later",
1085
+ "ai_helper_err_thinking_too_long": "Description too long (max {0} characters)",
1086
+ "ai_helper_export_button": "Export Data",
1087
+ "ai_helper_export_cancel": "Cancel",
1088
+ "ai_helper_export_confirm": "Export",
1089
+ "ai_helper_export_failed": "Data export failed",
1090
+ "ai_helper_export_filters_label": "Export Scope Preview",
1091
+ "ai_helper_export_format_csv": "CSV (Excel compatible)",
1092
+ "ai_helper_export_format_hint": "Currently only CSV format is supported; Excel export may be added later.",
1093
+ "ai_helper_export_format_label": "Export Format",
1094
+ "ai_helper_export_invalid_end_date": "Invalid end date: {0}",
1095
+ "ai_helper_export_invalid_start_date": "Invalid start date: {0}",
1096
+ "ai_helper_export_rate_limited": "Export requests too frequent, please try again later",
1097
+ "ai_helper_export_sensitive_hint": "Recommended to disable when sharing externally; anonymous IDs will replace real student accounts when disabled.",
1098
+ "ai_helper_export_sensitive_label": "Include real student IDs (sensitive data)",
1099
+ "ai_helper_export_title": "Export Conversation Data",
1100
+ "ai_helper_export_unsupported_format": "Only CSV export is currently supported (format=csv)",
1101
+ "ai_helper_feedback_body_too_long": "Description cannot exceed {0} characters",
1102
+ "ai_helper_feedback_failed": "Failed to submit feedback",
1103
+ "ai_helper_feedback_invalid_type": "Feedback type must be bug, feature, or other",
1104
+ "ai_helper_feedback_subject_required": "Please fill in the feedback subject",
1105
+ "ai_helper_feedback_subject_too_long": "Subject cannot exceed {0} characters",
1106
+ "ai_helper_feedback_submit_failed": "Failed to submit feedback, please try again later",
1107
+ "ai_helper_feedback_success": "Feedback submitted, thank you for your input!",
1108
+ "ai_helper_problem_fallback_prefix": "Problem",
1109
+ "ai_helper_problem_fallback_title": "Problem {0}",
1110
+ "ai_helper_safety_code_truncated": "Code truncated (teaching mode does not show full implementation)",
1111
+ "ai_helper_safety_off_topic_replacement": "that topic",
1112
+ "ai_helper_scoreboard_tab_learning": "Learning Summaries",
1113
+ "ai_helper_scoreboard_tab_main": "Scoreboard",
1114
+ "ai_helper_scoreboard_tab_teaching": "Teaching Analysis",
1115
+ "ai_helper_student_ai_assistant": "AI Assistant",
1116
+ "ai_helper_student_analyze_problem": "Please help me analyze this problem",
1117
+ "ai_helper_student_attach_code": "Attach code",
1118
+ "ai_helper_student_attach_current_code": "Attach current code",
1119
+ "ai_helper_student_attached_code": "Attached code",
1120
+ "ai_helper_student_cancel": "Cancel",
1121
+ "ai_helper_student_cannot_get_problem": "Unable to retrieve problem info",
1122
+ "ai_helper_student_chars": "chars",
1123
+ "ai_helper_student_clarify_template": "I don't quite understand this part: \"{text}\"\nCould you explain it further?",
1124
+ "ai_helper_student_code_attached": "Code attached",
1125
+ "ai_helper_student_code_truncated": "code truncated",
1126
+ "ai_helper_student_collapse": "Collapse",
1127
+ "ai_helper_student_collapse_panel": "Collapse Panel",
1128
+ "ai_helper_student_contest_desc_line1": "AI assistant is unavailable during contests",
1129
+ "ai_helper_student_contest_desc_line2": "Please complete the work independently. Good luck!",
1130
+ "ai_helper_student_contest_restricted": "AI assistant is unavailable during contests",
1131
+ "ai_helper_student_contest_title": "Contest Mode",
1132
+ "ai_helper_student_debug_auto_attach": " (your code will be attached automatically)",
1133
+ "ai_helper_student_dont_understand": "I don't understand this part",
1134
+ "ai_helper_student_err_ai_service": "AI service error, please try again later",
1135
+ "ai_helper_student_err_bad_response": "AI returned an unparseable response",
1136
+ "ai_helper_student_err_cancelled": "Request cancelled",
1137
+ "ai_helper_student_err_empty_response": "AI returned an empty response",
1138
+ "ai_helper_student_err_enter_followup": "Please enter your follow-up question",
1139
+ "ai_helper_student_err_network_offline": "Network connection lost. Please check your connection and try again",
1140
+ "ai_helper_student_err_paste_code": "Please paste your code",
1141
+ "ai_helper_student_err_read_problem": "Unable to read problem info, please enter manually",
1142
+ "ai_helper_student_err_read_problem_failed": "Failed to read problem info",
1143
+ "ai_helper_student_err_request_failed": "Request failed, please try again later",
1144
+ "ai_helper_student_err_select_type": "Please select a question type first",
1145
+ "ai_helper_student_err_timeout": "Request timed out, please try again later",
1146
+ "ai_helper_student_followup_continue": "Please continue",
1147
+ "ai_helper_student_load_ac_code": "Load AC code",
1148
+ "ai_helper_student_load_ac_confirm": "An accepted submission was found. Would you like to load it into the editor for optimization?",
1149
+ "ai_helper_student_load_ac_warning": "This will overwrite the current code in the editor",
1150
+ "ai_helper_student_loading": "AI is thinking...",
1151
+ "ai_helper_student_manual_title_placeholder": "Please enter the problem title manually",
1152
+ "ai_helper_student_me": "Me",
1153
+ "ai_helper_student_new_conversation": "New conversation",
1154
+ "ai_helper_student_open_panel": "Open AI Assistant Panel",
1155
+ "ai_helper_student_optimize_code_required": "Code is required for optimization",
1156
+ "ai_helper_student_panel_title": "AI Learning Assistant",
1157
+ "ai_helper_student_placeholder_first": "Describe your understanding of the problem, your approach, or what confuses you...",
1158
+ "ai_helper_student_placeholder_followup": "Continue describing your thoughts or questions...",
1159
+ "ai_helper_student_qt_debug": "Debug code",
1160
+ "ai_helper_student_qt_optimize": "Optimize code",
1161
+ "ai_helper_student_qt_think": "No idea",
1162
+ "ai_helper_student_qt_understand": "Don't understand",
1163
+ "ai_helper_student_qtd_debug": "Help you identify logical errors in your code",
1164
+ "ai_helper_student_qtd_optimize": "Help optimize your accepted code for efficiency or readability",
1165
+ "ai_helper_student_qtd_think": "Guide your thinking process without giving away the answer",
1166
+ "ai_helper_student_qtd_understand": "Help you understand the problem statement and analyze sample I/O",
1167
+ "ai_helper_student_remove": "Remove",
1168
+ "ai_helper_student_render_error": "Page rendering error",
1169
+ "ai_helper_student_required": "required",
1170
+ "ai_helper_student_resize_panel": "Drag to resize",
1171
+ "ai_helper_student_retry": "Retry",
1172
+ "ai_helper_student_select_type": "Select question type",
1173
+ "ai_helper_student_send_shortcut": "Send (Ctrl+Enter)",
1174
+ "ai_helper_student_thinking": "Deep thinking...",
1175
+ "ai_helper_student_unknown_error": "Unknown error",
1176
+ "ai_helper_student_use_current_code": "Use current code",
1177
+ "ai_helper_student_welcome_desc_line1": "Select a question type and describe your thoughts or confusion",
1178
+ "ai_helper_student_welcome_desc_line2": "I'll guide you step by step to understand and solve the problem",
1179
+ "ai_helper_student_welcome_title": "Hi, I'm Your AI Learning Assistant",
1180
+ "ai_helper_teacher_analytics_ac_rate": "AC Rate",
1181
+ "ai_helper_teacher_analytics_actions": "Actions",
1182
+ "ai_helper_teacher_analytics_avg_msgs": "Avg Student Messages",
1183
+ "ai_helper_teacher_analytics_avg_per_student": "Avg per Student",
1184
+ "ai_helper_teacher_analytics_avg_rounds": "Avg Rounds",
1185
+ "ai_helper_teacher_analytics_avg_subs": "Avg Submissions",
1186
+ "ai_helper_teacher_analytics_by_class": "By Class",
1187
+ "ai_helper_teacher_analytics_by_problem": "By Problem",
1188
+ "ai_helper_teacher_analytics_by_student": "By Student",
1189
+ "ai_helper_teacher_analytics_clarify": "Clarify",
1190
+ "ai_helper_teacher_analytics_column_settings": "Column Settings",
1191
+ "ai_helper_teacher_analytics_debug": "Debug",
1192
+ "ai_helper_teacher_analytics_dimension": "Dimension",
1193
+ "ai_helper_teacher_analytics_effective_conversations": "Deep Interactions",
1194
+ "ai_helper_teacher_analytics_effective_ratio": "Deep Interaction Rate",
1195
+ "ai_helper_teacher_analytics_last_used": "Last Used",
1196
+ "ai_helper_teacher_analytics_load_failed": "Failed to load analytics",
1197
+ "ai_helper_teacher_analytics_loading": "Loading analytics...",
1198
+ "ai_helper_teacher_analytics_no_data": "No analytics data. Please adjust filters and query.",
1199
+ "ai_helper_teacher_analytics_optimize": "Optimize",
1200
+ "ai_helper_teacher_analytics_participating_students": "Participating Students",
1201
+ "ai_helper_teacher_analytics_problem": "Problem",
1202
+ "ai_helper_teacher_analytics_show_columns": "Show Columns",
1203
+ "ai_helper_teacher_analytics_student_count": "Students",
1204
+ "ai_helper_teacher_analytics_student_search": "Search Student",
1205
+ "ai_helper_teacher_analytics_student_search_placeholder": "Search by name or ID...",
1206
+ "ai_helper_teacher_analytics_subtitle": "View student AI assistant usage statistics",
1207
+ "ai_helper_teacher_analytics_think": "No idea",
1208
+ "ai_helper_teacher_analytics_title": "Analytics",
1209
+ "ai_helper_teacher_analytics_total_conversations": "Total Conversations",
1210
+ "ai_helper_teacher_analytics_understand": "Don't understand",
1211
+ "ai_helper_teacher_cancel": "Cancel",
1212
+ "ai_helper_teacher_close": "Close",
1213
+ "ai_helper_teacher_conv_attached_code": "Attached code",
1214
+ "ai_helper_teacher_conv_back_to_list": "Back to list",
1215
+ "ai_helper_teacher_conv_col_class": "Class",
1216
+ "ai_helper_teacher_conv_col_effective": "Learning Signals",
1217
+ "ai_helper_teacher_conv_col_effective_tooltip": "Message engagement · Post-conversation submissions · AC status",
1218
+ "ai_helper_teacher_conv_col_messages": "Messages",
1219
+ "ai_helper_teacher_conv_col_problem": "Problem",
1220
+ "ai_helper_teacher_conv_col_start_time": "Start Time",
1221
+ "ai_helper_teacher_conv_col_student": "Student",
1222
+ "ai_helper_teacher_conv_col_summary": "Summary",
1223
+ "ai_helper_teacher_conv_content": "Conversation Content",
1224
+ "ai_helper_teacher_conv_current_page_prefix": "page ",
1225
+ "ai_helper_teacher_conv_current_page_suffix": "",
1226
+ "ai_helper_teacher_conv_detail_subtitle": "View complete conversation content",
1227
+ "ai_helper_teacher_conv_detail_title": "Conversation Details",
1228
+ "ai_helper_teacher_conv_effective_conv": "Effective conversation",
1229
+ "ai_helper_teacher_conv_empty": "No conversations found. Please adjust filters and try again.",
1230
+ "ai_helper_teacher_conv_end": "End: ",
1231
+ "ai_helper_teacher_conv_end_time": "End Time",
1232
+ "ai_helper_teacher_conv_ineffective_conv": "Ineffective conversation",
1233
+ "ai_helper_teacher_conv_loading": "Loading conversations...",
1234
+ "ai_helper_teacher_conv_not_found": "Conversation not found",
1235
+ "ai_helper_teacher_conv_session_info": "Session Info",
1236
+ "ai_helper_teacher_conv_start": "Start: ",
1237
+ "ai_helper_teacher_conv_student_code": "Student code",
1238
+ "ai_helper_teacher_conv_subtitle": "View student conversation history with AI assistant",
1239
+ "ai_helper_teacher_conv_tags": "Tags",
1240
+ "ai_helper_teacher_conv_teacher_note": "Teacher Note",
1241
+ "ai_helper_teacher_conv_title": "Conversations",
1242
+ "ai_helper_teacher_conv_total_prefix": "Total ",
1243
+ "ai_helper_teacher_conv_total_records": " records, ",
1244
+ "ai_helper_teacher_conv_view_problem": "View problem",
1245
+ "ai_helper_teacher_conversation_forbidden": "Access denied for this conversation",
1246
+ "ai_helper_teacher_conversation_not_found": "Conversation not found",
1247
+ "ai_helper_teacher_cost_avg": "Average",
1248
+ "ai_helper_teacher_cost_budget_usage": "Budget Usage",
1249
+ "ai_helper_teacher_cost_col_cost": "Cost",
1250
+ "ai_helper_teacher_cost_col_model": "Model",
1251
+ "ai_helper_teacher_cost_col_requests": "Requests",
1252
+ "ai_helper_teacher_cost_col_user": "User",
1253
+ "ai_helper_teacher_cost_cost": " Cost",
1254
+ "ai_helper_teacher_cost_daily_trend": "Daily Trend",
1255
+ "ai_helper_teacher_cost_model_distribution": "Model Distribution",
1256
+ "ai_helper_teacher_cost_monthly_total": "Monthly Total",
1257
+ "ai_helper_teacher_cost_not_set": "Not set",
1258
+ "ai_helper_teacher_cost_per_request": "request",
1259
+ "ai_helper_teacher_cost_requests": "requests",
1260
+ "ai_helper_teacher_cost_summary": "Summary",
1261
+ "ai_helper_teacher_cost_this_month": "This Month",
1262
+ "ai_helper_teacher_cost_this_week": "This Week",
1263
+ "ai_helper_teacher_cost_title": "Cost Analysis",
1264
+ "ai_helper_teacher_cost_today": "Today",
1265
+ "ai_helper_teacher_cost_top_users": "Top Users",
1266
+ "ai_helper_teacher_deleted_user": "Deleted user",
1267
+ "ai_helper_teacher_effective": "Active Exploration",
1268
+ "ai_helper_teacher_export_all": "Export all data",
1269
+ "ai_helper_teacher_export_btn": "Export",
1270
+ "ai_helper_teacher_export_csv_label": "CSV (Excel compatible)",
1271
+ "ai_helper_teacher_export_csv_note": "Currently only CSV format is supported; Excel export may be added later.",
1272
+ "ai_helper_teacher_export_data": "Export Data",
1273
+ "ai_helper_teacher_export_format": "Export Format",
1274
+ "ai_helper_teacher_export_include_metrics": "Include conversation metrics",
1275
+ "ai_helper_teacher_export_include_sensitive": "Include real student IDs (sensitive data)",
1276
+ "ai_helper_teacher_export_metrics_note": "Adds detailed signal columns (message count, submissions, AC index, difficulty)",
1277
+ "ai_helper_teacher_export_preview": "Export Scope Preview",
1278
+ "ai_helper_teacher_export_sensitive_note": "Recommended to disable when sharing externally; anonymous IDs will replace real student accounts when disabled.",
1279
+ "ai_helper_teacher_export_time_range": "Time range: ",
1280
+ "ai_helper_teacher_export_title": "Export Conversation Data",
1281
+ "ai_helper_teacher_export_unlimited": "unlimited",
1282
+ "ai_helper_teacher_filter_class_id": "Class",
1283
+ "ai_helper_teacher_filter_class_id_optional": "optional",
1284
+ "ai_helper_teacher_filter_end_date": "End Date",
1285
+ "ai_helper_teacher_filter_problem_id": "Problem ID",
1286
+ "ai_helper_teacher_filter_problem_id_optional": "optional",
1287
+ "ai_helper_teacher_filter_problem_id_placeholder": "Enter problem ID",
1288
+ "ai_helper_teacher_filter_start_date": "Start Date",
1289
+ "ai_helper_teacher_filter_student_id": "Student ID",
1290
+ "ai_helper_teacher_filter_title": "Filters",
1291
+ "ai_helper_teacher_ineffective": "Limited Interaction",
1292
+ "ai_helper_teacher_invalid_conversation_id": "Invalid conversation ID",
1293
+ "ai_helper_teacher_load_failed": "Load failed: HTTP ",
1294
+ "ai_helper_teacher_load_failed_network": "Network error, load failed",
1295
+ "ai_helper_teacher_loading": "Loading...",
1296
+ "ai_helper_teacher_metrics_avg_length": "Avg Message Length",
1297
+ "ai_helper_teacher_metrics_chars": "chars",
1298
+ "ai_helper_teacher_metrics_context": "Problem Context",
1299
+ "ai_helper_teacher_metrics_difficulty": "Difficulty (AC Rate)",
1300
+ "ai_helper_teacher_metrics_disclaimer": "These signals are based on automated behavioral analysis. They reflect interaction patterns, not learning scores. Different students learn differently — low message counts may indicate hands-on experimenters, not lack of engagement.",
1301
+ "ai_helper_teacher_metrics_engagement": "Engagement Depth",
1302
+ "ai_helper_teacher_metrics_first_ac": "First AC Position",
1303
+ "ai_helper_teacher_metrics_msg_count": "Student Messages",
1304
+ "ai_helper_teacher_metrics_none": "None",
1305
+ "ai_helper_teacher_metrics_outcome": "Learning Outcome",
1306
+ "ai_helper_teacher_metrics_submission_n": "Submission #{0}",
1307
+ "ai_helper_teacher_metrics_subs_after": "Submissions After Chat",
1308
+ "ai_helper_teacher_metrics_title": "Learning Signals",
1309
+ "ai_helper_teacher_metrics_unknown": "Unknown",
1310
+ "ai_helper_teacher_next_item": "Next",
1311
+ "ai_helper_teacher_next_page": "Next",
1312
+ "ai_helper_teacher_no": "No",
1313
+ "ai_helper_teacher_no_data": "No data",
1314
+ "ai_helper_teacher_page_prefix": "Page",
1315
+ "ai_helper_teacher_page_suffix": "",
1316
+ "ai_helper_teacher_prev_item": "Previous",
1317
+ "ai_helper_teacher_prev_page": "Previous",
1318
+ "ai_helper_teacher_qtype_debug": "Debug code",
1319
+ "ai_helper_teacher_qtype_think": "No idea",
1320
+ "ai_helper_teacher_qtype_understand": "Don't understand",
1321
+ "ai_helper_teacher_query": "Query",
1322
+ "ai_helper_teacher_querying": "Querying...",
1323
+ "ai_helper_teacher_request_failed": "Request failed",
1324
+ "ai_helper_teacher_retry": "Retry",
1325
+ "ai_helper_teacher_role_ai": "AI Assistant",
1326
+ "ai_helper_teacher_role_student": "Student",
1327
+ "ai_helper_teacher_search": "Search",
1328
+ "ai_helper_teacher_signal_ac": "AC",
1329
+ "ai_helper_teacher_signal_messages": "Messages",
1330
+ "ai_helper_teacher_signal_no_ac": "No AC",
1331
+ "ai_helper_teacher_signal_no_problem": "No Problem",
1332
+ "ai_helper_teacher_signal_no_submission": "No Submissions",
1333
+ "ai_helper_teacher_signal_pending": "Processing",
1334
+ "ai_helper_teacher_signal_pending_tooltip": "Data syncing (usually completes within 30 minutes after conversation)",
1335
+ "ai_helper_teacher_signal_submissions": "Submissions",
1336
+ "ai_helper_teacher_view_conversations": "View conversations",
1337
+ "ai_helper_teacher_view_detail": "View details",
1338
+ "ai_helper_teacher_yes": "Yes",
1339
+ "ai_helper_teaching_ai_user_note": "Based on data from {0} AI assistant users",
1340
+ "ai_helper_teaching_code_samples": "Representative Code Samples",
1341
+ "ai_helper_teaching_copy_warning": "Note: Highly consistent errors may indicate code sharing",
1342
+ "ai_helper_teaching_deep_dive": "Deep Analysis",
1343
+ "ai_helper_teaching_detail": "View Details",
1344
+ "ai_helper_teaching_exists_confirm": "Teaching suggestions already exist. Regenerate?",
1345
+ "ai_helper_teaching_feedback_prompt": "Was this helpful?",
1346
+ "ai_helper_teaching_feedback_thanks": "Thanks for your feedback!",
1347
+ "ai_helper_teaching_findings": "Findings",
1348
+ "ai_helper_teaching_focus_placeholder": "Teaching focus for this lesson (optional)",
1349
+ "ai_helper_teaching_generate": "Generate Teaching Suggestions",
1350
+ "ai_helper_teaching_generating": "Generating teaching suggestions...",
1351
+ "ai_helper_teaching_no_data": "Too few participants for reliable statistics",
1352
+ "ai_helper_teaching_overview": "Overview",
1353
+ "ai_helper_teaching_regenerate": "Regenerate",
1354
+ "ai_helper_teaching_severity_high": "High Priority",
1355
+ "ai_helper_teaching_severity_low": "Low Priority",
1356
+ "ai_helper_teaching_severity_medium": "Medium Priority",
1357
+ "ai_helper_teaching_snapshot_time": "Data snapshot time",
1358
+ "ai_helper_teaching_student_list": "Affected Students",
1359
+ "ai_helper_teaching_students_affected": "{0} students affected",
1360
+ "ai_helper_teaching_suggestion": "AI Teaching Suggestions",
1361
+ "ai_helper_update_adding_remote": "Adding remote repository",
1362
+ "ai_helper_update_all_fetch_failed": "All repositories git fetch failed: {0}",
1363
+ "ai_helper_update_all_repos_failed": "All repository connection tests failed, using default",
1364
+ "ai_helper_update_backing_up_version": "Backing up current version...",
1365
+ "ai_helper_update_build_complete": "Compilation complete",
1366
+ "ai_helper_update_build_failed": "npm run build:plugin failed: {0}",
1367
+ "ai_helper_update_building": "Compiling project (atomic build)...",
1368
+ "ai_helper_update_cannot_acquire_lock": "Cannot acquire update lock",
1369
+ "ai_helper_update_cannot_get_version": "Cannot get current version (no rollback point), update aborted: {0}",
1370
+ "ai_helper_update_cannot_list_tags": "Cannot list version tags: {0}",
1371
+ "ai_helper_update_cannot_resolve_remote": "Cannot resolve remote version (origin/main): {0}",
1372
+ "ai_helper_update_cannot_resolve_tag": "Cannot resolve release tag {0}: {1}",
1373
+ "ai_helper_update_channel": "Update channel: {0}",
1374
+ "ai_helper_update_check_git_status_hint": "Suggestion: check git repository status (e.g. git status / git rev-parse HEAD) then retry the update.",
1375
+ "ai_helper_update_check_pm2_logs_hint": "If the service is abnormal after update, check pm2 logs: pm2 logs hydrooj",
1376
+ "ai_helper_update_checking_git": "Checking if git is installed...",
1377
+ "ai_helper_update_checking_write_permission": "Checking write permissions...",
1378
+ "ai_helper_update_checkout_failed": "Failed to checkout main branch: {0}",
1379
+ "ai_helper_update_cleaning_deps": "Cleaning dependencies...",
1380
+ "ai_helper_update_cleaning_old_deps": "No package-lock.json found, cleaning old dependencies...",
1381
+ "ai_helper_update_code_rolled_back": "Code rolled back to pre-update version",
1382
+ "ai_helper_update_complete": "Update complete! Page will auto-refresh in 20 seconds...",
1383
+ "ai_helper_update_concurrent_in_memory": "Update already in progress (in-memory lock), please wait for the current update to finish",
1384
+ "ai_helper_update_concurrent_rejected_file_lock": "Concurrent update rejected (file lock)",
1385
+ "ai_helper_update_concurrent_rejected_in_memory": "Concurrent update rejected (in-memory lock)",
1386
+ "ai_helper_update_current_version": "Current version: {0}",
1387
+ "ai_helper_update_deps_clean_warning": "Dependency cleanup warning",
1388
+ "ai_helper_update_deps_cleaned": "Dependencies cleaned",
1389
+ "ai_helper_update_deps_install_failed": "Dependency installation failed: {0}",
1390
+ "ai_helper_update_deps_install_failed_scripts_hint": "Dependency installation failed (note: npm scripts disabled by default for security; set AI_HELPER_UPDATE_ALLOW_NPM_SCRIPTS=1 to enable): {0}",
1391
+ "ai_helper_update_deps_installed": "Dependencies installed",
1392
+ "ai_helper_update_deps_reinstall_failed": "Warning: dependency reinstall failed, service may not start normally",
1393
+ "ai_helper_update_deps_restored": "Dependencies restored",
1394
+ "ai_helper_update_detecting_best_repo": "Detecting optimal repository...",
1395
+ "ai_helper_update_detecting_network": "Detecting network environment...",
1396
+ "ai_helper_update_detecting_path": "Detecting plugin path: {0}",
1397
+ "ai_helper_update_dist_rebuild_failed": "Warning: dist rebuild failed, service may not start normally",
1398
+ "ai_helper_update_dist_rebuilt": "dist rebuild complete",
1399
+ "ai_helper_update_failed": "Update failed",
1400
+ "ai_helper_update_fallback_process_exit": "Falling back to process exit to trigger PM2 auto-restart",
1401
+ "ai_helper_update_fallback_success": "Fallback to {0} succeeded",
1402
+ "ai_helper_update_fetch_complete": "Remote code fetched",
1403
+ "ai_helper_update_fetch_failed": "Current repository fetch failed",
1404
+ "ai_helper_update_fetching_latest": "Fetching latest remote code...",
1405
+ "ai_helper_update_fetching_remote": "Fetching remote code...",
1406
+ "ai_helper_update_fetching_tags": "Fetching release tags...",
1407
+ "ai_helper_update_fully_rolled_back": "Fully rolled back to pre-update state",
1408
+ "ai_helper_update_git_detect_failed": "Git repository detection failed: {0}",
1409
+ "ai_helper_update_git_init_complete": "Git repository initialized (remote objects fetched, pending signature verification before switching to main)",
1410
+ "ai_helper_update_git_init_failed": "Git repository initialization failed",
1411
+ "ai_helper_update_git_install_complete": "git installation complete",
1412
+ "ai_helper_update_git_install_failed": "Auto-install of git failed",
1413
+ "ai_helper_update_git_installed": "git is installed",
1414
+ "ai_helper_update_git_installed_but_unusable": "git was installed but still cannot be used, terminal restart may be required",
1415
+ "ai_helper_update_git_manual_install_required": "Git must be installed manually",
1416
+ "ai_helper_update_git_not_found": "git not detected, attempting auto-install...",
1417
+ "ai_helper_update_git_not_installed": "git is not installed and cannot be auto-installed",
1418
+ "ai_helper_update_gpg_bad_signature": "GPG signature is invalid (possibly tampered). Update rejected to protect system security.",
1419
+ "ai_helper_update_gpg_no_fingerprint": "Cannot extract full fingerprint from signature.",
1420
+ "ai_helper_update_gpg_no_pubkey": "Cannot verify signature: missing public key. Please confirm gpg is installed and the plugin's built-in publisher key file is intact.",
1421
+ "ai_helper_update_gpg_no_signature": "Upstream repository does not have GPG signing enabled. To ensure code authenticity, please ask the plugin author to enable commit signing.",
1422
+ "ai_helper_update_gpg_not_found": "gpg (GnuPG) not found. GPG signature verification is required for one-click update security. Please install gpg and try again.",
1423
+ "ai_helper_update_gpg_passed": "✓ GPG signature verified, code origin is trusted",
1424
+ "ai_helper_update_gpg_untrusted_fingerprint": "Signing fingerprint {0} is not in the trust list. This may mean the code was not signed by the official publisher.",
1425
+ "ai_helper_update_gpg_verified": "✓ GPG signature verified, code is from a trusted publisher ({0})",
1426
+ "ai_helper_update_importing_pubkey": "Importing publisher public key...",
1427
+ "ai_helper_update_info_failed": "Failed to get update info",
1428
+ "ai_helper_update_install_git_generic": "Please install Git manually",
1429
+ "ai_helper_update_install_git_linux": "Please install Git using your package manager:\n • Debian/Ubuntu: sudo apt-get install git\n • CentOS/RHEL: sudo yum install git\n • Fedora: sudo dnf install git\n • Arch: sudo pacman -S git\n • Alpine: sudo apk add git",
1430
+ "ai_helper_update_install_git_macos": "Please install Git on macOS:\n • Option 1: Download from https://git-scm.com/download/mac\n • Option 2: Homebrew: brew install git\n • Option 3: Install Xcode Command Line Tools",
1431
+ "ai_helper_update_install_git_windows": "Please install Git on Windows:\n • Download from https://git-scm.com/download/win\n • Or use: winget install Git.Git",
1432
+ "ai_helper_update_installing_deps": "Installing dependencies...",
1433
+ "ai_helper_update_lock_failed": "Lock file operation failed: {0}",
1434
+ "ai_helper_update_lock_held_by_other": "Update lock held by another user's process (PID: {0}), current process cannot probe its status, please try again later",
1435
+ "ai_helper_update_lock_in_progress": "Update in progress (PID: {0}), please try again later",
1436
+ "ai_helper_update_lock_race_condition": "Update lock held by another process, please try again later",
1437
+ "ai_helper_update_lock_unknown": "Update lock status unknown (PID: {0}), concurrent update rejected for safety, please try again later",
1438
+ "ai_helper_update_manual_restart_needed": "Please restart the service manually to apply the update (pm2 restart hydrooj)",
1439
+ "ai_helper_update_needs_git_init": "Git repository needs initialization",
1440
+ "ai_helper_update_needs_git_init_auto": "Git repository needs initialization (will be handled automatically)",
1441
+ "ai_helper_update_network_cn": "Detected domestic (CN) network environment",
1442
+ "ai_helper_update_network_detect_error": "Network detection error, using default configuration",
1443
+ "ai_helper_update_network_detect_failed": "Network detection failed, using default configuration",
1444
+ "ai_helper_update_network_global": "Detected international network environment",
1445
+ "ai_helper_update_no_backup_cannot_rollback": "Could not obtain backup commit before update, cannot safely rollback. Current version preserved, update aborted without modifying local code.",
1446
+ "ai_helper_update_no_passwordless_sudo": "Current user does not have passwordless sudo, please install git manually or configure passwordless sudo",
1447
+ "ai_helper_update_no_pm2": "PM2 not detected, please restart the service manually to apply the update (pm2 restart hydrooj)",
1448
+ "ai_helper_update_no_release_tag": "No official release (git tag vX.Y.Z) was found, so the stable channel cannot update. Publish a release first; to track the main branch for testing, set AI_HELPER_UPDATE_CHANNEL=edge on that server.",
1449
+ "ai_helper_update_no_sudo": "sudo not detected, please install git manually or ensure current user has passwordless sudo",
1450
+ "ai_helper_update_no_task": "No update task",
1451
+ "ai_helper_update_no_write_permission": "Current process lacks write permission to plugin directory: {0}",
1452
+ "ai_helper_update_not_git_repo_initializing": "Directory is not a git repository, initializing...",
1453
+ "ai_helper_update_not_git_root": "Security check failed: plugin path is not git repository root (toplevel: {0})",
1454
+ "ai_helper_update_npm_ci_fallback": "npm ci failed, falling back to npm install...",
1455
+ "ai_helper_update_package_json_not_found": "package.json not found: {0}",
1456
+ "ai_helper_update_path_not_found": "Plugin path does not exist: {0}",
1457
+ "ai_helper_update_path_valid": "Path validation passed",
1458
+ "ai_helper_update_permission_execute": "Administrator privileges required to execute plugin update. Update operations modify code and restart services, only administrators are allowed.",
1459
+ "ai_helper_update_permission_read": "Administrator privileges required to read update progress.",
1460
+ "ai_helper_update_pm2_reload_done": "pm2 reload executed, service is about to restart",
1461
+ "ai_helper_update_pm2_reload_failed": "pm2 reload failed: {0}",
1462
+ "ai_helper_update_preparing_restart": "Preparing to restart HydroOJ...",
1463
+ "ai_helper_update_progress_failed": "Failed to get update progress",
1464
+ "ai_helper_update_pubkey_file_missing": "Publisher public key file not found (assets/trusted-keys/publisher.asc). Using isolated GNUPGHOME, cannot inherit keys from system keyring. Signature verification may fail; please fix the public key file and retry.",
1465
+ "ai_helper_update_pubkey_import_warning": "Public key import warning",
1466
+ "ai_helper_update_pubkey_imported": "✓ Public key imported",
1467
+ "ai_helper_update_pull_complete": "Code pull complete",
1468
+ "ai_helper_update_rebuilding_dist": "Rebuilding dist (atomic build)...",
1469
+ "ai_helper_update_reinstalling_deps": "Reinstalling dependencies...",
1470
+ "ai_helper_update_remote_already_set": "Remote repository already set",
1471
+ "ai_helper_update_remote_fetched_pending_verify": "Remote objects fetched, pending signature verification before switching to latest version",
1472
+ "ai_helper_update_remote_switch_success": "Remote repository switched successfully",
1473
+ "ai_helper_update_remote_version": "Remote version: {0}",
1474
+ "ai_helper_update_repo_connect_failed": "{0} connection failed, trying next...",
1475
+ "ai_helper_update_repo_failed": "{0} connection failed, trying next...",
1476
+ "ai_helper_update_repo_latency": "{0}: {1} ✓",
1477
+ "ai_helper_update_reset_to_latest_failed": "Failed to switch to latest version: {0}",
1478
+ "ai_helper_update_resetting_local": "Resetting local changes...",
1479
+ "ai_helper_update_resolving_remote": "Resolving remote version...",
1480
+ "ai_helper_update_restart_error": "Restart error: {0}",
1481
+ "ai_helper_update_restart_scheduled": "Restart scheduled, service will restart in {0} seconds",
1482
+ "ai_helper_update_rolling_back": "Rolling back to version {0}...",
1483
+ "ai_helper_update_running_git_init": "Running git init...",
1484
+ "ai_helper_update_running_pm2_reload": "Running: pm2 reload \"{0}\"",
1485
+ "ai_helper_update_selected_tag": "Selected latest release: {0}",
1486
+ "ai_helper_update_set_remote_failed": "Failed to set remote repository",
1487
+ "ai_helper_update_signature_failed": "Code signature verification failed: {0}",
1488
+ "ai_helper_update_started": "Update task started",
1489
+ "ai_helper_update_success": "Plugin update successful",
1490
+ "ai_helper_update_switching_remote": "Switching remote repository",
1491
+ "ai_helper_update_switching_to_latest": "Switching to latest version...",
1492
+ "ai_helper_update_tags_fetch_failed": "Failed to fetch release tags: {0}",
1493
+ "ai_helper_update_testing_repo": "Testing {0} connection...",
1494
+ "ai_helper_update_testing_repos": "Testing repository connections...",
1495
+ "ai_helper_update_trying_fallback": "Trying fallback repository",
1496
+ "ai_helper_update_using_repo": "Using repository: {0} ({1})",
1497
+ "ai_helper_update_verifying_git_root": "Verifying Git repository root...",
1498
+ "ai_helper_update_verifying_signature": "Verifying code signature...",
1499
+ "ai_helper_update_write_check_failed": "Write permission check failed",
1500
+ "ai_helper_version_check_failed": "Version check failed"
1501
+ }
1502
+ };