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.
Files changed (260) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +157 -0
  3. package/dist/api/openrouter.d.ts +115 -0
  4. package/dist/api/openrouter.d.ts.map +1 -0
  5. package/dist/api/openrouter.js +399 -0
  6. package/dist/api/openrouter.js.map +1 -0
  7. package/dist/cli/doc-translate.d.ts +90 -0
  8. package/dist/cli/doc-translate.d.ts.map +1 -0
  9. package/dist/cli/doc-translate.js +1153 -0
  10. package/dist/cli/doc-translate.js.map +1 -0
  11. package/dist/cli/export-ui-xliff.d.ts +32 -0
  12. package/dist/cli/export-ui-xliff.d.ts.map +1 -0
  13. package/dist/cli/export-ui-xliff.js +153 -0
  14. package/dist/cli/export-ui-xliff.js.map +1 -0
  15. package/dist/cli/extract-strings.d.ts +12 -0
  16. package/dist/cli/extract-strings.d.ts.map +1 -0
  17. package/dist/cli/extract-strings.js +80 -0
  18. package/dist/cli/extract-strings.js.map +1 -0
  19. package/dist/cli/file-utils.d.ts +10 -0
  20. package/dist/cli/file-utils.d.ts.map +1 -0
  21. package/dist/cli/file-utils.js +77 -0
  22. package/dist/cli/file-utils.js.map +1 -0
  23. package/dist/cli/format.d.ts +21 -0
  24. package/dist/cli/format.d.ts.map +1 -0
  25. package/dist/cli/format.js +75 -0
  26. package/dist/cli/format.js.map +1 -0
  27. package/dist/cli/helpers.d.ts +27 -0
  28. package/dist/cli/helpers.d.ts.map +1 -0
  29. package/dist/cli/helpers.js +84 -0
  30. package/dist/cli/helpers.js.map +1 -0
  31. package/dist/cli/index.d.ts +3 -0
  32. package/dist/cli/index.d.ts.map +1 -0
  33. package/dist/cli/index.js +772 -0
  34. package/dist/cli/index.js.map +1 -0
  35. package/dist/cli/log-output.d.ts +13 -0
  36. package/dist/cli/log-output.d.ts.map +1 -0
  37. package/dist/cli/log-output.js +75 -0
  38. package/dist/cli/log-output.js.map +1 -0
  39. package/dist/cli/translate-svg.d.ts +7 -0
  40. package/dist/cli/translate-svg.d.ts.map +1 -0
  41. package/dist/cli/translate-svg.js +167 -0
  42. package/dist/cli/translate-svg.js.map +1 -0
  43. package/dist/cli/translate-ui-strings.d.ts +27 -0
  44. package/dist/cli/translate-ui-strings.d.ts.map +1 -0
  45. package/dist/cli/translate-ui-strings.js +357 -0
  46. package/dist/cli/translate-ui-strings.js.map +1 -0
  47. package/dist/core/cache-tracking-keys.d.ts +12 -0
  48. package/dist/core/cache-tracking-keys.d.ts.map +1 -0
  49. package/dist/core/cache-tracking-keys.js +20 -0
  50. package/dist/core/cache-tracking-keys.js.map +1 -0
  51. package/dist/core/cache.d.ts +153 -0
  52. package/dist/core/cache.d.ts.map +1 -0
  53. package/dist/core/cache.js +546 -0
  54. package/dist/core/cache.js.map +1 -0
  55. package/dist/core/config.d.ts +58 -0
  56. package/dist/core/config.d.ts.map +1 -0
  57. package/dist/core/config.js +392 -0
  58. package/dist/core/config.js.map +1 -0
  59. package/dist/core/doc-file-tracking.d.ts +8 -0
  60. package/dist/core/doc-file-tracking.d.ts.map +1 -0
  61. package/dist/core/doc-file-tracking.js +27 -0
  62. package/dist/core/doc-file-tracking.js.map +1 -0
  63. package/dist/core/errors.d.ts +19 -0
  64. package/dist/core/errors.d.ts.map +1 -0
  65. package/dist/core/errors.js +23 -0
  66. package/dist/core/errors.js.map +1 -0
  67. package/dist/core/locale-utils.d.ts +20 -0
  68. package/dist/core/locale-utils.d.ts.map +1 -0
  69. package/dist/core/locale-utils.js +75 -0
  70. package/dist/core/locale-utils.js.map +1 -0
  71. package/dist/core/output-paths.d.ts +22 -0
  72. package/dist/core/output-paths.d.ts.map +1 -0
  73. package/dist/core/output-paths.js +130 -0
  74. package/dist/core/output-paths.js.map +1 -0
  75. package/dist/core/prompt-builder.d.ts +62 -0
  76. package/dist/core/prompt-builder.d.ts.map +1 -0
  77. package/dist/core/prompt-builder.js +232 -0
  78. package/dist/core/prompt-builder.js.map +1 -0
  79. package/dist/core/prompts.d.ts +27 -0
  80. package/dist/core/prompts.d.ts.map +1 -0
  81. package/dist/core/prompts.js +57 -0
  82. package/dist/core/prompts.js.map +1 -0
  83. package/dist/core/svg-asset-paths.d.ts +40 -0
  84. package/dist/core/svg-asset-paths.d.ts.map +1 -0
  85. package/dist/core/svg-asset-paths.js +107 -0
  86. package/dist/core/svg-asset-paths.js.map +1 -0
  87. package/dist/core/types.d.ts +388 -0
  88. package/dist/core/types.d.ts.map +1 -0
  89. package/dist/core/types.js +265 -0
  90. package/dist/core/types.js.map +1 -0
  91. package/dist/core/ui-languages.d.ts +66 -0
  92. package/dist/core/ui-languages.d.ts.map +1 -0
  93. package/dist/core/ui-languages.js +277 -0
  94. package/dist/core/ui-languages.js.map +1 -0
  95. package/dist/core/user-edited-model.d.ts +3 -0
  96. package/dist/core/user-edited-model.d.ts.map +1 -0
  97. package/dist/core/user-edited-model.js +3 -0
  98. package/dist/core/user-edited-model.js.map +1 -0
  99. package/dist/edit-cache-app/app.js +1326 -0
  100. package/dist/edit-cache-app/index.html +287 -0
  101. package/dist/edit-cache-app/styles.css +664 -0
  102. package/dist/extractors/base-extractor.d.ts +15 -0
  103. package/dist/extractors/base-extractor.d.ts.map +1 -0
  104. package/dist/extractors/base-extractor.js +23 -0
  105. package/dist/extractors/base-extractor.js.map +1 -0
  106. package/dist/extractors/classify-segment.d.ts +6 -0
  107. package/dist/extractors/classify-segment.d.ts.map +1 -0
  108. package/dist/extractors/classify-segment.js +20 -0
  109. package/dist/extractors/classify-segment.js.map +1 -0
  110. package/dist/extractors/json-extractor.d.ts +16 -0
  111. package/dist/extractors/json-extractor.d.ts.map +1 -0
  112. package/dist/extractors/json-extractor.js +128 -0
  113. package/dist/extractors/json-extractor.js.map +1 -0
  114. package/dist/extractors/markdown-extractor.d.ts +15 -0
  115. package/dist/extractors/markdown-extractor.d.ts.map +1 -0
  116. package/dist/extractors/markdown-extractor.js +205 -0
  117. package/dist/extractors/markdown-extractor.js.map +1 -0
  118. package/dist/extractors/svg-extractor.d.ts +19 -0
  119. package/dist/extractors/svg-extractor.d.ts.map +1 -0
  120. package/dist/extractors/svg-extractor.js +132 -0
  121. package/dist/extractors/svg-extractor.js.map +1 -0
  122. package/dist/extractors/ui-string-extractor.d.ts +40 -0
  123. package/dist/extractors/ui-string-extractor.d.ts.map +1 -0
  124. package/dist/extractors/ui-string-extractor.js +146 -0
  125. package/dist/extractors/ui-string-extractor.js.map +1 -0
  126. package/dist/extractors/ui-string-locations.d.ts +23 -0
  127. package/dist/extractors/ui-string-locations.d.ts.map +1 -0
  128. package/dist/extractors/ui-string-locations.js +138 -0
  129. package/dist/extractors/ui-string-locations.js.map +1 -0
  130. package/dist/glossary/glossary.d.ts +34 -0
  131. package/dist/glossary/glossary.d.ts.map +1 -0
  132. package/dist/glossary/glossary.js +260 -0
  133. package/dist/glossary/glossary.js.map +1 -0
  134. package/dist/glossary/matcher.d.ts +10 -0
  135. package/dist/glossary/matcher.d.ts.map +1 -0
  136. package/dist/glossary/matcher.js +12 -0
  137. package/dist/glossary/matcher.js.map +1 -0
  138. package/dist/index.d.ts +44 -0
  139. package/dist/index.d.ts.map +1 -0
  140. package/dist/index.js +44 -0
  141. package/dist/index.js.map +1 -0
  142. package/dist/processors/admonition-placeholders.d.ts +8 -0
  143. package/dist/processors/admonition-placeholders.d.ts.map +1 -0
  144. package/dist/processors/admonition-placeholders.js +59 -0
  145. package/dist/processors/admonition-placeholders.js.map +1 -0
  146. package/dist/processors/anchor-placeholders.d.ts +8 -0
  147. package/dist/processors/anchor-placeholders.d.ts.map +1 -0
  148. package/dist/processors/anchor-placeholders.js +37 -0
  149. package/dist/processors/anchor-placeholders.js.map +1 -0
  150. package/dist/processors/batch-processor.d.ts +10 -0
  151. package/dist/processors/batch-processor.d.ts.map +1 -0
  152. package/dist/processors/batch-processor.js +33 -0
  153. package/dist/processors/batch-processor.js.map +1 -0
  154. package/dist/processors/bold-code-placeholders.d.ts +14 -0
  155. package/dist/processors/bold-code-placeholders.d.ts.map +1 -0
  156. package/dist/processors/bold-code-placeholders.js +116 -0
  157. package/dist/processors/bold-code-placeholders.js.map +1 -0
  158. package/dist/processors/doc-postprocess.d.ts +51 -0
  159. package/dist/processors/doc-postprocess.d.ts.map +1 -0
  160. package/dist/processors/doc-postprocess.js +215 -0
  161. package/dist/processors/doc-postprocess.js.map +1 -0
  162. package/dist/processors/emphasis-placeholders.d.ts +6 -0
  163. package/dist/processors/emphasis-placeholders.d.ts.map +1 -0
  164. package/dist/processors/emphasis-placeholders.js +262 -0
  165. package/dist/processors/emphasis-placeholders.js.map +1 -0
  166. package/dist/processors/flat-link-rewrite.d.ts +32 -0
  167. package/dist/processors/flat-link-rewrite.d.ts.map +1 -0
  168. package/dist/processors/flat-link-rewrite.js +90 -0
  169. package/dist/processors/flat-link-rewrite.js.map +1 -0
  170. package/dist/processors/glossary-force-placeholders.d.ts +12 -0
  171. package/dist/processors/glossary-force-placeholders.d.ts.map +1 -0
  172. package/dist/processors/glossary-force-placeholders.js +58 -0
  173. package/dist/processors/glossary-force-placeholders.js.map +1 -0
  174. package/dist/processors/inline-code-placeholders.d.ts +11 -0
  175. package/dist/processors/inline-code-placeholders.d.ts.map +1 -0
  176. package/dist/processors/inline-code-placeholders.js +87 -0
  177. package/dist/processors/inline-code-placeholders.js.map +1 -0
  178. package/dist/processors/placeholder-handler.d.ts +38 -0
  179. package/dist/processors/placeholder-handler.d.ts.map +1 -0
  180. package/dist/processors/placeholder-handler.js +55 -0
  181. package/dist/processors/placeholder-handler.js.map +1 -0
  182. package/dist/processors/translation-placeholder-leaks.d.ts +2 -0
  183. package/dist/processors/translation-placeholder-leaks.d.ts.map +1 -0
  184. package/dist/processors/translation-placeholder-leaks.js +9 -0
  185. package/dist/processors/translation-placeholder-leaks.js.map +1 -0
  186. package/dist/processors/url-placeholders.d.ts +10 -0
  187. package/dist/processors/url-placeholders.d.ts.map +1 -0
  188. package/dist/processors/url-placeholders.js +29 -0
  189. package/dist/processors/url-placeholders.js.map +1 -0
  190. package/dist/processors/validator.d.ts +23 -0
  191. package/dist/processors/validator.d.ts.map +1 -0
  192. package/dist/processors/validator.js +186 -0
  193. package/dist/processors/validator.js.map +1 -0
  194. package/dist/runtime/i18next-helpers.d.ts +146 -0
  195. package/dist/runtime/i18next-helpers.d.ts.map +1 -0
  196. package/dist/runtime/i18next-helpers.js +192 -0
  197. package/dist/runtime/i18next-helpers.js.map +1 -0
  198. package/dist/runtime/index.d.ts +4 -0
  199. package/dist/runtime/index.d.ts.map +1 -0
  200. package/dist/runtime/index.js +4 -0
  201. package/dist/runtime/index.js.map +1 -0
  202. package/dist/runtime/template.d.ts +21 -0
  203. package/dist/runtime/template.d.ts.map +1 -0
  204. package/dist/runtime/template.js +28 -0
  205. package/dist/runtime/template.js.map +1 -0
  206. package/dist/runtime/ui-language-display.d.ts +16 -0
  207. package/dist/runtime/ui-language-display.d.ts.map +1 -0
  208. package/dist/runtime/ui-language-display.js +26 -0
  209. package/dist/runtime/ui-language-display.js.map +1 -0
  210. package/dist/server/translation-editor.d.ts +25 -0
  211. package/dist/server/translation-editor.d.ts.map +1 -0
  212. package/dist/server/translation-editor.js +583 -0
  213. package/dist/server/translation-editor.js.map +1 -0
  214. package/dist/utils/concurrency.d.ts +31 -0
  215. package/dist/utils/concurrency.d.ts.map +1 -0
  216. package/dist/utils/concurrency.js +103 -0
  217. package/dist/utils/concurrency.js.map +1 -0
  218. package/dist/utils/hash.d.ts +5 -0
  219. package/dist/utils/hash.d.ts.map +1 -0
  220. package/dist/utils/hash.js +9 -0
  221. package/dist/utils/hash.js.map +1 -0
  222. package/dist/utils/ignore-parser.d.ts +7 -0
  223. package/dist/utils/ignore-parser.d.ts.map +1 -0
  224. package/dist/utils/ignore-parser.js +26 -0
  225. package/dist/utils/ignore-parser.js.map +1 -0
  226. package/dist/utils/logger.d.ts +45 -0
  227. package/dist/utils/logger.d.ts.map +1 -0
  228. package/dist/utils/logger.js +158 -0
  229. package/dist/utils/logger.js.map +1 -0
  230. package/docs/GETTING_STARTED.md +697 -0
  231. package/docs/PACKAGE_OVERVIEW.md +427 -0
  232. package/docs/ai-i18n-tools-context.md +481 -0
  233. package/package.json +117 -0
  234. package/translated-docs/README.de.md +157 -0
  235. package/translated-docs/README.es.md +157 -0
  236. package/translated-docs/README.fr.md +157 -0
  237. package/translated-docs/README.hi.md +157 -0
  238. package/translated-docs/README.ja.md +157 -0
  239. package/translated-docs/README.ko.md +157 -0
  240. package/translated-docs/README.pt-BR.md +157 -0
  241. package/translated-docs/README.zh-CN.md +157 -0
  242. package/translated-docs/README.zh-TW.md +157 -0
  243. package/translated-docs/docs/GETTING_STARTED.de.md +682 -0
  244. package/translated-docs/docs/GETTING_STARTED.es.md +682 -0
  245. package/translated-docs/docs/GETTING_STARTED.fr.md +682 -0
  246. package/translated-docs/docs/GETTING_STARTED.hi.md +682 -0
  247. package/translated-docs/docs/GETTING_STARTED.ja.md +682 -0
  248. package/translated-docs/docs/GETTING_STARTED.ko.md +682 -0
  249. package/translated-docs/docs/GETTING_STARTED.pt-BR.md +682 -0
  250. package/translated-docs/docs/GETTING_STARTED.zh-CN.md +682 -0
  251. package/translated-docs/docs/GETTING_STARTED.zh-TW.md +682 -0
  252. package/translated-docs/docs/PACKAGE_OVERVIEW.de.md +428 -0
  253. package/translated-docs/docs/PACKAGE_OVERVIEW.es.md +428 -0
  254. package/translated-docs/docs/PACKAGE_OVERVIEW.fr.md +428 -0
  255. package/translated-docs/docs/PACKAGE_OVERVIEW.hi.md +428 -0
  256. package/translated-docs/docs/PACKAGE_OVERVIEW.ja.md +428 -0
  257. package/translated-docs/docs/PACKAGE_OVERVIEW.ko.md +428 -0
  258. package/translated-docs/docs/PACKAGE_OVERVIEW.pt-BR.md +428 -0
  259. package/translated-docs/docs/PACKAGE_OVERVIEW.zh-CN.md +428 -0
  260. package/translated-docs/docs/PACKAGE_OVERVIEW.zh-TW.md +428 -0
