@intlayer/docs 9.5.2 → 9.5.3

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 (384) hide show
  1. package/README.md +1 -1
  2. package/blog/ar/i18next_vs_intlayer-i18next.md +327 -0
  3. package/blog/ar/i18next_vs_intlayer.md +445 -0
  4. package/blog/ar/is_i18next_outdated.md +1 -1
  5. package/blog/ar/is_next-intl_outdated.md +1 -1
  6. package/blog/ar/is_vue-i18n_outdated.md +1 -1
  7. package/blog/ar/lingui_vs_intlayer-lingui.md +304 -0
  8. package/blog/ar/lingui_vs_intlayer.md +381 -0
  9. package/blog/ar/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  10. package/blog/ar/next-intl_vs_intlayer-next-intl.md +309 -0
  11. package/blog/ar/next-intl_vs_intlayer.md +397 -0
  12. package/blog/ar/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
  13. package/blog/ar/vue-i18n_vs_intlayer-vue-i18n.md +286 -0
  14. package/blog/ar/vue-i18n_vs_intlayer_benchmark.md +0 -0
  15. package/blog/de/i18next_vs_intlayer-i18next.md +327 -0
  16. package/blog/de/i18next_vs_intlayer.md +445 -0
  17. package/blog/de/is_i18next_outdated.md +1 -1
  18. package/blog/de/is_next-intl_outdated.md +1 -1
  19. package/blog/de/is_vue-i18n_outdated.md +1 -1
  20. package/blog/de/lingui_vs_intlayer-lingui.md +304 -0
  21. package/blog/de/lingui_vs_intlayer.md +381 -0
  22. package/blog/de/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  23. package/blog/de/next-intl_vs_intlayer-next-intl.md +309 -0
  24. package/blog/de/next-intl_vs_intlayer.md +415 -0
  25. package/blog/de/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
  26. package/blog/de/vue-i18n_vs_intlayer_benchmark.md +355 -0
  27. package/blog/en/i18next_vs_intlayer-i18next.md +327 -0
  28. package/blog/en/i18next_vs_intlayer.md +445 -0
  29. package/blog/en/is_i18next_outdated.md +1 -1
  30. package/blog/en/is_next-intl_outdated.md +1 -1
  31. package/blog/en/is_vue-i18n_outdated.md +1 -1
  32. package/blog/en/lingui_vs_intlayer-lingui.md +304 -0
  33. package/blog/en/lingui_vs_intlayer.md +381 -0
  34. package/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  35. package/blog/en/next-intl_vs_intlayer-next-intl.md +309 -0
  36. package/blog/en/next-intl_vs_intlayer.md +415 -0
  37. package/blog/en/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
  38. package/blog/en/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
  39. package/blog/en/vue-i18n_vs_intlayer.md +1 -1
  40. package/blog/en/vue-i18n_vs_intlayer_benchmark.md +361 -0
  41. package/blog/en-GB/i18next_vs_intlayer-i18next.md +327 -0
  42. package/blog/en-GB/i18next_vs_intlayer.md +445 -0
  43. package/blog/en-GB/is_i18next_outdated.md +1 -1
  44. package/blog/en-GB/is_next-intl_outdated.md +1 -1
  45. package/blog/en-GB/is_vue-i18n_outdated.md +1 -1
  46. package/blog/en-GB/lingui_vs_intlayer-lingui.md +304 -0
  47. package/blog/en-GB/lingui_vs_intlayer.md +381 -0
  48. package/blog/en-GB/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  49. package/blog/en-GB/next-intl_vs_intlayer-next-intl.md +309 -0
  50. package/blog/en-GB/next-intl_vs_intlayer.md +415 -0
  51. package/blog/en-GB/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
  52. package/blog/en-GB/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
  53. package/blog/en-GB/vue-i18n_vs_intlayer.md +1 -1
  54. package/blog/en-GB/vue-i18n_vs_intlayer_benchmark.md +245 -0
  55. package/blog/es/i18next_vs_intlayer-i18next.md +327 -0
  56. package/blog/es/i18next_vs_intlayer.md +445 -0
  57. package/blog/es/is_i18next_outdated.md +1 -1
  58. package/blog/es/is_next-intl_outdated.md +1 -1
  59. package/blog/es/is_vue-i18n_outdated.md +1 -1
  60. package/blog/es/lingui_vs_intlayer-lingui.md +304 -0
  61. package/blog/es/lingui_vs_intlayer.md +381 -0
  62. package/blog/es/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  63. package/blog/es/next-intl_vs_intlayer-next-intl.md +309 -0
  64. package/blog/es/next-intl_vs_intlayer.md +417 -0
  65. package/blog/es/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
  66. package/blog/es/vue-i18n_vs_intlayer_benchmark.md +363 -0
  67. package/blog/fr/i18next_vs_intlayer-i18next.md +327 -0
  68. package/blog/fr/i18next_vs_intlayer.md +445 -0
  69. package/blog/fr/is_i18next_outdated.md +1 -1
  70. package/blog/fr/is_next-intl_outdated.md +1 -1
  71. package/blog/fr/is_vue-i18n_outdated.md +1 -1
  72. package/blog/fr/lingui_vs_intlayer-lingui.md +304 -0
  73. package/blog/fr/lingui_vs_intlayer.md +381 -0
  74. package/blog/fr/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  75. package/blog/fr/next-intl_vs_intlayer-next-intl.md +309 -0
  76. package/blog/fr/next-intl_vs_intlayer.md +417 -0
  77. package/blog/fr/vue-i18n_vs_intlayer-vue-i18n.md +287 -0
  78. package/blog/fr/vue-i18n_vs_intlayer_benchmark.md +39 -0
  79. package/blog/hi/i18next_vs_intlayer-i18next.md +327 -0
  80. package/blog/hi/i18next_vs_intlayer.md +445 -0
  81. package/blog/hi/is_i18next_outdated.md +1 -1
  82. package/blog/hi/is_next-intl_outdated.md +1 -1
  83. package/blog/hi/is_vue-i18n_outdated.md +1 -1
  84. package/blog/hi/lingui_vs_intlayer-lingui.md +304 -0
  85. package/blog/hi/lingui_vs_intlayer.md +381 -0
  86. package/blog/hi/next-intl_vs_intlayer-next-intl.md +309 -0
  87. package/blog/hi/next-intl_vs_intlayer.md +397 -0
  88. package/blog/hi/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
  89. package/blog/hi/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
  90. package/blog/hi/vue-i18n_vs_intlayer_benchmark.md +0 -0
  91. package/blog/id/i18next_vs_intlayer-i18next.md +327 -0
  92. package/blog/id/i18next_vs_intlayer.md +445 -0
  93. package/blog/id/is_i18next_outdated.md +1 -1
  94. package/blog/id/is_next-intl_outdated.md +1 -1
  95. package/blog/id/is_vue-i18n_outdated.md +1 -1
  96. package/blog/id/lingui_vs_intlayer-lingui.md +304 -0
  97. package/blog/id/lingui_vs_intlayer.md +381 -0
  98. package/blog/id/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  99. package/blog/id/next-intl_vs_intlayer-next-intl.md +310 -0
  100. package/blog/id/next-intl_vs_intlayer.md +397 -0
  101. package/blog/id/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
  102. package/blog/id/vue-i18n_vs_intlayer-vue-i18n.md +36 -0
  103. package/blog/id/vue-i18n_vs_intlayer.md +1 -1
  104. package/blog/id/vue-i18n_vs_intlayer_benchmark.md +41 -0
  105. package/blog/it/i18next_vs_intlayer-i18next.md +327 -0
  106. package/blog/it/i18next_vs_intlayer.md +445 -0
  107. package/blog/it/is_i18next_outdated.md +1 -1
  108. package/blog/it/is_next-intl_outdated.md +1 -1
  109. package/blog/it/is_vue-i18n_outdated.md +1 -1
  110. package/blog/it/lingui_vs_intlayer-lingui.md +304 -0
  111. package/blog/it/lingui_vs_intlayer.md +381 -0
  112. package/blog/it/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  113. package/blog/it/next-intl_vs_intlayer-next-intl.md +309 -0
  114. package/blog/it/next-intl_vs_intlayer.md +418 -0
  115. package/blog/it/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
  116. package/blog/it/vue-i18n_vs_intlayer_benchmark.md +34 -0
  117. package/blog/ja/i18next_vs_intlayer-i18next.md +327 -0
  118. package/blog/ja/i18next_vs_intlayer.md +447 -0
  119. package/blog/ja/is_i18next_outdated.md +1 -1
  120. package/blog/ja/is_next-intl_outdated.md +1 -1
  121. package/blog/ja/is_vue-i18n_outdated.md +1 -1
  122. package/blog/ja/lingui_vs_intlayer-lingui.md +304 -0
  123. package/blog/ja/lingui_vs_intlayer.md +381 -0
  124. package/blog/ja/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  125. package/blog/ja/next-intl_vs_intlayer-next-intl.md +310 -0
  126. package/blog/ja/next-intl_vs_intlayer.md +422 -0
  127. package/blog/ja/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
  128. package/blog/ja/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
  129. package/blog/ja/vue-i18n_vs_intlayer.md +1 -1
  130. package/blog/ja/vue-i18n_vs_intlayer_benchmark.md +0 -0
  131. package/blog/ko/i18next_vs_intlayer-i18next.md +327 -0
  132. package/blog/ko/i18next_vs_intlayer.md +447 -0
  133. package/blog/ko/is_i18next_outdated.md +1 -1
  134. package/blog/ko/is_next-intl_outdated.md +1 -1
  135. package/blog/ko/is_vue-i18n_outdated.md +1 -1
  136. package/blog/ko/lingui_vs_intlayer-lingui.md +304 -0
  137. package/blog/ko/lingui_vs_intlayer.md +381 -0
  138. package/blog/ko/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  139. package/blog/ko/next-intl_vs_intlayer-next-intl.md +309 -0
  140. package/blog/ko/next-intl_vs_intlayer.md +397 -0
  141. package/blog/ko/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
  142. package/blog/ko/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
  143. package/blog/ko/vue-i18n_vs_intlayer.md +1 -1
  144. package/blog/ko/vue-i18n_vs_intlayer_benchmark.md +366 -0
  145. package/blog/pl/i18next_vs_intlayer-i18next.md +327 -0
  146. package/blog/pl/i18next_vs_intlayer.md +445 -0
  147. package/blog/pl/is_i18next_outdated.md +1 -1
  148. package/blog/pl/is_next-intl_outdated.md +1 -1
  149. package/blog/pl/is_vue-i18n_outdated.md +1 -1
  150. package/blog/pl/lingui_vs_intlayer-lingui.md +304 -0
  151. package/blog/pl/lingui_vs_intlayer.md +381 -0
  152. package/blog/pl/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  153. package/blog/pl/next-intl_vs_intlayer-next-intl.md +309 -0
  154. package/blog/pl/next-intl_vs_intlayer.md +397 -0
  155. package/blog/pl/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
  156. package/blog/pl/vue-i18n_vs_intlayer-vue-i18n.md +289 -0
  157. package/blog/pl/vue-i18n_vs_intlayer.md +1 -1
  158. package/blog/pl/vue-i18n_vs_intlayer_benchmark.md +0 -0
  159. package/blog/pt/i18next_vs_intlayer-i18next.md +327 -0
  160. package/blog/pt/i18next_vs_intlayer.md +445 -0
  161. package/blog/pt/is_i18next_outdated.md +1 -1
  162. package/blog/pt/is_next-intl_outdated.md +1 -1
  163. package/blog/pt/is_vue-i18n_outdated.md +1 -1
  164. package/blog/pt/lingui_vs_intlayer-lingui.md +304 -0
  165. package/blog/pt/lingui_vs_intlayer.md +381 -0
  166. package/blog/pt/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  167. package/blog/pt/next-intl_vs_intlayer-next-intl.md +309 -0
  168. package/blog/pt/next-intl_vs_intlayer.md +411 -0
  169. package/blog/pt/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
  170. package/blog/pt/vue-i18n_vs_intlayer_benchmark.md +0 -0
  171. package/blog/ru/i18next_vs_intlayer-i18next.md +327 -0
  172. package/blog/ru/i18next_vs_intlayer.md +445 -0
  173. package/blog/ru/is_i18next_outdated.md +1 -1
  174. package/blog/ru/is_next-intl_outdated.md +1 -1
  175. package/blog/ru/is_vue-i18n_outdated.md +1 -1
  176. package/blog/ru/lingui_vs_intlayer-lingui.md +304 -0
  177. package/blog/ru/lingui_vs_intlayer.md +381 -0
  178. package/blog/ru/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  179. package/blog/ru/next-intl_vs_intlayer-next-intl.md +309 -0
  180. package/blog/ru/next-intl_vs_intlayer.md +417 -0
  181. package/blog/ru/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
  182. package/blog/ru/vue-i18n_vs_intlayer_benchmark.md +54 -0
  183. package/blog/tr/i18next_vs_intlayer-i18next.md +327 -0
  184. package/blog/tr/i18next_vs_intlayer.md +445 -0
  185. package/blog/tr/is_i18next_outdated.md +1 -1
  186. package/blog/tr/is_next-intl_outdated.md +1 -1
  187. package/blog/tr/is_vue-i18n_outdated.md +1 -1
  188. package/blog/tr/lingui_vs_intlayer-lingui.md +304 -0
  189. package/blog/tr/lingui_vs_intlayer.md +381 -0
  190. package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  191. package/blog/tr/next-intl_vs_intlayer-next-intl.md +309 -0
  192. package/blog/tr/next-intl_vs_intlayer.md +397 -0
  193. package/blog/tr/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
  194. package/blog/tr/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
  195. package/blog/tr/vue-i18n_vs_intlayer.md +1 -1
  196. package/blog/tr/vue-i18n_vs_intlayer_benchmark.md +0 -0
  197. package/blog/uk/i18next_vs_intlayer-i18next.md +327 -0
  198. package/blog/uk/i18next_vs_intlayer.md +445 -0
  199. package/blog/uk/is_i18next_outdated.md +1 -1
  200. package/blog/uk/is_next-intl_outdated.md +1 -1
  201. package/blog/uk/is_vue-i18n_outdated.md +1 -1
  202. package/blog/uk/lingui_vs_intlayer-lingui.md +304 -0
  203. package/blog/uk/lingui_vs_intlayer.md +381 -0
  204. package/blog/uk/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  205. package/blog/uk/next-intl_vs_intlayer-next-intl.md +309 -0
  206. package/blog/uk/next-intl_vs_intlayer.md +397 -0
  207. package/blog/uk/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
  208. package/blog/uk/vue-i18n_vs_intlayer-vue-i18n.md +270 -0
  209. package/blog/uk/vue-i18n_vs_intlayer.md +1 -1
  210. package/blog/uk/vue-i18n_vs_intlayer_benchmark.md +0 -0
  211. package/blog/vi/i18next_vs_intlayer-i18next.md +327 -0
  212. package/blog/vi/i18next_vs_intlayer.md +445 -0
  213. package/blog/vi/is_i18next_outdated.md +1 -1
  214. package/blog/vi/is_next-intl_outdated.md +1 -1
  215. package/blog/vi/is_vue-i18n_outdated.md +1 -1
  216. package/blog/vi/lingui_vs_intlayer-lingui.md +304 -0
  217. package/blog/vi/lingui_vs_intlayer.md +381 -0
  218. package/blog/vi/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  219. package/blog/vi/next-intl_vs_intlayer-next-intl.md +309 -0
  220. package/blog/vi/next-intl_vs_intlayer.md +397 -0
  221. package/blog/vi/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
  222. package/blog/vi/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
  223. package/blog/vi/vue-i18n_vs_intlayer.md +1 -1
  224. package/blog/vi/vue-i18n_vs_intlayer_benchmark.md +0 -0
  225. package/blog/zh/i18next_vs_intlayer-i18next.md +327 -0
  226. package/blog/zh/i18next_vs_intlayer.md +445 -0
  227. package/blog/zh/is_i18next_outdated.md +1 -1
  228. package/blog/zh/is_next-intl_outdated.md +1 -1
  229. package/blog/zh/is_vue-i18n_outdated.md +1 -1
  230. package/blog/zh/lingui_vs_intlayer-lingui.md +304 -0
  231. package/blog/zh/lingui_vs_intlayer.md +381 -0
  232. package/blog/zh/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
  233. package/blog/zh/next-intl_vs_intlayer-next-intl.md +309 -0
  234. package/blog/zh/next-intl_vs_intlayer.md +422 -0
  235. package/blog/zh/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
  236. package/blog/zh/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
  237. package/blog/zh/vue-i18n_vs_intlayer.md +1 -1
  238. package/blog/zh/vue-i18n_vs_intlayer_benchmark.md +30 -0
  239. package/dist/cjs/generated/blog.entry.cjs +160 -0
  240. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  241. package/dist/cjs/generated/frequentQuestions.entry.cjs +20 -0
  242. package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
  243. package/dist/esm/generated/blog.entry.mjs +160 -0
  244. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  245. package/dist/esm/generated/frequentQuestions.entry.mjs +20 -0
  246. package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
  247. package/dist/types/generated/blog.entry.d.ts +8 -0
  248. package/dist/types/generated/blog.entry.d.ts.map +1 -1
  249. package/dist/types/generated/frequentQuestions.entry.d.ts +1 -0
  250. package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
  251. package/docs/ar/benchmark/nextjs.md +1 -1
  252. package/docs/ar/benchmark/solid.md +1 -1
  253. package/docs/ar/benchmark/svelte.md +1 -1
  254. package/docs/ar/benchmark/tanstack.md +1 -1
  255. package/docs/ar/benchmark/vue.md +1 -1
  256. package/docs/ar/interest_of_intlayer.md +1 -1
  257. package/docs/bn/interest_of_intlayer.md +1 -1
  258. package/docs/cs/interest_of_intlayer.md +1 -1
  259. package/docs/de/benchmark/nextjs.md +1 -1
  260. package/docs/de/benchmark/solid.md +1 -1
  261. package/docs/de/benchmark/svelte.md +1 -1
  262. package/docs/de/benchmark/tanstack.md +1 -1
  263. package/docs/de/benchmark/vue.md +1 -1
  264. package/docs/de/interest_of_intlayer.md +1 -1
  265. package/docs/en/benchmark/nextjs.md +1 -1
  266. package/docs/en/benchmark/solid.md +1 -1
  267. package/docs/en/benchmark/svelte.md +1 -1
  268. package/docs/en/benchmark/tanstack.md +1 -1
  269. package/docs/en/benchmark/vue.md +1 -1
  270. package/docs/en/interest_of_intlayer.md +1 -1
  271. package/docs/en-GB/benchmark/nextjs.md +1 -1
  272. package/docs/en-GB/benchmark/solid.md +1 -1
  273. package/docs/en-GB/benchmark/svelte.md +1 -1
  274. package/docs/en-GB/benchmark/tanstack.md +1 -1
  275. package/docs/en-GB/benchmark/vue.md +1 -1
  276. package/docs/en-GB/interest_of_intlayer.md +1 -1
  277. package/docs/es/benchmark/nextjs.md +1 -1
  278. package/docs/es/benchmark/solid.md +1 -1
  279. package/docs/es/benchmark/svelte.md +1 -1
  280. package/docs/es/benchmark/tanstack.md +1 -1
  281. package/docs/es/benchmark/vue.md +1 -1
  282. package/docs/es/interest_of_intlayer.md +1 -1
  283. package/docs/fr/benchmark/nextjs.md +1 -1
  284. package/docs/fr/benchmark/solid.md +1 -1
  285. package/docs/fr/benchmark/svelte.md +1 -1
  286. package/docs/fr/benchmark/tanstack.md +1 -1
  287. package/docs/fr/benchmark/vue.md +1 -1
  288. package/docs/fr/interest_of_intlayer.md +1 -1
  289. package/docs/hi/benchmark/nextjs.md +1 -1
  290. package/docs/hi/benchmark/solid.md +1 -1
  291. package/docs/hi/benchmark/svelte.md +1 -1
  292. package/docs/hi/benchmark/tanstack.md +1 -1
  293. package/docs/hi/benchmark/vue.md +1 -1
  294. package/docs/hi/interest_of_intlayer.md +1 -1
  295. package/docs/id/benchmark/nextjs.md +1 -1
  296. package/docs/id/benchmark/solid.md +1 -1
  297. package/docs/id/benchmark/svelte.md +1 -1
  298. package/docs/id/benchmark/tanstack.md +1 -1
  299. package/docs/id/benchmark/vue.md +1 -1
  300. package/docs/id/interest_of_intlayer.md +1 -1
  301. package/docs/it/benchmark/nextjs.md +1 -1
  302. package/docs/it/benchmark/solid.md +1 -1
  303. package/docs/it/benchmark/svelte.md +1 -1
  304. package/docs/it/benchmark/tanstack.md +1 -1
  305. package/docs/it/benchmark/vue.md +1 -1
  306. package/docs/it/interest_of_intlayer.md +1 -1
  307. package/docs/ja/benchmark/nextjs.md +1 -1
  308. package/docs/ja/benchmark/solid.md +1 -1
  309. package/docs/ja/benchmark/svelte.md +1 -1
  310. package/docs/ja/benchmark/tanstack.md +1 -1
  311. package/docs/ja/benchmark/vue.md +1 -1
  312. package/docs/ja/interest_of_intlayer.md +1 -1
  313. package/docs/ko/benchmark/nextjs.md +1 -1
  314. package/docs/ko/benchmark/solid.md +1 -1
  315. package/docs/ko/benchmark/svelte.md +1 -1
  316. package/docs/ko/benchmark/tanstack.md +1 -1
  317. package/docs/ko/benchmark/vue.md +1 -1
  318. package/docs/ko/interest_of_intlayer.md +1 -1
  319. package/docs/nl/interest_of_intlayer.md +1 -1
  320. package/docs/pl/benchmark/nextjs.md +1 -1
  321. package/docs/pl/benchmark/solid.md +1 -1
  322. package/docs/pl/benchmark/svelte.md +1 -1
  323. package/docs/pl/benchmark/tanstack.md +1 -1
  324. package/docs/pl/benchmark/vue.md +1 -1
  325. package/docs/pl/interest_of_intlayer.md +1 -1
  326. package/docs/pt/benchmark/nextjs.md +1 -1
  327. package/docs/pt/benchmark/solid.md +1 -1
  328. package/docs/pt/benchmark/svelte.md +1 -1
  329. package/docs/pt/benchmark/tanstack.md +1 -1
  330. package/docs/pt/benchmark/vue.md +1 -1
  331. package/docs/pt/interest_of_intlayer.md +1 -1
  332. package/docs/ru/benchmark/nextjs.md +1 -1
  333. package/docs/ru/benchmark/solid.md +1 -1
  334. package/docs/ru/benchmark/svelte.md +1 -1
  335. package/docs/ru/benchmark/tanstack.md +1 -1
  336. package/docs/ru/benchmark/vue.md +1 -1
  337. package/docs/ru/interest_of_intlayer.md +1 -1
  338. package/docs/tr/benchmark/nextjs.md +1 -1
  339. package/docs/tr/benchmark/solid.md +1 -1
  340. package/docs/tr/benchmark/svelte.md +1 -1
  341. package/docs/tr/benchmark/tanstack.md +1 -1
  342. package/docs/tr/benchmark/vue.md +1 -1
  343. package/docs/tr/interest_of_intlayer.md +1 -1
  344. package/docs/uk/benchmark/nextjs.md +1 -1
  345. package/docs/uk/benchmark/solid.md +1 -1
  346. package/docs/uk/benchmark/svelte.md +1 -1
  347. package/docs/uk/benchmark/tanstack.md +1 -1
  348. package/docs/uk/benchmark/vue.md +1 -1
  349. package/docs/uk/interest_of_intlayer.md +1 -1
  350. package/docs/ur/interest_of_intlayer.md +1 -1
  351. package/docs/vi/benchmark/nextjs.md +1 -1
  352. package/docs/vi/benchmark/solid.md +1 -1
  353. package/docs/vi/benchmark/svelte.md +1 -1
  354. package/docs/vi/benchmark/tanstack.md +1 -1
  355. package/docs/vi/benchmark/vue.md +1 -1
  356. package/docs/vi/interest_of_intlayer.md +1 -1
  357. package/docs/zh/benchmark/nextjs.md +1 -1
  358. package/docs/zh/benchmark/solid.md +1 -1
  359. package/docs/zh/benchmark/svelte.md +1 -1
  360. package/docs/zh/benchmark/tanstack.md +1 -1
  361. package/docs/zh/benchmark/vue.md +1 -1
  362. package/docs/zh/interest_of_intlayer.md +1 -1
  363. package/docs/zh-TW/interest_of_intlayer.md +1 -1
  364. package/frequent_questions/ar/claude_code_token_consumption.md +152 -0
  365. package/frequent_questions/de/claude_code_token_consumption.md +152 -0
  366. package/frequent_questions/en/claude_code_token_consumption.md +152 -0
  367. package/frequent_questions/en-GB/claude_code_token_consumption.md +152 -0
  368. package/frequent_questions/es/claude_code_token_consumption.md +152 -0
  369. package/frequent_questions/fr/claude_code_token_consumption.md +152 -0
  370. package/frequent_questions/hi/claude_code_token_consumption.md +152 -0
  371. package/frequent_questions/id/claude_code_token_consumption.md +152 -0
  372. package/frequent_questions/it/claude_code_token_consumption.md +152 -0
  373. package/frequent_questions/ja/claude_code_token_consumption.md +152 -0
  374. package/frequent_questions/ko/claude_code_token_consumption.md +152 -0
  375. package/frequent_questions/pl/claude_code_token_consumption.md +152 -0
  376. package/frequent_questions/pt/claude_code_token_consumption.md +152 -0
  377. package/frequent_questions/ru/claude_code_token_consumption.md +152 -0
  378. package/frequent_questions/tr/claude_code_token_consumption.md +152 -0
  379. package/frequent_questions/uk/claude_code_token_consumption.md +152 -0
  380. package/frequent_questions/vi/claude_code_token_consumption.md +152 -0
  381. package/frequent_questions/zh/claude_code_token_consumption.md +152 -0
  382. package/package.json +6 -6
  383. package/src/generated/blog.entry.ts +160 -0
  384. package/src/generated/frequentQuestions.entry.ts +20 -0
