Files
2026Technology-Competition/src/i18n/messages.ts
T
范智鹏 247f19fd44 feat: 方法级代码审查 + 模板导入/预览增强 + SQLFluff 方言 + AI 空响应报错修复
- 方法级审查:CodeLens 触发 + 单次 AI 调用(规则匹配 + 6 维度深度审查),新增 method-extractor / status-cache / codeLensProvider
- 模板导入:severity 保留原始值 + 占位 id、去重对照统一 known-rules、重复提示条双语翻译、箭头展开/折叠 UI、520 条静态规则补 zh/ja 翻译
- SQL:sql-lint 重命名 sqlfluff + sqlfluff.dialect 方言可配置 + 默认方言调整
- ESLint:v9 flat config 接线修复(overrideConfigFile)+ legacy 迁移提示
- AI:空响应 EmptyContentError + 重试一次 + max_tokens 截断专用报错
- JSP:整文件检查走 PMD JSP 规则集 + scriptlet 包装解析 + 行号映射
- 诊断按 severity + 行号排序
2026-08-03 22:53:20 +08:00

1318 lines
44 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.emptyResponse': {
'zh-CN': 'AI 返回空响应,请检查模型配置',
en: 'AI returned an empty response, please check the model configuration',
ja: 'AIが空の応答を返しました。モデル設定を確認してください',
},
'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.aiConnectionConfig': {
'zh-CN': 'AI 连接配置',
en: 'AI Connection Config',
ja: 'AI接続設定',
},
'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.modelPlaceholder': {
'zh-CN': '输入或选择模型名',
en: 'Enter or select 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: '保存して接続テスト',
},
'setup.configured': {
'zh-CN': '已配置',
en: 'Configured',
ja: '設定済み',
},
'setup.connected': {
'zh-CN': '✓ 已连接',
en: '✓ Connected',
ja: '✓ 接続済み',
},
'setup.retry': {
'zh-CN': '✗ 重试',
en: '✗ Retry',
ja: '✗ 再試行',
},
'setup.ruleCountFormat': {
'zh-CN': '{0} 个文件',
en: '{0} file(s)',
ja: '{0} ファイル',
},
'setup.noRuleFiles': {
'zh-CN': '暂无规则文件',
en: 'No rule files',
ja: 'ルールファイルなし',
},
'setup.adapter.subtitle': {
'zh-CN': '静态分析适配器',
en: 'Static Analysis Adapters',
ja: '静的解析アダプター',
},
'setup.adapter.modeBuiltin': {
'zh-CN': '内置规则',
en: 'Built-in Rules',
ja: '組み込みルール',
},
'setup.adapter.modeProject': {
'zh-CN': '项目配置',
en: 'Project Config',
ja: 'プロジェクト設定',
},
'setup.adapter.modeGlobal': {
'zh-CN': '全局配置',
en: 'Global Config',
ja: 'グローバル設定',
},
'setup.adapter.modeLegend': {
'zh-CN': '插件按 内置<全局<项目的优先级自动选择配置来源',
en: 'Auto-selects config by priority: Built-in < Global < Project',
ja: '優先順位に従って自動選択: 組み込み < グローバル < プロジェクト',
},
'setup.adapter.configYes': {
'zh-CN': '已配置',
en: 'Configured',
ja: '設定済み',
},
'setup.adapter.configNo': {
'zh-CN': '未配置',
en: 'Not configured',
ja: '未設定',
},
'setup.adapter.langLabel': {
'zh-CN': '可审查的语言:',
en: 'Languages:',
ja: '対応言語:',
},
'setup.adapter.tooltipTab': {
'zh-CN': '点击展开/收起静态分析适配器',
en: 'Click to expand/collapse static analysis adapters',
ja: 'クリックで静的解析アダプターを展開/折りたたむ',
},
'setup.adapter.btnCreateConfig': {
'zh-CN': '创建项目配置',
en: 'Create Project Config',
ja: 'プロジェクト設定を作成',
},
'setup.adapter.btnEditGlobal': {
'zh-CN': '修改全局设置',
en: 'Modify Global Settings',
ja: 'グローバル設定を変更',
},
'setup.adapter.tooltipCreate': {
'zh-CN': '在项目根目录创建 {0}',
en: 'Create {0} in project root',
ja: 'プロジェクトルートに {0} を作成',
},
'setup.adapter.tooltipEdit': {
'zh-CN': '修改 VS Code 设置中的全局参数',
en: 'Modify global parameters in VS Code settings',
ja: 'VS Code設定のグローバルパラメータを変更',
},
'setup.adapter.toggleEnable': {
'zh-CN': '启用 {0} 适配器',
en: 'Enable {0} adapter',
ja: '{0} アダプターを有効化',
},
'setup.adapter.toggleDisable': {
'zh-CN': '禁用 {0} 适配器',
en: 'Disable {0} adapter',
ja: '{0} アダプターを無効化',
},
'setup.template.pmdBestPractices': {
'zh-CN': 'Java 最佳实践(如:避免空 catch、关闭流等)',
en: 'Java best practices (avoid empty catch, close streams, etc.)',
ja: 'Javaベストプラクティス(空のcatch回避、ストリームクローズ等)',
},
'setup.template.pmdCodeStyle': {
'zh-CN': 'Java 代码风格(如:命名规范、花括号位置等)',
en: 'Java code style (naming conventions, brace placement, etc.)',
ja: 'Javaコードスタイル(命名規則、ブレース位置等)',
},
'setup.template.sqlfluffDialect': {
'zh-CN': '数据库方言:postgres / mysql / bigquery / snowflake 等',
en: 'Database dialect: postgres / mysql / bigquery / snowflake etc.',
ja: 'データベース方言:postgres / mysql / bigquery / snowflake など',
},
'setup.template.sqlfluffRules': {
'zh-CN': 'all = 启用全部规则,也可指定规则名逗号分隔',
en: 'all = enable all rules, or specify rule names separated by commas',
ja: 'all = すべてのルールを有効、ルール名をカンマ区切りで指定可',
},
'setup.template.eslintComment1': {
'zh-CN': '未使用的变量 → 警告',
en: 'Unused variables → warning',
ja: '未使用変数 → 警告',
},
'setup.template.eslintComment2': {
'zh-CN': '允许使用 console',
en: 'Allow console',
ja: 'consoleを許可',
},
'setup.template.eslintComment3': {
'zh-CN': '强制分号',
en: 'Enforce semicolons',
ja: 'セミコロンを強制',
},
'setup.template.stylelintComment1': {
'zh-CN': '缩进 2 空格',
en: 'Indentation: 2 spaces',
ja: 'インデント: 2スペース',
},
'setup.template.stylelintComment2': {
'zh-CN': '禁止空规则',
en: 'No empty rules',
ja: '空ルールを禁止',
},
'setup.adapter.pmdLanguages': {
'zh-CN': 'Java(含 JSP 中的 Java 代码,例如<% ... %>',
en: 'Java (including Java code in JSP, e.g. <% ... %>)',
ja: 'JavaJSP内のJavaコードを含む、例: <% ... %>',
},
'setup.adapter.pmdGuide': {
'zh-CN': '需要 Java 运行环境;项目根目录创建 ruleset.xml 或在设置中配置 pmd.rulesetPath',
en: 'Requires Java runtime; create ruleset.xml in project root or set pmd.rulesetPath in settings',
ja: 'Java実行環境が必要。プロジェクトルートにruleset.xmlを作成するか、設定でpmd.rulesetPathを設定してください',
},
'setup.adapter.sqlLanguages': {
'zh-CN': 'SQL',
en: 'SQL',
ja: 'SQL',
},
'setup.adapter.sqlGuide': {
'zh-CN': '需要 Python 环境和 sqlfluff;运行 pip install sqlfluff,项目根目录创建 .sqlfluff',
en: 'Requires Python and sqlfluff; run pip install sqlfluff, create .sqlfluff in project root',
ja: 'Python環境とsqlfluffが必要。pip install sqlfluff を実行し、プロジェクトルートに.sqlfluffを作成してください',
},
'setup.adapter.eslintLanguages': {
'zh-CN': 'JS, TS, JSX, TSX(含 JSP 中的 JavaScript 代码,例如<script>',
en: 'JS, TS, JSX, TSX (including JavaScript in JSP, e.g. <script>)',
ja: 'JS, TS, JSX, TSXJSP内のJavaScriptコードを含む、例: <script>',
},
'setup.adapter.eslintGuide': {
'zh-CN': '项目根目录创建 eslint.config.js 或在 VS Code 设置中配置 eslintConfigPath',
en: 'Create eslint.config.js in project root or set eslintConfigPath in VS Code settings',
ja: 'プロジェクトルートにeslint.config.jsを作成するか、VS Code設定でeslintConfigPathを設定してください',
},
'setup.adapter.stylelintLanguages': {
'zh-CN': 'CSS, SCSS, Less(含 JSP 中的 CSS 代码,例如<style>',
en: 'CSS, SCSS, Less (including CSS in JSP, e.g. <style>)',
ja: 'CSS, SCSS, LessJSP内のCSSコードを含む、例: <style>',
},
'setup.adapter.stylelintGuide': {
'zh-CN': '项目根目录创建 .stylelintrc 或在 VS Code 设置中配置 stylelintConfigPath',
en: 'Create .stylelintrc in project root or set stylelintConfigPath in VS Code settings',
ja: 'プロジェクトルートに.stylelintrcを作成するか、VS Code設定でstylelintConfigPathを設定してください',
},
'setup.aiReviewStatusCapability': {
'zh-CN': '审查能力',
en: 'Capability',
ja: 'レビュー機能',
},
'setup.aiReviewCapability': {
'zh-CN': '修改建议 · 自定义规则审查 · 深度代码审查',
en: 'Fix Suggestions · Custom Rules Review · Deep Code Review',
ja: '修正提案 · カスタムルールレビュー · 詳細コードレビュー',
},
'setup.notConnected': {
'zh-CN': '未连接',
en: 'Not connected',
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.dupExactTitle': {
'zh-CN': '完全重复',
en: 'Exact duplicate',
ja: '完全重複',
},
'import.dupOverlapTitle': {
'zh-CN': '部分重叠',
en: 'Partial overlap',
ja: '部分的重複',
},
'import.dupExactText': {
'zh-CN': '与规则「{0}」完全重复',
en: 'Exact duplicate of rule "{0}"',
ja: 'ルール「{0}」と完全重複',
},
'import.dupOverlapText': {
'zh-CN': '与规则「{0}」部分重叠',
en: 'Partially overlaps rule "{0}"',
ja: 'ルール「{0}」と部分的に重複',
},
'import.dupDescriptionLabel': {
'zh-CN': 'description{0}',
en: 'description: {0}',
ja: 'description{0}',
},
'import.dupExactHint': {
'zh-CN': '默认将注释导入,点击「保留」可恢复',
en: 'Imported as commented out by default; click "Keep" to restore',
ja: 'デフォルトでコメントアウトとしてインポートされます。「保持」をクリックすると復元します',
},
'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は必須です',
},
'import.idMissing': {
'zh-CN': 'id 缺失,请补充',
en: 'id missing, please fill in',
ja: 'id がありません、入力してください',
},
'import.severityMissing': {
'zh-CN': 'severity 缺失',
en: 'severity missing',
ja: 'severity が未設定',
},
'import.severitySelectHint': {
'zh-CN': '请选择 severity',
en: 'Select severity',
ja: 'severity を選択',
},
'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}',
},
'engine.emptyResponse': {
'zh-CN': 'AI 返回空响应',
en: 'AI returned an empty response',
ja: 'AIが空の応答を返しました',
},
'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}',
},
'adapter.eslintLegacyConfig': {
'zh-CN': '项目使用旧版 .eslintrc 配置({0}),ESLint v9 已不支持。请迁移到 eslint.config.js 或删除该文件以使用内置规则',
en: 'Project uses legacy .eslintrc config ({0}), which is not supported by ESLint v9. Please migrate to eslint.config.js or remove the file to use built-in rules',
ja: 'プロジェクトは旧形式の.eslintrc設定({0})を使用しています。ESLint v9ではサポートされていません。eslint.config.jsへの移行、またはファイル削除で組み込みルールを使用してください',
},
'adapter.emptyContent': {
'zh-CN': 'AI 返回空内容({0}',
en: 'AI returned empty content ({0})',
ja: 'AIが空のコンテンツを返しました({0})',
},
'adapter.maxTokensTruncated': {
'zh-CN': 'AI 输出被 max_tokens 截断(当前 {0}),请调大设置 ai.maxTokens 或更换模型',
en: 'AI output was truncated by max_tokens (current: {0}). Please increase ai.maxTokens or switch to a different model',
ja: 'AI出力がmax_tokensで打ち切られました(現在 {0})。ai.maxTokensを増やすか、モデルを変更してください',
},
'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: '日本語',
},
'setup.fromTemplate': {
'zh-CN': '从模板导入',
en: 'Import from template',
ja: 'テンプレートからインポート',
},
'setup.exportTemplate': {
'zh-CN': '↓ 导出模板',
en: '↓ Export Template',
ja: '↓ テンプレートをエクスポート',
},
'setup.selectTemplateFile': {
'zh-CN': '选择模板文件',
en: 'Select template file',
ja: 'テンプレートファイルを選択',
},
'setup.importingTemplate': {
'zh-CN': '正在导入模板...',
en: 'Importing template...',
ja: 'テンプレートをインポート中...',
},
'import.template.badFormat': {
'zh-CN': '文件格式错误,请使用 Excel 模板(.xlsx/.xls',
en: 'Bad file format, please use Excel template (.xlsx/.xls)',
ja: 'ファイル形式エラー、Excel テンプレートを使用してください',
},
'import.template.empty': {
'zh-CN': '文件为空',
en: 'File is empty',
ja: 'ファイルが空です',
},
'import.template.notTemplate': {
'zh-CN': '不是模板文件,缺少列: {0}',
en: 'Not a template file, missing columns: {0}',
ja: 'テンプレートファイルではありません、欠損列: {0}',
},
'import.template.skipped': {
'zh-CN': '已跳过 {0} 行空数据',
en: 'Skipped {0} empty rows',
ja: '{0} 行の空データをスキップしました',
},
'import.sectionInvalid': {
'zh-CN': '错误规则',
en: 'Error Rules',
ja: 'エラー行',
},
'import.cannotImport': {
'zh-CN': '需修复后点击添加',
en: 'Fix then click Add',
ja: '修正して「追加」をクリック',
},
'import.dedupFailed': {
'zh-CN': 'AI 去重失败,规则将不带去重标记导入',
en: 'AI dedup failed, rules imported without dedup marks',
ja: 'AI 重複排除失敗、重複マークなしでインポート',
},
'import.emptyValidRules': {
'zh-CN': '无有效规则可导入,请修改文件后重新导入',
en: 'No valid rules to import, please fix the file and retry',
ja: '有効なルールがありません、ファイルを修正して再インポートしてください',
},
'import.issuePrefix': {
'zh-CN': '⚠',
en: '⚠',
ja: '⚠',
},
'import.add': {
'zh-CN': '添加',
en: 'Add',
ja: '追加',
},
'import.adding': {
'zh-CN': '校验并去重中...',
en: 'Validating & deduping...',
ja: '検証・重複排除中...',
},
'import.idConflict': {
'zh-CN': 'id {0} 与已有规则重复,请修改 id',
en: 'id {0} conflicts with an existing rule, change the id',
ja: 'id {0} が既存ルールと重複、id を変更してください',
},
'import.addDedupFallback': {
'zh-CN': 'AI 去重失败,已以无重复方式添加',
en: 'AI dedup failed, added as no-duplicate',
ja: 'AI 重複排除失敗、重複なしとして追加',
},
'import.validationSeverityInvalid': {
'zh-CN': 'severity 非法',
en: 'Invalid severity',
ja: 'severity が不正です',
},
'exportTemplate.saveLabel': {
'zh-CN': '导出模板',
en: 'Export Template',
ja: 'エクスポート',
},
'exportTemplate.success': {
'zh-CN': '模板已导出',
en: 'Template exported',
ja: 'テンプレートをエクスポートしました',
},
'exportTemplate.fail': {
'zh-CN': '导出失败:{0}',
en: 'Export failed: {0}',
ja: 'エクスポート失敗: {0}',
},
'exportTemplate.openFolder': {
'zh-CN': '打开文件夹',
en: 'Reveal in Folder',
ja: 'フォルダを開く',
},
'codelens.reviewMethod': {
'zh-CN': '🔍 Code Purifier: 审查此方法',
en: '🔍 Code Purifier: Review This Method',
ja: '🔍 Code Purifier: このメソッドを審査',
},
'codelens.reviewedClean': {
'zh-CN': '✓ Code Purifier: 已审查(无问题)',
en: '✓ Code Purifier: Reviewed (No Issues)',
ja: '✓ Code Purifier: 審査済み(問題なし)',
},
'codelens.reviewedWithIssues': {
'zh-CN': '✓ Code Purifier: 已审查({0} 个问题)',
en: '✓ Code Purifier: Reviewed ({0} Issues)',
ja: '✓ Code Purifier: 審査済み({0} 件の問題)',
},
'methodReview.running': {
'zh-CN': 'Code Purifier 正在审查方法:{0}',
en: 'Code Purifier: Reviewing method: {0}',
ja: 'Code Purifier がメソッドを審査中:{0}',
},
'methodReview.noMethod': {
'zh-CN': '当前位置未检测到方法',
en: 'No method detected at current position',
ja: '現在位置でメソッドが検出されませんでした',
},
'methodReview.complete': {
'zh-CN': '方法审查完成,发现 {0} 个问题',
en: 'Method review complete, {0} issues found',
ja: 'メソッド審査完了、{0} 件の問題を発見',
},
};
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);
}