@@ -0,0 +1,682 @@
1
+ # ai-i18n-tools: प्रारंभ करना
2
+
3
+ `ai-i18n-tools` दो स्वतंत्र, संयोज्य कार्यप्रवाह प्रदान करता है:
4
+
5
+ - **वर्कफ़्लो 1 - UI अनुवाद**: किसी भी JS/TS स्रोत से `t("…")` कॉल निकालें, उन्हें OpenRouter के माध्यम से अनुवादित करें, और i18next के लिए तैयार प्रति-स्थानांतरण JSON फ़ाइलें लिखें।
6
+ - **वर्कफ़्लो 2 - दस्तावेज़ अनुवाद**: किसी भी संख्या में स्थानांतरणों के लिए मार्कडाउन (MDX) और डॉक्यूसॉरस JSON लेबल फ़ाइलों का अनुवाद करें, स्मार्ट कैशिंग के साथ। **SVG** संपत्तियों के लिए `features.translateSVG`, शीर्ष-स्तरीय `svg` ब्लॉक और `translate-svg` का उपयोग करें (देखें [CLI संदर्भ](#cli-reference))।
7
+
8
+ दोनों कार्यप्रवाह OpenRouter (किसी भी संगत LLM) का उपयोग करते हैं और एक ही कॉन्फ़िग फ़ाइल साझा करते हैं।
9
+
10
+ <small>**अन्य भाषाओं में पढ़ें:** </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
+ <!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
18
+ **सामग्री की तालिका**
19
+
20
+ - [स्थापना](#installation)
21
+ - [त्वरित प्रारंभ](#quick-start)
22
+ - [कार्यप्रवाह 1 - यूआई अनुवाद](#workflow-1---ui-translation)
23
+ - [चरण 1: आरंभ करें](#step-1-initialise)
24
+ - [चरण 2: स्ट्रिंग्स निकालें](#step-2-extract-strings)
25
+ - [चरण 3: यूआई स्ट्रिंग्स का अनुवाद करें](#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
+ - [भाषा स्विचर यूआई](#language-switcher-ui)
31
+ - [दाएं से बाएं भाषाएं](#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
+ - [संयुक्त कार्यप्रवाह (यूआई + दस्तावेज़)](#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`) को सक्षम करता है। जब आप एक ऐसा कमांड चाहते हैं जो निष्कर्षण, UI अनुवाद, वैकल्पिक स्टैंडअलोन SVG अनुवाद, और आपके कॉन्फ़िगरेशन के अनुसार दस्तावेज़ अनुवाद चलाता है, तो `sync` का उपयोग करें।
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"`). **मिलाना चाहिए** `SOURCE_LOCALE` जो आपके रनटाइम i18n सेटअप फ़ाइल (`src/i18n.ts` / `src/i18n.js`) से निर्यात किया गया है।
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 मॉडल आईडी; विफलता पर 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 को बैच भेजता है, `ui.flatOutputDir` में सपाट JSON फ़ाइलें (`de.json`, `fr.json`, आदि) लिखता है। जब `ui.preferredModel` सेट किया जाता है, तो उस मॉडल का प्रयास किया जाता है जो `openrouter.translationModels` में क्रमबद्ध सूची से पहले है (दस्तावेज़ अनुवाद और अन्य आदेश अभी भी केवल `openrouter` का उपयोग करते हैं)।
142
+
143
+ प्रत्येक प्रविष्टि के लिए, `translate-ui` प्रत्येक स्थानीयकरण को सफलतापूर्वक अनुवादित करने वाले **OpenRouter मॉडल आईडी** को एक वैकल्पिक `models` ऑब्जेक्ट में संग्रहीत करता है (जिसकी स्थानीयकरण कुंजियाँ `translated` के समान होती हैं)। स्थानीय `editor` कमांड में संपादित किए गए स्ट्रिंग्स को `models` में उस स्थानीयकरण के लिए सेंटिनल मान `user-edited` से चिह्नित किया जाता है। `ui.flatOutputDir` के तहत प्रति-स्थानीयकरण फ्लैट फ़ाइल्स केवल **स्रोत स्ट्रिंग → अनुवाद** रहती हैं; उनमें `models` शामिल नहीं होता है (ताकि रनटाइम बंडल अपरिवर्तित रहें)।
144
+
145
+ > **कैश संपादक का उपयोग करने पर नोट:** यदि आप कैश संपादक में एक प्रविष्टि संपादित करते हैं, तो आपको अपडेट की गई कैश प्रविष्टि के साथ आउटपुट फ़ाइलों को फिर से लिखने के लिए `sync --force-update` (या समकक्ष `translate` आदेश के साथ `--force-update`) चलाना होगा। इसके अलावा, ध्यान रखें कि यदि स्रोत पाठ बाद में बदलता है, तो आपका मैनुअल संपादन खो जाएगा क्योंकि नए स्रोत स्ट्रिंग के लिए एक नया कैश कुंजी (हैश) उत्पन्न किया जाएगा।
146
+
147
+ ### XLIFF 2.0 में निर्यात करना (वैकल्पिक)
148
+
149
+ यूआई स्ट्रिंग्स को एक अनुवाद विक्रेता, TMS या CAT उपकरण को सौंपने के लिए, कैटलॉग को **XLIFF 2.0** के रूप में निर्यात करें (प्रत्येक लक्ष्य स्थान के लिए एक फ़ाइल)। यह कमांड **केवल पढ़ने के लिए** है: यह `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
+ आपकी i18n सेटअप फ़ाइल बनाएं जो `'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
+ 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)` एक एसिंक `loadLocale(lang)` फ़ंक्शन लौटाता है जो किसी स्थानीयकरण के लिए JSON बंडल को गतिशील रूप से आयात करता है और इसे i18next के साथ पंजीकृत करता है।
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` दो डिस्प्ले हेल्पर्स निर्यात करता है:
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` मैनिफेस्ट एक JSON एरे है जिसमें <code>{"{ code, label, englishName }"}</code> प्रविष्टियाँ होती हैं। उदाहरण:
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
+ मार्कडाउन प्रलेखन, डॉक्यूसॉरस साइटों और JSON लेबल फ़ाइलों के लिए डिज़ाइन किया गया। स्वतंत्र SVG संपत्तियों का अनुवाद [`translate-svg`](#cli-reference) के माध्यम से किया जाता है जब `features.translateSVG` सक्षम होता है और शीर्ष-स्तरीय `svg` ब्लॉक सेट होता है — `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` - मार्कडाउन/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) देखें। |
394
+
395
+ आप `--force` को `--force-update` के साथ संयोजित नहीं कर सकते (वे परस्पर अनन्य हैं)।
396
+
397
+ #### बैच प्रॉम्प्ट स्वरूप
398
+
399
+ `translate-docs` अनुवाद योग्य सेगमेंट्स को OpenRouter में **बैचों** में भेजता है ( `batchSize` / `maxBatchChars` द्वारा समूहित)। **`--prompt-format`** ध्वज केवल उस बैच के **वायर फॉर्मेट** को बदलता है; सेगमेंट विभाजन, `PlaceholderHandler` टोकन, मार्कडाउन AST जांच, SQLite कैश कुंजियाँ, और बैच पार्सिंग विफल होने पर प्रति-सेगमेंट फॉलबैक अपरिवर्तित रहते हैं।
400
+
401
+ | मोड | उपयोगकर्ता संदेश | मॉडल उत्तर |
402
+ | ---- | ------------ | ----------- |
403
+ | **`xml`** (डिफ़ॉल्ट) | पीसोडो-XML: एक `<seg id="N">…</seg>` प्रति खंड (XML एस्केपिंग के साथ)। | केवल `<t id="N">…</t>` ब्लॉक, प्रति खंड अनुक्रमांक। |
404
+ | **`json-array`** | एक JSON स्ट्रिंग्स की सूची, क्रम में प्रति खंड एक प्रविष्टि। | **समान लंबाई** की एक 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)` द्वारा वैश्विक रूप से कुंजीबद्ध होती हैं (हैश = सामान्यीकृत सामग्री)। दो फ़ाइलों में समान पाठ एक पंक्ति साझा करता है; `translations.filepath` मेटाडेटा है (अंतिम लेखक), प्रति फ़ाइल एक दूसरा कैश प्रविष्टि नहीं।
412
+ - `file_tracking.filepath` नामस्थान कुंजी का उपयोग करता है: `doc-block:{index}:{relPath}` प्रति `documentations` ब्लॉक (`relPath` प्रोजेक्ट-रूट-सापेक्ष posix है: एकत्रित मार्कडाउन पथ; **JSON लेबल फ़ाइलें स्रोत फ़ाइल के लिए cwd-सापेक्ष पथ का उपयोग करती हैं**, जैसे `docs-site/i18n/en/code.json`, ताकि सफाई वास्तविक फ़ाइल को हल कर सके), और `svg-assets:{relPath}` स्वतंत्र SVG संपत्तियों के लिए `translate-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` चलाएँ एक पाइपलाइन चलाने के लिए: **UI स्ट्रिंग्स निकालें** (यदि `features.extractUIStrings`), **UI स्ट्रिंग्स का अनुवाद करें** (यदि `features.translateUIStrings`), **स्वतंत्र SVG संपत्तियों का अनुवाद करें** (यदि `features.translateSVG` और `svg` ब्लॉक सेट है), फिर **प्रलेखन का अनुवाद करें** (प्रत्येक `documentations` ब्लॉक: मार्कडाउन/JSON के रूप में कॉन्फ़िगर किया गया)। `--no-ui`, `--no-svg`, या `--no-docs` के साथ भागों को छोड़ें। दस्तावेज़ीकरण चरण `--dry-run`, `-p` / `--path`, `--force`, और `--force-update` को स्वीकार करता है (अंतिम दो केवल तभी लागू होते हैं जब प्रलेखन अनुवाद चलता है; यदि आप `--no-docs` पास करते हैं तो उन्हें अनदेखा कर दिया जाता है)।
475
+
476
+ एक ब्लॉक पर `documentations[].targetLocales` का उपयोग करें ताकि उस ब्लॉक की फ़ाइलों का अनुवाद UI की तुलना में **छोटे उपसमुच्चय** में किया जा सके (प्रभावी दस्तावेज़ स्थानीयताएँ ब्लॉकों के बीच **संघ** हैं):
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
+ - **पथ के साथ एक-तत्व ऐरे** (`["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
+ **अनुवाद-प्रलेख** और **अनुवाद-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` | मॉडल आईडी की प्राथमिक क्रमबद्ध सूची। पहले को पहले आजमाया जाता है; बाद में प्रविष्टियाँ त्रुटि पर बैकअप होती हैं। केवल `translate-ui` के लिए**, आप इस सूची से पहले एक मॉडल आजमाने के लिए `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 | डॉक्यूसॉरस JSON लेबल फ़ाइलों का अनुवाद करें। |
554
+ | `translateSVG` | 2 | स्वतंत्र `.svg` संपत्तियों का अनुवाद करें (शीर्ष-स्तरीय `svg` ब्लॉक की आवश्यकता होती है)।
555
+
556
+ `translate-svg` के साथ **स्वतंत्र** SVG संपत्तियों का अनुवाद करें जब `features.translateSVG` सत्य हो और एक शीर्ष-स्तरीय `svg` ब्लॉक कॉन्फ़िगर किया गया हो। `sync` कमांड उस चरण को चलाता है जब दोनों सेट हों (जब तक `--no-svg` न हो)।
557
+
558
+ ### `ui`
559
+
560
+ | फ़ील्ड | विवरण |
561
+ | --------------------------- | ----------------------------------------------------------------------- |
562
+ | `sourceRoots` | निर्देशिकाएँ (cwd के सापेक्ष) जिन्हें `t("…")` कॉल के लिए स्कैन किया जाता है। |
563
+ | `stringsJson` | मास्टर कैटलॉग फ़ाइल का मार्ग। `extract` द्वारा अपडेट किया जाता है। |
564
+ | `flatOutputDir` | निर्देशिका जहाँ प्रति-स्थानीय JSON फ़ाइलें लिखी जाती हैं (`de.json`, आदि)। |
565
+ | `preferredModel` | वैकल्पिक। केवल `translate-ui` के लिए पहले आज़माया गया OpenRouter मॉडल आईडी; फिर `openrouter.translationModels` (या पुराने मॉडल) क्रम में, इस आईडी को दोहराए बिना। |
566
+ | `reactExtractor.funcNames` | अतिरिक्त फ़ंक्शन नाम जिन्हें स्कैन किया जाएगा (डिफ़ॉल्ट: `["t", "i18n.t"]`)। |
567
+ | `reactExtractor.extensions` | शामिल करने के लिए फ़ाइल एक्सटेंशन (डिफ़ॉल्ट: `[".js", ".jsx", ".ts", ".tsx"]`)। |
568
+ | `reactExtractor.includePackageDescription` | जब `true` (डिफ़ॉल्ट), तो `extract` मौजूद होने पर `package.json` `description` को भी यूआई स्ट्रिंग के रूप में शामिल करता है। |
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` | अनुवादित मार्कडाउन **body** पर वैकल्पिक परिवर्तन (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`, और जब कम से कम एक खंड में मॉडल मेटाडेटा होता है, तो `translation_models` (OpenRouter मॉडल आईडी की क्रमबद्ध सूची)। छोड़ने के लिए `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`** सत्य हो (या तो `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` | एक CSV का मार्ग जिसमें कॉलम `Original language string` (या `en`), `locale`, `Translation` होते हैं - प्रत्येक स्रोत शब्द के लिए एक पंक्ति और लक्ष्य स्थानीयकरण (`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`) के लिए मार्कडाउन/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 में निर्यात करें (प्रत्येक लक्ष्य स्थानिकता के लिए एक `.xliff`)। `-o` / `--output-dir`: आउटपुट निर्देशिका (डिफ़ॉल्ट: कैटलॉग के समान फ़ोल्डर)। `--untranslated-only`: केवल उन इकाइयों को जिनके लिए उस स्थानिकता के लिए अनुवाद लापता है। केवल पढ़ने के लिए; कोई API नहीं। |
662
+ | `sync …` | निर्यात (यदि सक्षम है), फिर UI अनुवाद, फिर `translate-svg` जब `features.translateSVG` और `config.svg` सेट हों, फिर दस्तावेज़ीकरण अनुवाद - जब तक `--no-ui`, `--no-svg`, या `--no-docs` के साथ छोड़ा न जाए। साझा फ्लैग: `-l`, `-p`, `--dry-run`, `-j`, `-b` (केवल दस्तावेज़ बैचिंग), `--force` / `--force-update` (केवल दस्तावेज़; जब दस्तावेज़ चलते हैं तो परस्पर अनन्य)। |
663
+ | `status` | प्रत्येक फ़ाइल × स्थानिकता के लिए मार्कडाउन अनुवाद स्थिति दिखाएँ (कोई `--locale` फ़िल्टर नहीं; स्थानिकताएँ कॉन्फ़िग से आती हैं)। |
664
+ | `cleanup [--dry-run] [--no-backup] [--backup <path>]` | पहले `sync --force-update` चलाता है (निष्कर्षण, UI, SVG, दस्तावेज़), फिर बेकार सेगमेंट पंक्तियाँ हटाता है (null `last_hit_at` / खाली फ़ाइलपाथ); उन `file_tracking` पंक्तियों को छोड़ता है जिनका हल किया गया स्रोत पथ डिस्क पर लापता है; उन अनुवाद पंक्तियों को हटाता है जिनका `filepath` मेटाडेटा लापता फ़ाइल की ओर इशारा करता है। तीन गिनतियाँ लॉग करता है (बेकार, अनाथ `file_tracking`, अनाथ अनुवाद)। कैश निर्देशिका के तहत `--no-backup` के बिना एक समयसील SQLite बैकअप बनाता है। |
665
+ | `editor [-p <port>] [--no-open]` | कैश, `strings.json`, और शब्दावली CSV के लिए एक स्थानीय वेब संपादक लॉन्च करें। `--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`)। |