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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Waldemar Scudeller Jr.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,157 @@
1
+ # ai-i18n-tools
2
+
3
+ CLI and programmatic toolkit for internationalising JavaScript/TypeScript applications and documentation sites. Extracts UI strings, translates them with LLMs via OpenRouter, and generates locale-ready JSON files for i18next, plus pipelines for markdown, Docusaurus JSON, and (via `features.translateSVG`, `translate-svg`, and the `svg` block) standalone SVG assets.
4
+
5
+
6
+ <small>**Read in other languages:** </small>
7
+ <small id="lang-list">[en-GB](./README.md) · [de](./translated-docs/README.de.md) · [es](./translated-docs/README.es.md) · [fr](./translated-docs/README.fr.md) · [hi](./translated-docs/README.hi.md) · [ja](./translated-docs/README.ja.md) · [ko](./translated-docs/README.ko.md) · [pt-BR](./translated-docs/README.pt-BR.md) · [zh-CN](./translated-docs/README.zh-CN.md) · [zh-TW](./translated-docs/README.zh-TW.md)</small>
8
+
9
+ ## Two core workflows
10
+
11
+ **Workflow 1 - UI Translation** (React, Next.js, Node.js, any i18next project)
12
+
13
+ Scans source files for `t("…")` calls, builds a master catalog (`strings.json` with optional per-locale **`models`** metadata), translates missing entries per locale via OpenRouter, and writes flat JSON files (`de.json`, `pt-BR.json`, …) ready for i18next.
14
+
15
+ **Workflow 2 - Document translation** (Markdown, Docusaurus JSON)
16
+
17
+ Translates `.md` and `.mdx` from each `documentations` block’s `contentPaths` and JSON label files from that block’s `jsonSource` when enabled. Supports Docusaurus-style and flat locale-suffixed layouts per block (`documentations[].markdownOutput`). Shared root `cacheDir` holds the SQLite cache so only new or changed segments are sent to the LLM. **SVG:** enable `features.translateSVG`, add the top-level `svg` block, then use `translate-svg` (also run from `sync` when both are set).
18
+
19
+ Both workflows share a single `ai-i18n-tools.config.json` file and can be used independently or together. Standalone SVG translation uses `features.translateSVG` plus the top-level `svg` block and runs through `translate-svg` (or the SVG stage inside `sync`).
20
+
21
+ ---
22
+
23
+ ## Installation
24
+
25
+ The published package is **ESM-only** (`"type": "module"`). Use `import` from Node.js, bundlers, or `import()` — **`require('ai-i18n-tools')` is not supported.**
26
+
27
+ ```bash
28
+ npm install ai-i18n-tools
29
+ # or
30
+ pnpm add ai-i18n-tools
31
+ ```
32
+
33
+ Set your OpenRouter API key:
34
+
35
+ ```bash
36
+ export OPENROUTER_API_KEY=sk-or-v1-your-key-here
37
+ ```
38
+
39
+ ---
40
+
41
+ ## Quick start
42
+
43
+ ### Workflow 1 - UI strings
44
+
45
+ ```bash
46
+ # 1. Create config
47
+ npx ai-i18n-tools init
48
+
49
+ # 2. Extract t("…") calls from source
50
+ npx ai-i18n-tools extract
51
+
52
+ # 3. Translate to all target locales
53
+ npx ai-i18n-tools translate-ui
54
+ ```
55
+
56
+ Wire i18next in your app using the helpers from `'ai-i18n-tools/runtime'`:
57
+
58
+ ```js
59
+ import i18n from 'i18next';
60
+ import { initReactI18next } from 'react-i18next';
61
+ import uiLanguages from './locales/ui-languages.json';
62
+ import {
63
+ defaultI18nInitOptions,
64
+ wrapI18nWithKeyTrim,
65
+ makeLoadLocale,
66
+ applyDirection,
67
+ } from 'ai-i18n-tools/runtime';
68
+
69
+ // Must match sourceLocale in ai-i18n-tools.config.json
70
+ export const SOURCE_LOCALE = 'en-GB';
71
+
72
+ void i18n.use(initReactI18next).init(defaultI18nInitOptions(SOURCE_LOCALE));
73
+ wrapI18nWithKeyTrim(i18n);
74
+ i18n.on('languageChanged', applyDirection);
75
+ applyDirection(i18n.language);
76
+
77
+ const localeLoaders = Object.fromEntries(
78
+ uiLanguages
79
+ .filter(({ code }) => code !== SOURCE_LOCALE)
80
+ .map(({ code }) => [code, () => import(`./locales/${code}.json`)])
81
+ );
82
+ export const loadLocale = makeLoadLocale(i18n, localeLoaders, SOURCE_LOCALE);
83
+ export default i18n;
84
+ ```
85
+
86
+ ### Workflow 2 - Documentation
87
+
88
+ ```bash
89
+ # 1. Create config for Docusaurus
90
+ npx ai-i18n-tools init -t ui-docusaurus
91
+
92
+ # 2. Translate all docs
93
+ npx ai-i18n-tools translate-docs
94
+
95
+ # 3. Check status
96
+ npx ai-i18n-tools status
97
+ ```
98
+
99
+ ### Both workflows
100
+
101
+ ```bash
102
+ npx ai-i18n-tools sync # Extract UI strings, then translate UI strings, SVG, and docs
103
+ ```
104
+
105
+ ---
106
+
107
+ ## Runtime helpers
108
+
109
+ Exported from `'ai-i18n-tools/runtime'` - work in any JS environment, no i18next import required:
110
+
111
+ | Helper | Description |
112
+ |---|---|
113
+ | `defaultI18nInitOptions(sourceLocale)` | Standard i18next init options for key-as-default setups. |
114
+ | `wrapI18nWithKeyTrim(i18n)` | Wrap `i18n.t` so keys are trimmed before lookup. |
115
+ | `makeLoadLocale(i18n, loaders, sourceLocale)` | Factory for async locale file loading. |
116
+ | `getTextDirection(lng)` | Returns `'ltr'` or `'rtl'` for a BCP-47 code. |
117
+ | `applyDirection(lng, element?)` | Sets `dir` attribute on `document.documentElement`. |
118
+ | `getUILanguageLabel(lang, t)` | Display label for a language menu row (with i18n). |
119
+ | `getUILanguageLabelNative(lang)` | Display label without calling `t()` (header-style). |
120
+ | `interpolateTemplate(str, vars)` | Low-level `{{var}}` substitution on a plain string (used internally; app code should use `t()` instead). |
121
+ | `flipUiArrowsForRtl(text, isRtl)` | Flip `→` to `←` for RTL layouts. |
122
+
123
+ ---
124
+
125
+ ## CLI commands
126
+
127
+ ```
128
+ ai-i18n-tools init [-t ui-markdown|ui-docusaurus] Create config file
129
+ ai-i18n-tools extract Scan source for t("…") calls
130
+ ai-i18n-tools translate-docs [--locale <code>] Translate documentation (markdown, JSON); see docs for
131
+ --force-update, --force, --stats, --clear-cache,
132
+ --prompt-format (xml | json-array | json-object)
133
+ ai-i18n-tools translate-svg [--locale <code>] Standalone SVG assets (features.translateSVG + config.svg); see --no-cache
134
+ ai-i18n-tools translate-ui [--locale <code>] Translate UI strings only; see --force, --dry-run
135
+ ai-i18n-tools export-ui-xliff [--locale <code>] Export UI strings to XLIFF 2.0 (one file per locale); see --untranslated-only, -o
136
+ ai-i18n-tools sync Extract UI strings, then translate UI strings, SVG, and docs
137
+ ai-i18n-tools status Translation status per file × locale
138
+ ai-i18n-tools editor Open cache/glossary web editor
139
+ ai-i18n-tools cleanup [--dry-run] [--no-backup] [--backup <path>] Runs sync --force-update, then cleans stale + orphaned cache rows; backs up SQLite by default
140
+ ai-i18n-tools glossary-generate Create empty glossary CSV template
141
+ ```
142
+
143
+ All commands accept `-c <config>` (default: `ai-i18n-tools.config.json`), `-v` (verbose), and optional `-w` / `--write-logs [path]` to append console output to a log file (default: under the translation cache directory).
144
+
145
+ ---
146
+
147
+ ## Documentation
148
+
149
+ - [Getting Started](docs/GETTING_STARTED.md) - full setup guide for both workflows, all CLI flags, and config field reference.
150
+ - [Package Overview](docs/PACKAGE_OVERVIEW.md) - architecture, internals, programmatic API, and extension points.
151
+ - [AI Agent Context](docs/ai-i18n-tools-context.md) - concise project context for agents and maintainers making code or config changes.
152
+
153
+ ---
154
+
155
+ ## License
156
+
157
+ MIT © [Waldemar Scudeller Jr.](https://github.com/wsj-br)
@@ -0,0 +1,115 @@
1
+ import type { I18nConfig } from "../core/types.js";
2
+ import { type BatchTranslationResult, type ChatResponse, type Segment, type TranslationResult } from "../core/types.js";
3
+ import { type DocumentBatchResponseFormat, type DocumentPromptContentType } from "../core/prompt-builder.js";
4
+ import type { Logger } from "../utils/logger.js";
5
+ /** Thrown when every model in the chain fails for {@link OpenRouterClient.translateDocumentBatch}. */
6
+ export declare class DocumentBatchAllModelsFailedError extends Error {
7
+ readonly details: {
8
+ systemPrompt: string;
9
+ userContent: string;
10
+ lastModel: string;
11
+ lastError: unknown;
12
+ /** HTTP response body text when the model returned content but parsing failed. */
13
+ lastRawAssistantContent?: string;
14
+ };
15
+ constructor(message: string, details: {
16
+ systemPrompt: string;
17
+ userContent: string;
18
+ lastModel: string;
19
+ lastError: unknown;
20
+ /** HTTP response body text when the model returned content but parsing failed. */
21
+ lastRawAssistantContent?: string;
22
+ });
23
+ }
24
+ export interface OpenRouterClientOptions {
25
+ config: Pick<I18nConfig, "openrouter" | "sourceLocale" | "localeDisplayNames">;
26
+ apiKey?: string;
27
+ /**
28
+ * When set and non-empty, use this ordered model list instead of resolving from `config.openrouter`
29
+ * (e.g. UI translation with `ui.preferredModel` prepended to the global list).
30
+ */
31
+ translationModels?: string[];
32
+ /** Append request/response JSON when set. */
33
+ debugTrafficFilePath?: string | null;
34
+ logger?: Logger;
35
+ httpReferer?: string;
36
+ xTitle?: string;
37
+ }
38
+ /**
39
+ * OpenRouter chat client with ordered `translationModels` fallback chain.
40
+ */
41
+ export declare class OpenRouterClient {
42
+ private readonly apiKey;
43
+ private readonly baseUrl;
44
+ private readonly modelsToTry;
45
+ private readonly maxTokens;
46
+ private readonly temperature;
47
+ private readonly debugTrafficFilePath;
48
+ private readonly logger?;
49
+ private readonly localeDisplayNames;
50
+ private readonly sourceLanguageLabel;
51
+ private readonly httpReferer;
52
+ private readonly xTitle;
53
+ constructor(opts: OpenRouterClientOptions);
54
+ getConfiguredModels(): readonly string[];
55
+ /**
56
+ * BCP-47 locale id plus English display name for LLM prompts (e.g. `pt-BR: Brazilian Portuguese`).
57
+ * Uses a colon so it reads as a clear key–value / label field (common in prompt instructions);
58
+ * it does not clash with hyphens inside tags (`zh-CN`, `pt-BR`) the way a bare `-` can.
59
+ * Order: `localeDisplayNames` from config, else `englishLanguageNameForLocale` (Intl), else raw code.
60
+ */
61
+ private languageLabelForPrompt;
62
+ private appendDebugLog;
63
+ private handleRateLimit;
64
+ /** Match doc-translate log lines: two-space indent, locale, filename. */
65
+ private warnModelSwitch;
66
+ private extractUsage;
67
+ private toOpenRouterMessages;
68
+ /** Single HTTP call for one model (with one 429 retry). */
69
+ private fetchCompletion;
70
+ chat(messages: Array<{
71
+ role: "system" | "user" | "assistant";
72
+ content: string;
73
+ }>, options?: {
74
+ startModelIndex?: number;
75
+ docLogContext?: {
76
+ locale: string;
77
+ relativePath: string;
78
+ };
79
+ }): Promise<ChatResponse>;
80
+ stripTranslateTags(content: string): string;
81
+ translateDocumentSegment(content: string, targetLocale: string, glossaryHints: string[], options?: {
82
+ startModelIndex?: number;
83
+ contentType?: DocumentPromptContentType;
84
+ docLogContext?: {
85
+ locale: string;
86
+ relativePath: string;
87
+ };
88
+ }): Promise<TranslationResult>;
89
+ translateDocumentBatch(segments: Segment[], locale: string, glossaryHints?: string[], options?: {
90
+ startModelIndex?: number;
91
+ contentType?: DocumentPromptContentType;
92
+ responseFormat?: DocumentBatchResponseFormat;
93
+ /** When set, log model fallback warnings (translate-docs style). */
94
+ docLogContext?: {
95
+ relativePath: string;
96
+ };
97
+ }): Promise<BatchTranslationResult>;
98
+ /**
99
+ * UI strings: translate a batch of strings and return a JSON array response, with model fallback chain.
100
+ */
101
+ translateUIBatch(texts: string[], targetLocale: string, options?: {
102
+ startModelIndex?: number;
103
+ glossaryHints?: string[];
104
+ }): Promise<{
105
+ translations: string[];
106
+ model: string;
107
+ usage: {
108
+ inputTokens: number;
109
+ outputTokens: number;
110
+ totalTokens: number;
111
+ };
112
+ cost?: number;
113
+ }>;
114
+ }
115
+ //# sourceMappingURL=openrouter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter.d.ts","sourceRoot":"","sources":["../../src/api/openrouter.ts"],"names":[],"mappings":"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"}