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,130 @@
1
+ import path from "path";
2
+ const DOCUSAURUS_PLUGIN = "docusaurus-plugin-content-docs/current";
3
+ /** Normalize to forward slashes for template keys and comparisons. */
4
+ export function toPosix(p) {
5
+ return p.split(path.sep).join("/");
6
+ }
7
+ function templateForKind(config, kind) {
8
+ const mo = config.documentation.markdownOutput;
9
+ if (kind === "markdown") {
10
+ return mo.pathTemplate?.trim();
11
+ }
12
+ return mo.jsonPathTemplate?.trim();
13
+ }
14
+ /**
15
+ * Expand `{outputDir}`, `{locale}`, `{LOCALE}`, `{relPath}`, `{stem}`, `{basename}`, `{extension}`,
16
+ * `{docsRoot}`, `{relativeToDocsRoot}`.
17
+ */
18
+ export function expandPathTemplate(template, ctx) {
19
+ const posixRel = toPosix(ctx.relPath);
20
+ const parsed = path.posix.parse(posixRel);
21
+ const stem = parsed.name;
22
+ const extension = parsed.ext;
23
+ const basename = parsed.base;
24
+ let relativeToDocsRoot = posixRel;
25
+ const dr = toPosix(ctx.docsRoot).replace(/\/$/, "");
26
+ if (dr && (posixRel === dr || posixRel.startsWith(`${dr}/`))) {
27
+ relativeToDocsRoot = posixRel.slice(dr.length).replace(/^\//, "");
28
+ }
29
+ let out = template;
30
+ const pairs = [
31
+ ["{outputDir}", ctx.outputDir],
32
+ ["{locale}", ctx.locale],
33
+ ["{LOCALE}", ctx.locale.toUpperCase()],
34
+ ["{relPath}", posixRel],
35
+ ["{stem}", stem],
36
+ ["{basename}", basename],
37
+ ["{extension}", extension],
38
+ ["{docsRoot}", ctx.docsRoot],
39
+ ["{relativeToDocsRoot}", relativeToDocsRoot],
40
+ ];
41
+ for (const [key, val] of pairs) {
42
+ out = out.split(key).join(val);
43
+ }
44
+ return out;
45
+ }
46
+ function assertOutputWithinRoot(absFile, rootDir) {
47
+ const abs = path.resolve(absFile);
48
+ const root = path.resolve(rootDir);
49
+ const rel = path.relative(root, abs);
50
+ if (rel.startsWith("..") || path.isAbsolute(rel)) {
51
+ throw new Error(`Resolved output path escapes the documentation block outputDir: ${absFile} (root: ${root})`);
52
+ }
53
+ }
54
+ function resolveByStyle(config, cwd, locale, relPath, kind) {
55
+ const doc = config.documentation;
56
+ const outBase = path.resolve(cwd, doc.outputDir);
57
+ const mo = doc.markdownOutput;
58
+ const posixRel = toPosix(relPath);
59
+ const docsRootRaw = mo.docsRoot?.trim() || "docs";
60
+ const docsRootPosix = toPosix(path.normalize(docsRootRaw)).replace(/\/$/, "");
61
+ if (kind !== "markdown") {
62
+ return path.join(outBase, locale, relPath);
63
+ }
64
+ switch (mo.style) {
65
+ case "nested":
66
+ return path.join(outBase, locale, relPath);
67
+ case "docusaurus": {
68
+ const under = posixRel === docsRootPosix ||
69
+ posixRel.startsWith(`${docsRootPosix}/`) ||
70
+ posixRel.startsWith(`${docsRootPosix}\\`);
71
+ if (!under) {
72
+ return path.join(outBase, locale, relPath);
73
+ }
74
+ const rest = posixRel === docsRootPosix ? "" : posixRel.slice(docsRootPosix.length + 1);
75
+ return path.join(outBase, locale, DOCUSAURUS_PLUGIN, rest);
76
+ }
77
+ case "flat": {
78
+ const parsed = path.posix.parse(posixRel);
79
+ const stem = parsed.name;
80
+ const ext = parsed.ext;
81
+ if (mo.flatPreserveRelativeDir) {
82
+ const dir = parsed.dir;
83
+ if (dir && dir !== ".") {
84
+ return path.join(outBase, dir, `${stem}.${locale}${ext}`);
85
+ }
86
+ }
87
+ return path.join(outBase, `${stem}.${locale}${ext}`);
88
+ }
89
+ default:
90
+ return path.join(outBase, locale, relPath);
91
+ }
92
+ }
93
+ /**
94
+ * Resolve absolute output path for a translated documentation artifact.
95
+ */
96
+ export function resolveDocumentationOutputPath(config, cwd, locale, relPath, kind) {
97
+ const doc = config.documentation;
98
+ const outBaseResolved = path.resolve(cwd, doc.outputDir);
99
+ const mo = doc.markdownOutput;
100
+ const docsRootRaw = mo.docsRoot?.trim() || "docs";
101
+ const docsRootResolved = path.resolve(cwd, docsRootRaw);
102
+ const tmpl = templateForKind(config, kind);
103
+ let abs;
104
+ if (tmpl && tmpl.length > 0) {
105
+ const expanded = expandPathTemplate(tmpl, {
106
+ outputDir: outBaseResolved,
107
+ locale,
108
+ relPath,
109
+ docsRoot: docsRootResolved,
110
+ });
111
+ abs = path.isAbsolute(expanded) ? path.normalize(expanded) : path.resolve(cwd, expanded);
112
+ }
113
+ else {
114
+ abs = resolveByStyle(config, cwd, locale, relPath, kind);
115
+ }
116
+ assertOutputWithinRoot(abs, outBaseResolved);
117
+ return abs;
118
+ }
119
+ /** Whether to run relative link rewriting for flat markdown outputs. */
120
+ export function shouldRewriteFlatMarkdownLinks(config) {
121
+ const mo = config.documentation.markdownOutput;
122
+ if (mo.rewriteRelativeLinks !== undefined) {
123
+ return mo.rewriteRelativeLinks;
124
+ }
125
+ if (mo.pathTemplate?.trim()) {
126
+ return false;
127
+ }
128
+ return mo.style === "flat";
129
+ }
130
+ //# sourceMappingURL=output-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-paths.js","sourceRoot":"","sources":["../../src/core/output-paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import type { Segment } from "./types.js";
2
+ import { PROMPTS, type PromptStrings, type DocumentPromptStrings, type UIPromptStrings } from "./prompts.js";
3
+ /**
4
+ * Document translation prompts follow common OpenRouter-style doc-translation patterns
5
+ * (`buildBatchPrompt`, `buildPrompt`, `MARKDOWN_PRESERVATION_RULES`). Adjust here when prompt strategy changes.
6
+ *
7
+ * For **JSON** (Docusaurus locale files) and **SVG** text segments, we append context addenda so the same
8
+ * `<t id="N">` / `<translate>` response shape stays robust outside pure markdown.
9
+ *
10
+ * Prompt **content** lives in `prompts.ts`; this module handles assembly and parsing only.
11
+ */
12
+ export type DocumentPromptContentType = "markdown" | "json" | "svg";
13
+ export type DocumentBatchResponseFormat = "xml-tags" | "json-array" | "json-object";
14
+ export type { PromptStrings, DocumentPromptStrings, UIPromptStrings };
15
+ export { PROMPTS };
16
+ /**
17
+ * Extra system-prompt guidance so models do not break CommonMark / GFM structure.
18
+ * Fenced ``` / ~~~ blocks are not sent to the model (`DocumentSplitter` marks them non-translatable).
19
+ * @see docs/OVERVIEW.md (document translation)
20
+ */
21
+ export declare const MARKDOWN_PRESERVATION_RULES: string;
22
+ /** Appended for locale JSON message segments (batch `<t id="N">` response format). */
23
+ export declare const JSON_SEGMENT_CONTEXT_ADDENDUM: string;
24
+ /** Appended for SVG <text>/<tspan>/<title> extracted segments. */
25
+ export declare const SVG_SEGMENT_CONTEXT_ADDENDUM: string;
26
+ export interface PromptBuilderOptions {
27
+ sourceLanguageLabel: string;
28
+ targetLanguageLabel: string;
29
+ glossaryHints: string[];
30
+ }
31
+ export declare function buildDocumentBatchPrompt(segments: Segment[], opts: PromptBuilderOptions, contentType?: DocumentPromptContentType, responseFormat?: DocumentBatchResponseFormat): {
32
+ systemPrompt: string;
33
+ userContent: string;
34
+ };
35
+ export declare function buildDocumentSinglePrompt(content: string, opts: PromptBuilderOptions, contentType?: DocumentPromptContentType): {
36
+ systemPrompt: string;
37
+ userContent: string;
38
+ };
39
+ export declare function buildUIPromptMessages(texts: string[], opts: {
40
+ sourceLanguageLabel: string;
41
+ targetLanguageLabel: string;
42
+ glossaryHints?: string[];
43
+ }): {
44
+ systemPrompt: string;
45
+ userContent: string;
46
+ };
47
+ /** Base class for prompt/response parse errors that carry the raw model output. */
48
+ export declare class PromptParseError extends Error {
49
+ readonly rawResponse: string;
50
+ constructor(message: string, rawResponse: string);
51
+ }
52
+ export declare class DocumentBatchJsonParseError extends PromptParseError {
53
+ constructor(message: string, rawResponse: string);
54
+ }
55
+ export declare class UIJsonArrayParseError extends PromptParseError {
56
+ constructor(message: string, rawResponse: string);
57
+ }
58
+ export declare function parseBatchTranslationResponse(response: string, segmentCount: number, rawResponse: string): Map<number, string>;
59
+ export declare function parseBatchJsonArrayResponse(content: string, expectedLength: number): Map<number, string>;
60
+ export declare function parseBatchJsonObjectResponse(content: string, expectedLength: number): Map<number, string>;
61
+ export declare function parseUIJsonArrayResponse(content: string, expectedLength: number): string[];
62
+ //# sourceMappingURL=prompt-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../../src/core/prompt-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,EACL,OAAO,EACP,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACrB,MAAM,cAAc,CAAC;AAEtB;;;;;;;;GAQG;AACH,MAAM,MAAM,yBAAyB,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,CAAC;AACpE,MAAM,MAAM,2BAA2B,GAAG,UAAU,GAAG,YAAY,GAAG,aAAa,CAAC;AAEpF,YAAY,EAAE,aAAa,EAAE,qBAAqB,EAAE,eAAe,EAAE,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,CAAC;AAInB;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,EAAE,MAA8C,CAAC;AAEzF,sFAAsF;AACtF,eAAO,MAAM,6BAA6B,EAAE,MAA6C,CAAC;AAE1F,kEAAkE;AAClE,eAAO,MAAM,4BAA4B,EAAE,MAA4C,CAAC;AAIxF,MAAM,WAAW,oBAAoB;IACnC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AA4CD,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,OAAO,EAAE,EACnB,IAAI,EAAE,oBAAoB,EAC1B,WAAW,GAAE,yBAAsC,EACnD,cAAc,GAAE,2BAAwC,GACvD;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAuC/C;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,oBAAoB,EAC1B,WAAW,GAAE,yBAAsC,GAClD;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CA8B/C;AAID,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EAAE,EACf,IAAI,EAAE;IACJ,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B,GACA;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAW/C;AAID,mFAAmF;AACnF,qBAAa,gBAAiB,SAAQ,KAAK;aAGvB,WAAW,EAAE,MAAM;gBADnC,OAAO,EAAE,MAAM,EACC,WAAW,EAAE,MAAM;CAKtC;AAED,qBAAa,2BAA4B,SAAQ,gBAAgB;gBACnD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;CAIjD;AAED,qBAAa,qBAAsB,SAAQ,gBAAgB;gBAC7C,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;CAIjD;AAYD,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAsBrB;AAID,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GACrB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAyBrB;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GACrB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CA2BrB;AAID,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,CAqB1F"}
@@ -0,0 +1,232 @@
1
+ import { BatchTranslationError } from "./types.js";
2
+ import { PROMPTS, } from "./prompts.js";
3
+ export { PROMPTS };
4
+ // ── Backward-compatible exported constants (derived from JSON) ────────────
5
+ /**
6
+ * Extra system-prompt guidance so models do not break CommonMark / GFM structure.
7
+ * Fenced ``` / ~~~ blocks are not sent to the model (`DocumentSplitter` marks them non-translatable).
8
+ * @see docs/OVERVIEW.md (document translation)
9
+ */
10
+ export const MARKDOWN_PRESERVATION_RULES = PROMPTS.document.markdownPreservation;
11
+ /** Appended for locale JSON message segments (batch `<t id="N">` response format). */
12
+ export const JSON_SEGMENT_CONTEXT_ADDENDUM = PROMPTS.document.jsonSegmentAddendum;
13
+ /** Appended for SVG <text>/<tspan>/<title> extracted segments. */
14
+ export const SVG_SEGMENT_CONTEXT_ADDENDUM = PROMPTS.document.svgSegmentAddendum;
15
+ // ── Shared helpers ────────────────────────────────────────────────────────
16
+ function buildGlossaryBlock(hints, preamble) {
17
+ const filtered = hints.filter((h) => h.trim().length > 0);
18
+ if (filtered.length === 0)
19
+ return "";
20
+ const prefix = preamble ? `\n\n${preamble}` : "";
21
+ return `${prefix}\n<glossary>\n${filtered.join("\n")}\n</glossary>\n`;
22
+ }
23
+ function escapeXml(text) {
24
+ return text
25
+ .replace(/&/g, "&amp;")
26
+ .replace(/</g, "&lt;")
27
+ .replace(/>/g, "&gt;")
28
+ .replace(/"/g, "&quot;");
29
+ }
30
+ function unescapeXml(text) {
31
+ return text
32
+ .replace(/&quot;/g, '"')
33
+ .replace(/&lt;/g, "<")
34
+ .replace(/&gt;/g, ">")
35
+ .replace(/&amp;/g, "&");
36
+ }
37
+ /** Shared rules block for document batch/single prompts (all document types). */
38
+ function documentCoreRulesBlock(opts) {
39
+ return `Translate from ${opts.sourceLanguageLabel} to ${opts.targetLanguageLabel}.
40
+
41
+ ${PROMPTS.document.coreRules}
42
+
43
+ ${PROMPTS.document.markdownPreservation}`;
44
+ }
45
+ function contentTypeAddendum(contentType) {
46
+ if (contentType === "json")
47
+ return PROMPTS.document.jsonSegmentAddendum;
48
+ if (contentType === "svg")
49
+ return PROMPTS.document.svgSegmentAddendum;
50
+ return "";
51
+ }
52
+ // ── Document prompt builders ──────────────────────────────────────────────
53
+ export function buildDocumentBatchPrompt(segments, opts, contentType = "markdown", responseFormat = "xml-tags") {
54
+ const glossary = buildGlossaryBlock(opts.glossaryHints);
55
+ const addendum = contentTypeAddendum(contentType);
56
+ if (responseFormat === "json-array") {
57
+ const userContent = JSON.stringify(segments.map((s) => s.content), null, 2);
58
+ const systemPrompt = `${documentCoreRulesBlock(opts)}${addendum}
59
+
60
+ ${PROMPTS.document.batchJsonArrayInstruction}${glossary}`;
61
+ return { systemPrompt, userContent };
62
+ }
63
+ if (responseFormat === "json-object") {
64
+ const payload = {};
65
+ for (let i = 0; i < segments.length; i++) {
66
+ payload[String(i)] = segments[i]?.content ?? "";
67
+ }
68
+ const userContent = JSON.stringify(payload, null, 2);
69
+ const systemPrompt = `${documentCoreRulesBlock(opts)}${addendum}
70
+
71
+ ${PROMPTS.document.batchJsonObjectInstruction}${glossary}`;
72
+ return { systemPrompt, userContent };
73
+ }
74
+ const segBlocks = segments
75
+ .map((s, i) => `<seg id="${i}">${escapeXml(s.content)}</seg>`)
76
+ .join("\n");
77
+ const systemPrompt = `${documentCoreRulesBlock(opts)}${addendum}
78
+
79
+ ${PROMPTS.document.batchXmlInstruction}${glossary}`;
80
+ const userContent = `<segments>
81
+ ${segBlocks}
82
+ </segments>`;
83
+ return { systemPrompt, userContent };
84
+ }
85
+ export function buildDocumentSinglePrompt(content, opts, contentType = "markdown") {
86
+ const glossary = buildGlossaryBlock(opts.glossaryHints);
87
+ const addendum = contentTypeAddendum(contentType);
88
+ const footer = PROMPTS.document.translateFooter;
89
+ let systemPrompt;
90
+ if (contentType === "markdown") {
91
+ const example = PROMPTS.document.markdownExample.replace(/\{\{targetLang\}\}/g, opts.targetLanguageLabel);
92
+ systemPrompt = `${documentCoreRulesBlock(opts)}
93
+
94
+ ${example}
95
+
96
+ ---
97
+ ${footer}${glossary}`;
98
+ }
99
+ else {
100
+ systemPrompt = `${documentCoreRulesBlock(opts)}${addendum}
101
+
102
+ ---
103
+ ${footer}${glossary}`;
104
+ }
105
+ const userContent = `<translate>
106
+ ${content}
107
+ </translate>`;
108
+ return { systemPrompt, userContent };
109
+ }
110
+ // ── UI prompt builder ─────────────────────────────────────────────────────
111
+ export function buildUIPromptMessages(texts, opts) {
112
+ const systemBase = PROMPTS.ui.systemPrompt.join("\n");
113
+ const glossaryBlock = buildGlossaryBlock(opts.glossaryHints ?? [], PROMPTS.ui.glossaryPreamble);
114
+ const userContent = `Translate these ${texts.length} UI strings from ${opts.sourceLanguageLabel} to ${opts.targetLanguageLabel} and return a JSON array:
115
+
116
+ ${JSON.stringify(texts, null, 2)}
117
+
118
+ Respond with ONLY the JSON array. No other text.`;
119
+ return { systemPrompt: systemBase + glossaryBlock, userContent };
120
+ }
121
+ // ── Response parsing: shared helpers ──────────────────────────────────────
122
+ /** Base class for prompt/response parse errors that carry the raw model output. */
123
+ export class PromptParseError extends Error {
124
+ constructor(message, rawResponse) {
125
+ super(message);
126
+ this.rawResponse = rawResponse;
127
+ this.name = "PromptParseError";
128
+ }
129
+ }
130
+ export class DocumentBatchJsonParseError extends PromptParseError {
131
+ constructor(message, rawResponse) {
132
+ super(message, rawResponse);
133
+ this.name = "DocumentBatchJsonParseError";
134
+ }
135
+ }
136
+ export class UIJsonArrayParseError extends PromptParseError {
137
+ constructor(message, rawResponse) {
138
+ super(message, rawResponse);
139
+ this.name = "UIJsonArrayParseError";
140
+ }
141
+ }
142
+ function cleanJsonResponse(content) {
143
+ return content
144
+ .trim()
145
+ .replace(/^```(?:json)?\s*/i, "")
146
+ .replace(/\s*```$/i, "")
147
+ .trim();
148
+ }
149
+ // ── XML batch parser ──────────────────────────────────────────────────────
150
+ export function parseBatchTranslationResponse(response, segmentCount, rawResponse) {
151
+ const regex = /<t\s+id="(\d+)"[^>]*>\s*([\s\S]*?)\s*<\/t>/g;
152
+ const byIndex = new Map();
153
+ let match;
154
+ while ((match = regex.exec(response)) !== null) {
155
+ const id = parseInt(match[1], 10);
156
+ const rawContent = match[2].trim();
157
+ byIndex.set(id, unescapeXml(rawContent));
158
+ }
159
+ if (byIndex.size !== segmentCount) {
160
+ throw new BatchTranslationError(segmentCount, byIndex.size, rawResponse);
161
+ }
162
+ for (let i = 0; i < segmentCount; i++) {
163
+ if (byIndex.get(i) === undefined) {
164
+ throw new BatchTranslationError(segmentCount, byIndex.size, rawResponse);
165
+ }
166
+ }
167
+ return byIndex;
168
+ }
169
+ // ── JSON batch parsers (unified) ──────────────────────────────────────────
170
+ export function parseBatchJsonArrayResponse(content, expectedLength) {
171
+ const cleaned = cleanJsonResponse(content);
172
+ let parsed;
173
+ try {
174
+ parsed = JSON.parse(cleaned);
175
+ }
176
+ catch (e) {
177
+ throw new DocumentBatchJsonParseError(`Document batch (json-array): invalid JSON (${e instanceof Error ? e.message : String(e)})`, content);
178
+ }
179
+ if (!Array.isArray(parsed)) {
180
+ throw new DocumentBatchJsonParseError("Document batch (json-array): response is not a JSON array", content);
181
+ }
182
+ if (parsed.length !== expectedLength) {
183
+ throw new BatchTranslationError(expectedLength, parsed.length, content);
184
+ }
185
+ const out = new Map();
186
+ for (let i = 0; i < expectedLength; i++) {
187
+ out.set(i, String(parsed[i]));
188
+ }
189
+ return out;
190
+ }
191
+ export function parseBatchJsonObjectResponse(content, expectedLength) {
192
+ const cleaned = cleanJsonResponse(content);
193
+ let parsed;
194
+ try {
195
+ parsed = JSON.parse(cleaned);
196
+ }
197
+ catch (e) {
198
+ throw new DocumentBatchJsonParseError(`Document batch (json-object): invalid JSON (${e instanceof Error ? e.message : String(e)})`, content);
199
+ }
200
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
201
+ throw new DocumentBatchJsonParseError("Document batch (json-object): response is not a JSON object", content);
202
+ }
203
+ const record = parsed;
204
+ const out = new Map();
205
+ for (let i = 0; i < expectedLength; i++) {
206
+ const key = String(i);
207
+ if (!(key in record)) {
208
+ throw new BatchTranslationError(expectedLength, out.size, content);
209
+ }
210
+ out.set(i, String(record[key]));
211
+ }
212
+ return out;
213
+ }
214
+ // ── UI JSON array parser ──────────────────────────────────────────────────
215
+ export function parseUIJsonArrayResponse(content, expectedLength) {
216
+ const cleaned = cleanJsonResponse(content);
217
+ let parsed;
218
+ try {
219
+ parsed = JSON.parse(cleaned);
220
+ }
221
+ catch (e) {
222
+ throw new UIJsonArrayParseError(`UI batch: invalid JSON (${e instanceof Error ? e.message : String(e)})`, content);
223
+ }
224
+ if (!Array.isArray(parsed)) {
225
+ throw new UIJsonArrayParseError("UI batch: response is not a JSON array", content);
226
+ }
227
+ if (parsed.length !== expectedLength) {
228
+ throw new UIJsonArrayParseError(`UI batch: expected ${expectedLength} strings, got ${parsed.length}`, content);
229
+ }
230
+ return parsed.map((x) => String(x));
231
+ }
232
+ //# sourceMappingURL=prompt-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../../src/core/prompt-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Centralized prompt strings for all translation modes.
3
+ *
4
+ * Edit prompt **content** here; assembly logic lives in `prompt-builder.ts`.
5
+ * Follows the same separation pattern as transrewrt `prompts.json`.
6
+ */
7
+ export interface DocumentPromptStrings {
8
+ coreRules: string;
9
+ markdownPreservation: string;
10
+ jsonSegmentAddendum: string;
11
+ svgSegmentAddendum: string;
12
+ markdownExample: string;
13
+ translateFooter: string;
14
+ batchXmlInstruction: string;
15
+ batchJsonArrayInstruction: string;
16
+ batchJsonObjectInstruction: string;
17
+ }
18
+ export interface UIPromptStrings {
19
+ systemPrompt: string[];
20
+ glossaryPreamble: string;
21
+ }
22
+ export interface PromptStrings {
23
+ document: DocumentPromptStrings;
24
+ ui: UIPromptStrings;
25
+ }
26
+ export declare const PROMPTS: PromptStrings;
27
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/core/prompts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yBAAyB,EAAE,MAAM,CAAC;IAClC,0BAA0B,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,qBAAqB,CAAC;IAChC,EAAE,EAAE,eAAe,CAAC;CACrB;AAID,eAAO,MAAM,OAAO,EAAE,aA+DrB,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Centralized prompt strings for all translation modes.
3
+ *
4
+ * Edit prompt **content** here; assembly logic lives in `prompt-builder.ts`.
5
+ * Follows the same separation pattern as transrewrt `prompts.json`.
6
+ */
7
+ // ── Prompt content ────────────────────────────────────────────────────────
8
+ export const PROMPTS = {
9
+ document: {
10
+ coreRules: "Rules: Keep headers (###), variables, URLs, line breaks, markdown formatting, placeholders {{X}} unchanged. Preserve exactly (do not translate or alter): {{ADM_OPEN_N}}, {{ADM_END_N}}, {{URL_N}}, {{BLD_N}}, {{ILC_N}}, {{ANC_N}}, {{HDG_N}}, {{GLS_N}}, {{IT}}, {{IU}}, {{SE}}, {{SU}}, {{ST}} (for GLS and similar tokens, N is any non-negative integer; copy the full token character-for-character). Copy each placeholder character-for-character; do not change underscores, hyphens, or digits inside {{...}} tokens. Translate only title/description in front matter. If a <glossary> block appears below, you must preserve each suggested target wording when the source matches or contains that term (use that wording exactly; do not paraphrase or substitute synonyms). Maintain coherence for all other phrasing.",
11
+ markdownPreservation: "Markdown structure: Preserve heading levels (#\u2013######), list markers and indentation, blockquotes (>), horizontal rules, and meaningful line breaks. Inline `` `code` `` is sent as {{ILC_N}}; bold+code **`code`** as {{BLD_N}} \u2014 copy those tokens exactly. Keep **bold** and *italic* intact with balanced delimiters. Every **bold** span in the source must have a corresponding **bold** span in the translation \u2014 even when the bolded word translates to a short conjunction, particle, suffix, or single word in the target language; never remove bold to simplify the sentence. In [visible text](url), ![alt](path), and HTML like <img \u2026> / <a \u2026>, translate only the visible link text or alt; keep URLs, paths, angle-bracket links, and attribute names unchanged. Preserve GFM pipe tables (| cells |).",
12
+ jsonSegmentAddendum: `
13
+ Context: Segments are end-user-visible strings from Docusaurus or app locale JSON (messages, labels, descriptions, sidebar titles).
14
+ - Preserve interpolation and markup exactly: {name}, {{var}}, ICU/plural patterns, HTML inside strings, Markdown fragments if present, %s / %d style placeholders.
15
+ - Do not add or remove braces, brackets, or escape sequences; output only the translated human text inside each <t id="N"> block - never a full JSON object.`,
16
+ svgSegmentAddendum: `
17
+ Context: Segments are human-readable text from SVG (text elements, titles).
18
+ - Preserve entities and characters needed for correct display (&amp;, &#\u2026;, etc.) when they appear in the source.
19
+ - Keep short labels short when the source is short (layout).
20
+ - Translate only readable words; do not emit SVG/XML wrapper tags unless they were part of the segment source.`,
21
+ markdownExample: `Example (same structure in {{targetLang}}):
22
+ Input:
23
+ ### Section title
24
+ Body line with \`CODE\` and {{PLACEHOLDER}}.
25
+
26
+ Output:
27
+ ### [Translated section title]
28
+ [Translated body line with \`CODE\` and {{PLACEHOLDER}}.]`,
29
+ translateFooter: "Translate the content inside the <translate> tags below. Output ONLY the translated text - do NOT include <translate> or </translate> tags in your response. No explanations or extra markup.",
30
+ batchXmlInstruction: 'Each <seg id="N"> element contains one source segment. Reply with ONLY <t id="N">translation</t> blocks, one per segment, preserving the same N id. No other text.',
31
+ batchJsonArrayInstruction: `Each item in the JSON array is one source segment in order (index 0..N-1).
32
+ Reply with ONLY a valid JSON array of translated strings, preserving array length and index order exactly.
33
+ Do not return XML tags, markdown, code fences, comments, or any extra text.`,
34
+ batchJsonObjectInstruction: `The JSON object maps segment index to source text (keys "0".."N-1").
35
+ Reply with ONLY a valid JSON object with the exact same keys, each value translated.
36
+ Do not change keys, add keys, remove keys, or return XML tags/markdown/code fences/extra text.`,
37
+ },
38
+ ui: {
39
+ systemPrompt: [
40
+ "You are a professional UI/UX translator specializing in software interfaces.",
41
+ "",
42
+ "RULES:",
43
+ "- Translate UI labels, buttons, tooltips, menu items, and status messages",
44
+ "- Preserve capitalization style (Title Case stays Title Case, ALL CAPS stays ALL CAPS)",
45
+ "- Preserve leading/trailing whitespace exactly",
46
+ "- Keep placeholders unchanged: {{variable}}, {0}, %s, %d, :value, and {{GLS_N}} (any non-negative integer N; copy exactly)",
47
+ "- Keep HTML tags unchanged: <strong>, <br/>, etc.",
48
+ "- Use informal/familiar tone where natural for the target language",
49
+ "- Short strings (1-3 words) must stay short - do not expand them",
50
+ "- You MUST respond with ONLY a valid JSON array, nothing else",
51
+ "- No markdown, no code fences, no explanation, no preamble, no postamble",
52
+ "- First character of your response must be [ and last character must be ]",
53
+ ],
54
+ glossaryPreamble: "Glossary - when a string matches or contains a term below, you must use the suggested target wording exactly (preserve brand names and terminology; do not paraphrase, translate around, or substitute synonyms). Do not output glossary lines; respond with only the JSON array as required above.",
55
+ },
56
+ };
57
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/core/prompts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA0BH,6EAA6E;AAE7E,MAAM,CAAC,MAAM,OAAO,GAAkB;IACpC,QAAQ,EAAE;QACR,SAAS,EACP,uyBAAuyB;QAEzyB,oBAAoB,EAClB,mzBAAmzB;QAErzB,mBAAmB,EAAE;;;6JAGoI;QAEzJ,kBAAkB,EAAE;;;;+GAIuF;QAE3G,eAAe,EAAE;;;;;;;0DAOqC;QAEtD,eAAe,EACb,+LAA+L;QAEjM,mBAAmB,EACjB,oKAAoK;QAEtK,yBAAyB,EAAE;;4EAE6C;QAExE,0BAA0B,EAAE;;+FAE+D;KAC5F;IAED,EAAE,EAAE;QACF,YAAY,EAAE;YACZ,8EAA8E;YAC9E,EAAE;YACF,QAAQ;YACR,2EAA2E;YAC3E,wFAAwF;YACxF,gDAAgD;YAChD,4HAA4H;YAC5H,mDAAmD;YACnD,oEAAoE;YACpE,kEAAkE;YAClE,+DAA+D;YAC/D,0EAA0E;YAC1E,2EAA2E;SAC5E;QAED,gBAAgB,EACd,qSAAqS;KACxS;CACF,CAAC"}
@@ -0,0 +1,40 @@
1
+ import type { I18nConfig } from "./types.js";
2
+ export interface SvgPathTemplateContext {
3
+ /** Resolved absolute path of `svg.outputDir`. */
4
+ outputDir: string;
5
+ locale: string;
6
+ /** Path of the source file relative to cwd (posix). */
7
+ relPath: string;
8
+ /** Path under the configured `sourcePath` root (posix), e.g. `icons/a.svg`. */
9
+ relativeToSourceRoot: string;
10
+ }
11
+ /**
12
+ * Expand `{outputDir}`, `{locale}`, `{LOCALE}`, `{relPath}`, `{stem}`, `{basename}`, `{extension}`,
13
+ * `{relativeToSourceRoot}` (same as path under `svg.sourcePath`).
14
+ */
15
+ export declare function expandSvgPathTemplate(template: string, ctx: SvgPathTemplateContext): string;
16
+ /**
17
+ * Absolute path for a translated SVG asset (`translate-svg` command).
18
+ *
19
+ * - With `svg.pathTemplate`: expanded path (relative to cwd or absolute), constrained under `svg.outputDir`.
20
+ * - Else `flat`: `{outputDir}/{stem}.{locale}.svg`
21
+ * - Else `nested`: `{outputDir}/{locale}/{relPathFromSourceRoot}`
22
+ */
23
+ export declare function resolveSvgAssetOutputPath(config: I18nConfig, cwd: string, locale: string,
24
+ /** Path relative to cwd (posix), e.g. `images/foo.svg` */
25
+ relPathFromCwd: string,
26
+ /** Path relative to the `sourcePath` root that contained this file (posix), e.g. `foo.svg` or `icons/a.svg` */
27
+ relPathFromSourceRoot: string): string;
28
+ /**
29
+ * Namespaced key for `file_tracking` (and file-level cache skip) for standalone SVG assets.
30
+ * Do not use for `translations.filepath` — use {@link svgTranslationFilepathMetadata} instead.
31
+ */
32
+ export declare function svgAssetCacheFilepath(relPathFromCwdPosix: string): string;
33
+ /** Cwd-relative posix path for `translations.filepath` metadata (no `svg-assets:` prefix). */
34
+ export declare function svgTranslationFilepathMetadata(relPathFromCwd: string): string;
35
+ /**
36
+ * Path under a configured `svg.sourcePath` root (posix), for nested output layout.
37
+ * Returns `null` if `fileRelCwd` is not under any root.
38
+ */
39
+ export declare function relPathUnderSvgSource(fileRelCwd: string, sourceRoots: string[]): string | null;
40
+ //# sourceMappingURL=svg-asset-paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg-asset-paths.d.ts","sourceRoot":"","sources":["../../src/core/svg-asset-paths.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAY7C,MAAM,WAAW,sBAAsB;IACrC,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,sBAAsB,GAAG,MAAM,CAuB3F;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM;AACd,0DAA0D;AAC1D,cAAc,EAAE,MAAM;AACtB,+GAA+G;AAC/G,qBAAqB,EAAE,MAAM,GAC5B,MAAM,CA4BR;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,mBAAmB,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED,8FAA8F;AAC9F,wBAAgB,8BAA8B,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAa9F"}