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: Introdução
|
|
2
|
+
|
|
3
|
+
`ai-i18n-tools` fornece dois fluxos de trabalho independentes e compostáveis:
|
|
4
|
+
|
|
5
|
+
- **Workflow 1 - UI Translation**: extrai chamadas `t("…")` de qualquer fonte JS/TS, traduz por meio do OpenRouter e gera arquivos JSON planos por localidade, prontos para uso com i18next.
|
|
6
|
+
- **Workflow 2 - Document Translation**: traduz arquivos markdown (MDX) e arquivos JSON de rótulos do Docusaurus para qualquer número de localidades, com cache inteligente. Ativos **SVG** usam `features.translateSVG`, o bloco `svg` de nível superior e `translate-svg` (veja [referência da CLI](#cli-reference)).
|
|
7
|
+
|
|
8
|
+
Ambos os fluxos de trabalho usam OpenRouter (qualquer LLM compatível) e compartilham um único arquivo de configuração.
|
|
9
|
+
|
|
10
|
+
<small>**Leia em outros 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
|
+
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
|
|
17
|
+
<!-- NÃO EDITE ESTA SEÇÃO, EM VEZ DISSO, REEXECUTE doctoc PARA ATUALIZAR -->
|
|
18
|
+
**Tabela de Conteúdos**
|
|
19
|
+
|
|
20
|
+
- [Instalação](#installation)
|
|
21
|
+
- [Primeiros Passos](#quick-start)
|
|
22
|
+
- [Fluxo de trabalho 1 - Tradução de interface](#workflow-1---ui-translation)
|
|
23
|
+
- [Etapa 1: Inicializar](#step-1-initialise)
|
|
24
|
+
- [Etapa 2: Extrair strings](#step-2-extract-strings)
|
|
25
|
+
- [Etapa 3: Traduzir strings da interface](#step-3-translate-ui-strings)
|
|
26
|
+
- [Exportar para XLIFF 2.0 (opcional)](#exporting-to-xliff-20-optional)
|
|
27
|
+
- [Etapa 4: Conectar o i18next em tempo de execução](#step-4-wire-i18next-at-runtime)
|
|
28
|
+
- [Usando `t()` no código-fonte](#using-t-in-source-code)
|
|
29
|
+
- [Interpolação](#interpolation)
|
|
30
|
+
- [Interface de troca de idioma](#language-switcher-ui)
|
|
31
|
+
- [Idiomas RTL](#rtl-languages)
|
|
32
|
+
- [Fluxo de trabalho 2 - Tradução de documentos](#workflow-2---document-translation)
|
|
33
|
+
- [Etapa 1: Inicializar](#step-1-initialise-1)
|
|
34
|
+
- [Etapa 2: Traduzir documentos](#step-2-translate-documents)
|
|
35
|
+
- [Comportamento de cache e flags `translate-docs`](#cache-behaviour-and-translate-docs-flags)
|
|
36
|
+
- [Layouts de saída](#output-layouts)
|
|
37
|
+
- [Fluxo de trabalho combinado (UI + Docs)](#combined-workflow-ui--docs)
|
|
38
|
+
- [Referência de configuração](#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
|
+
- [Referência da CLI](#cli-reference)
|
|
53
|
+
- [Variáveis de ambiente](#environment-variables)
|
|
54
|
+
|
|
55
|
+
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
|
56
|
+
|
|
57
|
+
## Instalação
|
|
58
|
+
|
|
59
|
+
O pacote publicado é **apenas ESM**. Use `import`/`import()` no Node.js ou no seu empacotador; **não use `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
|
+
Defina sua chave de API do OpenRouter:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
export OPENROUTER_API_KEY=sk-or-v1-your-key-here
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Ou crie um arquivo `.env` na raiz do projeto:
|
|
76
|
+
|
|
77
|
+
```env
|
|
78
|
+
OPENROUTER_API_KEY=sk-or-v1-your-key-here
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Início Rápido
|
|
84
|
+
|
|
85
|
+
O template padrão `init` (`ui-markdown`) habilita apenas a extração e tradução de **UI**. O template `ui-docusaurus` habilita a tradução de **documentos** (`translate-docs`). Use `sync` quando você quiser um comando que execute extração, tradução de UI, tradução SVG opcional independente e tradução de documentação de acordo com sua configuração.
|
|
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
|
+
## Fluxo de Trabalho 1 - Tradução de UI
|
|
107
|
+
|
|
108
|
+
Projetado para qualquer projeto JS/TS que use i18next: aplicativos React, Next.js (componentes do cliente e do servidor), serviços Node.js, ferramentas CLI.
|
|
109
|
+
|
|
110
|
+
### Passo 1: Inicializar
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
npx ai-i18n-tools init
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Isso escreve `ai-i18n-tools.config.json` com o template `ui-markdown`. Edite-o para definir:
|
|
117
|
+
|
|
118
|
+
- `sourceLocale` - seu código de idioma BCP-47 de origem (por exemplo, `"en-GB"`). **Deve corresponder** a `SOURCE_LOCALE` exportado do seu arquivo de configuração i18n em tempo de execução (`src/i18n.ts` / `src/i18n.js`).
|
|
119
|
+
- `targetLocales` - caminho para seu manifesto `ui-languages.json` OU um array de códigos BCP-47.
|
|
120
|
+
- `ui.sourceRoots` - diretórios a serem escaneados para chamadas `t("…")` (por exemplo, `["src/"]`).
|
|
121
|
+
- `ui.stringsJson` - onde escrever o catálogo mestre (por exemplo, `"src/locales/strings.json"`).
|
|
122
|
+
- `ui.flatOutputDir` - onde escrever `de.json`, `pt-BR.json`, etc. (por exemplo, `"src/locales/"`).
|
|
123
|
+
- `ui.preferredModel` (opcional) - ID do modelo OpenRouter a ser tentado **primeiro** apenas para `translate-ui`; em caso de falha, o CLI continua com `openrouter.translationModels` (ou os legados `defaultModel` / `fallbackModel`) em ordem, pulando duplicatas.
|
|
124
|
+
|
|
125
|
+
### Etapa 2: Extrair strings
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
npx ai-i18n-tools extract
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Escaneia todos os arquivos JS/TS sob `ui.sourceRoots` em busca de chamadas `t("literal")` e `i18n.t("literal")`. Escreve (ou mescla) em `ui.stringsJson`.
|
|
132
|
+
|
|
133
|
+
O scanner é configurável: adicione nomes de funções personalizadas via `ui.reactExtractor.funcNames`.
|
|
134
|
+
|
|
135
|
+
### Etapa 3: Traduzir strings da UI
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
npx ai-i18n-tools translate-ui
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Lê `strings.json`, envia lotes para o OpenRouter para cada localidade alvo, escreve arquivos JSON planos (`de.json`, `fr.json`, etc.) em `ui.flatOutputDir`. Quando `ui.preferredModel` está definido, esse modelo é tentado antes da lista ordenada em `openrouter.translationModels` (a tradução de documentos e outros comandos ainda usam apenas `openrouter`).
|
|
142
|
+
|
|
143
|
+
Para cada entrada, `translate-ui` armazena o id do modelo **OpenRouter** que traduziu com sucesso cada localidade em um objeto opcional `models` (com as mesmas chaves de localidade que `translated`). Strings editadas no comando local `editor` são marcadas com o valor sentinela `user-edited` em `models` para aquela localidade. Os arquivos planos por localidade em `ui.flatOutputDir` permanecem apenas com **string de origem → tradução**; eles não incluem `models` (assim os pacotes de tempo de execução permanecem inalterados).
|
|
144
|
+
|
|
145
|
+
> **Nota sobre o uso do Editor de Cache:** Se você editar uma entrada no editor de cache, precisará executar um `sync --force-update` (ou o comando `translate` equivalente com `--force-update`) para reescrever os arquivos de saída com a entrada de cache atualizada. Além disso, tenha em mente que se o texto de origem mudar posteriormente, sua edição manual será perdida porque uma nova chave de cache (hash) será gerada para a nova string de origem.
|
|
146
|
+
|
|
147
|
+
### Exportar para XLIFF 2.0 (opcional)
|
|
148
|
+
|
|
149
|
+
Para entregar strings da interface a um fornecedor de tradução, TMS ou ferramenta CAT, exporte o catálogo como **XLIFF 2.0** (um arquivo por localidade de destino). Este comando é **somente leitura**: ele não modifica `strings.json` nem chama nenhuma API.
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
npx ai-i18n-tools export-ui-xliff
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Por padrão, os arquivos são gravados ao lado de `ui.stringsJson`, com nomes como `strings.de.xliff`, `strings.pt-BR.xliff` (nome base do seu catálogo + localidade + `.xliff`). Use `-o` / `--output-dir` para gravar em outro local. As traduções existentes de `strings.json` aparecem em `<target>`; localidades ausentes usam `state="initial"` sem `<target>`, para que as ferramentas possam preenchê-las. Use `--untranslated-only` para exportar apenas unidades que ainda precisam de tradução para cada localidade (útil para lotes enviados a fornecedores). `--dry-run` exibe os caminhos sem gravar os arquivos.
|
|
156
|
+
|
|
157
|
+
### Etapa 4: Conectar i18next em tempo de execução
|
|
158
|
+
|
|
159
|
+
Crie seu arquivo de configuração i18n usando os helpers 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
|
+
Importe `i18n.js` antes que o React renderize (por exemplo, no topo do seu ponto de entrada). Quando o usuário mudar o idioma, chame `await loadLocale(code)` e depois `i18n.changeLanguage(code)`.
|
|
192
|
+
|
|
193
|
+
`SOURCE_LOCALE` é exportado para que qualquer outro arquivo que precise dele (por exemplo, um seletor de idioma) possa importá-lo diretamente de `'./i18n'`.
|
|
194
|
+
|
|
195
|
+
`defaultI18nInitOptions(sourceLocale)` retorna as opções padrão para configurações com chave como padrão:
|
|
196
|
+
|
|
197
|
+
- `parseMissingKeyHandler` retorna a chave em si, para que strings não traduzidas exibam o texto de origem.
|
|
198
|
+
- `nsSeparator: false` permite chaves que contêm dois pontos.
|
|
199
|
+
- `interpolation.escapeValue: false` - seguro para desativar: o React escapa valores por conta própria, e a saída do Node.js/CLI não tem HTML para escapar.
|
|
200
|
+
|
|
201
|
+
`wrapI18nWithKeyTrim(i18n)` envolve `i18n.t` de modo que: (1) as chaves sejam cortadas antes da consulta, correspondendo à forma como o script de extração as armazena; (2) a interpolação <code>{"{{var}}"}</code> seja aplicada quando a localidade de origem retornar a chave crua - assim <code>{"t('Hello {{name}}', { name })"}</code> funciona corretamente mesmo para o idioma de origem.
|
|
202
|
+
|
|
203
|
+
`makeLoadLocale(i18n, loaders, sourceLocale)` retorna uma função assíncrona `loadLocale(lang)` que importa dinamicamente o pacote JSON para uma localidade e o registra no i18next.
|
|
204
|
+
|
|
205
|
+
### Usando `t()` no código fonte
|
|
206
|
+
|
|
207
|
+
Chame `t()` com uma **string literal** para que o script de extração possa encontrá-la:
|
|
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
|
+
O mesmo padrão funciona fora do React (Node.js, componentes do servidor, CLI):
|
|
219
|
+
|
|
220
|
+
```js
|
|
221
|
+
import i18n from './i18n.js';
|
|
222
|
+
console.log(i18n.t('Processing complete'));
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
**Regras:**
|
|
226
|
+
|
|
227
|
+
- Apenas estas formas são extraídas: `t("…")`, `t('…')`, `t(`…`)`, `i18n.t("…")`.
|
|
228
|
+
- A chave deve ser uma **string literal** - sem variáveis ou expressões como chave.
|
|
229
|
+
- Não use literais de template para a chave: <code>{'t(`Hello ${name}`)'}</code> não é extraível.
|
|
230
|
+
|
|
231
|
+
### Interpolação
|
|
232
|
+
|
|
233
|
+
Use a interpolação nativa do segundo argumento do i18next para os marcadores de posição <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
|
+
O script de extração ignora o segundo argumento - apenas a string literal da chave <code>{"\"Hello {{name}}, você tem {{count}} mensagens\""}</code> é extraída e enviada para tradução. Os tradutores são instruídos a preservar os tokens <code>{"{{...}}"}</code>.
|
|
242
|
+
|
|
243
|
+
### UI do seletor de idioma
|
|
244
|
+
|
|
245
|
+
Use o manifesto `ui-languages.json` para construir um seletor de idioma. `ai-i18n-tools` exporta dois auxiliares de exibição:
|
|
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)` - exibe `t(englishName)` quando traduzido, ou `englishName / t(englishName)` quando ambos diferem. Adequado para telas de configurações.
|
|
298
|
+
|
|
299
|
+
`getUILanguageLabelNative(lang)` - exibe `englishName / label` (sem chamada `t()` em cada linha). Adequado para menus de cabeçalho onde você deseja que o nome nativo seja visível.
|
|
300
|
+
|
|
301
|
+
O manifesto `ui-languages.json` é um array JSON de <code>{"{ code, label, englishName }"}</code> entradas. Exemplo:
|
|
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
|
+
Defina `targetLocales` na configuração para o caminho deste arquivo para que o comando de tradução use a mesma lista.
|
|
314
|
+
|
|
315
|
+
### Idiomas RTL
|
|
316
|
+
|
|
317
|
+
`ai-i18n-tools` exporta `getTextDirection(lng)` e `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` define `document.documentElement.dir` (navegador) ou é uma operação sem efeito (Node.js). Passe um argumento `element` opcional para direcionar um elemento específico.
|
|
329
|
+
|
|
330
|
+
Para strings que podem conter setas `→`, inverta-as para layouts 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
|
+
## Fluxo de trabalho 2 - Tradução de Documentos
|
|
342
|
+
|
|
343
|
+
Projetado para documentação em markdown, sites Docusaurus e arquivos JSON de rótulos. Ativos SVG autônomos são traduzidos por meio de [`translate-svg`](#cli-reference) quando `features.translateSVG` está habilitado e o bloco `svg` de nível superior está configurado — e não por meio de `documentations[].contentPaths`.
|
|
344
|
+
|
|
345
|
+
### Passo 1: Inicializar
|
|
346
|
+
|
|
347
|
+
```bash
|
|
348
|
+
npx ai-i18n-tools init -t ui-docusaurus
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
Edite o `ai-i18n-tools.config.json` gerado:
|
|
352
|
+
|
|
353
|
+
- `sourceLocale` - idioma de origem (deve corresponder a `defaultLocale` em `docusaurus.config.js`).
|
|
354
|
+
- `targetLocales` - matriz de códigos de localidade ou caminho para um manifesto.
|
|
355
|
+
- `cacheDir` - diretório de cache compartilhado em SQLite para todos os pipelines de documentação (e diretório de log padrão para `--write-logs`).
|
|
356
|
+
- `documentations` - matriz de blocos de documentação. Cada bloco possui `description` opcional, `contentPaths`, `outputDir`, `jsonSource` opcional, `markdownOutput`, `targetLocales`, `addFrontmatter`, etc.
|
|
357
|
+
- `documentations[].description` - nota opcional curta para mantenedores (o que este bloco abrange). Quando definido, aparece no título do `translate-docs` (`🌐 …: traduzindo …`) e nos cabeçalhos da seção `status`.
|
|
358
|
+
- `documentations[].contentPaths` - diretórios ou arquivos de origem markdown/MDX (veja também `documentations[].jsonSource` para rótulos JSON).
|
|
359
|
+
- `documentations[].outputDir` - diretório raiz de saída traduzida para esse bloco.
|
|
360
|
+
- `documentations[].markdownOutput.style` - `"nested"` (padrão), `"docusaurus"` ou `"flat"` (veja [Layouts de saída](#output-layouts)).
|
|
361
|
+
|
|
362
|
+
### Passo 2: Traduzir documentos
|
|
363
|
+
|
|
364
|
+
```bash
|
|
365
|
+
npx ai-i18n-tools translate-docs
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
Isso traduz todos os arquivos em cada bloco de `documentations` nos `contentPaths` para todos os locais de documentação efetivos (união de cada `targetLocales` do bloco quando definido, caso contrário, `targetLocales` raiz). Segmentos já traduzidos são servidos do cache SQLite - apenas novos ou segmentos alterados são enviados para o LLM.
|
|
369
|
+
|
|
370
|
+
Para traduzir um único local:
|
|
371
|
+
|
|
372
|
+
```bash
|
|
373
|
+
npx ai-i18n-tools translate-docs --locale de
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
Para verificar o que precisa ser traduzido:
|
|
377
|
+
|
|
378
|
+
```bash
|
|
379
|
+
npx ai-i18n-tools status
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
#### Comportamento do cache e flags `translate-docs`
|
|
383
|
+
|
|
384
|
+
O CLI mantém **rastreamento de arquivos** no SQLite (hash de origem por arquivo × local) e linhas de **segmento** (hash × local por bloco traduzível). Uma execução normal ignora completamente um arquivo quando o hash rastreado corresponde à fonte atual **e** o arquivo de saída já existe; caso contrário, ele processa o arquivo e usa o cache de segmentos para que o texto inalterado não chame a API.
|
|
385
|
+
|
|
386
|
+
| Flag | Efeito |
|
|
387
|
+
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
388
|
+
| *(padrão)* | Pula arquivos inalterados quando o rastreamento e a saída em disco coincidem; usa o cache de segmentos para o restante. |
|
|
389
|
+
| `--force-update` | Re-processa todos os arquivos correspondentes (extrai, remonta, escreve saídas), mesmo quando o rastreamento de arquivos os pularia. **O cache de segmentos ainda se aplica** - segmentos inalterados não são enviados ao LLM. |
|
|
390
|
+
| `--force` | Limpa o rastreamento de arquivos para cada arquivo processado e **não lê** o cache de segmentos para tradução da API (re-tradução completa). Os novos resultados ainda são **gravados** no cache de segmentos. |
|
|
391
|
+
| `--stats` | Exibe contagens de segmentos, contagens de arquivos rastreados e totais de segmentos por localidade, depois sai. |
|
|
392
|
+
| `--clear-cache [locale]` | Exclui traduções em cache (e rastreamento de arquivos): todas as localidades ou uma única localidade, depois sai. |
|
|
393
|
+
| `--prompt-format <mode>` | Como cada **lote** de segmentos é enviado ao modelo e analisado (`xml`, `json-array` ou `json-object`). Padrão **`xml`**. Não altera a extração, placeholders, validação, cache ou comportamento de fallback — consulte [Formato do prompt em lote](#batch-prompt-format). |
|
|
394
|
+
|
|
395
|
+
Você não pode combinar `--force` com `--force-update` (eles são mutuamente exclusivos).
|
|
396
|
+
|
|
397
|
+
#### Formato do prompt em lote
|
|
398
|
+
|
|
399
|
+
`translate-docs` envia segmentos traduzíveis ao OpenRouter em **lotes** (agrupados por `batchSize` / `maxBatchChars`). A flag **`--prompt-format`** apenas altera o **formato de transmissão** desse lote; a divisão de segmentos, tokens do `PlaceholderHandler`, verificações AST do markdown, chaves do cache SQLite e fallback por segmento quando a análise do lote falha permanecem inalterados.
|
|
400
|
+
|
|
401
|
+
| Modo | Mensagem do usuário | Resposta do modelo |
|
|
402
|
+
| ---- | ------------ | ----------- |
|
|
403
|
+
| **`xml`** (padrão) | Pseudo-XML: um `<seg id="N">…</seg>` por segmento (com escape XML). | Apenas blocos `<t id="N">…</t>`, um por índice de segmento. |
|
|
404
|
+
| **`json-array`** | Um array JSON de strings, uma entrada por segmento em ordem. | Um array JSON do **mesmo comprimento** (mesma ordem). |
|
|
405
|
+
| **`json-object`** | Um objeto JSON `{"0":"…","1":"…",…}` indexado pelo índice do segmento. | Um objeto JSON com as **mesmas chaves** e valores traduzidos. |
|
|
406
|
+
|
|
407
|
+
O cabeçalho da execução também exibe `Batch prompt format: …` para que você possa confirmar o modo ativo. Arquivos de rótulos JSON (`jsonSource`) e lotes SVG autônomos usam a mesma configuração quando essas etapas são executadas como parte do `translate-docs` (ou da fase de documentos do `sync` — o `sync` não expõe essa flag; seu padrão é **`xml`**).
|
|
408
|
+
|
|
409
|
+
**Deduplicação de segmentos e caminhos no SQLite**
|
|
410
|
+
|
|
411
|
+
- As linhas de segmento são indexadas globalmente por `(source_hash, locale)` (hash = conteúdo normalizado). Texto idêntico em dois arquivos compartilha uma única linha; `translations.filepath` é metadado (último escritor), não uma segunda entrada de cache por arquivo.
|
|
412
|
+
- `file_tracking.filepath` usa chaves com namespace: `doc-block:{index}:{relPath}` por bloco `documentations` (`relPath` é caminho posix relativo à raiz do projeto: caminhos markdown conforme coletados; **arquivos de rótulos JSON usam o caminho relativo ao diretório de trabalho atual (cwd) do arquivo de origem**, por exemplo, `docs-site/i18n/en/code.json`, para que a limpeza possa resolver o arquivo real), e `svg-assets:{relPath}` para ativos SVG autônomos em `translate-svg`.
|
|
413
|
+
- `translations.filepath` armazena caminhos posix relativos ao cwd para segmentos markdown, JSON e SVG (SVG usa o mesmo formato de caminho que outros ativos; o prefixo `svg-assets:…` está **apenas** em `file_tracking`).
|
|
414
|
+
- Após uma execução, `last_hit_at` é limpo apenas para linhas de segmento **no mesmo escopo de tradução** (respeitando `--path` e tipos habilitados) que não foram acessadas, de modo que uma execução filtrada ou apenas de documentos não marque arquivos não relacionados como obsoletos.
|
|
415
|
+
|
|
416
|
+
### Layouts de saída
|
|
417
|
+
|
|
418
|
+
`"nested"` (padrão quando omitido) — espelha a árvore de origem em `{outputDir}/{locale}/` (por exemplo, `docs/guide.md` → `i18n/de/docs/guide.md`).
|
|
419
|
+
|
|
420
|
+
`"docusaurus"` — coloca arquivos que estão em `docsRoot` em `i18n/<locale>/docusaurus-plugin-content-docs/current/<relativeToDocsRoot>`, correspondendo ao layout usual de i18n do Docusaurus. Defina `documentations[].markdownOutput.docsRoot` como a raiz da sua documentação (por exemplo, `"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 os arquivos traduzidos ao lado do original com sufixo de localidade, ou em um subdiretório. Links relativos entre páginas são reescritos automaticamente.
|
|
428
|
+
|
|
429
|
+
```
|
|
430
|
+
docs/guide.md → i18n/guide.de.md
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
Você pode substituir caminhos completamente com `documentations[].markdownOutput.pathTemplate`. Placeholders: <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
|
+
## Fluxo de trabalho combinado (UI + Docs)
|
|
438
|
+
|
|
439
|
+
Ative todos os recursos em uma única configuração para executar ambos os fluxos de trabalho 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` aponta a tradução de documentos para o mesmo catálogo `strings.json` que a UI, assim a terminologia permanece consistente; `glossary.userGlossary` adiciona substituições CSV para termos de produto.
|
|
473
|
+
|
|
474
|
+
Execute `npx ai-i18n-tools sync` para rodar um pipeline: **extrair** strings de interface (se `features.extractUIStrings`), **traduzir** strings de interface (se `features.translateUIStrings`), **traduzir ativos SVG autônomos** (se `features.translateSVG` e um bloco `svg` estiverem configurados) e, em seguida, **traduzir documentação** (cada bloco `documentations`: markdown/JSON conforme configurado). Pule etapas com `--no-ui`, `--no-svg` ou `--no-docs`. A etapa de documentação aceita `--dry-run`, `-p` / `--path`, `--force` e `--force-update` (os dois últimos só se aplicam quando a tradução da documentação é executada; são ignorados se você usar `--no-docs`).
|
|
475
|
+
|
|
476
|
+
Use `documentations[].targetLocales` em um bloco para traduzir os arquivos desse bloco para um **subconjunto menor** do que a UI (localidades de documentação efetivas são a **união** entre blocos):
|
|
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
|
+
## Referência de configuração
|
|
494
|
+
|
|
495
|
+
### `sourceLocale`
|
|
496
|
+
|
|
497
|
+
Código BCP-47 para o idioma de origem (por exemplo, `"en-GB"`, `"en"`, `"pt-BR"`). Nenhum arquivo de tradução é gerado para esta localidade - a string chave em si é o texto de origem.
|
|
498
|
+
|
|
499
|
+
**Deve corresponder** a `SOURCE_LOCALE` exportado do seu arquivo de configuração de i18n em tempo de execução (`src/i18n.ts` / `src/i18n.js`).
|
|
500
|
+
|
|
501
|
+
### `targetLocales`
|
|
502
|
+
|
|
503
|
+
Quais localidades traduzir. Aceita:
|
|
504
|
+
|
|
505
|
+
- **Caminho da string** para um manifesto `ui-languages.json` (`"src/locales/ui-languages.json"`). O arquivo é carregado e os códigos de localidade são extraídos.
|
|
506
|
+
- **Array de códigos BCP-47** (`["de", "fr", "es"]`).
|
|
507
|
+
- **Array de um elemento com um caminho** (`["src/locales/ui-languages.json"]`) - mesmo comportamento que a forma de string.
|
|
508
|
+
|
|
509
|
+
`targetLocales` é a lista de localidades primária para tradução da UI e a lista de localidades padrão para blocos de documentação. Se você preferir manter um array explícito aqui, mas ainda quiser rótulos e filtragem de localidades baseados em manifesto, também defina `uiLanguagesPath`.
|
|
510
|
+
|
|
511
|
+
### `uiLanguagesPath` (opcional)
|
|
512
|
+
|
|
513
|
+
Caminho para um manifesto `ui-languages.json` usado para nomes de exibição, filtragem de localidades e pós-processamento da lista de idiomas.
|
|
514
|
+
|
|
515
|
+
Use isso quando:
|
|
516
|
+
|
|
517
|
+
- `targetLocales` é um array explícito, mas você ainda quer rótulos em inglês/nativos do manifesto.
|
|
518
|
+
- Você quer que `markdownOutput.postProcessing.languageListBlock` construa rótulos de localidades a partir do mesmo manifesto.
|
|
519
|
+
- Apenas a tradução da UI está habilitada e você quer que o manifesto forneça a lista efetiva de localidades da UI.
|
|
520
|
+
|
|
521
|
+
### `concurrency` (opcional)
|
|
522
|
+
|
|
523
|
+
Máximo de **localidades alvo** traduzidas ao mesmo tempo (`translate-ui`, `translate-docs`, `translate-svg`, e as etapas correspondentes dentro de `sync`). Se omitido, o CLI usa **4** para tradução da UI e **3** para tradução de documentação (padrões internos). Substitua por execução com `-j` / `--concurrency`.
|
|
524
|
+
|
|
525
|
+
### `batchConcurrency` (opcional)
|
|
526
|
+
|
|
527
|
+
**traduzir-docs** e **traduzir-svg** (e a etapa de documentação de `sync`): solicitações máximas de **lote** paralelas do OpenRouter por arquivo (cada lote pode conter muitos segmentos). Padrão **4** quando omitido. Ignorado por `translate-ui`. Substitua com `-b` / `--batch-concurrency`. No `sync`, `-b` se aplica apenas à etapa de tradução da documentação.
|
|
528
|
+
|
|
529
|
+
### `batchSize` / `maxBatchChars` (opcional)
|
|
530
|
+
|
|
531
|
+
Agrupamento de segmentos para tradução de documentos: quantos segmentos por solicitação de API e um limite de caracteres. Padrões: **20** segmentos, **4096** caracteres (quando omitido).
|
|
532
|
+
|
|
533
|
+
### `openrouter`
|
|
534
|
+
|
|
535
|
+
| Campo | Descrição |
|
|
536
|
+
| ------------------- | ---------------------------------------------------------------------------------------- |
|
|
537
|
+
| `baseUrl` | URL base da API OpenRouter. Padrão: `https://openrouter.ai/api/v1`. |
|
|
538
|
+
| `translationModels` | Lista ordenada preferencial de IDs de modelos. O primeiro é tentado primeiro; entradas posteriores são usadas como alternativas em caso de erro. Para `translate-ui` apenas**, você também pode definir `ui.preferredModel` para tentar um modelo antes dessa lista (veja `ui`). |
|
|
539
|
+
| `defaultModel` | Modelo principal único herdado. Usado apenas quando `translationModels` não está definido ou está vazio. |
|
|
540
|
+
| `fallbackModel` | Modelo de fallback único herdado. Usado após `defaultModel` quando `translationModels` não está definido ou está vazio. |
|
|
541
|
+
| `maxTokens` | Número máximo de tokens de conclusão por requisição. Padrão: `8192`. |
|
|
542
|
+
| `temperature` | Temperatura de amostragem. Padrão: `0.2`. |
|
|
543
|
+
|
|
544
|
+
Defina `OPENROUTER_API_KEY` em seu ambiente ou arquivo `.env`.
|
|
545
|
+
|
|
546
|
+
### `features`
|
|
547
|
+
|
|
548
|
+
| Campo | Fluxo de trabalho | Descrição |
|
|
549
|
+
| -------------------- | -------- | ----------------------------------------------------------------- |
|
|
550
|
+
| `extractUIStrings` | 1 | Analisa o código-fonte em busca de `t("…")` e escreve/merge `strings.json`. |
|
|
551
|
+
| `translateUIStrings` | 1 | Traduz as entradas de `strings.json` e gera arquivos JSON por localidade. |
|
|
552
|
+
| `translateMarkdown` | 2 | Traduz arquivos `.md` / `.mdx`. |
|
|
553
|
+
| `translateJSON` | 2 | Traduz arquivos JSON de rótulos do Docusaurus. |
|
|
554
|
+
| `translateSVG` | 2 | Traduz ativos `.svg` autônomos (requer o bloco `svg` de nível superior). |
|
|
555
|
+
|
|
556
|
+
Traduza ativos SVG **autônomos** com `translate-svg` quando `features.translateSVG` for verdadeiro e um bloco `svg` de nível superior estiver configurado. O comando `sync` executa essa etapa quando ambos estiverem definidos (a menos que `--no-svg`).
|
|
557
|
+
|
|
558
|
+
### `ui`
|
|
559
|
+
|
|
560
|
+
| Campo | Descrição |
|
|
561
|
+
| --------------------------- | ----------------------------------------------------------------------- |
|
|
562
|
+
| `sourceRoots` | Diretórios (relativos ao diretório de trabalho atual) varridos em busca de chamadas `t("…")`. |
|
|
563
|
+
| `stringsJson` | Caminho para o arquivo de catálogo principal. Atualizado pelo comando `extract`. |
|
|
564
|
+
| `flatOutputDir` | Diretório onde arquivos JSON por localidade são escritos (`de.json`, etc.). |
|
|
565
|
+
| `preferredModel` | Opcional. ID do modelo OpenRouter tentado primeiro apenas para `translate-ui`; depois `openrouter.translationModels` (ou modelos legados) em ordem, sem duplicar esse ID. |
|
|
566
|
+
| `reactExtractor.funcNames` | Nomes adicionais de funções para varredura (padrão: `["t", "i18n.t"]`). |
|
|
567
|
+
| `reactExtractor.extensions` | Extensões de arquivos a incluir (padrão: `[".js", ".jsx", ".ts", ".tsx"]`). |
|
|
568
|
+
| `reactExtractor.includePackageDescription` | Quando `true` (padrão), o `extract` também inclui a `description` do `package.json` como uma string de interface quando presente. |
|
|
569
|
+
| `reactExtractor.packageJsonPath` | Caminho personalizado para o arquivo `package.json` usado nessa extração opcional da descrição.
|
|
570
|
+
|
|
571
|
+
### `cacheDir`
|
|
572
|
+
|
|
573
|
+
| Campo | Descrição |
|
|
574
|
+
| ---------- | ----------------------------------------------------------------------------- |
|
|
575
|
+
| `cacheDir` | Diretório de cache SQLite (compartilhado por todos os blocos `documentations`). Reutilizar entre execuções. |
|
|
576
|
+
|
|
577
|
+
### `documentations`
|
|
578
|
+
|
|
579
|
+
Array de blocos de pipeline de documentação. `translate-docs` e a fase de docs do processo `sync` **cada** bloco em ordem.
|
|
580
|
+
|
|
581
|
+
| Campo | Descrição |
|
|
582
|
+
| -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
583
|
+
| `description` | Nota opcional legível por humanos para este bloco (não usada para tradução). É exibida no início do título `translate-docs` com o ícone `🌐` quando definida; também aparece nos cabeçalhos da seção `status`. |
|
|
584
|
+
| `contentPaths` | Fontes Markdown/MDX a serem traduzidas (`translate-docs` verifica esses diretórios por arquivos `.md` / `.mdx`). As etiquetas JSON são provenientes de `jsonSource` no mesmo bloco. |
|
|
585
|
+
| `outputDir` | Diretório raiz para a saída traduzida deste bloco. |
|
|
586
|
+
| `sourceFiles` | Apelido opcional mesclado em `content游戏副本s` durante o carregamento. |
|
|
587
|
+
| `targetLocales` | Subconjunto opcional de idiomas apenas para este bloco (caso contrário, usa o `targetLocales` raiz). Os idiomas efetivos da documentação são a união entre todos os blocos. |
|
|
588
|
+
| `jsonSource` | Diretório de origem para os arquivos JSON de etiquetas do Docusaurus para este bloco (por exemplo, `"i18n/en"`). |
|
|
589
|
+
| `markdownOutput.style` | `"nested"` (padrão), `"docusaurus"` ou `"flat"`. |
|
|
590
|
+
| `markdownOutput.docsRoot` | Diretório raiz da documentação de origem para o layout Docusaurus (por exemplo, `"docs"`). |
|
|
591
|
+
| `markdownOutput.pathTemplate` | Caminho personalizado para saída em markdown. Substituições disponíveis: <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` | Caminho personalizado para arquivos JSON de saída das etiquetas. Suporta os mesmos substitutos de `pathTemplate`. |
|
|
593
|
+
| `markdownOutput.flatPreserveRelativeDir` | Para o estilo `flat`, mantém os subdiretórios de origem para que arquivos com o mesmo nome não entrem em conflito. |
|
|
594
|
+
| `markdownOutput.rewriteRelativeLinks` | Reescreve links relativos após a tradução (ativado automaticamente no estilo `flat`). |
|
|
595
|
+
| `markdownOutput.linkRewriteDocsRoot` | Raiz do repositório usada ao calcular os prefixos de reescrita de links planos. Geralmente mantenha como `"."`, a menos que sua documentação traduzida esteja em uma raiz de projeto diferente. |
|
|
596
|
+
| `markdownOutput.postProcessing` | Transformações opcionais no **corpo** do markdown traduzido (o front matter YAML é preservado). Executado após a remontagem dos segmentos e a reescrita de links planos, e antes de `addFrontmatter`. |
|
|
597
|
+
| `markdownOutput.postProcessing.regexAdjustments` | Lista ordenada de `{ "description"?, "search", "replace" }`. `search` é um padrão regex (string simples usa a flag `g`, ou `/padrão/flags`). `replace` suporta substituições como `${translatedLocale}`, `${sourceLocale}`, `${sourceFullPath}`, `${translatedFullPath}`, `${sourceFilename}`, `${translatedFilename}`, `${sourceBasedir}`, `${translatedBasedir}` (mesma ideia do referencial `additional-adjustments`). |
|
|
598
|
+
| `markdownOutput.postProcessing.languageListBlock` | `{ "start", "end", "separator" }` — o tradutor localiza a primeira linha contendo `start` e a linha correspondente `end`, então substitui esse trecho por um seletor de idioma canônico. Os links são construídos com caminhos relativos ao arquivo traduzido; os rótulos vêm de `uiLanguagesPath` / `ui-languages.json` quando configurado, caso contrário, de `localeDisplayNames` e códigos de idioma. |
|
|
599
|
+
| `addFrontmatter` | Quando `true` (padrão quando omitido), os arquivos markdown traduzidos incluem chaves YAML: `translation_last_updated`, `source_file_mtime`, `source_file_hash`, `translation_language`, `source_file_path` e, quando pelo menos um segmento tiver metadados de modelo, `translation_models` (lista ordenada dos IDs de modelos OpenRouter utilizados). Defina como `false` para pular. |
|
|
600
|
+
|
|
601
|
+
Exemplo (pipeline README plano — caminhos de captura de tela + wrapper opcional de lista de idiomas):
|
|
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
|
+
Caminhos e layout de nível superior para ativos SVG autônomos. A tradução é executada apenas quando **`features.translateSVG`** for verdadeiro (por meio de `translate-svg` ou da etapa SVG de `sync`).
|
|
626
|
+
|
|
627
|
+
| Campo | Descrição |
|
|
628
|
+
| --------------------------- | ----------- |
|
|
629
|
+
| `sourcePath` | Um diretório ou um array de diretórios escaneados recursivamente em busca de arquivos `.svg`. |
|
|
630
|
+
| `outputDir` | Diretório raiz para a saída SVG traduzida. |
|
|
631
|
+
| `style` | `"flat"` ou `"nested"` quando `pathTemplate` não está definido. |
|
|
632
|
+
| `pathTemplate` | Caminho de saída SVG personalizado. Placeholders: <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 traduzido em letras minúsculas na remontagem do SVG. Útil para designs que dependem de rótulos totalmente em minúsculas. |
|
|
634
|
+
|
|
635
|
+
### `glossary`
|
|
636
|
+
|
|
637
|
+
| Campo | Descrição |
|
|
638
|
+
| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
639
|
+
| `uiGlossary` | Caminho para o `strings.json` - cria automaticamente um glossário a partir das traduções existentes. |
|
|
640
|
+
| `userGlossary` | Caminho para um arquivo CSV com colunas `Original language string` (ou `en`), `locale`, `Translation` - uma linha por termo de origem e localidade de destino (`locale` pode ser `*` para todos os destinos).
|
|
641
|
+
|
|
642
|
+
A chave legada `uiGlossaryFromStringsJson` ainda é aceita e mapeada para `uiGlossary` ao carregar a configuração.
|
|
643
|
+
|
|
644
|
+
Gere um CSV de glossário vazio:
|
|
645
|
+
|
|
646
|
+
```bash
|
|
647
|
+
npx ai-i18n-tools glossary-generate
|
|
648
|
+
```
|
|
649
|
+
|
|
650
|
+
---
|
|
651
|
+
|
|
652
|
+
## Referência CLI
|
|
653
|
+
|
|
654
|
+
| Comando | Descrição |
|
|
655
|
+
| ------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
656
|
+
| `init [-t ui-markdown|ui-docusaurus] [-o path] [--with-translate-ignore]` | Escreve um arquivo de configuração inicial (inclui `concurrency`, `batchConcurrency`, `batchSize`, `maxBatchChars` e `documentations[].addFrontmatter`). `--with-translate-ignore` cria um `.translate-ignore` inicial. |
|
|
657
|
+
| `extract` | Analisa a fonte em busca de chamadas `t("…")` e atualiza `strings.json`. Requer `features.extractUIStrings`. |
|
|
658
|
+
| `translate-docs …` | Traduz markdown/MDX e JSON para cada bloco `documentations` (`contentPaths`, opcional `jsonSource`). `-j`: número máximo de localidades em paralelo; `-b`: número máximo de chamadas à API em lote por arquivo. `--prompt-format`: formato do lote (`xml` \| `json-array` \| `json-object`). Veja [Comportamento do cache e flags `translate-docs`](#cache-behaviour-and-translate-docs-flags) e [Formato do prompt em lote](#batch-prompt-format). |
|
|
659
|
+
| `translate-svg …` | Traduz ativos SVG autônomos configurados em `config.svg` (separado da documentação). Requer `features.translateSVG`. Mesmas ideias de cache da documentação; suporta `--no-cache` para pular leituras/escritas no SQLite nesta execução. `-j`, `-b`, `--force`, `--force-update`, `-p` / `--path`, `--dry-run`. |
|
|
660
|
+
| `translate-ui [--locale <code>] [--force] [--dry-run] [-j <n>]` | Traduz apenas as strings da interface. `--force`: traduz novamente todas as entradas por localidade (ignora traduções existentes). `--dry-run`: sem gravações, sem chamadas à API. `-j`: número máximo de localidades em paralelo. Requer `features.translateUIStrings`. |
|
|
661
|
+
| `export-ui-xliff [-l <codes>] [-o <dir>] [--untranslated-only] [--dry-run]` | Exporta `strings.json` para XLIFF 2.0 (um `.xliff` por localidade de destino). `-o` / `--output-dir`: diretório de saída (padrão: mesma pasta do catálogo). `--untranslated-only`: apenas unidades sem tradução para essa localidade. Somente leitura; sem API. |
|
|
662
|
+
| `sync …` | Extrai (se habilitado), depois tradução da interface, depois `translate-svg` quando `features.translateSVG` e `config.svg` estão definidos, depois tradução da documentação — a menos que pulada com `--no-ui`, `--no-svg` ou `--no-docs`. Flags compartilhadas: `-l`, `-p`, `--dry-run`, `-j`, `-b` (apenas agrupamento de documentação), `--force` / `--force-update` (apenas documentação; mutuamente exclusivas quando a documentação é executada). |
|
|
663
|
+
| `status` | Mostra o status da tradução em markdown por arquivo × localidade (sem filtro `--locale`; as localidades vêm da configuração). |
|
|
664
|
+
| `cleanup [--dry-run] [--no-backup] [--backup <path>]` | Executa `sync --force-update` primeiro (extração, interface, SVG, documentação), depois remove linhas de segmentos obsoletas (`last_hit_at` nulo / caminho do arquivo vazio); descarta linhas `file_tracking` cujo caminho de origem resolvido está ausente no disco; remove linhas de tradução cujos metadados `filepath` apontam para um arquivo ausente. Registra três contagens (obsoletas, `file_tracking` órfãs, traduções órfãs). Cria um backup do SQLite com carimbo de data/hora no diretório de cache, a menos que `--no-backup`. |
|
|
665
|
+
| `editor [-p <port>] [--no-open]` | Inicia um editor web local para o cache, `strings.json` e CSV do glossário. `--no-open`: não abre o navegador padrão automaticamente.<br><br>**Observação:** Se você editar uma entrada no editor de cache, deve executar um `sync --force-update` para reescrever os arquivos de saída com a entrada de cache atualizada. Além disso, se o texto de origem mudar posteriormente, a edição manual será perdida, pois uma nova chave de cache será gerada. |
|
|
666
|
+
| `glossary-generate [-o <path>]` | Escreve um modelo `glossary-user.csv` vazio. `-o`: sobrescreve o caminho de saída (padrão: `glossary.userGlossary` da configuração, ou `glossary-user.csv`). |
|
|
667
|
+
|
|
668
|
+
Todos os comandos aceitam `-c <path>` para especificar um arquivo de configuração não padrão, `-v` para saída detalhada, e `-w` / `--write-logs [path]` para redirecionar a saída do console para um arquivo de log (caminho padrão: sob o diretório raiz `cacheDir`).
|
|
669
|
+
|
|
670
|
+
---
|
|
671
|
+
|
|
672
|
+
## Variáveis de ambiente
|
|
673
|
+
|
|
674
|
+
| Variável | Descrição |
|
|
675
|
+
| ---------------------- | ---------------------------------------------------------- |
|
|
676
|
+
| `OPENROUTER_API_KEY` | **Obrigatório.** Sua chave de API do OpenRouter. |
|
|
677
|
+
| `OPENROUTER_BASE_URL` | Sobrescrever a URL base da API. |
|
|
678
|
+
| `I18N_SOURCE_LOCALE` | Sobrescrever `sourceLocale` em tempo de execução. |
|
|
679
|
+
| `I18N_TARGET_LOCALES` | Códigos de localidade separados por vírgula para sobrescrever `targetLocales`. |
|
|
680
|
+
| `I18N_LOG_LEVEL` | Nível do logger (`debug`, `info`, `warn`, `error`, `silent`). |
|
|
681
|
+
| `NO_COLOR` | Quando `1`, desabilita cores ANSI na saída do log. |
|
|
682
|
+
| `I18N_LOG_SESSION_MAX` | Máximo de linhas mantidas por sessão de log (padrão `5000`). |
|