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
|
@@ -0,0 +1,682 @@
|
|
|
1
|
+
# ai-i18n-tools: Introducción
|
|
2
|
+
|
|
3
|
+
`ai-i18n-tools` proporciona dos flujos de trabajo independientes y componibles:
|
|
4
|
+
|
|
5
|
+
- **Flujo de trabajo 1 - Traducción de interfaz de usuario**: extrae llamadas `t("…")` de cualquier fuente JS/TS, tradúcelas mediante OpenRouter y escribe archivos JSON planos por configuración regional listos para i18next.
|
|
6
|
+
- **Flujo de trabajo 2 - Traducción de documentos**: traduce archivos markdown (MDX) y archivos de etiquetas JSON de Docusaurus a cualquier número de configuraciones regionales, con caché inteligente. Los recursos **SVG** usan `features.translateSVG`, el bloque `svg` de nivel superior y `translate-svg` (véase [referencia de CLI](#cli-reference)).
|
|
7
|
+
|
|
8
|
+
Ambos flujos de trabajo utilizan OpenRouter (cualquier LLM compatible) y comparten un único archivo de configuración.
|
|
9
|
+
|
|
10
|
+
<small>**Leer en otros idiomas:** </small>
|
|
11
|
+
|
|
12
|
+
<small id="lang-list">[en-GB](../../docs/GETTING_STARTED.md) · [de](./GETTING_STARTED.de.md) · [es](./GETTING_STARTED.es.md) · [fr](./GETTING_STARTED.fr.md) · [hi](./GETTING_STARTED.hi.md) · [ja](./GETTING_STARTED.ja.md) · [ko](./GETTING_STARTED.ko.md) · [pt-BR](./GETTING_STARTED.pt-BR.md) · [zh-CN](./GETTING_STARTED.zh-CN.md) · [zh-TW](./GETTING_STARTED.zh-TW.md)</small>
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
<!-- INICIO doctoc generado TOC por favor mantenga el comentario aquí para permitir la actualización automática -->
|
|
17
|
+
<!-- NO EDITAR ESTA SECCIÓN, EN SU LUGAR REEJECUTAR doctoc PARA ACTUALIZAR -->
|
|
18
|
+
**Tabla de Contenidos**
|
|
19
|
+
|
|
20
|
+
- [Instalación](#installation)
|
|
21
|
+
- [Inicio rápido](#quick-start)
|
|
22
|
+
- [Flujo de trabajo 1 - Traducción de interfaz](#workflow-1---ui-translation)
|
|
23
|
+
- [Paso 1: Inicializar](#step-1-initialise)
|
|
24
|
+
- [Paso 2: Extraer cadenas](#step-2-extract-strings)
|
|
25
|
+
- [Paso 3: Traducir cadenas de interfaz](#step-3-translate-ui-strings)
|
|
26
|
+
- [Exportar a XLIFF 2.0 (opcional)](#exporting-to-xliff-20-optional)
|
|
27
|
+
- [Paso 4: Conectar i18next en tiempo de ejecución](#step-4-wire-i18next-at-runtime)
|
|
28
|
+
- [Usar `t()` en el código fuente](#using-t-in-source-code)
|
|
29
|
+
- [Interpolación](#interpolation)
|
|
30
|
+
- [Interfaz de selector de idioma](#language-switcher-ui)
|
|
31
|
+
- [Idiomas RTL](#rtl-languages)
|
|
32
|
+
- [Flujo de trabajo 2 - Traducción de documentos](#workflow-2---document-translation)
|
|
33
|
+
- [Paso 1: Inicializar](#step-1-initialise-1)
|
|
34
|
+
- [Paso 2: Traducir documentos](#step-2-translate-documents)
|
|
35
|
+
- [Comportamiento de caché y banderas `translate-docs`](#cache-behaviour-and-translate-docs-flags)
|
|
36
|
+
- [Diseños de salida](#output-layouts)
|
|
37
|
+
- [Flujo de trabajo combinado (interfaz + documentos)](#combined-workflow-ui--docs)
|
|
38
|
+
- [Referencia de configuración](#configuration-reference)
|
|
39
|
+
- [`sourceLocale`](#sourcelocale)
|
|
40
|
+
- [`targetLocales`](#targetlocales)
|
|
41
|
+
- [`uiLanguagesPath` (opcional)](#uilanguagespath-optional)
|
|
42
|
+
- [`concurrency` (opcional)](#concurrency-optional)
|
|
43
|
+
- [`batchConcurrency` (opcional)](#batchconcurrency-optional)
|
|
44
|
+
- [`batchSize` / `maxBatchChars` (opcional)](#batchsize--maxbatchchars-optional)
|
|
45
|
+
- [`openrouter`](#openrouter)
|
|
46
|
+
- [`features`](#features)
|
|
47
|
+
- [`ui`](#ui)
|
|
48
|
+
- [`cacheDir`](#cachedir)
|
|
49
|
+
- [`documentations`](#documentations)
|
|
50
|
+
- [`svg` (opcional)](#svg-optional)
|
|
51
|
+
- [`glossary`](#glossary)
|
|
52
|
+
- [Referencia de CLI](#cli-reference)
|
|
53
|
+
- [Variables de entorno](#environment-variables)
|
|
54
|
+
|
|
55
|
+
<!-- FIN doctoc generado TOC por favor mantenga el comentario aquí para permitir la actualización automática -->
|
|
56
|
+
|
|
57
|
+
## Instalación
|
|
58
|
+
|
|
59
|
+
El paquete publicado es **solo ESM**. Usa `import`/`import()` en Node.js o tu empaquetador; **no uses `require('ai-i18n-tools')`.**
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
npm install ai-i18n-tools
|
|
63
|
+
# or
|
|
64
|
+
pnpm add ai-i18n-tools
|
|
65
|
+
# or
|
|
66
|
+
yarn add ai-i18n-tools
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Establece tu clave API de OpenRouter:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
export OPENROUTER_API_KEY=sk-or-v1-your-key-here
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
O crea un archivo `.env` en la raíz del proyecto:
|
|
76
|
+
|
|
77
|
+
```env
|
|
78
|
+
OPENROUTER_API_KEY=sk-or-v1-your-key-here
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Inicio Rápido
|
|
84
|
+
|
|
85
|
+
La plantilla `init` por defecto (`ui-markdown`) habilita solo la extracción y traducción de **UI**. La plantilla `ui-docusaurus` habilita la traducción de **documentos** (`translate-docs`). Usa `sync` cuando quieras un comando que ejecute la extracción, la traducción de UI, la traducción SVG opcional independiente y la traducción de documentación de acuerdo con tu configuración.
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
# Workflow 1 - UI strings (default template enables extract + translate-ui)
|
|
89
|
+
npx ai-i18n-tools init
|
|
90
|
+
npx ai-i18n-tools extract
|
|
91
|
+
npx ai-i18n-tools translate-ui
|
|
92
|
+
|
|
93
|
+
# Workflow 2 - docs (Docusaurus-oriented template)
|
|
94
|
+
npx ai-i18n-tools init -t ui-docusaurus
|
|
95
|
+
npx ai-i18n-tools translate-docs
|
|
96
|
+
|
|
97
|
+
# Combined: extract UI strings, then translate UI + SVG + docs (per config features)
|
|
98
|
+
npx ai-i18n-tools sync
|
|
99
|
+
|
|
100
|
+
# Markdown translation status (per file × locale)
|
|
101
|
+
npx ai-i18n-tools status
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Flujo de trabajo 1 - Traducción de UI
|
|
107
|
+
|
|
108
|
+
Diseñado para cualquier proyecto JS/TS que use i18next: aplicaciones React, Next.js (componentes del cliente y del servidor), servicios de Node.js, herramientas de CLI.
|
|
109
|
+
|
|
110
|
+
### Paso 1: Inicializar
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
npx ai-i18n-tools init
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Esto escribe `ai-i18n-tools.config.json` con la plantilla `ui-markdown`. Edítalo para establecer:
|
|
117
|
+
|
|
118
|
+
- `sourceLocale` - el código de idioma BCP-47 de tu idioma fuente (por ejemplo, `"en-GB"`). **Debe coincidir** con `SOURCE_LOCALE` exportado desde tu archivo de configuración i18n en tiempo de ejecución (`src/i18n.ts` / `src/i18n.js`).
|
|
119
|
+
- `targetLocales` - ruta a tu manifiesto `ui-languages.json` O un array de códigos BCP-47.
|
|
120
|
+
- `ui.sourceRoots` - directorios para escanear en busca de llamadas `t("…")` (por ejemplo, `["src/"]`).
|
|
121
|
+
- `ui.stringsJson` - dónde escribir el catálogo maestro (por ejemplo, `"src/locales/strings.json"`).
|
|
122
|
+
- `ui.flatOutputDir` - dónde escribir `de.json`, `pt-BR.json`, etc. (por ejemplo, `"src/locales/"`).
|
|
123
|
+
- `ui.preferredModel` (opcional) - ID del modelo OpenRouter que intentar **primero** para `translate-ui` únicamente; si falla, la CLI continúa con `openrouter.translationModels` (o el legado `defaultModel` / `fallbackModel`) en orden, omitiendo duplicados.
|
|
124
|
+
|
|
125
|
+
### Paso 2: Extraer cadenas
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
npx ai-i18n-tools extract
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Escanea todos los archivos JS/TS bajo `ui.sourceRoots` en busca de llamadas `t("literal")` y `i18n.t("literal")`. Escribe (o fusiona en) `ui.stringsJson`.
|
|
132
|
+
|
|
133
|
+
El escáner es configurable: añade nombres de funciones personalizadas a través de `ui.reactExtractor.funcNames`.
|
|
134
|
+
|
|
135
|
+
### Paso 3: Traducir cadenas de UI
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
npx ai-i18n-tools translate-ui
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Lee `strings.json`, envía lotes a OpenRouter para cada idioma objetivo, escribe archivos JSON planos (`de.json`, `fr.json`, etc.) en `ui.flatOutputDir`. Cuando `ui.preferredModel` está configurado, ese modelo se intenta antes de la lista ordenada en `openrouter.translationModels` (la traducción de documentos y otros comandos aún utilizan solo `openrouter`).
|
|
142
|
+
|
|
143
|
+
Para cada entrada, `translate-ui` almacena el **id del modelo OpenRouter** que tradujo correctamente cada configuración regional en un objeto opcional `models` (con las mismas claves de configuración regional que en `translated`). Las cadenas editadas en el comando local `editor` se marcan con el valor centinela `user-edited` en `models` para esa configuración regional. Los archivos planos por configuración regional bajo `ui.flatOutputDir` permanecen como **cadena fuente → traducción** únicamente; no incluyen `models` (por lo que los paquetes en tiempo de ejecución permanecen sin cambios).
|
|
144
|
+
|
|
145
|
+
> **Nota sobre el uso del Editor de Caché:** Si editas una entrada en el editor de caché, necesitas ejecutar un `sync --force-update` (o el comando `translate` equivalente con `--force-update`) para reescribir los archivos de salida con la entrada de caché actualizada. Además, ten en cuenta que si el texto fuente cambia más tarde, tu edición manual se perderá porque se generará una nueva clave de caché (hash) para la nueva cadena fuente.
|
|
146
|
+
|
|
147
|
+
### Exportar a XLIFF 2.0 (opcional)
|
|
148
|
+
|
|
149
|
+
Para entregar las cadenas de interfaz a un proveedor de traducción, un sistema de gestión de traducción (TMS) o una herramienta CAT, exporte el catálogo como **XLIFF 2.0** (un archivo por configuración regional de destino). Este comando es **de solo lectura**: no modifica `strings.json` ni llama a ninguna API.
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
npx ai-i18n-tools export-ui-xliff
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Por defecto, los archivos se escriben junto a `ui.stringsJson`, con nombres como `strings.de.xliff`, `strings.pt-BR.xliff` (nombre base de su catálogo + configuración regional + `.xliff`). Use `-o` / `--output-dir` para escribir en otra ubicación. Las traducciones existentes de `strings.json` aparecen en `<target>`; las configuraciones regionales faltantes usan `state="initial"` sin `<target>` para que las herramientas puedan completarlas. Use `--untranslated-only` para exportar solo las unidades que aún necesitan traducción para cada configuración regional (útil para lotes enviados a proveedores). `--dry-run` muestra las rutas sin escribir archivos.
|
|
156
|
+
|
|
157
|
+
### Paso 4: Conectar i18next en tiempo de ejecución
|
|
158
|
+
|
|
159
|
+
Crea tu archivo de configuración i18n utilizando los ayudantes exportados por `'ai-i18n-tools/runtime'`:
|
|
160
|
+
|
|
161
|
+
```js
|
|
162
|
+
// src/i18n.js (or src/i18n.ts)
|
|
163
|
+
import i18n from 'i18next';
|
|
164
|
+
import { initReactI18next } from 'react-i18next';
|
|
165
|
+
import uiLanguages from './locales/ui-languages.json';
|
|
166
|
+
import {
|
|
167
|
+
defaultI18nInitOptions,
|
|
168
|
+
wrapI18nWithKeyTrim,
|
|
169
|
+
makeLoadLocale,
|
|
170
|
+
applyDirection,
|
|
171
|
+
} from 'ai-i18n-tools/runtime';
|
|
172
|
+
|
|
173
|
+
// Must match sourceLocale in ai-i18n-tools.config.json
|
|
174
|
+
export const SOURCE_LOCALE = 'en-GB';
|
|
175
|
+
|
|
176
|
+
void i18n.use(initReactI18next).init(defaultI18nInitOptions(SOURCE_LOCALE));
|
|
177
|
+
wrapI18nWithKeyTrim(i18n);
|
|
178
|
+
i18n.on('languageChanged', applyDirection);
|
|
179
|
+
applyDirection(i18n.language);
|
|
180
|
+
|
|
181
|
+
const localeLoaders = Object.fromEntries(
|
|
182
|
+
uiLanguages
|
|
183
|
+
.filter(({ code }) => code !== SOURCE_LOCALE)
|
|
184
|
+
.map(({ code }) => [code, () => import(`./locales/${code}.json`)])
|
|
185
|
+
);
|
|
186
|
+
|
|
187
|
+
export const loadLocale = makeLoadLocale(i18n, localeLoaders, SOURCE_LOCALE);
|
|
188
|
+
export default i18n;
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Importa `i18n.js` antes de que React renderice (por ejemplo, en la parte superior de tu punto de entrada). Cuando el usuario cambie de idioma, llama a `await loadLocale(code)` y luego `i18n.changeLanguage(code)`.
|
|
192
|
+
|
|
193
|
+
`SOURCE_LOCALE` se exporta para que cualquier otro archivo que lo necesite (por ejemplo, un conmutador de idioma) pueda importarlo directamente desde `'./i18n'`.
|
|
194
|
+
|
|
195
|
+
`defaultI18nInitOptions(sourceLocale)` devuelve las opciones estándar para configuraciones basadas en claves como valor por defecto:
|
|
196
|
+
|
|
197
|
+
- `parseMissingKeyHandler` devuelve la clave en sí, por lo que las cadenas no traducidas muestran el texto fuente.
|
|
198
|
+
- `nsSeparator: false` permite claves que contienen dos puntos.
|
|
199
|
+
- `interpolation.escapeValue: false` - seguro para desactivar: React escapa los valores por sí mismo, y la salida de Node.js/CLI no tiene HTML que escapar.
|
|
200
|
+
|
|
201
|
+
`wrapI18nWithKeyTrim(i18n)` envuelve `i18n.t` para que: (1) las claves se recorten antes de la búsqueda, coincidiendo con cómo el script de extracción las almacena; (2) se aplique la interpolación <code>{"{{var}}"}</code> cuando la configuración regional fuente devuelva la clave cruda, de modo que <code>{"t('Hello {{name}}', { name })"}</code> funcione correctamente incluso para el idioma fuente.
|
|
202
|
+
|
|
203
|
+
`makeLoadLocale(i18n, loaders, sourceLocale)` devuelve una función asíncrona `loadLocale(lang)` que importa dinámicamente el paquete JSON para una configuración regional y lo registra con i18next.
|
|
204
|
+
|
|
205
|
+
### Usando `t()` en el código fuente
|
|
206
|
+
|
|
207
|
+
Llama a `t()` con una **cadena literal** para que el script de extracción pueda encontrarla:
|
|
208
|
+
|
|
209
|
+
```jsx
|
|
210
|
+
import { useTranslation } from 'react-i18next';
|
|
211
|
+
|
|
212
|
+
function MyComponent() {
|
|
213
|
+
const { t } = useTranslation();
|
|
214
|
+
return <button>{t('Save')}</button>;
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
El mismo patrón funciona fuera de React (Node.js, componentes del servidor, CLI):
|
|
219
|
+
|
|
220
|
+
```js
|
|
221
|
+
import i18n from './i18n.js';
|
|
222
|
+
console.log(i18n.t('Processing complete'));
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
**Reglas:**
|
|
226
|
+
|
|
227
|
+
- Solo se extraen estas formas: `t("…")`, `t('…')`, `t(`…`)`, `i18n.t("…")`.
|
|
228
|
+
- La clave debe ser una **cadena literal** - no variables ni expresiones como clave.
|
|
229
|
+
- No utilices literales de plantilla para la clave: <code>{'t(`Hola ${name}`)'}</code> no es extraíble.
|
|
230
|
+
|
|
231
|
+
### Interpolación
|
|
232
|
+
|
|
233
|
+
Utiliza la interpolación nativa del segundo argumento de i18next para los marcadores de posición <code>{"{{var}}"}</code>:
|
|
234
|
+
|
|
235
|
+
```js
|
|
236
|
+
// i18next handles substitution natively, even in key-as-default mode
|
|
237
|
+
t('Hello {{name}}, you have {{count}} messages', { name, count })
|
|
238
|
+
// → "Hello Alice, you have 3 messages"
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
El script de extracción ignora el segundo argumento - solo se extrae y se envía para traducción la cadena clave literal <code>{"\"Hola {{name}}, tienes {{count}} mensajes\""}</code>. Se instruye a los traductores que conserven los tokens <code>{"{{...}}"}</code>.
|
|
242
|
+
|
|
243
|
+
### Interfaz de cambio de idioma
|
|
244
|
+
|
|
245
|
+
Utiliza el manifiesto `ui-languages.json` para construir un selector de idioma. `ai-i18n-tools` exporta dos ayudantes de visualización:
|
|
246
|
+
|
|
247
|
+
```tsx
|
|
248
|
+
import { useMemo } from 'react';
|
|
249
|
+
import { useTranslation } from 'react-i18next';
|
|
250
|
+
import {
|
|
251
|
+
getUILanguageLabel,
|
|
252
|
+
getUILanguageLabelNative,
|
|
253
|
+
type UiLanguageEntry,
|
|
254
|
+
} from 'ai-i18n-tools/runtime';
|
|
255
|
+
import uiLanguages from './locales/ui-languages.json';
|
|
256
|
+
import { loadLocale } from './i18n';
|
|
257
|
+
|
|
258
|
+
function LanguageSelect({
|
|
259
|
+
value,
|
|
260
|
+
onChange,
|
|
261
|
+
}: {
|
|
262
|
+
value: string;
|
|
263
|
+
onChange: (code: string) => void;
|
|
264
|
+
}) {
|
|
265
|
+
const { t, i18n } = useTranslation();
|
|
266
|
+
|
|
267
|
+
const options = useMemo(
|
|
268
|
+
() =>
|
|
269
|
+
(uiLanguages as UiLanguageEntry[]).map((lang) => ({
|
|
270
|
+
code: lang.code,
|
|
271
|
+
// Settings/content dropdowns: shows translated name when available
|
|
272
|
+
label: getUILanguageLabel(lang, t),
|
|
273
|
+
// Header globe menu: shows "English / Deutsch"-style label, no t() call
|
|
274
|
+
nativeLabel: getUILanguageLabelNative(lang),
|
|
275
|
+
})),
|
|
276
|
+
[t]
|
|
277
|
+
);
|
|
278
|
+
|
|
279
|
+
const handleChange = async (code: string) => {
|
|
280
|
+
await loadLocale(code);
|
|
281
|
+
i18n.changeLanguage(code);
|
|
282
|
+
onChange(code);
|
|
283
|
+
};
|
|
284
|
+
|
|
285
|
+
return (
|
|
286
|
+
<select value={value} onChange={(e) => handleChange(e.target.value)}>
|
|
287
|
+
{options.map((row) => (
|
|
288
|
+
<option key={row.code} value={row.code}>
|
|
289
|
+
{row.label}
|
|
290
|
+
</option>
|
|
291
|
+
))}
|
|
292
|
+
</select>
|
|
293
|
+
);
|
|
294
|
+
}
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
`getUILanguageLabel(lang, t)` - muestra `t(englishName)` cuando está traducido, o `englishName / t(englishName)` cuando ambos difieren. Adecuado para pantallas de configuración.
|
|
298
|
+
|
|
299
|
+
`getUILanguageLabelNative(lang)` - muestra `englishName / label` (sin llamada a `t()` en cada fila). Adecuado para menús de cabecera donde se desea que el nombre nativo sea visible.
|
|
300
|
+
|
|
301
|
+
El manifiesto `ui-languages.json` es un array JSON de entradas <code>{"{ code, label, englishName }"}</code>. Ejemplo:
|
|
302
|
+
|
|
303
|
+
```json
|
|
304
|
+
[
|
|
305
|
+
{ "code": "en-GB", "label": "English (UK)", "englishName": "English (UK)" },
|
|
306
|
+
{ "code": "pt-BR", "label": "Português (BR)", "englishName": "Portuguese (BR)" },
|
|
307
|
+
{ "code": "de", "label": "Deutsch", "englishName": "German" },
|
|
308
|
+
{ "code": "fr", "label": "Français", "englishName": "French" },
|
|
309
|
+
{ "code": "ar", "label": "العربية", "englishName": "Arabic" }
|
|
310
|
+
]
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
Establece `targetLocales` en la configuración a la ruta de este archivo para que el comando de traducción utilice la misma lista.
|
|
314
|
+
|
|
315
|
+
### Idiomas RTL
|
|
316
|
+
|
|
317
|
+
`ai-i18n-tools` exporta `getTextDirection(lng)` y `applyDirection(lng)`:
|
|
318
|
+
|
|
319
|
+
```js
|
|
320
|
+
import { getTextDirection, applyDirection } from 'ai-i18n-tools/runtime';
|
|
321
|
+
|
|
322
|
+
getTextDirection('ar') // 'rtl'
|
|
323
|
+
getTextDirection('en-GB') // 'ltr'
|
|
324
|
+
|
|
325
|
+
// Applied automatically via i18n.on('languageChanged', applyDirection) - see Step 4
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
`applyDirection` establece `document.documentElement.dir` (navegador) o es una operación no efectiva (Node.js). Pasa un argumento opcional `element` para dirigir un elemento específico.
|
|
329
|
+
|
|
330
|
+
Para cadenas que pueden contener flechas `→`, inviértelas para diseños RTL:
|
|
331
|
+
|
|
332
|
+
```js
|
|
333
|
+
import { flipUiArrowsForRtl } from 'ai-i18n-tools/runtime';
|
|
334
|
+
const { i18n } = useTranslation();
|
|
335
|
+
const isRtl = getTextDirection(i18n.language) === 'rtl';
|
|
336
|
+
const label = flipUiArrowsForRtl(t('Next → Step'), isRtl);
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
## Flujo de trabajo 2 - Traducción de documentos
|
|
342
|
+
|
|
343
|
+
Diseñado para documentación en markdown, sitios Docusaurus y archivos de etiquetas JSON. Los recursos SVG independientes se traducen mediante [`translate-svg`](#cli-reference) cuando `features.translateSVG` está habilitado y se establece el bloque `svg` de nivel superior — no mediante `documentations[].contentPaths`.
|
|
344
|
+
|
|
345
|
+
### Paso 1: Inicializar
|
|
346
|
+
|
|
347
|
+
```bash
|
|
348
|
+
npx ai-i18n-tools init -t ui-docusaurus
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
Edita el `ai-i18n-tools.config.json` generado:
|
|
352
|
+
|
|
353
|
+
- `sourceLocale` - idioma de origen (debe coincidir con `defaultLocale` en `docusaurus.config.js`).
|
|
354
|
+
- `targetLocales` - matriz de códigos de configuración regional o ruta a un manifiesto.
|
|
355
|
+
- `cacheDir` - directorio de caché compartido SQLite para todas las canalizaciones de documentación (y directorio de registro predeterminado para `--write-logs`).
|
|
356
|
+
- `documentations` - matriz de bloques de documentación. Cada bloque tiene `description`, `contentPaths`, `outputDir`, `jsonSource` opcional, `markdownOutput`, `targetLocales`, `addFrontmatter`, etc.
|
|
357
|
+
- `documentations[].description` - nota corta opcional para mantenedores (qué cubre este bloque). Cuando se establece, aparece en el encabezado de `translate-docs` (`🌐 …: traduciendo …`) y en los encabezados de sección `status`.
|
|
358
|
+
- `documentations[].contentPaths` - directorios o archivos fuente markdown/MDX (ver también `documentations[].jsonSource` para etiquetas JSON).
|
|
359
|
+
- `documentations[].outputDir` - raíz de salida traducida para ese bloque.
|
|
360
|
+
- `documentations[].markdownOutput.style` - `"nested"` (predeterminado), `"docusaurus"` o `"flat"` (ver [Diseños de salida](#output-layouts)).
|
|
361
|
+
|
|
362
|
+
### Paso 2: Traducir documentos
|
|
363
|
+
|
|
364
|
+
```bash
|
|
365
|
+
npx ai-i18n-tools translate-docs
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
Esto traduce todos los archivos en cada bloque de `documentaciones` en `contentPaths` a todos los locales de documentación efectivos (unión de los `targetLocales` de cada bloque cuando se establece, de lo contrario, los `targetLocales` raíz). Los segmentos ya traducidos se sirven desde la caché de SQLite; solo se envían segmentos nuevos o cambiados al LLM.
|
|
369
|
+
|
|
370
|
+
Para traducir un solo locale:
|
|
371
|
+
|
|
372
|
+
```bash
|
|
373
|
+
npx ai-i18n-tools translate-docs --locale de
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
Para comprobar qué necesita traducción:
|
|
377
|
+
|
|
378
|
+
```bash
|
|
379
|
+
npx ai-i18n-tools status
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
#### Comportamiento de la caché y banderas de `translate-docs`
|
|
383
|
+
|
|
384
|
+
La CLI mantiene **seguimiento de archivos** en SQLite (hash de origen por archivo × locale) y filas de **segmentos** (hash × locale por fragmento traducible). Una ejecución normal omite un archivo por completo cuando el hash rastreado coincide con la fuente actual **y** el archivo de salida ya existe; de lo contrario, procesa el archivo y utiliza la caché de segmentos para que el texto sin cambios no llame a la API.
|
|
385
|
+
|
|
386
|
+
| Bandera | Efecto |
|
|
387
|
+
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
388
|
+
| *(por defecto)* | Omite archivos sin cambios cuando el seguimiento y la salida en disco coinciden; usa la caché de segmentos para el resto. |
|
|
389
|
+
| `--force-update` | Vuelve a procesar cada archivo coincidente (extrae, reensambla, escribe salidas) incluso cuando el seguimiento de archivos lo omitiría. **La caché de segmentos aún se aplica**: los segmentos sin cambios no se envían al LLM. |
|
|
390
|
+
| `--force` | Borra el seguimiento de archivos para cada archivo procesado y **no lee** la caché de segmentos para la traducción de la API (retraducción completa). Los nuevos resultados aún se **escriben** en la caché de segmentos. |
|
|
391
|
+
| `--stats` | Muestra los conteos de segmentos, el número de archivos rastreados y los totales de segmentos por configuración regional, luego finaliza. |
|
|
392
|
+
| `--clear-cache [locale]` | Elimina las traducciones en caché (y el seguimiento de archivos): todas las configuraciones regionales o una sola, luego finaliza. |
|
|
393
|
+
| `--prompt-format <mode>` | Cómo se envía cada **lote** de segmentos al modelo y se analiza (`xml`, `json-array` o `json-object`). Por defecto **`xml`**. No cambia la extracción, los marcadores de posición, la validación, la caché ni el comportamiento de respaldo; véase [Formato del lote de indicaciones](#batch-prompt-format). |
|
|
394
|
+
|
|
395
|
+
No puedes combinar `--force` con `--force-update` (son mutuamente excluyentes).
|
|
396
|
+
|
|
397
|
+
#### Formato del lote de indicaciones
|
|
398
|
+
|
|
399
|
+
`translate-docs` envía segmentos traducibles a OpenRouter en **lotes** (agrupados por `batchSize` / `maxBatchChars`). La bandera **`--prompt-format`** solo cambia el **formato de transmisión** de ese lote; la división de segmentos, los tokens de `PlaceholderHandler`, las comprobaciones del AST de markdown, las claves de caché SQLite y la recuperación por segmento cuando falla el análisis del lote permanecen sin cambios.
|
|
400
|
+
|
|
401
|
+
| Modo | Mensaje del usuario | Respuesta del modelo |
|
|
402
|
+
| ---- | ------------ | ----------- |
|
|
403
|
+
| **`xml`** (por defecto) | Pseudo-XML: un `<seg id="N">…</seg>` por segmento (con escape XML). | Solo bloques `<t id="N">…</t>`, uno por índice de segmento. |
|
|
404
|
+
| **`json-array`** | Un array JSON de cadenas, una entrada por segmento en orden. | Un array JSON de la **misma longitud** (mismo orden). |
|
|
405
|
+
| **`json-object`** | Un objeto JSON `{"0":"…","1":"…",…}` con claves por índice de segmento. | Un objeto JSON con las **mismas claves** y valores traducidos. |
|
|
406
|
+
|
|
407
|
+
El encabezado de ejecución también imprime `Batch prompt format: …` para que pueda confirmar el modo activo. Los archivos de etiquetas JSON (`jsonSource`) y los lotes SVG independientes usan la misma configuración cuando esos pasos se ejecutan como parte de `translate-docs` (o la fase de documentos de `sync` — `sync` no expone esta bandera; por defecto es **`xml`**).
|
|
408
|
+
|
|
409
|
+
**Dedupe de segmentos y rutas en SQLite**
|
|
410
|
+
|
|
411
|
+
- Las filas de segmentos están indexadas globalmente por `(source_hash, locale)` (hash = contenido normalizado). Un texto idéntico en dos archivos comparte una sola fila; `translations.filepath` es metadato (último escritor), no una entrada de caché adicional por archivo.
|
|
412
|
+
- `file_tracking.filepath` utiliza claves con espacio de nombres: `doc-block:{index}:{relPath}` por bloque `documentations` (`relPath` es una ruta posix relativa a la raíz del proyecto: rutas markdown tal como se recopilan; **los archivos de etiquetas JSON usan la ruta relativa al directorio actual del proceso (cwd) del archivo fuente**, por ejemplo, `docs-site/i18n/en/code.json`, para que la limpieza pueda resolver el archivo real), y `svg-assets:{relPath}` para activos SVG independientes bajo `translate-svg`.
|
|
413
|
+
- `translations.filepath` almacena rutas posix relativas al directorio actual (cwd) para segmentos markdown, JSON y SVG (SVG usa la misma forma de ruta que otros activos; el prefijo `svg-assets:…` está **solo** en `file_tracking`).
|
|
414
|
+
- Después de una ejecución, `last_hit_at` se borra solo para las filas de segmentos **en el mismo ámbito de traducción** (respetando `--path` y los tipos habilitados) que no fueron alcanzados, por lo que una ejecución filtrada o solo de documentos no marca como obsoletos archivos no relacionados.
|
|
415
|
+
|
|
416
|
+
### Diseños de salida
|
|
417
|
+
|
|
418
|
+
`"nested"` (por defecto cuando se omite) — refleja el árbol de origen bajo `{outputDir}/{locale}/` (por ejemplo, `docs/guide.md` → `i18n/de/docs/guide.md`).
|
|
419
|
+
|
|
420
|
+
`"docusaurus"` — coloca los archivos que están bajo `docsRoot` en `i18n/<locale>/docusaurus-plugin-content-docs/current/<relativeToDocsRoot>`, coincidiendo con el diseño habitual de i18n de Docusaurus. Establezca `documentations[].markdownOutput.docsRoot` a la raíz de origen de sus documentos (por ejemplo, `"docs"`).
|
|
421
|
+
|
|
422
|
+
```
|
|
423
|
+
docs/guide.md → i18n/de/docusaurus-plugin-content-docs/current/guide.md
|
|
424
|
+
i18n/en/sidebar.json → i18n/de/sidebar.json (JSON label files)
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
`"flat"` - coloca los archivos traducidos junto al origen con un sufijo de configuración regional, o en un subdirectorio. Los enlaces relativos entre páginas se reescriben automáticamente.
|
|
428
|
+
|
|
429
|
+
```
|
|
430
|
+
docs/guide.md → i18n/guide.de.md
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
Puedes sobrescribir rutas completamente con `documentations[].markdownOutput.pathTemplate`. Marcadores de posición: <code>{"{outputDir}"}</code>, <code>{"{locale}"}</code>, <code>{"{LOCALE}"}</code>, <code>{"{relPath}"}</code>, <code>{"{stem}"}</code>, <code>{"{basename}"}</code>, <code>{"{extension}"}</code>, <code>{"{docsRoot}"}</code>, <code>{"{relativeToDocsRoot}"}</code>.
|
|
434
|
+
|
|
435
|
+
---
|
|
436
|
+
|
|
437
|
+
## Flujo de trabajo combinado (UI + Documentos)
|
|
438
|
+
|
|
439
|
+
Habilita todas las funciones en una sola configuración para ejecutar ambos flujos de trabajo juntos:
|
|
440
|
+
|
|
441
|
+
```json
|
|
442
|
+
{
|
|
443
|
+
"sourceLocale": "en-GB",
|
|
444
|
+
"targetLocales": "src/locales/ui-languages.json",
|
|
445
|
+
"features": {
|
|
446
|
+
"extractUIStrings": true,
|
|
447
|
+
"translateUIStrings": true,
|
|
448
|
+
"translateMarkdown": true,
|
|
449
|
+
"translateJSON": false,
|
|
450
|
+
"translateSVG": false
|
|
451
|
+
},
|
|
452
|
+
"glossary": {
|
|
453
|
+
"uiGlossary": "src/locales/strings.json",
|
|
454
|
+
"userGlossary": "glossary-user.csv"
|
|
455
|
+
},
|
|
456
|
+
"ui": {
|
|
457
|
+
"sourceRoots": ["src/"],
|
|
458
|
+
"stringsJson": "src/locales/strings.json",
|
|
459
|
+
"flatOutputDir": "src/locales/"
|
|
460
|
+
},
|
|
461
|
+
"cacheDir": ".translation-cache",
|
|
462
|
+
"documentations": [
|
|
463
|
+
{
|
|
464
|
+
"contentPaths": ["docs/"],
|
|
465
|
+
"outputDir": "i18n/",
|
|
466
|
+
"markdownOutput": { "style": "flat" }
|
|
467
|
+
}
|
|
468
|
+
]
|
|
469
|
+
}
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
`glossary.uiGlossary` apunta la traducción de documentos al mismo catálogo `strings.json` que la UI para que la terminología se mantenga consistente; `glossary.userGlossary` añade sobrescrituras CSV para términos de producto.
|
|
473
|
+
|
|
474
|
+
Ejecuta `npx ai-i18n-tools sync` para ejecutar una canalización: **extraer** cadenas de interfaz de usuario (si `features.extractUIStrings`), **traducir** cadenas de interfaz de usuario (si `features.translateUIStrings`), **traducir recursos SVG independientes** (si `features.translateSVG` y un bloque `svg` están establecidos), y luego **traducir documentación** (cada bloque `documentations`: markdown/JSON según esté configurado). Omite partes con `--no-ui`, `--no-svg` o `--no-docs`. El paso de documentación acepta `--dry-run`, `-p` / `--path`, `--force` y `--force-update` (los dos últimos solo se aplican cuando se ejecuta la traducción de documentación; se ignoran si pasas `--no-docs`).
|
|
475
|
+
|
|
476
|
+
Usa `documentations[].targetLocales` en un bloque para traducir los archivos de ese bloque a un **subconjunto más pequeño** que la UI (los locales de documentación efectivos son la **unión** entre bloques):
|
|
477
|
+
|
|
478
|
+
```json
|
|
479
|
+
{
|
|
480
|
+
"targetLocales": "src/locales/ui-languages.json",
|
|
481
|
+
"documentations": [
|
|
482
|
+
{
|
|
483
|
+
"contentPaths": ["docs/"],
|
|
484
|
+
"outputDir": "i18n/",
|
|
485
|
+
"targetLocales": ["de", "fr", "es"]
|
|
486
|
+
}
|
|
487
|
+
]
|
|
488
|
+
}
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
---
|
|
492
|
+
|
|
493
|
+
## Referencia de configuración
|
|
494
|
+
|
|
495
|
+
### `sourceLocale`
|
|
496
|
+
|
|
497
|
+
Código BCP-47 para el idioma fuente (por ejemplo, `"en-GB"`, `"en"`, `"pt-BR"`). No se genera un archivo de traducción para esta localidad - la cadena clave en sí es el texto fuente.
|
|
498
|
+
|
|
499
|
+
**Debe coincidir** con `SOURCE_LOCALE` exportado desde tu archivo de configuración i18n en tiempo de ejecución (`src/i18n.ts` / `src/i18n.js`).
|
|
500
|
+
|
|
501
|
+
### `targetLocales`
|
|
502
|
+
|
|
503
|
+
Qué localidades traducir. Acepta:
|
|
504
|
+
|
|
505
|
+
- **Ruta de cadena** a un manifiesto `ui-languages.json` (`"src/locales/ui-languages.json"`). El archivo se carga y se extraen los códigos de localidad.
|
|
506
|
+
- **Array de códigos BCP-47** (`["de", "fr", "es"]`).
|
|
507
|
+
- **Array de un elemento con una ruta** (`["src/locales/ui-languages.json"]`) - mismo comportamiento que la forma de cadena.
|
|
508
|
+
|
|
509
|
+
`targetLocales` es la lista de localidades principal para la traducción de UI y la lista de localidades predeterminada para bloques de documentación. Si prefieres mantener un array explícito aquí pero aún quieres etiquetas impulsadas por el manifiesto y filtrado de localidades, también establece `uiLanguagesPath`.
|
|
510
|
+
|
|
511
|
+
### `uiLanguagesPath` (opcional)
|
|
512
|
+
|
|
513
|
+
Ruta a un manifiesto `ui-languages.json` utilizado para nombres de visualización, filtrado de localidades y post-procesamiento de lista de idiomas.
|
|
514
|
+
|
|
515
|
+
Usa esto cuando:
|
|
516
|
+
|
|
517
|
+
- `targetLocales` es un array explícito, pero aún quieres etiquetas en inglés/nativas del manifiesto.
|
|
518
|
+
- Quieres que `markdownOutput.postProcessing.languageListBlock` construya etiquetas de localidad a partir del mismo manifiesto.
|
|
519
|
+
- Solo se habilita la traducción de UI y deseas que el manifiesto proporcione la lista efectiva de localidades de UI.
|
|
520
|
+
|
|
521
|
+
### `concurrency` (opcional)
|
|
522
|
+
|
|
523
|
+
Máximo **localidades objetivo** traducidas al mismo tiempo (`translate-ui`, `translate-docs`, `translate-svg`, y los pasos correspondientes dentro de `sync`). Si se omite, la CLI utiliza **4** para la traducción de UI y **3** para la traducción de documentación (valores predeterminados integrados). Sobrescribe por ejecución con `-j` / `--concurrency`.
|
|
524
|
+
|
|
525
|
+
### `batchConcurrency` (opcional)
|
|
526
|
+
|
|
527
|
+
**translate-docs** y **translate-svg** (y el paso de documentación de `sync`): solicitudes máximas de **batch** paralelas de OpenRouter por archivo (cada batch puede contener muchos segmentos). Por defecto **4** cuando se omite. Ignorado por `translate-ui`. Sobrescribir con `-b` / `--batch-concurrency`. En `sync`, `-b` se aplica solo al paso de traducción de documentación.
|
|
528
|
+
|
|
529
|
+
### `batchSize` / `maxBatchChars` (opcional)
|
|
530
|
+
|
|
531
|
+
Agrupación de segmentos para la traducción de documentos: cuántos segmentos por solicitud de API y un límite de caracteres. Por defecto: **20** segmentos, **4096** caracteres (cuando se omite).
|
|
532
|
+
|
|
533
|
+
### `openrouter`
|
|
534
|
+
|
|
535
|
+
| Campo | Descripción |
|
|
536
|
+
| ------------------- | ---------------------------------------------------------------------------------------- |
|
|
537
|
+
| `baseUrl` | URL base de la API de OpenRouter. Por defecto: `https://openrouter.ai/api/v1`. |
|
|
538
|
+
| `translationModels` | Lista ordenada preferida de IDs de modelos. Se intenta primero el primero; las entradas posteriores son alternativas en caso de error. Para `translate-ui` solo**, también puede establecer `ui.preferredModel` para probar un modelo antes de esta lista (véase `ui`). |
|
|
539
|
+
| `defaultModel` | Modelo principal único heredado. Se usa solo cuando `translationModels` no está establecido o está vacío. |
|
|
540
|
+
| `fallbackModel` | Modelo de respaldo único heredado. Se usa tras `defaultModel` cuando `translationModels` no está establecido o está vacío. |
|
|
541
|
+
| `maxTokens` | Número máximo de tokens de finalización por solicitud. Por defecto: `8192`. |
|
|
542
|
+
| `temperature` | Temperatura de muestreo. Por defecto: `0.2`. |
|
|
543
|
+
|
|
544
|
+
Establece `OPENROUTER_API_KEY` en tu entorno o archivo `.env`.
|
|
545
|
+
|
|
546
|
+
### `features`
|
|
547
|
+
|
|
548
|
+
| Campo | Flujo de trabajo | Descripción |
|
|
549
|
+
| -------------------- | --------------- | ----------------------------------------------------------------- |
|
|
550
|
+
| `extractUIStrings` | 1 | Escanea la fuente en busca de `t("…")` y escribe/fusiona `strings.json`. |
|
|
551
|
+
| `translateUIStrings` | 1 | Traduce las entradas de `strings.json` y escribe archivos JSON por configuración regional. |
|
|
552
|
+
| `translateMarkdown` | 2 | Traduce archivos `.md` / `.mdx`. |
|
|
553
|
+
| `translateJSON` | 2 | Traduce archivos de etiquetas JSON de Docusaurus. |
|
|
554
|
+
| `translateSVG` | 2 | Traduce recursos `.svg` independientes (requiere el bloque `svg` de nivel superior). |
|
|
555
|
+
|
|
556
|
+
Traduce recursos SVG **independientes** con `translate-svg` cuando `features.translateSVG` es verdadero y se configura un bloque `svg` de nivel superior. El comando `sync` ejecuta ese paso cuando ambos están establecidos (a menos que se use `--no-svg`).
|
|
557
|
+
|
|
558
|
+
### `ui`
|
|
559
|
+
|
|
560
|
+
| Campo | Descripción |
|
|
561
|
+
| --------------------------- | ----------------------------------------------------------------------- |
|
|
562
|
+
| `sourceRoots` | Directorios (relativos al directorio de trabajo actual) que se exploran en busca de llamadas a `t("…")`. |
|
|
563
|
+
| `stringsJson` | Ruta al archivo de catálogo maestro. Es actualizado por `extract`. |
|
|
564
|
+
| `flatOutputDir` | Directorio donde se escriben los archivos JSON por configuración regional (`de.json`, etc.). |
|
|
565
|
+
| `preferredModel` | Opcional. ID del modelo de OpenRouter que se intenta primero solo para `translate-ui`; luego se usan `openrouter.translationModels` (o modelos heredados) en orden, sin duplicar este ID. |
|
|
566
|
+
| `reactExtractor.funcNames` | Nombres adicionales de funciones a explorar (por defecto: `["t", "i18n.t"]`). |
|
|
567
|
+
| `reactExtractor.extensions` | Extensiones de archivo a incluir (por defecto: `[".js", ".jsx", ".ts", ".tsx"]`). |
|
|
568
|
+
| `reactExtractor.includePackageDescription` | Cuando es `true` (por defecto), `extract` también incluye la `description` de `package.json` como cadena de interfaz de usuario si está presente. |
|
|
569
|
+
| `reactExtractor.packageJsonPath` | Ruta personalizada al archivo `package.json` utilizado para esa extracción opcional de la descripción.
|
|
570
|
+
|
|
571
|
+
### `cacheDir`
|
|
572
|
+
|
|
573
|
+
| Campo | Descripción |
|
|
574
|
+
| ---------- | ----------------------------------------------------------------------------- |
|
|
575
|
+
| `cacheDir` | Directorio de caché SQLite (compartido por todos los bloques de `documentations`). Reutilizar entre ejecuciones. |
|
|
576
|
+
|
|
577
|
+
### `documentations`
|
|
578
|
+
|
|
579
|
+
Array de bloques de documentación del pipeline. `translate-docs` y la fase de documentación del proceso `sync` **cada uno** procesa los bloques en orden.
|
|
580
|
+
|
|
581
|
+
| Campo | Descripción |
|
|
582
|
+
| -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
583
|
+
| `description` | Nota opcional legible para humanos sobre este bloque (no se utiliza para la traducción). Se antepone en el encabezado `translate-docs` con el icono `🌐` cuando está definida; también se muestra en los encabezados de la sección `status`. |
|
|
584
|
+
| `contentPaths` | Fuentes Markdown/MDX a traducir (`translate-docs` escanea estos directorios en busca de archivos `.md` / `.mdx`). Las etiquetas JSON provienen de `jsonSource` en el mismo bloque. |
|
|
585
|
+
| `outputDir` | Directorio raíz para la salida traducida de este bloque. |
|
|
586
|
+
| `sourceFiles` | Alias opcional que se combina con `contentPaths` al cargar. |
|
|
587
|
+
| `targetLocales` | Subconjunto opcional de configuraciones regionales solo para este bloque (en caso contrario, se usa `targetLocales` raíz). Las configuraciones regionales efectivas para la documentación son la unión entre todos los bloques. |
|
|
588
|
+
| `jsonSource` | Directorio fuente para los archivos JSON de etiquetas de Docusaurus para este bloque (por ejemplo, `"i18n/en"`). |
|
|
589
|
+
| `markdownOutput.style` | `"nested"` (predeterminado), `"docusaurus"` o `"flat"`. |
|
|
590
|
+
| `markdownOutput.docsRoot` | Raíz del directorio de documentación fuente para el diseño Docusaurus (por ejemplo, `"docs"`). |
|
|
591
|
+
| `markdownOutput.pathTemplate` | Ruta personalizada para la salida en markdown. Marcadores de posición: <code>{"{outputDir}"}</code>, <code>{"{locale}"}</code>, <code>{"{LOCALE}"}</code>, <code>{"{relPath}"}</code>, <code>{"{stem}"}</code>, <code>{"{basename}"}</code>, <code>{"{extension}"}</code>, <code>{"{docsRoot}"}</code>, <code>{"{relativeToDocsRoot}"}</code>. |
|
|
592
|
+
| `markdownOutput.jsonPathTemplate` | Ruta personalizada para archivos JSON de etiquetas. Admite los mismos marcadores de posición que `pathTemplate`. |
|
|
593
|
+
| `markdownOutput.flatPreserveRelativeDir` | Para el estilo `flat`, mantener los subdirectorios de origen para que los archivos con el mismo nombre base no entren en conflicto. |
|
|
594
|
+
| `markdownOutput.rewriteRelativeLinks` | Reescribir enlaces relativos tras la traducción (activado automáticamente para el estilo `flat`). |
|
|
595
|
+
| `markdownOutput.linkRewriteDocsRoot` | Raíz del repositorio utilizada al calcular los prefijos de reescritura de enlaces planos. Por lo general, déjelo como `"."` a menos que sus documentos traducidos estén ubicados bajo una raíz de proyecto diferente. |
|
|
596
|
+
| `markdownOutput.postProcessing` | Transformaciones opcionales en el **cuerpo** del markdown traducido (el front matter YAML se conserva). Se ejecuta después de la recombinación de segmentos y la reescritura de enlaces planos, y antes de `addFrontmatter`. |
|
|
597
|
+
| `markdownOutput.postProcessing.regexAdjustments` | Lista ordenada de `{ "description"?, "search", "replace" }`. `search` es un patrón de expresión regular (una cadena simple usa la bandera `g`, o `/patrón/banderas`). `replace` admite marcadores de posición como `${translatedLocale}`, `${sourceLocale}`, `${sourceFullPath}`, `${translatedFullPath}`, `${sourceFilename}`, `${translatedFilename}`, `${sourceBasedir}`, `${translatedBasedir}` (misma idea que el ejemplo de `additional-adjustments`). |
|
|
598
|
+
| `markdownOutput.postProcessing.languageListBlock` | `{ "start", "end", "separator" }` — el traductor busca la primera línea que contenga `start` y la línea `end` correspondiente, luego reemplaza ese fragmento con un selector de idioma canónico. Los enlaces se construyen con rutas relativas al archivo traducido; las etiquetas provienen de `uiLanguagesPath` / `ui-languages.json` cuando están configuradas, de lo contrario, de `localeDisplayNames` y los códigos de configuración regional. |
|
|
599
|
+
| `addFrontmatter` | Cuando es `true` (predeterminado si se omite), los archivos markdown traducidos incluyen claves YAML: `translation_last_updated`, `source_file_mtime`, `source_file_hash`, `translation_language`, `source_file_path`, y cuando al menos un segmento tiene metadatos del modelo, `translation_models` (lista ordenada de identificadores de modelos OpenRouter utilizados). Establezca en `false` para omitirlo. |
|
|
600
|
+
|
|
601
|
+
Ejemplo (pipeline README plano — rutas de captura de pantalla + envoltura de lista de idiomas opcional):
|
|
602
|
+
|
|
603
|
+
```json
|
|
604
|
+
"markdownOutput": {
|
|
605
|
+
"style": "flat",
|
|
606
|
+
"postProcessing": {
|
|
607
|
+
"regexAdjustments": [
|
|
608
|
+
{
|
|
609
|
+
"description": "Per-locale screenshot folders",
|
|
610
|
+
"search": "images/screenshots/[^/]+/",
|
|
611
|
+
"replace": "images/screenshots/${translatedLocale}/"
|
|
612
|
+
}
|
|
613
|
+
],
|
|
614
|
+
"languageListBlock": {
|
|
615
|
+
"start": "<small id=\"lang-list\">",
|
|
616
|
+
"end": "</small>",
|
|
617
|
+
"separator": " · "
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
```
|
|
622
|
+
|
|
623
|
+
### `svg` (opcional)
|
|
624
|
+
|
|
625
|
+
Rutas y disposición de nivel superior para recursos SVG independientes. La traducción se ejecuta solo cuando **`features.translateSVG`** es verdadero (mediante `translate-svg` o la etapa SVG de `sync`).
|
|
626
|
+
|
|
627
|
+
| Campo | Descripción |
|
|
628
|
+
| --------------------------- | ----------- |
|
|
629
|
+
| `sourcePath` | Un directorio o un array de directorios escaneados recursivamente en busca de archivos `.svg`. |
|
|
630
|
+
| `outputDir` | Directorio raíz para la salida SVG traducida. |
|
|
631
|
+
| `style` | `"plano"` o `"nidificado"` cuando `pathTemplate` no está establecido. |
|
|
632
|
+
| `pathTemplate` | Ruta de salida SVG personalizada. Marcadores de posición: <code>{"{outputDir}"}</code>, <code>{"{locale}"}</code>, <code>{"{LOCALE}"}</code>, <code>{"{relPath}"}</code>, <code>{"{stem}"}</code>, <code>{"{basename}"}</code>, <code>{"{extension}"}</code>, <code>{"{relativeToSourceRoot}"}</code>. |
|
|
633
|
+
| `svgExtractor.forceLowercase` | Texto traducido en minúsculas en el reensamblaje de SVG. Útil para diseños que dependen de etiquetas en minúsculas. |
|
|
634
|
+
|
|
635
|
+
### `glossary`
|
|
636
|
+
|
|
637
|
+
| Campo | Descripción |
|
|
638
|
+
| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
639
|
+
| `uiGlossary` | Ruta a `strings.json` - crea automáticamente un glosario a partir de las traducciones existentes. |
|
|
640
|
+
| `userGlossary` | Ruta a un archivo CSV con columnas `Original language string` (o `en`), `locale`, `Translation` - una fila por término fuente y configuración regional de destino (`locale` puede ser `*` para todos los destinos).
|
|
641
|
+
|
|
642
|
+
La clave heredada `uiGlossaryFromStringsJson` todavía se acepta y se mapea a `uiGlossary` al cargar la configuración.
|
|
643
|
+
|
|
644
|
+
Generar un CSV de glosario vacío:
|
|
645
|
+
|
|
646
|
+
```bash
|
|
647
|
+
npx ai-i18n-tools glossary-generate
|
|
648
|
+
```
|
|
649
|
+
|
|
650
|
+
---
|
|
651
|
+
|
|
652
|
+
## Referencia de CLI
|
|
653
|
+
|
|
654
|
+
| Comando | Descripción |
|
|
655
|
+
| ------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
656
|
+
| `init [-t ui-markdown|ui-docusaurus] [-o path] [--with-translate-ignore]` | Escribe un archivo de configuración inicial (incluye `concurrency`, `batchConcurrency`, `batchSize`, `maxBatchChars` y `documentations[].addFrontmatter`). `--with-translate-ignore` crea un `.translate-ignore` inicial. |
|
|
657
|
+
| `extract` | Escanea el código fuente en busca de llamadas a `t("…")` y actualiza `strings.json`. Requiere `features.extractUIStrings`. |
|
|
658
|
+
| `translate-docs …` | Traduce markdown/MDX y JSON para cada bloque `documentations` (`contentPaths`, opcional `jsonSource`). `-j`: número máximo de idiomas en paralelo; `-b`: número máximo de llamadas paralelas a la API por archivo. `--prompt-format`: formato de lote (`xml` \| `json-array` \| `json-object`). Consulta [Comportamiento de caché y banderas `translate-docs`](#cache-behaviour-and-translate-docs-flags) y [Formato del lote de prompts](#batch-prompt-format). |
|
|
659
|
+
| `translate-svg …` | Traduce recursos SVG independientes configurados en `config.svg` (separado de la documentación). Requiere `features.translateSVG`. Misma lógica de caché que la documentación; admite `--no-cache` para omitir lecturas/escrituras en SQLite durante esa ejecución. `-j`, `-b`, `--force`, `--force-update`, `-p` / `--path`, `--dry-run`. |
|
|
660
|
+
| `translate-ui [--locale <code>] [--force] [--dry-run] [-j <n>]` | Traduce únicamente las cadenas de la interfaz de usuario. `--force`: vuelve a traducir todas las entradas por idioma (ignora traducciones existentes). `--dry-run`: sin escrituras, sin llamadas a la API. `-j`: número máximo de idiomas en paralelo. Requiere `features.translateUIStrings`. |
|
|
661
|
+
| `export-ui-xliff [-l <codes>] [-o <dir>] [--untranslated-only] [--dry-run]` | Exporta `strings.json` a XLIFF 2.0 (un `.xliff` por idioma de destino). `-o` / `--output-dir`: directorio de salida (por defecto: misma carpeta que el catálogo). `--untranslated-only`: solo unidades sin traducción para ese idioma. Solo lectura; sin API. |
|
|
662
|
+
| `sync …` | Extrae (si está habilitado), luego traducción de la interfaz, luego `translate-svg` cuando `features.translateSVG` y `config.svg` están configurados, luego traducción de la documentación, a menos que se omita con `--no-ui`, `--no-svg` o `--no-docs`. Banderas compartidas: `-l`, `-p`, `--dry-run`, `-j`, `-b` (solo agrupación de documentación), `--force` / `--force-update` (solo documentación; se excluyen mutuamente cuando se ejecuta la documentación). |
|
|
663
|
+
| `status` | Muestra el estado de traducción de markdown por archivo × idioma (sin filtro `--locale`; los idiomas provienen de la configuración). |
|
|
664
|
+
| `cleanup [--dry-run] [--no-backup] [--backup <path>]` | Ejecuta primero `sync --force-update` (extracción, interfaz, SVG, documentación), luego elimina filas de segmentos obsoletas (`last_hit_at` nulo / ruta de archivo vacía); elimina filas `file_tracking` cuya ruta de origen resuelta no existe en el disco; elimina filas de traducción cuyos metadatos `filepath` apuntan a un archivo faltante. Registra tres conteos (obsoletos, `file_tracking` huérfanos, traducciones huérfanas). Crea una copia de seguridad de SQLite con marca de tiempo en el directorio de caché a menos que se use `--no-backup`. |
|
|
665
|
+
| `editor [-p <port>] [--no-open]` | Inicia un editor web local para la caché, `strings.json` y el archivo CSV del glosario. `--no-open`: no abre automáticamente el navegador predeterminado.<br><br>**Nota:** Si editas una entrada en el editor de caché, debes ejecutar un `sync --force-update` para reescribir los archivos de salida con la entrada de caché actualizada. Además, si el texto fuente cambia más adelante, la edición manual se perderá porque se genera una nueva clave de caché. |
|
|
666
|
+
| `glossary-generate [-o <path>]` | Escribe una plantilla `glossary-user.csv` vacía. `-o`: sobrescribe la ruta de salida (por defecto: `glossary.userGlossary` de la configuración, o `glossary-user.csv`). |
|
|
667
|
+
|
|
668
|
+
Todos los comandos aceptan `-c <path>` para especificar un archivo de configuración no predeterminado, `-v` para salida detallada, y `-w` / `--write-logs [path]` para enviar la salida de la consola a un archivo de registro (ruta predeterminada: bajo `cacheDir` en la raíz).
|
|
669
|
+
|
|
670
|
+
---
|
|
671
|
+
|
|
672
|
+
## Variables de entorno
|
|
673
|
+
|
|
674
|
+
| Variable | Descripción |
|
|
675
|
+
| ---------------------- | --------------------------------------------------------- |
|
|
676
|
+
| `OPENROUTER_API_KEY` | **Requerido.** Tu clave API de OpenRouter. |
|
|
677
|
+
| `OPENROUTER_BASE_URL` | Sobrescribir la URL base de la API. |
|
|
678
|
+
| `I18N_SOURCE_LOCALE` | Sobrescribir `sourceLocale` en tiempo de ejecución. |
|
|
679
|
+
| `I18N_TARGET_LOCALES` | Códigos de locales separados por comas para sobrescribir `targetLocales`. |
|
|
680
|
+
| `I18N_LOG_LEVEL` | Nivel del registrador (`debug`, `info`, `warn`, `error`, `silent`). |
|
|
681
|
+
| `NO_COLOR` | Cuando `1`, deshabilitar colores ANSI en la salida del registro. |
|
|
682
|
+
| `I18N_LOG_SESSION_MAX` | Máximas líneas mantenidas por sesión de registro (predeterminado `5000`). |
|