ai-i18n-tools 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 (260) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +157 -0
  3. package/dist/api/openrouter.d.ts +115 -0
  4. package/dist/api/openrouter.d.ts.map +1 -0
  5. package/dist/api/openrouter.js +399 -0
  6. package/dist/api/openrouter.js.map +1 -0
  7. package/dist/cli/doc-translate.d.ts +90 -0
  8. package/dist/cli/doc-translate.d.ts.map +1 -0
  9. package/dist/cli/doc-translate.js +1153 -0
  10. package/dist/cli/doc-translate.js.map +1 -0
  11. package/dist/cli/export-ui-xliff.d.ts +32 -0
  12. package/dist/cli/export-ui-xliff.d.ts.map +1 -0
  13. package/dist/cli/export-ui-xliff.js +153 -0
  14. package/dist/cli/export-ui-xliff.js.map +1 -0
  15. package/dist/cli/extract-strings.d.ts +12 -0
  16. package/dist/cli/extract-strings.d.ts.map +1 -0
  17. package/dist/cli/extract-strings.js +80 -0
  18. package/dist/cli/extract-strings.js.map +1 -0
  19. package/dist/cli/file-utils.d.ts +10 -0
  20. package/dist/cli/file-utils.d.ts.map +1 -0
  21. package/dist/cli/file-utils.js +77 -0
  22. package/dist/cli/file-utils.js.map +1 -0
  23. package/dist/cli/format.d.ts +21 -0
  24. package/dist/cli/format.d.ts.map +1 -0
  25. package/dist/cli/format.js +75 -0
  26. package/dist/cli/format.js.map +1 -0
  27. package/dist/cli/helpers.d.ts +27 -0
  28. package/dist/cli/helpers.d.ts.map +1 -0
  29. package/dist/cli/helpers.js +84 -0
  30. package/dist/cli/helpers.js.map +1 -0
  31. package/dist/cli/index.d.ts +3 -0
  32. package/dist/cli/index.d.ts.map +1 -0
  33. package/dist/cli/index.js +772 -0
  34. package/dist/cli/index.js.map +1 -0
  35. package/dist/cli/log-output.d.ts +13 -0
  36. package/dist/cli/log-output.d.ts.map +1 -0
  37. package/dist/cli/log-output.js +75 -0
  38. package/dist/cli/log-output.js.map +1 -0
  39. package/dist/cli/translate-svg.d.ts +7 -0
  40. package/dist/cli/translate-svg.d.ts.map +1 -0
  41. package/dist/cli/translate-svg.js +167 -0
  42. package/dist/cli/translate-svg.js.map +1 -0
  43. package/dist/cli/translate-ui-strings.d.ts +27 -0
  44. package/dist/cli/translate-ui-strings.d.ts.map +1 -0
  45. package/dist/cli/translate-ui-strings.js +357 -0
  46. package/dist/cli/translate-ui-strings.js.map +1 -0
  47. package/dist/core/cache-tracking-keys.d.ts +12 -0
  48. package/dist/core/cache-tracking-keys.d.ts.map +1 -0
  49. package/dist/core/cache-tracking-keys.js +20 -0
  50. package/dist/core/cache-tracking-keys.js.map +1 -0
  51. package/dist/core/cache.d.ts +153 -0
  52. package/dist/core/cache.d.ts.map +1 -0
  53. package/dist/core/cache.js +546 -0
  54. package/dist/core/cache.js.map +1 -0
  55. package/dist/core/config.d.ts +58 -0
  56. package/dist/core/config.d.ts.map +1 -0
  57. package/dist/core/config.js +392 -0
  58. package/dist/core/config.js.map +1 -0
  59. package/dist/core/doc-file-tracking.d.ts +8 -0
  60. package/dist/core/doc-file-tracking.d.ts.map +1 -0
  61. package/dist/core/doc-file-tracking.js +27 -0
  62. package/dist/core/doc-file-tracking.js.map +1 -0
  63. package/dist/core/errors.d.ts +19 -0
  64. package/dist/core/errors.d.ts.map +1 -0
  65. package/dist/core/errors.js +23 -0
  66. package/dist/core/errors.js.map +1 -0
  67. package/dist/core/locale-utils.d.ts +20 -0
  68. package/dist/core/locale-utils.d.ts.map +1 -0
  69. package/dist/core/locale-utils.js +75 -0
  70. package/dist/core/locale-utils.js.map +1 -0
  71. package/dist/core/output-paths.d.ts +22 -0
  72. package/dist/core/output-paths.d.ts.map +1 -0
  73. package/dist/core/output-paths.js +130 -0
  74. package/dist/core/output-paths.js.map +1 -0
  75. package/dist/core/prompt-builder.d.ts +62 -0
  76. package/dist/core/prompt-builder.d.ts.map +1 -0
  77. package/dist/core/prompt-builder.js +232 -0
  78. package/dist/core/prompt-builder.js.map +1 -0
  79. package/dist/core/prompts.d.ts +27 -0
  80. package/dist/core/prompts.d.ts.map +1 -0
  81. package/dist/core/prompts.js +57 -0
  82. package/dist/core/prompts.js.map +1 -0
  83. package/dist/core/svg-asset-paths.d.ts +40 -0
  84. package/dist/core/svg-asset-paths.d.ts.map +1 -0
  85. package/dist/core/svg-asset-paths.js +107 -0
  86. package/dist/core/svg-asset-paths.js.map +1 -0
  87. package/dist/core/types.d.ts +388 -0
  88. package/dist/core/types.d.ts.map +1 -0
  89. package/dist/core/types.js +265 -0
  90. package/dist/core/types.js.map +1 -0
  91. package/dist/core/ui-languages.d.ts +66 -0
  92. package/dist/core/ui-languages.d.ts.map +1 -0
  93. package/dist/core/ui-languages.js +277 -0
  94. package/dist/core/ui-languages.js.map +1 -0
  95. package/dist/core/user-edited-model.d.ts +3 -0
  96. package/dist/core/user-edited-model.d.ts.map +1 -0
  97. package/dist/core/user-edited-model.js +3 -0
  98. package/dist/core/user-edited-model.js.map +1 -0
  99. package/dist/edit-cache-app/app.js +1326 -0
  100. package/dist/edit-cache-app/index.html +287 -0
  101. package/dist/edit-cache-app/styles.css +664 -0
  102. package/dist/extractors/base-extractor.d.ts +15 -0
  103. package/dist/extractors/base-extractor.d.ts.map +1 -0
  104. package/dist/extractors/base-extractor.js +23 -0
  105. package/dist/extractors/base-extractor.js.map +1 -0
  106. package/dist/extractors/classify-segment.d.ts +6 -0
  107. package/dist/extractors/classify-segment.d.ts.map +1 -0
  108. package/dist/extractors/classify-segment.js +20 -0
  109. package/dist/extractors/classify-segment.js.map +1 -0
  110. package/dist/extractors/json-extractor.d.ts +16 -0
  111. package/dist/extractors/json-extractor.d.ts.map +1 -0
  112. package/dist/extractors/json-extractor.js +128 -0
  113. package/dist/extractors/json-extractor.js.map +1 -0
  114. package/dist/extractors/markdown-extractor.d.ts +15 -0
  115. package/dist/extractors/markdown-extractor.d.ts.map +1 -0
  116. package/dist/extractors/markdown-extractor.js +205 -0
  117. package/dist/extractors/markdown-extractor.js.map +1 -0
  118. package/dist/extractors/svg-extractor.d.ts +19 -0
  119. package/dist/extractors/svg-extractor.d.ts.map +1 -0
  120. package/dist/extractors/svg-extractor.js +132 -0
  121. package/dist/extractors/svg-extractor.js.map +1 -0
  122. package/dist/extractors/ui-string-extractor.d.ts +40 -0
  123. package/dist/extractors/ui-string-extractor.d.ts.map +1 -0
  124. package/dist/extractors/ui-string-extractor.js +146 -0
  125. package/dist/extractors/ui-string-extractor.js.map +1 -0
  126. package/dist/extractors/ui-string-locations.d.ts +23 -0
  127. package/dist/extractors/ui-string-locations.d.ts.map +1 -0
  128. package/dist/extractors/ui-string-locations.js +138 -0
  129. package/dist/extractors/ui-string-locations.js.map +1 -0
  130. package/dist/glossary/glossary.d.ts +34 -0
  131. package/dist/glossary/glossary.d.ts.map +1 -0
  132. package/dist/glossary/glossary.js +260 -0
  133. package/dist/glossary/glossary.js.map +1 -0
  134. package/dist/glossary/matcher.d.ts +10 -0
  135. package/dist/glossary/matcher.d.ts.map +1 -0
  136. package/dist/glossary/matcher.js +12 -0
  137. package/dist/glossary/matcher.js.map +1 -0
  138. package/dist/index.d.ts +44 -0
  139. package/dist/index.d.ts.map +1 -0
  140. package/dist/index.js +44 -0
  141. package/dist/index.js.map +1 -0
  142. package/dist/processors/admonition-placeholders.d.ts +8 -0
  143. package/dist/processors/admonition-placeholders.d.ts.map +1 -0
  144. package/dist/processors/admonition-placeholders.js +59 -0
  145. package/dist/processors/admonition-placeholders.js.map +1 -0
  146. package/dist/processors/anchor-placeholders.d.ts +8 -0
  147. package/dist/processors/anchor-placeholders.d.ts.map +1 -0
  148. package/dist/processors/anchor-placeholders.js +37 -0
  149. package/dist/processors/anchor-placeholders.js.map +1 -0
  150. package/dist/processors/batch-processor.d.ts +10 -0
  151. package/dist/processors/batch-processor.d.ts.map +1 -0
  152. package/dist/processors/batch-processor.js +33 -0
  153. package/dist/processors/batch-processor.js.map +1 -0
  154. package/dist/processors/bold-code-placeholders.d.ts +14 -0
  155. package/dist/processors/bold-code-placeholders.d.ts.map +1 -0
  156. package/dist/processors/bold-code-placeholders.js +116 -0
  157. package/dist/processors/bold-code-placeholders.js.map +1 -0
  158. package/dist/processors/doc-postprocess.d.ts +51 -0
  159. package/dist/processors/doc-postprocess.d.ts.map +1 -0
  160. package/dist/processors/doc-postprocess.js +215 -0
  161. package/dist/processors/doc-postprocess.js.map +1 -0
  162. package/dist/processors/emphasis-placeholders.d.ts +6 -0
  163. package/dist/processors/emphasis-placeholders.d.ts.map +1 -0
  164. package/dist/processors/emphasis-placeholders.js +262 -0
  165. package/dist/processors/emphasis-placeholders.js.map +1 -0
  166. package/dist/processors/flat-link-rewrite.d.ts +32 -0
  167. package/dist/processors/flat-link-rewrite.d.ts.map +1 -0
  168. package/dist/processors/flat-link-rewrite.js +90 -0
  169. package/dist/processors/flat-link-rewrite.js.map +1 -0
  170. package/dist/processors/glossary-force-placeholders.d.ts +12 -0
  171. package/dist/processors/glossary-force-placeholders.d.ts.map +1 -0
  172. package/dist/processors/glossary-force-placeholders.js +58 -0
  173. package/dist/processors/glossary-force-placeholders.js.map +1 -0
  174. package/dist/processors/inline-code-placeholders.d.ts +11 -0
  175. package/dist/processors/inline-code-placeholders.d.ts.map +1 -0
  176. package/dist/processors/inline-code-placeholders.js +87 -0
  177. package/dist/processors/inline-code-placeholders.js.map +1 -0
  178. package/dist/processors/placeholder-handler.d.ts +38 -0
  179. package/dist/processors/placeholder-handler.d.ts.map +1 -0
  180. package/dist/processors/placeholder-handler.js +55 -0
  181. package/dist/processors/placeholder-handler.js.map +1 -0
  182. package/dist/processors/translation-placeholder-leaks.d.ts +2 -0
  183. package/dist/processors/translation-placeholder-leaks.d.ts.map +1 -0
  184. package/dist/processors/translation-placeholder-leaks.js +9 -0
  185. package/dist/processors/translation-placeholder-leaks.js.map +1 -0
  186. package/dist/processors/url-placeholders.d.ts +10 -0
  187. package/dist/processors/url-placeholders.d.ts.map +1 -0
  188. package/dist/processors/url-placeholders.js +29 -0
  189. package/dist/processors/url-placeholders.js.map +1 -0
  190. package/dist/processors/validator.d.ts +23 -0
  191. package/dist/processors/validator.d.ts.map +1 -0
  192. package/dist/processors/validator.js +186 -0
  193. package/dist/processors/validator.js.map +1 -0
  194. package/dist/runtime/i18next-helpers.d.ts +146 -0
  195. package/dist/runtime/i18next-helpers.d.ts.map +1 -0
  196. package/dist/runtime/i18next-helpers.js +192 -0
  197. package/dist/runtime/i18next-helpers.js.map +1 -0
  198. package/dist/runtime/index.d.ts +4 -0
  199. package/dist/runtime/index.d.ts.map +1 -0
  200. package/dist/runtime/index.js +4 -0
  201. package/dist/runtime/index.js.map +1 -0
  202. package/dist/runtime/template.d.ts +21 -0
  203. package/dist/runtime/template.d.ts.map +1 -0
  204. package/dist/runtime/template.js +28 -0
  205. package/dist/runtime/template.js.map +1 -0
  206. package/dist/runtime/ui-language-display.d.ts +16 -0
  207. package/dist/runtime/ui-language-display.d.ts.map +1 -0
  208. package/dist/runtime/ui-language-display.js +26 -0
  209. package/dist/runtime/ui-language-display.js.map +1 -0
  210. package/dist/server/translation-editor.d.ts +25 -0
  211. package/dist/server/translation-editor.d.ts.map +1 -0
  212. package/dist/server/translation-editor.js +583 -0
  213. package/dist/server/translation-editor.js.map +1 -0
  214. package/dist/utils/concurrency.d.ts +31 -0
  215. package/dist/utils/concurrency.d.ts.map +1 -0
  216. package/dist/utils/concurrency.js +103 -0
  217. package/dist/utils/concurrency.js.map +1 -0
  218. package/dist/utils/hash.d.ts +5 -0
  219. package/dist/utils/hash.d.ts.map +1 -0
  220. package/dist/utils/hash.js +9 -0
  221. package/dist/utils/hash.js.map +1 -0
  222. package/dist/utils/ignore-parser.d.ts +7 -0
  223. package/dist/utils/ignore-parser.d.ts.map +1 -0
  224. package/dist/utils/ignore-parser.js +26 -0
  225. package/dist/utils/ignore-parser.js.map +1 -0
  226. package/dist/utils/logger.d.ts +45 -0
  227. package/dist/utils/logger.d.ts.map +1 -0
  228. package/dist/utils/logger.js +158 -0
  229. package/dist/utils/logger.js.map +1 -0
  230. package/docs/GETTING_STARTED.md +697 -0
  231. package/docs/PACKAGE_OVERVIEW.md +427 -0
  232. package/docs/ai-i18n-tools-context.md +481 -0
  233. package/package.json +117 -0
  234. package/translated-docs/README.de.md +157 -0
  235. package/translated-docs/README.es.md +157 -0
  236. package/translated-docs/README.fr.md +157 -0
  237. package/translated-docs/README.hi.md +157 -0
  238. package/translated-docs/README.ja.md +157 -0
  239. package/translated-docs/README.ko.md +157 -0
  240. package/translated-docs/README.pt-BR.md +157 -0
  241. package/translated-docs/README.zh-CN.md +157 -0
  242. package/translated-docs/README.zh-TW.md +157 -0
  243. package/translated-docs/docs/GETTING_STARTED.de.md +682 -0
  244. package/translated-docs/docs/GETTING_STARTED.es.md +682 -0
  245. package/translated-docs/docs/GETTING_STARTED.fr.md +682 -0
  246. package/translated-docs/docs/GETTING_STARTED.hi.md +682 -0
  247. package/translated-docs/docs/GETTING_STARTED.ja.md +682 -0
  248. package/translated-docs/docs/GETTING_STARTED.ko.md +682 -0
  249. package/translated-docs/docs/GETTING_STARTED.pt-BR.md +682 -0
  250. package/translated-docs/docs/GETTING_STARTED.zh-CN.md +682 -0
  251. package/translated-docs/docs/GETTING_STARTED.zh-TW.md +682 -0
  252. package/translated-docs/docs/PACKAGE_OVERVIEW.de.md +428 -0
  253. package/translated-docs/docs/PACKAGE_OVERVIEW.es.md +428 -0
  254. package/translated-docs/docs/PACKAGE_OVERVIEW.fr.md +428 -0
  255. package/translated-docs/docs/PACKAGE_OVERVIEW.hi.md +428 -0
  256. package/translated-docs/docs/PACKAGE_OVERVIEW.ja.md +428 -0
  257. package/translated-docs/docs/PACKAGE_OVERVIEW.ko.md +428 -0
  258. package/translated-docs/docs/PACKAGE_OVERVIEW.pt-BR.md +428 -0
  259. package/translated-docs/docs/PACKAGE_OVERVIEW.zh-CN.md +428 -0
  260. package/translated-docs/docs/PACKAGE_OVERVIEW.zh-TW.md +428 -0