@@ -0,0 +1,445 @@
1
+ ---
2
+ createdAt: 2026-09-13
3
+ updatedAt: 2026-09-13
4
+ title: "i18next vs Intlayer: Benchmark & Perbandingan 2026"
5
+ description: "react-i18next dan next-i18next diuji terhadap Intlayer pada Next.js dan TanStack Start. Ukuran bundle, kebocoran konten, responsivitas pergantian bahasa, dan pengalaman pengembang."
6
+ keywords:
7
+ - i18next
8
+ - react-i18next
9
+ - next-i18next
10
+ - Intlayer
11
+ - Internasionalisasi
12
+ - i18n
13
+ - Benchmark
14
+ - Ukuran bundle
15
+ - Blog
16
+ - Next.js
17
+ - TanStack Start
18
+ - JavaScript
19
+ - React
20
+ slugs:
21
+ - blog
22
+ - i18next-vs-intlayer
23
+ author: aymericzip
24
+ ---
25
+
26
+ # i18next VS Intlayer | Benchmark Internasionalisasi (i18n) React & Next.js
27
+
28
+ `i18next` adalah framework i18n yang paling banyak digunakan dalam ekosistem JavaScript. Melalui `react-i18next` dan `next-i18next`, library ini mendukung sebagian besar aplikasi React dan Next.js. Intlayer hadir sebagai alternatif modern berbasis kompilator dengan cakupan konten per komponen.
29
+
30
+ Artikel ini membandingkan keduanya berdasarkan pengukuran riil, bukan sekadar daftar fitur. Angka-angka ini diperoleh dari [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom), sebuah suite pengujian sumber terbuka yang membangun aplikasi yang sama persis dengan masing-masing library dan mencatat data yang diunduh oleh peramban secara akurat.
31
+
32
+ <TOC/>
33
+
34
+ > **Ringkasan (tl;dr)**: `i18next` merupakan runtime terberat dalam pengujian benchmark ini: menambah **+77 KB gzip per halaman** pada Next.js dalam konfigurasi dasar (naive), dan masih menambah **+22 KB** bahkan setelah optimasi penuh namespace dan lazy-loading. Sebaliknya, Intlayer hanya menambah **+0.3 KB**. Setiap konfigurasi `i18next` kecuali konfigurasi yang diisolasi penuh (scoped) mengirimkan **sekitar 90% string dari halaman lain yang tidak dibuka**; sementara Intlayer secara bawaan mencatat **0%** kebocoran. Pergantian bahasa menggunakan backend lazy-load membutuhkan **123-185 ms** dengan `react-i18next`, dibandingkan hanya **3-4 ms** dengan Intlayer. Adaptor `@intlayer/next-i18next` mempertahankan API `i18next` dan menurunkan ukuran per halaman dari **218.5 KB** menjadi **150.7 KB**.
35
+
36
+ ## Ringkasan Singkat
37
+
38
+ - **i18next / react-i18next / next-i18next** - Matang, kaya akan plugin, dan agnostik terhadap framework. Mendukung namespaces, detektor bahasa, backend, ICU via plugin, serta `<Trans>` untuk konten kaya. Konten dikelola terpusat di `locales/{lng}/{ns}.json`. Sangat andal, namun setiap langkah optimasi (pemecahan namespace, pemuatan per halaman, keamanan tipe data) membutuhkan konfigurasi manual yang harus Anda pelihara sendiri.
39
+ - **Intlayer** - Model konten berbasis komponen. Kamus `.content.ts` ditempatkan langsung di samping komponen terkait, kompilator saat build otomatis menerapkan tree-shaking dan lazy loading per komponen serta per bahasa, tipe data TypeScript yang ketat dibuat otomatis dari konten, dan terjemahan yang hilang akan langsung memicu error saat build. Menyediakan middleware bawaan, pembantu SEO, Visual Editor / CMS, dan penerjemahan dengan bantuan AI.
40
+
41
+ | Library | Bintang GitHub | Total Commit | Commit Terakhir | Versi Perdana | Versi NPM | Unduhan Bulanan NPM |
42
+ | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | --------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
43
+ | `aymericzip/intlayer` | [![GitHub Repo stars](https://img.shields.io/github/stars/aymericzip/intlayer?style=for-the-badge&label=%E2%AD%90%20stars)](https://github.com/aymericzip/intlayer/stargazers) | [![GitHub commit activity](https://img.shields.io/github/commit-activity/t/aymericzip/intlayer?style=for-the-badge&label=commits)](https://github.com/aymericzip/intlayer/commits) | [![Last Commit](https://img.shields.io/github/last-commit/aymericzip/intlayer?style=for-the-badge)](https://github.com/aymericzip/intlayer/commits) | April 2024 | [![npm](https://img.shields.io/npm/v/intlayer?style=for-the-badge)](https://www.npmjs.com/package/intlayer) | [![npm downloads](https://img.shields.io/npm/dm/intlayer?style=for-the-badge)](https://www.npmjs.com/package/intlayer) |
44
+ | `i18next/i18next` | [![GitHub Repo stars](https://img.shields.io/github/stars/i18next/i18next?style=for-the-badge&label=%E2%AD%90%20stars)](https://github.com/i18next/i18next/stargazers) | [![GitHub commit activity](https://img.shields.io/github/commit-activity/t/i18next/i18next?style=for-the-badge&label=commits)](https://github.com/i18next/i18next/commits) | [![Last Commit](https://img.shields.io/github/last-commit/i18next/i18next?style=for-the-badge)](https://github.com/i18next/i18next/commits) | Januari 2012 | [![npm](https://img.shields.io/npm/v/i18next?style=for-the-badge)](https://www.npmjs.com/package/i18next) | [![npm downloads](https://img.shields.io/npm/dm/i18next?style=for-the-badge)](https://www.npmjs.com/package/i18next) |
45
+ | `i18next/react-i18next` | [![GitHub Repo stars](https://img.shields.io/github/stars/i18next/react-i18next?style=for-the-badge&label=%E2%AD%90%20stars)](https://github.com/i18next/react-i18next/stargazers) | [![GitHub commit activity](https://img.shields.io/github/commit-activity/t/i18next/react-i18next?style=for-the-badge&label=commits)](https://github.com/i18next/react-i18next/commits) | [![Last Commit](https://img.shields.io/github/last-commit/i18next/react-i18next?style=for-the-badge)](https://github.com/i18next/react-i18next/commits) | Desember 2015 | [![npm](https://img.shields.io/npm/v/react-i18next?style=for-the-badge)](https://www.npmjs.com/package/react-i18next) | [![npm downloads](https://img.shields.io/npm/dm/react-i18next?style=for-the-badge)](https://www.npmjs.com/package/react-i18next) |
46
+ | `i18next/next-i18next` | [![GitHub Repo stars](https://img.shields.io/github/stars/i18next/next-i18next?style=for-the-badge&label=%E2%AD%90%20stars)](https://github.com/i18next/next-i18next/stargazers) | [![GitHub commit activity](https://img.shields.io/github/commit-activity/t/i18next/next-i18next?style=for-the-badge&label=commits)](https://github.com/i18next/next-i18next/commits) | [![Last Commit](https://img.shields.io/github/last-commit/i18next/next-i18next?style=for-the-badge)](https://github.com/i18next/next-i18next/commits) | November 2018 | [![npm](https://img.shields.io/npm/v/next-i18next?style=for-the-badge)](https://www.npmjs.com/package/next-i18next) | [![npm downloads](https://img.shields.io/npm/dm/next-i18next?style=for-the-badge)](https://www.npmjs.com/package/next-i18next) |
47
+
48
+ > Lencana diperbarui secara otomatis. Angka dapat berubah seiring waktu.
49
+
50
+ ## Perbandingan Fitur
51
+
52
+ | Fitur | Intlayer (`react-intlayer` / `next-intlayer`) | i18next (`react-i18next` / `next-i18next`) |
53
+ | ----------------------------------------------- | ------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
54
+ | **Terjemahan berada di dekat komponen** | ✅ Ya, file `.content.ts` ditempatkan bersama komponen | ❌ Tidak, terpusat di `locales/{lng}/{ns}.json` |
55
+ | **Integrasi TypeScript** | ✅ Tipe ketat dihasilkan otomatis dari isi konten | ⚠️ Dasar; kunci ketat memerlukan perluasan `CustomTypeOptions` dan pengetikan |
56
+ | **Deteksi terjemahan yang hilang** | ✅ Error TypeScript + error/peringatan saat build | ⚠️ Fallback runtime (`saveMissing`, pengulangan kunci) |
57
+ | **Konten kaya (JSX / Markdown / komponen)** | ✅ Dukungan langsung secara native | ⚠️ Menggunakan tag bernomor pada `<Trans>` |
58
+ | **Dukungan ICU** | ⚠️ Dalam tahap pengembangan | ⚠️ Melalui plugin (`i18next-icu`) |
59
+ | **Bentuk Jamak (Pluralization)** | ✅ Pola berbasis enumerasi yang jelas | ✅ Akhiran `_one` / `_other` (Intl.PluralRules) |
60
+ | **Pemformatan (tanggal, angka, mata uang)** | ✅ `useNumber`, `useDate`, ... (memanfaatkan Intl bawaan) | ⚠️ Formatter interpolasi atau pemanggilan manual `Intl.*` |
61
+ | **Routing terlokalisasi dan middleware** | ✅ Proxy/middleware terintegrasi, `getMultilingualUrls` | ⚠️ Tidak ada di core; membutuhkan middleware kustom atau pihak ketiga |
62
+ | **Pembantu SEO (hreflang, sitemap, robots)** | ✅ Alat bantu terintegrasi | ❌ Dikerjakan manual |
63
+ | **Komponen server sinkron (RSC)** | ✅ `useIntlayer` dari `next-intlayer/server` dapat langsung dipanggil di server | ⚠️ Memanggil `getFixedT` di page lalu mengalirkan `t` melalui Props |
64
+ | **Tree-shaking (hanya memuat konten terpakai)** | ✅ Per komponen dan per bahasa, otomatis oleh kompilator | ⚠️ Manual: namespaces + daftar `ns` per halaman + backend |
65
+ | **Pemuatan lambat (Lazy loading)** | ✅ `importMode: 'dynamic'` (cukup satu baris konfigurasi) | ✅ Melalui plugin backend (`i18next-resources-to-backend`, dll.) |
66
+ | **Pembersihan konten tak terpakai (Purge)** | ✅ Kamus yang tidak terpakai dibuang saat build | ❌ Tidak tersedia secara bawaan |
67
+ | **Uji terjemahan hilang (CLI / CI)** | ✅ `npx intlayer content test` | ⚠️ Menggunakan `i18next-parser` atau perkakas eksternal |
68
+ | **Terjemahan berbantuan AI** | ✅ Terintegrasi, menggunakan kunci API penyedia pilihan Anda | ❌ Tidak ada (Locize merupakan layanan berbayar terpisah) |
69
+ | **Visual Editor / CMS** | ✅ Visual Editor gratis + CMS opsional | ❌ Tidak ada (bergantung pada Locize atau platform luar) |
70
+ | **Server MCP & Agent Skills** | ✅ Didukung penuh | ❌ Tidak didukung |
71
+ | **Ekosistem & Komunitas** | ⚠️ Lebih baru namun berkembang sangat pesat | ✅ Terbesar dan paling berpengalaman |
72
+
73
+ ## Pengujian Benchmark
74
+
75
+ ### Apa yang Diukur?
76
+
77
+ Suite pengujian [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom) membangun **aplikasi yang identik** dengan setiap library: **10 halaman** (home, about, blog, careers, contact, FAQ, pricing, products, settings, team), **10 bahasa** (`en`, `fr`, `es`, `de`, `it`, `pt`, `zh`, `ja`, `ko`, `ru`), dengan komponen dan konten yang sama persis. Pengukuran diuji pada bahasa Inggris (`en`) dan Prancis (`fr`). Setiap library diuji dengan hingga empat **strategi pemuatan**:
78
+
79
+ | Strategi | Deskripsi | Contoh Penggunaan |
80
+ | ------------------ | ------------------------------------------------------------------------------------------- | ------------------------------------------- |
81
+ | **static** | Seluruh bahasa dan halaman digabungkan dalam satu bundle (`resources` langsung di `init()`) | Prototipe kilat, kode hasil generasi AI |
82
+ | **dynamic** | Hanya bahasa aktif yang dimuat lewat backend, namun seluruh namespace dimuat bersamaan | Sebagian besar proyek umum |
83
+ | **scoped-static** | Satu namespace per rute, seluruhnya disertakan di bundle awal | Kasus yang jarang terjadi |
84
+ | **scoped-dynamic** | Namespace per rute + lazy loading lewat backend. Hanya halaman aktif dan bahasa aktif | Aplikasi dengan batasan performa yang ketat |
85
+
86
+ Intlayer tidak memerlukan varian "scoped": Kompilator secara otomatis mengisolasi konten **pada level komponen**, sehingga baris `static` dan `dynamic` sudah teroptimasi sejak awal.
87
+
88
+ Metrik yang dicatat untuk setiap build:
89
+
90
+ - **Lib size**: Ukuran gzip komponen kosong yang hanya mengimpor library i18n (biaya runtime tetap).
91
+ - **Page JS**: Rata-rata ukuran gzip JavaScript yang diunduh per halaman (di seluruh halaman dan bahasa).
92
+ - **Locale leak %**: Persentase string terjemahan dalam file JS yang diunduh yang berasal dari bahasa yang **tidak** sedang dilihat pengguna.
93
+ - **Page leak %**: Persentase string terjemahan dalam file JS yang berasal dari halaman tempat pengguna **tidak** berada.
94
+ - **Component avg**: Rata-rata ukuran gzip setiap komponen yang dikompilasi secara terisolasi.
95
+ - **E2E reactivity**: Waktu aktual dari pemilihan bahasa baru hingga pembaruan tag `html[lang]` di DOM (Playwright, rata-rata 5 kali percobaan).
96
+ - **Hydration**: Durasi fase hidrasi React.
97
+
98
+ > Data di bawah ini diambil dari pengujian tanggal **2026-09-12** menggunakan `next-i18next` 16.3.0, `react-i18next` 17.0.13, dan `intlayer` 9.5.1. Aplikasi pengujian dirancang ringkas, sehingga persentase kebocoran mencerminkan **pola struktural**: Kebocoran akan bertambah besar seiring bertambahnya teks aplikasi, sementara biaya runtime tetap statis.
99
+
100
+ ### Hasil pada Next.js (`next-i18next`)
101
+
102
+ | Library | Strategi | Lib size (gz) | Page JS avg (gz) | Kebocoran Bahasa | Kebocoran Halaman | Rata-rata Komp. (gz) | Reaktivitas E2E | Hydration |
103
+ | --------------------------------- | -------------- | ------------: | ---------------: | ---------------: | ----------------: | -------------------: | --------------: | --------: |
104
+ | **base** (tanpa i18n) | - | 0.0 KB | 141.0 KB | 0.0% | 0.0% | 0.9 KB | 13.4 ms | 11.8 ms |
105
+ | `next-i18next` | static | 19.7 KB | 218.5 KB | 0.0% | 89.8% | 78.5 KB | 16.4 ms | 15.6 ms |
106
+ | `next-i18next` | dynamic | 19.7 KB | 169.5 KB | 50.0% | 89.8% | 26.1 KB | 15.4 ms | 27.7 ms |
107
+ | `next-i18next` | scoped-static | 19.7 KB | 220.1 KB | 0.0% | 89.8% | 78.9 KB | 16.4 ms | 14.7 ms |
108
+ | `next-i18next` | scoped-dynamic | 19.7 KB | 163.4 KB | 0.0% | 0.0% | 27.1 KB | 15.9 ms | 15.1 ms |
109
+ | **`next-intlayer`** | static | **5.5 KB** | **141.3 KB** | **0.0%** | **0.0%** | **8.5 KB** | **15.5 ms** | 16.9 ms |
110
+ | **`next-intlayer`** | dynamic | **5.5 KB** | **141.3 KB** | **0.0%** | **0.0%** | **6.9 KB** | **15.3 ms** | 15.9 ms |
111
+ | `@intlayer/next-i18next` (kompat) | static | 9.4 KB | 150.7 KB | 0.0% | 0.0% | 9.7 KB | 10.7 ms | 11.3 ms |
112
+ | `@intlayer/next-i18next` (kompat) | dynamic | 9.4 KB | 150.7 KB | 0.0% | 0.0% | 9.7 KB | 11.9 ms | 10.6 ms |
113
+
114
+ **Analisis Hasil**
115
+
116
+ - **Biaya runtime**: Inti `i18next` yang digabungkan dengan `react-i18next` merupakan runtime paling berat yang diuji: **19.7 KB gzip** untuk sebuah komponen kosong, dibandingkan hanya 5.5 KB pada `next-intlayer`.
117
+ - **Konfigurasi standar sangat membebani**: Menyematkan `resources` langsung pada `init()` menghasilkan **218.5 KB per halaman** (+77.5 KB di atas aplikasi dasar). Setiap halaman dipaksa mengunduh seluruh namespace.
118
+ - **Optimasi manual memakan waktu**: Beralih ke backend (`dynamic`) menghemat 49 KB namun **tetap membocorkan 90% teks halaman lain**, dan separuh dari teks yang terunduh berasal dari bahasa yang salah. Pemecahan namespace per rute (`scoped-dynamic`) berhasil menghentikan kebocoran pada angka **163.4 KB**, namun tetap **+22.4 KB per halaman lebih besar** daripada Intlayer (141.3 KB) yang tidak memerlukan pengaturan manual sama sekali.
119
+ - **Ukuran per komponen**: Komponen yang memanggil `useTranslation()` menghasilkan ukuran 26-79 KB; komponen yang sama dengan `useIntlayer()` hanya berukuran 6.9 KB.
120
+ - **Waktu hidrasi**: Pada konfigurasi `dynamic`, waktu hidrasi melonjak menjadi 27.7 ms karena instance i18next harus diinisialisasi dan meminta data backend di sisi klien sebelum React dapat menyelesaikan hidrasi.
121
+
122
+ ### Hasil pada TanStack Start (`react-i18next`)
123
+
124
+ Aplikasi yang sama pada TanStack Start dengan `react-i18next` murni untuk memisahkan faktor arsitektur Next.js:
125
+
126
+ | Library | Strategi | Lib size (gz) | Page JS avg (gz) | Kebocoran Bahasa | Kebocoran Halaman | Rata-rata Komp. (gz) | Reaktivitas E2E | Hydration |
127
+ | --------------------- | -------------- | ------------: | ---------------: | ---------------: | ----------------: | -------------------: | --------------: | --------: |
128
+ | **base** (tanpa i18n) | - | 0.0 KB | 111.0 KB | 0.0% | 0.0% | 0.7 KB | 8.1 ms | 21.6 ms |
129
+ | `react-i18next` | static | 18.4 KB | 180.3 KB | 50.0% | 89.8% | 24.3 KB | 12.9 ms | 85.1 ms |
130
+ | `react-i18next` | dynamic | 18.4 KB | 136.4 KB | 23.1% | 89.8% | 24.8 KB | 123.1 ms | 32.9 ms |
131
+ | `react-i18next` | scoped-static | 18.4 KB | 184.2 KB | 50.7% | 89.8% | 25.3 KB | 185.1 ms | 25.2 ms |
132
+ | `react-i18next` | scoped-dynamic | 18.4 KB | 127.2 KB | 0.0% | 0.0% | 26.7 KB | 17.6 ms | 11.3 ms |
133
+ | **`intlayer`** | static | **5.0 KB** | **125.8 KB** | 50.0% | **0.0%** | **8.1 KB** | **3.2 ms** | 11.5 ms |
134
+ | **`intlayer`** | dynamic | **5.0 KB** | **118.6 KB** | **0.0%** | **0.0%** | **6.3 KB** | **3.6 ms** | 14.1 ms |
135
+
136
+ **Analisis Hasil**
137
+
138
+ - Aplikasi dasar `react-i18next` mengunduh **+69 KB per halaman** lebih banyak dari aplikasi tanpa i18n, dan hidrasi membutuhkan **85 ms** (4 kali lebih lama) karena seluruh struktur data diterjemahkan dan didaftarkan di klien sebelum render pertama.
139
+ - **Keterlambatan saat berganti bahasa**: Saat menggunakan pemuatan bertahap (lazy load), pergantian bahasa mengharuskan komunikasi bolak-balik ke jaringan sebelum `html[lang]` diperbarui: **123 ms** pada `dynamic`, dan **185 ms** pada `scoped-static`. Sedangkan Intlayer memperbarui DOM dalam **3-4 ms** pada kedua mode tanpa tertahan oleh antrean jaringan.
140
+ - Konfigurasi `scoped-dynamic` yang sangat dioptimalkan mencapai 127.2 KB, yang masih **+8.6 KB lebih berat** daripada Intlayer di mode `dynamic`, serta menuntut pengaturan peta rute, backend sumber daya, dan batasan Suspense yang rumit.
141
+ - Mode `static` pada Intlayer secara bawaan memiliki **0% kebocoran halaman** karena hanya kamus yang diimpor oleh komponen halaman tersebut yang dimasukkan ke bundle. Mengaktifkan `importMode: 'dynamic'` juga langsung meniadakan kebocoran bahasa.
142
+ - **Ukuran per komponen**: 24-27 KB pada `react-i18next` berbanding 6-8 KB pada Intlayer. `useTranslation()` mengikat setiap komponen ke instance global i18next.
143
+
144
+ ## Mengapa Perbedaannya Begitu Nyata? Global Instance vs Kamus Terkompilasi
145
+
146
+ `i18next` dirancang pada tahun 2012 sebagai pustaka runtime: Satu instance global menyimpan data teks, serangkaian plugin memperluas fungsinya, dan fungsi `t()` mencari kunci saat perenderan. Pola ini sangat fleksibel namun memicu penumpukan ukuran:
147
+
148
+ ```bash
149
+ .
150
+ ├── i18n.ts # createInstance().use(...).use(...).init({...})
151
+ └── src
152
+ ├── locales
153
+ │ ├── en
154
+ │ │ ├── common.json
155
+ │ │ ├── home.json
156
+ │ │ └── about.json
157
+ │ └── fr
158
+ │ ├── common.json
159
+ │ ├── home.json
160
+ │ └── about.json
161
+ ├── components
162
+ │ └── Counter.tsx # useTranslation("about") + t("counter.label")
163
+ └── app
164
+ └── [locale]
165
+ └── about
166
+ └── page.tsx # harus tahu bahwa halaman ini membutuhkan ["common", "about"]
167
+ ```
168
+
169
+ Instance global tidak dapat mengetahui kunci apa saja yang akan dipanggil oleh suatu komponen; sehingga ia menampung seluruh namespace yang diminta. Mengoptimalkannya berarti **Anda** harus membagi file, **Anda** harus mencatat namespace yang dibutuhkan setiap halaman, dan **Anda** harus memperbaruinya saat ada komponen yang dipindahkan. Seperti dikutip dalam [laporan benchmark](https://github.com/intlayer-org/benchmark-bloom/blob/main/report/NOTE.md): "Menjaga keamanan tipe data sambil memastikan namespace mana yang harus disertakan di setiap halaman adalah mimpi buruk".
170
+
171
+ Intlayer meniadakan instance global tersebut. Konten dideklarasikan langsung di sebelah komponen, dan kompilator menyelesaikan grafik ketergantungan pada fase build:
172
+
173
+ ```bash
174
+ .
175
+ ├── intlayer.config.ts
176
+ └── src
177
+ ├── components
178
+ │ └── Counter
179
+ │ ├── index.tsx # useIntlayer("counter")
180
+ │ └── index.content.ts
181
+ └── app
182
+ └── [locale]
183
+ └── about
184
+ ├── page.tsx
185
+ └── page.content.ts
186
+ ```
187
+
188
+ `@intlayer/swc` / `@intlayer/babel` mendeteksi komponen mana yang memakai kamus mana, mengemas hanya kamus tersebut untuk bahasa aktif, dan membersihkan teks yang tidak terpakai. Pola "scoped-dynamic" menjadi output alami dari proses build, bukan lagi tugas manual yang harus dipelihara pengembang.
189
+
190
+ > Untuk menerapkan performa pada baris `dynamic`, setel `dictionary.importMode: 'dynamic'` di file `intlayer.config.ts`. Silakan pelajari lebih lanjut di [panduan optimasi bundle](https://intlayer.org/id/doc/concept/bundle-optimization).
191
+
192
+ ## Pengalaman Pengembang (DX)
193
+
194
+ ### Perbandingan Konfigurasi Awal
195
+
196
+ **next-i18next (App Router)**
197
+
198
+ ```ts fileName="src/app/i18n/server.ts"
199
+ import { createInstance } from "i18next";
200
+ import { initReactI18next } from "react-i18next/initReactI18next";
201
+ import resourcesToBackend from "i18next-resources-to-backend";
202
+ import { defaultLocale } from "@/i18n.config";
203
+
204
+ const backend = resourcesToBackend(
205
+ (locale: string, namespace: string) =>
206
+ import(`../../locales/${locale}/${namespace}.json`)
207
+ );
208
+
209
+ export const initI18next = async (
210
+ locale: string,
211
+ namespaces: string[] = ["common"]
212
+ ) => {
213
+ const i18n = createInstance();
214
+ await i18n
215
+ .use(initReactI18next)
216
+ .use(backend)
217
+ .init({
218
+ lng: locale,
219
+ fallbackLng: defaultLocale,
220
+ ns: namespaces,
221
+ defaultNS: "common",
222
+ interpolation: { escapeValue: false },
223
+ react: { useSuspense: false },
224
+ });
225
+ return i18n;
226
+ };
227
+ ```
228
+
229
+ Pengembang juga harus mengelola `I18nProvider` di klien, mengatur `generateStaticParams`, serta mendefinisikan array `namespaces` pada tiap halaman.
230
+
231
+ **Intlayer**
232
+
233
+ ```ts fileName="intlayer.config.ts"
234
+ import { type IntlayerConfig, Locales } from "intlayer";
235
+
236
+ const config: IntlayerConfig = {
237
+ internationalization: {
238
+ locales: [Locales.ENGLISH, Locales.FRENCH],
239
+ defaultLocale: Locales.ENGLISH,
240
+ },
241
+ };
242
+
243
+ export default config;
244
+ ```
245
+
246
+ ```tsx fileName="src/app/[locale]/layout.tsx"
247
+ import { getHTMLTextDir } from "intlayer";
248
+ import { IntlayerClientProvider, type NextLayoutIntlayer } from "next-intlayer";
249
+
250
+ const LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => {
251
+ const { locale } = await params;
252
+
253
+ return (
254
+ <html lang={locale} dir={getHTMLTextDir(locale)}>
255
+ <body>
256
+ <IntlayerClientProvider locale={locale}>
257
+ {children}
258
+ </IntlayerClientProvider>
259
+ </body>
260
+ </html>
261
+ );
262
+ };
263
+
264
+ export default LocaleLayout;
265
+ ```
266
+
267
+ ### Komponen Klien
268
+
269
+ **react-i18next**
270
+
271
+ ```json fileName="src/locales/en/about.json"
272
+ {
273
+ "counter": {
274
+ "label": "Counter",
275
+ "increment": "Increment"
276
+ }
277
+ }
278
+ ```
279
+
280
+ ```tsx fileName="src/components/Counter.tsx"
281
+ "use client";
282
+
283
+ import { useState } from "react";
284
+ import { useTranslation } from "react-i18next";
285
+
286
+ export const Counter = () => {
287
+ const { t, i18n } = useTranslation("about");
288
+ const [count, setCount] = useState(0);
289
+ const numberFormat = new Intl.NumberFormat(i18n.language);
290
+
291
+ return (
292
+ <div>
293
+ <p>{numberFormat.format(count)}</p>
294
+ <button
295
+ aria-label={t("counter.label")}
296
+ onClick={() => setCount((c) => c + 1)}
297
+ >
298
+ {t("counter.increment")}
299
+ </button>
300
+ </div>
301
+ );
302
+ };
303
+ ```
304
+
305
+ > Halaman yang memuat komponen ini wajib menyertakan namespace `about`, dan `t("counter.label")` hanyalah string biasa tanpa bantuan tipe TypeScript sebelum `CustomTypeOptions` diperluas.
306
+
307
+ **Intlayer**
308
+
309
+ ```ts fileName="src/components/Counter/index.content.ts"
310
+ import { t, type Dictionary } from "intlayer";
311
+
312
+ const counterContent = {
313
+ key: "counter",
314
+ content: {
315
+ label: t({ en: "Counter", fr: "Compteur" }),
316
+ increment: t({ en: "Increment", fr: "Incrémenter" }),
317
+ },
318
+ } satisfies Dictionary;
319
+
320
+ export default counterContent;
321
+ ```
322
+
323
+ ```tsx fileName="src/components/Counter/index.tsx"
324
+ "use client";
325
+
326
+ import { useState } from "react";
327
+ import { useIntlayer } from "next-intlayer";
328
+ import { useNumber } from "next-intlayer/format";
329
+
330
+ export const Counter = () => {
331
+ const { label, increment } = useIntlayer("counter");
332
+ const number = useNumber();
333
+ const [count, setCount] = useState(0);
334
+
335
+ return (
336
+ <div>
337
+ <p>{number(count)}</p>
338
+ <button aria-label={label} onClick={() => setCount((c) => c + 1)}>
339
+ {increment}
340
+ </button>
341
+ </div>
342
+ );
343
+ };
344
+ ```
345
+
346
+ Properti `label` dan `increment` memiliki tipe data yang sangat ketat; kesalahan ketik akan langsung terdeteksi oleh TypeScript dan terjemahan bahasa Prancis yang belum diisi akan menggagalkan proses build.
347
+
348
+ ### Komponen Server Sinkron (RSC)
349
+
350
+ **next-i18next**
351
+
352
+ ```tsx fileName="src/components/ServerCounter.tsx"
353
+ type ServerCounterProps = {
354
+ t: (key: string) => string;
355
+ locale: string;
356
+ count: number;
357
+ };
358
+
359
+ export const ServerCounter = ({ t, locale, count }: ServerCounterProps) => (
360
+ <div>
361
+ <p>{new Intl.NumberFormat(locale).format(count)}</p>
362
+ <button aria-label={t("counter.label")}>{t("counter.increment")}</button>
363
+ </div>
364
+ );
365
+ ```
366
+
367
+ Halaman harus menjalankan `i18n.getFixedT(locale, "about")` dan meneruskan `t` serta `locale` ke bawah melalui props.
368
+
369
+ **Intlayer**
370
+
371
+ ```tsx fileName="src/components/ServerCounter.tsx"
372
+ import { useIntlayer } from "next-intlayer/server";
373
+ import { useNumber } from "next-intlayer/server/format";
374
+
375
+ export const ServerCounter = ({ count }: { count: number }) => {
376
+ const { label, increment } = useIntlayer("counter");
377
+ const number = useNumber();
378
+
379
+ return (
380
+ <div>
381
+ <p>{number(count)}</p>
382
+ <button aria-label={label}>{increment}</button>
383
+ </div>
384
+ );
385
+ };
386
+ ```
387
+
388
+ ## Gunakan API i18next, Nikmati Keringanan Intlayer
389
+
390
+ Anda tidak harus menulis ulang komponen yang ada untuk menikmati keuntungan benchmark di atas. Adaptor `@intlayer/i18next`, `@intlayer/react-i18next`, dan `@intlayer/next-i18next` dapat langsung dipasang: pemanggilan `useTranslation`, `t()`, `<Trans>`, dan bentuk jamak tetap berfungsi seperti biasa, disuplai oleh kamus yang dioptimalkan kompilator Intlayer di latar belakang.
391
+
392
+ ```ts fileName="next.config.ts"
393
+ import type { NextConfig } from "next";
394
+ import { createNextI18nPlugin } from "@intlayer/next-i18next/plugin";
395
+
396
+ const withIntlayer = createNextI18nPlugin();
397
+
398
+ const nextConfig: NextConfig = {};
399
+
400
+ export default withIntlayer(nextConfig);
401
+ ```
402
+
403
+ ```ts fileName="vite.config.ts"
404
+ import { defineConfig } from "vite";
405
+ import { reactI18nextVitePlugin } from "@intlayer/react-i18next/plugin";
406
+
407
+ export default defineConfig({
408
+ plugins: [reactI18nextVitePlugin()],
409
+ });
410
+ ```
411
+
412
+ Dalam pengujian benchmark, build kompatibel pada aplikasi Next.js yang sama mengalami penyusutan dari **218.5 KB menjadi 150.7 KB** per halaman, dari **78.5 KB menjadi 9.7 KB** per komponen, kebocoran halaman turun dari **~90% ke 0%**, dan waktu hidrasi membaik dari 15.6 ms ke 11.3 ms, tanpa merombak kode komponen Anda. File `locales/{lng}/{ns}.json` Anda yang sudah ada tetap bisa dijadikan sumber data melalui plugin sinkronisasi JSON.
413
+
414
+ Pelajari panduan migrasinya: [i18next](https://intlayer.org/id/doc/migration/i18next), [react-i18next](https://intlayer.org/id/doc/migration/react-i18next), [next-i18next](https://intlayer.org/id/doc/migration/next-i18next).
415
+
416
+ ## Kapan Memilih yang Mana?
417
+
418
+ - **Pilih i18next**: Jika Anda sangat bergantung pada ekosistem pluginnya (pendeteksi khusus, backend unik, ICU, Locize), menerapkan lokalisasi di luar React (Node services, vanilla JS, framework lain), tim Anda sudah terbiasa, atau sistem penerjemah mengharuskan struktur `locales/{lng}/{ns}.json`. Namun, pastikan Anda menyisihkan waktu untuk mengelola namespace dan rute jika kinerja adalah prioritas.
419
+ - **Pilih Intlayer**: Jika Anda mengutamakan **konten per komponen**, **keamanan tipe TypeScript yang ketat**, **deteksi terjemahan hilang saat build**, **tree-shaking dan lazy loading otomatis tanpa repot**, pergantian bahasa instan, komponen server sinkron, dan alat terintegrasi (Visual Editor, CMS, terjemahan AI, server MCP). Pilihan sempurna untuk aplikasi modular dan design system.
420
+ - **Pilih adaptor `@intlayer/*-i18next`**: Jika proyek Anda sudah berjalan menggunakan i18next dan ingin segera memangkas ukuran bundle serta mempercepat waktu muat tanpa perlu refactoring besar-besaran.
421
+
422
+ ## Perbandingan Terkait
423
+
424
+ - [next-intl vs Intlayer](https://intlayer.org/id/blog/next-intl-vs-intlayer) (benchmark yang sama)
425
+ - [Lingui vs Intlayer](https://intlayer.org/id/blog/lingui-vs-intlayer) (benchmark yang sama)
426
+ - [vue-i18n vs Intlayer benchmark](https://intlayer.org/id/blog/vue-i18n-vs-intlayer-benchmark) (benchmark yang sama)
427
+ - [next-i18next vs next-intl vs Intlayer](https://intlayer.org/id/blog/next-i18next-vs-next-intl-vs-intlayer)
428
+ - [react-i18next vs react-intl vs Intlayer](https://intlayer.org/id/blog/react-i18next-vs-react-intl-vs-intlayer)
429
+ - [Apakah i18next sudah ketinggalan zaman?](https://intlayer.org/id/blog/is-i18next-outdated)
430
+
431
+ ## Bintang GitHub
432
+
433
+ Bintang GitHub mencerminkan popularitas, kepercayaan komunitas, dan prospek jangka panjang sebuah proyek open-source. Meskipun bukan penentu tunggal dari kualitas kode, angka ini memperlihatkan antusiasme dan kesiapan adopsi di kalangan developer.
434
+
435
+ [![Grafik Riwayat Bintang](https://api.star-history.com/chart?repos=i18next%2Fi18next%2Ci18next%2Freact-i18next%2Ci18next%2Fnext-i18next%2Caymericzip%2Fintlayer&type=date&legend=top-left)](https://star-history.com/#i18next/i18next&i18next/react-i18next&i18next/next-i18next&aymericzip/intlayer)
436
+
437
+ ## Kesimpulan
438
+
439
+ `i18next` telah mengukir reputasi kuat: berjalan di mana saja, memiliki plugin untuk segala kebutuhan, dan dipelihara secara konsisten selama lebih dari sepuluh tahun. Namun, benchmark ini membuktikan beban dari arsitektur yang berpusat pada runtime. Penyiapan standar menambah beban **+70-77 KB gzip per halaman**, **membocorkan ~90% konten halaman lain**, dan memakan waktu **lebih dari 100 ms** saat berpindah bahasa. Menghilangkan kebocoran hingga 0% memang dapat dilakukan, tetapi butuh pengelolaan manual yang rumit dan tetap **9-22 KB lebih berat** daripada Intlayer.
440
+
441
+ Intlayer memindahkan seluruh beban kerja tersebut ke kompilator. Pengelolaan kamus per komponen, pemuatan bertahap per bahasa, dan pembersihan teks tak terpakai menjadi hasil otomatis dari proses build. Pada aplikasi yang sama, hasilnya: **Hanya +0.3 KB per halaman**, **0% kebocoran**, komponen **3-10 kali lebih kecil**, dan pergantian bahasa instan dalam **3-4 ms**.
442
+
443
+ Seluruh data mentah, aplikasi pengujian, dan skrip dapat diakses di [repositori Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom). Anda bebas mengujinya sendiri.
444
+
445
+ Untuk pemahaman lebih mendalam, kunjungi dokumentasi ['Mengapa Intlayer?'](https://intlayer.org/id/doc/why).
@@ -70,7 +70,7 @@ Aktivitas pengembangan selama 12 bulan terakhir:
70
70
  | `i18next` core | 2.626 | **259** | Patch minor |
71
71
  | Intlayer | 7.156 | **4.343** | Kompiler, perkakas IDE, dan mesin AI |
72
72
 
73
- [![Star History Chart](https://api.star-history.com/chart?repos=i18next%2Fi18next%2Ci18next%2Freact-i18next%2Ci18next%2Fnext-i18next%2Caymericzip%2Fintlayer&type=date&legend=top-left)](https://www.star-history.com/#i18next/i18next&i18next/react-i18next&i18next/next-i18next&aymericzip/intlayer)
73
+ [![Star History Chart](https://api.star-history.com/chart?repos=i18next%2Fi18next%2Ci18next%2Freact-i18next%2Ci18next%2Fnext-i18next%2Caymericzip%2Fintlayer&type=date&legend=top-left)](https://star-history.com/#i18next/i18next&i18next/react-i18next&i18next/next-i18next&aymericzip/intlayer)
74
74
 
75
75
  Pustaka yang matang memang menawarkan stabilitas. Namun standar perkakas i18n telah berubah: bundler modern memangkas teks tak terpakai saat build, model bahasa (LLM) menerjemahkan langsung di pipeline CI, dan editor terintegrasi dengan Language Server (LSP) serta AI agent. Arsitektur i18next yang murni mengandalkan runtime kesulitan mengadopsi kemajuan ini.
76
76
 
@@ -66,7 +66,7 @@ Catatan tahun terakhir:
66
66
  - `amannn/next-intl`: **187 commit** (sebagian besar adaptasi dependensi dan perbaikan minor).
67
67
  - `aymericzip/intlayer`: **4.343 commit** (pengembangan aktif pada kompiler, ekstensi IDE, server MCP, dan mesin terjemahan).
68
68
 
69
- [![Star History Chart](https://api.star-history.com/chart?repos=amannn%2Fnext-intl%2Caymericzip%2Fintlayer&type=date&legend=top-left)](https://www.star-history.com/#amannn/next-intl&aymericzip/intlayer)
69
+ [![Star History Chart](https://api.star-history.com/chart?repos=amannn%2Fnext-intl%2Caymericzip%2Fintlayer&type=date&legend=top-left)](https://star-history.com/#amannn/next-intl&aymericzip/intlayer)
70
70
 
71
71
  Pustaka yang matang memang memberikan rasa aman. Namun dunia i18n telah berubah: kompiler menghapus teks tak terpakai saat build, LLM menerjemahkan teks di CI, dan pengembang dibantu oleh Language Server (LSP) serta AI agent. Pustaka yang terpaku pada runtime sulit memanfaatkan inovasi ini.
72
72
 
@@ -64,7 +64,7 @@ Catatan selama 12 bulan terakhir:
64
64
  - `intlify/vue-i18n`: **259 commit** (perawatan berkala untuk Vue 3 dan Nuxt).
65
65
  - `aymericzip/intlayer`: **4.343 commit** (pengembangan berkelanjutan pada optimasi kompiler, LSP, dan integrasi AI agent).
66
66
 
67
- [![Star History Chart](https://api.star-history.com/chart?repos=intlify%2Fvue-i18n%2Caymericzip%2Fintlayer&type=date&legend=top-left)](https://www.star-history.com/#intlify/vue-i18n&aymericzip/intlayer)
67
+ [![Star History Chart](https://api.star-history.com/chart?repos=intlify%2Fvue-i18n%2Caymericzip%2Fintlayer&type=date&legend=top-left)](https://star-history.com/#intlify/vue-i18n&aymericzip/intlayer)
68
68
 
69
69
  Pustaka yang matang memang menjamin keandalan. Namun paradigma frontend modern kini berpusat pada transformasi AST saat build time, pembersihan dead code, dan otomatisasi AI. Sistem yang terpaku pada eksekusi di browser sulit mengadopsi kemudahan ini.
70
70