@intlayer/docs 8.9.4-canary.0 → 8.9.5

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 (207) hide show
  1. package/dist/cjs/generated/docs.entry.cjs +20 -0
  2. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  3. package/dist/esm/generated/docs.entry.mjs +20 -0
  4. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  5. package/dist/types/generated/docs.entry.d.ts +1 -0
  6. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  7. package/docs/ar/benchmark/index.md +0 -3
  8. package/docs/ar/benchmark/nextjs.md +15 -6
  9. package/docs/ar/benchmark/solid.md +155 -0
  10. package/docs/ar/benchmark/svelte.md +148 -0
  11. package/docs/ar/benchmark/tanstack.md +12 -3
  12. package/docs/ar/benchmark/vue.md +160 -0
  13. package/docs/ar/configuration.md +16 -12
  14. package/docs/ar/dictionary/content_file.md +51 -1
  15. package/docs/ar/mcp_server.md +30 -17
  16. package/docs/ar/plugins/sync-po.md +333 -0
  17. package/docs/bn/configuration.md +16 -12
  18. package/docs/cs/configuration.md +16 -12
  19. package/docs/de/benchmark/index.md +0 -3
  20. package/docs/de/benchmark/nextjs.md +15 -6
  21. package/docs/de/benchmark/solid.md +155 -0
  22. package/docs/de/benchmark/svelte.md +148 -0
  23. package/docs/de/benchmark/tanstack.md +12 -3
  24. package/docs/de/benchmark/vue.md +160 -0
  25. package/docs/de/configuration.md +16 -12
  26. package/docs/de/dictionary/content_file.md +52 -2
  27. package/docs/de/mcp_server.md +29 -16
  28. package/docs/de/plugins/sync-po.md +332 -0
  29. package/docs/en/benchmark/nextjs.md +11 -2
  30. package/docs/en/benchmark/solid.md +22 -4
  31. package/docs/en/benchmark/svelte.md +17 -5
  32. package/docs/en/benchmark/tanstack.md +18 -3
  33. package/docs/en/benchmark/vue.md +17 -11
  34. package/docs/en/configuration.md +16 -13
  35. package/docs/en/dictionary/content_file.md +51 -1
  36. package/docs/en/mcp_server.md +31 -18
  37. package/docs/en/plugins/sync-po.md +333 -0
  38. package/docs/en-GB/benchmark/index.md +0 -3
  39. package/docs/en-GB/benchmark/nextjs.md +15 -6
  40. package/docs/en-GB/benchmark/solid.md +155 -0
  41. package/docs/en-GB/benchmark/svelte.md +148 -0
  42. package/docs/en-GB/benchmark/tanstack.md +12 -3
  43. package/docs/en-GB/benchmark/vue.md +160 -0
  44. package/docs/en-GB/configuration.md +15 -11
  45. package/docs/en-GB/dictionary/content_file.md +51 -1
  46. package/docs/en-GB/mcp_server.md +31 -18
  47. package/docs/en-GB/plugins/sync-po.md +333 -0
  48. package/docs/es/benchmark/index.md +0 -3
  49. package/docs/es/benchmark/nextjs.md +15 -6
  50. package/docs/es/benchmark/solid.md +155 -0
  51. package/docs/es/benchmark/svelte.md +148 -0
  52. package/docs/es/benchmark/tanstack.md +12 -3
  53. package/docs/es/benchmark/vue.md +160 -0
  54. package/docs/es/configuration.md +16 -12
  55. package/docs/es/dictionary/content_file.md +51 -1
  56. package/docs/es/mcp_server.md +30 -17
  57. package/docs/es/plugins/sync-po.md +333 -0
  58. package/docs/fr/benchmark/index.md +0 -3
  59. package/docs/fr/benchmark/nextjs.md +15 -6
  60. package/docs/fr/benchmark/solid.md +155 -0
  61. package/docs/fr/benchmark/svelte.md +148 -0
  62. package/docs/fr/benchmark/tanstack.md +12 -3
  63. package/docs/fr/benchmark/vue.md +160 -0
  64. package/docs/fr/configuration.md +16 -12
  65. package/docs/fr/dictionary/content_file.md +51 -1
  66. package/docs/fr/mcp_server.md +30 -17
  67. package/docs/fr/plugins/sync-po.md +333 -0
  68. package/docs/hi/benchmark/nextjs.md +15 -6
  69. package/docs/hi/benchmark/solid.md +155 -0
  70. package/docs/hi/benchmark/svelte.md +148 -0
  71. package/docs/hi/benchmark/tanstack.md +12 -3
  72. package/docs/hi/benchmark/vue.md +160 -0
  73. package/docs/hi/configuration.md +16 -12
  74. package/docs/hi/dictionary/content_file.md +51 -1
  75. package/docs/hi/mcp_server.md +31 -18
  76. package/docs/hi/plugins/sync-po.md +333 -0
  77. package/docs/id/benchmark/index.md +0 -3
  78. package/docs/id/benchmark/nextjs.md +15 -6
  79. package/docs/id/benchmark/solid.md +155 -0
  80. package/docs/id/benchmark/svelte.md +148 -0
  81. package/docs/id/benchmark/tanstack.md +12 -3
  82. package/docs/id/benchmark/vue.md +160 -0
  83. package/docs/id/configuration.md +16 -12
  84. package/docs/id/dictionary/content_file.md +51 -1
  85. package/docs/id/mcp_server.md +30 -17
  86. package/docs/id/plugins/sync-po.md +333 -0
  87. package/docs/it/benchmark/index.md +1 -4
  88. package/docs/it/benchmark/nextjs.md +15 -6
  89. package/docs/it/benchmark/solid.md +155 -0
  90. package/docs/it/benchmark/svelte.md +148 -0
  91. package/docs/it/benchmark/tanstack.md +12 -3
  92. package/docs/it/benchmark/vue.md +160 -0
  93. package/docs/it/configuration.md +16 -12
  94. package/docs/it/dictionary/content_file.md +51 -1
  95. package/docs/it/mcp_server.md +30 -17
  96. package/docs/it/plugins/sync-po.md +333 -0
  97. package/docs/ja/benchmark/index.md +5 -5
  98. package/docs/ja/benchmark/nextjs.md +15 -6
  99. package/docs/ja/benchmark/solid.md +155 -0
  100. package/docs/ja/benchmark/svelte.md +148 -0
  101. package/docs/ja/benchmark/tanstack.md +12 -3
  102. package/docs/ja/benchmark/vue.md +160 -0
  103. package/docs/ja/configuration.md +16 -12
  104. package/docs/ja/dictionary/content_file.md +50 -2
  105. package/docs/ja/intlayer_with_nextjs_no_locale_path.md +4 -3
  106. package/docs/ja/mcp_server.md +29 -16
  107. package/docs/ja/plugins/sync-po.md +333 -0
  108. package/docs/ko/benchmark/nextjs.md +15 -6
  109. package/docs/ko/benchmark/solid.md +155 -0
  110. package/docs/ko/benchmark/svelte.md +148 -0
  111. package/docs/ko/benchmark/tanstack.md +12 -3
  112. package/docs/ko/benchmark/vue.md +160 -0
  113. package/docs/ko/configuration.md +16 -12
  114. package/docs/ko/dictionary/content_file.md +51 -1
  115. package/docs/ko/intlayer_with_nextjs_no_locale_path.md +3 -2
  116. package/docs/ko/mcp_server.md +31 -18
  117. package/docs/ko/plugins/sync-po.md +333 -0
  118. package/docs/nl/configuration.md +16 -12
  119. package/docs/pl/benchmark/index.md +0 -3
  120. package/docs/pl/benchmark/nextjs.md +15 -6
  121. package/docs/pl/benchmark/solid.md +155 -0
  122. package/docs/pl/benchmark/svelte.md +148 -0
  123. package/docs/pl/benchmark/tanstack.md +12 -3
  124. package/docs/pl/benchmark/vue.md +160 -0
  125. package/docs/pl/configuration.md +16 -12
  126. package/docs/pl/dictionary/content_file.md +51 -1
  127. package/docs/pl/mcp_server.md +30 -17
  128. package/docs/pl/plugins/sync-po.md +333 -0
  129. package/docs/pt/benchmark/index.md +0 -3
  130. package/docs/pt/benchmark/nextjs.md +16 -7
  131. package/docs/pt/benchmark/solid.md +155 -0
  132. package/docs/pt/benchmark/svelte.md +148 -0
  133. package/docs/pt/benchmark/tanstack.md +13 -4
  134. package/docs/pt/benchmark/vue.md +160 -0
  135. package/docs/pt/configuration.md +16 -12
  136. package/docs/pt/dictionary/content_file.md +51 -1
  137. package/docs/pt/mcp_server.md +30 -17
  138. package/docs/pt/plugins/sync-po.md +333 -0
  139. package/docs/ru/benchmark/nextjs.md +15 -6
  140. package/docs/ru/benchmark/solid.md +155 -0
  141. package/docs/ru/benchmark/svelte.md +148 -0
  142. package/docs/ru/benchmark/tanstack.md +12 -3
  143. package/docs/ru/benchmark/vue.md +160 -0
  144. package/docs/ru/configuration.md +16 -12
  145. package/docs/ru/dictionary/content_file.md +52 -2
  146. package/docs/ru/mcp_server.md +30 -17
  147. package/docs/ru/plugins/sync-po.md +333 -0
  148. package/docs/tr/benchmark/index.md +0 -3
  149. package/docs/tr/benchmark/nextjs.md +15 -6
  150. package/docs/tr/benchmark/solid.md +155 -0
  151. package/docs/tr/benchmark/svelte.md +148 -0
  152. package/docs/tr/benchmark/tanstack.md +12 -3
  153. package/docs/tr/benchmark/vue.md +160 -0
  154. package/docs/tr/configuration.md +16 -12
  155. package/docs/tr/dictionary/content_file.md +51 -1
  156. package/docs/tr/mcp_server.md +31 -18
  157. package/docs/tr/plugins/sync-po.md +333 -0
  158. package/docs/uk/benchmark/nextjs.md +15 -6
  159. package/docs/uk/benchmark/solid.md +155 -0
  160. package/docs/uk/benchmark/svelte.md +148 -0
  161. package/docs/uk/benchmark/tanstack.md +12 -3
  162. package/docs/uk/benchmark/vue.md +160 -0
  163. package/docs/uk/configuration.md +16 -12
  164. package/docs/uk/dictionary/content_file.md +51 -1
  165. package/docs/uk/mcp_server.md +29 -16
  166. package/docs/uk/plugins/sync-po.md +333 -0
  167. package/docs/ur/configuration.md +16 -12
  168. package/docs/vi/benchmark/index.md +0 -3
  169. package/docs/vi/benchmark/nextjs.md +15 -6
  170. package/docs/vi/benchmark/solid.md +155 -0
  171. package/docs/vi/benchmark/svelte.md +148 -0
  172. package/docs/vi/benchmark/tanstack.md +12 -3
  173. package/docs/vi/benchmark/vue.md +160 -0
  174. package/docs/vi/configuration.md +16 -12
  175. package/docs/vi/dictionary/content_file.md +51 -1
  176. package/docs/vi/intlayer_with_nextjs_15.md +10 -57
  177. package/docs/vi/mcp_server.md +30 -17
  178. package/docs/vi/plugins/sync-po.md +333 -0
  179. package/docs/zh/benchmark/nextjs.md +15 -6
  180. package/docs/zh/benchmark/solid.md +155 -0
  181. package/docs/zh/benchmark/svelte.md +148 -0
  182. package/docs/zh/benchmark/tanstack.md +12 -3
  183. package/docs/zh/benchmark/vue.md +160 -0
  184. package/docs/zh/configuration.md +16 -12
  185. package/docs/zh/dictionary/content_file.md +51 -3
  186. package/docs/zh/mcp_server.md +31 -18
  187. package/docs/zh/plugins/sync-po.md +333 -0
  188. package/frequent_questions/ar/intlayerNode.md +3 -3
  189. package/frequent_questions/de/intlayerNode.md +3 -3
  190. package/frequent_questions/en/intlayerNode.md +3 -3
  191. package/frequent_questions/en-GB/intlayerNode.md +3 -3
  192. package/frequent_questions/es/intlayerNode.md +3 -3
  193. package/frequent_questions/fr/intlayerNode.md +3 -3
  194. package/frequent_questions/hi/intlayerNode.md +3 -3
  195. package/frequent_questions/id/intlayerNode.md +3 -3
  196. package/frequent_questions/it/intlayerNode.md +3 -3
  197. package/frequent_questions/ja/intlayerNode.md +3 -3
  198. package/frequent_questions/ko/intlayerNode.md +3 -3
  199. package/frequent_questions/pl/intlayerNode.md +3 -3
  200. package/frequent_questions/pt/intlayerNode.md +3 -3
  201. package/frequent_questions/ru/intlayerNode.md +3 -3
  202. package/frequent_questions/tr/intlayerNode.md +3 -3
  203. package/frequent_questions/uk/intlayerNode.md +3 -3
  204. package/frequent_questions/vi/intlayerNode.md +3 -3
  205. package/frequent_questions/zh/intlayerNode.md +3 -3
  206. package/package.json +8 -8
  207. package/src/generated/docs.entry.ts +20 -0
