@thor123141245r/ai-translate 0.0.0 → 1.0.0

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.
Files changed (64) hide show
  1. package/README.md +71 -22
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +77 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/i18n/align.d.ts +3 -0
  6. package/dist/i18n/align.d.ts.map +1 -0
  7. package/dist/i18n/align.js +46 -0
  8. package/dist/i18n/align.js.map +1 -0
  9. package/dist/i18n/cache.d.ts +14 -0
  10. package/dist/i18n/cache.d.ts.map +1 -0
  11. package/dist/i18n/cache.js +36 -0
  12. package/dist/i18n/cache.js.map +1 -0
  13. package/dist/i18n/command.d.ts +7 -0
  14. package/dist/i18n/command.d.ts.map +1 -0
  15. package/dist/i18n/command.js +84 -0
  16. package/dist/i18n/command.js.map +1 -0
  17. package/dist/i18n/extract.d.ts +7 -0
  18. package/dist/i18n/extract.d.ts.map +1 -0
  19. package/dist/i18n/extract.js +24 -0
  20. package/dist/i18n/extract.js.map +1 -0
  21. package/dist/i18n/json-path.d.ts +7 -0
  22. package/dist/i18n/json-path.d.ts.map +1 -0
  23. package/dist/i18n/json-path.js +61 -0
  24. package/dist/i18n/json-path.js.map +1 -0
  25. package/dist/i18n/parse.d.ts +6 -0
  26. package/dist/i18n/parse.d.ts.map +1 -0
  27. package/dist/i18n/parse.js +44 -0
  28. package/dist/i18n/parse.js.map +1 -0
  29. package/dist/i18n/placeholders.d.ts +7 -0
  30. package/dist/i18n/placeholders.d.ts.map +1 -0
  31. package/dist/i18n/placeholders.js +44 -0
  32. package/dist/i18n/placeholders.js.map +1 -0
  33. package/dist/i18n/prompt.d.ts +13 -0
  34. package/dist/i18n/prompt.d.ts.map +1 -0
  35. package/dist/i18n/prompt.js +37 -0
  36. package/dist/i18n/prompt.js.map +1 -0
  37. package/dist/i18n/translate.d.ts +29 -0
  38. package/dist/i18n/translate.d.ts.map +1 -0
  39. package/dist/i18n/translate.js +199 -0
  40. package/dist/i18n/translate.js.map +1 -0
  41. package/dist/index.d.ts +1 -0
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +1 -0
  44. package/dist/index.js.map +1 -1
  45. package/package.json +5 -1
  46. package/.agentdocs/code-changes/2026-01-22/AI/347/277/273/350/257/221/345/231/250TS/345/256/236/347/216/260-/345/256/236/347/216/260.md +0 -22
  47. package/.agentdocs/code-changes/2026-01-23/CLI/345/210/206/345/217/221-npx/345/256/236/347/216/260.md +0 -18
  48. package/.agentdocs/code-changes/2026-01-23/sora-watermask-remover-/345/233/275/351/231/205/345/214/226/347/277/273/350/257/221-/345/256/236/347/216/260.md +0 -37
  49. package/.agentdocs/code-changes/2026-01-23//351/205/215/347/275/256/350/257/273/345/217/226-/347/216/257/345/242/203/345/217/230/351/207/217/344/274/230/345/205/210-/345/256/236/347/216/260.md +0 -22
  50. package/.agentdocs/plans/2026-01-22/AI/347/277/273/350/257/221/345/231/250TS/345/256/236/347/216/260-/344/274/230/345/214/226/346/226/271/346/241/210.md +0 -67
  51. package/.agentdocs/plans/2026-01-23/CLI/345/210/206/345/217/221-npx/346/226/271/346/241/210.md +0 -60
  52. package/.agentdocs/plans/2026-01-23/sora-watermask-remover-/345/233/275/351/231/205/345/214/226/347/277/273/350/257/221-/344/274/230/345/214/226/346/226/271/346/241/210.md +0 -51
  53. package/.agentdocs/plans/2026-01-23//351/205/215/347/275/256/350/257/273/345/217/226-/347/216/257/345/242/203/345/217/230/351/207/217/344/274/230/345/205/210-/344/274/230/345/214/226/346/226/271/346/241/210.md +0 -80
  54. package/SKILL.md +0 -103
  55. package/src/asyncTransform.ts +0 -31
  56. package/src/bin/ai-translate.ts +0 -5
  57. package/src/cli.ts +0 -313
  58. package/src/index.ts +0 -9
  59. package/src/logger.ts +0 -3
  60. package/src/model.ts +0 -139
  61. package/src/prompt.ts +0 -71
  62. package/src/split.ts +0 -111
  63. package/src/utils.ts +0 -15
  64. package/tsconfig.json +0 -19
