From d6bb3c6032fe1919af8d735a7a1749dfa12555d1 Mon Sep 17 00:00:00 2001 From: ggbdpq Date: Fri, 4 Sep 2026 22:22:38 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix(patch):=20=E6=B8=B2=E6=9F=93=E5=B1=82?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=B7=A5=E4=BD=9C=E5=8C=BA=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E7=A6=81=E5=8C=BA=EF=BC=8C=E4=BB=A3=E7=A0=81=E4=B8=8E=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=90=8D=E4=B8=8D=E5=86=8D=E8=A2=AB=E6=B1=89=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 词典含单词级 exact 词条(cloud/text/a/New 等),而注入脚本此前始终扫描 document.body:Monaco 把每行代码按 token 切成独立文本节点,代码里的 cloud/text、 的 a、文件树里名为 cloud 的文件夹都会与词条精确撞车 (issue #2 的三个截图症状)。纯删词条治不了这一类问题——cloud→云端 本身是正当的界面词条。 修法是在 TreeWalker 过滤器(所有文本翻译的必经之路)加一层禁区检查: 文本节点的祖先命中 NO_TRANSLATE_SELECTOR 即拒绝翻译。禁区覆盖 .view-lines(主编辑器/diff/聊天代码块/Notebook 的代码渲染)、 .explorer-folders-view(文件树)、.search-view .results(搜索结果)、 .xterm-rows(终端输出)、.monaco-breadcrumbs(面包屑路径与符号)。 输入框 placeholder/title/aria-label 的属性翻译路径不受影响。 ponytail 局限:标签页标题、Open Editors、快速打开(Ctrl+P)里的文件名 若恰好与词条全等仍会被翻译,属混合 UI 区,暂不做精确切分;出现实例时 再把对应容器加入禁区列表即可。 Fixes #2 Generated-by: GLM-5.3-Flash (ZCode) --- .../__tests__/inject.workspace-zones.test.ts | 43 +++++++++++++++++++ .../patch-core/src/assets/cursor.inject.js | 18 ++++++++ 2 files changed, 61 insertions(+) create mode 100644 i18n/cursor-language-pack-zh-hans/src/__tests__/inject.workspace-zones.test.ts diff --git a/i18n/cursor-language-pack-zh-hans/src/__tests__/inject.workspace-zones.test.ts b/i18n/cursor-language-pack-zh-hans/src/__tests__/inject.workspace-zones.test.ts new file mode 100644 index 0000000..eed6ad8 --- /dev/null +++ b/i18n/cursor-language-pack-zh-hans/src/__tests__/inject.workspace-zones.test.ts @@ -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); + }); +}); diff --git a/packages/patch-core/src/assets/cursor.inject.js b/packages/patch-core/src/assets/cursor.inject.js index 77dc413..4dd2468 100644 --- a/packages/patch-core/src/assets/cursor.inject.js +++ b/packages/patch-core/src/assets/cursor.inject.js @@ -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 匹配(弯引号、不间断空格等)。 * @@ -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; From cb00f2f7affd56a72ce545651310aba29f8b1eb8 Mon Sep 17 00:00:00 2001 From: ggbdpq Date: Fri, 4 Sep 2026 22:22:38 +0800 Subject: [PATCH 2/3] =?UTF-8?q?chore:=20=E5=90=8C=E6=AD=A5=20lockfile=20?= =?UTF-8?q?=E4=B8=AD=E6=89=A9=E5=B1=95=20workspace=20=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7=200.0.4=20->=200.0.6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 18dfadb..998e067 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,7 @@ } }, "i18n/cursor-language-pack-zh-hans": { - "version": "0.0.4", + "version": "0.0.6", "license": "MIT", "dependencies": { "@cursor-loc/patch-core": "file:../../packages/patch-core" From abb8469aa257668f3a3a0df2e70b8a3a5a869f9a Mon Sep 17 00:00:00 2001 From: ggbdpq Date: Fri, 4 Sep 2026 22:24:08 +0800 Subject: [PATCH 3/3] =?UTF-8?q?chore(release):=20=E5=87=86=E5=A4=87=200.0.?= =?UTF-8?q?7=E2=80=94=E2=80=94=E7=89=88=E6=9C=AC=E5=8F=B7=E4=B8=8E=20CHANG?= =?UTF-8?q?ELOG=EF=BC=88=E5=B7=A5=E4=BD=9C=E5=8C=BA=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E7=A6=81=E5=8C=BA=E4=BF=AE=E5=A4=8D=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- i18n/cursor-language-pack-zh-hans/CHANGELOG.md | 6 ++++++ i18n/cursor-language-pack-zh-hans/package.json | 2 +- package-lock.json | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/i18n/cursor-language-pack-zh-hans/CHANGELOG.md b/i18n/cursor-language-pack-zh-hans/CHANGELOG.md index 8aee5e2..2fe2eaa 100644 --- a/i18n/cursor-language-pack-zh-hans/CHANGELOG.md +++ b/i18n/cursor-language-pack-zh-hans/CHANGELOG.md @@ -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`→`文本`、``→`<一个 />`、Java 包 `cloud`→`云端`)。渲染层注入脚本新增「工作区内容禁区」——编辑器代码(.view-lines,含 diff/聊天代码块/Notebook)、文件树、搜索结果、终端输出、面包屑内的文本一律不翻译;界面(设置/菜单/对话框)汉化不受影响 + ## [0.0.6] - 2026-08-31 ### Added diff --git a/i18n/cursor-language-pack-zh-hans/package.json b/i18n/cursor-language-pack-zh-hans/package.json index 231ee46..8475330 100644 --- a/i18n/cursor-language-pack-zh-hans/package.json +++ b/i18n/cursor-language-pack-zh-hans/package.json @@ -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" diff --git a/package-lock.json b/package-lock.json index 998e067..82fa94d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,7 @@ } }, "i18n/cursor-language-pack-zh-hans": { - "version": "0.0.6", + "version": "0.0.7", "license": "MIT", "dependencies": { "@cursor-loc/patch-core": "file:../../packages/patch-core"