@deepseek-ai/dsh-client-locale 0.1.5-rc.2 → 0.1.6-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.i18n.yaml CHANGED
@@ -3,4 +3,4 @@
3
3
  # after editing either side, bring the other along and re-record with:
4
4
  # pnpm run verify-translation-pairing --write packages/client/locale/README.md
5
5
  README.md: 56a9cff9c3ec18dcc395378fcd1691207c022284
6
- README.zh.md: b23a1f2da59d0d83213d9c38e7cee05843881274
6
+ README.zh.md: 1b7a7b7de48843961f3cbac3f4ee99cff641d212
package/README.zh.md CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: "面向用户与插件作者的 web GUI 本地化说明:zh/en 偏好、浏览器派生回退、类型化命名空间词典与框架翻译席位。"
2
+ description: "面向用户与插件作者的 web GUI 本地化说明:zh/en 偏好、浏览器派生回退、类型化命名空间字典与框架翻译席位。"
3
3
  kind: "package-reference"
4
4
  ---
5
5
 
@@ -9,7 +9,7 @@ kind: "package-reference"
9
9
 
10
10
  ## 概述
11
11
 
12
- 使用 `dsh-client-locale` 可在 web GUI 中切换内置的 English、中文 locale,或 client 插件添加的语言。用户选择会立即生效;loopback 页面把选择持久化到 `$DSH_HOME/settings.yaml`,非 loopback 页面则只为当前进程保留选择。全新浏览器会使用浏览器请求的第一个受支持语言,直到允许读取的已存储偏好到达。插件作者可添加类型化命名空间字典,并通过公开 locale API 翻译;经 slot 渲染的文案无需重新加载即可随语言切换更新。
12
+ 使用 `dsh-client-locale` 可在 web GUI 中切换内置的英文和中文 locale,或 client 插件添加的语言。用户选择会立即生效;loopback 页面把选择持久化到 `$DSH_HOME/settings.yaml`,非 loopback 页面则只为当前进程保留选择。全新浏览器会使用浏览器请求的第一个受支持语言,直到允许读取的已存储偏好到达。插件作者可添加类型化命名空间字典,并通过公开 locale API 翻译;经 slot 渲染的文案无需重新加载即可随语言切换更新。
13
13
 
14
14
  ## 目录
15
15
 
