@intlayer/docs 7.4.0 → 7.5.0-canary.1

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 (298) hide show
  1. package/blog/ar/intlayer_with_i18next.md +2 -0
  2. package/blog/ar/intlayer_with_next-i18next.md +2 -0
  3. package/blog/ar/intlayer_with_next-intl.md +2 -0
  4. package/blog/ar/intlayer_with_react-i18next.md +2 -0
  5. package/blog/ar/intlayer_with_react-intl.md +2 -0
  6. package/blog/ar/intlayer_with_vue-i18n.md +2 -0
  7. package/blog/de/intlayer_with_i18next.md +2 -0
  8. package/blog/de/intlayer_with_next-i18next.md +1 -0
  9. package/blog/de/intlayer_with_next-intl.md +2 -0
  10. package/blog/de/intlayer_with_react-i18next.md +2 -0
  11. package/blog/de/intlayer_with_react-intl.md +2 -0
  12. package/blog/de/intlayer_with_vue-i18n.md +2 -0
  13. package/blog/en/intlayer_with_i18next.md +6 -0
  14. package/blog/en/intlayer_with_next-i18next.md +3 -0
  15. package/blog/en/intlayer_with_next-intl.md +3 -0
  16. package/blog/en/intlayer_with_react-i18next.md +3 -0
  17. package/blog/en/intlayer_with_react-intl.md +3 -0
  18. package/blog/en/intlayer_with_vue-i18n.md +3 -0
  19. package/blog/en-GB/intlayer_with_i18next.md +2 -0
  20. package/blog/en-GB/intlayer_with_next-i18next.md +2 -0
  21. package/blog/en-GB/intlayer_with_next-intl.md +2 -0
  22. package/blog/en-GB/intlayer_with_react-i18next.md +2 -0
  23. package/blog/en-GB/intlayer_with_react-intl.md +2 -0
  24. package/blog/en-GB/intlayer_with_vue-i18n.md +2 -0
  25. package/blog/es/intlayer_with_i18next.md +2 -0
  26. package/blog/es/intlayer_with_next-i18next.md +2 -0
  27. package/blog/es/intlayer_with_next-intl.md +2 -0
  28. package/blog/es/intlayer_with_react-i18next.md +2 -0
  29. package/blog/es/intlayer_with_react-intl.md +2 -0
  30. package/blog/es/intlayer_with_vue-i18n.md +2 -0
  31. package/blog/fr/intlayer_with_i18next.md +2 -0
  32. package/blog/fr/intlayer_with_next-i18next.md +2 -0
  33. package/blog/fr/intlayer_with_next-intl.md +2 -0
  34. package/blog/fr/intlayer_with_react-i18next.md +2 -0
  35. package/blog/fr/intlayer_with_react-intl.md +2 -0
  36. package/blog/fr/intlayer_with_vue-i18n.md +2 -0
  37. package/blog/hi/intlayer_with_i18next.md +2 -0
  38. package/blog/hi/intlayer_with_next-i18next.md +2 -0
  39. package/blog/hi/intlayer_with_next-intl.md +2 -0
  40. package/blog/hi/intlayer_with_react-i18next.md +2 -0
  41. package/blog/hi/intlayer_with_react-intl.md +2 -0
  42. package/blog/hi/intlayer_with_vue-i18n.md +2 -0
  43. package/blog/id/intlayer_with_i18next.md +2 -0
  44. package/blog/id/intlayer_with_next-i18next.md +2 -0
  45. package/blog/id/intlayer_with_next-intl.md +2 -0
  46. package/blog/id/intlayer_with_react-i18next.md +2 -0
  47. package/blog/id/intlayer_with_react-intl.md +2 -0
  48. package/blog/id/intlayer_with_vue-i18n.md +2 -0
  49. package/blog/it/intlayer_with_i18next.md +2 -0
  50. package/blog/it/intlayer_with_next-i18next.md +2 -0
  51. package/blog/it/intlayer_with_next-intl.md +2 -0
  52. package/blog/it/intlayer_with_react-i18next.md +2 -0
  53. package/blog/it/intlayer_with_react-intl.md +2 -0
  54. package/blog/it/intlayer_with_vue-i18n.md +2 -0
  55. package/blog/ja/intlayer_with_i18next.md +2 -0
  56. package/blog/ja/intlayer_with_next-i18next.md +1 -0
  57. package/blog/ja/intlayer_with_next-intl.md +2 -0
  58. package/blog/ja/intlayer_with_react-i18next.md +2 -0
  59. package/blog/ja/intlayer_with_react-intl.md +2 -0
  60. package/blog/ja/intlayer_with_vue-i18n.md +2 -0
  61. package/blog/ko/intlayer_with_i18next.md +2 -0
  62. package/blog/ko/intlayer_with_next-i18next.md +2 -0
  63. package/blog/ko/intlayer_with_next-intl.md +2 -0
  64. package/blog/ko/intlayer_with_react-i18next.md +2 -0
  65. package/blog/ko/intlayer_with_react-intl.md +2 -0
  66. package/blog/ko/intlayer_with_vue-i18n.md +2 -0
  67. package/blog/pl/intlayer_with_i18next.md +2 -0
  68. package/blog/pl/intlayer_with_next-i18next.md +2 -0
  69. package/blog/pl/intlayer_with_next-intl.md +2 -0
  70. package/blog/pl/intlayer_with_react-i18next.md +2 -0
  71. package/blog/pl/intlayer_with_react-intl.md +2 -0
  72. package/blog/pl/intlayer_with_vue-i18n.md +2 -0
  73. package/blog/pt/intlayer_with_i18next.md +2 -0
  74. package/blog/pt/intlayer_with_next-i18next.md +2 -0
  75. package/blog/pt/intlayer_with_next-intl.md +2 -0
  76. package/blog/pt/intlayer_with_react-i18next.md +2 -0
  77. package/blog/pt/intlayer_with_react-intl.md +2 -0
  78. package/blog/pt/intlayer_with_vue-i18n.md +2 -0
  79. package/blog/ru/intlayer_with_i18next.md +2 -0
  80. package/blog/ru/intlayer_with_next-i18next.md +2 -0
  81. package/blog/ru/intlayer_with_next-intl.md +2 -0
  82. package/blog/ru/intlayer_with_react-i18next.md +2 -0
  83. package/blog/ru/intlayer_with_react-intl.md +2 -0
  84. package/blog/ru/intlayer_with_vue-i18n.md +2 -0
  85. package/blog/tr/intlayer_with_i18next.md +2 -0
  86. package/blog/tr/intlayer_with_next-i18next.md +2 -0
  87. package/blog/tr/intlayer_with_next-intl.md +2 -0
  88. package/blog/tr/intlayer_with_react-i18next.md +2 -0
  89. package/blog/tr/intlayer_with_react-intl.md +2 -0
  90. package/blog/tr/intlayer_with_vue-i18n.md +2 -0
  91. package/blog/vi/intlayer_with_i18next.md +2 -0
  92. package/blog/vi/intlayer_with_next-i18next.md +2 -0
  93. package/blog/vi/intlayer_with_next-intl.md +2 -0
  94. package/blog/vi/intlayer_with_react-i18next.md +2 -0
  95. package/blog/vi/intlayer_with_react-intl.md +2 -0
  96. package/blog/vi/intlayer_with_vue-i18n.md +2 -0
  97. package/blog/zh/intlayer_with_i18next.md +2 -0
  98. package/blog/zh/intlayer_with_next-i18next.md +2 -0
  99. package/blog/zh/intlayer_with_next-intl.md +2 -0
  100. package/blog/zh/intlayer_with_react-i18next.md +2 -0
  101. package/blog/zh/intlayer_with_react-intl.md +2 -0
  102. package/blog/zh/intlayer_with_vue-i18n.md +2 -0
  103. package/dist/cjs/generated/docs.entry.cjs +19 -0
  104. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  105. package/dist/esm/generated/docs.entry.mjs +19 -0
  106. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  107. package/dist/types/generated/docs.entry.d.ts +1 -0
  108. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  109. package/docs/ar/cli/index.md +5 -0
  110. package/docs/ar/cli/login.md +157 -0
  111. package/docs/ar/configuration.md +12 -0
  112. package/docs/ar/dictionary/content_file.md +24 -1
  113. package/docs/ar/intlayer_with_astro.md +1 -1
  114. package/docs/ar/intlayer_with_express.md +1 -1
  115. package/docs/ar/intlayer_with_nestjs.md +1 -1
  116. package/docs/ar/intlayer_with_next-i18next.md +1 -0
  117. package/docs/ar/intlayer_with_next-intl.md +1 -0
  118. package/docs/ar/intlayer_with_tanstack.md +1 -12
  119. package/docs/ar/plugins/sync-json.md +27 -2
  120. package/docs/de/cli/index.md +5 -0
  121. package/docs/de/cli/login.md +160 -0
  122. package/docs/de/configuration.md +12 -0
  123. package/docs/de/dictionary/content_file.md +24 -1
  124. package/docs/de/intlayer_with_astro.md +1 -1
  125. package/docs/de/intlayer_with_express.md +1 -1
  126. package/docs/de/intlayer_with_nestjs.md +1 -1
  127. package/docs/de/intlayer_with_next-i18next.md +1 -0
  128. package/docs/de/intlayer_with_next-intl.md +1 -0
  129. package/docs/de/intlayer_with_tanstack.md +1 -12
  130. package/docs/de/plugins/sync-json.md +27 -2
  131. package/docs/en/cli/index.md +5 -0
  132. package/docs/en/cli/login.md +157 -0
  133. package/docs/en/configuration.md +13 -0
  134. package/docs/en/dictionary/content_file.md +24 -1
  135. package/docs/en/index.md +1 -0
  136. package/docs/en/intlayer_with_astro.md +1 -1
  137. package/docs/en/intlayer_with_express.md +1 -1
  138. package/docs/en/intlayer_with_nestjs.md +1 -2
  139. package/docs/en/intlayer_with_next-i18next.md +1 -0
  140. package/docs/en/intlayer_with_next-intl.md +1 -0
  141. package/docs/en/intlayer_with_tanstack.md +7 -17
  142. package/docs/en/plugins/sync-json.md +53 -2
  143. package/docs/en-GB/cli/index.md +5 -0
  144. package/docs/en-GB/cli/login.md +181 -0
  145. package/docs/en-GB/configuration.md +12 -0
  146. package/docs/en-GB/dictionary/content_file.md +24 -1
  147. package/docs/en-GB/intlayer_with_astro.md +1 -1
  148. package/docs/en-GB/intlayer_with_express.md +1 -1
  149. package/docs/en-GB/intlayer_with_nestjs.md +1 -1
  150. package/docs/en-GB/intlayer_with_next-i18next.md +1 -0
  151. package/docs/en-GB/intlayer_with_next-intl.md +1 -0
  152. package/docs/en-GB/intlayer_with_tanstack.md +1 -12
  153. package/docs/en-GB/plugins/sync-json.md +26 -1
  154. package/docs/es/cli/index.md +5 -0
  155. package/docs/es/cli/login.md +182 -0
  156. package/docs/es/configuration.md +12 -0
  157. package/docs/es/dictionary/content_file.md +24 -1
  158. package/docs/es/intlayer_with_astro.md +1 -1
  159. package/docs/es/intlayer_with_express.md +1 -1
  160. package/docs/es/intlayer_with_nestjs.md +1 -1
  161. package/docs/es/intlayer_with_next-i18next.md +1 -0
  162. package/docs/es/intlayer_with_next-intl.md +1 -0
  163. package/docs/es/intlayer_with_tanstack.md +1 -12
  164. package/docs/es/plugins/sync-json.md +27 -2
  165. package/docs/fr/cli/index.md +5 -0
  166. package/docs/fr/cli/login.md +185 -0
  167. package/docs/fr/configuration.md +12 -0
  168. package/docs/fr/dictionary/content_file.md +24 -1
  169. package/docs/fr/intlayer_with_astro.md +1 -1
  170. package/docs/fr/intlayer_with_express.md +1 -1
  171. package/docs/fr/intlayer_with_nestjs.md +1 -1
  172. package/docs/fr/intlayer_with_next-i18next.md +1 -0
  173. package/docs/fr/intlayer_with_next-intl.md +1 -0
  174. package/docs/fr/intlayer_with_tanstack.md +1 -12
  175. package/docs/fr/plugins/sync-json.md +27 -2
  176. package/docs/hi/cli/index.md +5 -0
  177. package/docs/hi/cli/login.md +181 -0
  178. package/docs/hi/configuration.md +12 -0
  179. package/docs/hi/dictionary/content_file.md +24 -1
  180. package/docs/hi/intlayer_with_astro.md +1 -1
  181. package/docs/hi/intlayer_with_express.md +1 -1
  182. package/docs/hi/intlayer_with_nestjs.md +1 -1
  183. package/docs/hi/intlayer_with_next-i18next.md +1 -0
  184. package/docs/hi/intlayer_with_next-intl.md +1 -0
  185. package/docs/hi/intlayer_with_tanstack.md +1 -12
  186. package/docs/hi/plugins/sync-json.md +27 -2
  187. package/docs/id/cli/index.md +5 -0
  188. package/docs/id/cli/login.md +157 -0
  189. package/docs/id/configuration.md +12 -0
  190. package/docs/id/dictionary/content_file.md +24 -1
  191. package/docs/id/intlayer_with_astro.md +1 -1
  192. package/docs/id/intlayer_with_express.md +1 -1
  193. package/docs/id/intlayer_with_nestjs.md +1 -1
  194. package/docs/id/intlayer_with_next-i18next.md +1 -0
  195. package/docs/id/intlayer_with_next-intl.md +1 -0
  196. package/docs/id/intlayer_with_tanstack.md +1 -12
  197. package/docs/id/plugins/sync-json.md +27 -2
  198. package/docs/it/cli/index.md +5 -0
  199. package/docs/it/cli/login.md +157 -0
  200. package/docs/it/configuration.md +12 -0
  201. package/docs/it/dictionary/content_file.md +24 -1
  202. package/docs/it/intlayer_with_astro.md +1 -1
  203. package/docs/it/intlayer_with_express.md +1 -1
  204. package/docs/it/intlayer_with_nestjs.md +1 -1
  205. package/docs/it/intlayer_with_next-i18next.md +1 -0
  206. package/docs/it/intlayer_with_next-intl.md +1 -0
  207. package/docs/it/intlayer_with_tanstack.md +1 -12
  208. package/docs/it/plugins/sync-json.md +27 -2
  209. package/docs/ja/cli/index.md +5 -0
  210. package/docs/ja/cli/login.md +159 -0
  211. package/docs/ja/configuration.md +12 -0
  212. package/docs/ja/dictionary/content_file.md +24 -1
  213. package/docs/ja/intlayer_with_astro.md +1 -1
  214. package/docs/ja/intlayer_with_express.md +1 -1
  215. package/docs/ja/intlayer_with_nestjs.md +1 -1
  216. package/docs/ja/intlayer_with_next-i18next.md +1 -0
  217. package/docs/ja/intlayer_with_next-intl.md +1 -0
  218. package/docs/ja/intlayer_with_tanstack.md +1 -12
  219. package/docs/ja/plugins/sync-json.md +27 -2
  220. package/docs/ko/cli/index.md +5 -0
  221. package/docs/ko/cli/login.md +188 -0
  222. package/docs/ko/configuration.md +12 -0
  223. package/docs/ko/dictionary/content_file.md +44 -1
  224. package/docs/ko/intlayer_with_astro.md +1 -1
  225. package/docs/ko/intlayer_with_express.md +1 -1
  226. package/docs/ko/intlayer_with_nestjs.md +1 -1
  227. package/docs/ko/intlayer_with_next-i18next.md +1 -0
  228. package/docs/ko/intlayer_with_next-intl.md +1 -0
  229. package/docs/ko/intlayer_with_tanstack.md +1 -12
  230. package/docs/ko/plugins/sync-json.md +27 -2
  231. package/docs/pl/cli/index.md +5 -0
  232. package/docs/pl/cli/login.md +187 -0
  233. package/docs/pl/configuration.md +12 -0
  234. package/docs/pl/dictionary/content_file.md +24 -1
  235. package/docs/pl/intlayer_with_astro.md +2 -2
  236. package/docs/pl/intlayer_with_express.md +1 -1
  237. package/docs/pl/intlayer_with_nestjs.md +1 -1
  238. package/docs/pl/intlayer_with_next-i18next.md +1 -0
  239. package/docs/pl/intlayer_with_next-intl.md +1 -0
  240. package/docs/pl/intlayer_with_tanstack.md +1 -12
  241. package/docs/pl/plugins/sync-json.md +24 -2
  242. package/docs/pt/cli/index.md +5 -0
  243. package/docs/pt/cli/login.md +186 -0
  244. package/docs/pt/configuration.md +12 -0
  245. package/docs/pt/dictionary/content_file.md +24 -1
  246. package/docs/pt/intlayer_with_astro.md +1 -1
  247. package/docs/pt/intlayer_with_express.md +1 -1
  248. package/docs/pt/intlayer_with_nestjs.md +1 -1
  249. package/docs/pt/intlayer_with_next-i18next.md +1 -0
  250. package/docs/pt/intlayer_with_next-intl.md +1 -0
  251. package/docs/pt/intlayer_with_react_router_v7_fs_routes.md +570 -0
  252. package/docs/pt/intlayer_with_tanstack.md +1 -12
  253. package/docs/pt/plugins/sync-json.md +27 -2
  254. package/docs/ru/cli/index.md +5 -0
  255. package/docs/ru/cli/login.md +181 -0
  256. package/docs/ru/configuration.md +12 -0
  257. package/docs/ru/dictionary/content_file.md +44 -1
  258. package/docs/ru/intlayer_with_astro.md +1 -1
  259. package/docs/ru/intlayer_with_express.md +1 -1
  260. package/docs/ru/intlayer_with_nestjs.md +1 -1
  261. package/docs/ru/intlayer_with_next-i18next.md +1 -0
  262. package/docs/ru/intlayer_with_next-intl.md +1 -0
  263. package/docs/ru/intlayer_with_tanstack.md +1 -12
  264. package/docs/ru/plugins/sync-json.md +27 -2
  265. package/docs/tr/cli/index.md +5 -0
  266. package/docs/tr/cli/login.md +171 -0
  267. package/docs/tr/configuration.md +12 -0
  268. package/docs/tr/dictionary/content_file.md +44 -1
  269. package/docs/tr/intlayer_with_astro.md +1 -1
  270. package/docs/tr/intlayer_with_express.md +1 -1
  271. package/docs/tr/intlayer_with_next-i18next.md +1 -0
  272. package/docs/tr/intlayer_with_next-intl.md +1 -0
  273. package/docs/tr/intlayer_with_tanstack.md +1 -12
  274. package/docs/tr/plugins/sync-json.md +27 -2
  275. package/docs/vi/cli/index.md +5 -0
  276. package/docs/vi/cli/login.md +186 -0
  277. package/docs/vi/configuration.md +12 -0
  278. package/docs/vi/dictionary/content_file.md +24 -1
  279. package/docs/vi/intlayer_with_astro.md +1 -1
  280. package/docs/vi/intlayer_with_express.md +1 -1
  281. package/docs/vi/intlayer_with_nestjs.md +1 -1
  282. package/docs/vi/intlayer_with_next-i18next.md +1 -0
  283. package/docs/vi/intlayer_with_next-intl.md +1 -0
  284. package/docs/vi/intlayer_with_tanstack.md +1 -12
  285. package/docs/vi/plugins/sync-json.md +27 -2
  286. package/docs/zh/cli/index.md +5 -0
  287. package/docs/zh/cli/login.md +182 -0
  288. package/docs/zh/configuration.md +12 -0
  289. package/docs/zh/dictionary/content_file.md +44 -1
  290. package/docs/zh/intlayer_with_astro.md +1 -1
  291. package/docs/zh/intlayer_with_express.md +1 -1
  292. package/docs/zh/intlayer_with_nestjs.md +1 -1
  293. package/docs/zh/intlayer_with_next-i18next.md +1 -0
  294. package/docs/zh/intlayer_with_next-intl.md +1 -0
  295. package/docs/zh/intlayer_with_tanstack.md +1 -12
  296. package/docs/zh/plugins/sync-json.md +27 -2
  297. package/package.json +9 -9
  298. package/src/generated/docs.entry.ts +19 -0
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  createdAt: 2025-03-13
3
- updatedAt: 2025-10-05
3
+ updatedAt: 2025-12-13
4
4
  title: Sync JSON plugin