package/README.md CHANGED
@@ -1,12 +1,23 @@
1
- # i18n-copywriter AI 翻译器 TS 实现
1
+ # ai-translate:可复用的 AI 翻译 CLI 与 i18n JSON 批量翻译
2
2
 
3
- 本仓库提供 `ai-translate` 的 TypeScript 等价实现,复用官方库的模块结构与接口,面向本地脚本与可复用模块两种用法。
3
+ 本仓库是 npm 包 `@thor123141245r/ai-translate` 的源码,提供两类能力:
4
+ - 通用文件翻译:把任意文本文件分块后交给大模型翻译(适合 Markdown、代码注释、技术文档等)
5
+ - i18n JSON 翻译:以 `en.json` 为标准,批量生成/补齐多语言 JSON(严格保留 key 与结构,只翻译字符串 value)
6
+
7
+ 设计目标是“结构在本地处理,模型只做翻译”,避免把大文件或结构化数据整段塞进模型上下文导致不稳定。
4
8
 
5
9
  ## 功能概览
6
- - CLI:`ai-translate` 命令行翻译
7
- - 模块:`AiTranslateTransform`、`TextSplitterStream` 等可复用组件
8
- - 配置:`.ai-translate.json` 本地或全局配置
9
- - 最小验证脚本:本地可运行的快速自测
10
+ - CLI
11
+ - `ai-translate` 通用文件翻译
12
+ - `ai-translate i18n` i18n JSON 批量翻译
13
+ - 模块:`AiTranslateTransform`、`TextSplitterStream`、`translateI18nDir` 等可复用组件
14
+ - 配置:`.ai-translate.json` 本地或全局配置(支持环境变量覆盖)
15
+ - 兼容多模型提供方:ollama / openai / anthropic / mistral / deepseek(通过 LangChain 官方 SDK)
16
+ - i18n 专用能力:
17
+ - 仅翻译 value,不改 key
18
+ - 批处理调用,避免上下文混乱
19
+ - 占位符保护(例如 `{{name}}`、`{name}`、`%s`)
20
+ - 本地缓存,减少重复翻译
10
21
 
11
22
  ## 参数一览
12
23
 
@@ -22,6 +33,7 @@
22
33
  | `-o`, `--output FILE` | 输出文件路径 | |
23
34
  | `--format FORMAT` | 指定输入格式 | 支持 `cpp`、`go`、`java`、`js`、`php`、`proto`、`python`、`rst`、`ruby`、`rust`、`scala`、`swift`、`markdown`、`latex`、`html` |
24
35
  | `set KEY VALUE` | 写入配置项 | `KEY` 见下表 |
36
+ | `i18n` | 以 `en.json` 为标准批量翻译多语言 JSON | 只翻译 value,不改 key/结构 |
25
37
 
26
38
  ### 配置参数
27
39
  | 参数 | 作用 | 默认值 |
@@ -34,26 +46,19 @@
34
46
  | `maxRetries` | 最大重试次数 | `10` |
35
47
  | `chunkSize` | 文本分块大小 | `1000` |
36
48
 
37
- ## 安装依赖
38
- ```bash
39
- npm install
40
- ```
49
+ ## 快速开始
41
50
 
42
- ## 构建与运行
43
- ```bash
44
- npm run build
45
- ```
46
-
47
- ## npx / pnpx 使用
48
- 无需全局安装,直接运行:
51
+ ### 1) 安装与运行方式
52
+ 无需全局安装,推荐直接用 `npx` / `pnpx`:
49
53
  ```bash
50
54
  npx @thor123141245r/ai-translate --help
51
55
  pnpx @thor123141245r/ai-translate --help
52
56
  ```
53
57
 
54
- 示例:
58
+ 也可以本仓库本地开发:
55
59
  ```bash
56
- npx @thor123141245r/ai-translate -f Spanish -t English -i input.md -o output.md
60
+ npm install
61
+ npm run build
57
62
  ```
