feat: 规则转换器/导入/过滤/i18n 基础设施
- converters: 8 个转换器(markdown/txt/excel/docx/pptx/yaml + prompt-builder + converter 接口) - import: import-preview/import-service/import-types - rule-filter: 规则预过滤功能 - static-rules.json: 静态规则数据 - i18n/messages.ts: 国际化消息 - types/mammoth.d.ts: mammoth 类型声明
This commit is contained in:
@@ -0,0 +1,896 @@
|
||||
import * as vscode from 'vscode';
|
||||
|
||||
export type Language = 'zh-CN' | 'en' | 'ja';
|
||||
|
||||
const defaultLang: Language = 'zh-CN';
|
||||
|
||||
const messages: Record<string, Record<Language, string>> = {
|
||||
'review.noEditor': {
|
||||
'zh-CN': '请先打开一个文件',
|
||||
en: 'Please open a file first',
|
||||
ja: '最初にファイルを開いてください',
|
||||
},
|
||||
'review.noSelection': {
|
||||
'zh-CN': '请先选中要审查的代码',
|
||||
en: 'Please select code to review first',
|
||||
ja: 'レビューするコードを選択してください',
|
||||
},
|
||||
'review.needApiKey': {
|
||||
'zh-CN': '请先在设置面板中配置 API Key',
|
||||
en: 'Please configure API Key in Setup first',
|
||||
ja: '最初に設定パネルでAPIキーを設定してください',
|
||||
},
|
||||
'review.running': {
|
||||
'zh-CN': '正在审查...',
|
||||
en: 'Reviewing...',
|
||||
ja: 'レビュー中...',
|
||||
},
|
||||
'review.staticAnalysis': {
|
||||
'zh-CN': '运行静态分析...',
|
||||
en: 'Running static analysis...',
|
||||
ja: '静的解析を実行中...',
|
||||
},
|
||||
'review.aiReview': {
|
||||
'zh-CN': '运行 AI 审查...',
|
||||
en: 'Running AI review...',
|
||||
ja: 'AIレビューを実行中...',
|
||||
},
|
||||
'review.reviewingSelection': {
|
||||
'zh-CN': '审查选中代码...',
|
||||
en: 'Reviewing selected code...',
|
||||
ja: '選択したコードをレビュー中...',
|
||||
},
|
||||
'review.selectionComplete': {
|
||||
'zh-CN': '选中代码审查完成: {0} 个问题',
|
||||
en: 'Selection review complete: {0} issue(s)',
|
||||
ja: '選択コードのレビュー完了: {0} 件の問題',
|
||||
},
|
||||
'review.fixNotAvailable': {
|
||||
'zh-CN': '单条修复功能开发中',
|
||||
en: 'Single fix is under development',
|
||||
ja: '単一修正機能は開発中です',
|
||||
},
|
||||
'review.fixAllNotAvailable': {
|
||||
'zh-CN': '批量修复功能开发中',
|
||||
en: 'Batch fix is under development',
|
||||
ja: '一括修正機能は開発中です',
|
||||
},
|
||||
|
||||
'export.needRunFirst': {
|
||||
'zh-CN': '请先运行完整审查生成报告',
|
||||
en: 'Run a full review first to generate a report',
|
||||
ja: '最初に完全レビューを実行してレポートを生成してください',
|
||||
},
|
||||
'export.copyToClipboard': {
|
||||
'zh-CN': '📋 复制到剪贴板',
|
||||
en: '📋 Copy to Clipboard',
|
||||
ja: '📋 クリップボードにコピー',
|
||||
},
|
||||
'export.copyDescription': {
|
||||
'zh-CN': '将报告内容以 Markdown 格式复制到剪贴板',
|
||||
en: 'Copy report in Markdown format to clipboard',
|
||||
ja: 'レポートをMarkdown形式でクリップボードにコピー',
|
||||
},
|
||||
'export.downloadMarkdown': {
|
||||
'zh-CN': '📄 下载 Markdown 文件',
|
||||
en: '📄 Download Markdown File',
|
||||
ja: '📄 Markdownファイルをダウンロード',
|
||||
},
|
||||
'export.saveDescription': {
|
||||
'zh-CN': '将报告保存为 .md 文件',
|
||||
en: 'Save report as .md file',
|
||||
ja: 'レポートを.mdファイルとして保存',
|
||||
},
|
||||
'export.selectMethod': {
|
||||
'zh-CN': '选择导出方式',
|
||||
en: 'Select export method',
|
||||
ja: 'エクスポート方法を選択',
|
||||
},
|
||||
'export.copied': {
|
||||
'zh-CN': '报告已复制到剪贴板',
|
||||
en: 'Report copied to clipboard',
|
||||
ja: 'レポートをクリップボードにコピーしました',
|
||||
},
|
||||
'export.saveDialogTitle': {
|
||||
'zh-CN': '保存审查报告',
|
||||
en: 'Save Review Report',
|
||||
ja: 'レビューレポートを保存',
|
||||
},
|
||||
'export.saved': {
|
||||
'zh-CN': '报告已保存到 {0}',
|
||||
en: 'Report saved to {0}',
|
||||
ja: 'レポートを {0} に保存しました',
|
||||
},
|
||||
|
||||
'setup.noWorkspace': {
|
||||
'zh-CN': '请先打开工作区',
|
||||
en: 'Please open a workspace first',
|
||||
ja: '最初にワークスペースを開いてください',
|
||||
},
|
||||
'setup.manageRulesHint': {
|
||||
'zh-CN': '请在设置面板中管理自定义规则',
|
||||
en: 'Manage custom rules in the Setup panel',
|
||||
ja: '設定パネルでカスタムルールを管理してください',
|
||||
},
|
||||
'setup.openSetupFail': {
|
||||
'zh-CN': '无法打开设置面板',
|
||||
en: 'Cannot open setup panel',
|
||||
ja: '設定パネルを開けません',
|
||||
},
|
||||
'setup.openSettingsJson': {
|
||||
'zh-CN': '打开设置 (JSON)',
|
||||
en: 'Open Settings (JSON)',
|
||||
ja: '設定を開く (JSON)',
|
||||
},
|
||||
'setup.setApiKeyFirst': {
|
||||
'zh-CN': '请先设置 API Key',
|
||||
en: 'Please set API Key first',
|
||||
ja: '最初にAPIキーを設定してください',
|
||||
},
|
||||
'setup.setBaseUrlFirst': {
|
||||
'zh-CN': '请先设置 Base URL',
|
||||
en: 'Please set Base URL first',
|
||||
ja: '最初にベースURLを設定してください',
|
||||
},
|
||||
'setup.testSuccess': {
|
||||
'zh-CN': '✓ 连接成功',
|
||||
en: '✓ Connection successful',
|
||||
ja: '✓ 接続成功',
|
||||
},
|
||||
'setup.testFail': {
|
||||
'zh-CN': '✗ 连接失败: {0}',
|
||||
en: '✗ Connection failed: {0}',
|
||||
ja: '✗ 接続失敗: {0}',
|
||||
},
|
||||
'setup.selectRuleFile': {
|
||||
'zh-CN': '选择规则文件',
|
||||
en: 'Select rule file',
|
||||
ja: 'ルールファイルを選択',
|
||||
},
|
||||
'setup.fileExists': {
|
||||
'zh-CN': '文件 {0} 已存在',
|
||||
en: 'File {0} already exists',
|
||||
ja: 'ファイル {0} は既に存在します',
|
||||
},
|
||||
'setup.importSuccess': {
|
||||
'zh-CN': '规则文件已导入: {0}',
|
||||
en: 'Rule file imported: {0}',
|
||||
ja: 'ルールファイルをインポートしました: {0}',
|
||||
},
|
||||
'setup.importing': {
|
||||
'zh-CN': '正在导入自定义规则...',
|
||||
en: 'Importing custom rules...',
|
||||
ja: 'カスタムルールをインポート中...',
|
||||
},
|
||||
'setup.importCancelled': {
|
||||
'zh-CN': '导入已取消',
|
||||
en: 'Import cancelled',
|
||||
ja: 'インポートをキャンセルしました',
|
||||
},
|
||||
'setup.importDedupResult': {
|
||||
'zh-CN': '规则已导入: {0}({1} 条,{2} 条完全重复已注释,{3} 条部分重叠已标注)',
|
||||
en: 'Rules imported: {0} ({1} total, {2} exact duplicate(s) commented, {3} partial overlap(s) marked)',
|
||||
ja: 'ルールをインポートしました: {0}({1} 件、{2} 件の完全重複をコメントアウト、{3} 件の部分重複をマーク)',
|
||||
},
|
||||
'setup.importFail': {
|
||||
'zh-CN': '规则导入失败: {0}',
|
||||
en: 'Rule import failed: {0}',
|
||||
ja: 'ルールのインポートに失敗しました: {0}',
|
||||
},
|
||||
'setup.header': {
|
||||
'zh-CN': '净码特工 · 代码审查 · 设置',
|
||||
en: 'Code Purifier · Setup',
|
||||
ja: 'コードピュリファイア · 設定',
|
||||
},
|
||||
'setup.quickStart': {
|
||||
'zh-CN': '快速开始',
|
||||
en: 'Quick Start',
|
||||
ja: 'クイックスタート',
|
||||
},
|
||||
'setup.gettingStarted': {
|
||||
'zh-CN': '三步启用代码审核',
|
||||
en: '3 Steps to Enable Code Review',
|
||||
ja: '3ステップでコードレビューを有効化',
|
||||
},
|
||||
'setup.step1': {
|
||||
'zh-CN': '安装插件后,<b>配置 AI 模型</b>及 API Key,激活智能审核能力',
|
||||
en: 'After installing, <b>configure AI model</b> and API Key to activate intelligent review',
|
||||
ja: 'インストール後、<b>AIモデル</b>とAPIキーを設定してインテリジェントレビューを有効化',
|
||||
},
|
||||
'setup.step2': {
|
||||
'zh-CN': '启用 <b>自定义规则</b>,补充团队特有的编码规范',
|
||||
en: 'Enable <b>custom rules</b> to add team-specific coding standards',
|
||||
ja: '<b>カスタムルール</b>を有効にしてチーム固有のコーディング規約を追加',
|
||||
},
|
||||
'setup.step3': {
|
||||
'zh-CN': '<b>保存并测试连接</b>,验证配置无误后即可触发审核',
|
||||
en: '<b>Save and test connection</b>, verify config then trigger review',
|
||||
ja: '<b>保存して接続テスト</b>、設定を確認してレビューを開始',
|
||||
},
|
||||
'setup.step3Hint': {
|
||||
'zh-CN': '按 <b>Ctrl + Shift + R</b> 快捷键触发审核,结果实时显示在 <b>审核结果报告</b>页面中',
|
||||
en: 'Press <b>Ctrl + Shift + R</b> to trigger review, results appear in the <b>Review Report</b> panel',
|
||||
ja: '<b>Ctrl + Shift + R</b> でレビューを実行、結果は<b>レビューレポート</b>に表示',
|
||||
},
|
||||
'setup.engineSection': {
|
||||
'zh-CN': '审核引擎',
|
||||
en: 'Review Engines',
|
||||
ja: 'レビューエンジン',
|
||||
},
|
||||
'setup.commonRules': {
|
||||
'zh-CN': '共通规则',
|
||||
en: 'Common Rules',
|
||||
ja: '共通ルール',
|
||||
},
|
||||
'setup.linterStatic': {
|
||||
'zh-CN': 'Linter 静态分析',
|
||||
en: 'Linter Static Analysis',
|
||||
ja: 'リンター静的解析',
|
||||
},
|
||||
'setup.customRules': {
|
||||
'zh-CN': '自定义规则',
|
||||
en: 'Custom Rules',
|
||||
ja: 'カスタムルール',
|
||||
},
|
||||
'setup.teamCoding': {
|
||||
'zh-CN': '团队编码规范',
|
||||
en: 'Team Coding Standards',
|
||||
ja: 'チームコーディング規約',
|
||||
},
|
||||
'setup.aiReview': {
|
||||
'zh-CN': 'AI 审核',
|
||||
en: 'AI Review',
|
||||
ja: 'AIレビュー',
|
||||
},
|
||||
'setup.deepReview': {
|
||||
'zh-CN': '深度代码审查',
|
||||
en: 'Deep Code Review',
|
||||
ja: '詳細コードレビュー',
|
||||
},
|
||||
'setup.aiConfig': {
|
||||
'zh-CN': 'AI 模型配置',
|
||||
en: 'AI Model Configuration',
|
||||
ja: 'AIモデル設定',
|
||||
},
|
||||
'setup.provider': {
|
||||
'zh-CN': '模型提供商',
|
||||
en: 'Model Provider',
|
||||
ja: 'モデルプロバイダー',
|
||||
},
|
||||
'setup.notConfigured': {
|
||||
'zh-CN': '未配置',
|
||||
en: 'Not configured',
|
||||
ja: '未設定',
|
||||
},
|
||||
'setup.model': {
|
||||
'zh-CN': '模型名称',
|
||||
en: 'Model Name',
|
||||
ja: 'モデル名',
|
||||
},
|
||||
'setup.modelHint': {
|
||||
'zh-CN': '建议使用支持结构化输出的模型。',
|
||||
en: 'Use a model that supports structured output.',
|
||||
ja: '構造化出力をサポートするモデルの使用を推奨。',
|
||||
},
|
||||
'setup.apiKey': {
|
||||
'zh-CN': 'API Key',
|
||||
en: 'API Key',
|
||||
ja: 'APIキー',
|
||||
},
|
||||
'setup.baseUrl': {
|
||||
'zh-CN': 'Base URL',
|
||||
en: 'Base URL',
|
||||
ja: 'ベースURL',
|
||||
},
|
||||
'setup.keyStorageHint': {
|
||||
'zh-CN': 'Key 仅存储在本地 VS Code 安全存储中。',
|
||||
en: 'Key is stored locally in VS Code secure storage.',
|
||||
ja: 'キーはVS Codeの安全なストレージにのみ保存されます。',
|
||||
},
|
||||
'setup.outputLang': {
|
||||
'zh-CN': '语言',
|
||||
en: 'Language',
|
||||
ja: '言語',
|
||||
},
|
||||
'setup.outputLangHint': {
|
||||
'zh-CN': '更改插件的显示语言',
|
||||
en: 'Change plugin display language',
|
||||
ja: 'プラグインの表示言語を変更する',
|
||||
},
|
||||
'setup.customRulesSection': {
|
||||
'zh-CN': '自定义规则',
|
||||
en: 'Custom Rules',
|
||||
ja: 'カスタムルール',
|
||||
},
|
||||
'setup.ruleList': {
|
||||
'zh-CN': '规则列表',
|
||||
en: 'Rule List',
|
||||
ja: 'ルール一覧',
|
||||
},
|
||||
'setup.ruleCount': {
|
||||
'zh-CN': '{0} 条',
|
||||
en: '{0} rule(s)',
|
||||
ja: '{0} 件',
|
||||
},
|
||||
'setup.ruleNamePlaceholder': {
|
||||
'zh-CN': '输入规则名称...',
|
||||
en: 'Enter rule name...',
|
||||
ja: 'ルール名を入力...',
|
||||
},
|
||||
'setup.add': {
|
||||
'zh-CN': '+ 添加',
|
||||
en: '+ Add',
|
||||
ja: '+ 追加',
|
||||
},
|
||||
'setup.ruleNameHint': {
|
||||
'zh-CN': '建议使用英文名称,无需输入 .yaml 后缀(如 security-rules)',
|
||||
en: 'Use English names, no .yaml suffix needed (e.g. security-rules)',
|
||||
ja: '英語名を使用してください、.yaml拡張子は不要です(例: security-rules)',
|
||||
},
|
||||
'setup.ruleNameRequired': {
|
||||
'zh-CN': '请输入规则名称',
|
||||
en: 'Please enter a rule name',
|
||||
ja: 'ルール名を入力してください',
|
||||
},
|
||||
'setup.reset': {
|
||||
'zh-CN': '重置',
|
||||
en: 'Reset',
|
||||
ja: 'リセット',
|
||||
},
|
||||
'setup.saveAndTest': {
|
||||
'zh-CN': '保存并测试连接',
|
||||
en: 'Save & Test Connection',
|
||||
ja: '保存して接続テスト',
|
||||
},
|
||||
'importPreview.title': {
|
||||
'zh-CN': '规则导入预览',
|
||||
en: 'Rule Import Preview',
|
||||
ja: 'ルールインポートプレビュー',
|
||||
},
|
||||
'importPreview.source': {
|
||||
'zh-CN': '来源:{0} · 检测到 {1} 条规则',
|
||||
en: 'Source: {0} · {1} rule(s) detected',
|
||||
ja: 'ソース: {0} · {1} 件のルールを検出',
|
||||
},
|
||||
'importPreview.keep': {
|
||||
'zh-CN': '保留',
|
||||
en: 'Keep',
|
||||
ja: '保持',
|
||||
},
|
||||
'importPreview.comment': {
|
||||
'zh-CN': '注释',
|
||||
en: 'Comment Out',
|
||||
ja: 'コメントアウト',
|
||||
},
|
||||
'importPreview.cancel': {
|
||||
'zh-CN': '取消',
|
||||
en: 'Cancel',
|
||||
ja: 'キャンセル',
|
||||
},
|
||||
'importPreview.confirm': {
|
||||
'zh-CN': '确认导入',
|
||||
en: 'Confirm Import',
|
||||
ja: 'インポートを確認',
|
||||
},
|
||||
'import.customRulePrefix': {
|
||||
'zh-CN': '自定义规则',
|
||||
en: 'Custom rule',
|
||||
ja: 'カスタムルール',
|
||||
},
|
||||
'import.duplicateOf': {
|
||||
'zh-CN': '重复:{0}',
|
||||
en: 'Duplicate: {0}',
|
||||
ja: '重複:{0}',
|
||||
},
|
||||
'import.overlapWith': {
|
||||
'zh-CN': '与 {0} 部分重叠',
|
||||
en: 'Overlap with {0}',
|
||||
ja: '{0} と部分的に重複',
|
||||
},
|
||||
'import.overlapReason': {
|
||||
'zh-CN': '重叠原因:{0}',
|
||||
en: 'Overlap reason: {0}',
|
||||
ja: '重複理由:{0}',
|
||||
},
|
||||
'import.badgeRestored': {
|
||||
'zh-CN': '已恢复',
|
||||
en: 'Restored',
|
||||
ja: '復元済み',
|
||||
},
|
||||
'import.badgeWillComment': {
|
||||
'zh-CN': '将注释',
|
||||
en: 'Will comment out',
|
||||
ja: 'コメントアウト予定',
|
||||
},
|
||||
'import.idLabel': {
|
||||
'zh-CN': 'id(规则唯一标识)',
|
||||
en: 'id (unique identifier)',
|
||||
ja: 'id(一意識別子)',
|
||||
},
|
||||
'import.severityLabel': {
|
||||
'zh-CN': 'severity(严重级别)',
|
||||
en: 'severity',
|
||||
ja: 'severity(重要度)',
|
||||
},
|
||||
'import.descriptionLabel': {
|
||||
'zh-CN': 'description(规则描述)',
|
||||
en: 'description',
|
||||
ja: 'description(ルール説明)',
|
||||
},
|
||||
'import.messageLabel': {
|
||||
'zh-CN': 'message(触发提示消息)',
|
||||
en: 'message',
|
||||
ja: 'message(トリガーメッセージ)',
|
||||
},
|
||||
'import.languagesLabel': {
|
||||
'zh-CN': 'languages(适用语言)',
|
||||
en: 'languages',
|
||||
ja: 'languages(対象言語)',
|
||||
},
|
||||
'import.excludeLanguagesLabel': {
|
||||
'zh-CN': 'excludeLanguages(排除语言)',
|
||||
en: 'excludeLanguages',
|
||||
ja: 'excludeLanguages(除外言語)',
|
||||
},
|
||||
'import.tagPlaceholder': {
|
||||
'zh-CN': '输入语言名,Enter 添加',
|
||||
en: 'Type language name, Enter to add',
|
||||
ja: '言語名を入力、Enterで追加',
|
||||
},
|
||||
'import.ruleCount': {
|
||||
'zh-CN': '{0} 条',
|
||||
en: '{0}',
|
||||
ja: '{0} 件',
|
||||
},
|
||||
'import.exactDuplicate': {
|
||||
'zh-CN': '⛔ 完全重复 {0} 条',
|
||||
en: '⛔ Exact duplicate {0}',
|
||||
ja: '⛔ 完全重複 {0} 件',
|
||||
},
|
||||
'import.overlapDuplicate': {
|
||||
'zh-CN': '⚠️ 部分重叠 {0} 条',
|
||||
en: '⚠️ Partial overlap {0}',
|
||||
ja: '⚠️ 部分的重複 {0} 件',
|
||||
},
|
||||
'import.noDuplicate': {
|
||||
'zh-CN': '✅ 无重复 {0} 条',
|
||||
en: '✅ No duplicate {0}',
|
||||
ja: '✅ 重複なし {0} 件',
|
||||
},
|
||||
'import.statusBar': {
|
||||
'zh-CN': '将保留 {0} 条规则,注释 {1} 条规则',
|
||||
en: 'Keep {0} rule(s), comment out {1} rule(s)',
|
||||
ja: '{0} 件保持、{1} 件コメントアウト',
|
||||
},
|
||||
'import.editedHint': {
|
||||
'zh-CN': ' · 已编辑 {0} 条规则',
|
||||
en: ' · Edited {0} rule(s)',
|
||||
ja: ' · {0} 件を編集済み',
|
||||
},
|
||||
'import.sectionExact': {
|
||||
'zh-CN': '完全重复',
|
||||
en: 'Exact Duplicate',
|
||||
ja: '完全重複',
|
||||
},
|
||||
'import.sectionOverlap': {
|
||||
'zh-CN': '部分重叠',
|
||||
en: 'Partial Overlap',
|
||||
ja: '部分的重複',
|
||||
},
|
||||
'import.sectionNone': {
|
||||
'zh-CN': '无重复',
|
||||
en: 'No Duplicate',
|
||||
ja: '重複なし',
|
||||
},
|
||||
'import.validationDescEmpty': {
|
||||
'zh-CN': '规则 "{0}" 的 description 不能为空',
|
||||
en: 'Description of rule "{0}" cannot be empty',
|
||||
ja: 'ルール "{0}" の description は必須です',
|
||||
},
|
||||
'import.validationMsgEmpty': {
|
||||
'zh-CN': '规则 "{0}" 的 message 不能为空',
|
||||
en: 'Message of rule "{0}" cannot be empty',
|
||||
ja: 'ルール "{0}" の message は必須です',
|
||||
},
|
||||
'import.placeholderIdHint': {
|
||||
'zh-CN': '占位 ID,请修改为有意义的标识',
|
||||
en: 'Placeholder ID, please change to a meaningful identifier',
|
||||
ja: 'プレースホルダーID、意味のある識別子に変更してください',
|
||||
},
|
||||
'import.validationIdEmpty': {
|
||||
'zh-CN': '规则 id 不能为空',
|
||||
en: 'Rule id cannot be empty',
|
||||
ja: 'ルールIDは必須です',
|
||||
},
|
||||
|
||||
'report.panelTitle': {
|
||||
'zh-CN': '净码特工 · 代码审查报告',
|
||||
en: 'Code Purifier · Review Report',
|
||||
ja: 'コードピュリファイア · レビューレポート',
|
||||
},
|
||||
'report.totalIssues': {
|
||||
'zh-CN': '总计问题',
|
||||
en: 'Total Issues',
|
||||
ja: '問題の総数',
|
||||
},
|
||||
'report.errors': {
|
||||
'zh-CN': '错误',
|
||||
en: 'Errors',
|
||||
ja: 'エラー',
|
||||
},
|
||||
'report.warnings': {
|
||||
'zh-CN': '警告',
|
||||
en: 'Warnings',
|
||||
ja: '警告',
|
||||
},
|
||||
'report.info': {
|
||||
'zh-CN': '建议',
|
||||
en: 'Info',
|
||||
ja: '情報',
|
||||
},
|
||||
'report.fixAll': {
|
||||
'zh-CN': '全部修复',
|
||||
en: 'Fix All',
|
||||
ja: 'すべて修正',
|
||||
},
|
||||
'report.rerun': {
|
||||
'zh-CN': '重新审查',
|
||||
en: 'Re-run Review',
|
||||
ja: '再レビュー',
|
||||
},
|
||||
'report.export': {
|
||||
'zh-CN': '导出报告',
|
||||
en: 'Export Report',
|
||||
ja: 'レポートをエクスポート',
|
||||
},
|
||||
'report.sourceLinter': {
|
||||
'zh-CN': 'Linter',
|
||||
en: 'Linter',
|
||||
ja: 'リンター',
|
||||
},
|
||||
'report.sourceCustom': {
|
||||
'zh-CN': '自定义',
|
||||
en: 'Custom',
|
||||
ja: 'カスタム',
|
||||
},
|
||||
'report.sourceAI': {
|
||||
'zh-CN': 'AI',
|
||||
en: 'AI',
|
||||
ja: 'AI',
|
||||
},
|
||||
'report.noIssues': {
|
||||
'zh-CN': '未发现任何问题',
|
||||
en: 'No issues found',
|
||||
ja: '問題は見つかりませんでした',
|
||||
},
|
||||
'report.noRuleViolations': {
|
||||
'zh-CN': '未发现规则违规',
|
||||
en: 'No rule violations found',
|
||||
ja: 'ルール違反は見つかりませんでした',
|
||||
},
|
||||
'report.noAIFindings': {
|
||||
'zh-CN': '无 AI 审查建议',
|
||||
en: 'No AI review findings',
|
||||
ja: 'AIレビューによる指摘はありません',
|
||||
},
|
||||
'report.skipCustomRules': {
|
||||
'zh-CN': '当前文件语言无匹配的自定义规则,已跳过规则评估',
|
||||
en: 'No custom rules match this file language, rule evaluation skipped',
|
||||
ja: 'このファイル言語に一致するカスタムルールがありません、ルール評価をスキップしました',
|
||||
},
|
||||
'report.executionErrors': {
|
||||
'zh-CN': '执行错误',
|
||||
en: 'Execution Errors',
|
||||
ja: '実行エラー',
|
||||
},
|
||||
'report.degradedBanner': {
|
||||
'zh-CN': '部分 AI 功能不可用,报告已降级',
|
||||
en: 'Some AI features unavailable, report degraded',
|
||||
ja: '一部のAI機能が利用できません、レポートは縮退しています',
|
||||
},
|
||||
|
||||
'report.title': {
|
||||
'zh-CN': '代码审查报告',
|
||||
en: 'Code Review Report',
|
||||
ja: 'コードレビューレポート',
|
||||
},
|
||||
'report.file': {
|
||||
'zh-CN': '文件',
|
||||
en: 'File',
|
||||
ja: 'ファイル',
|
||||
},
|
||||
'report.language': {
|
||||
'zh-CN': '语言',
|
||||
en: 'Language',
|
||||
ja: '言語',
|
||||
},
|
||||
'report.duration': {
|
||||
'zh-CN': '耗时',
|
||||
en: 'Duration',
|
||||
ja: '所要時間',
|
||||
},
|
||||
'report.tools': {
|
||||
'zh-CN': '分析工具',
|
||||
en: 'Analysis Tools',
|
||||
ja: '解析ツール',
|
||||
},
|
||||
'report.totalSummary': {
|
||||
'zh-CN': '总计: {0} | 错误: {1} | 警告: {2} | 建议: {3}',
|
||||
en: 'Total: {0} | Errors: {1} | Warnings: {2} | Info: {3}',
|
||||
ja: '合計: {0} | エラー: {1} | 警告: {2} | 情報: {3}',
|
||||
},
|
||||
'report.staticSection': {
|
||||
'zh-CN': '静态分析 · {0} 个问题',
|
||||
en: 'Static Analysis · {0} issue(s)',
|
||||
ja: '静的解析 · {0} 件の問題',
|
||||
},
|
||||
'report.customSection': {
|
||||
'zh-CN': '自定义规则 · {0} 个问题',
|
||||
en: 'Custom Rules · {0} issue(s)',
|
||||
ja: 'カスタムルール · {0} 件の問題',
|
||||
},
|
||||
'report.aiSection': {
|
||||
'zh-CN': 'AI 审查 · {0} 条建议',
|
||||
en: 'AI Review · {0} finding(s)',
|
||||
ja: 'AIレビュー · {0} 件の指摘',
|
||||
},
|
||||
'report.suggestion': {
|
||||
'zh-CN': '建议',
|
||||
en: 'Suggestion',
|
||||
ja: '提案',
|
||||
},
|
||||
'report.noProblems': {
|
||||
'zh-CN': '未发现问题',
|
||||
en: 'No issues found',
|
||||
ja: '問題は見つかりませんでした',
|
||||
},
|
||||
'report.issuesCount': {
|
||||
'zh-CN': '{0} 个问题',
|
||||
en: '{0} issue(s)',
|
||||
ja: '{0} 件の問題',
|
||||
},
|
||||
'report.itemsCount': {
|
||||
'zh-CN': '{0} 条',
|
||||
en: '{0} item(s)',
|
||||
ja: '{0} 件',
|
||||
},
|
||||
'report.injectedCount': {
|
||||
'zh-CN': '(注入 {0}/{1} 条)',
|
||||
en: '(injected {0}/{1})',
|
||||
ja: '(注入 {0}/{1} 件)',
|
||||
},
|
||||
'report.injectedRules': {
|
||||
'zh-CN': '(注入 {0}/{1} 条规则)',
|
||||
en: '(injected {0}/{1} rules)',
|
||||
ja: '(注入 {0}/{1} 件ルール)',
|
||||
},
|
||||
|
||||
'import.unsupportedFormat': {
|
||||
'zh-CN': '不支持的文件格式: {0}',
|
||||
en: 'Unsupported file format: {0}',
|
||||
ja: 'サポートされていないファイル形式: {0}',
|
||||
},
|
||||
'import.conversionFailed': {
|
||||
'zh-CN': '转换失败,未生成规则内容',
|
||||
en: 'Conversion failed, no rule content generated',
|
||||
ja: '変換に失敗しました、ルール内容が生成されませんでした',
|
||||
},
|
||||
'import.emptyFile': {
|
||||
'zh-CN': '所选文件为空',
|
||||
en: 'Selected file is empty',
|
||||
ja: '選択したファイルは空です',
|
||||
},
|
||||
'import.needApiKey': {
|
||||
'zh-CN': '请先在设置面板中配置 API Key',
|
||||
en: 'Please configure API Key in Setup first',
|
||||
ja: '最初に設定パネルでAPIキーを設定してください',
|
||||
},
|
||||
'import.timeout': {
|
||||
'zh-CN': 'AI 生成规则超时,请检查网络或增大 ai.timeout 配置',
|
||||
en: 'AI rule generation timed out, check network or increase ai.timeout',
|
||||
ja: 'AIルール生成がタイムアウトしました、ネットワークを確認するかai.timeoutを増やしてください',
|
||||
},
|
||||
'import.aiFail': {
|
||||
'zh-CN': 'AI 生成规则失败: {0}',
|
||||
en: 'AI rule generation failed: {0}',
|
||||
ja: 'AIルール生成に失敗しました: {0}',
|
||||
},
|
||||
'import.emptyResponse': {
|
||||
'zh-CN': 'AI 返回内容为空',
|
||||
en: 'AI returned empty response',
|
||||
ja: 'AIが空の応答を返しました',
|
||||
},
|
||||
'import.excelReadFail': {
|
||||
'zh-CN': '读取 Excel 文件失败: {0}',
|
||||
en: 'Failed to read Excel file: {0}',
|
||||
ja: 'Excelファイルの読み込みに失敗しました: {0}',
|
||||
},
|
||||
'import.excelEmpty': {
|
||||
'zh-CN': 'Excel 文件没有工作表',
|
||||
en: 'Excel file has no worksheets',
|
||||
ja: 'Excelファイルにワークシートがありません',
|
||||
},
|
||||
'import.excelNoData': {
|
||||
'zh-CN': 'Excel 工作表中没有数据',
|
||||
en: 'No data in Excel worksheet',
|
||||
ja: 'Excelワークシートにデータがありません',
|
||||
},
|
||||
'import.docxReadFail': {
|
||||
'zh-CN': '读取 Word 文件失败: {0}',
|
||||
en: 'Failed to read Word file: {0}',
|
||||
ja: 'Wordファイルの読み込みに失敗しました: {0}',
|
||||
},
|
||||
'import.docxEmpty': {
|
||||
'zh-CN': 'Word 文件中没有可提取的文本内容',
|
||||
en: 'No extractable text in Word file',
|
||||
ja: 'Wordファイルに抽出可能なテキストがありません',
|
||||
},
|
||||
'import.pptxReadFail': {
|
||||
'zh-CN': '读取 PowerPoint 文件失败: {0}',
|
||||
en: 'Failed to read PowerPoint file: {0}',
|
||||
ja: 'PowerPointファイルの読み込みに失敗しました: {0}',
|
||||
},
|
||||
'import.pptxEmpty': {
|
||||
'zh-CN': 'PowerPoint 文件中没有可提取的文本内容',
|
||||
en: 'No extractable text in PowerPoint file',
|
||||
ja: 'PowerPointファイルに抽出可能なテキストがありません',
|
||||
},
|
||||
|
||||
'yaml.duplicateExact': {
|
||||
'zh-CN': '# [DUPLICATE: exact] 重复 {0}(检测目标完全一致)',
|
||||
en: '# [DUPLICATE: exact] duplicate of {0} (identical detection target)',
|
||||
ja: '# [DUPLICATE: exact] {0} と重複(検出対象が完全に一致)',
|
||||
},
|
||||
'yaml.duplicateOverlap': {
|
||||
'zh-CN': '# [DUPLICATE: overlap] 与 {0} 部分重叠',
|
||||
en: '# [DUPLICATE: overlap] overlap with {0}',
|
||||
ja: '# [DUPLICATE: overlap] {0} と部分的に重複',
|
||||
},
|
||||
'yaml.overlapReason': {
|
||||
'zh-CN': '# 重叠原因:{0}',
|
||||
en: '# Overlap reason: {0}',
|
||||
ja: '# 重複理由:{0}',
|
||||
},
|
||||
'yaml.manualComment': {
|
||||
'zh-CN': '# [手动注释] 用户选择不启用此规则',
|
||||
en: '# [manual] User chose not to enable this rule',
|
||||
ja: '# [手動コメント] ユーザーがこのルールを有効にしないことを選択',
|
||||
},
|
||||
'yaml.enableHint': {
|
||||
'zh-CN': '# 如需启用,删除以下每行开头的 # 即可',
|
||||
en: '# To enable, remove the leading # from each line below',
|
||||
ja: '# 有効にするには、以下の各行の先頭の # を削除してください',
|
||||
},
|
||||
'yaml.duplicateExactCustom': {
|
||||
'zh-CN': '# [DUPLICATE: exact] 重复自定义规则 {0}(检测目标完全一致)',
|
||||
en: '# [DUPLICATE: exact] duplicate of custom rule {0} (identical detection target)',
|
||||
ja: '# [DUPLICATE: exact] カスタムルール {0} と重複(検出対象が完全に一致)',
|
||||
},
|
||||
'yaml.duplicateExactGeneric': {
|
||||
'zh-CN': '# [DUPLICATE: exact] 重复 {0}(检测目标完全一致)',
|
||||
en: '# [DUPLICATE: exact] duplicate of {0} (identical detection target)',
|
||||
ja: '# [DUPLICATE: exact] {0} と重複(検出対象が完全に一致)',
|
||||
},
|
||||
'yaml.duplicateOverlapCustom': {
|
||||
'zh-CN': '# [DUPLICATE: {0}] 与自定义规则 {1} 部分重叠',
|
||||
en: '# [DUPLICATE: {0}] overlap with custom rule {1}',
|
||||
ja: '# [DUPLICATE: {0}] カスタムルール {1} と部分的に重複',
|
||||
},
|
||||
'yaml.duplicateOverlapGeneric': {
|
||||
'zh-CN': '# [DUPLICATE: {0}] 与 {1} 部分重叠',
|
||||
en: '# [DUPLICATE: {0}] overlap with {1}',
|
||||
ja: '# [DUPLICATE: {0}] {1} と部分的に重複',
|
||||
},
|
||||
|
||||
'engine.jsonNotFound': {
|
||||
'zh-CN': '响应中未找到 JSON。原始响应(前200字符):{0}',
|
||||
en: 'JSON not found in response. Raw response (first 200 chars): {0}',
|
||||
ja: 'レスポンスにJSONが見つかりません。生のレスポンス(先頭200文字):{0}',
|
||||
},
|
||||
'engine.jsonParseFail': {
|
||||
'zh-CN': 'JSON 解析失败。原始响应(前200字符):{0}',
|
||||
en: 'JSON parse failed. Raw response (first 200 chars): {0}',
|
||||
ja: 'JSON解析に失敗しました。生のレスポンス(先頭200文字):{0}',
|
||||
},
|
||||
|
||||
'adapter.javaNotInstalled': {
|
||||
'zh-CN': 'Java 11+ 未安装或不在 PATH 中',
|
||||
en: 'Java 11+ not installed or not in PATH',
|
||||
ja: 'Java 11+ がインストールされていないかPATHにありません',
|
||||
},
|
||||
'adapter.sqlfluffNotInstalled': {
|
||||
'zh-CN': 'sqlfluff 未安装,请执行 pip install sqlfluff',
|
||||
en: 'sqlfluff not installed, run: pip install sqlfluff',
|
||||
ja: 'sqlfluffがインストールされていません、pip install sqlfluff を実行してください',
|
||||
},
|
||||
'adapter.invalidApiKey': {
|
||||
'zh-CN': 'API Key 无效,请重新设置',
|
||||
en: 'Invalid API Key, please reconfigure',
|
||||
ja: 'APIキーが無効です、再設定してください',
|
||||
},
|
||||
'adapter.noApiKey': {
|
||||
'zh-CN': '未配置 API Key',
|
||||
en: 'API Key not configured',
|
||||
ja: 'APIキーが設定されていません',
|
||||
},
|
||||
'adapter.createProviderFail': {
|
||||
'zh-CN': '创建 Provider 失败: {0}',
|
||||
en: 'Failed to create provider: {0}',
|
||||
ja: 'プロバイダーの作成に失敗しました: {0}',
|
||||
},
|
||||
'adapter.customRuleParseFail': {
|
||||
'zh-CN': '自定义规则响应解析失败: {0}',
|
||||
en: 'Custom rule response parse failed: {0}',
|
||||
ja: 'カスタムルール応答の解析に失敗しました: {0}',
|
||||
},
|
||||
'adapter.customRuleRequestFail': {
|
||||
'zh-CN': '自定义规则请求失败: {0}',
|
||||
en: 'Custom rule request failed: {0}',
|
||||
ja: 'カスタムルールリクエストに失敗しました: {0}',
|
||||
},
|
||||
'adapter.aiReviewParseFail': {
|
||||
'zh-CN': 'AI 审查响应解析失败: {0}',
|
||||
en: 'AI review response parse failed: {0}',
|
||||
ja: 'AIレビュー応答の解析に失敗しました: {0}',
|
||||
},
|
||||
'adapter.aiReviewRequestFail': {
|
||||
'zh-CN': 'AI 审查请求失败: {0}',
|
||||
en: 'AI review request failed: {0}',
|
||||
ja: 'AIレビューリクエストに失敗しました: {0}',
|
||||
},
|
||||
|
||||
'extension.activated': {
|
||||
'zh-CN': '净码特工 · Code Purifier 已激活',
|
||||
en: 'Code Purifier activated',
|
||||
ja: 'コードピュリファイアが有効化されました',
|
||||
},
|
||||
|
||||
'lang.zhCN': {
|
||||
'zh-CN': '中文(简体)',
|
||||
en: 'Chinese (Simplified)',
|
||||
ja: '中国語(簡体字)',
|
||||
},
|
||||
'lang.en': {
|
||||
'zh-CN': 'English',
|
||||
en: 'English',
|
||||
ja: 'English',
|
||||
},
|
||||
'lang.ja': {
|
||||
'zh-CN': '日本語',
|
||||
en: '日本語',
|
||||
ja: '日本語',
|
||||
},
|
||||
};
|
||||
|
||||
let currentLang: Language = defaultLang;
|
||||
|
||||
const languageChangeEmitter = new vscode.EventEmitter<Language>();
|
||||
|
||||
export function t(key: string, vars?: Record<string, string | number>): string {
|
||||
const msg = messages[key]?.[currentLang] ?? messages[key]?.[defaultLang];
|
||||
let result = msg ?? key;
|
||||
if (vars) {
|
||||
for (const [k, v] of Object.entries(vars)) {
|
||||
result = result.replace(`{${k}}`, String(v));
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export function setLanguage(lang: Language): void {
|
||||
if (currentLang === lang) { return; }
|
||||
currentLang = lang;
|
||||
languageChangeEmitter.fire(lang);
|
||||
}
|
||||
|
||||
export function onLanguageChange(listener: (lang: Language) => void): vscode.Disposable {
|
||||
return languageChangeEmitter.event(listener);
|
||||
}
|
||||
|
||||
export function getLanguage(): Language {
|
||||
return currentLang;
|
||||
}
|
||||
|
||||
export function getMessageKeys(): string[] {
|
||||
return Object.keys(messages);
|
||||
}
|
||||
Reference in New Issue
Block a user