5
5
  description: Synchronize Intlayer dictionaries with third‑party i18n JSON files (i18next, next-intl, react-intl, vue-i18n, and more). Keep your existing i18n while using Intlayer to manage, translate, and test your messages.
6
6
  keywords:
@@ -24,12 +24,15 @@ slugs:
24
24
  - sync-json
25
25
  youtubeVideo: https://www.youtube.com/watch?v=MpGMxniDHNg
26
26
  history:
27
+ - version: 7.5.0
28
+ date: 2025-12-13
29
+ changes: Add ICU and i18next format support
27
30
  - version: 6.1.6
28
31
  date: 2025-10-05
29
32
  changes: Initial Sync JSON plugin documentation
30
33
  ---
31
34
 
32
- # Sync JSON (i18n bridges)
35
+ # Sync JSON (i18n bridges) - Sync JSON with ICU / i18next support
33
36
 
34
37
  <iframe title="How to keep your JSON translations in sync with Intlayer" class="m-auto aspect-[16/9] w-full overflow-hidden rounded-lg border-0" allow="autoplay; gyroscope;" loading="lazy" width="1080" height="auto" src="https://www.youtube.com/embed/MpGMxniDHNg?autoplay=0&amp;origin=http://intlayer.org&amp;controls=0&amp;rel=1"/>