@@ -0,0 +1,265 @@
1
+ import { z } from "zod";
2
+ import { coerceTargetLocalesField } from "./locale-utils.js";
3
+ export function segmentTranslationText(v) {
4
+ if (v === undefined) {
5
+ return undefined;
6
+ }
7
+ return typeof v === "string" ? v : v.text;
8
+ }
9
+ /** Coerce a map to plain `Map<string, string>` (e.g. legacy callers or JSON serialization). */
10
+ export function translationTextMap(m) {
11
+ return new Map([...m].map(([k, v]) => {
12
+ const t = segmentTranslationText(v);
13
+ return [k, t ?? ""];
14
+ }));
15
+ }
16
+ export class BatchTranslationError extends Error {
17
+ constructor(expected, received, rawResponse) {
18
+ super(`batch mismatch: expected ${expected} <t> segments, got ${received}`);
19
+ this.expected = expected;
20
+ this.received = received;
21
+ this.rawResponse = rawResponse;
22
+ this.name = "BatchTranslationError";
23
+ }
24
+ }
25
+ const openRouterConfigSchema = z.object({
26
+ baseUrl: z.string().min(1).default("https://openrouter.ai/api/v1"),
27
+ translationModels: z.array(z.string().min(1)).optional(),
28
+ defaultModel: z.string().optional(),
29
+ fallbackModel: z.string().optional(),
30
+ maxTokens: z.number().int().positive().default(8192),
31
+ temperature: z.number().min(0).max(2).default(0.2),
32
+ });
33
+ const featuresSchema = z.object({
34
+ extractUIStrings: z.boolean().default(false),
35
+ /** OpenRouter: translate `strings.json` entries + write per-locale flat JSON. */
36
+ translateUIStrings: z.boolean().default(false),
37
+ translateMarkdown: z.boolean().default(false),
38
+ translateJSON: z.boolean().default(false),
39
+ /** Standalone SVG assets via `translate-svg` / `sync` when `svg` is configured. */
40
+ translateSVG: z.boolean().default(false),
41
+ });
42
+ const glossarySchema = z.preprocess((raw) => {
43
+ if (raw && typeof raw === "object" && !Array.isArray(raw)) {
44
+ const o = { ...raw };
45
+ const legacy = o.uiGlossaryFromStringsJson;
46
+ if (typeof legacy === "string" && o.uiGlossary === undefined) {
47
+ o.uiGlossary = legacy;
48
+ }
49
+ delete o.uiGlossaryFromStringsJson;
50
+ return o;
51
+ }
52
+ return raw;
53
+ }, z
54
+ .object({
55
+ /** Path to `strings.json` - auto-builds glossary hints from existing UI translations. */
56
+ uiGlossary: z.string().optional(),
57
+ userGlossary: z.string().optional(),
58
+ autoAddUserEditedToGlossary: z.boolean().default(true),
59
+ })
60
+ .strict());
61
+ const reactExtractorSchema = z
62
+ .object({
63
+ extensions: z.array(z.string().min(1)).default([".js", ".jsx", ".ts", ".tsx"]),
64
+ funcNames: z.array(z.string().min(1)).default(["t", "i18n.t"]),
65
+ includePackageDescription: z.boolean().default(true),
66
+ packageJsonPath: z.string().optional(),
67
+ })
68
+ .strict();
69
+ const svgExtractorSchema = z
70
+ .object({
71
+ /** When true, translated text is lowercased on SVG reassembly (optional layout tweak). */
72
+ forceLowercase: z.boolean().default(false),
73
+ })
74
+ .strict();
75
+ const languageListBlockSchema = z
76
+ .object({
77
+ /** Marker that identifies the language-list block start line in markdown body. */
78
+ start: z.string().min(1),
79
+ /** Marker that identifies the language-list block end line in markdown body. */
80
+ end: z.string().min(1),
81
+ /** Separator used between generated locale links. */
82
+ separator: z.string(),
83
+ })
84
+ .strict();
85
+ const regexAdjustmentSchema = z
86
+ .object({
87
+ /** Optional rule note for maintainers (display-only). */
88
+ description: z.string().optional(),
89
+ /** Regex pattern (`pattern` or `/pattern/flags`) used for search. */
90
+ search: z.string().min(1),
91
+ /** Replacement template (supports `${translatedLocale}` and related vars). */
92
+ replace: z.string(),
93
+ })
94
+ .strict();
95
+ const markdownPostProcessingSchema = z
96
+ .object({
97
+ /** Optional canonical language switcher replacement for translated markdown files. */
98
+ languageListBlock: languageListBlockSchema.optional(),
99
+ /** Ordered regex replacements applied to markdown body. */
100
+ regexAdjustments: z.array(regexAdjustmentSchema).default([]),
101
+ })
102
+ .strict();
103
+ const markdownOutputSchema = z
104
+ .object({
105
+ /** Built-in layout when `pathTemplate` is unset. */
106
+ style: z.enum(["nested", "docusaurus", "flat"]).default("nested"),
107
+ /**
108
+ * Directory prefix (posix, relative to cwd) for doc sources that use the Docusaurus plugin path.
109
+ * Only paths under this prefix use `…/docusaurus-plugin-content-docs/current/…` when style is `docusaurus`.
110
+ */
111
+ docsRoot: z.string().optional(),
112
+ /** When set, overrides `style` for markdown output paths. */
113
+ pathTemplate: z.string().optional(),
114
+ /** Optional overrides for JSON outputs (default: nested `outputDir/locale/relPath`). */
115
+ jsonPathTemplate: z.string().optional(),
116
+ /** For `flat` style: keep dirname segments so `docs/a.md` → `out/docs/a.de.md` instead of colliding with root `a.md`. */
117
+ flatPreserveRelativeDir: z.boolean().default(false),
118
+ /**
119
+ * Rewrite relative links after translation for flat-style outputs. Default: true when
120
+ * `style === "flat"` and `pathTemplate` is unset; false when `pathTemplate` is set (opt in explicitly).
121
+ */
122
+ rewriteRelativeLinks: z.boolean().optional(),
123
+ /**
124
+ * Repo root used with the active documentation block's `outputDir` to compute `i18nPrefix` / `depthPrefix`
125
+ * for flat link rewriting (typically `.`).
126
+ */
127
+ linkRewriteDocsRoot: z.string().optional(),
128
+ /**
129
+ * Optional post-processing run on translated markdown body after reassembly/link rewrite.
130
+ */
131
+ postProcessing: markdownPostProcessingSchema.optional(),
132
+ })
133
+ .strict();
134
+ const uiConfigSchema = z
135
+ .object({
136
+ /** Roots scanned for `t()` / `i18n.t()` (e.g. `src/renderer/`). */
137
+ sourceRoots: z.array(z.string().min(1)).default([]),
138
+ /** Merged extract output (`strings.json`). */
139
+ stringsJson: z.string().min(1).default("strings.json"),
140
+ /** Directory for flat per-locale JSON (`de.json`, …). */
141
+ flatOutputDir: z.string().min(1).default("./locales"),
142
+ /**
143
+ * When set, UI translation (`translate-ui`) tries this OpenRouter model first, then the rest of
144
+ * `openrouter.translationModels` (or legacy default/fallback) in order, skipping duplicates.
145
+ */
146
+ preferredModel: z.string().min(1).optional(),
147
+ reactExtractor: reactExtractorSchema.optional(),
148
+ })
149
+ .strict();
150
+ const svgAssetsConfigSchema = z
151
+ .object({
152
+ /** One directory or several (relative to cwd); each is scanned recursively for `*.svg`. */
153
+ sourcePath: z.preprocess((v) => (typeof v === "string" ? [v] : v), z.array(z.string().min(1)).min(1)),
154
+ /** Output root for translated SVGs (relative to cwd). */
155
+ outputDir: z.string().min(1),
156
+ /**
157
+ * When set, overrides `style` for output paths. Expand `{outputDir}` (absolute resolved `svg.outputDir`),
158
+ * `{locale}`, `{LOCALE}`, `{relPath}` (file relative to cwd), `{stem}`, `{basename}`, `{extension}`,
159
+ * `{relativeToSourceRoot}` (path under `sourcePath`).
160
+ */
161
+ pathTemplate: z.string().optional(),
162
+ /** `flat`: `{stem}.{locale}.svg`; `nested`: `{locale}/{relPathUnderSourceRoot}`. Ignored when `pathTemplate` is set. */
163
+ style: z.enum(["flat", "nested"]),
164
+ svgExtractor: svgExtractorSchema.optional(),
165
+ })
166
+ .strict();
167
+ /** One documentation pipeline (markdown/JSON layout under `outputDir`, optional Docusaurus `jsonSource`). */
168
+ const documentationBlockSchema = z
169
+ .object({
170
+ /** Optional human-readable note for this block (shown in CLI headers; not used for translation). */
171
+ description: z.string().optional(),
172
+ /** Markdown / MDX roots under cwd (files and directories). */
173
+ contentPaths: z.array(z.string().min(1)).default([]),
174
+ /** Optional alias for `contentPaths`; merged into `contentPaths` at load. */
175
+ sourceFiles: z.array(z.string().min(1)).optional(),
176
+ /**
177
+ * Locales for markdown / JSON translation only. When **omitted** or empty after load, root
178
+ * `targetLocales` is used (same set as UI). When set, docs translate to this list only - e.g. app in 10
179
+ * languages, docs in 5. Same rules as root: array of codes, or a single path to `ui-languages.json`
180
+ * (expanded at load; does not change `uiLanguagesPath`).
181
+ */
182
+ targetLocales: z
183
+ .preprocess((v) => {
184
+ if (v === undefined || v === null) {
185
+ return undefined;
186
+ }
187
+ return coerceTargetLocalesField(v);
188
+ }, z.array(z.string().min(1)).optional())
189
+ .optional(),
190
+ /** Base directory for translated docs (markdown / default JSON layout). */
191
+ outputDir: z.string().min(1).default("./i18n"),
192
+ /** Docusaurus / JSON UI strings source dir (e.g. i18n/en/). */
193
+ jsonSource: z.string().optional(),
194
+ markdownOutput: markdownOutputSchema.default({
195
+ style: "nested",
196
+ flatPreserveRelativeDir: false,
197
+ }),
198
+ /**
199
+ * When true (default), translated markdown files include YAML keys matching reference transrewrt:
200
+ * `translation_last_updated`, `source_file_mtime`, `source_file_hash`, `translation_language`,
201
+ * `source_file_path`, and when known, `translation_models` (sorted unique OpenRouter model ids used for segments).
202
+ */
203
+ addFrontmatter: z.boolean().optional(),
204
+ })
205
+ .strict();
206
+ /** Unified package config: shared root + `ui` + `documentations` pipelines. */
207
+ export const i18nConfigSchema = z
208
+ .object({
209
+ sourceLocale: z.string().min(1),
210
+ /** Shared SQLite cache directory for all documentation blocks (and CLI log defaults). */
211
+ cacheDir: z.string().min(1).default(".translation-cache"),
212
+ /**
213
+ * Target locale codes (BCP-47) as an array, **or** a single string path to `ui-languages.json`
214
+ * (React / UI). On load, a path string is expanded to codes and `uiLanguagesPath` is set.
215
+ * Manifest entries must include `code`, `label`, and non-empty `englishName` per object.
216
+ */
217
+ targetLocales: z.preprocess((v) => coerceTargetLocalesField(v), z.array(z.string().min(1)).default([])),
218
+ openrouter: openRouterConfigSchema,
219
+ features: featuresSchema.default({
220
+ extractUIStrings: false,
221
+ translateUIStrings: false,
222
+ translateMarkdown: false,
223
+ translateJSON: false,
224
+ translateSVG: false,
225
+ }),
226
+ glossary: glossarySchema.default({ autoAddUserEditedToGlossary: true }),
227
+ ui: uiConfigSchema.default({
228
+ sourceRoots: [],
229
+ stringsJson: "strings.json",
230
+ flatOutputDir: "./locales",
231
+ }),
232
+ documentations: z.array(documentationBlockSchema).default([
233
+ {
234
+ contentPaths: [],
235
+ outputDir: "./i18n",
236
+ markdownOutput: {
237
+ style: "nested",
238
+ flatPreserveRelativeDir: false,
239
+ },
240
+ },
241
+ ]),
242
+ /** BCP-47-ish codes that use RTL typography; layout `dir` stays the app’s i18next concern. */
243
+ rtlLocales: z.array(z.string().min(1)).optional(),
244
+ localeDisplayNames: z.record(z.string(), z.string()).optional(),
245
+ /**
246
+ * Optional path to the same `ui-languages.json` manifest. Usually unnecessary if `targetLocales` is a
247
+ * single manifest path (expanded at load). Use when `targetLocales` is an explicit code list but you
248
+ * still want manifest-driven UI locale filtering / `localeDisplayNames` / intersection.
249
+ */
250
+ uiLanguagesPath: z.string().optional(),
251
+ /** Standalone SVG translation (`translate-svg`): sources + output layout. */
252
+ svg: svgAssetsConfigSchema.optional(),
253
+ batchSize: z.number().int().positive().optional(),
254
+ maxBatchChars: z.number().int().positive().optional(),
255
+ /**
256
+ * Max parallel **target locales** (`translate-ui`, `translate-docs`). Defaults: UI `4`, docs `3` when unset.
257
+ */
258
+ concurrency: z.number().int().positive().optional(),
259
+ /**
260
+ * Max parallel OpenRouter **batch** requests per file (`translate-docs`, `translate-svg`). Default `4` when unset.
261
+ */
262
+ batchConcurrency: z.number().int().positive().optional(),
263
+ })
264
+ .strict();
265
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import type { I18nConfig, RawI18nConfigInput } from "./types.js";
2
+ /**
3
+ * UI language manifest (`ui-languages.json`).
4
+ * Drives language switcher labels and, when configured, which locales receive UI string translation.
5
+ */
6
+ export interface UiLanguageEntry {
7
+ code: string;
8
+ /**
9
+ * Language name **in that language** (endonym), for in-app menus and switchers - e.g. `Deutsch`, `日本語`.
10
+ * Not necessarily English.
11
+ */
12
+ label: string;
13
+ /** English (or Latin-script) name for LLM prompts, `t()` keys, and pairing with `label` in menus. Required in the JSON manifest. */
14
+ englishName: string;
15
+ }
16
+ /** True if `targetLocales` should be treated as a path to a UI languages JSON manifest (not a locale code). */
17
+ export declare function looksLikeUiLanguagesFileRef(s: string): boolean;
18
+ /**
19
+ * When `targetLocales` is a single string that looks like a manifest path, load it
20
+ * (`ui-languages.json` shape), replace `targetLocales` with locale codes (excluding `sourceLocale`),
21
+ * and set `uiLanguagesPath` to that path for prompts / `--locale` filtering.
22
+ *
23
+ * Call on merged config input **before** {@link parseI18nConfig} (e.g. from {@link loadI18nConfigFromFile}).
24
+ */
25
+ export declare function expandTargetLocalesFileReferenceInRawInput(raw: RawI18nConfigInput, cwd: string): void;
26
+ /**
27
+ * When a block's `targetLocales` is a single manifest path (`ui-languages.json`), expand to locale codes
28
+ * (excluding `sourceLocale`). Does not set `uiLanguagesPath` - UI resolution is unchanged.
29
+ */
30
+ export declare function expandDocumentationTargetLocalesInRawInput(raw: RawI18nConfigInput, cwd: string): void;
31
+ /**
32
+ * Locale codes used for **documentation** translation (markdown / JSON): union of each block's
33
+ * `targetLocales` when non-empty, otherwise root `targetLocales`, per block. Excludes `sourceLocale`, deduped.
34
+ */
35
+ export declare function getDocumentationTargetLocaleCodes(config: I18nConfig): string[];
36
+ /**
37
+ * Locales for `translate` / `sync` document steps (and `status` markdown columns). Honors `--locale` by
38
+ * intersecting with allowed documentation targets.
39
+ */
40
+ export declare function resolveLocalesForDocumentation(config: I18nConfig, _cwd: string, cliLocalesRaw?: string | null): string[];
41
+ /**
42
+ * Locales for `translate-svg`: always includes `sourceLocale` (copy-through output), plus documentation
43
+ * target locales (same as {@link getDocumentationTargetLocaleCodes}).
44
+ */
45
+ export declare function resolveLocalesForSvg(config: I18nConfig, _cwd: string, cliLocalesRaw?: string | null): string[];
46
+ export declare function resolveUiLanguagesAbsPath(config: I18nConfig, cwd: string): string | null;
47
+ export declare function loadUiLanguageEntries(absPath: string): UiLanguageEntry[];
48
+ /** Merge `englishName` into `localeDisplayNames` (normalized locale keys) for LLM prompts. */
49
+ export declare function mergeUiLanguageDisplayNames(config: I18nConfig, entries: UiLanguageEntry[]): I18nConfig;
50
+ /**
51
+ * Codes from `ui-languages.json` that are not the config source locale.
52
+ * If `config.targetLocales` is non-empty, keep only codes present in both (subset for apps that ship fewer translations).
53
+ */
54
+ export declare function resolveUiTranslationTargetCodes(config: I18nConfig, entries: UiLanguageEntry[]): string[];
55
+ /**
56
+ * Locales for `translate-ui` (and the UI step of `translate` / `sync`).
57
+ *
58
+ * - With `--locale`: parsed list; if `ui-languages.json` exists, only codes listed there are kept.
59
+ * - Without `--locale` and with a manifest on disk (`uiLanguagesPath`, usually set when `targetLocales` was a single
60
+ * manifest path at load): targets from file (− source), optionally ∩ `targetLocales`.
61
+ * - Otherwise: `config.targetLocales` (− source).
62
+ */
63
+ export declare function resolveLocalesForUI(config: I18nConfig, cwd: string, cliLocalesRaw?: string | null): string[];
64
+ /** If `uiLanguagesPath` is set and the file exists, merge display names into config. */
65
+ export declare function augmentConfigWithUiLanguagesFile(config: I18nConfig, cwd: string): I18nConfig;
66
+ //# sourceMappingURL=ui-languages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-languages.d.ts","sourceRoot":"","sources":["../../src/core/ui-languages.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEjE;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,oIAAoI;IACpI,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,+GAA+G;AAC/G,wBAAgB,2BAA2B,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAY9D;AAED;;;;;;GAMG;AACH,wBAAgB,0CAA0C,CACxD,GAAG,EAAE,kBAAkB,EACvB,GAAG,EAAE,MAAM,GACV,IAAI,CAyCN;AAED;;;GAGG;AACH,wBAAgB,0CAA0C,CACxD,GAAG,EAAE,kBAAkB,EACvB,GAAG,EAAE,MAAM,GACV,IAAI,CAyCN;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,EAAE,CAkB9E;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,MAAM,EACZ,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAC5B,MAAM,EAAE,CAeV;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,MAAM,EACZ,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAC5B,MAAM,EAAE,CAqBV;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMxF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,EAAE,CA8BxE;AAED,8FAA8F;AAC9F,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,eAAe,EAAE,GACzB,UAAU,CASZ;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,eAAe,EAAE,GACzB,MAAM,EAAE,CAUV;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,MAAM,EACX,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAC5B,MAAM,EAAE,CA6BV;AAED,wFAAwF;AACxF,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,CAa5F"}
@@ -0,0 +1,277 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { ConfigValidationError } from "./errors.js";
4
+ import { assignCoercedTargetLocales, coerceTargetLocalesField, normalizeLocale, parseLocaleList, } from "./locale-utils.js";
5
+ /** True if `targetLocales` should be treated as a path to a UI languages JSON manifest (not a locale code). */
6
+ export function looksLikeUiLanguagesFileRef(s) {
7
+ const t = s.trim();
8
+ if (!t) {
9
+ return false;
10
+ }
11
+ if (t.endsWith(".json")) {
12
+ return true;
13
+ }
14
+ if (t.includes("/") || t.includes("\\")) {
15
+ return true;
16
+ }
17
+ return false;
18
+ }
19
+ /**
20
+ * When `targetLocales` is a single string that looks like a manifest path, load it
21
+ * (`ui-languages.json` shape), replace `targetLocales` with locale codes (excluding `sourceLocale`),
22
+ * and set `uiLanguagesPath` to that path for prompts / `--locale` filtering.
23
+ *
24
+ * Call on merged config input **before** {@link parseI18nConfig} (e.g. from {@link loadI18nConfigFromFile}).
25
+ */
26
+ export function expandTargetLocalesFileReferenceInRawInput(raw, cwd) {
27
+ assignCoercedTargetLocales(raw);
28
+ const locs = raw.targetLocales;
29
+ if (!Array.isArray(locs) || locs.length !== 1) {
30
+ return;
31
+ }
32
+ const only = locs[0].trim();
33
+ if (!looksLikeUiLanguagesFileRef(only)) {
34
+ return;
35
+ }
36
+ const existingPath = raw.uiLanguagesPath?.trim();
37
+ if (existingPath) {
38
+ const absOnly = path.isAbsolute(only) ? only : path.join(cwd, only);
39
+ const absExisting = path.isAbsolute(existingPath) ? existingPath : path.join(cwd, existingPath);
40
+ if (path.normalize(absOnly) !== path.normalize(absExisting)) {
41
+ throw new ConfigValidationError(`targetLocales references "${only}" but uiLanguagesPath is "${existingPath}"; use one manifest path, or omit uiLanguagesPath when using a string path or single manifest entry in targetLocales.`);
42
+ }
43
+ }
44
+ const abs = path.isAbsolute(only) ? only : path.join(cwd, only);
45
+ if (!fs.existsSync(abs)) {
46
+ throw new ConfigValidationError(`targetLocales: UI languages file not found: ${abs}`);
47
+ }
48
+ let entries;
49
+ try {
50
+ entries = loadUiLanguageEntries(abs);
51
+ }
52
+ catch (e) {
53
+ throw new ConfigValidationError(`targetLocales: invalid UI languages file "${only}": ${e instanceof Error ? e.message : String(e)}`);
54
+ }
55
+ const src = normalizeLocale(raw.sourceLocale ?? "en");
56
+ const codes = entries.map((e) => normalizeLocale(e.code)).filter((c) => c !== src);
57
+ raw.targetLocales = codes;
58
+ raw.uiLanguagesPath = only;
59
+ }
60
+ /**
61
+ * When a block's `targetLocales` is a single manifest path (`ui-languages.json`), expand to locale codes
62
+ * (excluding `sourceLocale`). Does not set `uiLanguagesPath` - UI resolution is unchanged.
63
+ */
64
+ export function expandDocumentationTargetLocalesInRawInput(raw, cwd) {
65
+ const docs = raw.documentations;
66
+ if (!Array.isArray(docs)) {
67
+ return;
68
+ }
69
+ for (const item of docs) {
70
+ if (!item || typeof item !== "object" || Array.isArray(item)) {
71
+ continue;
72
+ }
73
+ const d = item;
74
+ const tl = d.targetLocales;
75
+ if (tl === undefined || tl === null) {
76
+ continue;
77
+ }
78
+ const arr = coerceTargetLocalesField(tl);
79
+ d.targetLocales = arr;
80
+ if (!Array.isArray(arr) || arr.length !== 1) {
81
+ continue;
82
+ }
83
+ const only = String(arr[0]).trim();
84
+ if (!looksLikeUiLanguagesFileRef(only)) {
85
+ continue;
86
+ }
87
+ const abs = path.isAbsolute(only) ? only : path.join(cwd, only);
88
+ if (!fs.existsSync(abs)) {
89
+ throw new ConfigValidationError(`documentations[].targetLocales: languages file not found: ${abs}`);
90
+ }
91
+ let entries;
92
+ try {
93
+ entries = loadUiLanguageEntries(abs);
94
+ }
95
+ catch (e) {
96
+ throw new ConfigValidationError(`documentations[].targetLocales: invalid languages file "${only}": ${e instanceof Error ? e.message : String(e)}`);
97
+ }
98
+ const src = normalizeLocale(raw.sourceLocale ?? "en");
99
+ const codes = entries.map((e) => normalizeLocale(e.code)).filter((c) => c !== src);
100
+ d.targetLocales = codes;
101
+ }
102
+ }
103
+ /**
104
+ * Locale codes used for **documentation** translation (markdown / JSON): union of each block's
105
+ * `targetLocales` when non-empty, otherwise root `targetLocales`, per block. Excludes `sourceLocale`, deduped.
106
+ */
107
+ export function getDocumentationTargetLocaleCodes(config) {
108
+ const src = normalizeLocale(config.sourceLocale);
109
+ const seen = new Set();
110
+ const out = [];
111
+ for (const block of config.documentations) {
112
+ const doc = block.targetLocales;
113
+ const useDoc = Array.isArray(doc) && doc.length > 0;
114
+ const list = useDoc ? doc : config.targetLocales;
115
+ for (const l of list) {
116
+ const c = normalizeLocale(l);
117
+ if (c === src || seen.has(c)) {
118
+ continue;
119
+ }
120
+ seen.add(c);
121
+ out.push(c);
122
+ }
123
+ }
124
+ return out;
125
+ }
126
+ /**
127
+ * Locales for `translate` / `sync` document steps (and `status` markdown columns). Honors `--locale` by
128
+ * intersecting with allowed documentation targets.
129
+ */
130
+ export function resolveLocalesForDocumentation(config, _cwd, cliLocalesRaw) {
131
+ const base = getDocumentationTargetLocaleCodes(config);
132
+ const src = normalizeLocale(config.sourceLocale);
133
+ if (cliLocalesRaw?.trim()) {
134
+ const requested = parseLocaleList(cliLocalesRaw).map((c) => normalizeLocale(c));
135
+ const allowed = new Set(base);
136
+ const list = requested.filter((c) => c !== src && allowed.has(c));
137
+ if (list.length === 0 && requested.filter((c) => c !== src).length > 0) {
138
+ throw new Error(`[translate] None of the requested --locale codes are documentation target locales. Allowed: ${[...allowed].join(", ") || "(none)"}`);
139
+ }
140
+ return list;
141
+ }
142
+ return base;
143
+ }
144
+ /**
145
+ * Locales for `translate-svg`: always includes `sourceLocale` (copy-through output), plus documentation
146
+ * target locales (same as {@link getDocumentationTargetLocaleCodes}).
147
+ */
148
+ export function resolveLocalesForSvg(config, _cwd, cliLocalesRaw) {
149
+ const docTargets = getDocumentationTargetLocaleCodes(config);
150
+ const src = normalizeLocale(config.sourceLocale);
151
+ const base = [src];
152
+ for (const l of docTargets) {
153
+ if (!base.includes(l)) {
154
+ base.push(l);
155
+ }
156
+ }
157
+ if (cliLocalesRaw?.trim()) {
158
+ const requested = parseLocaleList(cliLocalesRaw).map((c) => normalizeLocale(c));
159
+ const allowed = new Set(base);
160
+ const list = requested.filter((c) => allowed.has(c));
161
+ if (list.length === 0 && requested.length > 0) {
162
+ throw new Error(`[translate-svg] None of the requested --locale codes are allowed. Allowed: ${[...allowed].join(", ")}`);
163
+ }
164
+ return list;
165
+ }
166
+ return base;
167
+ }
168
+ export function resolveUiLanguagesAbsPath(config, cwd) {
169
+ const p = config.uiLanguagesPath?.trim();
170
+ if (!p) {
171
+ return null;
172
+ }
173
+ return path.isAbsolute(p) ? p : path.join(cwd, p);
174
+ }
175
+ export function loadUiLanguageEntries(absPath) {
176
+ const raw = fs.readFileSync(absPath, "utf8");
177
+ const data = JSON.parse(raw);
178
+ if (!Array.isArray(data)) {
179
+ throw new Error("ui-languages.json must be a JSON array of { code, label, englishName }");
180
+ }
181
+ const out = [];
182
+ for (const item of data) {
183
+ if (item === null || typeof item !== "object") {
184
+ continue;
185
+ }
186
+ const o = item;
187
+ const code = typeof o.code === "string" ? o.code.trim() : "";
188
+ if (!code) {
189
+ continue;
190
+ }
191
+ const label = typeof o.label === "string" ? o.label : code;
192
+ const enRaw = o.englishName;
193
+ if (typeof enRaw !== "string" || !enRaw.trim()) {
194
+ throw new Error(`ui-languages.json: entry with code "${code}" must include a non-empty string "englishName"`);
195
+ }
196
+ const englishName = enRaw.trim();
197
+ out.push({ code, label, englishName });
198
+ }
199
+ if (out.length === 0) {
200
+ throw new Error("ui-languages.json: no valid entries with a `code` field");
201
+ }
202
+ return out;
203
+ }
204
+ /** Merge `englishName` into `localeDisplayNames` (normalized locale keys) for LLM prompts. */
205
+ export function mergeUiLanguageDisplayNames(config, entries) {
206
+ const names = { ...(config.localeDisplayNames ?? {}) };
207
+ for (const e of entries) {
208
+ const n = normalizeLocale(e.code);
209
+ if (!names[n]) {
210
+ names[n] = e.englishName;
211
+ }
212
+ }
213
+ return { ...config, localeDisplayNames: names };
214
+ }
215
+ /**
216
+ * Codes from `ui-languages.json` that are not the config source locale.
217
+ * If `config.targetLocales` is non-empty, keep only codes present in both (subset for apps that ship fewer translations).
218
+ */
219
+ export function resolveUiTranslationTargetCodes(config, entries) {
220
+ const src = normalizeLocale(config.sourceLocale);
221
+ const fromFile = entries.map((e) => normalizeLocale(e.code)).filter((c) => c !== src);
222
+ const configured = config.targetLocales.map((l) => normalizeLocale(l));
223
+ if (configured.length === 0) {
224
+ return fromFile;
225
+ }
226
+ const allowed = new Set(fromFile);
227
+ return configured.filter((c) => allowed.has(c));
228
+ }
229
+ /**
230
+ * Locales for `translate-ui` (and the UI step of `translate` / `sync`).
231
+ *
232
+ * - With `--locale`: parsed list; if `ui-languages.json` exists, only codes listed there are kept.
233
+ * - Without `--locale` and with a manifest on disk (`uiLanguagesPath`, usually set when `targetLocales` was a single
234
+ * manifest path at load): targets from file (− source), optionally ∩ `targetLocales`.
235
+ * - Otherwise: `config.targetLocales` (− source).
236
+ */
237
+ export function resolveLocalesForUI(config, cwd, cliLocalesRaw) {
238
+ const abs = resolveUiLanguagesAbsPath(config, cwd);
239
+ const entries = abs && fs.existsSync(abs) ? loadUiLanguageEntries(abs) : null;
240
+ const allowedCodes = entries ? new Set(entries.map((e) => normalizeLocale(e.code))) : null;
241
+ const src = normalizeLocale(config.sourceLocale);
242
+ let list;
243
+ if (cliLocalesRaw?.trim()) {
244
+ list = parseLocaleList(cliLocalesRaw);
245
+ if (allowedCodes) {
246
+ const before = list.length;
247
+ list = list.filter((c) => allowedCodes.has(normalizeLocale(c)));
248
+ if (list.length === 0 && before > 0) {
249
+ const where = config.uiLanguagesPath ?? "targetLocales UI languages file";
250
+ throw new Error(`[translate-ui] None of the requested locales appear in ${where}. ` +
251
+ `Allowed codes: ${[...allowedCodes].join(", ")}`);
252
+ }
253
+ }
254
+ }
255
+ else if (entries) {
256
+ list = resolveUiTranslationTargetCodes(config, entries);
257
+ }
258
+ else {
259
+ list = config.targetLocales.map((l) => normalizeLocale(l));
260
+ }
261
+ return list.filter((c) => normalizeLocale(c) !== src);
262
+ }
263
+ /** If `uiLanguagesPath` is set and the file exists, merge display names into config. */
264
+ export function augmentConfigWithUiLanguagesFile(config, cwd) {
265
+ const abs = resolveUiLanguagesAbsPath(config, cwd);
266
+ if (!abs || !fs.existsSync(abs)) {
267
+ return config;
268
+ }
269
+ try {
270
+ const entries = loadUiLanguageEntries(abs);
271
+ return mergeUiLanguageDisplayNames(config, entries);
272
+ }
273
+ catch (e) {
274
+ throw new Error(`Invalid ui-languages file (${config.uiLanguagesPath}): ${e instanceof Error ? e.message : String(e)}`);
275
+ }
276
+ }
277
+ //# sourceMappingURL=ui-languages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-languages.js","sourceRoot":"","sources":["../../src/core/ui-languages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Sentinel for `strings.json` `models[locale]` and SQLite `translations.model` when edited via the translation editor. */
2
+ export declare const USER_EDITED_MODEL = "user-edited";
3
+ //# sourceMappingURL=user-edited-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-edited-model.d.ts","sourceRoot":"","sources":["../../src/core/user-edited-model.ts"],"names":[],"mappings":"AAAA,2HAA2H;AAC3H,eAAO,MAAM,iBAAiB,gBAAgB,CAAC"}