mm_lang 2.0.0 → 3.0.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.md CHANGED
@@ -9,15 +9,15 @@
9
9
  - **当前版本**: 2.0.0
10
10
  - **更新日期**: 2026-10-30
11
11
  - **Gitee地址**: https://gitee.com/qiuwenwu91/mm_lang
12
- - **依赖**: `mm_corejs`(管理器)、`mm_kv_store`(键值存储基类)
12
+ - **依赖**: `mm_admin`(管理器)、`mm_kv_store`(键值存储基类)
13
13
 
14
14
  ## 模块结构
15
15
 
16
16
  | 文件 | 职责 |
17
17
  |---|---|
18
- | `lib/lang.js` | 行为侧:取词、回退链、复数、格式化,**不做文件 IO** |
19
- | `lib/langs.js` | 数据侧:string→string 键值、JSON 文件 save/load、值类型校验,**不感知词条嵌套语义** |
20
- | `lib/store.js` | 适配层:嵌套词条字典 ↔ 扁平键值互转、存储实例装配 |
18
+ | `lib/lang.js` | 行为侧:扁平词条表(`语言.层级键`→文本)上的取词、回退链、复数、格式化,只接受扁平入参,**不做文件 IO** |
19
+ | `lib/langs.js` | 数据侧:string→string 键值、JSON 文件 save/load、值类型校验,**不感知语言词条语义** |
20
+ | `lib/langs_admin.js` | 数据侧管理器:Langs 实例按作用域(文件路径)复用,供 Lang 与 langsAdmin 共用 |
21
21
 
22
22
  ## 特点
23
23
 
@@ -51,7 +51,7 @@ console.log(lang.tc('apple', 3)); // 3 apples
51
51
  const persisted = langAdmin('shop', { file: './data/lang.json', default: 'zh_cn' });
52
52
  persisted.load(); // 启动时从文件恢复词条
53
53
  persisted.set('nav.home', '首页');
54
- persisted.save(); // 扁平化为 "zh_cn.nav.home": "首页" 落盘
54
+ persisted.save(); // 内存词条表即扁平形态,直接落盘(相同 file 复用同一存储实例)
55
55
 
56
56
  // 只用存储(原 mm_langs 用法)
57
57
  const langs = new Langs({ file: './data/map.json' });
@@ -90,9 +90,11 @@ langs.set('en', 'english').save();
90
90
  | 方法 | 签名 | 返回值 | 说明 |
91
91
  | --- | --- | --- | --- |
92
92
  | setLang | `setLang(lang)` | `String` | 切换语言;找不到时先尝试基础语言映射,仍失败记日志并保持当前语言 |
93
- | getLangs | `getLangs()` | `Array<String>` | 支持的语言列表(排除 `default`、`fallback`、`locale`、`options`、`file`、`store`) |
93
+ | getLangs | `getLangs()` | `Array<String>` | 支持的语言列表(取词条键首段去重,无词条的语言不会出现) |
94
94
  | isSupported | `isSupported(lang)` | `Boolean` | 语言是否支持(含基础语言映射,控制键恒为 false) |
95
- | del | `del(lang)` | `Boolean` | 删除指定语言配置 |
95
+ | del | `del(lang)` | `Boolean` | 删除指定语言的全部词条 |
96
+ | hasLang | `hasLang(lang)` | `Boolean` | 某语言是否存在词条 |
97
+ | getDict | `getDict(lang)` | `Object|null` | 导出某语言词条为嵌套字典(形态与语言包文件一致),无词条返回 `null` |
96
98
  | set | `set(key, val)` | `any` | 向当前语言写入词条,支持 `a.b` 层级键 |
97
99
  | registerPlural | `registerPlural(lang, rule)` | `Boolean` | 注册复数规则,`rule(count)` 返回形式索引 |
98
100
 
@@ -101,7 +103,7 @@ langs.set('en', 'english').save();
101
103
  | 方法 | 签名 | 返回值 | 说明 |
102
104
  | --- | --- | --- | --- |
103
105
  | save | `save(file?)` | `Boolean` | 词条扁平化后经存储实例落盘;无存储实例返回 `false`(不抛异常) |
104
- | load | `load(file?)` | `Boolean` | 从存储实例读取并还原为嵌套字典合并进 `config`,文件中的词条优先;失败返回 `false` 且不改动内存词条 |
106
+ | load | `load(file?)` | `Boolean` | 从存储实例读取扁平键值直接合并进 `config`(结构一致无需转换),文件中的词条优先;失败返回 `false` 且不改动内存词条 |
105
107
 
106
108
  落盘格式为 `语言代码.层级键 → 文本` 的 string→string 键值,例如:
107
109
 
@@ -195,8 +197,7 @@ mm_lang/
195
197
  ├── index.js 入口:导出 Lang / Langs / admin / langs_admin / langAdmin / langsAdmin
