@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,411 @@
1
+ ---
2
+ createdAt: 2026-09-13
3
+ updatedAt: 2026-09-13
4
+ title: "next-intl vs Intlayer: Benchmark & Comparação 2026"
5
+ description: Tamanho do bundle, vazamento de conteúdo, reatividade de alternância de locale e experiência do desenvolvedor medidos no Next.js e TanStack Start. Qual biblioteca i18n você deve escolher em 2026?
6
+ keywords:
7
+ - next-intl
8
+ - use-intl
9
+ - Intlayer
10
+ - Internationalization
11
+ - i18n
12
+ - Benchmark
13
+ - Bundle size
14
+ - Blog
15
+ - Next.js
16
+ - TanStack Start
17
+ - JavaScript
18
+ - React
19
+ slugs:
20
+ - blog
21
+ - next-intl-vs-intlayer
22
+ author: aymericzip
23
+ ---
24
+
25
+ # next-intl VS Intlayer | Benchmark de Internacionalização (i18n) do Next.js
26
+
27
+ `next-intl` é a biblioteca i18n mais popular para Next.js. Intlayer é uma alternativa baseada em compilador e com escopo de componente. Ambas localizam uma aplicação App Router. A questão é quanto cada uma custa uma vez que a aplicação está compilada.
28
+
29
+ Este artigo não é um tutorial. É uma comparação apoiada por números do [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom), um conjunto de benchmark open-source que constrói a mesma aplicação com cada biblioteca e mede o que o navegador realmente faz download e executa.
30
+
31
+ <TOC/>
32
+
33
+ > **tl;dr**: Na mesma aplicação Next.js, `next-intl` adiciona **+12.6 KB gzip** de JavaScript em cada página, versus **+0.3 KB** para Intlayer. Sem trabalho extra, `next-intl` envia **~90% das strings de páginas estrangeiras** com cada página. Alcançar 0% de vazamento com `next-intl` requer escopo de namespace e `pick(messages, [...])` por página. Intlayer alcança 0% por padrão, porque seu compiler escopeia o conteúdo por componente. Se você quer a API `next-intl` com a saída do Intlayer, o adaptador `@intlayer/next-intl` mediu **147.5 KB** por página versus **153.6 KB** com o original.
34
+
35
+ ## Em resumo
36
+
37
+ - **next-intl** - Leve, bem documentado, formato de mensagem ICU, suporte de primeira classe ao App Router com middleware, formatters e helpers de navegação. O conteúdo reside em catálogos JSON centralizados; otimizações de desempenho (namespaces, seleção de mensagens por página, lazy loading) são sua responsabilidade.
38
+ - **Intlayer** - Modelo de conteúdo centrado em componentes. Dicionários `.content.ts` ficam ao lado do componente que servem, um compilador em tempo de build faz tree-shake e lazy-loads deles por componente e por locale, tipos TypeScript rigorosos são gerados a partir do seu conteúdo, e traduções ausentes falham em tempo de build. Inclui middleware, helpers de SEO, um Visual Editor / CMS e tradução assistida por IA.
39
+
40
+ | Biblioteca | Estrelas do GitHub | Total de Commits | Último Commit | Primeira Versão | Versão NPM | Downloads NPM |
41
+ | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | --------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
42
+ | `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) | Abril 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) |
43
+ | `amannn/next-intl` | [![GitHub Repo stars](https://img.shields.io/github/stars/amannn/next-intl?style=for-the-badge&label=%E2%AD%90%20stars)](https://github.com/amannn/next-intl/stargazers) | [![GitHub commit activity](https://img.shields.io/github/commit-activity/t/amannn/next-intl?style=for-the-badge&label=commits)](https://github.com/amannn/next-intl/commits) | [![Last Commit](https://img.shields.io/github/last-commit/amannn/next-intl?style=for-the-badge)](https://github.com/amannn/next-intl/commits) | Nov 2020 | [![npm](https://img.shields.io/npm/v/next-intl?style=for-the-badge)](https://www.npmjs.com/package/next-intl) | [![npm downloads](https://img.shields.io/npm/dm/next-intl?style=for-the-badge)](https://www.npmjs.com/package/next-intl) |
44
+
45
+ > Os emblemas são atualizados automaticamente. Os snapshots variarão ao longo do tempo.
46
+
47
+ ## Comparação de recursos lado a lado
48
+
49
+ | Recurso | `next-intlayer` (Intlayer) | `next-intl` |
50
+ | ------------------------------------------------- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
51
+ | **Traduções próximas aos componentes** | ✅ Sim, `.content.ts` colocado junto com cada componente | ❌ Não, centralizado em `messages/{locale}.json` |
52
+ | **Integração TypeScript** | ✅ Tipos estritos gerados automaticamente a partir do conteúdo | ✅ Bom, chaves tipadas via augmentação `global.d.ts` |
53
+ | **Detecção de tradução ausente** | ✅ Erro TypeScript + erro/aviso em tempo de build | ⚠️ Fallback em tempo de execução + aviso no console |
54
+ | **Conteúdo rico (JSX / Markdown / componentes)** | ✅ Suporte direto | ⚠️ `t.rich()` / `t.markup()` com placeholders de tag |
55
+ | **Suporte ICU** | ⚠️ Em desenvolvimento | ✅ Sim |
56
+ | **Formatação (datas, números, moedas)** | ✅ `useNumber`, `useDate`, ... (Intl sob o capô) | ✅ `useFormatter()` (Intl sob o capô) |
57
+ | **Roteamento localizado e middleware** | ✅ Proxy/middleware integrado, `getMultilingualUrls` | ✅ Middleware integrado, `Link`, `redirect`, `usePathname` |
58
+ | **Auxiliares de SEO (hreflang, sitemap, robots)** | ✅ Auxiliares integrados | ⚠️ Manual, baseado na configuração de roteamento |
59
+ | **Componentes de servidor síncrono** | ✅ `useIntlayer` de `next-intlayer/server` funciona em qualquer componente servidor filho | ⚠️ `getTranslations` é assíncrono; filhos síncronos precisam de `t` passado como props |
60
+ | **Renderização estática** | ✅ Não bloqueia a renderização estática | ⚠️ Requer `setRequestLocale()`; catálogos nomeados ainda optaram páginas fora da renderização estática em nossos testes |
61
+ | **Tree-shaking (enviar apenas conteúdo usado)** | ✅ Por componente, por locale, automatizado pelo compilador | ⚠️ Manual: namespaces + `pick(messages, [...])` por página |
62
+ | **Lazy loading** | ✅ `importMode: 'dynamic'` (uma linha de config) | ⚠️ Importações dinâmicas manuais em `getRequestConfig` |
63
+ | **Purge unused content** | ✅ Dicionários não utilizados são removidos no momento da compilação | ❌ Não incluído |
64
+ | **Testing missing translations (CLI / CI)** | ✅ `npx intlayer content test` | ⚠️ Não incluído; docs sugerem `npx @lingual/i18n-check` |
65
+ | **AI-powered translation** | ✅ Incluído, usa suas próprias chaves de provedor | ❌ Não |
66
+ | **Editor Visual / CMS** | ✅ Editor Visual gratuito + CMS opcional | ❌ Não (plataformas de localização externas) |
67
+ | **Servidor MCP & Agent Skills** | ✅ Sim | ❌ Não |
68
+ | **Ecossistema / comunidade** | ⚠️ Menor mas crescendo rapidamente | ✅ Grande, a referência do Next.js |
69
+
70
+ ## O benchmark
71
+
72
+ ### O que foi medido
73
+
74
+ O suite [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom) constrói **a mesma aplicação** com cada biblioteca: **10 páginas** (home, about, blog, careers, contact, FAQ, pricing, products, settings, team), **10 locales** (`en`, `fr`, `es`, `de`, `it`, `pt`, `zh`, `ja`, `ko`, `ru`), componentes idênticos e conteúdo idêntico. As páginas são medidas em `en` e `fr`. Cada biblioteca é implementada em até quatro **estratégias de carregamento**, da configuração ingênua até a otimizada:
75
+
76
+ | Strategy | Description | Who does this |
77
+ | ------------------ | ----------------------------------------------------------------------------------- | ------------------------------------------ |
78
+ | **static** | Cada locale e cada página agrupadas juntas | Protótipos rápidos, código gerado por IA |
79
+ | **dynamic** | Apenas a locale ativa é carregada, mas todas as páginas de uma vez | A maioria dos projetos |
80
+ | **scoped-static** | Namespaces por rota, sem lazy loading | Raro |
81
+ | **scoped-dynamic** | Namespaces por rota + lazy loading. Apenas a página atual na locale atual é enviada | Apps com orçamento de performance rigoroso |
82
+
83
+ Intlayer não possui uma variante "scoped": o compilador agrupa conteúdo **por componente** automaticamente, então suas linhas `static` e `dynamic` já estão agrupadas.
84
+
85
+ Para cada build, a suite registra:
86
+
87
+ - **Lib size**: tamanho gzip da biblioteca i18n. O custo fixo do runtime.
88
+ - **Page JS**: JavaScript gzip baixado por página, calculado em média sobre todas as páginas e locales.
89
+ - **Locale leak %**: proporção de strings traduzidas encontradas no JS baixado que pertencem a um locale que o usuário **não** está visualizando (fingerprinted em `en` e `fr`, então 50% significa "o outro locale medido está totalmente presente"; com 10 locales agrupados, o desperdício real é maior).
90
+ - **Page leak %**: proporção de strings traduzidas encontradas no JS baixado que pertencem a uma página em que o usuário **não** está.
91
+ - **Component avg**: tamanho gzip médio de cada componente compilado isoladamente. Mostra quanto runtime i18n um único componente carrega.
92
+ - **E2E reactivity**: tempo real entre selecionar uma nova locale e `html[lang]` atualizar no DOM (Playwright, 5 iterações).
93
+ - **Hydration**: duração da fase de hidratação do React.
94
+
95
+ > Os números abaixo vêm da execução datada de **2026-09-12** com `next-intl` 4.14.2, `use-intl` 4.14.2 e `intlayer` 9.5.1. A aplicação de teste é deliberadamente pequena (algumas dezenas de strings por locale), portanto as porcentagens de vazamento descrevem um **padrão**: eles crescem com seu conteúdo enquanto o custo de runtime permanece fixo.
96
+
97
+ ### Resultados no Next.js (App Router)
98
+
99
+ | Library | Strategy | Lib size (gz) | Page JS avg (gz) | Locale leak | Page leak | Component avg (gz) | E2E reactivity | Hydration |
100
+ | ------------------------------ | -------------- | ------------: | ---------------: | ----------: | --------: | -----------------: | -------------: | --------: |
101
+ | **base** (sem i18n) | - | 0.0 KB | 141.0 KB | 0.0% | 0.0% | 0.9 KB | 13.4 ms | 11.8 ms |
102
+ | `next-intl` | static | 14.7 KB | 153.6 KB | 4.2% | 89.8% | 21.8 KB | 16.0 ms | 14.7 ms |
103
+ | `next-intl` | dynamic | 14.7 KB | 153.6 KB | 9.7% | 89.9% | 21.8 KB | 15.6 ms | 14.8 ms |
104
+ | `next-intl` | scoped-static | 14.7 KB | 153.6 KB | 0.0% | 0.0% | 80.1 KB | 17.9 ms | 17.4 ms |
105
+ | `next-intl` | scoped-dynamic | 14.7 KB | 153.6 KB | 0.0% | 0.0% | 22.9 KB | 17.8 ms | 16.8 ms |
106
+ | **`next-intlayer`** | static | **5.5 KB** | **141.3 KB** | **0.0%** | **0.0%** | **8.5 KB** | **15.5 ms** | 16.9 ms |
107
+ | **`next-intlayer`** | dynamic | **5.5 KB** | **141.3 KB** | **0.0%** | **0.0%** | **6.9 KB** | **15.3 ms** | 15.9 ms |
108
+ | `@intlayer/next-intl` (compat) | static | 8.0 KB | 147.5 KB | 0.0% | 0.0% | 8.1 KB | 14.5 ms | 12.8 ms |
109
+ | `@intlayer/next-intl` (compat) | dynamic | 8.0 KB | 148.7 KB | 0.0% | 0.0% | 8.1 KB | 11.7 ms | 12.8 ms |
110
+
111
+ **Como ler isso**
112
+
113
+ - **Custo de runtime.** A aplicação base pesa 141.0 KB por página. `next-intl` a leva para 153.6 KB (**+12.6 KB gzip em cada página**), Intlayer para 141.3 KB (**+0.3 KB**). Esta diferença não depende de quantas strings você tem: é o runtime da biblioteca.
114
+ - **Vazamento.** Nos dois setups que a maioria das equipes realmente implementa (`static` e `dynamic`), `next-intl` entrega **~90% das strings de páginas estrangeiras** com cada página: todo o `en.json` vai para o provider do cliente. Para chegar a 0% é necessário os setups `scoped-*`: dividir catálogos em namespaces e depois fazer `pick()` dos corretos em cada página. Intlayer está em 0% em ambas as linhas sem nada disso.
115
+ - **O JS por página não se moveu para `next-intl` entre estratégias.** O conteúdo do teste é pequeno, então o vazamento de ~90% é apenas alguns KB aqui. Em uma app real com centenas de strings por página, essa proporção se torna o custo dominante. Enquanto isso, o runtime de +12.6 KB é pago em cada configuração.
116
+ - **Tamanho do componente.** Um componente que chama `useTranslations()` compila para 21.8 KB em média; o mesmo componente com `useIntlayer()` compila para 6.9 KB. Na configuração `scoped-static`, os componentes `next-intl` saltam para 80.1 KB porque cada um internaliza seu catálogo de namespace.
117
+ - **Reatividade e hidratação** estão no mesmo patamar para ambas as bibliotecas no Next.js (15-18 ms). Nenhuma delas é um gargalo aqui.
118
+
119
+ ### Resultados no TanStack Start (`use-intl`)
120
+
121
+ `use-intl` é o núcleo agnóstico de framework do `next-intl`. Mesma API, mesmo formato de mensagem. Comparar isso contra `intlayer` no TanStack Start remove as partes específicas do Next.js da equação.
122
+
123
+ | Library | Strategy | Lib size (gz) | Page JS avg (gz) | Locale leak | Page leak | Component avg (gz) | E2E reactivity |
124
+ | ----------------------------- | -------------- | ------------: | ---------------: | ----------: | --------: | -----------------: | -------------: |
125
+ | **base** (sem i18n) | - | 0.0 KB | 111.0 KB | 0.0% | 0.0% | 0.7 KB | 8.1 ms |
126
+ | `use-intl` | static | 14.1 KB | 179.8 KB | 50.0% | 89.8% | 76.0 KB | 6.7 ms |
127
+ | `use-intl` | dynamic | 14.1 KB | 119.4 KB | 0.0% | 89.8% | 75.9 KB | 7.0 ms |
128
+ | `use-intl` | scoped-static | 14.1 KB | 128.7 KB | 0.0% | 0.0% | 87.1 KB | 20.9 ms |
129
+ | `use-intl` | scoped-dynamic | 14.1 KB | 128.7 KB | 0.0% | 0.0% | 87.1 KB | 13.3 ms |
130
+ | **`intlayer`** | static | **5.0 KB** | **125.8 KB** | 50.0% | **0.0%** | **8.1 KB** | **3.2 ms** |
131
+ | **`intlayer`** | dynamic | **5.0 KB** | **118.6 KB** | **0.0%** | **0.0%** | **6.3 KB** | **3.6 ms** |
132
+ | `@intlayer/use-intl` (compat) | dynamic | 7.3 KB | 129.7 KB | 0.0% | 0.0% | 9.3 KB | 8.7 ms |
133
+
134
+ **Como ler isso**
135
+
136
+ - A configuração ingênua `use-intl` envia **68.8 KB a mais de JS por página** do que a aplicação base, com metade das strings pertencendo à locale errada e 90% à página errada.
137
+ - `use-intl` em modo `dynamic` chega a 119.4 KB, próximo ao 118.6 KB do Intlayer, mas ainda carrega **89.8% de vazamento de página**: as strings de todas as páginas para a locale ativa são carregadas em cada página. Escopo-las por rota (`scoped-*`) remove o vazamento, mas custa outro ~9 KB de overhead de chunk.
138
+ - Intlayer's `static` já tem **0% de vazamento de página**: o compilador só agrupa os dicionários usados pelos componentes na página. Habilitando `importMode: 'dynamic'` (uma linha em `intlayer.config.ts`) remove também o vazamento de locale.
139
+ - **O tamanho do componente é onde a arquitetura se manifesta**: 76-87 KB por componente com `use-intl` versus 6-8 KB com Intlayer. `useTranslations()` vincula cada componente à árvore de mensagens global; `useIntlayer()` vincula-o ao seu próprio dicionário.
140
+ - **Mudança de locale** é 2x-4x mais rápida com Intlayer (3 ms vs 7-21 ms).
141
+
142
+ ## Por que a diferença? Catálogos centralizados vs. dicionários compilados
143
+
144
+ `next-intl` segue o modelo clássico: um JSON por locale, carregado em `getRequestConfig`, inserido em um `NextIntlClientProvider`, lido através de `t("namespace.key")`.
145
+
146
+ ```bash
147
+ .
148
+ ├── messages
149
+ │ ├── en.json
150
+ │ └── fr.json
151
+ └── src
152
+ ├── i18n
153
+ │ ├── request.ts
154
+ │ └── routing.ts
155
+ ├── middleware.ts
156
+ └── app
157
+ └── [locale]
158
+ ├── layout.tsx
159
+ └── about
160
+ └── page.tsx
161
+ ```
162
+
163
+ O runtime não consegue saber quais keys uma página usará, então o padrão seguro é enviar o catálogo completo. Otimizar significa **você** dividir o catálogo em namespaces, **você** decidir quais namespaces cada página precisa, e **você** manter esse mapeamento sincronizado conforme os componentes se movem. A linha `scoped-dynamic` do benchmark é a recompensa por esse trabalho, e a maioria das equipes nunca chega lá.
164
+
165
+ Intlayer inverte a responsabilidade. O conteúdo é declarado ao lado do componente:
166
+
167
+ ```bash
168
+ .
169
+ ├── intlayer.config.ts
170
+ └── src
171
+ ├── middleware.ts
172
+ ├── app
173
+ │ └── [locale]
174
+ │ ├── layout.tsx
175
+ │ └── about
176
+ │ ├── page.tsx
177
+ │ └── page.content.ts
178
+ └── components
179
+ └── Counter
180
+ ├── index.tsx
181
+ └── index.content.ts
182
+ ```
183
+
184
+ No momento da compilação, o compilador (`@intlayer/swc` / `@intlayer/babel`) vê qual componente importa qual dicionário. Ele agrupa apenas esses dicionários, apenas para o locale ativo, e descarta os que nada importa. O padrão "scoped-dynamic" torna-se a saída da compilação em vez de uma disciplina que o time tem que manter.
185
+
186
+ > Para obter os números da linha `dynamic`, defina `dictionary.importMode: 'dynamic'` em `intlayer.config.ts`. Veja a [documentação de otimização de bundle](https://intlayer.org/doc/concept/bundle-optimization).
187
+
188
+ ## Experiência do desenvolvedor
189
+
190
+ ### Componente cliente
191
+
192
+ **next-intl**
193
+
194
+ ```json fileName="messages/en.json"
195
+ {
196
+ "counter": {
197
+ "label": "Counter",
198
+ "increment": "Increment"
199
+ }
200
+ }
201
+ ```
202
+
203
+ ```tsx fileName="src/components/Counter.tsx"
204
+ "use client";
205
+
206
+ import { useState } from "react";
207
+ import { useTranslations, useFormatter } from "next-intl";
208
+
209
+ export const Counter = () => {
210
+ const t = useTranslations("counter");
211
+ const format = useFormatter();
212
+ const [count, setCount] = useState(0);
213
+
214
+ return (
215
+ <div>
216
+ <p>{format.number(count)}</p>
217
+ <button aria-label={t("label")} onClick={() => setCount((c) => c + 1)}>
218
+ {t("increment")}
219
+ </button>
220
+ </div>
221
+ );
222
+ };
223
+ ```
224
+
225
+ > Lembrez-se de incluir o namespace `counter` nas mensagens passadas para `NextIntlClientProvider` em cada página que renderiza este componente.
226
+
227
+ **Intlayer**
228
+
229
+ ```ts fileName="src/components/Counter/index.content.ts"
230
+ import { t, type Dictionary } from "intlayer";
231
+
232
+ const counterContent = {
233
+ key: "counter",
234
+ content: {
235
+ label: t({ pt: "Contador", en: "Counter", fr: "Compteur" }),
236
+ increment: t({ pt: "Incrementar", en: "Increment", fr: "Incrémenter" }),
237
+ },
238
+ } satisfies Dictionary;
239
+
240
+ export default counterContent;
241
+ ```
242
+
243
+ ```tsx fileName="src/components/Counter/index.tsx"
244
+ "use client";
245
+
246
+ import { useState } from "react";
247
+ import { useIntlayer } from "next-intlayer";
248
+ import { useNumber } from "next-intlayer/format";
249
+
250
+ export const Counter = () => {
251
+ // Obter o rótulo e o texto do incremento do conteúdo da internacionalização
252
+ const { label, increment } = useIntlayer("counter");
253
+ // Obter a função de formatação de números
254
+ const number = useNumber();
255
+ const [count, setCount] = useState(0);
256
+
257
+ return (
258
+ <div>
259
+ <p>{number(count)}</p>
260
+ <button aria-label={label} onClick={() => setCount((c) => c + 1)}>
261
+ {increment}
262
+ </button>
263
+ </div>
264
+ );
265
+ };
266
+ ```
267
+
268
+ Nada para registrar na página: o componente traz seu próprio conteúdo.
269
+
270
+ ### Componente de servidor síncrono
271
+
272
+ Peças de design-system (navbar, footer, cards) são frequentemente componentes server renderizados como children de componentes client, então não podem ser `async`.
273
+
274
+ **next-intl**
275
+
276
+ ```tsx fileName="src/components/ServerCounter.tsx"
277
+ type ServerCounterProps = {
278
+ t: (key: string) => string;
279
+ formattedCount: string;
280
+ };
281
+
282
+ export const ServerCounter = ({ t, formattedCount }: ServerCounterProps) => (
283
+ <div>
284
+ <p>{formattedCount}</p>
285
+ <button aria-label={t("label")}>{t("increment")}</button>
286
+ </div>
287
+ );
288
+ ```
289
+
290
+ A página tem que `await getTranslations("counter")` e `await getFormatter()`, depois passar os resultados para baixo como props. O componente não é mais auto-contido.
291
+
292
+ **Intlayer**
293
+
294
+ ```tsx fileName="src/components/ServerCounter.tsx"
295
+ import { useIntlayer } from "next-intlayer/server";
296
+ import { useNumber } from "next-intlayer/server/format";
297
+
298
+ export const ServerCounter = ({ count }: { count: number }) => {
299
+ const { label, increment } = useIntlayer("counter");
300
+ const number = useNumber();
301
+
302
+ return (
303
+ <div>
304
+ <p>{number(count)}</p>
305
+ <button aria-label={label}>{increment}</button>
306
+ </div>
307
+ );
308
+ };
309
+ ```
310
+
311
+ ### Metadados
312
+
313
+ **next-intl**
314
+
315
+ ```tsx fileName="src/app/[locale]/about/page.tsx"
316
+ import type { Metadata } from "next";
317
+ import { getTranslations } from "next-intl/server";
318
+ import { routing } from "@/i18n/routing";
319
+
320
+ const localizedPath = (locale: string, path: string) =>
321
+ locale === routing.defaultLocale ? path : `/${locale}${path}`;
322
+
323
+ export const generateMetadata = async ({
324
+ params,
325
+ }: {
326
+ params: Promise<{ locale: string }>;
327
+ }): Promise<Metadata> => {
328
+ const { locale } = await params;
329
+ const t = await getTranslations({ locale, namespace: "about" });
330
+
331
+ const languages = Object.fromEntries(
332
+ routing.locales.map((l) => [l, localizedPath(l, "/about")])
333
+ );
334
+
335
+ return {
336
+ title: t("title"),
337
+ description: t("description"),
338
+ alternates: {
339
+ canonical: localizedPath(locale, "/about"),
340
+ languages: { ...languages, "x-default": "/about" },
341
+ },
342
+ };
343
+ };
344
+ ```
345
+
346
+ **Intlayer**
347
+
348
+ ```tsx fileName="src/app/[locale]/about/page.tsx"
349
+ import { getIntlayer, getMultilingualUrls } from "intlayer";
350
+ import type { Metadata } from "next";
351
+ import type { LocalPromiseParams } from "next-intlayer";
352
+
353
+ export const generateMetadata = async ({
354
+ params,
355
+ }: LocalPromiseParams): Promise<Metadata> => {
356
+ const { locale } = await params;
357
+ const metadata = getIntlayer("about-metadata", locale);
358
+ const multilingualUrls = getMultilingualUrls("/about");
359
+
360
+ return {
361
+ ...metadata,
362
+ alternates: {
363
+ canonical: multilingualUrls[locale as keyof typeof multilingualUrls],
364
+ languages: { ...multilingualUrls, "x-default": "/about" },
365
+ },
366
+ };
367
+ };
368
+ ```
369
+
370
+ ## Mantenha a API do next-intl, obtenha a saída do Intlayer
371
+
372
+ Você não precisa reescrever componentes para obter os números de benchmark acima. `@intlayer/next-intl` é um adaptador pronto para usar: mantém `useTranslations`, `getTranslations`, `useFormatter`, `t.rich()`, plurais ICU e os auxiliares `next-intl/navigation`, e os fornece a partir dos dicionários compilados do Intlayer pelo compilador Intlayer.
373
+
374
+ ```ts fileName="next.config.ts"
375
+ import type { NextConfig } from "next";
376
+ import { createNextIntlPlugin } from "@intlayer/next-intl/plugin";
377
+
378
+ const withIntlayer = createNextIntlPlugin();
379
+
380
+ const nextConfig: NextConfig = {};
381
+
382
+ export default withIntlayer(nextConfig);
383
+ ```
384
+
385
+ Na benchmark, a build de compatibilidade da mesma aplicação passou de **153.6 KB para 147.5 KB** por página, de **21.8 KB para 8.1 KB** por componente, e de **~90% page leakage para 0%**, com o código da aplicação intacto. Seus arquivos `messages/{locale}.json` existentes podem continuar sendo a fonte de verdade através do [plugin JSON sync](https://intlayer.org/doc/compatibility/next-intl).
386
+
387
+ Veja o [guia de migração next-intl](https://intlayer.org/doc/migration/next-intl) para o passo a passo.
388
+
389
+ ## Quando escolher qual?
390
+
391
+ - **Escolha next-intl** se você quer o padrão de ecossistema para Next.js, depende de ICU MessageFormat, sua aplicação é pequena a média, ou você se integra com uma plataforma de tradução (Crowdin, Phrase, Lokalise...) que espera JSON centralizado. Considere o tempo para namespace de catálogos e selecione mensagens por página se o desempenho importa.
392
+ - **Escolha Intlayer** se você quer **conteúdo com escopo de componente**, **TypeScript rigoroso**, **erros de chaves ausentes em tempo de build**, **tree-shaking e lazy loading sem esforço**, componentes de servidor síncronos, e ferramentas editoriais integradas (Visual Editor, CMS, tradução com IA, servidor MCP). Especialmente relevante para codebases grandes e modulares e design systems.
393
+ - **Escolha `@intlayer/next-intl`** se você já está usando `next-intl` e quer ganhos de bundle sem uma reescrita.
394
+
395
+ ## Comparações relacionadas
396
+
397
+ - [i18next vs Intlayer](https://intlayer.org/blog/i18next-vs-intlayer) (mesmo benchmark)
398
+ - [Lingui vs Intlayer](https://intlayer.org/blog/lingui-vs-intlayer) (mesmo benchmark)
399
+ - [vue-i18n vs Intlayer benchmark](https://intlayer.org/blog/vue-i18n-vs-intlayer-benchmark) (mesmo benchmark)
400
+ - [next-i18next vs next-intl vs Intlayer](https://intlayer.org/blog/next-i18next-vs-next-intl-vs-intlayer)
401
+ - [next-intl está desatualizado?](https://intlayer.org/blog/is-next-intl-outdated)
402
+
403
+ ## GitHub STARs
404
+
405
+ As estrelas do GitHub são um forte indicador de popularidade de um projeto, confiança da comunidade e relevância de longo prazo. Embora não sejam uma medida direta de qualidade técnica, elas refletem quantos desenvolvedores acham o projeto útil, acompanham seu progresso e provavelmente vão adotá-lo.
406
+
407
+ [![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)
408
+
409
+ ## Conclusão
410
+
411
+ `next-intl` é uma biblioteca sólida e bem mantida, e o benchmark confirma que está longe de ser a pior opção no Next.js. Mas seu modelo de catálogo centralizado coloca cada otimização nas mãos do desenvolvedor: a configuração ingênua vaza ~90% do conteúdo de páginas estrangeiras, e o runtime sozinho custa +12.6 KB gzip em cada página.