ai-i18n-tools 1.4.4 → 1.5.1
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/README.md +122 -118
- package/dist/build-info.generated.d.ts +1 -1
- package/dist/build-info.generated.js +1 -1
- package/dist/cli/check-markdown.js +3 -3
- package/dist/cli/check-markdown.js.map +1 -1
- package/dist/cli/doc-translate.d.ts +54 -8
- package/dist/cli/doc-translate.d.ts.map +1 -1
- package/dist/cli/doc-translate.js +378 -41
- package/dist/cli/doc-translate.js.map +1 -1
- package/dist/cli/extract-strings.d.ts.map +1 -1
- package/dist/cli/extract-strings.js +12 -10
- package/dist/cli/extract-strings.js.map +1 -1
- package/dist/cli/index.js +231 -88
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/lint-source.js +3 -3
- package/dist/cli/lint-source.js.map +1 -1
- package/dist/cli/translate-json-run.d.ts +11 -0
- package/dist/cli/translate-json-run.d.ts.map +1 -0
- package/dist/cli/translate-json-run.js +164 -0
- package/dist/cli/translate-json-run.js.map +1 -0
- package/dist/cli/translate-ui-strings.d.ts.map +1 -1
- package/dist/cli/translate-ui-strings.js +2 -6
- package/dist/cli/translate-ui-strings.js.map +1 -1
- package/dist/cli/write-heading-ids.d.ts +1 -1
- package/dist/cli/write-heading-ids.d.ts.map +1 -1
- package/dist/cli/write-heading-ids.js +2 -2
- package/dist/cli/write-heading-ids.js.map +1 -1
- package/dist/core/config-migrate.d.ts +22 -0
- package/dist/core/config-migrate.d.ts.map +1 -0
- package/dist/core/config-migrate.js +168 -0
- package/dist/core/config-migrate.js.map +1 -0
- package/dist/core/config.d.ts +8 -4
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +181 -45
- package/dist/core/config.js.map +1 -1
- package/dist/core/doc-file-tracking.d.ts +1 -4
- package/dist/core/doc-file-tracking.d.ts.map +1 -1
- package/dist/core/doc-file-tracking.js +14 -7
- package/dist/core/doc-file-tracking.js.map +1 -1
- package/dist/core/docs-output-normalize.d.ts +14 -0
- package/dist/core/docs-output-normalize.d.ts.map +1 -0
- package/dist/core/docs-output-normalize.js +57 -0
- package/dist/core/docs-output-normalize.js.map +1 -0
- package/dist/core/locale-utils.d.ts +6 -0
- package/dist/core/locale-utils.d.ts.map +1 -1
- package/dist/core/locale-utils.js +8 -0
- package/dist/core/locale-utils.js.map +1 -1
- package/dist/core/markdown-emphasis-defaults.d.ts +6 -6
- package/dist/core/markdown-emphasis-defaults.d.ts.map +1 -1
- package/dist/core/markdown-emphasis-defaults.js +12 -12
- package/dist/core/markdown-emphasis-defaults.js.map +1 -1
- package/dist/core/output-paths.d.ts +2 -2
- package/dist/core/output-paths.d.ts.map +1 -1
- package/dist/core/output-paths.js +43 -19
- package/dist/core/output-paths.js.map +1 -1
- package/dist/core/project-stats.d.ts.map +1 -1
- package/dist/core/project-stats.js +2 -2
- package/dist/core/project-stats.js.map +1 -1
- package/dist/core/resolve-content-paths.d.ts +12 -0
- package/dist/core/resolve-content-paths.d.ts.map +1 -0
- package/dist/core/resolve-content-paths.js +122 -0
- package/dist/core/resolve-content-paths.js.map +1 -0
- package/dist/core/svg-asset-paths.d.ts +2 -2
- package/dist/core/svg-asset-paths.d.ts.map +1 -1
- package/dist/core/svg-asset-paths.js +10 -6
- package/dist/core/svg-asset-paths.js.map +1 -1
- package/dist/core/types.d.ts +248 -31
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +119 -28
- package/dist/core/types.js.map +1 -1
- package/dist/core/ui-extractor-config.d.ts +6 -0
- package/dist/core/ui-extractor-config.d.ts.map +1 -0
- package/dist/core/ui-extractor-config.js +7 -0
- package/dist/core/ui-extractor-config.js.map +1 -0
- package/dist/core/ui-languages.d.ts +6 -1
- package/dist/core/ui-languages.d.ts.map +1 -1
- package/dist/core/ui-languages.js +58 -4
- package/dist/core/ui-languages.js.map +1 -1
- package/dist/core/user-edited-model.d.ts +1 -1
- package/dist/core/user-edited-model.d.ts.map +1 -1
- package/dist/core/user-edited-model.js +1 -1
- package/dist/core/user-edited-model.js.map +1 -1
- package/dist/{edit-cache-app → dashboard-app}/app.js +22 -15
- package/dist/{edit-cache-app → dashboard-app}/index.html +15 -13
- package/dist/{edit-cache-app → dashboard-app}/styles.css +11 -11
- package/dist/extractors/astro-template-extractor.d.ts +39 -0
- package/dist/extractors/astro-template-extractor.d.ts.map +1 -0
- package/dist/extractors/astro-template-extractor.js +622 -0
- package/dist/extractors/astro-template-extractor.js.map +1 -0
- package/dist/extractors/frontmatter-fields.d.ts +25 -0
- package/dist/extractors/frontmatter-fields.d.ts.map +1 -0
- package/dist/extractors/frontmatter-fields.js +160 -0
- package/dist/extractors/frontmatter-fields.js.map +1 -0
- package/dist/extractors/markdown-extractor.d.ts +2 -0
- package/dist/extractors/markdown-extractor.d.ts.map +1 -1
- package/dist/extractors/markdown-extractor.js +61 -10
- package/dist/extractors/markdown-extractor.js.map +1 -1
- package/dist/extractors/nested-json-extractor.d.ts +15 -0
- package/dist/extractors/nested-json-extractor.d.ts.map +1 -0
- package/dist/extractors/nested-json-extractor.js +132 -0
- package/dist/extractors/nested-json-extractor.js.map +1 -0
- package/dist/extractors/ui-string-babel.d.ts +15 -0
- package/dist/extractors/ui-string-babel.d.ts.map +1 -1
- package/dist/extractors/ui-string-babel.js +135 -0
- package/dist/extractors/ui-string-babel.js.map +1 -1
- package/dist/extractors/ui-string-extractor.js +2 -2
- package/dist/extractors/ui-string-extractor.js.map +1 -1
- package/dist/extractors/ui-string-locations.js +2 -2
- package/dist/extractors/ui-string-locations.js.map +1 -1
- package/dist/glossary/glossary.d.ts.map +1 -1
- package/dist/glossary/glossary.js +3 -11
- package/dist/glossary/glossary.js.map +1 -1
- package/dist/glossary/parse-glossary-csv.d.ts +5 -0
- package/dist/glossary/parse-glossary-csv.d.ts.map +1 -0
- package/dist/glossary/parse-glossary-csv.js +21 -0
- package/dist/glossary/parse-glossary-csv.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/markdown/write-heading-ids-core.d.ts +3 -2
- package/dist/markdown/write-heading-ids-core.d.ts.map +1 -1
- package/dist/markdown/write-heading-ids-core.js +26 -12
- package/dist/markdown/write-heading-ids-core.js.map +1 -1
- package/dist/processors/doc-postprocess.d.ts.map +1 -1
- package/dist/processors/doc-postprocess.js +6 -6
- package/dist/processors/doc-postprocess.js.map +1 -1
- package/dist/processors/expression-attribute-protection.d.ts +24 -0
- package/dist/processors/expression-attribute-protection.d.ts.map +1 -0
- package/dist/processors/expression-attribute-protection.js +76 -0
- package/dist/processors/expression-attribute-protection.js.map +1 -0
- package/dist/processors/flat-link-rewrite.d.ts +16 -0
- package/dist/processors/flat-link-rewrite.d.ts.map +1 -1
- package/dist/processors/flat-link-rewrite.js +23 -0
- package/dist/processors/flat-link-rewrite.js.map +1 -1
- package/dist/processors/mdx-placeholders.d.ts +2 -7
- package/dist/processors/mdx-placeholders.d.ts.map +1 -1
- package/dist/processors/mdx-placeholders.js +15 -14
- package/dist/processors/mdx-placeholders.js.map +1 -1
- package/dist/processors/placeholder-handler.d.ts +2 -0
- package/dist/processors/placeholder-handler.d.ts.map +1 -1
- package/dist/processors/placeholder-handler.js +1 -1
- package/dist/processors/placeholder-handler.js.map +1 -1
- package/dist/processors/validator.d.ts +8 -0
- package/dist/processors/validator.d.ts.map +1 -1
- package/dist/processors/validator.js +69 -15
- package/dist/processors/validator.js.map +1 -1
- package/dist/server/{translation-editor.d.ts → translation-dashboard.d.ts} +8 -8
- package/dist/server/translation-dashboard.d.ts.map +1 -0
- package/dist/server/{translation-editor.js → translation-dashboard.js} +15 -15
- package/dist/server/translation-dashboard.js.map +1 -0
- package/docs/GETTING_STARTED.md +689 -253
- package/docs/LOCALE-ASSETS-GUIDE.md +671 -0
- package/docs/PACKAGE_OVERVIEW.md +59 -25
- package/docs/ai-i18n-tools-context.md +143 -18
- package/docs/translation-dashboard.png +0 -0
- package/package.json +17 -31
- package/dist/server/translation-editor.d.ts.map +0 -1
- package/dist/server/translation-editor.js.map +0 -1
- package/docs/translation-cache-editor.png +0 -0
- package/translated-docs/README.de.md +0 -261
- package/translated-docs/README.es.md +0 -261
- package/translated-docs/README.fr.md +0 -261
- package/translated-docs/README.hi.md +0 -261
- package/translated-docs/README.ja.md +0 -261
- package/translated-docs/README.ko.md +0 -261
- package/translated-docs/README.pt-BR.md +0 -261
- package/translated-docs/README.zh-CN.md +0 -261
- package/translated-docs/README.zh-TW.md +0 -261
- package/translated-docs/docs/GETTING_STARTED.de.md +0 -1269
- package/translated-docs/docs/GETTING_STARTED.es.md +0 -1269
- package/translated-docs/docs/GETTING_STARTED.fr.md +0 -1269
- package/translated-docs/docs/GETTING_STARTED.hi.md +0 -1269
- package/translated-docs/docs/GETTING_STARTED.ja.md +0 -1269
- package/translated-docs/docs/GETTING_STARTED.ko.md +0 -1269
- package/translated-docs/docs/GETTING_STARTED.pt-BR.md +0 -1269
- package/translated-docs/docs/GETTING_STARTED.zh-CN.md +0 -1269
- package/translated-docs/docs/GETTING_STARTED.zh-TW.md +0 -1269
- package/translated-docs/docs/PACKAGE_OVERVIEW.de.md +0 -495
- package/translated-docs/docs/PACKAGE_OVERVIEW.es.md +0 -495
- package/translated-docs/docs/PACKAGE_OVERVIEW.fr.md +0 -495
- package/translated-docs/docs/PACKAGE_OVERVIEW.hi.md +0 -495
- package/translated-docs/docs/PACKAGE_OVERVIEW.ja.md +0 -495
- package/translated-docs/docs/PACKAGE_OVERVIEW.ko.md +0 -495
- package/translated-docs/docs/PACKAGE_OVERVIEW.pt-BR.md +0 -495
- package/translated-docs/docs/PACKAGE_OVERVIEW.zh-CN.md +0 -495
- package/translated-docs/docs/PACKAGE_OVERVIEW.zh-TW.md +0 -495
package/README.md
CHANGED
|
@@ -7,24 +7,38 @@
|
|
|
7
7
|
[](./LICENSE)
|
|
8
8
|
[](https://github.com/wsj-br/ai-i18n-tools/actions/workflows/ci.yml)
|
|
9
9
|
|
|
10
|
-
CLI and toolkit for internationalizing JavaScript/TypeScript applications and documentation sites
|
|
10
|
+
A CLI and toolkit for internationalizing JavaScript/TypeScript applications and documentation sites using large language models via [OpenRouter](https://openrouter.ai/). Three modular workflows, all sharing a single config file, support different translation needs:
|
|
11
11
|
|
|
12
|
+
- **Workflow 1 — UI Translation:** Extracts `t("…")` calls from JS/TS (and optionally from `.astro` files) and generates flat, per-locale JSON for i18next or static SSG lookup.
|
|
13
|
+
- **Workflow 2 — Document Translation:** Translates markdown, MDX, and `.astro` pages (for websites and Starlight) listed in `docs[].contentPaths` using `translate-docs`.
|
|
14
|
+
- **Workflow 3 — JSON File Translation:** Translates arbitrary nested JSON bundles defined in `json[]`. Use `translate-json` when UI copy is stored in per-locale JSON files instead of using `t()` in source.
|
|
15
|
+
|
|
16
|
+
**SVG** assets are translated using `features.translateSVG`, the top-level `svg` block, and `translate-svg`—not `docs[].contentPaths`.
|
|
17
|
+
|
|
18
|
+
**Which workflow should I use?**
|
|
19
|
+
- Source uses `t()` → **Workflow 1** (`extract` / `translate-ui`)
|
|
20
|
+
- Localized pages or Docusaurus catalog JSON → **Workflow 2** (`translate-docs`)
|
|
21
|
+
- Only standalone, nested JSON locale files → **Workflow 3** (`translate-json`)
|
|
22
|
+
|
|
23
|
+
All workflows maintain a file/SQLite cache to ensure that only new or changed segments (strings or text chunks) are sent to the LLM.
|
|
12
24
|
|
|
13
25
|
<small>**Read in other languages:** </small>
|
|
14
26
|
<small id="lang-list">[English (GB)](./README.md) · [Deutsch](./translated-docs/README.de.md) · [Español](./translated-docs/README.es.md) · [Français](./translated-docs/README.fr.md) · [हिन्दी](./translated-docs/README.hi.md) · [日本語](./translated-docs/README.ja.md) · [한국어](./translated-docs/README.ko.md) · [Português (Brasil)](./translated-docs/README.pt-BR.md) · [中文 (中国大陆)](./translated-docs/README.zh-CN.md) · [中文 (台灣)](./translated-docs/README.zh-TW.md)</small>
|
|
15
27
|
|
|
28
|
+
|
|
16
29
|
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
|
|
17
30
|
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
|
18
31
|
**Table of Contents**
|
|
19
32
|
|
|
20
|
-
- [
|
|
33
|
+
- [Core workflows](#core-workflows)
|
|
21
34
|
- [Installation](#installation)
|
|
22
35
|
- [Using the CLI](#using-the-cli)
|
|
23
36
|
- [OpenRouter](#openrouter)
|
|
24
37
|
- [Quick start](#quick-start)
|
|
25
|
-
- [Workflow 1 - UI
|
|
26
|
-
- [Workflow 2 -
|
|
27
|
-
- [
|
|
38
|
+
- [Workflow 1 - UI Translation](#workflow-1---ui-translation)
|
|
39
|
+
- [Workflow 2 - Document Translation](#workflow-2---document-translation)
|
|
40
|
+
- [Astro (plain Astro & Starlight)](#astro-plain-astro--starlight)
|
|
41
|
+
- [Combined workflow](#combined-workflow)
|
|
28
42
|
- [Runtime helpers](#runtime-helpers)
|
|
29
43
|
- [CLI commands](#cli-commands)
|
|
30
44
|
- [Documentation](#documentation)
|
|
@@ -36,25 +50,29 @@ CLI and toolkit for internationalizing JavaScript/TypeScript applications and do
|
|
|
36
50
|
|
|
37
51
|
|
|
38
52
|
|
|
39
|
-
<a id="
|
|
40
|
-
##
|
|
53
|
+
<a id="core-workflows"></a>
|
|
54
|
+
## Core workflows
|
|
41
55
|
|
|
42
|
-
**Workflow 1 - UI Translation** (React, Next.js, Node.js,
|
|
56
|
+
**Workflow 1 - UI Translation** — for any JS/TS project using i18next (React, Next.js, Node.js, CLIs) or static Astro SSG
|
|
43
57
|
|
|
44
|
-
|
|
58
|
+
Scans source files for `t("…")` / `i18n.t("…")` literals (add `.astro` to `ui.uiExtractor.extensions` for Astro frontmatter and template expressions), builds a master catalog (`strings.json`), translates missing entries per locale via OpenRouter, and writes flat JSON files (`de.json`, `pt-BR.json`, …). English source text is the runtime lookup key in those bundles — `strings.json` is the extraction cache, not the runtime bundle.
|
|
45
59
|
|
|
46
|
-
**Workflow 2 - Document
|
|
60
|
+
**Workflow 2 - Document Translation** — for markdown, MDX, and `.astro` under `docs[].contentPaths`
|
|
47
61
|
|
|
48
|
-
|
|
62
|
+
Designed primarily for **markdown, MDX, and `.astro` documentation** (Docusaurus, [Astro Starlight](https://starlight.astro.build/), plain README files, and plain Astro marketing pages). `translate-docs` writes localised copies with a shared SQLite cache. On Docusaurus sites, set `docs[].docusaurusCatalogDir` to the `write-translations` catalog folder so shell JSON (navbar, footer, theme strings) is translated in the same command. `docs[].docsOutput.style` supports `"nested"`, `"flat"`, `"doc-system"`, and aliases `"docusaurus"` / `"astro-starlight"` (see [Output layouts](docs/GETTING_STARTED.md#output-layouts) in Getting Started). Arbitrary nested UI JSON that is not a Docusaurus catalog belongs in Workflow 3 (`json[]` / `translate-json`), not `docs[]`.
|
|
49
63
|
|
|
50
|
-
|
|
64
|
+
**Workflow 3 - JSON file translation** — nested locale JSON without `t()` in source
|
|
65
|
+
|
|
66
|
+
Translate files such as `src/i18n/en/translation.json` via top-level `json[]`, `features.translateJson`, and `translate-json`. Scaffold with `init -t ui-json-bundles`.
|
|
67
|
+
|
|
68
|
+
All workflows share `ai-i18n-tools.config.json` and can be combined; `sync` runs extract, UI translation, translate SVG, `translate-docs`, and `translate-json` in order according to your `features` flags.
|
|
51
69
|
|
|
52
70
|
---
|
|
53
71
|
|
|
54
72
|
<a id="installation"></a>
|
|
55
73
|
## Installation
|
|
56
74
|
|
|
57
|
-
The published package is **ESM-only** (`"type": "module"`).
|
|
75
|
+
The published package is **ESM-only** (`"type": "module"`). Node.js `>=22.16.0` required.
|
|
58
76
|
|
|
59
77
|
```bash
|
|
60
78
|
npm install ai-i18n-tools
|
|
@@ -65,7 +83,7 @@ pnpm add ai-i18n-tools
|
|
|
65
83
|
<a id="using-the-cli"></a>
|
|
66
84
|
### Using the CLI
|
|
67
85
|
|
|
68
|
-
**Per-project (recommended)** — install as a dependency
|
|
86
|
+
**Per-project (recommended)** — install as a dev dependency, then run via `npx`, `pnpm exec`, or a `package.json` script:
|
|
69
87
|
|
|
70
88
|
```bash
|
|
71
89
|
pnpm add -D ai-i18n-tools # or: npm i -D ai-i18n-tools
|
|
@@ -74,32 +92,22 @@ npx ai-i18n-tools sync # or: pnpm exec ai-i18n-tools sync
|
|
|
74
92
|
|
|
75
93
|
```json
|
|
76
94
|
"scripts": {
|
|
95
|
+
"i18n:extract": "ai-i18n-tools extract",
|
|
77
96
|
"i18n:sync": "ai-i18n-tools sync",
|
|
97
|
+
"i18n:translate:ui": "ai-i18n-tools translate-ui",
|
|
98
|
+
"i18n:translate:docs": "ai-i18n-tools translate-docs",
|
|
78
99
|
"i18n:translate": "ai-i18n-tools translate-docs"
|
|
79
100
|
}
|
|
80
101
|
```
|
|
81
102
|
|
|
82
|
-
|
|
103
|
+
You can also use the ai-i18n-tools CLI commands directly, for instance `ai-i18n-tools sync`.
|
|
83
104
|
|
|
84
|
-
**Bare** `ai-i18n-tools` **in the terminal:** `package.json` scripts already run with `node_modules/.bin` on `PATH`, so commands like `pnpm run i18n:sync` invoke the CLI without typing `npx`. To run `ai-i18n-tools` directly in an interactive shell (from the project root, after a local install), prepend the local bin directory to `PATH`:
|
|
85
105
|
|
|
86
|
-
|
|
87
|
-
# bash/zsh — project root
|
|
88
|
-
export PATH="$PWD/node_modules/.bin:$PATH"
|
|
89
|
-
ai-i18n-tools sync
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
```powershell
|
|
93
|
-
# Windows PowerShell — project root
|
|
94
|
-
$env:Path = "$PWD\node_modules\.bin;$env:Path"
|
|
95
|
-
ai-i18n-tools sync
|
|
96
|
-
```
|
|
106
|
+
Prefer `sync` over hand-chaining `extract`, `translate-ui`, `translate-svg`, `translate-docs`, and `translate-json` — order and feature flags are easy to get wrong when run manually. See [Recommended `package.json` scripts](docs/GETTING_STARTED.md#recommended-packagejson-scripts) in Getting Started.
|
|
97
107
|
|
|
98
|
-
|
|
108
|
+
**Zero-install one-off** — `npx ai-i18n-tools <cmd>` or `pnpm dlx ai-i18n-tools <cmd>` (downloads for that invocation only).
|
|
99
109
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
On Linux, macOS, and WSL, registry installs set the executable bit on the CLI script automatically. On Windows, package managers generate `.cmd` and `.ps1` shims that invoke Node explicitly.
|
|
110
|
+
> **Tip:** To run `ai-i18n-tools` bare in an interactive shell without `npx`, add `node_modules/.bin` to your `PATH` (bash/zsh: `export PATH="$PWD/node_modules/.bin:$PATH"`). See [Getting Started](docs/GETTING_STARTED.md#installation) for direnv and Windows instructions.
|
|
103
111
|
|
|
104
112
|
Set your OpenRouter API key:
|
|
105
113
|
|
|
@@ -112,7 +120,7 @@ export OPENROUTER_API_KEY=sk-or-v1-your-key-here
|
|
|
112
120
|
<a id="openrouter"></a>
|
|
113
121
|
## OpenRouter
|
|
114
122
|
|
|
115
|
-
Commands that call OpenRouter (`translate-ui`, `translate-docs`, `sync`, `check-models`, and related scripts) need `OPENROUTER_API_KEY` in the environment. `check-markdown` does not use OpenRouter.
|
|
123
|
+
Commands that call OpenRouter (`translate-ui`, `translate-docs`, `translate-json`, `sync`, `check-models`, and related scripts) need `OPENROUTER_API_KEY` in the environment. `check-markdown` does not use OpenRouter.
|
|
116
124
|
|
|
117
125
|
In `ai-i18n-tools.config.json`, the `openrouter` object includes model lists, `baseUrl`, `maxTokens`, `temperature`, and `requestTimeoutMs`: the maximum time in milliseconds to wait for each HTTP request to OpenRouter (chat completions and internal `GET /models` calls). The default is `30000` (30 seconds).
|
|
118
126
|
|
|
@@ -123,70 +131,67 @@ Run `ai-i18n-tools check-models` to verify each configured model id against Open
|
|
|
123
131
|
<a id="quick-start"></a>
|
|
124
132
|
## Quick start
|
|
125
133
|
|
|
126
|
-
<a id="workflow-1---ui-
|
|
127
|
-
### Workflow 1 - UI
|
|
134
|
+
<a id="workflow-1---ui-translation"></a>
|
|
135
|
+
### Workflow 1 - UI Translation
|
|
128
136
|
|
|
129
137
|
```bash
|
|
130
|
-
# 1. Create config
|
|
138
|
+
# 1. Create config (default ui-markdown; plain Astro: init -t ui-astro-website)
|
|
131
139
|
npx ai-i18n-tools init
|
|
132
140
|
|
|
133
|
-
# 2. Extract UI strings to strings.json
|
|
141
|
+
# 2. Extract UI strings to strings.json
|
|
134
142
|
npx ai-i18n-tools extract
|
|
135
143
|
|
|
136
144
|
# 3. Translate to all target locales
|
|
137
145
|
npx ai-i18n-tools translate-ui
|
|
138
146
|
```
|
|
139
147
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
import { initReactI18next } from 'react-i18next';
|
|
145
|
-
import uiLanguages from './locales/ui-languages.json';
|
|
146
|
-
import stringsJson from './locales/strings.json';
|
|
147
|
-
// Plural flat: ./public/locales/{SOURCE_LOCALE}.json — must match config sourceLocale
|
|
148
|
-
import sourcePluralFlat from './public/locales/en-GB.json';
|
|
149
|
-
import aiI18n from 'ai-i18n-tools/runtime';
|
|
150
|
-
|
|
151
|
-
// Must match sourceLocale in ai-i18n-tools.config.json
|
|
152
|
-
export const SOURCE_LOCALE = 'en-GB';
|
|
153
|
-
|
|
154
|
-
void i18n.use(initReactI18next).init(aiI18n.defaultI18nInitOptions(SOURCE_LOCALE));
|
|
155
|
-
aiI18n.setupKeyAsDefaultT(i18n, {
|
|
156
|
-
stringsJson,
|
|
157
|
-
sourcePluralFlatBundle: { lng: SOURCE_LOCALE, bundle: sourcePluralFlat },
|
|
158
|
-
});
|
|
159
|
-
i18n.on('languageChanged', aiI18n.applyDirection);
|
|
160
|
-
aiI18n.applyDirection(i18n.language);
|
|
161
|
-
|
|
162
|
-
const localeLoaders = aiI18n.makeLocaleLoadersFromManifest(
|
|
163
|
-
uiLanguages,
|
|
164
|
-
SOURCE_LOCALE,
|
|
165
|
-
(code) => () => import(`./locales/${code}.json`),
|
|
166
|
-
);
|
|
167
|
-
export const loadLocale = aiI18n.makeLoadLocale(i18n, localeLoaders, SOURCE_LOCALE);
|
|
168
|
-
export default i18n;
|
|
169
|
-
```
|
|
148
|
+
Then wire i18next in your app using the helpers from `'ai-i18n-tools/runtime'`. See [Step 4: Wire i18next at runtime](docs/GETTING_STARTED.md#step-4-wire-i18next-at-runtime) in the Getting Started guide for the full setup.
|
|
149
|
+
|
|
150
|
+
<a id="workflow-2---document-translation"></a>
|
|
151
|
+
### Workflow 2 - Document Translation
|
|
170
152
|
|
|
171
|
-
|
|
172
|
-
### Workflow 2 - Documentation
|
|
153
|
+
The default `init` template (`ui-markdown`) enables UI extraction only. Use a docs-oriented template (or enable `features.translateDocs` and add `docs[]`) before `translate-docs`:
|
|
173
154
|
|
|
174
155
|
```bash
|
|
175
|
-
#
|
|
156
|
+
# Docusaurus docs + optional write-translations catalog
|
|
176
157
|
npx ai-i18n-tools init -t ui-docusaurus
|
|
177
158
|
|
|
178
|
-
#
|
|
179
|
-
npx ai-i18n-tools
|
|
159
|
+
# Astro Starlight documentation
|
|
160
|
+
# npx ai-i18n-tools init -t ui-starlight
|
|
161
|
+
|
|
162
|
+
# Plain Astro website — UI extraction for t() in .astro; add docs[] for page HTML (see Astro below)
|
|
163
|
+
# npx ai-i18n-tools init -t ui-astro-website
|
|
180
164
|
|
|
181
|
-
|
|
165
|
+
npx ai-i18n-tools translate-docs
|
|
182
166
|
npx ai-i18n-tools status
|
|
167
|
+
# npx ai-i18n-tools translate-docs --locale de # single locale
|
|
183
168
|
```
|
|
184
169
|
|
|
185
|
-
|
|
186
|
-
|
|
170
|
+
Edit `ai-i18n-tools.config.json`: set `docs[].contentPaths` to markdown, MDX, and/or `.astro` sources; `docs[].outputDir` and `docs[].docsOutput.style` (`"docusaurus"`, `"astro-starlight"`, `"flat"`, etc.). Full field reference: [Workflow 2 - Document Translation](docs/GETTING_STARTED.md#workflow-2---document-translation).
|
|
171
|
+
|
|
172
|
+
<a id="astro-plain-astro--starlight"></a>
|
|
173
|
+
### Astro (plain Astro & Starlight)
|
|
174
|
+
|
|
175
|
+
**Astro Starlight** — `init -t ui-starlight`, then `translate-docs`. Starlight UI overrides can use `src/content/i18n/en.json` with `jsonPathTemplate` in a separate `docs[]` block when needed ([Getting Started → Workflow 2](docs/GETTING_STARTED.md#step-1-initialise-for-documentation)).
|
|
176
|
+
|
|
177
|
+
**Plain Astro** (marketing or app sites, not Starlight) — combine [Astro built-in i18n routing](https://docs.astro.build/en/guides/internationalization/) with ai-i18n-tools. Reference project: [`examples/astro-website`](examples/astro-website/) (English at `/`, locales at `/{locale}/`).
|
|
178
|
+
|
|
179
|
+
Most teams use a **hybrid** of two pipelines:
|
|
180
|
+
|
|
181
|
+
| Pipeline | Use for | Commands | Output |
|
|
182
|
+
|----------|---------|----------|--------|
|
|
183
|
+
| **Page HTML** | Headings, paragraphs, nav labels, inline arrays in the template body | `translate-docs` | `src/pages/{locale}/index.astro` per locale |
|
|
184
|
+
| **UI strings (`t()`)** | Frontmatter data, tab labels, shared arrays | `extract` → `translate-ui` | `public/locales/{locale}.json` (English source as key) |
|
|
185
|
+
|
|
186
|
+
Scaffold UI with `init -t ui-astro-website`. For hardcoded HTML in `.astro` pages, enable `features.translateDocs` and add a `docs[]` block with `docsOutput.style: "astro-starlight"` (see [Astro website pages (parse-and-replace)](docs/GETTING_STARTED.md#astro-website-pages-parse-and-replace)). Keep `targetLocales`, `i18n.locales` in `astro.config.mjs`, and `ui-languages.json` aligned (Astro routes use lowercase codes such as `pt-br`; flat bundle filenames follow config casing, e.g. `pt-BR.json`).
|
|
187
|
+
|
|
188
|
+
Wire `t()` at build time without i18next unless you add client islands — see [Astro website UI strings (SSG)](docs/GETTING_STARTED.md#astro-website-ui-strings-ssg) and the example’s `src/i18n/t.ts`.
|
|
189
|
+
|
|
190
|
+
<a id="combined-workflow"></a>
|
|
191
|
+
### Combined workflow
|
|
187
192
|
|
|
188
193
|
```bash
|
|
189
|
-
npx ai-i18n-tools sync #
|
|
194
|
+
npx ai-i18n-tools sync # extract → translate-ui → translate-svg → translate-docs → translate-json (per features)
|
|
190
195
|
```
|
|
191
196
|
|
|
192
197
|
---
|
|
@@ -196,64 +201,63 @@ npx ai-i18n-tools sync # Extract UI strings, then translate UI strings, SVG, a
|
|
|
196
201
|
|
|
197
202
|
The following helpers are exported from `'ai-i18n-tools/runtime'` and work in any JavaScript environment. You do not need to import i18next to use them:
|
|
198
203
|
|
|
199
|
-
| Helper
|
|
200
|
-
|
|
201
|
-
| `defaultI18nInitOptions(sourceLocale)`
|
|
202
|
-
| `setupKeyAsDefaultT(i18n, { stringsJson, sourcePluralFlatBundle? })`
|
|
203
|
-
| `wrapI18nWithKeyTrim(i18n)`
|
|
204
|
-
| `makeLocaleLoadersFromManifest(uiLanguages, sourceLocale, makeLoader)` | Builds the `localeLoaders` map for `makeLoadLocale` from `ui-languages.json` (every `code` except `sourceLocale`).
|
|
205
|
-
| `makeLoadLocale(i18n, loaders, sourceLocale)`
|
|
206
|
-
| `getTextDirection(lng)`
|
|
207
|
-
| `applyDirection(lng, element?)`
|
|
208
|
-
| `getUILanguageLabel(lang, t)`
|
|
209
|
-
| `getUILanguageLabelNative(lang)`
|
|
210
|
-
| `interpolateTemplate(str, vars)`
|
|
211
|
-
| `flipUiArrowsForRtl(text, isRtl)`
|
|
204
|
+
| Helper | Description |
|
|
205
|
+
|------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------|
|
|
206
|
+
| `defaultI18nInitOptions(sourceLocale)` | Standard i18next init options for key-as-default setups. |
|
|
207
|
+
| `setupKeyAsDefaultT(i18n, { stringsJson, sourcePluralFlatBundle? })` | Recommended wiring: key-trim + plural `wrapT` from `strings.json`, optionally merges `translate-ui` `{sourceLocale}.json` plural keys. |
|
|
208
|
+
| `wrapI18nWithKeyTrim(i18n)` | Lower-level key-trim wrapper only (deprecated for app wiring; prefer `setupKeyAsDefaultT`). |
|
|
209
|
+
| `makeLocaleLoadersFromManifest(uiLanguages, sourceLocale, makeLoader)` | Builds the `localeLoaders` map for `makeLoadLocale` from `ui-languages.json` (every `code` except `sourceLocale`). |
|
|
210
|
+
| `makeLoadLocale(i18n, loaders, sourceLocale)` | Factory for async locale file loading. |
|
|
211
|
+
| `getTextDirection(lng)` | Returns `'ltr'` or `'rtl'` for a BCP-47 code. |
|
|
212
|
+
| `applyDirection(lng, element?)` | Sets `dir` attribute on `document.documentElement`. |
|
|
213
|
+
| `getUILanguageLabel(lang, t)` | Display label for a language menu row (with i18n). |
|
|
214
|
+
| `getUILanguageLabelNative(lang)` | Display label without calling `t()` (header-style). |
|
|
215
|
+
| `interpolateTemplate(str, vars)` | Low-level `{{var}}` substitution on a plain string (used internally; app code should use `t()` instead). |
|
|
216
|
+
| `flipUiArrowsForRtl(text, isRtl)` | Flip `→` to `←` for RTL layouts. |
|
|
212
217
|
|
|
213
218
|
---
|
|
214
219
|
|
|
215
220
|
<a id="cli-commands"></a>
|
|
216
221
|
## CLI commands
|
|
217
222
|
|
|
218
|
-
```
|
|
219
|
-
ai-i18n-tools version
|
|
220
|
-
ai-i18n-tools
|
|
221
|
-
ai-i18n-tools init [-t ui-markdown|ui-docusaurus] [-o path] [--with-translate-ignore]
|
|
222
|
-
ai-i18n-tools
|
|
223
|
-
ai-i18n-tools
|
|
224
|
-
ai-i18n-tools extract
|
|
225
|
-
ai-i18n-tools translate-docs …
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
ai-i18n-tools
|
|
229
|
-
ai-i18n-tools
|
|
230
|
-
ai-i18n-tools
|
|
231
|
-
ai-i18n-tools
|
|
232
|
-
|
|
233
|
-
ai-i18n-tools
|
|
234
|
-
ai-i18n-tools
|
|
235
|
-
ai-i18n-tools
|
|
236
|
-
ai-i18n-tools
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
ai-i18n-tools
|
|
240
|
-
ai-i18n-tools
|
|
241
|
-
ai-i18n-tools
|
|
242
|
-
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
|
|
243
|
-
ai-i18n-tools clean-temp [-r|--root <path>] [-f|--force] [--dry-run] List *.log and cache.db.backup*.sqlite; delete after `y`, with `-f`, or skip if none match
|
|
244
|
-
ai-i18n-tools glossary-generate Create empty glossary CSV template
|
|
223
|
+
```bash
|
|
224
|
+
ai-i18n-tools version
|
|
225
|
+
ai-i18n-tools check-models
|
|
226
|
+
ai-i18n-tools init [-t ui-markdown|ui-docusaurus|ui-starlight|ui-astro-website|ui-json-bundles] [-o path] [--with-translate-ignore]
|
|
227
|
+
ai-i18n-tools write-heading-ids …
|
|
228
|
+
ai-i18n-tools strip-md-bold-inline …
|
|
229
|
+
ai-i18n-tools extract
|
|
230
|
+
ai-i18n-tools translate-docs …
|
|
231
|
+
ai-i18n-tools translate-json …
|
|
232
|
+
ai-i18n-tools translate-svg …
|
|
233
|
+
ai-i18n-tools translate-ui …
|
|
234
|
+
ai-i18n-tools sync-ui …
|
|
235
|
+
ai-i18n-tools lint-source …
|
|
236
|
+
ai-i18n-tools check-markdown [-p|--path <path>] [-f|--file <path>] [--json] [--no-cache]
|
|
237
|
+
ai-i18n-tools export-ui-xliff …
|
|
238
|
+
ai-i18n-tools sync …
|
|
239
|
+
ai-i18n-tools status …
|
|
240
|
+
ai-i18n-tools statistics …
|
|
241
|
+
ai-i18n-tools cleanup …
|
|
242
|
+
ai-i18n-tools clean-temp …
|
|
243
|
+
ai-i18n-tools dashboard …
|
|
244
|
+
ai-i18n-tools generate-ui-languages [--master path] [--dry-run]
|
|
245
|
+
ai-i18n-tools glossary-generate
|
|
246
|
+
ai-i18n-tools help [command]
|
|
245
247
|
```
|
|
246
248
|
|
|
247
|
-
Complete per-command flag lists are maintained next to `src/cli/index.ts` in [CLI flags by command](docs/GETTING_STARTED.md#cli-flags-by-command). Run `ai-i18n-tools <command> --help` for built-in usage text.
|
|
248
249
|
|
|
249
|
-
|
|
250
|
+
Complete per-command flag lists are in [Getting Started — CLI reference](docs/GETTING_STARTED.md#cli-reference). Run `ai-i18n-tools <command> --help` for built-in usage text.
|
|
251
|
+
|
|
252
|
+
Global options on every command: `-c <config>` (default: `ai-i18n-tools.config.json`), `-v` (verbose), optional `-w` / `--write-logs [path]` to tee console output to a log file (default: under the translation cache directory), `-V` / `--version`, and `-h` / `--help`. Several commands accept `-l` / `--locale <codes>` (comma-separated BCP-47) to limit target locales; `lint-source` uses a single source locale. See [Getting Started](docs/GETTING_STARTED.md#cli-reference) for the command overview table.
|
|
250
253
|
|
|
251
254
|
---
|
|
252
255
|
|
|
253
256
|
<a id="documentation"></a>
|
|
254
257
|
## Documentation
|
|
255
258
|
|
|
256
|
-
- [Getting Started](docs/GETTING_STARTED.md) - full setup
|
|
259
|
+
- [Getting Started](docs/GETTING_STARTED.md) - full setup for all workflows (UI, docs/`.astro`, JSON bundles, Astro Starlight and plain Astro), CLI reference, and config field reference.
|
|
260
|
+
- [Locale assets guide](docs/LOCALE-ASSETS-GUIDE.md) - screenshots and illustrated SVGs in translated docs (Patterns A–E, flat link rewriter, screenshot scripts).
|
|
257
261
|
- [Package Overview](docs/PACKAGE_OVERVIEW.md) - architecture, internals, programmatic API, and extension points.
|
|
258
262
|
- [AI Agent Context](docs/ai-i18n-tools-context.md) - **for apps using the package:** integration prompts for downstream projects (copy into your repo’s agent rules).
|
|
259
263
|
- Maintainer internals for **this** repository: `dev/package-context.md` (clone-only; not on npm).
|
|
@@ -25,11 +25,11 @@ export async function runCheckMarkdown(opts) {
|
|
|
25
25
|
? new TranslationCache(path.join(projectRoot, opts.config.cacheDir))
|
|
26
26
|
: null;
|
|
27
27
|
try {
|
|
28
|
-
for (let bi = 0; bi < opts.config.
|
|
29
|
-
const block = opts.config.
|
|
28
|
+
for (let bi = 0; bi < opts.config.docs.length; bi++) {
|
|
29
|
+
const block = opts.config.docs[bi];
|
|
30
30
|
const view = toDocTranslateConfig(opts.config, block);
|
|
31
31
|
const md = filterIgnoredFiles(collectFilesByExtension(block.contentPaths, [".md", ".mdx"], projectRoot), projectRoot).filter((r) => matchesPathFilter(r, opts.pathFilter));
|
|
32
|
-
const mdExtractOpts = buildMarkdownExtractOpts(view.
|
|
32
|
+
const mdExtractOpts = buildMarkdownExtractOpts(view.doc);
|
|
33
33
|
const extractor = new MarkdownExtractor();
|
|
34
34
|
for (const relPath of md) {
|
|
35
35
|
const abs = path.join(projectRoot, relPath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-markdown.js","sourceRoot":"","sources":["../../src/cli/check-markdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,+BAA+B,EAAE,MAAM,8CAA8C,CAAC;AAC/F,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAEjF,SAAS,kBAAkB,CAAC,KAAe,EAAE,GAAW;IACtD,MAAM,EAAE,GAAG,mBAAmB,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;IACzD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AACrE,CAAC;AAoBD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAA0B;IAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC;IAC7B,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,MAAM,KAAK,GACT,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ;QACnC,CAAC,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpE,CAAC,CAAC,IAAI,CAAC;IAEX,IAAI,CAAC;QACH,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"check-markdown.js","sourceRoot":"","sources":["../../src/cli/check-markdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,+BAA+B,EAAE,MAAM,8CAA8C,CAAC;AAC/F,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAEjF,SAAS,kBAAkB,CAAC,KAAe,EAAE,GAAW;IACtD,MAAM,EAAE,GAAG,mBAAmB,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;IACzD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AACrE,CAAC;AAoBD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAA0B;IAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC;IAC7B,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,MAAM,KAAK,GACT,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ;QACnC,CAAC,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpE,CAAC,CAAC,IAAI,CAAC;IAEX,IAAI,CAAC;QACH,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;YACpD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAE,CAAC;YACpC,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACtD,MAAM,EAAE,GAAG,kBAAkB,CAC3B,uBAAuB,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,WAAW,CAAC,EACzE,WAAW,CACZ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YAEvD,MAAM,aAAa,GAAG,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzD,MAAM,SAAS,GAAG,IAAI,iBAAiB,EAAE,CAAC;YAE1C,KAAK,MAAM,OAAO,IAAI,EAAE,EAAE,CAAC;gBACzB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;gBAC5C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBAC7C,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;gBACpE,MAAM,QAAQ,GAAG,4BAA4B,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBAC3D,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,+BAA+B,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;gBAEnF,IAAI,KAAK,EAAE,CAAC;oBACV,KAAK,CAAC,gCAAgC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBACzD,CAAC;gBAED,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oBACvB,UAAU,EAAE,CAAC;oBACb,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;wBACd,QAAQ,CAAC,IAAI,CAAC;4BACZ,QAAQ,EAAE,GAAG,CAAC,QAAQ;4BACtB,WAAW,EAAE,OAAO;4BACpB,IAAI,EAAE,GAAG,CAAC,SAAS;4BACnB,SAAS,EAAE,GAAG,CAAC,SAAS;4BACxB,MAAM,EAAE,GAAG,CAAC,MAAM;4BAClB,UAAU,EAAE,GAAG,CAAC,UAAU;yBAC3B,CAAC,CAAC;oBACL,CAAC;yBAAM,CAAC;wBACN,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC;wBAClC,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,IAAI,IAAI,EAAE,CAAC;4BAC9B,KAAK,CAAC,MAAM,CACV,MAAM,GAAG,CAAC,SAAS,KAAK,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACvF,CACJ,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,KAAK,EAAE,CAAC;IACjB,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAChF,CAAC;SAAM,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,uBAAuB,UAAU,oCAAoC,CAAC,CACjF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC9C,CAAC"}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
import type { DocSegmentTranslation,
|
|
1
|
+
import type { DocSegmentTranslation, DocBlock, I18nConfig, I18nDocTranslateConfig, Segment, TranslationFailureInsert } from "../core/types.js";
|
|
2
2
|
export type { DocSegmentTranslation };
|
|
3
3
|
import { TranslationCache } from "../core/cache.js";
|
|
4
4
|
import type { MarkdownExtractOptions } from "../extractors/markdown-extractor.js";
|
|
5
5
|
import { PlaceholderHandler } from "../processors/placeholder-handler.js";
|
|
6
|
+
import type { ExpressionProtectionOptions } from "../processors/expression-attribute-protection.js";
|
|
6
7
|
import { Glossary } from "../glossary/glossary.js";
|
|
7
8
|
import { OpenRouterClient } from "../api/openrouter.js";
|
|
8
|
-
import type { DocumentBatchResponseFormat } from "../core/prompt-builder.js";
|
|
9
|
+
import type { DocumentBatchResponseFormat, DocumentPromptContentType } from "../core/prompt-builder.js";
|
|
9
10
|
import { AsyncMutex } from "../utils/concurrency.js";
|
|
10
11
|
import { FileContentCache } from "./file-content-cache.js";
|
|
11
12
|
/** Same segment-extraction options as `translate-docs` for one documentation block. */
|
|
12
|
-
export declare function buildMarkdownExtractOpts(
|
|
13
|
+
export declare function buildMarkdownExtractOpts(doc: DocBlock): MarkdownExtractOptions;
|
|
13
14
|
/** Batch segment prompt/response shape for `translate-docs --prompt-format`. */
|
|
14
15
|
export type TranslatePromptFormat = "xml" | "json-array" | "json-object";
|
|
15
16
|
export declare function translatePromptFormatToResponseFormat(fmt: TranslatePromptFormat | undefined): DocumentBatchResponseFormat;
|
|
@@ -25,7 +26,7 @@ export interface TranslateRunOptions {
|
|
|
25
26
|
noCache: boolean;
|
|
26
27
|
verbose: boolean;
|
|
27
28
|
pathFilter?: string;
|
|
28
|
-
typeFilter?: "markdown" | "json";
|
|
29
|
+
typeFilter?: "markdown" | "json" | "astro";
|
|
29
30
|
jsonOnly?: boolean;
|
|
30
31
|
noJson?: boolean;
|
|
31
32
|
/** Path to the active log file (printed in the header block). */
|
|
@@ -49,7 +50,7 @@ export interface TranslateRunOptions {
|
|
|
49
50
|
promptFormat?: TranslatePromptFormat;
|
|
50
51
|
/**
|
|
51
52
|
* Set when `translate-docs` / `sync` passes `--emphasis-placeholders` (mask emphasis for all locales unless
|
|
52
|
-
* `
|
|
53
|
+
* `docs[].emphasisPlaceholders` overrides).
|
|
53
54
|
*/
|
|
54
55
|
emphasisPlaceholdersCli?: boolean;
|
|
55
56
|
/**
|
|
@@ -89,11 +90,12 @@ type ProtectState = ReturnType<PlaceholderHandler["protectForTranslation"]> & {
|
|
|
89
90
|
glossaryForceReplacements?: string[];
|
|
90
91
|
};
|
|
91
92
|
/** Glossary forced tokens first, then markdown URL/admonition/(optional) emphasis protection when `useMarkdownPlaceholders`. */
|
|
92
|
-
export declare function protectSegmentForTranslation(raw: string, glossary: Glossary, locale: string, useMarkdownPlaceholders: boolean, emphasisPlaceholders?: boolean): {
|
|
93
|
+
export declare function protectSegmentForTranslation(raw: string, glossary: Glossary, locale: string, useMarkdownPlaceholders: boolean, emphasisPlaceholders?: boolean, expressionProtection?: ExpressionProtectionOptions): {
|
|
93
94
|
text: string;
|
|
94
95
|
state: ProtectState;
|
|
95
96
|
};
|
|
96
97
|
export declare function shouldRunMarkdown(opts: TranslateRunOptions, config: I18nDocTranslateConfig): boolean;
|
|
98
|
+
export declare function shouldRunAstro(opts: TranslateRunOptions, config: I18nDocTranslateConfig): boolean;
|
|
97
99
|
export declare function shouldRunJson(opts: TranslateRunOptions, config: I18nDocTranslateConfig): boolean;
|
|
98
100
|
export declare function matchesPathFilter(relPath: string, filter: string | undefined): boolean;
|
|
99
101
|
/**
|
|
@@ -113,7 +115,7 @@ export declare function normalizePathFilterForProjectRoot(projectRoot: string, r
|
|
|
113
115
|
export declare function isProjectRelUnderBlockContentPath(projectRoot: string, relPosix: string, block: {
|
|
114
116
|
contentPaths: string[];
|
|
115
117
|
}): boolean;
|
|
116
|
-
export declare function isProjectRelUnderAnyDocumentationContentPath(projectRoot: string, relPosix: string,
|
|
118
|
+
export declare function isProjectRelUnderAnyDocumentationContentPath(projectRoot: string, relPosix: string, docs: Array<{
|
|
117
119
|
contentPaths: string[];
|
|
118
120
|
}>): boolean;
|
|
119
121
|
/**
|
|
@@ -121,18 +123,57 @@ export declare function isProjectRelUnderAnyDocumentationContentPath(projectRoot
|
|
|
121
123
|
* (single file or all markdown files under a directory).
|
|
122
124
|
*/
|
|
123
125
|
export declare function expandPathFilterToMarkdownPaths(projectRoot: string, pathFilter: string | undefined): string[];
|
|
126
|
+
/**
|
|
127
|
+
* Expand a normalized project-root `--path` / `--file` to concrete `.astro` paths.
|
|
128
|
+
*/
|
|
129
|
+
export declare function expandPathFilterToAstroPaths(projectRoot: string, pathFilter: string | undefined): string[];
|
|
124
130
|
export interface AugmentMarkdownFromPathFilterResult {
|
|
125
131
|
markdown: string[];
|
|
126
132
|
warnings: string[];
|
|
127
133
|
}
|
|
134
|
+
export interface AugmentAstroFromPathFilterResult {
|
|
135
|
+
astro: string[];
|
|
136
|
+
warnings: string[];
|
|
137
|
+
}
|
|
128
138
|
/**
|
|
129
139
|
* When the user passes `--path` / `--file`, include matching markdown that normal discovery
|
|
130
140
|
* skipped (outside `contentPaths`, or under this block but filtered e.g. by `.translate-ignore`).
|
|
131
141
|
* Paths outside every `contentPaths` are only attached to `documentations[0]`.
|
|
132
142
|
*/
|
|
133
|
-
export declare function augmentMarkdownFilesFromPathFilter(projectRoot: string, pathFilter: string | undefined, documentationBlockIndex: number,
|
|
143
|
+
export declare function augmentMarkdownFilesFromPathFilter(projectRoot: string, pathFilter: string | undefined, documentationBlockIndex: number, docs: Array<{
|
|
134
144
|
contentPaths: string[];
|
|
135
145
|
}>, markdownDiscovered: string[]): AugmentMarkdownFromPathFilterResult;
|
|
146
|
+
/** Same as {@link augmentMarkdownFilesFromPathFilter} for `.astro` pages. */
|
|
147
|
+
export declare function augmentAstroFilesFromPathFilter(projectRoot: string, pathFilter: string | undefined, documentationBlockIndex: number, docs: Array<{
|
|
148
|
+
contentPaths: string[];
|
|
149
|
+
}>, astroDiscovered: string[]): AugmentAstroFromPathFilterResult;
|
|
150
|
+
type FailureTracker = {
|
|
151
|
+
clearSegmentFailures: (sourceHash: string, locale: string) => Promise<void>;
|
|
152
|
+
addSegmentFailures: (rows: TranslationFailureInsert[]) => Promise<void>;
|
|
153
|
+
};
|
|
154
|
+
export declare function translateSegmentsBatched(batchable: Segment[], placeholderById: Map<string, ProtectState>,
|
|
155
|
+
/** Pre-placeholder markdown source per segment hash; empty for json/svg (original is on the segment). */
|
|
156
|
+
originalContentByHash: Map<string, string>, locale: string, glossary: Glossary, client: OpenRouterClient | null, dryRun: boolean, verbose: boolean, batchSize: number, maxBatchChars: number, contentType: DocumentPromptContentType, batchConcurrency: number,
|
|
157
|
+
/** OpenRouter batch: XML <seg>/<t> vs JSON array/object (see `--prompt-format`). */
|
|
158
|
+
batchResponseFormat: DocumentBatchResponseFormat, docLog?: {
|
|
159
|
+
relativePath: string;
|
|
160
|
+
totalSegments: number;
|
|
161
|
+
/** For each entry in `batchable`, index into the full extracted segment list (0-based). */
|
|
162
|
+
segmentIndicesInDoc: number[];
|
|
163
|
+
},
|
|
164
|
+
/** Absolute `cacheDir` path; writes `*-FAILED-TRANSLATION-*.log` on markdown quality failures. */
|
|
165
|
+
failureLogDirAbs?: string | null, failureTracker?: FailureTracker,
|
|
166
|
+
/** Cwd-relative source path stored on failure rows for dashboard UI when cache has no segment yet. */
|
|
167
|
+
failureDocMeta?: {
|
|
168
|
+
filepath: string;
|
|
169
|
+
}): Promise<{
|
|
170
|
+
map: Map<string, DocSegmentTranslation>;
|
|
171
|
+
inTok: number;
|
|
172
|
+
outTok: number;
|
|
173
|
+
cost: number;
|
|
174
|
+
segmentValidationFailures: number;
|
|
175
|
+
individualSegmentTranslations: number;
|
|
176
|
+
}>;
|
|
136
177
|
/**
|
|
137
178
|
* Locale-independent: read source, extract segments (same options as translation), then refresh
|
|
138
179
|
* `markdown_source_issues` and stderr warnings. Call once per markdown file before parallel
|
|
@@ -143,6 +184,10 @@ export declare function translateMarkdownFile(absSource: string, relPath: string
|
|
|
143
184
|
skipped: boolean;
|
|
144
185
|
totals: TranslateTotals;
|
|
145
186
|
}>;
|
|
187
|
+
export declare function translateAstroFile(absSource: string, relPath: string, locale: string, config: I18nDocTranslateConfig, cache: TranslationCache | null, client: OpenRouterClient | null, glossary: Glossary, opts: TranslateRunOptions, hitKeys: Set<string>, fileContentCache?: FileContentCache): Promise<{
|
|
188
|
+
skipped: boolean;
|
|
189
|
+
totals: TranslateTotals;
|
|
190
|
+
}>;
|
|
146
191
|
export declare function translateJsonFile(absSource: string, relPath: string, locale: string, config: I18nDocTranslateConfig, cache: TranslationCache | null, client: OpenRouterClient | null, glossary: Glossary, opts: TranslateRunOptions, hitKeys: Set<string>, fileContentCache?: FileContentCache): Promise<{
|
|
147
192
|
skipped: boolean;
|
|
148
193
|
totals: TranslateTotals;
|
|
@@ -157,5 +202,6 @@ export declare function rewriteSourceMarkdownLanguageListBlocks(config: I18nDocT
|
|
|
157
202
|
export declare function runTranslate(config: I18nDocTranslateConfig, opts: TranslateRunOptions, files: {
|
|
158
203
|
markdown: string[];
|
|
159
204
|
json: string[];
|
|
205
|
+
astro: string[];
|
|
160
206
|
}, jsonAbsRoot: string): Promise<TranslateTotals>;
|
|
161
207
|
//# sourceMappingURL=doc-translate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doc-translate.d.ts","sourceRoot":"","sources":["../../src/cli/doc-translate.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,qBAAqB,EACrB,
|
|
1
|
+
{"version":3,"file":"doc-translate.d.ts","sourceRoot":"","sources":["../../src/cli/doc-translate.ts"],"names":[],"mappings":"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"}
|