196
198
  ├── lib/
197
199
  │ ├── lang.js 行为侧
198
- │ ├── langs.js 数据侧
199
- │ └── store.js 适配层
200
+ │ └── langs.js 数据侧
200
201
  ├── example/
201
202
  │ └── index.js
202
203
  ├── test.js
@@ -206,3 +207,12 @@ mm_lang/
206
207
  ## 许可证
207
208
 
208
209
  ISC
210
+
211
+ ## 工具契约(LLM 可调用)
212
+
213
+ 本模块 `tool/` 下登记以下工具契约,实现位于 `lib/tools/<name>/`,`tool/<name>/index.js` 仅为薄适配层。
214
+ 其它模块可直接 `require('<pkg>').tools.<name>` 复用实现,无需经过工具注册面。
215
+
216
+ | 工具名 | 标题 | 说明 |
217
+ | --- | --- | --- |
218
+ | `lang` | 多语言词条 | 按语言取词、写词条、语言清单 |
package/example/index.js CHANGED
@@ -11,22 +11,14 @@ const { Lang } = require('../index.js');
11
11
  function main() {
12
12
  console.log('=== 语言包翻译 ===');
13
13
 
14
- // 创建语言实例,字典为 语言代码 -> 词条对象
14
+ // 创建语言实例,词条表为扁平结构:键为 语言.层级键,值为文本或复数数组
15
15
  var lang = new Lang({
16
- zh_cn: {
17
- hello: '你好, {0}!',
18
- order: {
19
- count: ['共 {count} 个商品']
20
- },
21
- greet: ['你好', '你们好']
22
- },
23
- en: {
24
- hello: 'Hello, {0}!',
25
- order: {
26
- count: ['{count} item', '{count} items']
27
- },
28
- greet: ['Hello', 'Hello everyone']
29
- },
16
+ 'zh_cn.hello': '你好, {0}!',
17
+ 'zh_cn.order.count': ['共 {count} 个商品'],
18
+ 'zh_cn.greet': ['你好', '你们好'],
19
+ 'en.hello': 'Hello, {0}!',
20
+ 'en.order.count': ['{count} item', '{count} items'],
21
+ 'en.greet': ['Hello', 'Hello everyone'],
30
22
  default: 'zh_cn'
31
23
  });
32
24
 
package/index.js CHANGED
@@ -1,21 +1,15 @@
1
1
  const Lang = require('./lib/lang');
2
2
  const Langs = require('./lib/langs');
3
- const Admin = require('mm_corejs').Admin;
3
+ const langs_admin = require('./lib/langs_admin');
4
+ const { reg } = require('mm_admin');
4
5
 
5
6
  /**
6
7
  * 语言实例管理器(行为侧)
7
8
  * @type {Admin}
8
9
  */
9
- let admin = new Admin();
10
+ const admin = reg('lang');
10
11
  admin.setClass(Lang);
11
12
 
12
- /**
13
- * 语言存储实例管理器(数据侧)
14
- * @type {Admin}
15
- */
16
- let langs_admin = new Admin();
17
- langs_admin.setClass(Langs);
18
-
19
13
  /**
20
14
  * 获取语言实例
21
15
  * @param {string} scope 作用域
@@ -23,23 +17,19 @@ langs_admin.setClass(Langs);
23
17
  * @returns {Lang} 语言实例
24
18
  */
25
19
  function langAdmin(scope, config) {
26
- if (!scope) {
27
- scope = 'os';
28
- }
29
- return admin.get(scope, config);
20
+ return admin.get(scope || 'os', config);
30
21
  }
31
22
 
32
23
  /**
33
24
  * 获取语言存储实例,不存在时创建
25
+ * 与 Lang 内部使用同一 langs_admin 管理器:以文件路径为作用域时,
26
+ * 配置了相同 file 的 Lang 与 langsAdmin 取到的是同一个存储实例
34
27
  * @param {string} [scope] 作用域名称,缺省时使用 os
35
28
  * @param {Object} [config] 配置对象,含 file 持久化文件路径
36
29
  * @returns {Langs} 语言存储实例
37
30
  */
38
31
  function langsAdmin(scope, config) {
39
- if (!scope) {
40
- scope = 'os';
41
- }
42
- return langs_admin.get(scope, config);
32
+ return langs_admin.get(scope || 'os', config);
43
33
  }
44
34
 
45
35
  module.exports = {
@@ -50,3 +40,7 @@ module.exports = {
50
40
  langAdmin,
51
41
  langsAdmin
52
42
  };
43
+
44
+ /* mm-tool-logic-export 工具能力层:其它模块可 require("mm_lang").tools.<name> 直接引用 */
45
+ Object.defineProperty(module.exports, 'tools', { enumerable: true, configurable: true,
46
+ get: function () { return require('./lib/tools'); } });