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: 始めに
|
|
2
|
+
|
|
3
|
+
`ai-i18n-tools` は、2つの独立した、合成可能なワークフローを提供します:
|
|
4
|
+
|
|
5
|
+
- **Workflow 1 - UI Translation**: 任意のJS/TSソースから `t("…")` 呼び出しを抽出し、OpenRouterを介して翻訳し、i18next向けにフラットなロケール別JSONファイルを出力します。
|
|
6
|
+
- **Workflow 2 - Document Translation**: markdown(MDX)およびDocusaurusのJSONラベルファイルを任意の数のロケールに翻訳。スマートキャッシュ付き。**SVG**アセットは、`features.translateSVG` が有効で、トップレベルの `svg` ブロックが設定され、`translate-svg` が使用されている場合に翻訳されます([CLIリファレンス](#cli-reference)を参照)。
|
|
7
|
+
|
|
8
|
+
両方のワークフローは OpenRouter(互換性のある LLM)を使用し、単一の設定ファイルを共有します。
|
|
9
|
+
|
|
10
|
+
**他の言語で読む:**
|
|
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
|
+
<!-- このセクションを編集しないでください。更新するには doctoc を再実行してください -->
|
|
18
|
+
**目次**
|
|
19
|
+
|
|
20
|
+
- [インストール](#installation)
|
|
21
|
+
- [クイックスタート](#quick-start)
|
|
22
|
+
- [ワークフロー 1 - UI 翻訳](#workflow-1---ui-translation)
|
|
23
|
+
- [ステップ 1: 初期化](#step-1-initialise)
|
|
24
|
+
- [ステップ 2: 文字列の抽出](#step-2-extract-strings)
|
|
25
|
+
- [ステップ 3: UI 文字列の翻訳](#step-3-translate-ui-strings)
|
|
26
|
+
- [XLIFF 2.0 へのエクスポート (オプション)](#exporting-to-xliff-20-optional)
|
|
27
|
+
- [ステップ 4: 実行時に i18next を接続](#step-4-wire-i18next-at-runtime)
|
|
28
|
+
- [ソースコード内での `t()` の使用](#using-t-in-source-code)
|
|
29
|
+
- [補間](#interpolation)
|
|
30
|
+
- [言語切替 UI](#language-switcher-ui)
|
|
31
|
+
- [RTL 言語](#rtl-languages)
|
|
32
|
+
- [ワークフロー 2 - ドキュメント翻訳](#workflow-2---document-translation)
|
|
33
|
+
- [ステップ 1: 初期化](#step-1-initialise-1)
|
|
34
|
+
- [ステップ 2: ドキュメントの翻訳](#step-2-translate-documents)
|
|
35
|
+
- [キャッシュ動作と `translate-docs` フラグ](#cache-behaviour-and-translate-docs-flags)
|
|
36
|
+
- [出力レイアウト](#output-layouts)
|
|
37
|
+
- [統合ワークフロー (UI + ドキュメント)](#combined-workflow-ui--docs)
|
|
38
|
+
- [設定リファレンス](#configuration-reference)
|
|
39
|
+
- [`sourceLocale`](#sourcelocale)
|
|
40
|
+
- [`targetLocales`](#targetlocales)
|
|
41
|
+
- [`uiLanguagesPath` (オプション)](#uilanguagespath-optional)
|
|
42
|
+
- [`concurrency` (オプション)](#concurrency-optional)
|
|
43
|
+
- [`batchConcurrency` (オプション)](#batchconcurrency-optional)
|
|
44
|
+
- [`batchSize` / `maxBatchChars` (オプション)](#batchsize--maxbatchchars-optional)
|
|
45
|
+
- [`openrouter`](#openrouter)
|
|
46
|
+
- [`features`](#features)
|
|
47
|
+
- [`ui`](#ui)
|
|
48
|
+
- [`cacheDir`](#cachedir)
|
|
49
|
+
- [`documentations`](#documentations)
|
|
50
|
+
- [`svg` (オプション)](#svg-optional)
|
|
51
|
+
- [`glossary`](#glossary)
|
|
52
|
+
- [CLI リファレンス](#cli-reference)
|
|
53
|
+
- [環境変数](#environment-variables)
|
|
54
|
+
|
|
55
|
+
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
|
56
|
+
|
|
57
|
+
## インストール
|
|
58
|
+
|
|
59
|
+
公開されたパッケージは **ESM のみ** です。Node.js またはバンドラーで `import` / `import()` を使用してください; **`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
|
+
OpenRouter API キーを設定してください:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
export OPENROUTER_API_KEY=sk-or-v1-your-key-here
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
または、プロジェクトのルートに `.env` ファイルを作成します:
|
|
76
|
+
|
|
77
|
+
```env
|
|
78
|
+
OPENROUTER_API_KEY=sk-or-v1-your-key-here
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## クイックスタート
|
|
84
|
+
|
|
85
|
+
デフォルトの `init` テンプレート(`ui-markdown`)は、**UI** の抽出と翻訳のみを有効にします。`ui-docusaurus` テンプレートは **ドキュメント** 翻訳(`translate-docs`)を有効にします。`sync` を使用すると、抽出、UI 翻訳、オプションのスタンドアロン SVG 翻訳、およびドキュメント翻訳を設定に従って実行する単一のコマンドが実行されます。
|
|
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
|
+
## ワークフロー 1 - UI 翻訳
|
|
107
|
+
|
|
108
|
+
i18next を使用する任意の JS/TS プロジェクト向けに設計されています: React アプリ、Next.js(クライアントおよびサーバーコンポーネント)、Node.js サービス、CLI ツール。
|
|
109
|
+
|
|
110
|
+
### ステップ 1: 初期化
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
npx ai-i18n-tools init
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
これにより、`ai-i18n-tools.config.json` が `ui-markdown` テンプレートで書き込まれます。これを編集して以下を設定します:
|
|
117
|
+
|
|
118
|
+
- `sourceLocale` - ソース言語の BCP-47 コード(例:`"en-GB"`)。ランタイム i18n 設定ファイル(`src/i18n.ts` / `src/i18n.js`)からエクスポートされる `SOURCE_LOCALE` と**一致している必要があります**。
|
|
119
|
+
- `targetLocales` - `ui-languages.json` マニフェストへのパス、または BCP-47 コードの配列。
|
|
120
|
+
- `ui.sourceRoots` - `t("…")` 呼び出しをスキャンするディレクトリ(例:`["src/"]`)。
|
|
121
|
+
- `ui.stringsJson` - マスターカタログを書き出す場所(例:`"src/locales/strings.json"`)。
|
|
122
|
+
- `ui.flatOutputDir` - `de.json`、`pt-BR.json` などを書き出す場所(例:`"src/locales/"`)。
|
|
123
|
+
- `ui.preferredModel`(オプション)- `translate-ui` のみで**最初に**試す OpenRouter モデル ID。失敗した場合、CLI は `openrouter.translationModels`(またはレガシーな `defaultModel` / `fallbackModel`)の順序に従って重複をスキップしながら続行します。
|
|
124
|
+
|
|
125
|
+
### ステップ 2: 文字列の抽出
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
npx ai-i18n-tools extract
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
`ui.sourceRoots` 配下のすべての JS/TS ファイルをスキャンし、`t("literal")` および `i18n.t("literal")` 呼び出しを検出します。結果を `ui.stringsJson` に書き出し(またはマージ)します。
|
|
132
|
+
|
|
133
|
+
スキャナは設定可能です。`ui.reactExtractor.funcNames` を介してカスタム関数名を追加できます。
|
|
134
|
+
|
|
135
|
+
### ステップ 3: UI 文字列の翻訳
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
npx ai-i18n-tools translate-ui
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
`strings.json` を読み込み、各ターゲットロケールごとにバッチを OpenRouter に送信し、フラットな JSON ファイル(`de.json`、`fr.json` など)を `ui.flatOutputDir` に書き出します。`ui.preferredModel` が設定されている場合、`openrouter.translationModels` の順序付きリストよりも前にそのモデルが試行されます(ドキュメント翻訳やその他のコマンドは引き続き `openrouter` のみを使用します)。
|
|
142
|
+
|
|
143
|
+
各エントリごとに、`translate-ui` は各ロケールを正常に翻訳した **OpenRouter モデル ID** を、オプションの `models` オブジェクト(`translated` と同じロケールキー)に保存します。ローカルの `editor` コマンドで編集された文字列は、そのロケールの `models` 内でセントネル値 `user-edited` としてマークされます。`ui.flatOutputDir` 配下のロケール別フラットファイルは引き続き **source string → translation** のみであり、`models` は含みません(そのため実行時バンドルは変更されません)。
|
|
144
|
+
|
|
145
|
+
> **キャッシュエディタ使用時の注意:** キャッシュエディタでエントリを編集した場合、更新されたキャッシュエントリで出力ファイルを書き換えるために `sync --force-update`(または同等の `--force-update` オプション付き `translate` コマンド)を実行する必要があります。また、後でソーステキストが変更された場合、新しいソース文字列に対して新しいキャッシュキー(ハッシュ)が生成されるため、手動編集は失われる点に注意してください。
|
|
146
|
+
|
|
147
|
+
### XLIFF 2.0 へのエクスポート (オプション)
|
|
148
|
+
|
|
149
|
+
UI 文字列を翻訳ベンダー、TMS、または CAT ツールに渡すために、カタログを **XLIFF 2.0** としてエクスポートします (ターゲットロケールごとに 1 つのファイル)。このコマンドは **読み取り専用** です: `strings.json` を変更したり、API を呼び出したりしません。
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
npx ai-i18n-tools export-ui-xliff
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
デフォルトでは、ファイルは `ui.stringsJson` の隣に書き込まれ、`strings.de.xliff`、`strings.pt-BR.xliff` のように名前が付けられます (カタログのベース名 + ロケール + `.xliff`)。他の場所に書き込むには `-o` / `--output-dir` を使用します。`strings.json` からの既存の翻訳は `<target>` に表示され、欠落しているロケールは `state="initial"` を使用し、`<target>` がないためツールがそれらを埋めることができます。`--untranslated-only` を使用して、各ロケールに対してまだ翻訳が必要なユニットのみをエクスポートします (ベンダーバッチに便利です)。`--dry-run` はファイルを書き込まずにパスを印刷します。
|
|
156
|
+
|
|
157
|
+
### ステップ 4: ランタイムでの i18next の接続
|
|
158
|
+
|
|
159
|
+
`'ai-i18n-tools/runtime'` によってエクスポートされるヘルパーを使用して、i18n 設定ファイルを作成します:
|
|
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
|
+
React のレンダリング前に `i18n.js` をインポートします(例:エントリポイントの先頭)。ユーザーが言語を変更した場合は、`await loadLocale(code)` を呼び出した後、`i18n.changeLanguage(code)` を実行します。
|
|
192
|
+
|
|
193
|
+
`SOURCE_LOCALE` はエクスポートされているため、それを必要とする他のファイル(例:言語切り替えコンポーネント)は `'./i18n'` から直接インポートできます。
|
|
194
|
+
|
|
195
|
+
`defaultI18nInitOptions(sourceLocale)` は、キーをデフォルトとする設定向けの標準オプションを返します:
|
|
196
|
+
|
|
197
|
+
- `parseMissingKeyHandler` はキー自体を返すため、未翻訳の文字列はソーステキストとして表示されます。
|
|
198
|
+
- `nsSeparator: false` はコロンを含むキーを許可します。
|
|
199
|
+
- `interpolation.escapeValue: false` - 無効にしても安全です:React は値を自身でエスケープし、Node.js/CLI の出力にはエスケープすべき HTML が含まれません。
|
|
200
|
+
|
|
201
|
+
`wrapI18nWithKeyTrim(i18n)` は `i18n.t` をラップし、次の動作を行います: (1) ルックアップ前にキーをトリムし、抽出スクリプトが保存する形式に合わせる; (2) ソースロケールが生のキーを返した場合に <code>{"{{var}}"}</code> の補間を適用する - そのため <code>{"t('Hello {{name}}', { name })"}</code> はソース言語でも正しく動作します。
|
|
202
|
+
|
|
203
|
+
`makeLoadLocale(i18n, loaders, sourceLocale)` は、ロケール用の JSON バンドルを動的に import して i18next に登録する async `loadLocale(lang)` 関数を返します。
|
|
204
|
+
|
|
205
|
+
### ソースコードでの `t()` の使用
|
|
206
|
+
|
|
207
|
+
抽出スクリプトが検出できるよう、**リテラル文字列**を指定して `t()` を呼び出します:
|
|
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
|
+
同じパターンは React 外(Node.js、サーバーコンポーネント、CLI)でも機能します:
|
|
219
|
+
|
|
220
|
+
```js
|
|
221
|
+
import i18n from './i18n.js';
|
|
222
|
+
console.log(i18n.t('Processing complete'));
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
**ルール:**
|
|
226
|
+
|
|
227
|
+
- 抽出されるのはこれらの形式のみです: `t("…")`, `t('…')`, `t(`…`)`, `i18n.t("…")`。
|
|
228
|
+
- キーは**リテラル文字列**でなければなりません - 変数や式をキーとして使用しないでください。
|
|
229
|
+
- キーにテンプレートリテラルを使用しないでください: <code>{'t(`Hello ${name}`)'}</code>は抽出できません。
|
|
230
|
+
|
|
231
|
+
### 補間
|
|
232
|
+
|
|
233
|
+
i18nextのネイティブな第二引数の補間を<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
|
+
抽出スクリプトは第二引数を無視します - リテラルキー文字列<code>{"\"Hello {{name}}, you have {{count}} messages\""}</code>のみが抽出され、翻訳のために送信されます。翻訳者には<code>{"{{...}}"}</code>トークンを保持するよう指示されています。
|
|
242
|
+
|
|
243
|
+
### 言語切替UI
|
|
244
|
+
|
|
245
|
+
`ui-languages.json`マニフェストを使用して言語セレクタを構築します。`ai-i18n-tools`は2つの表示ヘルパーをエクスポートします:
|
|
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)` - 翻訳済みなら `t(englishName)` を表示し、両者が異なる場合は `englishName / t(englishName)` を表示します。設定画面に適しています。
|
|
298
|
+
|
|
299
|
+
`getUILanguageLabelNative(lang)` - `englishName / label` を表示します(各行で `t()` 呼び出しはしません)。ネイティブ名を表示したいヘッダーメニューに適しています。
|
|
300
|
+
|
|
301
|
+
`ui-languages.json`マニフェストは<code>{"{ code, label, englishName }"}</code>エントリのJSON配列です。例:
|
|
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
|
+
翻訳コマンドが同じリストを使用するように、このファイルのパスを設定して`targetLocales`を構成します。
|
|
314
|
+
|
|
315
|
+
### RTL言語
|
|
316
|
+
|
|
317
|
+
`ai-i18n-tools`は`getTextDirection(lng)`と`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`は`document.documentElement.dir`(ブラウザ)を設定するか、ノーオペレーション(Node.js)です。特定の要素をターゲットにするためにオプションの`element`引数を渡します。
|
|
329
|
+
|
|
330
|
+
`→`矢印を含む可能性のある文字列は、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
|
+
## ワークフロー 2 - ドキュメント翻訳
|
|
342
|
+
|
|
343
|
+
マークダウン形式のドキュメント、Docusaurusサイト、およびJSONラベルファイル向けに設計されています。スタンドアロンのSVGアセットは、`features.translateSVG` が有効で、トップレベルの `svg` ブロックが設定されている場合に [`translate-svg`](#cli-reference) を使って翻訳されます。`documentations[].contentPaths` 経由ではありません。
|
|
344
|
+
|
|
345
|
+
### ステップ 1: 初期化
|
|
346
|
+
|
|
347
|
+
```bash
|
|
348
|
+
npx ai-i18n-tools init -t ui-docusaurus
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
生成された`ai-i18n-tools.config.json`を編集します:
|
|
352
|
+
|
|
353
|
+
- `sourceLocale` - ソース言語(`docusaurus.config.js` 内の `defaultLocale` と一致している必要があります)。
|
|
354
|
+
- `targetLocales` - ロケールコードの配列、またはマニフェストへのパス。
|
|
355
|
+
- `cacheDir` - すべてのドキュメントパイプラインで共有されるSQLiteキャッシュディレクトリ(および `--write-logs` のデフォルトログディレクトリ)。
|
|
356
|
+
- `documentations` - ドキュメントブロックの配列。各ブロックには、オプションの `description`、`contentPaths`、`outputDir`、オプションの `jsonSource`、`markdownOutput`、`targetLocales`、`addFrontmatter` などがあります。
|
|
357
|
+
- `documentations[].description` - メンテナー向けのオプションの簡単なメモ(このブロックが何をカバーしているか)。設定されている場合、`translate-docs` の見出し(`🌐 …: translating …`)および `status` セクションのヘッダーに表示されます。
|
|
358
|
+
- `documentations[].contentPaths` - Markdown/MDX ソースディレクトリまたはファイル(JSONラベルについては `documentations[].jsonSource` も参照)。
|
|
359
|
+
- `documentations[].outputDir` - そのブロックの翻訳出力ルート。
|
|
360
|
+
- `documentations[].markdownOutput.style` - `"nested"`(デフォルト)、`"docusaurus"`、または `"flat"`([出力レイアウト](#output-layouts) を参照)。
|
|
361
|
+
|
|
362
|
+
### ステップ 2: ドキュメントを翻訳する
|
|
363
|
+
|
|
364
|
+
```bash
|
|
365
|
+
npx ai-i18n-tools translate-docs
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
これは、すべての `documentations` ブロックの `contentPaths` 内のすべてのファイルを、すべての有効なドキュメントロケール(各ブロックの `targetLocales` が設定されている場合はその集合、設定されていない場合はルートの `targetLocales`)に翻訳します。既に翻訳済みのセグメントは SQLite キャッシュから提供され、新しいセグメントまたは変更されたセグメントのみが LLM に送信されます。
|
|
369
|
+
|
|
370
|
+
単一のロケールを翻訳するには:
|
|
371
|
+
|
|
372
|
+
```bash
|
|
373
|
+
npx ai-i18n-tools translate-docs --locale de
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
翻訳が必要なものを確認するには:
|
|
377
|
+
|
|
378
|
+
```bash
|
|
379
|
+
npx ai-i18n-tools status
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
#### キャッシュの動作と `translate-docs` フラグ
|
|
383
|
+
|
|
384
|
+
CLI は SQLite 内で**ファイル追跡**(ファイル × ロケールごとのソースハッシュ)と**セグメント**行(翻訳可能なチャンクごとのハッシュ × ロケール)を保持します。通常の実行では、追跡されたハッシュが現在のソースと一致**し**、かつ出力ファイルが既に存在する場合、ファイル全体をスキップします。それ以外の場合はファイルを処理し、セグメントキャッシュを使用するため、変更されていないテキストは API を呼び出しません。
|
|
385
|
+
|
|
386
|
+
| フラグ | 効果 |
|
|
387
|
+
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
388
|
+
| *(default)* | トラッキング済みファイルとディスク上の出力が一致する場合は変更なしのファイルをスキップし、残りはセグメントキャッシュを使用します。 |
|
|
389
|
+
| `--force-update` | ファイルトラッキングでスキップされる場合でも、一致したすべてのファイルを再処理します(抽出、再結合、出力書き込み)。 **セグメントキャッシュは引き続き適用されます** - 変更のないセグメントは LLM に送信されません。 |
|
|
390
|
+
| `--force` | 処理対象ファイルごとにファイルトラッキングをクリアし、API 翻訳のために **セグメントキャッシュを読みません**(全面再翻訳)。新しい結果は引き続きセグメントキャッシュに **書き込まれます**。 |
|
|
391
|
+
| `--stats` | セグメント数、追跡済みファイル数、ロケールごとのセグメント合計を表示して終了します。 |
|
|
392
|
+
| `--clear-cache [locale]` | キャッシュされた翻訳(およびファイルトラッキング)を削除します。対象は全ロケール、または単一ロケールです。その後終了します。 |
|
|
393
|
+
| `--prompt-format <mode>` | 各セグメントの **バッチ** をモデルに送信し、解析する方法(`xml`、`json-array`、`json-object`)。デフォルトは **`xml`**。抽出、プレースホルダー、検証、キャッシュ、フォールバックの動作は変わりません — [Batch prompt format](#batch-prompt-format) を参照してください。 |
|
|
394
|
+
|
|
395
|
+
`--force` と `--force-update` を組み合わせることはできません(これらは相互排他的です)。
|
|
396
|
+
|
|
397
|
+
#### バッチプロンプト形式
|
|
398
|
+
|
|
399
|
+
`translate-docs` は翻訳可能なセグメントを OpenRouter に **バッチ** で送信します(`batchSize` / `maxBatchChars` でグループ化)。**`--prompt-format`** フラグは、そのバッチの **ワイヤ形式** だけを変更します。セグメント分割、`PlaceholderHandler` トークン、markdown AST チェック、SQLite キャッシュキー、およびバッチ解析失敗時のセグメントごとのフォールバックは変更されません。
|
|
400
|
+
|
|
401
|
+
| モード | ユーザーメッセージ | モデルの応答 |
|
|
402
|
+
| ---- | ------------ | ----------- |
|
|
403
|
+
| **`xml`** (デフォルト) | 擬似XML: セグメントごとに `<seg id="N">…</seg>` (XMLエスケープ付き)。 | セグメントインデックスごとに `<t id="N">…</t>` ブロックのみ。 |
|
|
404
|
+
| **`json-array`** | 順序通りの文字列のJSON配列、セグメントごとに1エントリ。 | **同じ長さ**のJSON配列 (同じ順序)。 |
|
|
405
|
+
| **`json-object`** | セグメントインデックスでキー付けされたJSONオブジェクト `{"0":"…","1":"…",…}`。 | **同じキー**と翻訳された値を持つJSONオブジェクト。 |
|
|
406
|
+
|
|
407
|
+
実行ヘッダーは `Batch prompt format: …` も印刷されるので、アクティブなモードを確認できます。JSONラベルファイル(`jsonSource`)とスタンドアロンSVGバッチは、`translate-docs`の一部として実行されるときに同じ設定を使用します(または`sync`のドキュメントフェーズ — `sync`はこのフラグを公開しません; デフォルトは **`xml`** です)。
|
|
408
|
+
|
|
409
|
+
**セグメントの重複排除と SQLite 内のパス**
|
|
410
|
+
|
|
411
|
+
- セグメント行は `(source_hash, locale)` によってグローバルにキー付けされます(ハッシュ = 正規化されたコンテンツ)。2つのファイルに同一のテキストがある場合、1行を共有します; `translations.filepath` はメタデータ(最後のライター)であり、ファイルごとの2番目のキャッシュエントリではありません。
|
|
412
|
+
- `file_tracking.filepath` は名前空間付きキーを使用します: `doc-block:{index}:{relPath}` 各 `documentations` ブロックごとに(`relPath` はプロジェクトルート相対のposix: 収集されたマークダウンパス; **JSONラベルファイルはソースファイルへのcwd相対パスを使用します**、例: `docs-site/i18n/en/code.json`、したがってクリーンアップは実際のファイルを解決できます)、および `svg-assets:{relPath}` は `translate-svg` の下のスタンドアロンSVGアセット用です。
|
|
413
|
+
- `translations.filepath` はマークダウン、JSON、およびSVGセグメントのcwd相対posixパスを保存します(SVGは他のアセットと同じパス形状を使用します; `svg-assets:…` プレフィックスは **のみ** `file_tracking` にあります)。
|
|
414
|
+
- 実行後、`last_hit_at` は、ヒットしなかったセグメント行 **同じ翻訳スコープ内** のみクリアされます(`--path` と有効な種類を尊重して)、したがってフィルタリングされたまたはドキュメントのみの実行は無関係なファイルを古くはありませんとマークしません。
|
|
415
|
+
|
|
416
|
+
### 出力レイアウト
|
|
417
|
+
|
|
418
|
+
`"nested"` (省略時のデフォルト) — `{outputDir}/{locale}/` の下にソースツリーをミラーします(例: `docs/guide.md` → `i18n/de/docs/guide.md`)。
|
|
419
|
+
|
|
420
|
+
`"docusaurus"` — `docsRoot` の下にあるファイルを `i18n/<locale>/docusaurus-plugin-content-docs/current/<relativeToDocsRoot>` に配置し、通常のDocusaurus i18nレイアウトに一致させます。 `documentations[].markdownOutput.docsRoot` をドキュメントソースルートに設定します(例: `"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"` - 翻訳されたファイルをソースの隣にロケールサフィックス付きで配置するか、サブディレクトリに配置します。ページ間の相対リンクは自動的に書き換えられます。
|
|
428
|
+
|
|
429
|
+
```
|
|
430
|
+
docs/guide.md → i18n/guide.de.md
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
`documentations[].markdownOutput.pathTemplate`でパスを完全に上書きできます。プレースホルダー: <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
|
+
## 統合ワークフロー (UI + ドキュメント)
|
|
438
|
+
|
|
439
|
+
両方のワークフローを一つの設定で実行するためにすべての機能を有効にします:
|
|
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`はドキュメント翻訳をUIと同じ`strings.json`カタログに向けるため、用語が一貫性を保ちます; `glossary.userGlossary`は製品用語のCSV上書きを追加します。
|
|
473
|
+
|
|
474
|
+
`npx ai-i18n-tools sync` を実行すると、1つのパイプラインが実行されます。`features.extractUIStrings` が設定されている場合は**UI文字列の抽出**、`features.translateUIStrings` が設定されている場合は**UI文字列の翻訳**、`features.translateSVG` とトップレベルの `svg` ブロックが設定されている場合は**スタンドアロンSVGアセットの翻訳**、その後**ドキュメントの翻訳**(各 `documentations` ブロックで設定された通りに、markdown/JSONを処理)を行います。`--no-ui`、`--no-svg`、`--no-docs` を使用して、特定の処理をスキップできます。ドキュメント翻訳ステップでは `--dry-run`、`-p` / `--path`、`--force`、および `--force-update` を受け付けます(最後の2つはドキュメント翻訳が実行される場合にのみ有効。`--no-docs` を指定すると無視されます)。
|
|
475
|
+
|
|
476
|
+
ブロックのファイルをUIよりも**小さなサブセット**に翻訳するには、ブロックに`documentations[].targetLocales`を使用します(有効なドキュメントロケールはブロック間の**和集合**です):
|
|
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
|
+
## 設定リファレンス
|
|
494
|
+
|
|
495
|
+
### `sourceLocale`
|
|
496
|
+
|
|
497
|
+
ソース言語のBCP-47コード(例: `"en-GB"`, `"en"`, `"pt-BR"`)。このロケールの翻訳ファイルは生成されません - キーストリング自体がソーステキストです。
|
|
498
|
+
|
|
499
|
+
**必ず一致する必要があります** `SOURCE_LOCALE`はあなたのランタイムi18n設定ファイル(`src/i18n.ts` / `src/i18n.js`)からエクスポートされます。
|
|
500
|
+
|
|
501
|
+
### `targetLocales`
|
|
502
|
+
|
|
503
|
+
翻訳するロケール。受け入れます:
|
|
504
|
+
|
|
505
|
+
- **文字列パス** `ui-languages.json`マニフェストへの(`"src/locales/ui-languages.json"`)。ファイルが読み込まれ、ロケールコードが抽出されます。
|
|
506
|
+
- **BCP-47コードの配列**(`["de", "fr", "es"]`)。
|
|
507
|
+
- **パスを持つ1要素の配列**(`["src/locales/ui-languages.json"]`) - 文字列形式と同じ動作。
|
|
508
|
+
|
|
509
|
+
`targetLocales`はUI翻訳の主要なロケールリストであり、ドキュメントブロックのデフォルトロケールリストです。ここで明示的な配列を保持したいが、マニフェスト駆動のラベルとロケールフィルタリングを望む場合は、`uiLanguagesPath`も設定してください。
|
|
510
|
+
|
|
511
|
+
### `uiLanguagesPath`(オプション)
|
|
512
|
+
|
|
513
|
+
表示名、ロケールフィルタリング、および言語リストの後処理に使用される`ui-languages.json`マニフェストへのパス。
|
|
514
|
+
|
|
515
|
+
これを使用するのは:
|
|
516
|
+
|
|
517
|
+
- `targetLocales`が明示的な配列であるが、マニフェストから英語/ネイティブラベルをまだ取得したい場合。
|
|
518
|
+
- `markdownOutput.postProcessing.languageListBlock`が同じマニフェストからロケールラベルを構築することを望む場合。
|
|
519
|
+
- UI翻訳のみが有効で、マニフェストが有効なUIロケールリストを提供することを望む場合。
|
|
520
|
+
|
|
521
|
+
### `concurrency`(オプション)
|
|
522
|
+
|
|
523
|
+
同時に翻訳される最大**ターゲットロケール**(`translate-ui`、`translate-docs`、`translate-svg`、および`sync`内の一致するステップ)。省略した場合、CLIはUI翻訳に**4**、ドキュメント翻訳に**3**を使用します(組み込みのデフォルト)。`-j` / `--concurrency`で実行ごとに上書きします。
|
|
524
|
+
|
|
525
|
+
### `batchConcurrency`(オプション)
|
|
526
|
+
|
|
527
|
+
**translate-docs** および **translate-svg**(および `sync` のドキュメント翻訳ステップ):ファイルごとの OpenRouter **バッチ** リクエストの最大並列数(各バッチには多数のセグメントを含めることができます)。省略時のデフォルトは **4**。`translate-ui` では無視されます。`-b` / `--batch-concurrency` で上書きできます。`sync` では、`-b` はドキュメント翻訳ステップにのみ適用されます。
|
|
528
|
+
|
|
529
|
+
### `batchSize` / `maxBatchChars`(オプション)
|
|
530
|
+
|
|
531
|
+
ドキュメント翻訳のためのセグメントバッチ処理:API リクエストあたりのセグメント数と文字数の上限。デフォルト:**20** セグメント、**4096** 文字(省略時)。
|
|
532
|
+
|
|
533
|
+
### `openrouter`
|
|
534
|
+
|
|
535
|
+
| フィールド | 説明 |
|
|
536
|
+
| ------------------- | ---------------------------------------------------------------------------------------- |
|
|
537
|
+
| `baseUrl` | OpenRouter APIのベースURL。デフォルト: `https://openrouter.ai/api/v1`。 |
|
|
538
|
+
| `translationModels` | モデルIDの優先順序付きリスト。最初のものが最初に試され、後のエントリはエラー時のフォールバックです。 `translate-ui` のみ**、このリストの前に1つのモデルを試すために `ui.preferredModel` を設定することもできます(`ui` を参照)。 |
|
|
539
|
+
| `defaultModel` | レガシーの単一プライマリモデル。 `translationModels` が設定されていないか空のときのみ使用されます。 |
|
|
540
|
+
| `fallbackModel` | レガシーの単一フォールバックモデル。 `translationModels` が設定されていないか空のときに `defaultModel` の後に使用されます。 |
|
|
541
|
+
| `maxTokens` | リクエストごとの最大完了トークン。デフォルト: `8192`。 |
|
|
542
|
+
| `temperature` | サンプリング温度。デフォルト: `0.2`。 |
|
|
543
|
+
|
|
544
|
+
環境変数または `.env` ファイルに `OPENROUTER_API_KEY` を設定してください。
|
|
545
|
+
|
|
546
|
+
### `features`
|
|
547
|
+
|
|
548
|
+
| フィールド | ワークフロー | 説明 |
|
|
549
|
+
| ------------------------ | ---------- | -------------------------------------------------------------- |
|
|
550
|
+
| `extractUIStrings` | 1 | ソースをスキャンして `t("…")` を検出し、`strings.json` を作成またはマージ。 |
|
|
551
|
+
| `translateUIStrings` | 1 | `strings.json` のエントリを翻訳し、ロケールごとのJSONファイルを出力。 |
|
|
552
|
+
| `translateMarkdown` | 2 | `.md` / `.mdx` ファイルを翻訳。 |
|
|
553
|
+
| `translateJSON` | 2 | DocusaurusのJSONラベルファイルを翻訳。 |
|
|
554
|
+
| `translateSVG` | 2 | スタンドアロンの `.svg` アセットを翻訳(トップレベルの `svg` ブロックが必要)。 |
|
|
555
|
+
|
|
556
|
+
`features.translateSVG` が true で、トップレベルの `svg` ブロックが設定されている場合、`translate-svg` を使って**スタンドアロン**のSVGアセットを翻訳します。`sync` コマンドは、両方が設定されている場合にそのステップを実行します(`--no-svg` を指定しない限り)。
|
|
557
|
+
|
|
558
|
+
### `ui`
|
|
559
|
+
|
|
560
|
+
| フィールド | 説明 |
|
|
561
|
+
| --------------------------- | ----------------------------------------------------------------------- |
|
|
562
|
+
| `sourceRoots` | `t("…")` 呼び出しをスキャンする対象のディレクトリ(カレントワーキングディレクトリからの相対パス)。 |
|
|
563
|
+
| `stringsJson` | マスターカタログファイルへのパス。`extract` コマンドによって更新される。 |
|
|
564
|
+
| `flatOutputDir` | ロケールごとの JSON ファイル(`de.json` など)が書き出されるディレクトリ。 |
|
|
565
|
+
| `preferredModel` | オプション。`translate-ui` のみで最初に試行される OpenRouter モデル ID。次に、この ID を重複せずに `openrouter.translationModels`(またはレガシーモデル)の順に試行する。 |
|
|
566
|
+
| `reactExtractor.funcNames` | スキャン対象の追加関数名(デフォルト: `["t", "i18n.t"]`)。 |
|
|
567
|
+
| `reactExtractor.extensions` | 含めるファイル拡張子(デフォルト: `[".js", ".jsx", ".ts", ".tsx"]`)。 |
|
|
568
|
+
| `reactExtractor.includePackageDescription` | `true` の場合(デフォルト)、`extract` は存在する場合に `package.json` の `description` を UI 文字列として含める。 |
|
|
569
|
+
| `reactExtractor.packageJsonPath` | このオプションの説明抽出に使用される `package.json` ファイルのカスタムパス。 |
|
|
570
|
+
|
|
571
|
+
### `cacheDir`
|
|
572
|
+
|
|
573
|
+
| フィールド | 説明 |
|
|
574
|
+
| ---------- | ----------------------------------------------------------------------------- |
|
|
575
|
+
| `cacheDir` | SQLite キャッシュディレクトリ(すべての `documentations` ブロックで共有)。複数回の実行で再利用できます。 |
|
|
576
|
+
|
|
577
|
+
### `documentations`
|
|
578
|
+
|
|
579
|
+
ドキュメントパイプラインブロックの配列。`translate-docs` と `sync` プロセスのドキュメントフェーズは、**各**ブロックを順番に処理します。
|
|
580
|
+
|
|
581
|
+
| フィールド | 説明 |
|
|
582
|
+
| -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
583
|
+
| `description` | このブロックの任意の人間が読めるメモ(翻訳には使用されません)。設定されている場合、`translate-docs` の `🌐` ヘッドラインの先頭に追加され、`status` セクションのヘッダーにも表示されます。 |
|
|
584
|
+
| `contentPaths` | 翻訳対象のMarkdown/MDXソース(`translate-docs` は `.md` / `.mdx` をスキャンします)。JSONラベルは、同じブロックの `jsonSource` から取得されます。 |
|
|
585
|
+
| `outputDir` | このブロックの翻訳出力のルートディレクトリ。 |
|
|
586
|
+
| `sourceFiles` | 読み込み時に `contentPaths` にマージされる任意のエイリアス。 |
|
|
587
|
+
| `targetLocales` | このブロックにのみ適用される任意のロケールのサブセット(指定しない場合はルートの `targetLocales` を使用)。有効なドキュメントロケールは、すべてのブロックの和集合です。 |
|
|
588
|
+
| `jsonSource` | このブロック用のDocusaurus JSONラベルファイルのソースディレクトリ(例: `"i18n/en"`)。 |
|
|
589
|
+
| `markdownOutput.style` | `"nested"`(デフォルト)、`"docusaurus"`、または `"flat"`。 |
|
|
590
|
+
| `markdownOutput.docsRoot` | Docusaurusレイアウト用のソースドキュメントルート(例: `"docs"`)。 |
|
|
591
|
+
| `markdownOutput.pathTemplate` | カスタムマークダウン出力パス。プレースホルダー: <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` | ラベルファイルのカスタムJSON出力パス。`pathTemplate` と同じプレースホルダーをサポートします。 |
|
|
593
|
+
| `markdownOutput.flatPreserveRelativeDir` | `flat` スタイルの場合、同じベース名のファイルが衝突しないようにソースのサブディレクトリを保持します。 |
|
|
594
|
+
| `markdownOutput.rewriteRelativeLinks` | 翻訳後に相対リンクを書き換える(`flat` スタイルでは自動的に有効)。 |
|
|
595
|
+
| `markdownOutput.linkRewriteDocsRoot` | フラットリンクの書き換えプレフィックスを計算する際に使用されるリポジトリルート。通常は `"."` のままにします。翻訳されたドキュメントが別のプロジェクトルート下にある場合を除き。 |
|
|
596
|
+
| `markdownOutput.postProcessing` | 翻訳されたマークダウンの**本文**に適用する任意の変換(YAMLフロントマターは保持されます)。セグメントの再結合およびフラットリンクの書き換えの後、`addFrontmatter` の前に実行されます。 |
|
|
597
|
+
| `markdownOutput.postProcessing.regexAdjustments` | `{ "description"?, "search", "replace" }` の順序付きリスト。`search` は正規表現パターン(単純な文字列はフラグ `g` を使用、または `/pattern/flags`)。`replace` は `${translatedLocale}`、`${sourceLocale}`、`${sourceFullPath}`、`${translatedFullPath}`、`${sourceFilename}`、`${translatedFilename}`、`${sourceBasedir}`、`${translatedBasedir}` などのプレースホルダーをサポート(リファレンスの `additional-adjustments` と同じ考え方)。 |
|
|
598
|
+
| `markdownOutput.postProcessing.languageListBlock` | `{ "start", "end", "separator" }` — 翻訳者は `start` を含む最初の行と一致する `end` 行を見つけ、その範囲を標準の言語スイッチャーに置き換えます。リンクは翻訳されたファイルからの相対パスで構築されます。ラベルは、設定されている場合は `uiLanguagesPath` / `ui-languages.json` から、それ以外は `localeDisplayNames` とロケールコードから取得されます。 |
|
|
599
|
+
| `addFrontmatter` | `true` の場合(省略時はデフォルト)翻訳されたマークダウンファイルにYAMLキーが含まれます:`translation_last_updated`、`source_file_mtime`、`source_file_hash`、`translation_language`、`source_file_path`、および少なくとも1つのセグメントにモデルメタデータがある場合、`translation_models`(使用されたOpenRouterモデルIDのソート済みリスト)。スキップする場合は `false` に設定します。 |
|
|
600
|
+
|
|
601
|
+
例(フラット README パイプライン — スクリーンショットパス + オプションの言語リストラッパー):
|
|
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`(オプション)
|
|
624
|
+
|
|
625
|
+
スタンドアロンSVGアセットのトップレベルのパスおよびレイアウト。翻訳は、**`features.translateSVG`** が true の場合にのみ実行されます(`translate-svg` または `sync` のSVGステージ経由)。
|
|
626
|
+
|
|
627
|
+
| フィールド | 説明 |
|
|
628
|
+
| --------------------------- | ---------------------------------------------------------------------------------------- |
|
|
629
|
+
| `sourcePath` | `.svg` ファイルを再帰的にスキャンするディレクトリまたはディレクトリの配列。 |
|
|
630
|
+
| `outputDir` | 翻訳された SVG 出力のルートディレクトリ。 |
|
|
631
|
+
| `style` | `"flat"` または `"nested"` (`pathTemplate` が未設定の場合)。 |
|
|
632
|
+
| `pathTemplate` | カスタム SVG 出力パス。プレースホルダー: <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` | SVG 再構成時の翻訳テキストを小文字にする。すべて小文字のラベルに依存するデザインに便利。 |
|
|
634
|
+
|
|
635
|
+
### `glossary`
|
|
636
|
+
|
|
637
|
+
| フィールド | 説明 |
|
|
638
|
+
| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
639
|
+
| `uiGlossary` | `strings.json` へのパス - 既存の翻訳から自動的に用語集を構築する。 |
|
|
640
|
+
| `userGlossary` | `Original language string`(または `en`)、`locale`、`Translation` の列を持つ CSV へのパス。1 行に 1 つのソース用語とターゲットロケールを記述(`locale` はすべてのターゲットに適用される `*` にすることも可能)。 |
|
|
641
|
+
|
|
642
|
+
レガシーキー `uiGlossaryFromStringsJson` はまだ受け入れられ、設定を読み込む際に `uiGlossary` にマッピングされます。
|
|
643
|
+
|
|
644
|
+
空の用語集 CSV を生成:
|
|
645
|
+
|
|
646
|
+
```bash
|
|
647
|
+
npx ai-i18n-tools glossary-generate
|
|
648
|
+
```
|
|
649
|
+
|
|
650
|
+
---
|
|
651
|
+
|
|
652
|
+
## CLI リファレンス
|
|
653
|
+
|
|
654
|
+
| コマンド | 説明 |
|
|
655
|
+
| --- | --- |
|
|
656
|
+
| `init [-t ui-markdown|ui-docusaurus] [-o path] [--with-translate-ignore]` | スターター設定ファイルを書き込みます(`concurrency`、`batchConcurrency`、`batchSize`、`maxBatchChars`、`documentations[].addFrontmatter` を含みます)。`--with-translate-ignore` はスターター `.translate-ignore` を作成します。 |
|
|
657
|
+
| `extract` | ソース内の `t("…")` 呼び出しをスキャンし、`strings.json` を更新します。`features.extractUIStrings` が必要です。 |
|
|
658
|
+
| `translate-docs …` | 各 `documentations` ブロック(`contentPaths`、オプションの `jsonSource`)に対して、Markdown/MDX および JSON を翻訳します。`-j`:並列処理するロケールの最大数。`-b`:ファイルごとの並列バッチAPI呼び出しの最大数。`--prompt-format`:バッチのワイヤーフォーマット(`xml` \| `json-array` \| `json-object`)。[キャッシュの動作と`translate-docs`フラグ](#cache-behaviour-and-translate-docs-flags)および[バッチプロンプトフォーマット](#batch-prompt-format)を参照してください。 |
|
|
659
|
+
| `translate-svg …` | `config.svg` で設定されたスタンドアロンのSVGアセットを翻訳します(ドキュメントとは別)。`features.translateSVG` が必要です。ドキュメントと同じキャッシュの考え方を採用。その実行時のSQLiteの読み書きをスキップするための `--no-cache` をサポート。`-j`、`-b`、`--force`、`--force-update`、`-p` / `--path`、`--dry-run`。 |
|
|
660
|
+
| `translate-ui [--locale <code>] [--force] [--dry-run] [-j <n>]` | UI文字列のみを翻訳します。`--force`:すべてのエントリをロケールごとに再翻訳(既存の翻訳を無視)。`--dry-run`:書き込みなし、API呼び出しもなし。`-j`:並列処理するロケールの最大数。`features.translateUIStrings` が必要です。 |
|
|
661
|
+
| `export-ui-xliff [-l <codes>] [-o <dir>] [--untranslated-only] [--dry-run]` | `strings.json` をXLIFF 2.0形式でエクスポートします(対象ロケールごとに1つの`.xliff`)。`-o` / `--output-dir`:出力ディレクトリ(デフォルト:カタログと同じフォルダ)。`--untranslated-only`:そのロケールで翻訳が欠落しているユニットのみ。読み取り専用。API呼び出しはしません。 |
|
|
662
|
+
| `sync …` | 抽出(有効の場合)→ UI翻訳 → `features.translateSVG` と `config.svg` が設定されている場合は `translate-svg` → ドキュメント翻訳(ただし、`--no-ui`、`--no-svg`、`--no-docs` でスキップされる場合を除く)。共通フラグ:`-l`、`-p`、`--dry-run`、`-j`、`-b`(ドキュメントのバッチ処理のみ)、`--force` / `--force-update`(ドキュメントのみ、ドキュメント実行時は相互に排他的)。 |
|
|
663
|
+
| `status` | ファイル × ロケールごとのMarkdown翻訳の状態を表示します(`--locale` フィルターなし。ロケールは設定から取得)。 |
|
|
664
|
+
| `cleanup [--dry-run] [--no-backup] [--backup <path>]` | 最初に `sync --force-update` を実行(抽出、UI、SVG、ドキュメント)し、その後、古くなったセグメント行(null `last_hit_at` / 空のファイルパス)を削除。ディスク上に解決されたソースパスが存在しない `file_tracking` 行を削除。`filepath` メタデータが存在しないファイルを指している翻訳行を削除。3つのカウント(古くなったもの、孤立した`file_tracking`、孤立した翻訳)をログ出力。`--no-backup` を指定しない限り、キャッシュディレクトリ内にタイムスタンプ付きのSQLiteバックアップを作成。 |
|
|
665
|
+
| `editor [-p <port>] [--no-open]` | キャッシュ、`strings.json`、および用語集CSV用のローカルWebエディタを起動します。`--no-open`:デフォルトブラウザを自動的に開かない。<br><br>**注:** キャッシュエディタでエントリを編集した場合、更新されたキャッシュエントリを出力ファイルに再書き込みするために `sync --force-update` を実行する必要があります。また、後でソーステキストが変更された場合、新しいキャッシュキーが生成されるため、手動での編集は失われます。 |
|
|
666
|
+
| `glossary-generate [-o <path>]` | 空の `glossary-user.csv` テンプレートを書き込みます。`-o`:出力パスを上書き(デフォルト:設定の `glossary.userGlossary`、または `glossary-user.csv`)。 |
|
|
667
|
+
|
|
668
|
+
すべてのコマンドは、非デフォルトの設定ファイルを指定するために `-c <path>` を受け入れ、詳細な出力のために `-v` を使用し、コンソール出力をログファイルに記録するために `-w` / `--write-logs [path]` を使用します(デフォルトパス:ルート `cacheDir` の下)。
|
|
669
|
+
|
|
670
|
+
---
|
|
671
|
+
|
|
672
|
+
## 環境変数
|
|
673
|
+
|
|
674
|
+
| 変数 | 説明 |
|
|
675
|
+
| ---------------------- | ---------------------------------------------------------- |
|
|
676
|
+
| `OPENROUTER_API_KEY` | **必須。** あなたの OpenRouter API キー。 |
|
|
677
|
+
| `OPENROUTER_BASE_URL` | API ベース URL をオーバーライドします。 |
|
|
678
|
+
| `I18N_SOURCE_LOCALE` | 実行時に `sourceLocale` をオーバーライドします。 |
|
|
679
|
+
| `I18N_TARGET_LOCALES` | `targetLocales` をオーバーライドするためのカンマ区切りのロケールコード。 |
|
|
680
|
+
| `I18N_LOG_LEVEL` | ロガーレベル(`debug`、`info`、`warn`、`error`、`silent`)。 |
|
|
681
|
+
| `NO_COLOR` | `1` の場合、ログ出力で ANSI カラーを無効にします。 |
|
|
682
|
+
| `I18N_LOG_SESSION_MAX` | ログセッションごとに保持される最大行数(デフォルト `5000`)。 |
|