35
38
 
@@ -95,13 +98,16 @@ const config: IntlayerConfig = {
95
98
  source: ({ key }) => `./src/**/${key}.i18n.json`,
96
99
  locale: Locales.ENGLISH,
97
100
  priority: 1, // Ensures these JSON files take precedence over files at `./locales/en/${key}.json`
101
+ format: "intlayer", // Format of the JSON content
98
102
  }),
99
103
  /**
100
104
  * Will load, and write the output and translations back to the JSON files in the locales directory
101
105
  */
102
106
  syncJSON({
107
+ format: "i18next",
103
108
  source: ({ key, locale }) => `./locales/${locale}/${key}.json`,
104
109
  priority: 0,
110
+ format: "i18next",
105
111
  }),
106
112
  ],
107
113
  };
@@ -130,6 +136,7 @@ const config: IntlayerConfig = {
130
136
  syncJSON({
131
137
  // Per-locale, per-namespace layout (e.g., next-intl, i18next with namespaces)
132
138
  source: ({ key, locale }) => `./locales/${locale}/${key}.json`,
139
+ format: "icu",
133
140
  }),
134
141
  ],
135
142
  };
@@ -150,7 +157,9 @@ const config: IntlayerConfig = {
150
157
  },
151
158
  plugins: [
152
159
  syncJSON({
160
+ format: "i18next",
153
161
  source: ({ locale }) => `./locales/${locale}.json`,
162
+ format: "i18next",
154
163
  }),
155
164
  ],