@@ -0,0 +1,148 @@
1
+ ---
2
+ createdAt: 2026-04-20
3
+ updatedAt: 2026-04-21
4
+ title: Лучшее i18n решение для Svelte в 2026 году - Отчет о бенчмарке
5
+ description: Сравните библиотеки интернационализации (i18n) для Svelte, такие как svelte-i18n, Paraglide и Intlayer. Подробный отчет о производительности, размере бандла, утечках и реактивности.
6
+ keywords:
7
+ - benchmark
8
+ - i18n
9
+ - intl
10
+ - svelte
11
+ - производительность
12
+ - intlayer
13
+ slugs:
14
+ - doc
15
+ - benchmark
16
+ - svelte
17
+ author: Aymeric PINEAU
18
+ applicationTemplate: https://github.com/intlayer-org/benchmark-i18n-svelte-template
19
+ history:
20
+ - version: 8.7.12
21
+ date: 2026-01-06
22
+ changes: "Инициализация бенчмарка"
23
+ ---
24
+
25
+ # Библиотеки i18n для Svelte — Отчет о бенчмарке 2026
26
+
27
+ Эта страница представляет собой отчет о бенчмарке i18n-решений для Svelte.
28
+
29
+ ## Содержание
30
+
31
+ <Toc/>
32
+
33
+ ## Интерактивный бенчмарк
34
+
35
+ <I18nBenchmark framework="vite-svelte" vertical/>
36
+
37
+ ## Ссылка на результаты:
38
+
39
+ <iframe
40
+ src="https://intlayer.org/markdown?url=https%3A%2F%2Fraw.githubusercontent.com%2Fintlayer-org%2Fbenchmark-i18n%2Fmain%2Freport%2Fscripts%2Fsummarize-vite_svelte.md"
41
+ width="100%"
42
+ height="600px"
43
+ style="border:none;">
44
+ </iframe>
45
+
46
+ > https://intlayer.org/markdown?url=https%3A%2F%2Fraw.githubusercontent.com%2Fintlayer-org%2Fbenchmark-i18n%2Fmain%2Freport%2Fscripts%2Fsummarize-vite_svelte.md
47
+
48
+ Полный репозиторий бенчмарка можно найти [здесь](https://github.com/intlayer-org/benchmark-i18n/tree/main).
49
+
50
+ ## Введение
51
+
52
+ Решения для интернационализации являются одними из самых тяжелых зависимостей в Svelte-приложении. Основной риск заключается в передаче ненужного контента: переводов для других страниц и других локалей в бандле одного маршрута.
53
+
54
+ По мере роста вашего приложения эта проблема может быстро привести к раздуванию JavaScript, отправляемого клиенту, и замедлению навигации.
55
+
56
+ На практике в наименее оптимизированных реализациях интернационализированная страница может оказаться в несколько раз тяжелее версии без i18n.
57
+
58
+ Другой аспект — это опыт разработчика: то, как вы объявляете контент, типы, организацию пространств имен, динамическую загрузку и реактивность при смене локали.
59
+
60
+ ## TL;DR
61
+
62
+ - **Intlayer**: Самый эффективный выбор с точки зрения производительности (v8.7.12) с минимальным влиянием на размер.
63
+ - **Paraglide**: Сильный конкурент для tree-shaking, но имеет более сложный опыт разработки и накладные расходы на реактивность.
64
+ - **svelte-i18n**: Полнофункциональный и стандартный для Svelte, но имеет гораздо больший вес бандла (~7 раз больше Intlayer).
65
+
66
+ ## Проверьте свое приложение
67
+
68
+ Чтобы быстро выявить проблемы с утечкой i18n, я настроил бесплатный сканер, доступный [здесь](https://intlayer.org/i18n-seo-scanner).
69
+
70
+ <iframe src="https://intlayer.org/i18n-seo-scanner" width="100%" height="600px" style="border:none;"/>
71
+
72
+ ## Проблема
73
+
74
+ Два рычага необходимы для ограничения стоимости мультиязычного приложения:
75
+
76
+ - Разделение контента по страницам / пространствам имен, чтобы не загружать целые словари, когда они вам не нужны.
77
+ - Динамическая загрузка нужной локали только тогда, когда она требуется.
78
+
79
+ Понимание технических ограничений этих подходов:
80
+
81
+ **Динамическая загрузка**
82
+
83
+ Без динамической загрузки большинство решений хранят сообщения в памяти с первого рендеринга, что создает значительные накладные расходы для приложений с множеством маршрутов и локалей.
84
+
85
+ При использовании динамической загрузки вы идете на компромисс: меньше начального JS, но иногда дополнительный запрос при переключении языка.
86
+
87
+ **Разделение контента**
88
+
89
+ Синтаксис, построенный вокруг `t('a.b.c')`, очень удобен, но часто способствует хранению больших JSON-объектов во время выполнения. Эта модель затрудняет tree-shaking, если библиотека не предлагает реальную стратегию разделения контента для каждой страницы.
90
+
91
+ ## Методология
92
+
93
+ Для этого бенчмарка мы сравнили следующие библиотеки:
94
+
95
+ - `Base App` (Без библиотеки i18n)
96
+ - `svelte-intlayer` (v8.7.12)
97
+ - `svelte-i18n` (v4.0.1)
98
+ - `@inlang/paraglide-js` (v2.17.0)
99
+
100
+ Фреймворк — `Svelte` с мультиязычным приложением из **10 страниц** и **10 языков**.
101
+
102
+ Мы сравнили **четыре стратегии загрузки**:
103
+
104
+ | Стратегия | Без пространств имен (глобальная) | С пространствами имен (локальная/scoped) |
105
+ | :------------------------ | :---------------------------------------------- | :------------------------------------------------------------------------------- |
106
+ | **Статическая загрузка** | **Static**: Все в памяти при запуске. | **Scoped static**: Разделено по пространствам имен; все загружается при запуске. |
107
+ | **Динамическая загрузка** | **Dynamic**: Загрузка по требованию для локали. | **Scoped dynamic**: Гранулярная загрузка по пространствам имен и локалям. |
108
+
109
+ ## Резюме стратегий
110
+
111
+ - **Статическая (Static)**: Простота; отсутствие задержек сети после начальной загрузки. Минус: большой размер бандла.
112
+ - **Динамическая (Dynamic)**: Уменьшает начальный вес (ленивая загрузка). Идеально при наличии множества локалей.
113
+ - **Локальная статическая (Scoped static)**: Позволяет организовать код (логическое разделение) без сложных дополнительных сетевых запросов.
114
+ - **Локальная динамическая (Scoped dynamic)**: Лучший подход для _разделения кода_ и производительности. Минимизирует использование памяти, загружая только то, что нужно для текущего представления и активной локали.
115
+
116
+ ## Результаты в деталях
117
+
118
+ ### 1 — Решения, которых следует избегать
119
+
120
+ > В экосистеме Svelte нет однозначных решений, которых следует избегать.
121
+
122
+ ### 2 — Приемлемые решения
123
+
124
+ **(Paraglide)** (`@inlang/paraglide-js@2.17.0`):
125
+
126
+ `Paraglide` предлагает инновационный, хорошо продуманный подход. В контексте приложения Vite + Svelte рекламируемый ими tree-shaking работает как ожидалось, что здорово.
127
+ Но в случае с React + TanStack Start tree-shaking не сработал как ожидалось, то же самое и с Next.js. Тем не менее, я бы перепроверил использование Paraglide в проектах Svelte и TanStack Start.
128
+ Процесс работы и DX также сложнее, чем у других вариантов.
129
+ Лично мне не нравится необходимость регенерировать JS-файлы перед каждым пушем, что создает постоянный риск конфликтов при слиянии в PR. Инструмент также кажется более ориентированным на Vite, чем на Next.js.
130
+ Наконец, по сравнению с другими решениями, Paraglide не использует стор (например, Svelte store) для получения поточної локали для рендеринга. Для каждого обработанного узла он запрашивает локаль из localStorage / куки и т.д. Это приводит к выполнению ненужной логики, что влияет на реактивность компонентов.
131
+
132
+ > Примечание о paraglide: решение внедряет код в вашу кодовую базу для импорта, в результате чего метрика 'размер библиотеки' в отчете бенчмарка практически равна 0. Генерация кода — это хорошо, потому что используемая функция будет включать только необходимую логику (полный префикс против отсутствия префикса, куки против хранилища и т. д.). Для сравнения, Intlayer выполняет эту фильтрацию с помощью внедрения переменных окружения во время сборки, чтобы заставить бандлер выполнять tree-shaking контента в зависимости от логики. Благодаря этому paraglide и intlayer в итоге оказываются в 6-10 раз легче, чем i18next или next-intl.
133
+
134
+ **(svelte-i18n)** (`svelte-i18n@3.4.0`):
135
+
136
+ Это решение отвечает всем потребностям i18n в Svelte-проекте. Но, как и в случае с i18next или другими основными решениями i18n, оно немного тяжеловато (~15.9 КБ, что примерно в 7 раз больше `svelte-intlayer`).
137
+
138
+ ### 3 — Рекомендации
139
+
140
+ **(Intlayer)** (`svelte-intlayer@8.7.12`):
141
+
142
+ Я не буду лично оценивать `svelte-intlayer` ради объективности, так как это мое собственное решение.
143
+
144
+ ### Личное примечание
145
+
146
+ Это примечание является личным и не влияет на результаты бенчмарка. Тем не менее, в мире i18n часто можно встретить консенсус вокруг паттерна типа `const t = useTranslation('xx')` + `<>{t('xx.xx')}</>` для переведенного контента.
147
+
148
+ В Svelte-приложениях внедрение функции в качестве `Slot`, на мой взгляд, является антипаттерном. Это также добавляет лишнюю сложность и накладные расходы на выполнение JavaScript (даже если это почти незаметно).
@@ -57,6 +57,13 @@ history:
57
57
 
58
58
  Другой аспект — это опыт разработчика: то, как вы объявляете контент, типы, организацию пространств имен, динамическую загрузку и реактивность при смене локали.
59
59
 
60
+ ## TL;DR
61
+
62
+ - **Intlayer**: Обеспечивает лучшую производительность и наименьший размер бандла (v8.7.12) для TanStack Start.
63
+ - **react-i18next** и **use-intl**: Зрелые альтернативы с большими экосистемами, но значительно тяжелее и сложнее в оптимизации.
64
+ - **Paraglide**: Инновационная идея tree-shaking, которая не работает на практике. Сложный DX и накладные расходы на реактивность в TanStack Start.
65
+ - **Избегайте**: **General Translation (GT)** и **Lingo.dev** из-за серьезных проблем с производительностью, лимитов AI и привязки к вендору (vendor lock-in).
66
+
60
67
  ## Проверьте свое приложение
61
68
 
62
69
  Чтобы быстро выявить проблемы с утечкой i18n, я настроил бесплатный сканер, доступный [здесь](https://intlayer.org/i18n-seo-scanner).
@@ -87,12 +94,12 @@ history:
87
94
  Для этого бенчмарка мы сравнили следующие библиотеки:
88
95
 
89
96
  - `Base App` (Без библиотеки i18n)
90
- - `react-intlayer` (v8.7.5-canary.0)
97
+ - `react-intlayer` (v8.7.12)
91
98
  - `react-i18next` (v17.0.2)
92
99
  - `use-intl` (v4.9.1)
93
100
  - `@lingui/core` (v5.3.0)
94
101
  - `@inlang/paraglide-js` (v2.15.1)
95
- - `tolgee` (v7.0.0)
102
+ - `@tolgee/react` (v7.0.0)
96
103
  - `react-intl` (v10.1.1)
97
104
  - `wuchale` (v0.22.11)
98
105
  - `gt-react` (vlatest)
@@ -150,7 +157,9 @@ history:
150
157
 
151
158
  `Paraglide` предлагает инновационный, хорошо продуманный подход. Тем не менее, в этом бенчмарке обещанный tree-shaking не сработал ни для моей реализации на Next.js, ни для TanStack Start. Процесс работы и DX также сложнее, чем у других вариантов. Лично я не в восторге от необходимости перегенерировать JS-файлы перед каждым пушем, что создает постоянный риск конфликтов при слиянии в PR.
152
159
 
153
- **(Tolgee)** (`tolgee@7.0.0`):
160
+ > Примечание о paraglide: решение внедряет код в вашу кодовую базу для импорта, в результате чего метрика 'размер библиотеки' в отчете бенчмарка практически равна 0. Генерация кода — это хорошо, потому что используемая функция будет включать только необходимую логику (полный префикс против отсутствия префикса, куки против хранилища и т. д.). Для сравнения, Intlayer выполняет эту фильтрацию с помощью внедрения переменных окружения в сборку, чтобы заставить бандлер выполнять tree-shaking контента в зависимости от логики. Благодаря этому paraglide и intlayer в итоге оказываются в 6-10 раз легче, чем i18next или next-intl.
161
+
162
+ **(Tolgee)** (`@tolgee/react@7.0.0`):
154
163
 
155
164
  `Tolgee` решает многие из упомянутых ранее проблем. Мне показалось, что начать работу с ним сложнее, чем с другими инструментами с похожими подходами. Он не обеспечивает типобезопасность, что значительно затрудняет отлов отсутствующих ключей на этапе компиляции. Мне пришлось обернуть API Tolgee своими собственными, чтобы добавить обнаружение отсутствующих ключей.
156
165
 
@@ -0,0 +1,160 @@
1
+ ---
2
+ createdAt: 2026-04-20
3
+ updatedAt: 2026-04-21
4
+ title: Лучшее i18n решение для Vue в 2026 году - Отчет о бенчмарке
5
+ description: Сравните библиотеки интернационализации (i18n) для Vue, такие как vue-i18n, fluent-vue и Intlayer. Подробный отчет о производительности, размере бандла, утечках и реактивности.
6
+ keywords:
7
+ - benchmark
8
+ - i18n
9
+ - intl
10
+ - vue
11
+ - производительность
12
+ - intlayer
13
+ slugs:
14
+ - doc
15
+ - benchmark
16
+ - vue
17
+ author: Aymeric PINEAU
18
+ applicationTemplate: https://github.com/intlayer-org/benchmark-i18n-vue-template
19
+ history:
20
+ - version: 8.7.12
21
+ date: 2026-01-06
22
+ changes: "Инициализация бенчмарка"
23
+ ---
24
+
25
+ # Библиотеки i18n для Vue — Отчет о бенчмарке 2026
26
+
27
+ Эта страница представляет собой отчет о бенчмарке i18n-решений для Vue.
28
+
29
+ ## Содержание
30
+
31
+ <Toc/>
32
+
33
+ ## Интерактивный бенчмарк
34
+
35
+ <I18nBenchmark framework="vite-vue" vertical/>
36
+
37
+ ## Ссылка на результаты:
38
+
39
+ <iframe
40
+ src="https://intlayer.org/markdown?url=https%3A%2F%2Fraw.githubusercontent.com%2Fintlayer-org%2Fbenchmark-i18n%2Fmain%2Freport%2Fscripts%2Fsummarize-vite_vue.md"
41
+ width="100%"
42
+ height="600px"
43
+ style="border:none;">
44
+ </iframe>
45
+
46
+ > https://intlayer.org/markdown?url=https%3A%2F%2Fraw.githubusercontent.com%2Fintlayer-org%2Fbenchmark-i18n%2Fmain%2Freport%2Fscripts%2Fsummarize-vite_vue.md
47
+
48
+ Полный репозиторий бенчмарка можно найти [здесь](https://github.com/intlayer-org/benchmark-i18n/tree/main).
49
+
50
+ ## Введение
51
+
52
+ Решения для интернационализации являются одними из самых тяжелых зависимостей во Vue-приложении. Основной риск заключается в передаче ненужного контента: переводов для других страниц и других локалей в бандле одного маршрута.
53
+
54
+ По мере роста вашего приложения эта проблема может быстро привести к раздуванию JavaScript, отправляемого клиенту, и замедлению навигации.
55
+
56
+ На практике в наименее оптимизированных реализациях интернационализированная страница может оказаться в несколько раз тяжелее версии без i18n.
57
+
58
+ Другой аспект — это опыт разработчика: то, как вы объявляете контент, типы, организацию пространств имен, динамическую загрузку и реактивность при смене локали.
59
+
60
+ ## TL;DR
61
+
62
+ - **Intlayer**: Самое легкое решение (v8.7.12) со встроенным разделением (scoping) и динамической загрузкой.
63
+ - **vue-i18n**: Индустриальный стандарт с богатой экосистемой, но может быть значительно тяжелее и сложнее в оптимизации для разделения кода в больших приложениях.
64
+ - **fluent-vue**: Инновационная организация сообщений, но не хватает типобезопасности и является чрезвычайно тяжелым решением.
65
+
66
+ ## Проверьте свое приложение
67
+
68
+ Чтобы быстро выявить проблемы с утечкой i18n, я настроил бесплатный сканер, доступный [здесь](https://intlayer.org/i18n-seo-scanner).
69
+
70
+ <iframe src="https://intlayer.org/i18n-seo-scanner" width="100%" height="600px" style="border:none;"/>
71
+
72
+ ## Проблема
73
+
74
+ Два рычага необходимы для ограничения стоимости мультиязычного приложения:
75
+
76
+ - Разделение контента по страницам / пространствам имен, чтобы не загружать целые словари, когда они вам не нужны.
77
+ - Динамическая загрузка нужной локали только тогда, когда она требуется.
78
+
79
+ Понимание технических ограничений этих подходов:
80
+
81
+ **Динамическая загрузка**
82
+
83
+ Без динамической загрузки большинство решений хранят сообщения в памяти с первого рендеринга, что создает значительные накладные расходы для приложений с множеством маршрутов и локалей.
84
+
85
+ При использовании динамической загрузки вы идете на компромисс: меньше начального JS, но иногда дополнительный запрос при переключении языка.
86
+
87
+ **Разделение контента**
88
+
89
+ Синтаксис, построенный вокруг `const { t } = useI18n()` + `t('a.b.c')`, очень удобен, но часто способствует хранению больших JSON-объектов во время выполнения. Эта модель затрудняет tree-shaking, если библиотека не предлагает реальную стратегию разделения контента для каждой страницы.
90
+
91
+ ## Методология
92
+
93
+ Для этого бенчмарка мы сравнили следующие библиотеки:
94
+
95
+ - `Base App` (Без библиотеки i18n)
96
+ - `vue-intlayer` (v8.7.12)
97
+ - `vue-i18n` (v11.4.0)
98
+ - `fluent-vue` (v3.8.2)
99
+
100
+ Фреймворк — `Vue` с мультиязычным приложением из **10 страниц** и **10 языков**.
101
+
102
+ Мы сравнили **четыре стратегии загрузки**:
103
+
104
+ | Стратегия | Без пространств имен (глобальная) | С пространствами имен (локальная/scoped) |
105
+ | :------------------------ | :---------------------------------------------- | :------------------------------------------------------------------------------- |
106
+ | **Статическая загрузка** | **Static**: Все в памяти при запуске. | **Scoped static**: Разделено по пространствам имен; все загружается при запуске. |
107
+ | **Динамическая загрузка** | **Dynamic**: Загрузка по требованию для локали. | **Scoped dynamic**: Гранулярная загрузка по пространствам имен и локалям. |
108
+
109
+ ## Резюме стратегий
110
+
111
+ - **Статическая (Static)**: Простота; отсутствие задержек сети после начальной загрузки. Минус: большой размер бандла.
112
+ - **Динамическая (Dynamic)**: Уменьшает начальный вес (ленивая загрузка). Идеально при наличии множества локалей.
113
+ - **Локальная статическая (Scoped static)**: Позволяет организовать код (логическое разделение) без сложных дополнительных сетевых запросов.
114
+ - **Локальная динамическая (Scoped dynamic)**: Лучший подход для _разделения кода_ и производительности. Минимизирует использование памяти, загружая только то, что нужно для текущего представления и активной локали.
115
+
116
+ ### Что я вимірював:
117
+
118
+ Я запускал одно и то же мультиязычное приложение в реальном браузере для каждого стека, а затем фиксировал, что на самом деле передавалось по сети и сколько времени это занимало. Размеры указаны **после обычного веб-сжатия**, так как это ближе к тому, что люди реально скачивают.
119
+
120
+ - **Размер библиотеки интернационализации**: После сборки, tree-shaking и минификации, размер библиотеки i18n — это размер кода провайдеров + композиблов (composables) в пустом компоненте. Это не включает загрузку файлов перевода. Это показывает, насколько "дорогая" библиотека еще до появления вашего контента.
121
+
122
+ - **JavaScript на страницу**: Для каждого тестового маршрута — сколько скриптов загружает браузер во время посещения, усреднено по страницам теста (и по локалям). Тяжелые страницы — это медленные страницы.
123
+
124
+ - **Утечка из других локалей (Leakage)**: Это контент той же страницы, но на другом языке, который по ошибке загружается на проверяемую страницу. Этот контент является лишним и его следует избегать (например, контент страницы `/fr/about` в бандле страницы `/en/about`).
125
+
126
+ - **Утечка из других маршрутов**: Та же идея для **других экранов** в приложении: передаются ли их тексты, когда вы открыли только одну страницу (например, контент страницы `/en/about` в бандле страницы `/en/contact`). Высокий показатель свидетельствует о слабом разделении или слишком широких бандлах.
127
+
128
+ - **Средний размер бандла компонента**: Отдельные UI-элементы измеряются **по одному**, а не прячутся внутри одного гигантского общего показателя приложения. Это показывает, "раздувает" ли интернационализация обычные компоненты. Например, если ваш компонент перерендерится, он будет загружать все эти данные из памяти. Привязка гигантского JSON к любому компоненту похожа на подключение большого хранилища неиспользуемых данных, что замедляет производительность ваших компонентов.
129
+
130
+ - **Скорость реакции на переключение языка**: Я переключаю язык через собственный интерфейс приложения и замеряю время до момента, когда страница явно обновилась — то, что заметит посетитель.
131
+
132
+ - **Работа рендеринга после смены языка**: Более узкий показатель: сколько усилий затратил интерфейс на перерисовку для нового языка после начала переключения. Полезно, когда "ощутимое" время и стоимость работы фреймворка различаются.
133
+
134
+ - **Время начальной загрузки страницы**: От навигации до момента, когда браузер считает страницу полностью загруженной для тестируемых сценариев. Полезно для сравнения "холодных стартов".
135
+
136
+ - **Время гидратации (Hydration)**: Время, которое клиент тратит на превращение HTML от сервера в интерактивный интерфейс. Прочерк в таблицах означает, что данная реализация не предоставила надежных данных о гидратации в этом тесте.
137
+
138
+ ## Результаты в деталях
139
+
140
+ ### 1 — Решения, которых следует избегать
141
+
142
+ > В экосистеме Vue нет однозначных решений, которых следует избегать.
143
+
144
+ ### 2 — Приемлемые решения
145
+
146
+ **(vue-i18n)** (`vue-i18n@11.4.0`):
147
+
148
+ - **vue-i18n**, без сомнения, является самой используемой i18n-библиотекой для Vue, у нее много функций и огромная экосистема. Однако внутри это решение довольно тяжелое. Даже если vue-i18n интегрирует ленивую загрузку сообщений, в нем отсутствует функция разделения (scoping). В случае классического Vue SPA приложения это не проблема, но для приложения Nuxt, использующего @nuxt/i18n, это приводит к включению сообщений со всех страниц в одну. Для большого приложения Nuxt, включающего более 10 страниц, это может стать действительно проблематичным.
149
+
150
+ Пакет очень тяжелый (~24.3 КБ, что примерно в 9 раз больше `vue-intlayer`).
151
+
152
+ **(fluent-vue)** (`fluent-vue@0.5.0`):
153
+
154
+ - **fluent-vue** предлагает попытку инновации через формат .ftl. Организация сообщений отличная, с ней легче начать работу. Но на практике отсутствие типобезопасности повышает риск ошибок и может быстро стать трудозатратным при отладке. Более того, это решение загружает сообщения с помощью плагина vite, который принудительно загружает весь контент на всех языках в каждую страницу. Кроме того, это чрезвычайно тяжелое решение (~92.7 КБ, что примерно в 34 раза больше `vue-intlayer`).
155
+
156
+ ### 3 — Рекомендации
157
+
158
+ **(Intlayer)** (`vue-intlayer@8.7.12`):
159
+
160
+ Я не буду лично оценивать `vue-intlayer` ради объективности, так как это мое собственное решение.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  createdAt: 2024-08-13
3
- updatedAt: 2026-04-08
3
+ updatedAt: 2026-05-12
4
4
  title: Конфигурация (Configuration)
5
5
  description: Узнайте, как настроить Intlayer для вашего приложения. Разберитесь в различных параметрах и опциях, доступных для настройки Intlayer в соответствии с вашими потребностями.
6
6
  keywords:
@@ -14,6 +14,9 @@ slugs:
14
14
  - concept
15
15
  - configuration
16
16
  history:
17
+ - version: 8.9.4
18
+ date: 2026-05-12
19
+ changes: "Добавлена поддержка провайдера LM Studio"
17
20
  - version: 8.7.0
18
21
  date: 2026-04-08
19
22
  changes: "Добавлены опции `prune` и `minify` в конфигурацию сборки"
@@ -350,7 +353,7 @@ const config: IntlayerConfig = {
350
353
  ai: {
351
354
  /**
352
355
  * Используемый ИИ-провайдер.
353
- * Опции: 'openai', 'anthropic', 'mistral', 'deepseek', 'gemini', 'ollama', 'openrouter', 'alibaba', 'fireworks', 'groq', 'huggingface', 'bedrock', 'googlevertex', 'togetherai'
356
+ * Опции: 'openai', 'anthropic', 'mistral', 'deepseek', 'gemini', 'ollama', 'openrouter', 'alibaba', 'fireworks', 'groq', 'huggingface', 'bedrock', 'googlevertex', 'togetherai', 'lmstudio'
354
357
  * По умолчанию: 'openai'
355
358
  */
356
359
  provider: "openai",
@@ -916,16 +919,17 @@ Intlayer поддерживает несколько ИИ-провайдеров
916
919
  - **Groq**
917
920
  - **Amazon Bedrock**
918
921
  - **Together.ai**
919
-
920
- | Поле | Описание | Тип | По умолчанию | Пример | Примечание |
921
- | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | ------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
922
- | `provider` | Провайдер, используемый для ИИ-функций Intlayer. | `'openai'` &#124; <br/> `'anthropic'` &#124; <br/> `'mistral'` &#124; <br/> `'deepseek'` &#124; <br/> `'gemini'` &#124; <br/> `'ollama'` &#124; <br/> `'openrouter'` &#124; <br/> `'alibaba'` &#124; <br/> `'fireworks'` &#124; <br/> `'groq'` &#124; <br/> `'huggingface'` &#124; <br/> `'bedrock'` &#124; <br/> `'googleaistudio'` &#124; <br/> `'googlevertex'` &#124; <br/> `'togetherai'` | `undefined` | `'anthropic'` | Разные провайдеры требуют разные API-ключи и имеют разную стоимость. |
923
- | `model` | Модель, используемая для ИИ-функций. | `string` | Нет | `'gpt-4o-2024-11-20'` | Конкретная модель зависит от провайдера. |
924
- | `temperature` | Управляет случайностью ответов ИИ. | `number` | Нет | `0.1` | Выше температура = более креативно и менее предсказуемо. |
925
- | `apiKey` | Ваш API-ключ для выбранного провайдера. | `string` | Нет | `process.env.OPENAI_API_KEY` | Должно храниться в секрете; используйте переменные окружения. |
926
- | `applicationContext` | Дополнительный контекст о вашем приложении, чтобы помочь ИИ генерировать более точные переводы (домен, целевая аудитория, тон, терминология). | `string` | Нет | `'My own application context'` | Можно использовать для добавления правил (например: `"You should not transform URLs"`). |
927
- | `baseURL` | Базовый URL для ИИ API. | `string` | Нет | `'https://api.openai.com/v1'` <br/> `'http://localhost:5000'` | Может указывать на локальный или кастомный эндпоинт ИИ API. |
928
- | `dataSerialization` | Формат сериализации данных для ИИ-функций. | `'json'` &#124; <br/> `'toon'` | `undefined` | `'toon'` | `'json'`: по умолчанию, надежно; потребляет больше токенов.<br/>• `'toon'`: меньше токенов, менее стабильно.<br/>• Дополнительные параметры передаются в модель как контекст (усилия рассуждения и т.д.). |
922
+ - **LM Studio**
923
+
924
+ | Поле | Описание | Тип | По умолчанию | Пример | Примечание |
925
+ | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------ | ------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
926
+ | `provider` | Провайдер, используемый для ИИ-функций Intlayer. | `'openai'` &#124; <br/> `'anthropic'` &#124; <br/> `'mistral'` &#124; <br/> `'deepseek'` &#124; <br/> `'gemini'` &#124; <br/> `'ollama'` &#124; <br/> `'openrouter'` &#124; <br/> `'alibaba'` &#124; <br/> `'fireworks'` &#124; <br/> `'groq'` &#124; <br/> `'huggingface'` &#124; <br/> `'bedrock'` &#124; <br/> `'googleaistudio'` &#124; <br/> `'googlevertex'` &#124; <br/> `'togetherai'` &#124; <br/> `'lmstudio'` | `undefined` | `'anthropic'` | Разные провайдеры требуют разные API-ключи и имеют разную стоимость. |
927
+ | `model` | Модель, используемая для ИИ-функций. | `string` | Нет | `'gpt-4o-2024-11-20'` | Конкретная модель зависит от провайдера. |
928
+ | `temperature` | Управляет случайностью ответов ИИ. | `number` | Нет | `0.1` | Выше температура = более креативно и менее предсказуемо. |
929
+ | `apiKey` | Ваш API-ключ для выбранного провайдера. | `string` | Нет | `process.env.OPENAI_API_KEY` | Должно храниться в секрете; используйте переменные окружения. |
930
+ | `applicationContext` | Дополнительный контекст о вашем приложении, чтобы помочь ИИ генерировать более точные переводы (домен, целевая аудитория, тон, терминология). | `string` | Нет | `'My own application context'` | Можно использовать для добавления правил (например: `"You should not transform URLs"`). |
931
+ | `baseURL` | Базовый URL для ИИ API. | `string` | Нет | `'https://api.openai.com/v1'` <br/> `'http://localhost:5000'` | Может указывать на локальный или кастомный эндпоинт ИИ API. |
932
+ | `dataSerialization` | Формат сериализации данных для ИИ-функций. | `'json'` &#124; <br/> `'toon'` | `undefined` | `'toon'` | • `'json'`: по умолчанию, надежно; потребляет больше токенов.<br/>• `'toon'`: меньше токенов, менее стабильно.<br/>• Дополнительные параметры передаются в модель как контекст (усилия рассуждения и т.д.). |
929
933
 
930
934
  ---
931
935
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  createdAt: 2025-02-07
3
- updatedAt: 2026-01-28
3
+ updatedAt: 2026-05-12
4
4
  title: Файл контента
5
5
  description: Узнайте, как настраивать расширения для ваших файлов декларации контента. Следуйте этой документации, чтобы эффективно реализовывать условия в вашем проекте.
6
6
  keywords:
@@ -12,6 +12,9 @@ slugs:
12
12
  - concept
13
13
  - content
14
14
  history:
15
+ - version: 8.9.0
16
+ date: 2026-05-12
17
+ changes: "Добавить тип узла содержимого `plural`"
15
18
  - version: 8.0.0
16
19
  date: 2026-01-28
17
20
  changes: "Добавлен тип узла содержимого `html`"
@@ -66,6 +69,7 @@ import { type ReactNode } from "react";
66
69
  import {
67
70
  t,
68
71
  enu,
72
+ plural,
69
73
  cond,
70
74
  nest,
71
75
  md,
@@ -84,7 +88,8 @@ interface Content {
84
88
  };
85
89
  };
86
90
  multilingualContent: string; // мультиязычный контент
87
- quantityContent: string; // контент с количеством
91
+ quantityContent: string;
92
+ pluralContent: string; // контент с количеством
88
93
  conditionalContent: string; // условный контент
89
94
  markdownContent: never; // markdown контент (никогда не используется)
90
95
  htmlContent: never; // HTML контент
@@ -121,6 +126,10 @@ export default {
121
126
  ">5": "Несколько машин",
122
127
  ">19": "Много машин",
123
128
  }),
129
+ pluralContent: plural({
130
+ one: "One car",
131
+ other: "{{count}} cars",
132
+ }),
124
133
  conditionalContent: cond({
125
134
  true: "Валидация включена",
126
135
  false: "Валидация отключена",
@@ -175,6 +184,13 @@ export default {
175
184
  ">5": "Некоторые машины",
176
185
  ">19": "Много машин",
177
186
  },
187
+ "pluralContent": {
188
+ "nodeType": "plural",
189
+ "plural": {
190
+ "one": "One car",
191
+ "other": "{{count}} cars",
192
+ },
193
+ },
178
194
  },
179
195
  "conditionalContent": {
180
196
  "nodeType": "condition",
@@ -222,6 +238,7 @@ export default {
222
238
  - **Примитивные значения**: строки, числа, булевы значения, null, undefined
223
239
  - **Типизированные узлы**: специальные типы содержимого, такие как переводы, условия, markdown и т.д.
224
240
  - **Функции**: динамическое содержимое, которое может быть вычислено во время выполнения [см. Получение функций](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/function_fetching.md)
241
+ - **Множественное число**: См. Множественное число [См. Множественное число](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/plural.md)
225
242
  - **Вложенное содержимое**: ссылки на другие словари
226
243
 
227
244
  #### Типы содержимого
@@ -567,6 +584,8 @@ multilingualContent: t({
567
584
  });
568
585
  ```
569
586
 
587
+ > См. [Переводимый контент (`t`) Документация](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/translation.md) для получения дополнительной информации.
588
+
570
589
  ### Условный контент (`cond`)
571
590
 
572
591
  Контент, который меняется в зависимости от булевых условий:
@@ -580,6 +599,8 @@ conditionalContent: cond({
580
599
  });
581
600
  ```
582
601
 
602
+ > См. [Условный контент (`cond`) Документация](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/condition.md) для получения дополнительной информации.
603
+
583
604
  ### Перечисляемый контент (`enu`)
584
605
 
585
606
  Контент, который меняется в зависимости от перечисленных значений:
@@ -594,6 +615,23 @@ statusContent: enu({
594
615
  });
595
616
  ```
596
617
 
618
+ > См. [Перечисляемый контент (`enu`) Документация](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/enumeration.md) для получения дополнительной информации.
619
+
620
+ ### Множественное число (`plural`)
621
+
622
+ Контент, который варьируется в зависимости от правил множественного числа:
623
+
624
+ ```typescript
625
+ import { plural } from "intlayer";
626
+
627
+ pluralContent: plural({
628
+ one: "One car",
629
+ other: "{{count}} cars",
630
+ });
631
+ ```
632
+
633
+ > См. [Множественное число документацию](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/plural.md) для получения дополнительной информации.
634
+
597
635
  ### Вставляемый контент (`insert`)
598
636
 
599
637
  Контент, который можно вставлять в другой контент:
@@ -604,6 +642,8 @@ import { insert } from "intlayer";
604
642
  insertionContent: insert("Этот текст можно вставить куда угодно");
605
643
  ```
606
644
 
645
+ > См. [Вставляемый контент (`insert`) Документация](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/insertion.md) для получения дополнительной информации.
646
+
607
647
  ### Вложенный контент (`nest`)
608
648
 
609
649
  Ссылки на другие словари:
@@ -614,6 +654,8 @@ import { nest } from "intlayer";
614
654
  nestedContent: nest("about-page");
615
655
  ```
616
656
 
657
+ > См. [Вложенный контент (`nest`) Документация](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/nesting.md) для получения дополнительной информации.
658
+
617
659
  ### Контент в формате Markdown (`md`)
618
660
 
619
661
  Форматированный текст в формате Markdown:
@@ -626,6 +668,8 @@ markdownContent: md(
626
668
  );
627
669
  ```
628
670
 
671
+ > См. [Контент в формате Markdown (`md`) Документация](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/markdown.md) для получения дополнительной информации.
672
+
629
673
  ### HTML-контент (`html`)
630
674
 
631
675
  Богатый HTML-контент, который может использовать стандартные теги или пользовательские компоненты:
@@ -643,6 +687,8 @@ localizedHtmlContent: t({
643
687
  });
644
688
  ```
645
689
 
690
+ > См. [HTML-контент (`html`) Документация](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/html.md) для получения дополнительной информации.
691
+
646
692
  ### Контент по половому признаку (`gender`)
647
693
 
648
694
  Контент, который меняется в зависимости от пола:
@@ -657,6 +703,8 @@ genderContent: gender({
657
703
  });
658
704
  ```
659
705
 
706
+ > См. [Контент по половому признаку (`gender`) Документация](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/gender.md) для получения дополнительной информации.
707
+
660
708
  ### Контент из файла (`file`)
661
709
 
662
710
  Ссылки на внешние файлы:
@@ -667,6 +715,8 @@ import { file } from "intlayer";
667
715
  fileContent: file("./path/to/content.txt");
668
716
  ```
669
717
 
718
+ > См. [Контент из файла (`file`) Документация](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/file.md) для получения дополнительной информации.
719
+
670
720
  ## Создание файлов контента
671
721
 
672
722
  ### Основная структура файла контента