From 7ff6f3b48e1bdea01bcc1290b116ba660d62ba83 Mon Sep 17 00:00:00 2001 From: li1553770945 <1553770945@qq.com> Date: Sun, 29 Jun 2025 22:55:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:vscode=E7=8E=AF=E5=A2=83=E4=B8=8B=E6=A0=B9?= =?UTF-8?q?=E6=8D=AE=E8=AE=BE=E7=BD=AE=E8=AF=AD=E8=A8=80=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E9=80=89=E6=8B=A9l10n=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/extension.ts | 7 +++++- src/i18n/index.ts | 63 ++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 65 insertions(+), 5 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index b098e6a..97538c8 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,7 +1,7 @@ import * as vscode from 'vscode'; import { setRunningCWD, setVscodeWorkspace } from '../openmcp-sdk/service/index.js'; import { launch } from './common/entry.js'; -import { initialiseI18n } from './i18n/index.js'; +import { initialiseI18n, getAvailableKeys } from './i18n/index.js'; export function activate(context: vscode.ExtensionContext) { console.log('activate openmcp'); @@ -13,6 +13,11 @@ export function activate(context: vscode.ExtensionContext) { setVscodeWorkspace(workspace); setRunningCWD(context.extensionPath); initialiseI18n(context); + + // 添加i18n调试信息 + console.log('Current language:', vscode.env.language); + console.log('Available i18n keys:', getAvailableKeys().length); + launch(context); } diff --git a/src/i18n/index.ts b/src/i18n/index.ts index 4e176eb..2cb183a 100644 --- a/src/i18n/index.ts +++ b/src/i18n/index.ts @@ -1,26 +1,81 @@ import * as vscode from 'vscode'; import * as fs from 'fs'; +import * as path from 'path'; const defaultBundle: Record = {} export function initialiseI18n(context: vscode.ExtensionContext) { if (vscode.l10n.bundle === undefined) { - const bundlePath = context.asAbsolutePath('l10n/bundle.l10n.en.json'); - const bundle = JSON.parse(fs.readFileSync(bundlePath, { encoding: 'utf-8' })) as Record; - Object.assign(defaultBundle, bundle); + // 获取用户的语言设置 + const userLanguage = vscode.env.language; + + // 尝试加载用户语言对应的语言包 + let bundlePath = context.asAbsolutePath(`l10n/bundle.l10n.${userLanguage}.json`); + + // 如果用户语言的语言包不存在,回退到英语 + if (!fs.existsSync(bundlePath)) { + bundlePath = context.asAbsolutePath('l10n/bundle.l10n.en.json'); + } + + try { + const bundle = JSON.parse(fs.readFileSync(bundlePath, { encoding: 'utf-8' })) as Record; + Object.assign(defaultBundle, bundle); + } catch (error) { + console.error('Failed to load i18n bundle:', error); + // 如果加载失败,尝试加载英语包作为最后的回退 + try { + const fallbackPath = context.asAbsolutePath('l10n/bundle.l10n.en.json'); + const fallbackBundle = JSON.parse(fs.readFileSync(fallbackPath, { encoding: 'utf-8' })) as Record; + Object.assign(defaultBundle, fallbackBundle); + } catch (fallbackError) { + console.error('Failed to load fallback i18n bundle:', fallbackError); + } + } } } export function t(message: string, ...args: string[]): string { if (vscode.l10n.bundle === undefined) { + // 使用自定义的语言包 let translateMessage = defaultBundle[message] || message; - for (let i = 0; i < args.length; ++ i) { + // 替换占位符 {0}, {1}, {2} 等 + for (let i = 0; i < args.length; i++) { translateMessage = translateMessage.replace(`{${i}}`, args[i]); } return translateMessage; } else { + // 使用 VS Code 的 l10n API return vscode.l10n.t(message, ...args); } +} + +/** + * 获取当前使用的语言 + */ +export function getCurrentLanguage(): string { + return vscode.env.language; +} + +/** + * 获取已加载的翻译键列表,用于调试 + */ +export function getAvailableKeys(): string[] { + if (vscode.l10n.bundle === undefined) { + return Object.keys(defaultBundle); + } + return []; +} + +/** + * 检查是否有特定键的翻译 + */ +export function hasTranslation(key: string): boolean { + if (vscode.l10n.bundle === undefined) { + return key in defaultBundle; + } + // VS Code 的 l10n API 没有直接的方法检查,我们尝试翻译并比较 + const translated = vscode.l10n.t(key); + return translated !== key; } \ No newline at end of file