156
165
  };
@@ -171,9 +180,27 @@ syncJSON({
171
180
  source: ({ key, locale }) => string, // required
172
181
  location?: string, // optional label, default: "plugin"
173
182
  priority?: number, // optional priority for conflict resolution, default: 0
183
+ format?: 'intlayer' | 'icu' | 'i18next', // optional formatter, default: 'intlayer'
174
184
  });
175
185
  ```
176
186
 
187
+ #### `format` ('intlayer' | 'icu' | 'i18next')
188
+
189
+ Specifies the formatter to use for the dictionary content when synchronizing JSON files. This allows using different message formatting syntaxes compatible with various i18n libraries.
190
+
191
+ - `'intlayer'`: The default Intlayer formatter (default).
192
+ - `'icu'`: Uses ICU message formatting (compatible with libraries like react-intl, vue-i18n).
193
+ - `'i18next'`: Uses i18next message formatting (compatible with i18next, next-i18next, Solid-i18next).
194
+
195
+ **Example:**
196
+
197
+ ```ts
198
+ syncJSON({
199
+ source: ({ key, locale }) => `./locales/${locale}/${key}.json`,
200
+ format: "i18next", // Use i18next formatting for compatibility
201
+ }),
202
+ ```
203
+
177
204
  ### Multiple JSON sources and priority
178
205
 
179
206
  You can add multiple `syncJSON` plugins to synchronize different JSON sources. This is useful when you have multiple i18n libraries or different JSON structures in your project.
@@ -200,6 +227,7 @@ const config: IntlayerConfig = {
200
227
  plugins: [
201
228
  // Primary JSON source (highest priority)
202
229
  syncJSON({
230
+ format: "i18next",
203
231
  source: ({ key, locale }) => `./locales/${locale}/${key}.json`,
204
232
  location: "main-translations",
205
233
  priority: 10,
@@ -207,6 +235,7 @@ const config: IntlayerConfig = {
207
235
 
208
236
  // Fallback JSON source (lower priority)
209
237
  syncJSON({
238
+ format: "i18next",
210
239
  source: ({ locale }) => `./fallback-locales/${locale}.json`,
211
240
  location: "fallback-translations",
212
241
  priority: 5,
@@ -214,6 +243,7 @@ const config: IntlayerConfig = {
214
243
 
215
244
  // Legacy JSON source (lowest priority)
216
245
  syncJSON({
246
+ format: "i18next",
217
247
  source: ({ locale }) => `/my/other/app/legacy/${locale}/messages.json`,
218
248
  location: "legacy-translations",
219
249
  priority: 1,
@@ -300,9 +330,30 @@ loadJSON({
300
330
 
301
331
  // Priority used for conflict resolution against other sources
302
332
  priority?: number, // default: 0
333
+
334
+ // Optional formatter for the JSON content
335
+ format?: 'intlayer' | 'icu' | 'i18next', // default: 'intlayer'
303
336
  });
304
337
  ```