@@ -17,7 +17,7 @@ kind: "package-reference"
17
17
  - [理解实现](#understand-the-implementation)
18
18
  - [进一步探索](#further-exploration)
19
19
  - [模型体验](#model-experience)
20
- - [已知限制与延期工作](#known-limitations-and-deferred-work)
20
+ - [已知限制与暂缓事项](#known-limitations-and-deferred-work)
21
21
  - [开发备注](#dev-note)
22
22
 
23
23
  -----
@@ -25,15 +25,15 @@ kind: "package-reference"
25
25
  <a id="use-this-package"></a>
26
26
  ## 使用本包
27
27
 
28
- 只要 web GUI 需要语言切换或翻译文案就使用它:已发布的设置行覆盖用户侧,插件作者则注册自己的词典。挂载无需任何配置——本包随客户端树一起激活。
28
+ 只要 web GUI 需要语言切换或翻译文案就使用它:已发布的设置行覆盖用户侧,插件作者则注册自己的字典。挂载无需任何配置——本包随客户端树一起激活。
29
29
 
30
30
  ### 选择语言
31
31
 
32
- 打开“设置 → 常规”并选择一种已注册语言。生效中的 locale 会立即应用:UI 文案切换、`<html lang>` 指向外部 id 或内置语言的文档标签,选择写入持久设置分区。没有显式 Host 偏好的浏览器会按完整标签、再按主子标签选择 `navigator` 请求的第一个已注册语言,无法匹配时回退到 English。已存储的外部 locale 会等待其定义注册,不会在不可用时生效。
32
+ 打开“设置 → 常规”并选择一种已注册语言。生效中的 locale 会立即应用:UI 文案切换、`<html lang>` 指向外部 id 或内置语言的文档标签,选择写入持久设置分区。没有显式 Host 偏好的浏览器会按完整标签、再按主语言子标签选择 `navigator` 请求的第一个已注册语言,无法匹配时回退到英文。已存储的外部 locale 会等待其定义注册,不会在不可用时生效。
33
33
 
34
- ### 注册词典
34
+ ### 注册字典
35
35
 
36
- 用已合并进 `LocaleNamespaceMap` 的命名空间调用 `ctx.locale.register(ns, { zh, en })`;编译器会对照该命名空间的类型化键并集检查每个键,并要求两个内置 locale 齐全。消费方通过 `ctx.locale.bind(ns)` 或框架注入的 `t` 席位翻译。UI 已挂载后再注册的词典无需重新挂载即可生效。
36
+ 用已合并进 `LocaleNamespaceMap` 的命名空间调用 `ctx.locale.register(ns, { zh, en })`;编译器会对照该命名空间的类型化键并集检查每个键,并要求两个内置 locale 齐全。消费方通过 `ctx.locale.bind(ns)` 或框架注入的 `t` 席位翻译。UI 已挂载后再注册的字典无需重新挂载即可生效。
37
37
 
38
38
  ### 注册语言包
39
39
 
@@ -75,24 +75,24 @@ Host 通过 settings 服务为 loopback 页面持久化偏好。Client 会刻意
75
75
 
76
76
  ### 设计理念
77
77
 
78
- 一个 `LocaleRuntime` 同时拥有偏好与词典注册表,并且自身就是 slot 系统的 `LocaleFace`:`getSnapshot`/`subscribe` 通过 `ctx.slots.installLocale` 支撑框架注入的 `t` 席位。不可变快照携带生效中的 locale、可选择的 locale 列表与单调 revision;词典注册与 locale 切换都会推进 revision,但只有切换会发出 `locale/change` 事件。产品编写的 Client UI 文本必须来自这些带类型的字典,或来自已经本地化的 primitive prop;`verify-client-ui-i18n` 强制执行该源码归属(见[决策](../../../.agents/notes/implemented/architecture/2026-08-23-locale-owned-client-ui-copy.zh.md))。
78
+ 一个 `LocaleRuntime` 同时拥有偏好与字典注册表,并且自身就是 slot 系统的 `LocaleFace`:`getSnapshot`/`subscribe` 通过 `ctx.slots.installLocale` 支撑框架注入的 `t` 席位。不可变快照携带生效中的 locale、可选择的 locale 列表与单调 revision;字典注册与 locale 切换都会推进 revision,但只有切换会发出 `locale/change` 事件。产品编写的 Client UI 文本必须来自这些带类型的字典,或来自已经本地化的 primitive prop;`verify-client-ui-i18n` 强制执行该源码归属(见[决策](../../../.agents/notes/implemented/architecture/2026-08-23-locale-owned-client-ui-copy.zh.md))。
79
79
 
80
80
  ### 偏好解析
81
81
 
82
- 临时 locale 来自浏览器(`navigator.languages` 先按完整标签、再按主子标签匹配,以 English 作为回退),在允许使用的 Host-backed settings scope 送达其存储偏好之前生效。Host 读取在插件激活后运行,因此 settings scope 不可用或被拒绝都不会阻塞页面,结果会实时替换临时值。已存储的外部 locale 会等待其定义注册。`setLocale` 是唯一写入入口;即使 id 已与生效中的 locale 匹配也会持久化,因为生效中的值可能是临时的,必须能在共享同一 home 的其他浏览器上存活。
82
+ 临时 locale 来自浏览器(`navigator.languages` 先按完整标签、再按主语言子标签匹配,以英文作为回退),在允许使用的 Host-backed settings scope 送达其存储偏好之前生效。Host 读取在插件激活后运行,因此 settings scope 不可用或被拒绝都不会阻塞页面,结果会实时替换临时值。已存储的外部 locale 会等待其定义注册。`setLocale` 是唯一写入入口;即使 id 已与生效中的 locale 匹配也会持久化,因为生效中的值可能是临时的,必须能供共享同一 home 的其他浏览器继续使用。
83
83
 
84
- ### 词典查找
84
+ ### 字典查找
85
85
 
86
- 带类型的对象形式要求两个内置 locale 都有完整字典;逐 locale 形式允许语言包独立注册每个命名空间。逐键查找会先在请求命名空间中沿生效语言声明的 fallback 链查找,再在 `common` 中重复该链,最后显示键本身。绑定的翻译函数按命名空间保持稳定身份,因此可以挂在 inject 表面上而不破坏 memoization。
86
+ 带类型的对象形式要求两个内置 locale 都有完整字典;逐 locale 形式允许语言包独立注册每个命名空间。逐键查找会先在请求命名空间中沿生效语言声明的 fallback 链查找,再在 `common` 中重复该链,最后显示键本身。绑定的翻译函数按命名空间保持稳定身份,因此可通过 inject 机制传递,且不会破坏 memoization。
87
87
 
88
88
  ### 源码地图
89
89
 
90
90
  | 文件 | 职责 |
91
91
  |---|---|
92
- | [`src/client/index.ts`](src/client/index.ts) | `LocaleRuntime`、词典注册表、Language 行注册、`locale/change` 事件 |
92
+ | [`src/client/index.ts`](src/client/index.ts) | `LocaleRuntime`、字典注册表、Language 行注册、`locale/change` 事件 |
93
93
  | [`src/index.ts`](src/index.ts) | node 半侧:注册 `locale` 设置命名空间 |
94
94
  | [`src/locale-settings.ts`](src/locale-settings.ts) | `locale.preference` 的持久 schema |
95
- | [`src/locales/`](src/locales/) | 已发布的 `zh`/`en` 词典 |
95
+ | [`src/locales/`](src/locales/) | 内置的 `zh`/`en` 字典 |
96
96
 
97
97
  </details>
98
98
 
@@ -101,7 +101,7 @@ Host 通过 settings 服务为 loopback 页面持久化偏好。Client 会刻意
101
101
  <a id="further-exploration"></a>
102
102
  ## 进一步探索
103
103
 
104
- 当 locale 约定不够用时阅读以下页面:它所实现的 slot 面孔、它所依托的设置界面,以及偏好背后的持久化决策。
104
+ 当仅阅读 locale 约定不足以解答问题时,请继续阅读以下页面,了解它实现的 slot 接口、依托的设置机制,以及偏好背后的持久化决策。
105
105
 
106
106
  - [客户端 slot 系统](../ui-slots/README.zh.md)——本包实现的 slot 模型与 `LocaleFace` 席位。
107
107
  - [Host 支撑偏好决策](../../../.agents/notes/implemented/bug-fix/2026-08-06-host-backed-web-preferences.zh.md)——偏好为何持久化在 Host 设置中而非浏览器里。
@@ -119,15 +119,15 @@ Host 通过 settings 服务为 loopback 页面持久化偏好。Client 会刻意
119
119
 
120
120
  无;该包既不组装也不发送提供方请求。
121
121
 
122
- ## 已知限制与延期工作
122
+ ## 已知限制与暂缓事项
123
123
 
124
124
  <a id="known-limitations-and-deferred-work"></a>
125
125
 
126
126
 
127
- 这些限制说明本地化在哪些地方不完整,或在注册时被冻结。它们是当前包约束,不是任务积压。
127
+ 这些限制说明本地化在哪些地方不完整,或在注册时被冻结。它们是当前包约束,不是待办事项清单。
128
128
 
129
129
  - **注册表持有的文本只读取一次翻译**——在 slot 渲染路径之外于注册时捕获的文案(例如 command 注册表中的 `/model` 命令描述)在重新注册前保持注册时的语言;slot 渲染的文案随切换实时更新。
130
- - **语言包负责语言特有行为**——注册表提供选择、持久化、浏览器匹配、逐 key 回退和 `<html lang>`;它不增加复数规则或双向布局。
130
+ - **语言包负责语言特有行为**——注册表提供选择、持久化、浏览器匹配、逐键回退和 `<html lang>`;它不增加复数规则或双向布局。
131
131
 
132
132
  <a id="dev-note"></a>
133
133
  ### 开发备注
package/lib/client.js CHANGED
@@ -847,8 +847,6 @@ window.__ModuleLoader__.load({
847
847
  "unknown": "未知",
848
848
  "none": "无",
849
849
  "truncated": "已截断",
850
- "json.collapseNode": "收起 JSON 节点",
851
- "json.expandNode": "展开 JSON 节点",
852
850
  "json.label": "JSON",
853
851
  "markdown.footnotes": "脚注",
854
852
  "markdown.truncatedCharacters": "… 已截断,共 {total} 字符",
@@ -891,8 +889,6 @@ window.__ModuleLoader__.load({
891
889
  "unknown": "Unknown",
892
890
  "none": "None",
893
891
  "truncated": "Truncated",
894
- "json.collapseNode": "Collapse JSON node",
895
- "json.expandNode": "Expand JSON node",
896
892
  "json.label": "JSON",
897
893
  "markdown.footnotes": "Footnotes",
898
894
  "markdown.truncatedCharacters": "… truncated at {total} characters",
@@ -32,8 +32,6 @@ export declare const en: {
32
32
  unknown: string;
33
33
  none: string;
34
34
  truncated: string;
35
- 'json.collapseNode': string;
36
- 'json.expandNode': string;
37
35
  'json.label': string;
38
36
  'markdown.footnotes': string;
39
37
  'markdown.truncatedCharacters': string;
@@ -32,8 +32,6 @@ export declare const zh: {
32
32
  unknown: string;
33
33
  none: string;
34
34
  truncated: string;
35
- 'json.collapseNode': string;
36
- 'json.expandNode': string;
37
35
  'json.label': string;
38
36
  'markdown.footnotes': string;
39
37
  'markdown.truncatedCharacters': string;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-client-locale",
3
3
  "description": "Locale plugin: Host-backed preference, extensible language catalog, browser fallback, and typed built-in dictionaries",
4
- "version": "0.1.5-rc.2",
4
+ "version": "0.1.6-alpha.1",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -45,15 +45,15 @@
45
45
  "@types/react": "~18.3.1",
46
46
  "react": "^18.2.0",
47
47
  "@deepseek-ai/cordis": "^4.0.2",
48
- "@deepseek-ai/dsh-api-remotes": "^0.1.5-rc.2",
49
- "@deepseek-ai/dsh-client-test-runtime": "^0.1.5-rc.2",
50
- "@deepseek-ai/dsh-client-ui-primitives": "^0.1.5-rc.2",
51
- "@deepseek-ai/dsh-client-store": "^0.1.5-rc.2",
52
- "@deepseek-ai/dsh-client-ui-settings": "^0.1.5-rc.2",
53
- "@deepseek-ai/dsh-client-ui-slots": "^0.1.5-rc.2",
54
- "@deepseek-ai/dsh-client-ui-renderer": "^0.1.5-rc.2",
55
- "@deepseek-ai/dsh-client-connection": "^0.1.5-rc.2",
56
- "@deepseek-ai/dsh-settings": "^0.1.5-rc.2"
48
+ "@deepseek-ai/dsh-client-test-runtime": "^0.1.6-alpha.1",
49
+ "@deepseek-ai/dsh-client-ui-primitives": "^0.1.6-alpha.1",
50
+ "@deepseek-ai/dsh-api-remotes": "^0.1.6-alpha.1",
51
+ "@deepseek-ai/dsh-client-store": "^0.1.6-alpha.1",
52
+ "@deepseek-ai/dsh-client-ui-settings": "^0.1.6-alpha.1",
53
+ "@deepseek-ai/dsh-client-ui-renderer": "^0.1.6-alpha.1",
54
+ "@deepseek-ai/dsh-client-ui-slots": "^0.1.6-alpha.1",
55
+ "@deepseek-ai/dsh-client-connection": "^0.1.6-alpha.1",
56
+ "@deepseek-ai/dsh-settings": "^0.1.6-alpha.1"
57
57
  },
58
58
  "dependencies": {
59
59
  "@deepseek-ai/schemastery": "^3.18.2"