58
63
 
59
64
  ### CLI 用法
@@ -65,6 +70,48 @@ node dist/bin/ai-translate.js -f Spanish -t English -i input.md -o output.md
65
70
  echo "translate" | node dist/bin/ai-translate.js -f en -t en -c .
66
71
  ```
67
72
 
73
+ #### 通用文件翻译的工作方式
74
+ 1. 根据 `--format` 或输入文件扩展名推断格式
75
+ 2. 使用 LangChain 的 text splitter 按格式分块(默认 chunkSize=1000)
76
+ 3. 每个分块通过统一 Prompt 交给模型翻译
77
+ 4. 输出会尽量保留原始空白与结构
78
+
79
+ ### i18n JSON 用法(en.json 作为标准)
80
+ 直接把 `en.json` 当纯文本翻译会破坏 JSON 结构与 key。本仓库提供 `i18n` 子命令:以源语言 JSON 为标准,按 key 路径逐条翻译字符串 value,并把结果写回目标语言文件。
81
+
82
+ ```bash
83
+ # 也可以用 npx 直接运行
84
+ npx @thor123141245r/ai-translate i18n --base ./src/i18n/pages/sora-watermask-remover --source en --targets ru
85
+
86
+ # 目录内:存在 en.json / ru.json / de.json ...
87
+ # 默认 mode=fill:保留已有翻译,只补齐缺失项
88
+ node dist/bin/ai-translate.js i18n --base ./src/i18n/pages/sora-watermask-remover --source en
89
+
90
+ # 指定目标语言(若目录里还没有目标文件,也会生成)
91
+ node dist/bin/ai-translate.js i18n --base ./src/i18n/pages/sora-watermask-remover --source en --targets ru,de
92
+
93
+ # 覆盖重翻(慎用)
94
+ node dist/bin/ai-translate.js i18n --base ./src/i18n/pages/sora-watermask-remover --source en --targets ru --mode overwrite
95
+
96
+ # 仅预览统计(不写文件)
97
+ node dist/bin/ai-translate.js i18n --base ./src/i18n/pages/sora-watermask-remover --source en --dry
98
+ ```
99
+
100
+ #### i18n JSON 翻译的工作方式
101
+ - 读取 `--base` 目录下的源文件(默认 `{source}.json`,例如 `en.json`)
102
+ - 目标文件默认按 `{lang}.json` 命名(例如 `ru.json`)
103
+ - 本地解析 JSON,并提取所有“叶子字符串 value”作为待翻译单元
104
+ - 以批处理的方式调用模型:模型一次只处理一组短文本,不会拿到整份 JSON
105
+ - 翻译结果按原 key 路径写回,严格不改动 key
106
+ - 默认会在目录下写入缓存文件 `.ai-translate.cache.json`,避免重复翻译
107
+
108
+ #### i18n 模式的常用参数
109
+ - `--mode fill`:只补齐缺失项(推荐默认)
110
+ - `--mode overwrite`:强制重翻全部字符串 value
111
+ - `--mode prune`:对齐结构并清理目标文件中多余 key
112
+ - `--batchMaxItems` / `--batchMaxChars`:控制每次调用模型的批处理大小
113
+ - `--cache`:自定义缓存文件名(相对于 `--base` 目录)
114
+
68
115
  ### 开发态直接运行
69
116
  ```bash
70
117
  npm run dev:cli -- -f en -t zh-CN -i input.md -o output.md
@@ -112,9 +159,11 @@ node dist/bin/ai-translate.js set chunkSize 1000
112
159
  - 模型调用使用 `@langchain/*` 系列 ChatModel
113
160
  - 配置管理使用 `@commenthol/app-config`
114
161
 
115
- ## 最小验证
162
+ ## 注意事项
163
+ - i18n 场景请优先使用 `ai-translate i18n`,不要直接把 `en.json` 当纯文本翻译
164
+ - 生产环境注意避免输出冗长日志与敏感信息
165
+
166
+ ## 最小自测
116
167
  ```bash
117
168
  npm run validate
118
169
  ```
