Files
2026Technology-Competition/src/i18n/messages.ts
T
范智鹏 9c676e46e6 feat: AI 修复预生成 + 审查面板 diff 预览两步确认 + SQLFluff 行号修复 + PMD 内置规则精简
- 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 更新
2026-08-25 21:58:14 +08:00

1438 lines
55 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} 件の問題',
},
'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: 'JavaJSP内の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 环境与 sqlfluffpip 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環境とsqlfluffpip 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, TSXJSP内のJavaScriptコードを含む、例: <script>',
},
'setup.adapter.eslintHelp': {
'zh-CN': 'ESLint 需项目先安装 eslintnpm 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, LessJSP内のCSSコードを含む、例: <style>',
},
'setup.adapter.stylelintHelp': {
'zh-CN': 'Stylelint 需项目先安装 stylelintnpm 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);
}