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,428 @@
1
+ # ai-i18n-tools: पैकेज अवलोकन
2
+
3
+ यह दस्तावेज़ `ai-i18n-tools` की आंतरिक वास्तुकला का वर्णन करता है, कि प्रत्येक घटक कैसे एक साथ फिट होता है, और कैसे दो मुख्य कार्यप्रवाह लागू किए जाते हैं।
4
+
5
+ व्यावहारिक उपयोग निर्देशों के लिए, देखें [GETTING_STARTED.md](GETTING_STARTED.hi.md)।
6
+
7
+ <small>**अन्य भाषाओं में पढ़ें:** </small>
8
+
9
+ <small id="lang-list">[en-GB](../../docs/PACKAGE_OVERVIEW.md) · [de](./PACKAGE_OVERVIEW.de.md) · [es](./PACKAGE_OVERVIEW.es.md) · [fr](./PACKAGE_OVERVIEW.fr.md) · [hi](./PACKAGE_OVERVIEW.hi.md) · [ja](./PACKAGE_OVERVIEW.ja.md) · [ko](./PACKAGE_OVERVIEW.ko.md) · [pt-BR](./PACKAGE_OVERVIEW.pt-BR.md) · [zh-CN](./PACKAGE_OVERVIEW.zh-CN.md) · [zh-TW](./PACKAGE_OVERVIEW.zh-TW.md)</small>
10
+
11
+ ---
12
+
13
+ <!-- START doctoc generated TOC please keep comment here to allow auto update -->
14
+ <!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
15
+ **सामग्री की तालिका**
16
+
17
+ - [वास्तुकला अवलोकन](#architecture-overview)
18
+ - [स्रोत पेड़](#source-tree)
19
+ - [कार्यप्रवाह 1 - UI अनुवाद आंतरिक](#workflow-1---ui-translation-internals)
20
+ - [`UIStringExtractor`](#uistringextractor)
21
+ - [`strings.json`](#stringsjson)
22
+ - [फ्लैट स्थानीय फ़ाइलें](#flat-locale-files)
23
+ - [UI अनुवाद संकेत](#ui-translation-prompts)
24
+ - [कार्यप्रवाह 2 - दस्तावेज़ अनुवाद आंतरिक](#workflow-2---document-translation-internals)
25
+ - [निकालने वाले](#extractors)
26
+ - [प्लेसहोल्डर सुरक्षा](#placeholder-protection)
27
+ - [कैश (`TranslationCache`)](#cache-translationcache)
28
+ - [आउटपुट पथ समाधान](#output-path-resolution)
29
+ - [फ्लैट लिंक पुनर्लेखन](#flat-link-rewriting)
30
+ - [साझा बुनियादी ढांचा](#shared-infrastructure)
31
+ - [`OpenRouterClient`](#openrouterclient)
32
+ - [कॉन्फ़िग लोड करना](#config-loading)
33
+ - [लॉगर](#logger)
34
+ - [रनटाइम हेल्पर्स API](#runtime-helpers-api)
35
+ - [RTL हेल्पर्स](#rtl-helpers)
36
+ - [i18next सेटअप फैक्टरियाँ](#i18next-setup-factories)
37
+ - [डिस्प्ले हेल्पर्स](#display-helpers)
38
+ - [स्ट्रिंग हेल्पर्स](#string-helpers)
39
+ - [प्रोग्रामेटिक API](#programmatic-api)
40
+ - [विस्तार बिंदु](#extension-points)
41
+ - [कस्टम फ़ंक्शन नाम (UI निकासी)](#custom-function-names-ui-extraction)
42
+ - [कस्टम निकालने वाले](#custom-extractors)
43
+ - [कस्टम आउटपुट पथ](#custom-output-paths)
44
+
45
+ <!-- END doctoc generated TOC please keep comment here to allow auto update -->
46
+
47
+ ---
48
+
49
+ ## वास्तुकला अवलोकन
50
+
51
+ ```
52
+ ai-i18n-tools
53
+ ├── CLI (src/cli/) - commands: init, extract, translate-docs, translate-svg, translate-ui, sync, status, …
54
+ ├── Core (src/core/) - config, types, cache, prompts, output paths, UI languages
55
+ ├── Extractors (src/extractors/) - segment extraction from JS/TS, markdown, JSON, SVG
56
+ ├── Processors (src/processors/) - placeholders, batching, validation, link rewriting
57
+ ├── API (src/api/) - OpenRouter HTTP client
58
+ ├── Glossary (src/glossary/) - glossary loading and term matching
59
+ ├── Runtime (src/runtime/) - i18next helpers, display helpers (no i18next import)
60
+ ├── Server (src/server/) - local Express web editor for cache / glossary
61
+ └── Utils (src/utils/) - logger, hash, ignore parser
62
+ ```
63
+
64
+ जो कुछ भी उपभोक्ताओं को प्रोग्रामेटिक रूप से आवश्यक हो, उसे `src/index.ts` से फिर से निर्यात किया गया है।
65
+
66
+ ---
67
+
68
+ ## स्रोत पेड़
69
+
70
+ ```
71
+ src/
72
+ ├── index.ts Public API re-exports
73
+ │
74
+ ├── cli/
75
+ │ ├── index.ts CLI entry point (commander)
76
+ │ ├── extract-strings.ts `extract` command implementation
77
+ │ ├── translate-ui-strings.ts `translate-ui` command implementation
78
+ │ ├── doc-translate.ts `translate-docs` command (documentation files only)
79
+ │ ├── translate-svg.ts `translate-svg` command (standalone assets from `config.svg`)
80
+ │ ├── helpers.ts Shared CLI utilities
81
+ │ └── file-utils.ts File collection helpers
82
+ │
83
+ ├── core/
84
+ │ ├── types.ts Zod schemas + TypeScript types for all config shapes
85
+ │ ├── config.ts Config loading, merging, validation, init templates
86
+ │ ├── cache.ts SQLite translation cache (node:sqlite)
87
+ │ ├── prompt-builder.ts LLM prompt construction for docs and UI strings
88
+ │ ├── output-paths.ts Docusaurus / flat output path resolution
89
+ │ ├── ui-languages.ts ui-languages.json loading and locale resolution
90
+ │ ├── locale-utils.ts BCP-47 normalization and locale list parsing
91
+ │ └── errors.ts Typed error classes
92
+ │
93
+ ├── extractors/
94
+ │ ├── base-extractor.ts Abstract base class for all extractors
95
+ │ ├── ui-string-extractor.ts JS/TS source scanner (i18next-scanner)
96
+ │ ├── classify-segment.ts Heuristic segment type classification
97
+ │ ├── markdown-extractor.ts Markdown / MDX segment extraction
98
+ │ ├── json-extractor.ts JSON label file extraction
99
+ │ └── svg-extractor.ts SVG text extraction
100
+ │
101
+ ├── processors/
102
+ │ ├── placeholder-handler.ts Chain: admonitions → anchors → URLs
103
+ │ ├── url-placeholders.ts Markdown URL protection/restore
104
+ │ ├── admonition-placeholders.ts Docusaurus admonition protection/restore
105
+ │ ├── anchor-placeholders.ts HTML anchor / heading ID protection/restore
106
+ │ ├── batch-processor.ts Segment → batch grouping (count + char limits)
107
+ │ ├── validator.ts Post-translation structural checks
108
+ │ └── flat-link-rewrite.ts Relative link rewriting for flat output
109
+ │
110
+ ├── api/
111
+ │ └── openrouter.ts OpenRouter HTTP client with model fallback chain
112
+ │
113
+ ├── glossary/
114
+ │ ├── glossary.ts Glossary loading (CSV + auto-build from strings.json)
115
+ │ └── matcher.ts Term hint extraction for prompts
116
+ │
117
+ ├── runtime/
118
+ │ ├── index.ts Runtime re-exports
119
+ │ ├── template.ts interpolateTemplate, flipUiArrowsForRtl
120
+ │ ├── ui-language-display.ts getUILanguageLabel, getUILanguageLabelNative
121
+ │ └── i18next-helpers.ts RTL detection, i18next setup factories
122
+ │
123
+ ├── server/
124
+ │ └── translation-editor.ts Express app for cache / strings.json / glossary editor
125
+ │
126
+ └── utils/
127
+ ├── logger.ts Leveled logger with ANSI support
128
+ ├── hash.ts Segment hash (SHA-256 first 16 hex)
129
+ └── ignore-parser.ts .translate-ignore file parser
130
+ ```
131
+
132
+ ---
133
+
134
+ ## कार्यप्रवाह 1 - UI अनुवाद आंतरिक
135
+
136
+ ```
137
+ source files (JS/TS)
138
+ │
139
+ ▼ UIStringExtractor (i18next-scanner Parser)
140
+ strings.json ─────────────────── master catalog
141
+ │ { hash: { source, translated, models?, locations? } }
142
+ ▼
143
+ OpenRouterClient.translateUIBatch()
144
+ │ sends JSON array of source strings, receives JSON array of translations (+ model id per batch)
145
+ ▼
146
+ de.json, pt-BR.json … ─────────── per-locale flat maps: source → translation (no model metadata)
147
+ ```
148
+
149
+ ### `UIStringExtractor`
150
+
151
+ `i18next-scanner` के `Parser.parseFuncFromString` का उपयोग `t("literal")` और `i18n.t("literal")` कॉल को किसी भी JS/TS फ़ाइल में खोजने के लिए किया जाता है। फ़ंक्शन नाम और फ़ाइल एक्सटेंशन कॉन्फ़िगर करने योग्य हैं, और निकासी में प्रोजेक्ट `package.json` `description` को भी शामिल किया जा सकता है जब `reactExtractor.includePackageDescription` सक्षम हो। खंड हैश **MD5 पहले 8 हेक्स वर्ण** होते हैं ट्रिम किए गए स्रोत स्ट्रिंग के - ये `strings.json` में कुंजी बन जाते हैं।
152
+
153
+ ### `strings.json`
154
+
155
+ मास्टर कैटलॉग का आकार है:
156
+
157
+ ```json
158
+ {
159
+ "<md5-8>": {
160
+ "source": "The English string",
161
+ "translated": {
162
+ "de": "Der deutsche Text",
163
+ "pt-BR": "O texto em português"
164
+ },
165
+ "models": {
166
+ "de": "anthropic/claude-3.5-haiku",
167
+ "pt-BR": "openai/gpt-4o"
168
+ },
169
+ "locations": [{ "file": "src/app/page.tsx", "line": 51 }]
170
+ }
171
+ }
172
+ ```
173
+
174
+ `models` (वैकल्पिक) — प्रति स्थान, जिस मॉडल ने उस स्थान के लिए अंतिम सफल `translate-ui` चलने के बाद उस अनुवाद का उत्पादन किया (या `user-edited` यदि पाठ `editor` वेब यूआई से सहेजा गया था)। `locations` (वैकल्पिक) — जहां `extract` ने स्ट्रिंग पाई।
175
+
176
+ `extract` नए कुंजियाँ जोड़ता है और स्कैन में अभी भी मौजूद कुंजियों के लिए मौजूदा `translated` / `models` डेटा को बरकरार रखता है। `translate-ui` लुप्त `translated` प्रविष्टियों को भरता है, उन स्थानों के लिए `models` को अपडेट करता है जिनका अनुवाद करता है, और सपाट स्थान फ़ाइलें लिखता है।
177
+
178
+ ### फ्लैट स्थानीय फ़ाइलें
179
+
180
+ प्रत्येक लक्ष्य स्थान को स्रोत स्ट्रिंग → अनुवाद (कोई `models` फ़ील्ड नहीं) के मैपिंग वाली एक सपाट JSON फ़ाइल (`de.json`) मिलती है:
181
+
182
+ ```json
183
+ {
184
+ "The English string": "Der deutsche Text",
185
+ "Save": "Speichern"
186
+ }
187
+ ```
188
+
189
+ i18next इन्हें संसाधन बंडलों के रूप में लोड करता है और स्रोत स्ट्रिंग (की-के-रूप में डिफ़ॉल्ट मॉडल) द्वारा अनुवादों को देखता है।
190
+
191
+ ### UI अनुवाद संकेत
192
+
193
+ `buildUIPromptMessages` सिस्टम + उपयोगकर्ता संदेशों का निर्माण करता है जो:
194
+ - स्रोत और लक्ष्य भाषाओं की पहचान करते हैं (प्रदर्शन नाम द्वारा `localeDisplayNames` या `ui-languages.json` से)।
195
+ - स्ट्रिंग्स का एक JSON ऐरे भेजते हैं और अनुवादों का एक JSON ऐरे वापस मांगते हैं।
196
+ - उपलब्ध होने पर शब्दकोश संकेत शामिल करते हैं।
197
+
198
+ `OpenRouterClient.translateUIBatch` प्रत्येक मॉडल को क्रम में आज़माता है, पार्स या नेटवर्क त्रुटियों पर वापस जाता है। CLI `openrouter.translationModels` (या पुराने डिफ़ॉल्ट/फॉलबैक) से उस सूची का निर्माण करता है; `translate-ui` के लिए, वैकल्पिक `ui.preferredModel` सेट होने पर इसे आगे जोड़ दिया जाता है (शेष के खिलाफ डुप्लिकेट हटाकर)।
199
+
200
+ ---
201
+
202
+ ## कार्यप्रवाह 2 - दस्तावेज़ अनुवाद आंतरिक
203
+
204
+ ```
205
+ markdown/MDX/JSON files (`translate-docs`)
206
+ │
207
+ ▼ MarkdownExtractor / JsonExtractor
208
+ segments[] ─────────────────── typed segments with hash + content
209
+ │
210
+ ▼ PlaceholderHandler
211
+ protected text ──────────────── URLs, admonitions, anchors replaced with tokens
212
+ │
213
+ ▼ splitTranslatableIntoBatches
214
+ batches[] ───────────────────── grouped by count + char limit
215
+ │
216
+ ▼ TranslationCache lookup
217
+ cache hit → skip, miss → OpenRouterClient.translateDocumentBatch
218
+ │
219
+ ▼ PlaceholderHandler.restoreAfterTranslation
220
+ final text ──────────────────── placeholders restored
221
+ │
222
+ ▼ resolveDocumentationOutputPath
223
+ output file ─────────────────── Docusaurus layout or flat layout
224
+ ```
225
+
226
+ ### निकालने वाले
227
+
228
+ सभी एक्सट्रैक्टर `BaseExtractor` का विस्तार करते हैं और `extract(content, filepath): Segment[]` को लागू करते हैं।
229
+
230
+ - `MarkdownExtractor` - मार्कडाउन को टाइप किए गए खंडों में विभाजित करता है: `frontmatter`, `heading`, `paragraph`, `code`, `admonition`। गैर-अनुवाद योग्य खंडों (कोड ब्लॉक, रॉ HTML) को शाब्दिक रूप से संरक्षित किया जाता है।
231
+ - `JsonExtractor` - डॉक्यूसॉरस JSON लेबल फ़ाइलों से स्ट्रिंग मान निकालता है।
232
+ - `SvgExtractor` - SVG से `<text>`, `<title>`, और `<desc>` सामग्री निकालता है (`translate-svg` द्वारा `config.svg` के तहत संपत्तियों के लिए उपयोग किया जाता है, `translate-docs` द्वारा नहीं)।
233
+
234
+ ### प्लेसहोल्डर संरक्षण
235
+
236
+ अनुवाद से पहले, संवेदनशील सिंटैक्स को LLM भ्रष्टाचार को रोकने के लिए अपारदर्शी टोकन से बदल दिया जाता है:
237
+
238
+ 1. **एडमॉनिशन मार्कर** (`:::note`, `:::`) - सटीक मूल पाठ के साथ पुनर्स्थापित किए जाते हैं।
239
+ 2. **डॉक एंकर** (HTML `<a id="…">`, डॉक्यूसॉरस शीर्षक `{#…}`) - यथावत संरक्षित किए जाते हैं।
240
+ 3. **मार्कडाउन URL** (`](url)`, `src="../…"`) - अनुवाद के बाद एक मैप से पुनर्स्थापित किए जाते हैं।
241
+
242
+ ### कैश (`TranslationCache`)
243
+
244
+ SQLite डेटाबेस (`node:sqlite` के माध्यम से) `(source_hash, locale)` द्वारा कुंजीबद्ध पंक्तियों को `translated_text`, `model`, `filepath`, `last_hit_at`, और संबंधित फ़ील्ड्स के साथ संग्रहीत करता है। हैश सामान्यीकृत सामग्री (व्हाइटस्पेस संकुचित) के SHA-256 के पहले 16 हेक्स वर्ण हैं।
245
+
246
+ प्रत्येक रन पर, सेगमेंट को हैश × लोकेल द्वारा देखा जाता है। केवल कैश मिस LLM को जाते हैं। अनुवाद के बाद, वर्तमान अनुवाद स्कोप में उन सेगमेंट पंक्तियों के लिए `last_hit_at` रीसेट कर दिया जाता है जिन पर हिट नहीं हुई थी। `cleanup` पहले `sync --force-update` चलाता है, फिर पुरानी सेगमेंट पंक्तियों (null `last_hit_at` / खाली filepath) को हटाता है, `file_tracking` कुंजियों को तब प्रून करता है जब हल किया गया सोर्स पथ डिस्क पर गायब होता है (`doc-block:…`, `svg-assets:…`, आदि), और उन अनुवाद पंक्तियों को हटाता है जिनकी मेटाडेटा filepath एक गायब फ़ाइल की ओर इशारा करती है; यह `--no-backup` पास नहीं किए जाने तक पहले `cache.db` का बैकअप लेता है।
247
+
248
+ `translate-docs` कमांड **फ़ाइल ट्रैकिंग** का भी उपयोग करता है ताकि अपरिवर्तित स्रोतों के साथ मौजूदा आउटपुट पूरी तरह से काम को छोड़ सकें। `--force-update` फ़ाइल प्रोसेसिंग को फिर से चलाता है जबकि अभी भी सेगमेंट कैश का उपयोग करता है; `--force` फ़ाइल ट्रैकिंग को साफ़ करता है और API अनुवाद के लिए सेगमेंट कैश रीड को बायपास करता है। पूर्ण फ्लैग टेबल के लिए [प्रारंभ करना](GETTING_STARTED.hi.md#cache-behaviour-and-translate-docs-flags) देखें।
249
+
250
+ **बैच प्रॉम्प्ट प्रारूप:** `translate-docs --prompt-format` केवल `OpenRouterClient.translateDocumentBatch` के लिए XML (`<seg>` / `<t>`) या JSON सरणी/ऑब्जेक्ट आकृतियों का चयन करता है; निष्कर्षण, प्लेसहोल्डर और सत्यापन अपरिवर्तित रहते हैं। [बैच प्रॉम्प्ट प्रारूप](GETTING_STARTED.hi.md#batch-prompt-format) देखें।
251
+
252
+ ### आउटपुट पथ रिज़ॉल्यूशन
253
+
254
+ `resolveDocumentationOutputPath(config, cwd, locale, relPath, kind)` एक स्रोत.सापेक्ष पथ को आउटपुट पथ पर मैप करता है:
255
+
256
+ - `nested` शैली (डिफ़ॉल्ट): मार्कडाउन के लिए `{outputDir}/{locale}/{relPath}`।
257
+ - `docusaurus` शैली: `docsRoot` के तहत, आउटपुट `{outputDir}/{locale}/docusaurus-plugin-content-docs/current/{relativeToDocsRoot}` का उपयोग करते हैं; `docsRoot` के बाहर के मार्ग नेस्टेड लेआउट पर वापस आ जाते हैं।
258
+ - `flat` शैली: `{outputDir}/{stem}.{locale}{extension}`। जब `flatPreserveRelativeDir` `true` होता है, तो स्रोत उपनिर्देशिकाओं को `outputDir` के तहत बरकरार रखा जाता है।
259
+ - **कस्टम** `pathTemplate`: `{outputDir}`, `{locale}`, `{LOCALE}`, `{relPath}`, `{stem}`, `{basename}`, `{extension}`, `{docsRoot}`, `{relativeToDocsRoot}` का उपयोग करके कोई भी मार्कडाउन लेआउट।
260
+ - **कस्टम** `jsonPathTemplate`: JSON लेबल फ़ाइलों के लिए एक अलग कस्टम लेआउट, समान प्लेसहोल्डर का उपयोग करके।
261
+ - `linkRewriteDocsRoot` सपाट-लिंक पुनःलेखक को सही उपसर्ग की गणना करने में मदद करता है जब अनुवादित आउटपुट डिफ़ॉल्ट प्रोजेक्ट रूट के बजाय कहीं और स्थित होता है।
262
+
263
+ ### फ्लैट लिंक रीराइटिंग
264
+
265
+ जब `markdownOutput.style === "flat"` होता है, तो अनुवादित मार्कडाउन फ़ाइलें स्रोत के साथ लोकेल सफ़िक्स के साथ रखी जाती हैं। पृष्ठों के बीच रिलेटिव लिंक्स को रीराइट किया जाता है ताकि `readme.de.md` में `[Guide](../guide.md)` `guide.de.md` की ओर इशारा करे। `rewriteRelativeLinks` द्वारा नियंत्रित (कस्टम `pathTemplate` के बिना फ्लैट शैली के लिए स्वचालित रूप से सक्षम)।
266
+
267
+ ---
268
+
269
+ ## साझा अवसंरचना
270
+
271
+ ### `OpenRouterClient`
272
+
273
+ ओपनराउटर चैट पूर्णता API को रैप करता है। प्रमुख व्यवहार:
274
+
275
+ - **मॉडल फॉलबैक**: क्रम में हल की गई सूची में प्रत्येक मॉडल का प्रयास करता है; HTTP त्रुटियों या पार्स विफलताओं पर फॉल बैक करता है। UI अनुवाद पहले `ui.preferredModel` को हल करता है जब यह मौजूद होता है, फिर `openrouter` मॉडल।
276
+ - **रेट लिमिटिंग**: 429 प्रतिक्रियाओं का पता लगाता है, `retry-after` (या 2 सेकंड) का इंतजार करता है, एक बार पुनः प्रयास करता है।
277
+ - **प्रॉम्प्ट कैशिंग**: सिस्टम संदेश को `cache_control: { type: "ephemeral" }` के साथ भेजा जाता है ताकि समर्थित मॉडलों पर प्रॉम्प्ट कैशिंग सक्षम हो सके।
278
+ - **डीबग ट्रैफिक लॉग**: यदि `debugTrafficFilePath` सेट है, तो अनुरोध और प्रतिक्रिया JSON को एक फ़ाइल में जोड़ा जाता है।
279
+
280
+ ### कॉन्फ़िग लोडिंग
281
+
282
+ `loadI18nConfigFromFile(configPath, cwd)` पाइपलाइन:
283
+
284
+ 1. `ai-i18n-tools.config.json` (JSON) को पढ़ें और पार्स करें।
285
+ 2. `mergeWithDefaults` - `defaultI18nConfigPartial` के साथ गहराई से मर्ज करें, और किसी भी `documentations[].sourceFiles` प्रविष्टियों को `contentPaths` में मर्ज करें।
286
+ 3. `expandTargetLocalesFileReferenceInRawInput` - यदि `targetLocales` एक फ़ाइल पथ है, तो मैनिफेस्ट को लोड करें और स्थानीय कोड में विस्तारित करें; `uiLanguagesPath` सेट करें।
287
+ 4. `expandDocumentationTargetLocalesInRawInput` - प्रत्येक `documentations[].targetLocales` प्रविष्टि के लिए समान।
288
+ 5. `parseI18nConfig` - Zod मान्यता + `validateI18nBusinessRules`।
289
+ 6. `applyEnvOverrides` - `OPENROUTER_API_KEY`, `I18N_SOURCE_LOCALE`, आदि लागू करें।
290
+ 7. `augmentConfigWithUiLanguagesFile` - मैनिफेस्ट डिस्प्ले नाम संलग्न करें।
291
+
292
+ ### लॉगर
293
+
294
+ `Logger` `debug`, `info`, `warn`, `error` स्तरों का समर्थन करता है जिसमें ANSI रंग आउटपुट होता है। विस्तृत मोड (`-v`) `debug` सक्षम करता है। जब `logFilePath` सेट होता है, तो लॉग पंक्तियाँ उस फ़ाइल में भी लिखी जाती हैं।
295
+
296
+ ---
297
+
298
+ ## रनटाइम हेल्पर्स API
299
+
300
+ ये `'ai-i18n-tools/runtime'` से निर्यातित होते हैं और किसी भी जावास्क्रिप्ट वातावरण (ब्राउज़र, Node.js, Deno, Edge) में काम करते हैं। ये `i18next` या `react-i18next` से **नहीं** आयात करते हैं।
301
+
302
+ ### RTL हेल्पर्स
303
+
304
+ ```ts
305
+ RTL_LANGS: ReadonlySet<string>
306
+ getTextDirection(lng: string): 'ltr' | 'rtl'
307
+ applyDirection(lng: string, element?: Element): void
308
+ ```
309
+
310
+ ### i18next सेटअप फैक्ट्रियां
311
+
312
+ ```ts
313
+ defaultI18nInitOptions(sourceLocale?: string): i18nextInitOptions
314
+ wrapI18nWithKeyTrim(i18n: I18nLike): void
315
+ makeLoadLocale(
316
+ i18n: I18nWithResources,
317
+ localeLoaders: Record<string, () => Promise<unknown>>,
318
+ sourceLocale?: string
319
+ ): (lang: string) => Promise<void>
320
+ ```
321
+
322
+ ### डिस्प्ले हेल्पर्स
323
+
324
+ ```ts
325
+ getUILanguageLabel(lang: UiLanguageEntry, t: TranslateFn): string
326
+ getUILanguageLabelNative(lang: UiLanguageEntry): string
327
+ ```
328
+
329
+ ### स्ट्रिंग हेल्पर्स
330
+
331
+ ```ts
332
+ interpolateTemplate(str: string, vars: Record<string, string | number | boolean>): string
333
+ flipUiArrowsForRtl(text: string | null | undefined, isRtl: boolean): string | null | undefined
334
+ ```
335
+
336
+ ---
337
+
338
+ ## प्रोग्रामेटिक API
339
+
340
+ सभी सार्वजनिक प्रकार और कक्षाएँ पैकेज रूट से निर्यातित होती हैं। उदाहरण: CLI के बिना Node.js से translate-UI चरण चलाना:
341
+
342
+ ```ts
343
+ import { loadI18nConfigFromFile, runTranslateUI } from 'ai-i18n-tools';
344
+
345
+ // Config must have features.translateUIStrings: true (and valid targetLocales, etc.).
346
+ const config = loadI18nConfigFromFile('ai-i18n-tools.config.json');
347
+
348
+ const summary = await runTranslateUI(config, {
349
+ cwd: process.cwd(),
350
+ locales: config.targetLocales,
351
+ force: false,
352
+ dryRun: false,
353
+ verbose: false,
354
+ });
355
+ console.log(
356
+ `Updated ${summary.stringsUpdated} string(s); locales touched: ${summary.localesTouched.join(', ')}`
357
+ );
358
+ ```
359
+
360
+ मुख्य निर्यात:
361
+
362
+ | निर्यात | विवरण |
363
+ |---|---|
364
+ | `loadI18nConfigFromFile` | JSON फ़ाइल से कॉन्फ़िग लोड, मर्ज, मान्य करें। |
365
+ | `parseI18nConfig` | एक कच्चे कॉन्फ़िग ऑब्जेक्ट को मान्य करें। |
366
+ | `TranslationCache` | SQLite कैश - `cacheDir` पथ के साथ इंस्टेंटिएट करें। |
367
+ | `UIStringExtractor` | JS/TS स्रोत से `t("…")` स्ट्रिंग्स निकालें। |
368
+ | `MarkdownExtractor` | मार्कडाउन से अनुवाद योग्य खंड निकालें। |
369
+ | `JsonExtractor` | Docusaurus JSON लेबल फ़ाइलों से निकालें। |
370
+ | `SvgExtractor` | SVG फ़ाइलों से निकालें। |
371
+ | `OpenRouterClient` | OpenRouter के लिए अनुवाद अनुरोध करें। |
372
+ | `PlaceholderHandler` | अनुवाद के चारों ओर मार्कडाउन सिंटैक्स की सुरक्षा/पुनर्स्थापना करें। |
373
+ | `splitTranslatableIntoBatches` | खंडों को LLM-आकार के बैचों में समूहित करें। |
374
+ | `validateTranslation` | अनुवाद के बाद संरचनात्मक जांचें। |
375
+ | `resolveDocumentationOutputPath` | अनुवादित दस्तावेज़ के लिए आउटपुट फ़ाइल पथ हल करें। |
376
+ | `Glossary` / `GlossaryMatcher` | अनुवाद शब्दकोश लोड और लागू करें। |
377
+ | `runTranslateUI` | प्रोग्रामेटिक translate-UI प्रवेश बिंदु। |
378
+
379
+ ---
380
+
381
+ ## एक्सटेंशन पॉइंट्स
382
+
383
+ ### कस्टम फ़ंक्शन नाम (UI निष्कर्षण)
384
+
385
+ कॉन्फ़िग के माध्यम से गैर-मानक अनुवाद फ़ंक्शन नाम जोड़ें:
386
+
387
+ ```json
388
+ {
389
+ "ui": {
390
+ "reactExtractor": {
391
+ "funcNames": ["t", "i18n.t", "translate", "i18n.translate"]
392
+ }
393
+ }
394
+ }
395
+ ```
396
+
397
+ ### कस्टम निष्कर्षणकर्ता
398
+
399
+ पैकेज से `ContentExtractor` लागू करें:
400
+
401
+ ```ts
402
+ import { BaseExtractor, type Segment } from 'ai-i18n-tools';
403
+
404
+ class MyExtractor extends BaseExtractor {
405
+ readonly name = 'my-format';
406
+ canHandle(filepath: string) { return filepath.endsWith('.myext'); }
407
+ extract(content: string): Segment[] { /* … */ }
408
+ reassemble(segments: Segment[], translations: Map<string, string>): string { /* … */ }
409
+ }
410
+ ```
411
+
412
+ इसे `doc-translate.ts` उपयोगिताओं को प्रोग्रामेटिक रूप से आयात करके दस्तावेज़-अनुवाद पाइपलाइन में पास करें।
413
+
414
+ ### कस्टम आउटपुट पथ
415
+
416
+ किसी भी फ़ाइल लेआउट के लिए `markdownOutput.pathTemplate` का उपयोग करें:
417
+
418
+ ```json
419
+ {
420
+ "documentations": [
421
+ {
422
+ "markdownOutput": {
423
+ "pathTemplate": "{outputDir}/{locale}/{relativeToDocsRoot}"
424
+ }
425
+ }
426
+ ]
427
+ }
428
+ ```