- AI 修复预生成:静态/custom/AI 条目审查时预生成修复片段(originalText/newText),展开问题即显示行级 diff,无预生成时展示占位提示,匹配失败回退实时 LLM 生成 - 修复前 diff 预览:侧边新建编辑器组打开内置 diff,确认后写入(两步确认),不覆盖当前文件 - fix: sqlfluff 在 jinja 标签位于注释内时 JJ01 JSON 缺失 end_line_no/end_line_pos,适配器 Range 构造产生 NaN 被 VSCode 交换 start/end 导致行号 LNaN;新增 resolveSqlFluffRange 兜底 + 面板/report 行号 Number.isFinite 防御 - fix: 从 PMD 内置 ruleset 移除 5 条实际不可触发规则(AvoidAssertAsIdentifier、AvoidEnumAsIdentifier、AccessorClassGeneration、AccessorMethodGeneration、LoosePackageCoupling),内置配置 274→269 条全部可触发,同步 static-rules.json 与翻译脚本 - docs: README/DESIGN 更新
1438 lines
55 KiB
TypeScript
1438 lines
55 KiB
TypeScript
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} 件の問題',
|
||
},
|
||
'fix.noFix': {
|
||
'zh-CN': '该问题无法自动修复',
|
||
en: 'This issue cannot be auto-fixed',
|
||
ja: 'この問題は自動修正できません',
|
||
},
|
||
'fix.failed': {
|
||
'zh-CN': '修复失败: {0}',
|
||
en: 'Fix failed: {0}',
|
||
ja: '修正に失敗しました: {0}',
|
||
},
|
||
'fix.applied': {
|
||
'zh-CN': '修复完成',
|
||
en: 'Fix applied',
|
||
ja: '修正を適用しました',
|
||
},
|
||
'fix.running': {
|
||
'zh-CN': '批量修复中...',
|
||
en: 'Fixing all issues...',
|
||
ja: '一括修正中...',
|
||
},
|
||
'fix.progress': {
|
||
'zh-CN': '修复进度',
|
||
en: 'Fix progress',
|
||
ja: '修正進捗',
|
||
},
|
||
'fix.allComplete': {
|
||
'zh-CN': '批量修复完成:成功 {0},跳过 {1}',
|
||
en: 'Batch fix complete: {0} fixed, {1} skipped',
|
||
ja: '一括修正完了: {0} 成功、{1} スキップ',
|
||
},
|
||
'fix.undone': {
|
||
'zh-CN': '已撤销修复',
|
||
en: 'Fix undone',
|
||
ja: '修正を取り消しました',
|
||
},
|
||
'fix.undoFailed': {
|
||
'zh-CN': '撤销失败,代码可能已被手动修改',
|
||
en: 'Undo failed, the code may have been modified manually',
|
||
ja: '取り消しに失敗しました。コードが手動で変更された可能性があります',
|
||
},
|
||
'fix.aiRunning': {
|
||
'zh-CN': 'AI 修复中...',
|
||
en: 'AI fixing...',
|
||
ja: 'AI修正中...',
|
||
},
|
||
'fix.aiFailed': {
|
||
'zh-CN': 'AI 修复失败: {0}',
|
||
en: 'AI fix failed: {0}',
|
||
ja: 'AI修正に失敗しました: {0}',
|
||
},
|
||
'fix.noAI': {
|
||
'zh-CN': '该问题需要 AI 修复,请先在设置面板配置 AI',
|
||
en: 'This issue needs AI fix, please configure AI in the Setup panel first',
|
||
ja: 'この問題はAI修正が必要です。設定パネルでAIを設定してください',
|
||
},
|
||
'fix.confirmApply': {
|
||
'zh-CN': '确认应用修复?',
|
||
en: 'Confirm applying the fix?',
|
||
ja: '修正を適用しますか?',
|
||
},
|
||
'fix.apply': {
|
||
'zh-CN': '应用',
|
||
en: 'Apply',
|
||
ja: '適用',
|
||
},
|
||
'fix.cancel': {
|
||
'zh-CN': '取消',
|
||
en: 'Cancel',
|
||
ja: 'キャンセル',
|
||
},
|
||
'fix.previewTitle': {
|
||
'zh-CN': '修复预览',
|
||
en: 'Fix preview',
|
||
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 Get Started',
|
||
ja: '3ステップで使い始める',
|
||
},
|
||
'setup.step1': {
|
||
'zh-CN': '插件已内置 <b>Linter 静态分析</b>,开箱即用,也可在共通规则中配置项目/全局规则',
|
||
en: 'The extension includes <b>built-in Linter static analysis</b>, ready to use out of the box, and you can also configure project/global rules in Common Rules',
|
||
ja: '拡張機能には<b>Linter静的解析</b>が組み込まれており、そのまま利用できるほか、共通ルールでプロジェクト/グローバルルールも設定できます',
|
||
},
|
||
'setup.step2': {
|
||
'zh-CN': '在 <b>自定义规则</b> 标签页导入团队编码规范,增强审查(可选)',
|
||
en: 'Import team coding standards in the <b>Custom Rules</b> tab to enhance reviews (optional)',
|
||
ja: '<b>カスタムルール</b>タブでチームのコーディング規約をインポート(任意)',
|
||
},
|
||
'setup.step3': {
|
||
'zh-CN': '配置 <b>AI 模型与 API Key</b> 并<b>保存并测试连接</b>,启用 AI 深度审查',
|
||
en: 'Configure <b>AI model & API Key</b> and <b>save & test the connection</b> to enable deep AI review',
|
||
ja: '<b>AIモデルとAPIキー</b>を設定し<b>保存して接続テスト</b>、AI詳細レビューを有効化',
|
||
},
|
||
'setup.step3Hint': {
|
||
'zh-CN': '按 <b>Ctrl + Shift + R</b> 触发完整审核,结果实时显示在<b>审核结果报告</b>页面',
|
||
en: 'Press <b>Ctrl + Shift + R</b> to run a full 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.modeLegendHelp': {
|
||
'zh-CN': '三种配置来源的含义:\n· 内置规则:插件自带的规则集,开箱即用,无需配置\n· 全局配置:在 VS Code 设置中指定的文件路径,对所有项目生效\n· 项目配置:项目根目录下的配置文件,仅对当前项目生效\n\n优先级:内置 < 全局 < 项目,插件自动选择优先级最高的可用配置',
|
||
en: 'What the three config sources mean:\n· Built-in rules: bundled with the extension, work out of the box\n· Global config: a file path set in VS Code settings, applies to all projects\n· Project config: a config file in the project root, applies to the current project only\n\nPriority: Built-in < Global < Project; the highest-priority available source is used',
|
||
ja: '3つの設定ソースの意味:\n· 組み込みルール:拡張機能に同梱のルール、設定不要ですぐに使用可\n· グローバル設定:VS Code設定で指定したファイルパス、全プロジェクトに適用\n· プロジェクト設定:プロジェクト直下の設定ファイル、現在のプロジェクトのみに適用\n\n優先度:組み込み < グローバル < プロジェクト、利用可能な中で最優先のものを自動選択',
|
||
},
|
||
'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.sqlfluffDialectLabel': {
|
||
'zh-CN': '方言',
|
||
en: 'Dialect',
|
||
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: 'Java(JSP内のJavaコードを含む、例: <% ... %>)',
|
||
},
|
||
'setup.adapter.pmdHelp': {
|
||
'zh-CN': 'PMD 由 Java 编写,需先安装 Java 运行环境(JDK 8+),否则无法执行。\n\n插件已内置一套 PMD 规则集(7 类 274 条),安装 Java 后即可开箱使用,无需额外配置。\n点击「创建项目配置」,会在项目根目录生成 ruleset.xml,内容与插件内置规则集完全一致(含每类规则的说明注释),方便查看与调整审查范围。\n保存文件即自动生效,无需重启。\n\n若多个项目共用同一份规则,可点「修改全局设置」,在 pmd.rulesetPath 中填写该文件路径',
|
||
en: 'PMD is written in Java, so a Java runtime (JDK 8+) must be installed first.\n\nThe extension ships a built-in PMD ruleset (7 categories, 274 rules), usable right after installing Java.\nClick "Create Project Config" to generate ruleset.xml in the project root, identical to the built-in ruleset (including per-category comment descriptions) for review and adjustment.\nChanges take effect on save, no restart needed.\n\nTo share one ruleset across projects, click "Modify Global Settings" and set pmd.rulesetPath',
|
||
ja: 'PMDはJava製のため、まずJava実行環境(JDK 8+)のインストールが必要です。\n\n拡張機能にはPMDルールセット(7カテゴリ・274ルール)が同梱されており、Java導入後すぐに利用できます。\n「プロジェクト設定を作成」をクリックすると、プロジェクト直下にruleset.xmlが生成されます。内容は組み込みルールセットと完全一致し(カテゴリごとの説明コメント付き)、確認・調整が可能です。\n保存後すぐに反映され、再起動は不要です。\n\n複数プロジェクトで同じルールを共有する場合、「グローバル設定を変更」でpmd.rulesetPathを設定してください',
|
||
},
|
||
'setup.adapter.sqlLanguages': {
|
||
'zh-CN': 'SQL',
|
||
en: 'SQL',
|
||
ja: 'SQL',
|
||
},
|
||
'setup.adapter.sqlHelp': {
|
||
'zh-CN': 'SQLFluff 是 Python 命令,需先安装 Python 环境与 sqlfluff(pip install sqlfluff),否则无法执行。\n\n插件已内置一套 SQLFluff 精选规则(26 项),安装后即可开箱使用,无需额外配置。\n点击「创建项目配置」,会在项目根目录生成 .sqlfluff,内容与插件内置配置一致(含每条规则的说明注释,以及 rules = all 的启用提示),方便查看与调整。\n保存文件即自动生效,无需重启。\n\n若多个项目共用同一份配置,可点「修改全局设置」填写全局路径',
|
||
en: 'SQLFluff is a Python command; install Python and sqlfluff (pip install sqlfluff) first.\n\nThe extension ships built-in SQLFluff curated rules (26 items), usable right after install.\nClick "Create Project Config" to generate .sqlfluff in the project root, identical to the built-in config (including per-rule comment descriptions and a rules = all hint) for review and adjustment.\nChanges take effect on save, no restart needed.\n\nTo share one config across projects, click "Modify Global Settings" and set the global path',
|
||
ja: 'SQLFluffはPython製コマンドのため、まずPython環境とsqlfluff(pip install sqlfluff)が必要です。\n\n拡張機能にはSQLFluff精選ルール(26項目)が同梱されており、インストール後すぐに利用できます。\n「プロジェクト設定を作成」をクリックすると、プロジェクト直下に.sqlfluffが生成されます。内容は組み込み設定と一致し(ルールごとの説明コメントとrules = allのヒント付き)、確認・調整が可能です。\n保存後すぐに反映され、再起動は不要です。\n\n複数プロジェクトで同じ設定を共有する場合、「グローバル設定を変更」でパスを設定してください',
|
||
},
|
||
'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, TSX(JSP内のJavaScriptコードを含む、例: <script>)',
|
||
},
|
||
'setup.adapter.eslintHelp': {
|
||
'zh-CN': 'ESLint 需项目先安装 eslint(npm install eslint),否则无法解析规则文件。\n\n插件已内置一套 ESLint 规则(基于 recommended),开箱即用,无需额外配置。\n点击「创建项目配置」,会在项目根目录生成 eslint.config.js,内容与插件内置规则一致(92 条 JS 规则,含逐条说明注释),零依赖即可运行。\n注意:生成文件仅包含 JS 内置规则;TS 项目如需 TS 专项规则,请自行安装 typescript-eslint 并按文件头注释示例追加。\n若多个项目共用同一份规则,可点「修改全局设置」,在 eslintConfigPath 中填写该文件路径',
|
||
en: 'ESLint must be installed in the project first (npm install eslint).\n\nThe extension ships built-in ESLint rules (based on recommended), usable out of the box.\nClick "Create Project Config" to generate eslint.config.js in the project root, identical to the built-in rules (92 JS rules with per-rule comment descriptions), running with zero extra dependencies.\nNote: the generated file only contains JS built-in rules; for TypeScript-specific rules, install typescript-eslint and follow the example in the file header comment.\nTo share one config across projects, click "Modify Global Settings" and set eslintConfigPath',
|
||
ja: 'プロジェクトで先にeslintをインストール(npm install eslint)しておく必要があります。\n\n拡張機能にはESLintルール(recommendedベース)が同梱されており、設定不要で利用できます。\n「プロジェクト設定を作成」をクリックすると、プロジェクト直下にeslint.config.jsが生成されます。内容は組み込みルールと一致し(JSルール92件・各ルールに説明コメント付き)、追加依存なしで動作します。\n注: 生成ファイルにはJS組み込みルールのみ含まれます。TS専用ルールが必要な場合は、typescript-eslintをインストールし、ファイル先頭のコメント例に従って追記してください。\n複数プロジェクトで同じルールを共有する場合、「グローバル設定を変更」で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, Less(JSP内のCSSコードを含む、例: <style>)',
|
||
},
|
||
'setup.adapter.stylelintHelp': {
|
||
'zh-CN': 'Stylelint 需项目先安装 stylelint(npm install stylelint),否则无法解析规则文件。\n\n插件已内置一套 Stylelint 规则(基于 recommended),开箱即用,无需额外配置。\n点击「创建项目配置」,会在项目根目录生成 .stylelintrc.js,内容与插件内置规则一致(68 条,含逐条说明注释),零依赖即可运行。\n若多个项目共用同一份规则,可点「修改全局设置」,在 stylelintConfigPath 中填写该文件路径',
|
||
en: 'Stylelint must be installed in the project first (npm install stylelint).\n\nThe extension ships built-in Stylelint rules (based on recommended), usable out of the box.\nClick "Create Project Config" to generate .stylelintrc.js in the project root, identical to the built-in rules (68 rules with per-rule comment descriptions), running with zero extra dependencies.\nTo share one config across projects, click "Modify Global Settings" and set stylelintConfigPath',
|
||
ja: 'プロジェクトで先にstylelintをインストール(npm install stylelint)しておく必要があります。\n\n拡張機能にはStylelintルール(recommendedベース)が同梱されており、設定不要で利用できます。\n「プロジェクト設定を作成」をクリックすると、プロジェクト直下に.stylelintrc.jsが生成されます。内容は組み込みルールと一致し(68件・各ルールに説明コメント付き)、追加依存なしで動作します。\n複数プロジェクトで同じルールを共有する場合、「グローバル設定を変更」で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.fixAllApply': {
|
||
'zh-CN': '全部应用',
|
||
en: 'Apply All',
|
||
ja: 'すべて適用',
|
||
},
|
||
'report.fixLabel': {
|
||
'zh-CN': '修复',
|
||
en: 'Fix',
|
||
ja: '修正',
|
||
},
|
||
'report.fixAILabel': {
|
||
'zh-CN': 'AI 修复',
|
||
en: 'AI Fix',
|
||
ja: 'AI修正',
|
||
},
|
||
'report.fixPreview': {
|
||
'zh-CN': '修复预览',
|
||
en: 'Fix Preview',
|
||
ja: '修正プレビュー',
|
||
},
|
||
'report.fixUnavailable': {
|
||
'zh-CN': '无预生成修复,点击修复将实时生成',
|
||
en: 'No pre-generated fix, click Fix to generate on demand',
|
||
ja: '事前生成された修正がありません。修正ボタンで生成します',
|
||
},
|
||
'report.fixedIssues': {
|
||
'zh-CN': '已修复',
|
||
en: 'Fixed',
|
||
ja: '修正済み',
|
||
},
|
||
'report.fixedLabel': {
|
||
'zh-CN': '已修复',
|
||
en: 'Fixed',
|
||
ja: '修正済み',
|
||
},
|
||
'report.undoFix': {
|
||
'zh-CN': '撤销',
|
||
en: 'Undo',
|
||
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.sqlfluffPRS': {
|
||
'zh-CN': 'SQL 解析失败(当前方言:{0}),可能是方言不匹配或语法错误。请在设置中配置 sqlfluff.dialect 或添加项目 .sqlfluff 指定正确方言。无法解析片段:{1}',
|
||
en: 'Failed to parse SQL (current dialect: {0}). Possible dialect mismatch or syntax error. Configure sqlfluff.dialect in settings or add a project .sqlfluff. Unparsable fragment: {1}',
|
||
ja: 'SQLの解析に失敗しました(現在の方言:{0})。方言の不一致または構文エラーの可能性があります。設定で sqlfluff.dialect を構成するか、プロジェクトに .sqlfluff を追加してください。解析不能な断片:{1}',
|
||
},
|
||
'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);
|
||
}
|