305
338
 
339
+ #### `format` ('intlayer' | 'icu' | 'i18next')
340
+
341
+ Specifies the formatter to use for the dictionary content when loading JSON files. This allows using different message formatting syntaxes compatible with various i18n libraries.
342
+
343
+ - `'intlayer'`: The default Intlayer formatter (default).
344
+ - `'icu'`: Uses ICU message formatting (compatible with libraries like react-intl, vue-i18n).
345
+ - `'i18next'`: Uses i18next message formatting (compatible with i18next, next-i18next, Solid-i18next).
346
+
347
+ **Example:**
348
+
349
+ ```ts
350
+ loadJSON({
351
+ source: ({ key }) => `./src/**/${key}.i18n.json`,
352
+ locale: Locales.ENGLISH,
353
+ format: "icu", // Use ICU formatting for compatibility
354
+ }),
355
+ ```
356
+
306
357
  ### Behavior and conventions
307
358
 
308
359
  - If your `source` mask includes a locale placeholder, only files for the selected `locale` are ingested.
@@ -103,6 +103,10 @@ To see how to configure available locales, or other parameters, refer to the [co
103
103
 
104
104
  ## Run intlayer commands
105
105
 
106
+ ### Authentication
107
+
108
+ - **[Login](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en-GB/cli/login.md)** - Authenticate with the Intlayer CMS and get access credentials
109
+
106
110
  ### Core Commands
107
111
 
108
112
  - **[Build Dictionaries](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en-GB/cli/build.md)** - Build your dictionaries from content declaration files
@@ -144,6 +148,7 @@ To see how to configure available locales, or other parameters, refer to the [co
144
148
 
145
149
  ```json fileName="package.json"
146
150
  "scripts": {
151
+ "intlayer:login": "npx intlayer login",
147
152
  "intlayer:build": "npx intlayer build",
148
153
  "intlayer:watch": "npx intlayer build --watch",
149
154
  "intlayer:push": "npx intlayer push",
@@ -0,0 +1,181 @@
1
+ ---
2
+ createdAt: 2025-12-16
3
+ updatedAt: 2025-12-16
4
+ title: CLI - Login
5
+ description: Learn how to use the Intlayer CLI login command to authenticate with the Intlayer CMS and obtain access credentials.
6
+ keywords:
7
+ - CLI
8
+ - Login
9
+ - Authentication
10
+ - CMS
11
+ - Intlayer
12
+ - Credentials
13
+ slugs:
14
+ - doc
15
+ - concept
16
+ - cli
17
+ - login
18
+ ---
19
+
20
+ # Intlayer CLI Login Command
21
+
22
+ ---
23
+
24
+ ## Description
25
+
26
+ The `login` command of the Intlayer CLI allows you to authenticate with the Intlayer CMS. This command automatically opens your default browser to complete the authentication process and receive the necessary credentials (Client ID and Client Secret) to use Intlayer services.
27
+
28
+ ## Usage
29
+
30
+ ```bash
31
+ npx intlayer login [options]
32
+ ```
33
+
34
+ or
35
+
36
+ ```bash
37
+ intlayer login [options]
38
+ ```
39
+
40
+ ## Options
41
+
42
+ ### `--cms-url <url>`
43
+
44
+ Specify the URL of the Intlayer CMS to connect to for authentication.
45
+
46
+ - **Type**: `string`
47
+ - **Default**: The value configured in `intlayer.config.*` or `https://intlayer.org`
48
+ - **Example**:
49
+
50
+ ```bash
51
+ npx intlayer login --cms-url https://intlayer.org
52
+ ```
53
+
54
+ ### Configuration Options
55
+
56
+ You can also use common configuration options:
57
+
58
+ - `--env-file <path>`: Path to the environment file
59
+ - `-e, --env <env>`: Execution environment
60
+ - `--base-dir <dir>`: Base directory of the project
61
+ - `--verbose`: Enable detailed output (default: true)
62
+ - `--prefix <prefix>`: Prefix for logs
63
+
64
+ ## How It Works
65
+
66
+ 1. **Local server start**: The command starts a local HTTP server on a random port to receive credentials from the CMS
67
+
68
+ Specify the URL of the Intlayer CMS to connect to for authentication.
69
+
70
+ - **Type**: `string`
71
+ - **Default**: The value configured in `intlayer.config.*` or `https://intlayer.org`
72
+ - **Example**:
73
+
74
+ ```bash
75
+ npx intlayer login --cms-url https://intlayer.org
76
+ ```
77
+
78
+ ### Configuration Options
79
+
80
+ You can also use common configuration options:
81
+
82
+ - `--env-file <path>`: Path to the environment file
83
+ - `-e, --env <env>`: Execution environment
84
+ - `--base-dir <dir>`: Base directory of the project
85
+ - `--verbose`: Enable verbose output (default: true)
86
+ - `--prefix <prefix>`: Prefix for logs
87
+
88
+ ## How It Works
89
+
90
+ 1. **Local Server Start**: The command starts a local HTTP server on a random port to receive credentials from the CMS.
91
+ 2. **Browser opening**: The command automatically opens your default browser to the CMS login URL
92
+ 3. **Authentication**: Complete the authentication in the browser using your Intlayer account
93
+ 4. **Credentials reception**: The local server receives the Client ID and Client Secret from the CMS
94
+ 5. **Instructions**: The command displays instructions for configuring credentials in your project
95
+
96
+ ## Output
97
+
98
+ After a successful login, the command will display:
99
+
100
+ 1. **The received credentials** (Client ID and Client Secret)
101
+ 2. **Instructions for the `.env` file**:
102
+
103
+ ```bash
104
+ INTLAYER_CLIENT_ID=your_client_id
105
+ INTLAYER_CLIENT_SECRET=your_client_secret
106
+ ```
107
+
108
+ 3. **Instructions for the Intlayer configuration file**:
109
+
110
+ ```typescript
111
+ {
112
+ editor: {
113
+ cmsURL: 'https://intlayer.org',
114
+ clientId: process.env.INTLAYER_CLIENT_ID,
115
+ clientSecret: process.env.INTLAYER_CLIENT_SECRET,
116
+ },
117
+ }
118
+ ```
119
+
120
+ ## Manual Configuration
121
+
122
+ If the browser does not open automatically, you can manually visit the URL displayed in the terminal.
123
+
124
+ ## Examples
125
+
126
+ ### Login with Custom CMS URL
127
+
128
+ ```bash
129
+ npx intlayer login --cms-url https://custom-cms.example.com
130
+ ```
131
+
132
+ ### Login with Specific Environment File
133
+
134
+ ```bash
135
+ npx intlayer login --env-file .env.production
136
+ ```
137
+
138
+ ### Login in Verbose Mode
139
+
140
+ ```bash
141
+ npx intlayer login --verbose
142
+ ```
143
+
144
+ ## Troubleshooting
145
+
146
+ ### Browser Doesn't Open
147
+
148
+ If the browser does not open automatically, copy the URL displayed in the terminal and open it manually in your browser.
149
+
150
+ ### Connection Issues
151
+
152
+ If you encounter connection issues, verify:
153
+
154
+ 1. That the CMS URL is correct
155
+ 2. That your internet connection is working correctly
156
+ 3. That no firewalls are blocking the connection
157
+
158
+ ### Credentials Not Received
159
+
160
+ If credentials are not received:
161
+
162
+ 1. Ensure you have completed the authentication process in the browser
163
+ 2. Verify that the local port is not blocked
164
+ 3. Try the command again
165
+
166
+ ## Next Steps
167
+
168
+ After completing the login:
169
+
170
+ 1. Add the credentials to your `.env` file
171
+ 2. Configure your `intlayer.config.*` file with the credentials
172
+ 3. Use CLI commands to manage your dictionaries:
173
+ - [`npx intlayer push`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en-GB/cli/push.md) - Push dictionaries to the CMS
174
+ - [`npx intlayer pull`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en-GB/cli/pull.md) - Pull dictionaries from the CMS
175
+ - [`npx intlayer fill`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en-GB/cli/fill.md) - Fill in missing translations
176
+
177
+ ## See Also
178
+
179
+ - [CLI Documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en-GB/cli/index.md)
180
+ - [Intlayer Configuration](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en-GB/configuration.md)
181
+ - [Intlayer CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en-GB/intlayer_CMS.md)
@@ -14,6 +14,9 @@ slugs:
14
14
  - concept
15
15
  - configuration
16
16
  history:
17
+ - version: 7.5.0
18
+ date: 2025-12-17
19
+ changes: Add `buildMode` option
17
20
  - version: 6.0.0
18
21
  date: 2025-09-16
19
22
  changes: Add `live` import mode
@@ -528,6 +531,15 @@ Build options apply to the `@intlayer/babel` and `@intlayer/swc` plugins.
528
531
 
529
532
  #### Properties
530
533
 
534
+ - **mode**:
535
+ - _Type_: `'auto' | 'manual'`
536
+ - _Default_: `'auto'`
537
+ - _Description_: Controls the mode of the build.
538
+ - _Example_: `'manual'`
539
+ - _Note_: If 'auto', the build will be enabled automatically when the application is built.
540
+ - _Note_: If 'manual', the build will be set only when the build command is executed.
541
+ - _Note_: Can be used to disable dictionaries build, for instance when execution on Node.js environment should be avoided.
542
+
531
543
  - **optimize**:
532
544
  - _Type_: `boolean`
533
545
  - _Default_: `process.env.NODE_ENV === 'production'`
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  createdAt: 2025-02-07
3
- updatedAt: 2025-09-20
3
+ updatedAt: 2025-12-13
4
4
  title: Content File
5
5
  description: Learn how to customise the extensions for your content declaration files. Follow this documentation to implement conditions efficiently in your project.
6
6
  keywords:
@@ -12,6 +12,9 @@ slugs:
12
12
  - concept
13
13
  - content
14
14
  history:
15
+ - version: 7.5.0
16
+ date: 2025-12-13
17
+ changes: Add ICU and i18next format support
15
18
  - version: 6.0.0
16
19
  date: 2025-09-20
17
20
  changes: Add fields documentation
@@ -384,6 +387,26 @@ Array of strings for categorising and organising dictionaries. Tags provide addi
384
387
  }
385
388
  ```
386
389
 
390
+ #### `format` ('intlayer' | 'icu' | 'i18next')
391
+
392
+ Specifies the formatter to use for the dictionary content. This allows using different message formatting syntaxes.
393
+
394
+ - `'intlayer'`: The default Intlayer formatter.
395
+ - `'icu'`: Uses ICU message formatting.
396
+ - `'i18next'`: Uses i18next message formatting.
397
+
398
+ **Example:**
399
+
400
+ ```typescript
401
+ {
402
+ key: "my-dictionary",
403
+ format: "icu",
404
+ content: {
405
+ message: "Hello {name}, you have {count, plural, one {# message} other {# messages}}"
406
+ }
407
+ }
408
+ ```
409
+
387
410
  #### `locale` (LocalesValues)
388
411
 
389
412
  Transforms the dictionary into a per-locale dictionary where each field declared in the content will be automatically transformed into a translation node. When this property is set:
@@ -2,7 +2,7 @@
2
2
  createdAt: 2024-03-07
3
3
  updatedAt: 2025-10-03
4
4
  title: How to translate your Astro app – i18n guide 2025
5
- description: Learn how to add internationalisation (i18n) to your Vite and React application using Intlayer. Follow this guide to make your app multilingual.
5
+ description: Learn how to add internationalisation (i18n) to your Astro website using Intlayer. Follow this guide to make your site multilingual.
6
6
  keywords:
7
7
  - Internationalisation
8
8
  - Documentation
@@ -2,7 +2,7 @@
2
2
  createdAt: 2024-08-11
3
3
  updatedAt: 2025-06-29
4
4
  title: How to translate your Express backend – i18n guide 2025
5
- description: Discover how to make your vite backend multilingual. Follow the documentation to internationalize (i18n) and translate it.
5
+ description: Discover how to make your Express backend multilingual. Follow the documentation to internationalize (i18n) and translate it.
6
6
  keywords:
7
7
  - Internationalization
8
8
  - Documentation
@@ -2,7 +2,7 @@
2
2
  createdAt: 2025-09-09
3
3
  updatedAt: 2025-09-09
4
4
  title: How to translate your Nest backend – i18n guide 2025
5
- description: Discover how to make your vite backend multilingual. Follow the documentation to internationalise (i18n) and translate it.
5
+ description: Discover how to make your NestJS backend multilingual. Follow the documentation to internationalise (i18n) and translate it.
6
6
  keywords:
7
7
  - Internationalisation
8
8
  - Documentation
@@ -580,6 +580,7 @@ const config: IntlayerConfig = {
580
580
  },
581
581
  plugins: [
582
582
  syncJSON({
583
+ format: "i18next",
583
584
  source: ({ locale }) => `./locales/${locale}.json`,
584
585
  }),
585
586
  ],
@@ -419,6 +419,7 @@ const config: IntlayerConfig = {
419
419
  plugins: [
420
420
  // Keep your per-namespace folder structure in sync with Intlayer
421
421
  syncJSON({
422
+ format: "icu",
422
423
  source: ({ key, locale }) => `./locales/${locale}/${key}.json`,
423
424
  }),
424
425
  ],
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  createdAt: 2025-09-09
3
- updatedAt: 2025-09-09
3
+ updatedAt: 2025-12-11
4
4
  title: How to translate your Tanstack Start app – i18n guide 2025
5
5
  description: Learn how to add internationalisation (i18n) to your Tanstack Start application using Intlayer. Follow this comprehensive guide to make your app multilingual with locale-aware routing.
6
6
  keywords:
@@ -636,17 +636,6 @@ export function NotFoundComponent() {
636
636
  }
637
637
  ```
638
638
 
639
- ```tsx fileName="src/routes/__root.tsx"
640
- import { createRootRoute } from "@tanstack/react-router";
641
-
642
- // The root route serves as the top-level layout
643
- // It doesn't handle 404s directly - that's delegated to child routes
644
- // This keeps the root simple and lets locale-aware routes manage their own 404 logic
645
- export const Route = createRootRoute({
646
- component: Outlet,
647
- });
648
- ```
649
-
650
639
  ```tsx fileName="src/routes/{-$locale}/route.tsx"
651
640
  import { createFileRoute, Outlet, redirect } from "@tanstack/react-router";
652
641
  import { validatePrefix } from "intlayer";
@@ -24,12 +24,15 @@ slugs:
24
24
  - sync-json
25
25
  youtubeVideo: https://www.youtube.com/watch?v=MpGMxniDHNg
26
26
  history:
27
+ - version: 7.5.0
28
+ date: 2025-12-13
29
+ changes: Add ICU and i18next format support
27
30
  - version: 6.1.6
28
31
  date: 2025-10-05
29
32
  changes: Initial Sync JSON plugin documentation
30
33
  ---
31
34
 
32
- ## Sync JSON (i18n bridges)
35
+ # Sync JSON (i18n bridges) - Sync JSON with ICU / i18next support
33
36
 
34
37
  <iframe title="How to keep your JSON translations in sync with Intlayer" class="m-auto aspect-[16/9] w-full overflow-hidden rounded-lg border-0" allow="autoplay; gyroscope;" loading="lazy" width="1080" height="auto" src="https://www.youtube.com/embed/MpGMxniDHNg?autoplay=0&amp;origin=http://intlayer.org&amp;controls=0&amp;rel=1"/>
35
38
 
@@ -105,9 +108,27 @@ syncJSON({
105
108
  source: ({ key, locale }) => string, // required
106
109
  location?: string, // optional label, default: "plugin"
107
110
  priority?: number, // optional priority for conflict resolution, default: 0
111
+ format?: 'intlayer' | 'icu' | 'i18next', // optional formatter, default: 'intlayer'
108
112
  });
109
113
  ```
110
114
 
115
+ #### `format` ('intlayer' | 'icu' | 'i18next')
116
+
117
+ Specifies the formatter to use for the dictionary content when synchronising JSON files. This allows using different message formatting syntaxes compatible with various i18n libraries.
118
+
119
+ - `'intlayer'`: The default Intlayer formatter (default).
120
+ - `'icu'`: Uses ICU message formatting (compatible with libraries like react-intl, vue-i18n).
121
+ - `'i18next'`: Uses i18next message formatting (compatible with i18next, next-i18next, Solid-i18next).
122
+
123
+ **Example:**
124
+
125
+ ```ts
126
+ syncJSON({
127
+ source: ({ key, locale }) => `./locales/${locale}/${key}.json`,
128
+ format: "i18next", // Use i18next formatting for compatibility
129
+ }),
130
+ ```
131
+
111
132
  ## Multiple JSON sources and priority
112
133
 
113
134
  You can add multiple `syncJSON` plugins to synchronise different JSON sources. This is useful when you have multiple i18n libraries or different JSON structures in your project.
@@ -134,6 +155,7 @@ export default defineConfig({
134
155
  plugins: [
135
156
  // Primary JSON source (highest priority)
136
157
  syncJSON({
158
+ format: "i18next",
137
159
  source: ({ key, locale }) => `./locales/${locale}/${key}.json`,
138
160
  location: "main-translations",
139
161
  priority: 10,
@@ -141,6 +163,7 @@ export default defineConfig({
141
163
 
142
164
  // Fallback JSON source (lower priority)
143
165
  syncJSON({
166
+ format: "i18next",
144
167
  source: ({ locale }) => `./fallback-locales/${locale}.json`,
145
168
  location: "fallback-translations",
146
169
  priority: 5,
@@ -148,6 +171,7 @@ export default defineConfig({
148
171
 
149
172
  // Legacy JSON source (lowest priority)
150
173
  syncJSON({
174
+ format: "i18next",
151
175
  source: ({ locale }) => `/my/other/app/legacy/${locale}/messages.json`,
152
176
  location: "legacy-translations",
153
177
  priority: 1,
@@ -178,6 +202,7 @@ import { syncJSON } from "@intlayer/sync-json-plugin";
178
202
  export default {
179
203
  plugins: [
180
204
  syncJSON({
205
+ format: "i18next",
181
206
  source: ({ key, locale }) => `./locales/${locale}/${key}.json`,
182
207
  }),
183
208
  ],
@@ -103,6 +103,10 @@ Para ver cómo configurar los locales disponibles u otros parámetros, consulta
103
103
 
104
104
  ## Ejecutar comandos de intlayer
105
105
 
106
+ ### Autenticación
107
+
108
+ - **[Iniciar sesión](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/cli/login.md)** - Autenticarse con el CMS de Intlayer y obtener credenciales de acceso
109
+
106
110
  ### Comandos principales
107
111
 
108
112
  - **[Construir Diccionarios](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/cli/build.md)** - Construye tus diccionarios a partir de archivos de declaración de contenido
@@ -144,6 +148,7 @@ Para ver cómo configurar los locales disponibles u otros parámetros, consulta
144
148
 
145
149
  ```json fileName="package.json"
146
150
  "scripts": {
151
+ "intlayer:login": "npx intlayer login",
147
152
  "intlayer:build": "npx intlayer build",
148
153
  "intlayer:watch": "npx intlayer build --watch",
149
154
  "intlayer:push": "npx intlayer push",