119
-
120
- 该脚本使用伪模型进行本地验证,确保分块与转换流程可用。
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AA2HA,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,EAAE;;;CAoBxC,CAAA;AAWD,eAAO,MAAM,cAAc,GAAI,KAAK,OAAO,OAAO,SAEjD,CAAA;AAuFD,eAAO,MAAM,GAAG,GAAU,OAAO,MAAM,EAAE,kBAqExC,CAAA"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AA2LA,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,EAAE;;;CAoBxC,CAAA;AAWD,eAAO,MAAM,cAAc,GAAI,KAAK,OAAO,OAAO,SAEjD,CAAA;AAuFD,eAAO,MAAM,GAAG,GAAU,OAAO,MAAM,EAAE,kBA8ExC,CAAA"}
package/dist/cli.js CHANGED
@@ -6,6 +6,7 @@ import { AppConfig, StringSchema, v } from '@commenthol/app-config';
6
6
  import { logger } from './logger.js';
7
7
  import { modelFactory, AiTranslateTransform } from './model.js';
8
8
  import { TextSplitterStream, recursiveChunkTextSplitter, getFormatByExtension } from './split.js';
9
+ import { runI18nCommand } from './i18n/command.js';
9
10
  const log = logger('cli');
10
11
  const help = {};
11
12
  help._ = `
@@ -17,6 +18,7 @@ Usage:
17
18
 
18
19
  Commands:
19
20
  set set config value
21
+ i18n translate i18n json files based on a source json
20
22
 
21
23
  Flags:
22
24
  -h, --help Help for ai-translate
@@ -62,6 +64,29 @@ Available KEYs:
62
64
  maxRetries max. number of retries; default=10
63
65
  chunkSize number of chunks used in text-splitter; default=1000
64
66
  `;
67
+ help.i18n = `
68
+ Translate i18n JSON files based on a source JSON (default: en.json)
69
+
70
+ Reads source file (like en.json) in a directory, and writes translated files
71
+ like ru.json, de.json... while preserving keys and structure.
72
+
73
+ Usage:
74
+ ai-translate [flags] i18n --base DIR [--source en] [--targets ru,de]
75
+
76
+ Required:
77
+ --base DIR directory containing source json and target json files
78
+
79
+ Optional:
80
+ --source LANG source language code; default="en"
81
+ --file FILE source file name; default="{source}.json"
82
+ --targets LIST comma/space separated target languages; if omitted,
83
+ infer from existing *.json in DIR (excluding source)
84
+ --mode MODE fill|overwrite|prune; default="fill"
85
+ --dry dry run (no file writes)
86
+ --cache FILE cache file name under DIR; default=".ai-translate.cache.json"
87
+ --batchMaxItems N max items per model call; default=40
88
+ --batchMaxChars N max chars per model call; default=6000
89
+ `;
65
90
  const PACKAGE_JSON = '../package.json';
66
91
  const APP = 'ai-translate';
67
92
  const CONF_FILE = `.${APP}.json`;
@@ -71,6 +96,9 @@ const commands = {
71
96
  const key = nextArg(argv);
72
97
  const value = nextArg(argv);
73
98
  c.set = [key, value];
99
+ },
100
+ i18n: (c) => {
101
+ c.i18n = true;
74
102
  }
75
103
  };
76
104
  const flags = {
@@ -103,6 +131,49 @@ const flags = {
103
131
  const format = nextArg(argv);
104
132
  if (format)
105
133
  f.format = format;
134
+ },
135
+ '--base': (f, argv) => {
136
+ const dir = nextArg(argv);
137
+ if (dir)
138
+ f.base = dir;
139
+ },
140
+ '--source': (f, argv) => {
141
+ const lang = nextArg(argv);
142
+ if (lang)
143
+ f.source = lang;
144
+ },
145
+ '--file': (f, argv) => {
146
+ const name = nextArg(argv);
147
+ if (name)
148
+ f.file = name;
149
+ },
150
+ '--targets': (f, argv) => {
151
+ const list = nextArg(argv);
152
+ if (list)
153
+ f.targets = list;
154
+ },
155
+ '--mode': (f, argv) => {
156
+ const m = nextArg(argv);
157
+ if (m)
158
+ f.mode = m;
159
+ },
160
+ '--dry': (f) => {
161
+ f.dry = true;
162
+ },
163
+ '--cache': (f, argv) => {
164
+ const name = nextArg(argv);
165
+ if (name)
166
+ f.cache = name;
167
+ },
168
+ '--batchMaxItems': (f, argv) => {
169
+ const n = nextArg(argv);
170
+ if (n)
171
+ f.batchMaxItems = n;
172
+ },
173
+ '--batchMaxChars': (f, argv) => {
174
+ const n = nextArg(argv);
175
+ if (n)
176
+ f.batchMaxChars = n;
106
177
  }
107
178
  };
