Skip to content

Commit ab376d9

Browse files
authored
修复 Edge 商店简体中文语言识别 (#4)
1 parent d5d3ca1 commit ab376d9

11 files changed

Lines changed: 122 additions & 14 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# 更新日志
22

3+
## [3.0.1] - 2026-09-29
4+
5+
### 修复
6+
7+
- 补充简体中文语言声明,使 Edge 商店正确识别扩展语言并提供中文介绍页。
8+
- 打包流程纳入语言文件,检查缺失的语言消息引用。
9+
310
## [3.0.0] - 2026-09-29
411

512
### 新增
@@ -29,3 +36,4 @@
2936
更早版本尚未整理为独立发行记录,历史改动见 [Git 提交记录](https://github.com/aredddd/GlassNote/commits/main/)。
3037

3138
[3.0.0]: https://github.com/aredddd/GlassNote/releases/tag/v3.0.0
39+
[3.0.1]: https://github.com/aredddd/GlassNote/releases/tag/v3.0.1

‎PRIVACY.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# GlassNote 隐私说明
22

3-
更新日期:2026 年 9 月 29 日。适用于 GlassNote 3.0.0。
3+
更新日期:2026 年 9 月 29 日。适用于 GlassNote 3.0.1。
44

55
GlassNote 是网页标注与笔记扩展。笔记保存在你使用的浏览器中;扩展没有账号系统、开发者服务器、广告或使用分析服务,不向开发者或第三方上传网页内容和笔记。
66

‎_locales/zh_CN/messages.json‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"extensionName": {
3+
"message": "GlassNote"
4+
},
5+
"extensionDescription": {
6+
"message": "轻盈的网页高亮与笔记工具。自动找回原文位置,本地保存,随时整理和导出。"
7+
}
8+
}

‎docs/EDGE_STORE.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Edge 商店发布材料
22

3-
对应版本:3.0.0。此文件是提交材料,不代表已经提交审核或已经上架。
3+
对应版本:3.0.1。此文件是提交材料,不代表已经提交审核或已经上架。
44

55
## 商店字段
66

@@ -57,7 +57,7 @@ GlassNote 用于在网页中标注文字、记录笔记,并在以后打开同
5757

5858
## 资源规格与官方入口
5959

60-
安装包位于 dist/GlassNote-v3.0.0.zip;商店图标可用 assets/icon-128.png。截图使用扩展实际运行界面,尺寸为 1280 × 800,不放入用户的私人笔记或第三方宣传素材。
60+
安装包位于 dist/GlassNote-v3.0.1.zip;商店图标可用 assets/icon-128.png。截图使用扩展实际运行界面,尺寸为 1280 × 800,不放入用户的私人笔记或第三方宣传素材。
6161

6262
- [Edge 开发者注册](https://learn.microsoft.com/en-us/microsoft-edge/extensions/publish/create-dev-account)
6363
- [Edge 扩展发布说明](https://learn.microsoft.com/en-us/microsoft-edge/extensions/publish/publish-extension)

‎manifest.json‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
{
22
"manifest_version": 3,
3-
"name": "GlassNote",
4-
"version": "3.0.0",
3+
"name": "__MSG_extensionName__",
4+
"version": "3.0.1",
5+
"default_locale": "zh_CN",
56
"minimum_chrome_version": "105",
6-
"description": "轻盈的网页高亮与笔记工具。自动找回原文位置,本地保存,随时整理和导出。",
7+
"description": "__MSG_extensionDescription__",
78
"permissions": ["activeTab", "storage", "scripting"],
89
"background": { "service_worker": "src/background/background.js" },
910
"options_page": "src/library/library.html",

‎package-lock.json‎

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎package.json‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
{
22
"name": "glassnote",
3-
"version": "3.0.0",
3+
"version": "3.0.1",
44
"private": true,
55
"description": "轻盈、可靠的本地网页笔记工具",
66
"scripts": {
77
"test": "node --test tests/*.test.cjs",
88
"test:e2e": "node --test tests/extension.e2e.cjs",
99
"test:live": "node tests/live-site.cjs",
1010
"check": "node scripts/check.cjs",
11-
"format": "prettier --write src styles scripts tests .github docs manifest.json package.json package-lock.json \"*.md\"",
12-
"format:check": "prettier --check src styles scripts tests .github docs manifest.json package.json package-lock.json \"*.md\"",
11+
"format": "prettier --write src styles _locales scripts tests .github docs manifest.json package.json package-lock.json \"*.md\"",
12+
"format:check": "prettier --check src styles _locales scripts tests .github docs manifest.json package.json package-lock.json \"*.md\"",
1313
"package": "node scripts/package.cjs",
1414
"package:verify": "node scripts/verify-package.cjs"
1515
},

‎scripts/check.cjs‎

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,30 @@ function walk(directory) {
1212
}
1313
walk(path.join(root, 'src'));
1414
const manifest = JSON.parse(fs.readFileSync(path.join(root, 'manifest.json'), 'utf8'));
15+
const localeReferences = [...JSON.stringify(manifest).matchAll(/__MSG_([A-Za-z0-9_]+)__/g)].map(
16+
(match) => match[1],
17+
);
18+
const localeRoot = path.join(root, '_locales');
19+
if ((localeReferences.length || fs.existsSync(localeRoot)) && !manifest.default_locale)
20+
throw new Error('使用语言包时必须声明 default_locale');
21+
if (manifest.default_locale) {
22+
if (!/^[A-Za-z0-9_]+$/.test(manifest.default_locale))
23+
throw new Error('default_locale 必须是合法的语言目录名');
24+
const messagesPath = path.join(localeRoot, manifest.default_locale, 'messages.json');
25+
if (!fs.existsSync(messagesPath)) throw new Error('缺少默认语言包:' + messagesPath);
26+
const messages = JSON.parse(fs.readFileSync(messagesPath, 'utf8'));
27+
if (!messages || typeof messages !== 'object' || Array.isArray(messages))
28+
throw new Error('语言包必须是消息名称到消息内容的对象');
29+
const normalizedMessages = new Map();
30+
for (const [key, value] of Object.entries(messages)) {
31+
if (!value || typeof value.message !== 'string' || !value.message.trim())
32+
throw new Error('语言包消息内容不能为空:' + key);
33+
normalizedMessages.set(key.toLowerCase(), value.message);
34+
}
35+
for (const key of localeReferences)
36+
if (!normalizedMessages.has(key.toLowerCase()))
37+
throw new Error('默认语言包缺少 manifest 引用的消息:' + key);
38+
}
1539
const files = [
1640
manifest.background.service_worker,
1741
manifest.action.default_popup,
@@ -31,4 +55,4 @@ for (const [size, file] of Object.entries(manifest.icons)) {
3155
)
3256
throw new Error('扩展图标必须是正确尺寸的 PNG:' + file);
3357
}
34-
console.log('JavaScript 语法和扩展入口检查通过。');
58+
console.log('JavaScript 语法、扩展入口和语言包检查通过。');

‎scripts/package-lib.cjs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ const REQUIRED_FILES = [
1313
'SECURITY.md',
1414
];
1515
const TREES = {
16+
_locales: /\.json$/,
1617
src: /\.(js|html|css)$/,
1718
styles: /\.css$/,
1819
assets: /\.(png|svg|ico|webp)$/,

‎tests/extension.e2e.cjs‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,20 @@ after(async () => {
9898
fs.rmSync(profile, { recursive: true, force: true });
9999
});
100100

101+
test('真实扩展:默认简体中文语言资源可解析', async () => {
102+
const localized = await worker.evaluate(() => ({
103+
name: chrome.runtime.getManifest().name,
104+
description: chrome.runtime.getManifest().description,
105+
message: chrome.i18n.getMessage('extensionDescription'),
106+
}));
107+
assert.equal(localized.name, 'GlassNote');
108+
assert.equal(
109+
localized.description,
110+
'轻盈的网页高亮与笔记工具。自动找回原文位置,本地保存,随时整理和导出。',
111+
);
112+
assert.equal(localized.message, localized.description);
113+
});
114+
101115
test('真实扩展:跨节点标注不破坏链接,隐藏保留原文,刷新和关页重开恢复', async () => {
102116
await openArticle();
103117
const beforeHTML = await page.locator('#linked').innerHTML();

0 commit comments

Comments
 (0)