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.
- package/LICENSE +21 -0
- package/README.md +157 -0
- package/dist/api/openrouter.d.ts +115 -0
- package/dist/api/openrouter.d.ts.map +1 -0
- package/dist/api/openrouter.js +399 -0
- package/dist/api/openrouter.js.map +1 -0
- package/dist/cli/doc-translate.d.ts +90 -0
- package/dist/cli/doc-translate.d.ts.map +1 -0
- package/dist/cli/doc-translate.js +1153 -0
- package/dist/cli/doc-translate.js.map +1 -0
- package/dist/cli/export-ui-xliff.d.ts +32 -0
- package/dist/cli/export-ui-xliff.d.ts.map +1 -0
- package/dist/cli/export-ui-xliff.js +153 -0
- package/dist/cli/export-ui-xliff.js.map +1 -0
- package/dist/cli/extract-strings.d.ts +12 -0
- package/dist/cli/extract-strings.d.ts.map +1 -0
- package/dist/cli/extract-strings.js +80 -0
- package/dist/cli/extract-strings.js.map +1 -0
- package/dist/cli/file-utils.d.ts +10 -0
- package/dist/cli/file-utils.d.ts.map +1 -0
- package/dist/cli/file-utils.js +77 -0
- package/dist/cli/file-utils.js.map +1 -0
- package/dist/cli/format.d.ts +21 -0
- package/dist/cli/format.d.ts.map +1 -0
- package/dist/cli/format.js +75 -0
- package/dist/cli/format.js.map +1 -0
- package/dist/cli/helpers.d.ts +27 -0
- package/dist/cli/helpers.d.ts.map +1 -0
- package/dist/cli/helpers.js +84 -0
- package/dist/cli/helpers.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +772 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/log-output.d.ts +13 -0
- package/dist/cli/log-output.d.ts.map +1 -0
- package/dist/cli/log-output.js +75 -0
- package/dist/cli/log-output.js.map +1 -0
- package/dist/cli/translate-svg.d.ts +7 -0
- package/dist/cli/translate-svg.d.ts.map +1 -0
- package/dist/cli/translate-svg.js +167 -0
- package/dist/cli/translate-svg.js.map +1 -0
- package/dist/cli/translate-ui-strings.d.ts +27 -0
- package/dist/cli/translate-ui-strings.d.ts.map +1 -0
- package/dist/cli/translate-ui-strings.js +357 -0
- package/dist/cli/translate-ui-strings.js.map +1 -0
- package/dist/core/cache-tracking-keys.d.ts +12 -0
- package/dist/core/cache-tracking-keys.d.ts.map +1 -0
- package/dist/core/cache-tracking-keys.js +20 -0
- package/dist/core/cache-tracking-keys.js.map +1 -0
- package/dist/core/cache.d.ts +153 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +546 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/config.d.ts +58 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +392 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/doc-file-tracking.d.ts +8 -0
- package/dist/core/doc-file-tracking.d.ts.map +1 -0
- package/dist/core/doc-file-tracking.js +27 -0
- package/dist/core/doc-file-tracking.js.map +1 -0
- package/dist/core/errors.d.ts +19 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +23 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/locale-utils.d.ts +20 -0
- package/dist/core/locale-utils.d.ts.map +1 -0
- package/dist/core/locale-utils.js +75 -0
- package/dist/core/locale-utils.js.map +1 -0
- package/dist/core/output-paths.d.ts +22 -0
- package/dist/core/output-paths.d.ts.map +1 -0
- package/dist/core/output-paths.js +130 -0
- package/dist/core/output-paths.js.map +1 -0
- package/dist/core/prompt-builder.d.ts +62 -0
- package/dist/core/prompt-builder.d.ts.map +1 -0
- package/dist/core/prompt-builder.js +232 -0
- package/dist/core/prompt-builder.js.map +1 -0
- package/dist/core/prompts.d.ts +27 -0
- package/dist/core/prompts.d.ts.map +1 -0
- package/dist/core/prompts.js +57 -0
- package/dist/core/prompts.js.map +1 -0
- package/dist/core/svg-asset-paths.d.ts +40 -0
- package/dist/core/svg-asset-paths.d.ts.map +1 -0
- package/dist/core/svg-asset-paths.js +107 -0
- package/dist/core/svg-asset-paths.js.map +1 -0
- package/dist/core/types.d.ts +388 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +265 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/ui-languages.d.ts +66 -0
- package/dist/core/ui-languages.d.ts.map +1 -0
- package/dist/core/ui-languages.js +277 -0
- package/dist/core/ui-languages.js.map +1 -0
- package/dist/core/user-edited-model.d.ts +3 -0
- package/dist/core/user-edited-model.d.ts.map +1 -0
- package/dist/core/user-edited-model.js +3 -0
- package/dist/core/user-edited-model.js.map +1 -0
- package/dist/edit-cache-app/app.js +1326 -0
- package/dist/edit-cache-app/index.html +287 -0
- package/dist/edit-cache-app/styles.css +664 -0
- package/dist/extractors/base-extractor.d.ts +15 -0
- package/dist/extractors/base-extractor.d.ts.map +1 -0
- package/dist/extractors/base-extractor.js +23 -0
- package/dist/extractors/base-extractor.js.map +1 -0
- package/dist/extractors/classify-segment.d.ts +6 -0
- package/dist/extractors/classify-segment.d.ts.map +1 -0
- package/dist/extractors/classify-segment.js +20 -0
- package/dist/extractors/classify-segment.js.map +1 -0
- package/dist/extractors/json-extractor.d.ts +16 -0
- package/dist/extractors/json-extractor.d.ts.map +1 -0
- package/dist/extractors/json-extractor.js +128 -0
- package/dist/extractors/json-extractor.js.map +1 -0
- package/dist/extractors/markdown-extractor.d.ts +15 -0
- package/dist/extractors/markdown-extractor.d.ts.map +1 -0
- package/dist/extractors/markdown-extractor.js +205 -0
- package/dist/extractors/markdown-extractor.js.map +1 -0
- package/dist/extractors/svg-extractor.d.ts +19 -0
- package/dist/extractors/svg-extractor.d.ts.map +1 -0
- package/dist/extractors/svg-extractor.js +132 -0
- package/dist/extractors/svg-extractor.js.map +1 -0
- package/dist/extractors/ui-string-extractor.d.ts +40 -0
- package/dist/extractors/ui-string-extractor.d.ts.map +1 -0
- package/dist/extractors/ui-string-extractor.js +146 -0
- package/dist/extractors/ui-string-extractor.js.map +1 -0
- package/dist/extractors/ui-string-locations.d.ts +23 -0
- package/dist/extractors/ui-string-locations.d.ts.map +1 -0
- package/dist/extractors/ui-string-locations.js +138 -0
- package/dist/extractors/ui-string-locations.js.map +1 -0
- package/dist/glossary/glossary.d.ts +34 -0
- package/dist/glossary/glossary.d.ts.map +1 -0
- package/dist/glossary/glossary.js +260 -0
- package/dist/glossary/glossary.js.map +1 -0
- package/dist/glossary/matcher.d.ts +10 -0
- package/dist/glossary/matcher.d.ts.map +1 -0
- package/dist/glossary/matcher.js +12 -0
- package/dist/glossary/matcher.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/processors/admonition-placeholders.d.ts +8 -0
- package/dist/processors/admonition-placeholders.d.ts.map +1 -0
- package/dist/processors/admonition-placeholders.js +59 -0
- package/dist/processors/admonition-placeholders.js.map +1 -0
- package/dist/processors/anchor-placeholders.d.ts +8 -0
- package/dist/processors/anchor-placeholders.d.ts.map +1 -0
- package/dist/processors/anchor-placeholders.js +37 -0
- package/dist/processors/anchor-placeholders.js.map +1 -0
- package/dist/processors/batch-processor.d.ts +10 -0
- package/dist/processors/batch-processor.d.ts.map +1 -0
- package/dist/processors/batch-processor.js +33 -0
- package/dist/processors/batch-processor.js.map +1 -0
- package/dist/processors/bold-code-placeholders.d.ts +14 -0
- package/dist/processors/bold-code-placeholders.d.ts.map +1 -0
- package/dist/processors/bold-code-placeholders.js +116 -0
- package/dist/processors/bold-code-placeholders.js.map +1 -0
- package/dist/processors/doc-postprocess.d.ts +51 -0
- package/dist/processors/doc-postprocess.d.ts.map +1 -0
- package/dist/processors/doc-postprocess.js +215 -0
- package/dist/processors/doc-postprocess.js.map +1 -0
- package/dist/processors/emphasis-placeholders.d.ts +6 -0
- package/dist/processors/emphasis-placeholders.d.ts.map +1 -0
- package/dist/processors/emphasis-placeholders.js +262 -0
- package/dist/processors/emphasis-placeholders.js.map +1 -0
- package/dist/processors/flat-link-rewrite.d.ts +32 -0
- package/dist/processors/flat-link-rewrite.d.ts.map +1 -0
- package/dist/processors/flat-link-rewrite.js +90 -0
- package/dist/processors/flat-link-rewrite.js.map +1 -0
- package/dist/processors/glossary-force-placeholders.d.ts +12 -0
- package/dist/processors/glossary-force-placeholders.d.ts.map +1 -0
- package/dist/processors/glossary-force-placeholders.js +58 -0
- package/dist/processors/glossary-force-placeholders.js.map +1 -0
- package/dist/processors/inline-code-placeholders.d.ts +11 -0
- package/dist/processors/inline-code-placeholders.d.ts.map +1 -0
- package/dist/processors/inline-code-placeholders.js +87 -0
- package/dist/processors/inline-code-placeholders.js.map +1 -0
- package/dist/processors/placeholder-handler.d.ts +38 -0
- package/dist/processors/placeholder-handler.d.ts.map +1 -0
- package/dist/processors/placeholder-handler.js +55 -0
- package/dist/processors/placeholder-handler.js.map +1 -0
- package/dist/processors/translation-placeholder-leaks.d.ts +2 -0
- package/dist/processors/translation-placeholder-leaks.d.ts.map +1 -0
- package/dist/processors/translation-placeholder-leaks.js +9 -0
- package/dist/processors/translation-placeholder-leaks.js.map +1 -0
- package/dist/processors/url-placeholders.d.ts +10 -0
- package/dist/processors/url-placeholders.d.ts.map +1 -0
- package/dist/processors/url-placeholders.js +29 -0
- package/dist/processors/url-placeholders.js.map +1 -0
- package/dist/processors/validator.d.ts +23 -0
- package/dist/processors/validator.d.ts.map +1 -0
- package/dist/processors/validator.js +186 -0
- package/dist/processors/validator.js.map +1 -0
- package/dist/runtime/i18next-helpers.d.ts +146 -0
- package/dist/runtime/i18next-helpers.d.ts.map +1 -0
- package/dist/runtime/i18next-helpers.js +192 -0
- package/dist/runtime/i18next-helpers.js.map +1 -0
- package/dist/runtime/index.d.ts +4 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +4 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/template.d.ts +21 -0
- package/dist/runtime/template.d.ts.map +1 -0
- package/dist/runtime/template.js +28 -0
- package/dist/runtime/template.js.map +1 -0
- package/dist/runtime/ui-language-display.d.ts +16 -0
- package/dist/runtime/ui-language-display.d.ts.map +1 -0
- package/dist/runtime/ui-language-display.js +26 -0
- package/dist/runtime/ui-language-display.js.map +1 -0
- package/dist/server/translation-editor.d.ts +25 -0
- package/dist/server/translation-editor.d.ts.map +1 -0
- package/dist/server/translation-editor.js +583 -0
- package/dist/server/translation-editor.js.map +1 -0
- package/dist/utils/concurrency.d.ts +31 -0
- package/dist/utils/concurrency.d.ts.map +1 -0
- package/dist/utils/concurrency.js +103 -0
- package/dist/utils/concurrency.js.map +1 -0
- package/dist/utils/hash.d.ts +5 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +9 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/ignore-parser.d.ts +7 -0
- package/dist/utils/ignore-parser.d.ts.map +1 -0
- package/dist/utils/ignore-parser.js +26 -0
- package/dist/utils/ignore-parser.js.map +1 -0
- package/dist/utils/logger.d.ts +45 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +158 -0
- package/dist/utils/logger.js.map +1 -0
- package/docs/GETTING_STARTED.md +697 -0
- package/docs/PACKAGE_OVERVIEW.md +427 -0
- package/docs/ai-i18n-tools-context.md +481 -0
- package/package.json +117 -0
- package/translated-docs/README.de.md +157 -0
- package/translated-docs/README.es.md +157 -0
- package/translated-docs/README.fr.md +157 -0
- package/translated-docs/README.hi.md +157 -0
- package/translated-docs/README.ja.md +157 -0
- package/translated-docs/README.ko.md +157 -0
- package/translated-docs/README.pt-BR.md +157 -0
- package/translated-docs/README.zh-CN.md +157 -0
- package/translated-docs/README.zh-TW.md +157 -0
- package/translated-docs/docs/GETTING_STARTED.de.md +682 -0
- package/translated-docs/docs/GETTING_STARTED.es.md +682 -0
- package/translated-docs/docs/GETTING_STARTED.fr.md +682 -0
- package/translated-docs/docs/GETTING_STARTED.hi.md +682 -0
- package/translated-docs/docs/GETTING_STARTED.ja.md +682 -0
- package/translated-docs/docs/GETTING_STARTED.ko.md +682 -0
- package/translated-docs/docs/GETTING_STARTED.pt-BR.md +682 -0
- package/translated-docs/docs/GETTING_STARTED.zh-CN.md +682 -0
- package/translated-docs/docs/GETTING_STARTED.zh-TW.md +682 -0
- package/translated-docs/docs/PACKAGE_OVERVIEW.de.md +428 -0
- package/translated-docs/docs/PACKAGE_OVERVIEW.es.md +428 -0
- package/translated-docs/docs/PACKAGE_OVERVIEW.fr.md +428 -0
- package/translated-docs/docs/PACKAGE_OVERVIEW.hi.md +428 -0
- package/translated-docs/docs/PACKAGE_OVERVIEW.ja.md +428 -0
- package/translated-docs/docs/PACKAGE_OVERVIEW.ko.md +428 -0
- package/translated-docs/docs/PACKAGE_OVERVIEW.pt-BR.md +428 -0
- package/translated-docs/docs/PACKAGE_OVERVIEW.zh-CN.md +428 -0
- 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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"}
|