108
179
  flags['-h'] = flags['--help'];
@@ -228,6 +299,12 @@ export const cli = async (args) => {
228
299
  }
229
300
  return;
230
301
  }
302
+ if (cmd.i18n) {
303
+ const runtimeConfig = resolveRuntimeConfig(appConf.config);
304
+ const model = modelFactory(runtimeConfig);
305
+ await runI18nCommand({ console: _console, model, argvOpts: opts });
306
+ return;
307
+ }
231
308
  const sourceLanguage = String(opts.sourceLanguage || DEFAULT_LANG);
232
309
  const targetLanguage = String(opts.targetLanguage || DEFAULT_LANG);
233
310
  const reader = opts.input ? fs.createReadStream(String(opts.input)) : process.stdin;
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export type AlignMode = 'fill' | 'overwrite' | 'prune';
2
+ export declare const alignStructure: (source: unknown, target: unknown, mode: AlignMode) => unknown;
3
+ //# sourceMappingURL=align.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"align.d.ts","sourceRoot":"","sources":["../../src/i18n/align.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,WAAW,GAAG,OAAO,CAAA;AAEtD,eAAO,MAAM,cAAc,GACzB,QAAQ,OAAO,EACf,QAAQ,OAAO,EACf,MAAM,SAAS,KACd,OA6CF,CAAA"}
@@ -0,0 +1,46 @@
1
+ import { isPlainObject } from './json-path.js';
2
+ export const alignStructure = (source, target, mode) => {
3
+ if (Array.isArray(source)) {
4
+ const tgt = Array.isArray(target) ? target : [];
5
+ const out = [];
6
+ for (let i = 0; i < source.length; i++) {
7
+ out[i] = alignStructure(source[i], tgt[i], mode);
8
+ }
9
+ // arrays are treated as schema-bound; "prune" for arrays is implicit
10
+ return out;
11
+ }
12
+ if (isPlainObject(source)) {
13
+ const tgt = isPlainObject(target) ? target : {};
14
+ const out = {};
15
+ for (const [k, v] of Object.entries(source)) {
16
+ out[k] = alignStructure(v, tgt[k], mode);
17
+ }
18
+ if (mode !== 'prune') {
19
+ // keep target-only keys (user may have custom keys)
20
+ for (const [k, v] of Object.entries(tgt)) {
21
+ if (!(k in out))
22
+ out[k] = v;
23
+ }
24
+ }
25
+ return out;
26
+ }
27
+ // leaf: keep existing target scalar if type matches; otherwise copy source
28
+ if (typeof source === 'string') {
29
+ if (typeof target === 'string')
30
+ return target;
31
+ // In fill mode, missing values should stay empty so they get translated.
32
+ if (mode === 'fill')
33
+ return '';
34
+ return source;
35
+ }
36
+ if (typeof source === 'number') {
37
+ return typeof target === 'number' ? target : source;
38
+ }
39
+ if (typeof source === 'boolean') {
40
+ return typeof target === 'boolean' ? target : source;
41
+ }
42
+ if (source === null)
43
+ return null;
44
+ return target ?? source;
45
+ };
46
+ //# sourceMappingURL=align.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"align.js","sourceRoot":"","sources":["../../src/i18n/align.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAI9C,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,MAAe,EACf,MAAe,EACf,IAAe,EACN,EAAE;IACX,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;QAC/C,MAAM,GAAG,GAAc,EAAE,CAAA;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,GAAG,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QAClD,CAAC;QACD,qEAAqE;QACrE,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;QAC/C,MAAM,GAAG,GAA4B,EAAE,CAAA;QAEvC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5C,GAAG,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,EAAG,GAA+B,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QACvE,CAAC;QAED,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,oDAAoD;YACpD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;oBAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;YAC7B,CAAC;QACH,CAAC;QAED,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,2EAA2E;IAC3E,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAA;QAC7C,yEAAyE;QACzE,IAAI,IAAI,KAAK,MAAM;YAAE,OAAO,EAAE,CAAA;QAC9B,OAAO,MAAM,CAAA;IACf,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA;IACrD,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA;IACtD,CAAC;IACD,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAEhC,OAAO,MAAM,IAAI,MAAM,CAAA;AACzB,CAAC,CAAA"}
@@ -0,0 +1,14 @@
1
+ export type CacheDataV1 = {
2
+ v: 1;
3
+ entries: Record<string, string>;
4
+ };
5
+ export declare class TranslationCache {
6
+ private readonly _file?;
7
+ private readonly _map;
8
+ constructor(file?: string);
9
+ load(): void;
10
+ get(key: string): string | undefined;
11
+ set(key: string, value: string): void;
12
+ save(): void;
13
+ }
14
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/i18n/cache.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG;IACxB,CAAC,EAAE,CAAC,CAAA;IACJ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC,CAAA;AAID,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA4B;gBAErC,IAAI,CAAC,EAAE,MAAM;IAIzB,IAAI;IAWJ,GAAG,CAAC,GAAG,EAAE,MAAM;IAIf,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAI9B,IAAI;CAKL"}
@@ -0,0 +1,36 @@
1
+ import fs from 'node:fs';
2
+ const empty = { v: 1, entries: {} };
3
+ export class TranslationCache {
4
+ _file;
5
+ _map = new Map();
6
+ constructor(file) {
7
+ this._file = file;
8
+ }
9
+ load() {
10
+ if (!this._file)
11
+ return;
12
+ if (!fs.existsSync(this._file))
13
+ return;
14
+ const raw = fs.readFileSync(this._file, 'utf-8');
15
+ const parsed = JSON.parse(raw);
16
+ if (!parsed || parsed.v !== 1 || typeof parsed.entries !== 'object')
17
+ return;
18
+ for (const [k, v] of Object.entries(parsed.entries)) {
19
+ if (typeof v === 'string')
20
+ this._map.set(k, v);
21
+ }
22
+ }
23
+ get(key) {
24
+ return this._map.get(key);
25
+ }
26
+ set(key, value) {
27
+ this._map.set(key, value);
28
+ }
29
+ save() {
30
+ if (!this._file)
31
+ return;
32
+ const data = { ...empty, entries: Object.fromEntries(this._map.entries()) };
33
+ fs.writeFileSync(this._file, JSON.stringify(data, null, 2) + '\n', 'utf-8');
34
+ }
35
+ }
36
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/i18n/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AAOxB,MAAM,KAAK,GAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;AAEhD,MAAM,OAAO,gBAAgB;IACV,KAAK,CAAS;IACd,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAA;IAEjD,YAAY,IAAa;QACvB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;IACnB,CAAC;IAED,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAM;QACvB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAM;QACtC,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAA;QAC7C,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAM;QAC3E,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACpD,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAChD,CAAC;IACH,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC3B,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAa;QAC5B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAC3B,CAAC;IAED,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAM;QACvB,MAAM,IAAI,GAAgB,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAA;QACxF,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAA;IAC7E,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ import type { BaseChatModel } from '@langchain/core/language_models/chat_models';
2
+ export declare const runI18nCommand: (opts: {
3
+ console: Pick<typeof console, "log" | "error">;
4
+ model: BaseChatModel;
5
+ argvOpts: Record<string, unknown>;
6
+ }) => Promise<void>;
7
+ //# sourceMappingURL=command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/i18n/command.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAA;AA4BhF,eAAO,MAAM,cAAc,GAAU,MAAM;IACzC,OAAO,EAAE,IAAI,CAAC,OAAO,OAAO,EAAE,KAAK,GAAG,OAAO,CAAC,CAAA;IAC9C,KAAK,EAAE,aAAa,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC,kBA2DA,CAAA"}
@@ -0,0 +1,84 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { translateI18nDir } from './translate.js';
4
+ const splitTargets = (raw) => {
5
+ if (typeof raw !== 'string')
6
+ return [];
7
+ return raw
8
+ .split(/[,\s]+/g)
9
+ .map((s) => s.trim())
10
+ .filter(Boolean);
11
+ };
12
+ const inferTargetsFromDir = (baseDir, sourceLang) => {
13
+ if (!fs.existsSync(baseDir))
14
+ return [];
15
+ const entries = fs.readdirSync(baseDir, { withFileTypes: true });
16
+ const langs = [];
17
+ for (const e of entries) {
18
+ if (!e.isFile())
19
+ continue;
20
+ if (!e.name.endsWith('.json'))
21
+ continue;
22
+ if (e.name.startsWith('.'))
23
+ continue;
24
+ const lang = e.name.replace(/\.json$/i, '');
25
+ if (!lang)
26
+ continue;
27
+ if (lang === sourceLang)
28
+ continue;
29
+ langs.push(lang);
30
+ }
31
+ return langs.sort();
32
+ };
33
+ export const runI18nCommand = async (opts) => {
34
+ const baseDir = String(opts.argvOpts.base || '');
35
+ if (!baseDir) {
36
+ throw new Error('missing --base DIR');
37
+ }
38
+ const resolvedBaseDir = path.resolve(process.cwd(), baseDir);
39
+ const sourceLang = String(opts.argvOpts.source || 'en');
40
+ const mode = String(opts.argvOpts.mode || 'fill');
41
+ if (!['fill', 'overwrite', 'prune'].includes(mode)) {
42
+ throw new Error('invalid --mode, expected fill|overwrite|prune');
43
+ }
44
+ const targets = splitTargets(opts.argvOpts.targets);
45
+ const inferredTargets = targets.length
46
+ ? targets
47
+ : inferTargetsFromDir(resolvedBaseDir, sourceLang);
48
+ if (!inferredTargets.length) {
49
+ throw new Error('missing --targets, and no existing target *.json files were found');
50
+ }
51
+ const dryRun = Boolean(opts.argvOpts.dry);
52
+ const fileName = typeof opts.argvOpts.file === 'string' ? String(opts.argvOpts.file) : undefined;
53
+ const batchMaxItems = opts.argvOpts.batchMaxItems ? Number(opts.argvOpts.batchMaxItems) : undefined;
54
+ const batchMaxChars = opts.argvOpts.batchMaxChars ? Number(opts.argvOpts.batchMaxChars) : undefined;
55
+ const cacheFile = typeof opts.argvOpts.cache === 'string' && String(opts.argvOpts.cache).trim()
56
+ ? path.resolve(resolvedBaseDir, String(opts.argvOpts.cache))
57
+ : path.resolve(resolvedBaseDir, '.ai-translate.cache.json');
58
+ const options = {
59
+ baseDir: resolvedBaseDir,
60
+ sourceLang,
61
+ targets: inferredTargets,
62
+ mode,
63
+ dryRun,
64
+ fileName,
65
+ batchMaxItems,
66
+ batchMaxChars,
67
+ cacheFile
68
+ };
69
+ const stats = await translateI18nDir({ model: opts.model, options });
70
+ for (const s of stats) {
71
+ opts.console.log([
72
+ `[i18n] target=${s.targetLang}`,
73
+ `total=${s.totalStrings}`,
74
+ `skipExisting=${s.skippedExisting}`,
75
+ `cache=${s.usedCache}`,
76
+ `toTranslate=${s.toTranslate}`,
77
+ `translated=${s.translated}`,
78
+ `failed=${s.failed}`,
79
+ dryRun ? 'dryRun=true' : 'dryRun=false',
80
+ `out=${s.targetFile}`
81
+ ].join(' '));
82
+ }
83
+ };
84
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/i18n/command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { JsonPath } from './json-path.js';
2
+ export type LeafString = {
3
+ path: JsonPath;
4
+ value: string;
5
+ };
6
+ export declare const extractLeafStrings: (root: unknown) => LeafString[];
7
+ //# sourceMappingURL=extract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/i18n/extract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAG9C,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,QAAQ,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,MAAM,OAAO,KAAG,UAAU,EAuB5D,CAAA"}
@@ -0,0 +1,24 @@
1
+ import { isPlainObject } from './json-path.js';
2
+ export const extractLeafStrings = (root) => {
3
+ const out = [];
4
+ const walk = (node, path) => {
5
+ if (typeof node === 'string') {
6
+ out.push({ path, value: node });
7
+ return;
8
+ }
9
+ if (Array.isArray(node)) {
10
+ for (let i = 0; i < node.length; i++) {
11
+ walk(node[i], path.concat(i));
12
+ }
13
+ return;
14
+ }
15
+ if (isPlainObject(node)) {
16
+ for (const [k, v] of Object.entries(node)) {
17
+ walk(v, path.concat(k));
18
+ }
19
+ }
20
+ };
21
+ walk(root, []);
22
+ return out;
23
+ };
24
+ //# sourceMappingURL=extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/i18n/extract.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAO9C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAa,EAAgB,EAAE;IAChE,MAAM,GAAG,GAAiB,EAAE,CAAA;IAE5B,MAAM,IAAI,GAAG,CAAC,IAAa,EAAE,IAAc,EAAE,EAAE;QAC7C,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;YAC/B,OAAM;QACR,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;YAC/B,CAAC;YACD,OAAM;QACR,CAAC;QACD,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1C,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;YACzB,CAAC;QACH,CAAC;IACH,CAAC,CAAA;IAED,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IACd,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA"}
@@ -0,0 +1,7 @@
1
+ export type JsonPathSegment = string | number;
2
+ export type JsonPath = JsonPathSegment[];
3
+ export declare const isPlainObject: (value: unknown) => value is Record<string, unknown>;
4
+ export declare const getAtPath: (root: unknown, path: JsonPath) => unknown;
5
+ export declare const setAtPath: (root: unknown, path: JsonPath, value: unknown) => void;
6
+ export declare const pathToString: (path: JsonPath) => string;
7
+ //# sourceMappingURL=json-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-path.d.ts","sourceRoot":"","sources":["../../src/i18n/json-path.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,CAAA;AAC7C,MAAM,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAA;AAExC,eAAO,MAAM,aAAa,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAI7E,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,MAAM,OAAO,EAAE,MAAM,QAAQ,KAAG,OAYzD,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,MAAM,OAAO,EAAE,MAAM,QAAQ,EAAE,OAAO,OAAO,SA4BtE,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,MAAM,QAAQ,WAIjB,CAAA"}
@@ -0,0 +1,61 @@
1
+ export const isPlainObject = (value) => {
2
+ if (!value || typeof value !== 'object')
3
+ return false;
4
+ if (Array.isArray(value))
5
+ return false;
6
+ return Object.prototype.toString.call(value) === '[object Object]';
7
+ };
8
+ export const getAtPath = (root, path) => {
9
+ let cur = root;
10
+ for (const seg of path) {
11
+ if (typeof seg === 'number') {
12
+ if (!Array.isArray(cur))
13
+ return undefined;
14
+ cur = cur[seg];
15
+ continue;
16
+ }
17
+ if (!isPlainObject(cur))
18
+ return undefined;
19
+ cur = cur[seg];
20
+ }
21
+ return cur;
22
+ };
23
+ export const setAtPath = (root, path, value) => {
24
+ if (!root || typeof root !== 'object')
25
+ return;
26
+ let cur = root;
27
+ for (let i = 0; i < path.length - 1; i++) {
28
+ const seg = path[i];
29
+ const nextSeg = path[i + 1];
30
+ if (typeof seg === 'number') {
31
+ if (!Array.isArray(cur))
32
+ return;
33
+ if (cur[seg] === undefined || cur[seg] === null || typeof cur[seg] !== 'object') {
34
+ cur[seg] = typeof nextSeg === 'number' ? [] : {};
35
+ }
36
+ cur = cur[seg];
37
+ continue;
38
+ }
39
+ if (!isPlainObject(cur))
40
+ return;
41
+ if (cur[seg] === undefined || cur[seg] === null || typeof cur[seg] !== 'object') {
42
+ cur[seg] = typeof nextSeg === 'number' ? [] : {};
43
+ }
44
+ cur = cur[seg];
45
+ }
46
+ const last = path[path.length - 1];
47
+ if (typeof last === 'number') {
48
+ if (!Array.isArray(cur))
49
+ return;
50
+ cur[last] = value;
51
+ return;
52
+ }
53
+ if (!isPlainObject(cur))
54
+ return;
55
+ cur[last] = value;
56
+ };
57
+ export const pathToString = (path) => path
58
+ .map((seg) => (typeof seg === 'number' ? `[${seg}]` : seg))
59
+ .join('.')
60
+ .replace(/\.\[/g, '[');
61
+ //# sourceMappingURL=json-path.js.map