Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions i18n/cursor-language-pack-zh-hans/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@

本文件遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。

## [0.0.7] - 2026-09-04

### Fixed

- 修复代码与项目文件内容被汉化(#2):词典里的单词级 exact 词条(cloud/text/a 等)此前会与编辑器按 token 切分的代码文本节点、文件树里的文件名撞车(如代码中的 `text`→`文本`、`<a />`→`<一个 />`、Java 包 `cloud`→`云端`)。渲染层注入脚本新增「工作区内容禁区」——编辑器代码(.view-lines,含 diff/聊天代码块/Notebook)、文件树、搜索结果、终端输出、面包屑内的文本一律不翻译;界面(设置/菜单/对话框)汉化不受影响

## [0.0.6] - 2026-08-31

### Added
Expand Down
2 changes: 1 addition & 1 deletion i18n/cursor-language-pack-zh-hans/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "cursor-language-pack-zh-hans",
"displayName": "Cursor 专有界面汉化 (简体中文)",
"description": "为 Cursor Settings、Agent、Composer 等专有界面提供简体中文。建议与 Microsoft 中文语言包配合使用。支持 Windows 与 macOS(beta)。",
"version": "0.0.6",
"version": "0.0.7",
"publisher": "ggbdpq",
"author": {
"name": "ggbdpq"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/**
* 工作区内容禁区契约测试(issue #2)。
*
* 词典含单词级 exact 词条(cloud/text/a 等),而注入脚本默认扫描整个
* document.body,Monaco 按 token 切分 text node,代码 token 与文件名会
* 被 exact 词条撞中。修复方式是在 TreeWalker 过滤器里加禁区(closest),
* 本测试锁定「禁区选择器存在且在文本节点过滤器中生效」这一契约——
* 真实渲染行为的验收由 tools/e2e-coverage.mjs(CDP 实机采样)覆盖。
*/
import { describe, it, expect } from 'vitest';
import { readFileSync } from 'node:fs';
import { join } from 'node:path';

// 扩展编译为 CommonJS(tsc 禁用 import.meta),vitest 的 cwd 即本扩展根目录
const assetPath = join(
process.cwd(),
'..',
'..',
'packages',
'patch-core',
'src',
'assets',
'cursor.inject.js',
);

describe('cursor.inject.js 工作区禁区', () => {
const source = readFileSync(assetPath, 'utf-8');

it('声明禁区选择器,覆盖编辑器代码与文件树', () => {
expect(source).toContain("'.view-lines'");
expect(source).toContain("'.explorer-folders-view'");
expect(source).toContain("'.xterm-rows'");
});

it('文本节点过滤器在放行前先做禁区检查', () => {
// closest 检查必须位于 FILTER_ACCEPT 之前的同函数内,防止后续改动把禁区判断挪丢
const filterIdx = source.indexOf('acceptNode');
const closestIdx = source.indexOf('parent.closest(NO_TRANSLATE_SELECTOR)');
const acceptIdx = source.indexOf('NodeFilter.FILTER_ACCEPT', closestIdx);
expect(closestIdx).toBeGreaterThan(filterIdx);
expect(acceptIdx).toBeGreaterThan(closestIdx);
});
});
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

18 changes: 18 additions & 0 deletions packages/patch-core/src/assets/cursor.inject.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,21 @@
'.workbench',
];

/**
* 工作区内容禁区:命中这些选择器的文本节点一律不翻译。
*
* 编辑器代码(.view-lines 覆盖主编辑器、diff、聊天代码块、Notebook)、
* 文件树、搜索结果、终端输出、面包屑——这些是用户代码与文件名,
* 词典里的单词级 exact 词条(cloud/text/New 等)会与代码 token 撞车。
*/
var NO_TRANSLATE_SELECTOR = [
'.view-lines',
'.explorer-folders-view',
'.search-view .results',
'.xterm-rows',
'.monaco-breadcrumbs',
].join(', ');

/**
* 规范化 UI 文本,便于 exact 匹配(弯引号、不间断空格等)。
*
Expand Down Expand Up @@ -178,6 +193,9 @@
if (tag === 'SCRIPT' || tag === 'STYLE' || tag === 'TEXTAREA' || tag === 'INPUT') {
return NodeFilter.FILTER_REJECT;
}
if (parent.closest(NO_TRANSLATE_SELECTOR)) {
return NodeFilter.FILTER_REJECT;
}
return node.textContent.trim()
? NodeFilter.FILTER_ACCEPT
: NodeFilter.FILTER_REJECT;
Expand Down
Loading