-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathextension.js
More file actions
267 lines (239 loc) · 8.83 KB
/
Copy pathextension.js
File metadata and controls
267 lines (239 loc) · 8.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
const vscode = require('vscode');
const fs = require('fs');
const path = require('path');
const Locator = require('./lib/locator');
const Translator = require('./lib/translator');
const BackupManager = require('./lib/backup');
const ConfigManager = require('./lib/config');
/**
* 原子写入:先写临时文件再 rename,防止中途失败导致文件损坏
*/
function atomicWriteSync(filePath, content) {
const tmpPath = filePath + '.tmp';
fs.writeFileSync(tmpPath, content, 'utf8');
fs.renameSync(tmpPath, filePath);
}
/**
* 扩展激活时调用
*/
async function activate(context) {
console.log('Claude Code 汉化扩展已激活');
const config = new ConfigManager();
const locator = new Locator(config);
const backup = new BackupManager(config);
const translator = new Translator(config);
// 状态栏按钮
const statusBarItem = vscode.window.createStatusBarItem(
vscode.StatusBarAlignment.Right,
100
);
statusBarItem.text = "$(globe) Claude 汉化";
statusBarItem.tooltip = "Claude Code 汉化状态";
statusBarItem.command = 'claudeCodeZhCn.openConfig';
statusBarItem.show();
context.subscriptions.push(statusBarItem);
// 注册命令:应用汉化
let applyCommand = vscode.commands.registerCommand(
'claudeCodeZhCn.applyTranslation',
async () => {
await applyTranslation(locator, translator, backup, config);
}
);
context.subscriptions.push(applyCommand);
// 注册命令:还原原版
let restoreCommand = vscode.commands.registerCommand(
'claudeCodeZhCn.restoreOriginal',
async () => {
await restoreOriginal(locator, backup, config);
}
);
context.subscriptions.push(restoreCommand);
// 注册命令:打开配置
let configCommand = vscode.commands.registerCommand(
'claudeCodeZhCn.openConfig',
() => {
vscode.commands.executeCommand(
'workbench.action.openSettings',
'claudeCodeZhCn'
);
}
);
context.subscriptions.push(configCommand);
// 注册命令:重新加载汉化
let reloadCommand = vscode.commands.registerCommand(
'claudeCodeZhCn.reloadExtension',
async () => {
// 强制重新汉化:有备份时先还原再汉化
await applyTranslation(locator, translator, backup, config, false, true);
}
);
context.subscriptions.push(reloadCommand);
// 监听 Claude Code 扩展的安装/更新
vscode.extensions.onDidChange(async () => {
if (config.get('autoApplyOnUpdate')) {
const claudeExt = vscode.extensions.getExtension(
config.get('claudeCodeExtensionId')
);
if (claudeExt) {
setTimeout(async () => {
await applyTranslation(locator, translator, backup, config, true);
}, 1000);
}
}
});
// 启动时自动应用汉化
if (config.get('autoApplyOnStartup')) {
// 延迟执行,确保所有扩展都已加载
setTimeout(async () => {
await applyTranslation(locator, translator, backup, config, true);
}, 2000);
}
}
/**
* 应用汉化
* @param {boolean} silent - 静默模式(启动时自动调用)
* @param {boolean} forceReapply - 强制重新汉化(重新加载命令使用)
*/
async function applyTranslation(locator, translator, backup, config, silent = false, forceReapply = false) {
try {
// 定位 Claude Code 扩展
const claudePath = await locator.findClaudeCodeExtension();
if (!claudePath) {
vscode.window.showErrorMessage(
'Claude Code 扩展未安装或未找到'
);
return;
}
// 找到 webview 文件
const mainFilePath = locator.findMainFile(claudePath);
if (!mainFilePath) {
vscode.window.showErrorMessage(
'未找到 Claude Code 扩展的 webview 文件'
);
return;
}
// 检查是否已汉化(备份文件存在则说明已汉化)
const hasExistingBackup = backup.hasBackup(mainFilePath);
if (hasExistingBackup) {
if (silent && !forceReapply) {
// 静默模式下,已汉化则跳过
console.log('检测到备份文件,已汉化,跳过重复汉化');
return;
}
if (forceReapply) {
// 强制重新汉化:先还原备份,再重新汉化
console.log('强制重新汉化:先还原备份');
await backup.restoreBackup(mainFilePath);
}
}
// 创建备份(如果没有现有备份)
if (config.get('createBackup') && !hasExistingBackup) {
const backupCreated = await backup.createBackup(mainFilePath);
if (!backupCreated) {
const choice = await vscode.window.showWarningMessage(
'备份创建失败,是否继续?',
'继续', '取消'
);
if (choice !== '继续') return;
}
}
// 读取文件内容
let content = fs.readFileSync(mainFilePath, 'utf8');
// 应用三阶段汉化
content = await translator.translate(content);
// 写入文件(原子写入:临时文件 + rename,防止中途失败导致文件损坏)
atomicWriteSync(mainFilePath, content);
// 翻译 package.json 中的设置面板文本
const packageJsonPath = locator.findPackageJson(claudePath);
if (packageJsonPath) {
const hasPkgBackup = backup.hasBackup(packageJsonPath);
if (forceReapply && hasPkgBackup) {
await backup.restoreBackup(packageJsonPath);
}
if (config.get('createBackup') && !hasPkgBackup) {
await backup.createBackup(packageJsonPath);
}
let pkgContent = fs.readFileSync(packageJsonPath, 'utf8');
pkgContent = await translator.translatePackageJson(pkgContent);
atomicWriteSync(packageJsonPath, pkgContent);
console.log('package.json 汉化完成');
}
// 通知用户
if (config.get('showNotifications') && !silent) {
const choice = await vscode.window.showInformationMessage(
'汉化应用成功!需要重新打开新的聊天窗口或者重新加载窗口以生效。',
'立即重新加载', '稍后'
);
if (choice === '立即重新加载') {
vscode.commands.executeCommand('workbench.action.reloadWindow');
}
}
} catch (error) {
vscode.window.showErrorMessage(
`汉化应用失败:${error.message}`
);
console.error(error);
}
}
/**
* 还原原版
*/
async function restoreOriginal(locator, backup, config) {
try {
// 定位 Claude Code 扩展
const claudePath = await locator.findClaudeCodeExtension();
if (!claudePath) {
vscode.window.showErrorMessage(
'Claude Code 扩展未安装或未找到'
);
return;
}
// 找到 webview 文件
const mainFilePath = locator.findMainFile(claudePath);
if (!mainFilePath) {
vscode.window.showErrorMessage(
'未找到 Claude Code 扩展的 webview 文件'
);
return;
}
// 还原备份
const restored = await backup.restoreBackup(mainFilePath);
if (!restored) {
vscode.window.showErrorMessage(
'备份文件不存在,无法还原'
);
return;
}
// 还原 package.json 备份
const packageJsonPath = locator.findPackageJson(claudePath);
if (packageJsonPath && backup.hasBackup(packageJsonPath)) {
await backup.restoreBackup(packageJsonPath);
console.log('package.json 已还原');
}
// 通知用户
if (config.get('showNotifications')) {
const choice = await vscode.window.showInformationMessage(
'已还原到原版!需要重新打开新的聊天窗口或者重新加载窗口以生效。',
'立即重新加载', '稍后'
);
if (choice === '立即重新加载') {
vscode.commands.executeCommand('workbench.action.reloadWindow');
}
}
} catch (error) {
vscode.window.showErrorMessage(
`还原失败:${error.message}`
);
console.error(error);
}
}
/**
* 扩展停用时调用
*/
function deactivate() {
console.log('Claude Code 汉化扩展已停用');
}
module.exports = {
activate,
deactivate
};