@intlayer/docs 9.3.0 → 9.3.2

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 (217) hide show
  1. package/README.md +24 -24
  2. package/blog/ar/rag_powered_documentation_assistant.md +1 -1
  3. package/blog/pl/rag_powered_documentation_assistant.md +1 -1
  4. package/dist/cjs/_virtual/_rolldown/runtime.cjs +1 -2
  5. package/dist/cjs/authors2.cjs +0 -1
  6. package/dist/cjs/common.cjs.map +1 -1
  7. package/dist/cjs/generated/blog.entry.cjs +4 -2
  8. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  9. package/dist/cjs/generated/docs.entry.cjs +24 -2
  10. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  11. package/dist/cjs/generated/frequentQuestions.entry.cjs +4 -2
  12. package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
  13. package/dist/cjs/generated/legal.entry.cjs +4 -2
  14. package/dist/cjs/generated/legal.entry.cjs.map +1 -1
  15. package/dist/esm/generated/blog.entry.mjs +4 -2
  16. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  17. package/dist/esm/generated/docs.entry.mjs +24 -2
  18. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  19. package/dist/esm/generated/frequentQuestions.entry.mjs +4 -2
  20. package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
  21. package/dist/esm/generated/legal.entry.mjs +4 -2
  22. package/dist/esm/generated/legal.entry.mjs.map +1 -1
  23. package/dist/types/generated/docs.entry.d.ts +1 -0
  24. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  25. package/docs/ar/configuration.md +10 -10
  26. package/docs/ar/eslint.md +336 -0
  27. package/docs/ar/interest_of_intlayer.md +24 -22
  28. package/docs/ar/intlayer_with_express.md +1 -1
  29. package/docs/ar/intlayer_with_react_router_v7_fs_routes.md +1 -1
  30. package/docs/ar/intlayer_with_svelte_kit.md +1 -1
  31. package/docs/ar/intlayer_with_tanstack+solid.md +5 -3
  32. package/docs/ar/intlayer_with_tanstack.md +5 -3
  33. package/docs/ar/lsp.md +114 -175
  34. package/docs/ar/readme.md +25 -25
  35. package/docs/bn/configuration.md +10 -10
  36. package/docs/bn/eslint.md +336 -0
  37. package/docs/bn/interest_of_intlayer.md +24 -22
  38. package/docs/cs/configuration.md +10 -10
  39. package/docs/cs/eslint.md +336 -0
  40. package/docs/cs/interest_of_intlayer.md +24 -22
  41. package/docs/de/configuration.md +10 -10
  42. package/docs/de/eslint.md +336 -0
  43. package/docs/de/interest_of_intlayer.md +24 -22
  44. package/docs/de/intlayer_with_svelte_kit.md +1 -1
  45. package/docs/de/intlayer_with_tanstack+solid.md +5 -3
  46. package/docs/de/intlayer_with_tanstack.md +5 -3
  47. package/docs/de/lsp.md +111 -172
  48. package/docs/de/readme.md +24 -24
  49. package/docs/en/configuration.md +10 -10
  50. package/docs/en/eslint.md +336 -0
  51. package/docs/en/interest_of_intlayer.md +24 -22
  52. package/docs/en/intlayer_with_svelte_kit.md +1 -1
  53. package/docs/en/intlayer_with_tanstack+solid.md +5 -3
  54. package/docs/en/intlayer_with_tanstack.md +5 -3
  55. package/docs/en/lsp.md +109 -170
  56. package/docs/en/readme.md +24 -24
  57. package/docs/en-GB/configuration.md +10 -10
  58. package/docs/en-GB/eslint.md +336 -0
  59. package/docs/en-GB/interest_of_intlayer.md +24 -22
  60. package/docs/en-GB/intlayer_with_create_react_app.md +32 -35
  61. package/docs/en-GB/intlayer_with_react_router_v7_fs_routes.md +1 -1
  62. package/docs/en-GB/intlayer_with_svelte_kit.md +1 -1
  63. package/docs/en-GB/intlayer_with_tanstack+solid.md +5 -3
  64. package/docs/en-GB/intlayer_with_tanstack.md +5 -3
  65. package/docs/en-GB/lsp.md +109 -170
  66. package/docs/en-GB/readme.md +24 -24
  67. package/docs/es/configuration.md +10 -10
  68. package/docs/es/eslint.md +336 -0
  69. package/docs/es/interest_of_intlayer.md +24 -22
  70. package/docs/es/intlayer_with_svelte_kit.md +1 -1
  71. package/docs/es/intlayer_with_tanstack+solid.md +5 -3
  72. package/docs/es/intlayer_with_tanstack.md +5 -3
  73. package/docs/es/lsp.md +114 -175
  74. package/docs/es/readme.md +24 -24
  75. package/docs/fr/configuration.md +10 -10
  76. package/docs/fr/eslint.md +336 -0
  77. package/docs/fr/interest_of_intlayer.md +24 -22
  78. package/docs/fr/intlayer_with_svelte_kit.md +1 -1
  79. package/docs/fr/intlayer_with_tanstack+solid.md +5 -3
  80. package/docs/fr/intlayer_with_tanstack.md +5 -3
  81. package/docs/fr/lsp.md +110 -171
  82. package/docs/fr/readme.md +24 -24
  83. package/docs/hi/configuration.md +10 -10
  84. package/docs/hi/eslint.md +336 -0
  85. package/docs/hi/interest_of_intlayer.md +24 -22
  86. package/docs/hi/intlayer_with_express.md +1 -1
  87. package/docs/hi/intlayer_with_react_router_v7_fs_routes.md +1 -1
  88. package/docs/hi/intlayer_with_svelte_kit.md +1 -1
  89. package/docs/hi/intlayer_with_tanstack+solid.md +5 -3
  90. package/docs/hi/intlayer_with_tanstack.md +5 -3
  91. package/docs/hi/intlayer_with_vite+svelte.md +2 -2
  92. package/docs/hi/lsp.md +113 -174
  93. package/docs/hi/readme.md +24 -24
  94. package/docs/id/configuration.md +10 -10
  95. package/docs/id/eslint.md +336 -0
  96. package/docs/id/interest_of_intlayer.md +24 -22
  97. package/docs/id/intlayer_with_svelte_kit.md +1 -1
  98. package/docs/id/intlayer_with_tanstack+solid.md +5 -3
  99. package/docs/id/intlayer_with_tanstack.md +5 -3
  100. package/docs/id/lsp.md +113 -174
  101. package/docs/id/readme.md +24 -24
  102. package/docs/it/configuration.md +10 -10
  103. package/docs/it/eslint.md +336 -0
  104. package/docs/it/interest_of_intlayer.md +24 -22
  105. package/docs/it/intlayer_with_svelte_kit.md +1 -1
  106. package/docs/it/intlayer_with_tanstack+solid.md +5 -3
  107. package/docs/it/intlayer_with_tanstack.md +5 -3
  108. package/docs/it/lsp.md +115 -176
  109. package/docs/it/readme.md +24 -24
  110. package/docs/ja/configuration.md +10 -10
  111. package/docs/ja/eslint.md +336 -0
  112. package/docs/ja/interest_of_intlayer.md +24 -22
  113. package/docs/ja/intlayer_with_react_router_v7.md +1 -146
  114. package/docs/ja/intlayer_with_tanstack+solid.md +5 -3
  115. package/docs/ja/intlayer_with_tanstack.md +5 -3
  116. package/docs/ja/intlayer_with_vite+react.md +5 -1
  117. package/docs/ja/lsp.md +113 -174
  118. package/docs/ja/readme.md +24 -24
  119. package/docs/ko/configuration.md +10 -10
  120. package/docs/ko/eslint.md +336 -0
  121. package/docs/ko/interest_of_intlayer.md +24 -22
  122. package/docs/ko/intlayer_with_lynx+react.md +4 -0
  123. package/docs/ko/intlayer_with_react_router_v7_fs_routes.md +1 -1
  124. package/docs/ko/intlayer_with_storybook.md +5 -5
  125. package/docs/ko/intlayer_with_svelte_kit.md +1 -1
  126. package/docs/ko/intlayer_with_tanstack+solid.md +5 -3
  127. package/docs/ko/intlayer_with_tanstack.md +5 -3
  128. package/docs/ko/lsp.md +112 -173
  129. package/docs/ko/readme.md +24 -24
  130. package/docs/nl/configuration.md +10 -10
  131. package/docs/nl/eslint.md +336 -0
  132. package/docs/nl/interest_of_intlayer.md +24 -22
  133. package/docs/pl/configuration.md +10 -10
  134. package/docs/pl/eslint.md +336 -0
  135. package/docs/pl/interest_of_intlayer.md +4 -2
  136. package/docs/pl/intlayer_with_astro.md +1 -114
  137. package/docs/pl/intlayer_with_svelte_kit.md +1 -1
  138. package/docs/pl/intlayer_with_tanstack+solid.md +5 -3
  139. package/docs/pl/intlayer_with_tanstack.md +5 -3
  140. package/docs/pl/lsp.md +115 -176
  141. package/docs/pl/migration_from_i18next_to_intlayer.md +4 -0
  142. package/docs/pl/migration_from_next-i18next_to_intlayer.md +8 -4
  143. package/docs/pl/migration_from_next-intl_to_intlayer.md +11 -5
  144. package/docs/pl/migration_from_nuxtjs_i18n_to_intlayer.md +8 -4
  145. package/docs/pl/migration_from_react-i18next_to_intlayer.md +8 -4
  146. package/docs/pl/migration_from_vue-i18n_to_intlayer.md +4 -0
  147. package/docs/pl/readme.md +24 -24
  148. package/docs/pt/configuration.md +10 -10
  149. package/docs/pt/eslint.md +336 -0
  150. package/docs/pt/interest_of_intlayer.md +24 -22
  151. package/docs/pt/intlayer_with_astro.md +1 -114
  152. package/docs/pt/intlayer_with_svelte_kit.md +1 -1
  153. package/docs/pt/intlayer_with_tanstack+solid.md +5 -3
  154. package/docs/pt/intlayer_with_tanstack.md +5 -3
  155. package/docs/pt/lsp.md +113 -174
  156. package/docs/pt/readme.md +24 -24
  157. package/docs/ru/configuration.md +10 -10
  158. package/docs/ru/eslint.md +336 -0
  159. package/docs/ru/interest_of_intlayer.md +24 -22
  160. package/docs/ru/intlayer_with_nextjs_14.md +1 -1
  161. package/docs/ru/intlayer_with_nextjs_15.md +1 -1
  162. package/docs/ru/intlayer_with_svelte_kit.md +1 -1
  163. package/docs/ru/intlayer_with_tanstack+solid.md +5 -3
  164. package/docs/ru/intlayer_with_tanstack.md +5 -3
  165. package/docs/ru/lsp.md +112 -173
  166. package/docs/ru/readme.md +24 -24
  167. package/docs/tr/configuration.md +10 -10
  168. package/docs/tr/eslint.md +336 -0
  169. package/docs/tr/interest_of_intlayer.md +24 -22
  170. package/docs/tr/intlayer_with_svelte_kit.md +1 -1
  171. package/docs/tr/intlayer_with_tanstack+solid.md +5 -3
  172. package/docs/tr/intlayer_with_tanstack.md +5 -3
  173. package/docs/tr/lsp.md +113 -174
  174. package/docs/tr/readme.md +24 -24
  175. package/docs/uk/configuration.md +10 -10
  176. package/docs/uk/eslint.md +336 -0
  177. package/docs/uk/interest_of_intlayer.md +4 -2
  178. package/docs/uk/intlayer_with_svelte_kit.md +1 -1
  179. package/docs/uk/intlayer_with_tanstack+solid.md +5 -3
  180. package/docs/uk/intlayer_with_tanstack.md +5 -3
  181. package/docs/uk/lsp.md +113 -174
  182. package/docs/uk/packages/angular-intlayer/exports.md +2 -2
  183. package/docs/uk/per_locale_file.md +1 -1
  184. package/docs/uk/readme.md +24 -24
  185. package/docs/ur/configuration.md +10 -10
  186. package/docs/ur/eslint.md +336 -0
  187. package/docs/ur/interest_of_intlayer.md +24 -22
  188. package/docs/vi/configuration.md +10 -10
  189. package/docs/vi/eslint.md +336 -0
  190. package/docs/vi/interest_of_intlayer.md +24 -22
  191. package/docs/vi/intlayer_with_svelte_kit.md +1 -1
  192. package/docs/vi/intlayer_with_tanstack+solid.md +5 -3
  193. package/docs/vi/intlayer_with_tanstack.md +5 -3
  194. package/docs/vi/lsp.md +115 -176
  195. package/docs/vi/readme.md +24 -24
  196. package/docs/zh/configuration.md +10 -10
  197. package/docs/zh/eslint.md +336 -0
  198. package/docs/zh/interest_of_intlayer.md +24 -22
  199. package/docs/zh/intlayer_with_create_react_app.md +4 -0
  200. package/docs/zh/intlayer_with_lynx+react.md +4 -0
  201. package/docs/zh/intlayer_with_nextjs_14.md +0 -2
  202. package/docs/zh/intlayer_with_nextjs_15.md +0 -2
  203. package/docs/zh/intlayer_with_nextjs_page_router.md +0 -2
  204. package/docs/zh/intlayer_with_nuxt.md +1 -1
  205. package/docs/zh/intlayer_with_react_router_v7.md +4 -0
  206. package/docs/zh/intlayer_with_react_router_v7_fs_routes.md +4 -0
  207. package/docs/zh/intlayer_with_solid_start.md +1 -1
  208. package/docs/zh/intlayer_with_svelte_kit.md +1 -1
  209. package/docs/zh/intlayer_with_tanstack+solid.md +5 -3
  210. package/docs/zh/intlayer_with_tanstack.md +5 -3
  211. package/docs/zh/intlayer_with_vite+vue.md +0 -2
  212. package/docs/zh/lsp.md +113 -174
  213. package/docs/zh/readme.md +21 -21
  214. package/docs/zh-TW/eslint.md +336 -0
  215. package/docs/zh-TW/interest_of_intlayer.md +24 -22
  216. package/package.json +6 -6
  217. package/src/generated/docs.entry.ts +20 -0
@@ -404,7 +404,7 @@ const config: IntlayerConfig = {
404
404
  ai: {
405
405
  /**
406
406
  * Используемый ИИ-провайдер.
407
- * Опции: 'openai', 'anthropic', 'mistral', 'deepseek', 'gemini', 'ollama', 'openrouter', 'alibaba', 'fireworks', 'groq', 'huggingface', 'bedrock', 'googlevertex', 'togetherai', 'lmstudio'
407
+ * Опции: 'openai', 'anthropic', 'mistral', 'deepseek', 'gemini', 'ollama', 'openrouter', 'alibaba', 'fireworks', 'groq', 'huggingface', 'bedrock', 'googlevertex', 'togetherai', 'lmstudio', 'moonshotai'
408
408
  * По умолчанию: 'openai'
409
409
  */
410
410
  provider: "openai",
@@ -1032,15 +1032,15 @@ Intlayer поддерживает несколько ИИ-провайдеров
1032
1032
  - **Together.ai**
1033
1033
  - **LM Studio**
1034
1034
 
1035
- | Поле | Описание | Тип | По умолчанию | Пример | Примечание |
1036
- | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------ | ------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1037
- | `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-ключи и имеют разную стоимость. |
1038
- | `model` | Модель, используемая для ИИ-функций. | `string` | Нет | `'gpt-4o-2024-11-20'` | Конкретная модель зависит от провайдера. |
1039
- | `temperature` | Управляет случайностью ответов ИИ. | `number` | Нет | `0.1` | Выше температура = более креативно и менее предсказуемо. |
1040
- | `apiKey` | Ваш API-ключ для выбранного провайдера. | `string` | Нет | `process.env.OPENAI_API_KEY` | Должно храниться в секрете; используйте переменные окружения. |
1041
- | `applicationContext` | Дополнительный контекст о вашем приложении, чтобы помочь ИИ генерировать более точные переводы (домен, целевая аудитория, тон, терминология). | `string` | Нет | `'My own application context'` | Можно использовать для добавления правил (например: `"You should not transform URLs"`). |
1042
- | `baseURL` | Базовый URL для ИИ API. | `string` | Нет | `'https://api.openai.com/v1'` <br/> `'http://localhost:5000'` | Может указывать на локальный или кастомный эндпоинт ИИ API. |
1043
- | `dataSerialization` | Формат сериализации данных для ИИ-функций. | `'json'` &#124; <br/> `'toon'` | `undefined` | `'toon'` | • `'json'`: по умолчанию, надежно; потребляет больше токенов.<br/>• `'toon'`: меньше токенов, менее стабильно.<br/>• Дополнительные параметры передаются в модель как контекст (усилия рассуждения и т.д.). |
1035
+ | Поле | Описание | Тип | По умолчанию | Пример | Примечание |
1036
+ | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | ------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1037
+ | `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'` &#124; <br/> `'moonshotai'` | `undefined` | `'anthropic'` | Разные провайдеры требуют разные API-ключи и имеют разную стоимость. |
1038
+ | `model` | Модель, используемая для ИИ-функций. | `string` | Нет | `'gpt-4o-2024-11-20'` | Конкретная модель зависит от провайдера. |
1039
+ | `temperature` | Управляет случайностью ответов ИИ. | `number` | Нет | `0.1` | Выше температура = более креативно и менее предсказуемо. |
1040
+ | `apiKey` | Ваш API-ключ для выбранного провайдера. | `string` | Нет | `process.env.OPENAI_API_KEY` | Должно храниться в секрете; используйте переменные окружения. |
1041
+ | `applicationContext` | Дополнительный контекст о вашем приложении, чтобы помочь ИИ генерировать более точные переводы (домен, целевая аудитория, тон, терминология). | `string` | Нет | `'My own application context'` | Можно использовать для добавления правил (например: `"You should not transform URLs"`). |
1042
+ | `baseURL` | Базовый URL для ИИ API. | `string` | Нет | `'https://api.openai.com/v1'` <br/> `'http://localhost:5000'` | Может указывать на локальный или кастомный эндпоинт ИИ API. |
1043
+ | `dataSerialization` | Формат сериализации данных для ИИ-функций. | `'json'` &#124; <br/> `'toon'` | `undefined` | `'toon'` | • `'json'`: по умолчанию, надежно; потребляет больше токенов.<br/>• `'toon'`: меньше токенов, менее стабильно.<br/>• Дополнительные параметры передаются в модель как контекст (усилия рассуждения и т.д.). |
1044
1044
 
1045
1045
  ---
1046
1046
 
@@ -0,0 +1,336 @@
1
+ ---
2
+ createdAt: 2026-08-12
3
+ updatedAt: 2026-08-12
4
+ title: Плагин ESLint | Правила линтинга для Intlayer
5
+ description: Находите жестко закодированные строки, динамические вызовы, которые компилятор Intlayer не может оптимизировать, и неиспользуемый контент словарей с помощью eslint-plugin-intlayer. Работает с ESLint и oxlint для React, Vue, Svelte, Angular и Astro.
6
+ keywords:
7
+ - Intlayer
8
+ - ESLint
9
+ - oxlint
10
+ - Линтинг
11
+ - i18n
12
+ - Интернационализация
13
+ - no-raw-text
14
+ - Жестко закодированные строки
15
+ - Неиспользуемые переводы
16
+ - Мертвый контент
17
+ - React
18
+ - Vue
19
+ - Svelte
20
+ - Angular
21
+ slugs:
22
+ - doc
23
+ - eslint
24
+ history:
25
+ - version: 9.3.1
26
+ date: 2026-08-12
27
+ changes: "Начальная история"
28
+ author: aymericzip
29
+ ---
30
+
31
+ # Плагин ESLint x OXLint
32
+
33
+ `eslint-plugin-intlayer` отслеживает типичные ошибки i18n, которые TypeScript не способен обнаружить:
34
+
35
+ 1. **Жестко закодированный текст**, который так и не был вынесен в словарь.
36
+ 2. **Динамические вызовы**, которые проходят проверку типов и выполняются, но не могут быть оптимизированы компилятором Intlayer.
37
+ 3. **Мертвый контент** — словари и поля, которые нигде в проекте не считываются (по желанию).
38
+
39
+ Неизвестные ключи словарей, неизвестные пути к полям и отсутствующие локали уже приводят к ошибкам компиляции, поэтому плагин не дублирует их проверку.
40
+
41
+ ## Установка
42
+
43
+ ```bash packageManager="npm"
44
+ npm install --save-dev eslint-plugin-intlayer
45
+ ```
46
+
47
+ ```bash packageManager="pnpm"
48
+ pnpm add --save-dev eslint-plugin-intlayer
49
+ ```
50
+
51
+ ```bash packageManager="yarn"
52
+ yarn add --dev eslint-plugin-intlayer
53
+ ```
54
+
55
+ Требуется ESLint 9 или новее (flat config).
56
+
57
+ ## Использование
58
+
59
+ Плагин работает как в ESLint, так и в [oxlint](https://oxc.rs) — одни и те же правила, одни и те же параметры.
60
+
61
+ <Tabs defaultTab="eslint">
62
+ <Tab label="ESLint" value="eslint">
63
+
64
+ ```javascript fileName="eslint.config.mjs" codeFormat="esm"
65
+ import intlayer from "eslint-plugin-intlayer";
66
+
67
+ export default [...intlayer.configs.recommended];
68
+ ```
69
+
70
+ Либо включайте правила по отдельности:
71
+
72
+ ```javascript fileName="eslint.config.mjs" codeFormat="esm"
73
+ import intlayer from "eslint-plugin-intlayer";
74
+
75
+ export default [
76
+ {
77
+ plugins: { intlayer },
78
+ rules: {
79
+ "intlayer/no-raw-text": "warn",
80
+ "intlayer/static-dictionary-key": "error",
81
+ "intlayer/no-dynamic-field-access": "error",
82
+ "intlayer/enforce-adapter-import": "warn",
83
+ "intlayer/no-unused-content": "warn",
84
+ },
85
+ },
86
+ ];
87
+ ```
88
+
89
+ </Tab>
90
+ <Tab label="oxlint" value="oxlint">
91
+
92
+ ```json fileName=".oxlintrc.json"
93
+ {
94
+ "jsPlugins": ["eslint-plugin-intlayer"],
95
+ "rules": {
96
+ "intlayer/no-raw-text": "warn",
97
+ "intlayer/static-dictionary-key": "error",
98
+ "intlayer/no-dynamic-field-access": "error",
99
+ "intlayer/enforce-adapter-import": "warn"
100
+ }
101
+ }
102
+ ```
103
+
104
+ Два нюанса: поддержка JS-плагинов в oxlint все еще находится в альфа-стадии, а oxlint не поддерживает пользовательские парсеры — поэтому файлы `.vue`, `.svelte`, `.astro` и шаблоны Angular там не линтятся. Запускайте oxlint для файлов JS/TS/JSX, а для остальных используйте ESLint.
105
+
106
+ Правило `no-unused-content` намеренно исключено выше: ему требуется рабочий каталог и путь к проверяемому файлу из контекста правила, что альфа-мост для JS-плагинов не гарантирует. Запускайте его в ESLint.
107
+
108
+ </Tab>
109
+ </Tabs>
110
+
111
+ ### Пресеты конфигураций
112
+
113
+ | Конфигурация | `no-raw-text` | `static-dictionary-key` | `no-dynamic-field-access` | `enforce-adapter-import` | `no-unused-content` |
114
+ | --------------- | ------------------------------------ | ----------------------- | ------------------------- | ------------------------ | ------------------- |
115
+ | `recommended` | warn | error | error | off | off |
116
+ | `strict` | error (+ строковые литералы вне JSX) | error | error | error | off |
117
+ | `contract-only` | off | error | error | off | off |
118
+
119
+ Пресет `recommended` намеренно оставляет `no-raw-text` со статусом `warn`: применение правила к существующей кодовой базе покажет сразу все непереведенные строки, что не должно ломать сборку с первого же дня.
120
+
121
+ `enforce-adapter-import` по умолчанию выключено — включите его явно при необходимости.
122
+
123
+ `no-unused-content` выключено во всех пресетах, включая `strict`. Это единственное правило, которое считывает конфигурацию Intlayer и сканирует исходные файлы на диске, поэтому его включение должно быть осознанным выбором, а не автоматическим решением пресета.
124
+
125
+ ## Правила
126
+
127
+ ### `no-raw-text`
128
+
129
+ Сообщает о тексте для пользователя, который не объявлен в словаре. Использует ту же логику обнаружения, что и `intlayer extract`, поэтому названия брендов, CSS-классы и технические идентификаторы игнорируются.
130
+
131
+ ```jsx
132
+ // ✗ Ошибка
133
+ <h1>Welcome to our documentation</h1>
134
+ <input placeholder="Enter your email address" />
135
+
136
+ // ✓ Корректно
137
+ const { title } = useIntlayer("home");
138
+ <h1>{title}</h1>
139
+ ```
140
+
141
+ Файлы объявления контента (`*.content.ts`, …) пропускаются.
142
+
143
+ Чтобы исправить весь файл сразу, выполните `npx intlayer extract`, и компилятор автоматически перенесет строки в словарь.
144
+
145
+ **Параметры**
146
+
147
+ ```javascript fileName="eslint.config.mjs" codeFormat="esm"
148
+ {
149
+ "intlayer/no-raw-text": [
150
+ "warn",
151
+ {
152
+ // Атрибуты, значениями которых является текст для пользователя.
153
+ // По умолчанию: title, placeholder, alt, aria-label, label
154
+ attributes: ["title", "placeholder", "alt", "aria-label", "label"],
155
+
156
+ // Элементы, содержимое которых никогда не является текстом для пользователя.
157
+ // По умолчанию: code, pre, script, style
158
+ ignoreElements: ["code", "pre", "script", "style"],
159
+
160
+ // Регулярные выражения для текста, о котором никогда не нужно сообщать.
161
+ ignorePatterns: ["^Powered by"],
162
+
163
+ // Сообщать ли также о строковых литералах вне разметки. По умолчанию: false
164
+ includeStringLiterals: false,
165
+ },
166
+ ],
167
+ }
168
+ ```
169
+
170
+ ### `static-dictionary-key`
171
+
172
+ Требует, чтобы ключ словаря был строковым литералом.
173
+
174
+ Компилятор может предварительно загрузить словарь только тогда, когда он может прочитать ключ непосредственно в месте вызова. При использовании вычисляемого ключа оптимизация автоматически пропускается, и вместо этого в бандл включаются все словари.
175
+
176
+ ```typescript
177
+ // ✗ Ошибка
178
+ useIntlayer(dictionaryKey);
179
+ useIntlayer(`home-${suffix}`);
180
+ getTranslations({ namespace: page });
181
+
182
+ // ✗ Переменная по-прежнему не является литералом
183
+ const key = "home";
184
+ useIntlayer(key);
185
+
186
+ // ✓ Корректно
187
+ useIntlayer("home");
188
+ getTranslations({ namespace: "home" });
189
+ ```
190
+
191
+ Это относится к `useIntlayer`, `getIntlayer` и всем адаптерам совместимости (`useTranslation`, `useTranslations`, `formatMessage`, `<FormattedMessage id>`, `<Trans i18nKey>`, …).
192
+
193
+ ### `no-dynamic-field-access`
194
+
195
+ Требует, чтобы поле, считываемое из словаря, было статически известно.
196
+
197
+ Компилятор удаляет поля, использование которых он не обнаружил. Динамический доступ для него невидим, поэтому чтение может вернуть `undefined` во время выполнения.
198
+
199
+ ```typescript
200
+ // ✗ Ошибка
201
+ const content = useIntlayer("home");
202
+ content[fieldName];
203
+
204
+ const t = useTranslations("home");
205
+ t(messageKey);
206
+
207
+ // ✓ Корректно
208
+ content.title;
209
+ content["title"];
210
+ content.items[0];
211
+ t("hero.title");
212
+ ```
213
+
214
+ ### `enforce-adapter-import`
215
+
216
+ Отдает предпочтение адаптеру совместимости `@intlayer/*` перед оригинальным пакетом. Оригинальный пакет разрешается в Intlayer только при настроенном псевдониме бандлера, тогда как адаптер работает всегда. Поддерживает автоисправление через `--fix`.
217
+
218
+ ```typescript
219
+ // ✗ Ошибка
220
+ import { useTranslation } from "react-i18next";
221
+ import { getTranslations } from "next-intl/server";
222
+
223
+ // ✓ Корректно
224
+ import { useTranslation } from "@intlayer/react-i18next";
225
+ import { getTranslations } from "@intlayer/next-intl/server";
226
+ ```
227
+
228
+ ### `no-unused-content`
229
+
230
+ **По умолчанию отключено.** Сообщает о контенте, который нигде в проекте не считывается, а также о ключах словарей, объявленных более чем в одном месте.
231
+
232
+ ```typescript fileName="src/home.content.ts"
233
+ export default {
234
+ key: "home", // ✗ Сообщается, если ни одно место в проекте не запрашивает "home"
235
+ content: {
236
+ title: t({ ru: "Заголовок", en: "Title" }),
237
+
238
+ // ✗ Сообщается, если ничто не считывает `hero`
239
+ hero: {
240
+ subtitle: t({ ru: "Подзаголовок", en: "Subtitle" }),
241
+ },
242
+ },
243
+ };
244
+ ```
245
+
246
+ В отличие от других правил, это правило не может принять решение только по проверяемому файлу — неиспользуемость поля определяется относительно всего проекта. При первом объявлении контента во время линтинга оно загружает конфигурацию Intlayer, ищет исходные файлы по путям из конфигурации (`build.traversePattern`, `compiler.transformPattern`) и запускает тот же анализатор использования, который используется в `@intlayer/lsp` и зачеркивании «неиспользуемого» в расширении VS Code. Результат кэшируется на `cacheTtl` миллисекунд, поэтому сканирование выполняется один раз за запуск, а не для каждого файла.
247
+
248
+ **Параметры**
249
+
250
+ ```javascript fileName="eslint.config.mjs" codeFormat="esm"
251
+ {
252
+ "intlayer/no-unused-content": [
253
+ "warn",
254
+ {
255
+ // Сообщать о ключах словарей, на которые ничто не ссылается. По умолчанию: true
256
+ reportUnusedDictionaries: true,
257
+
258
+ // Сообщать о полях контента, которые ничто не считывает. По умолчанию: true
259
+ reportUnusedFields: true,
260
+
261
+ // Сообщать о дублирующихся ключах, объявленных в нескольких местах. По умолчанию: true
262
+ reportDuplicateKeys: true,
263
+
264
+ // Регулярные выражения для путей полей, о которых никогда не нужно сообщать.
265
+ ignoreFields: ["^meta"],
266
+
267
+ // Корень проекта, с которого начинается сканирование. По умолчанию: рабочий каталог ESLint
268
+ baseDir: process.cwd(),
269
+
270
+ // Время повторного использования результатов сканирования проекта (в мс). По умолчанию: 30000
271
+ cacheTtl: 30000,
272
+ },
273
+ ],
274
+ }
275
+ ```
276
+
277
+ Уменьшите `cacheTtl`, если вы линтите из долгоживущего сервера редактора и хотите быстрее видеть изменения; установите `baseDir`, если один запуск линтера охватывает несколько проектов Intlayer в монорепозитории.
278
+
279
+ > **Стремится к минимизации ложных срабатываний.** Ложное срабатывание здесь может привести к удалению нужного перевода, поэтому ничего не сообщается, когда словарь используется способом, который анализ не может отследить: объект контента передан целиком, функция перевода привязана от него (`const t = useTranslations("home")`), объявление получено через прямой импорт (`useDictionary(myDictionary)`), `nest()` из другого словаря или список полей, ставший неполным из-за spread-оператора. Однофайловые компоненты (`.vue`, `.svelte`, `.astro`) считаются использующими все поля упомянутых словарей, поскольку их блоки скриптов здесь не парсятся.
280
+
281
+ `reportDuplicateKeys` считывает необъединенные словари, которые сборка записывает в `.intlayer/`, поэтому оно не срабатывает, пока проект не будет собран хотя бы один раз. Два объявления с одинаковым ключом объединяются, что является допустимым паттерном — отчет формируется потому, что поле, определенное с обеих сторон, без предупреждения сохраняет только одно из двух значений.
282
+
283
+ Анализатор загружается из `@intlayer/lsp`, который поставляется как ESM. Поэтому правилу требуется версия Node, поддерживающая `require()` для ES-модулей — Node 20.19+ или 22.12+. На более старых версиях оно ничего не сообщает, чтобы не прерывать выполнение линтинга.
284
+
285
+ ## Фреймворки
286
+
287
+ Каждое правило работает во всех интеграциях Intlayer, включая шаблоны Vue, Svelte и Angular. Вам нужно лишь указать ESLint, какой парсер использовать для каждого типа файлов.
288
+
289
+ | Фреймворк | Файлы | Парсер |
290
+ | ------------------------- | ----------------- | --------------------------------- |
291
+ | React, Preact, Solid, Lit | `.jsx` `.tsx` | `typescript-eslint` |
292
+ | Next.js | `.jsx` `.tsx` | `typescript-eslint` |
293
+ | Vue, Nuxt | `.vue` | `vue-eslint-parser` |
294
+ | Svelte, SvelteKit | `.svelte` | `svelte-eslint-parser` |
295
+ | Angular | `.ts` | `typescript-eslint` |
296
+ | Шаблоны Angular | `.component.html` | `@angular-eslint/template-parser` |
297
+ | Astro | `.astro` | `astro-eslint-parser` |
298
+
299
+ ```javascript fileName="eslint.config.mjs" codeFormat="esm"
300
+ import intlayer from "eslint-plugin-intlayer";
301
+ import tseslint from "typescript-eslint";
302
+ import vueParser from "vue-eslint-parser";
303
+ import svelteParser from "svelte-eslint-parser";
304
+ import angularTemplateParser from "@angular-eslint/template-parser";
305
+
306
+ export default [
307
+ ...intlayer.configs.recommended,
308
+
309
+ {
310
+ files: ["**/*.{ts,tsx,jsx}"],
311
+ languageOptions: { parser: tseslint.parser },
312
+ },
313
+ {
314
+ files: ["**/*.vue"],
315
+ languageOptions: {
316
+ parser: vueParser,
317
+ parserOptions: { parser: tseslint.parser },
318
+ },
319
+ },
320
+ {
321
+ files: ["**/*.svelte"],
322
+ languageOptions: {
323
+ parser: svelteParser,
324
+ parserOptions: { parser: tseslint.parser },
325
+ },
326
+ },
327
+ {
328
+ files: ["**/*.component.html"],
329
+ languageOptions: { parser: angularTemplateParser },
330
+ },
331
+ ];
332
+ ```
333
+
334
+ Устанавливайте только те парсеры, которые требуются вашему проекту.
335
+
336
+ > **Известное ограничение.** В шаблонах Vue и Angular выражение вида `{{ content[key] }}` не проверяется правилом `no-dynamic-field-access`. Динамическое чтение внутри блока script определяется в штатном режиме.
@@ -207,7 +207,7 @@ export const ComponentExample = () => {
207
207
  Этот подход позволяет:
208
208
 
209
209
  1. **Увеличить скорость разработки**
210
- - Файлы `.content.{{ts|mjs|cjs|json}}` могут быть созданы с помощью расширения для VSCode
210
+ - Файлы `.content.{ts|js|mjs|cjs|json|tsx|jsx|md|mdx|yaml|yml}` могут быть созданы с помощью расширения для VSCode
211
211
  - Инструменты автодополнения с ИИ в вашей IDE (такие как GitHub Copilot) могут помочь вам объявлять контент, сокращая ручное копирование и вставку
212
212
 
213
213
  2. **Очистить вашу кодовую базу**
@@ -231,27 +231,27 @@ export const ComponentExample = () => {
231
231
 
232
232
  ## Дополнительные возможности Intlayer
233
233
 
234
- | Возможность | Описание |
235
- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
236
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/frameworks.png?raw=true) | **Поддержка множества фреймворков**<br><br>Intlayer совместим со всеми основными фреймворками и библиотеками, включая Next.js, React, Vite, Vue.js, Nuxt, Preact, Express и другими. |
237
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/javascript_content_management.jpg?raw=true) | **Управление контентом на JavaScript**<br><br>Используйте гибкость JavaScript для эффективного определения и управления вашим контентом.<br><br> - [Объявление контента](https://intlayer.org/doc/concept/content) |
238
- | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/compiler.jpg?raw=true" alt="Feature" width="700"> | **Компилятор**<br><br>Компилятор Intlayer автоматически извлекает контент из компонентов и генерирует файлы словарей.<br><br> - [Компилятор](https://intlayer.org/doc/compiler) |
239
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/per_locale_content_declaration_file.png?raw=true) | **Файл объявления контента для каждого языка**<br><br>Ускорьте разработку, объявив свой контент один раз перед автоматической генерацией.<br><br> - [Файл объявления контента для каждого языка](https://intlayer.org/doc/concept/per-locale-file) |
240
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/autocompletion.png?raw=true) | **Типобезопасная среда**<br><br>Используйте TypeScript для гарантии отсутствия ошибок в определениях контента и коде, одновременно получая преимущества автодополнения в IDE.<br><br> - [Настройка TypeScript](https://intlayer.org/doc/environment/vite-and-react#configure-typescript) |
241
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/config_file.png?raw=true) | **Упрощенная настройка**<br><br>Быстрый запуск с минимальной конфигурацией. Легко настраивайте параметры интернационализации, маршрутизации, ИИ, сборки и обработки контента.<br><br> - [Изучить интеграцию с Next.js](https://intlayer.org/doc/environment/nextjs) |
242
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/content_retrieval.png?raw=true) | **Упрощенное получение контента**<br><br>Нет необходимости вызывать вашу функцию `t` для каждого элемента контента. Получайте весь контент напрямую с помощью одного хука.<br><br> - [Интеграция с React](https://intlayer.org/doc/environment/create-react-app) |
243
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/server_component.png?raw=true) | **Согласованная реализация серверных компонентов**<br><br>Идеально подходит для серверных компонентов Next.js, используйте одну и ту же реализацию как для клиентских, так и для серверных компонентов, без необходимости передавать функцию `t` через каждый серверный компонент.<br><br> - [Серверные компоненты](https://intlayer.org/doc/environment/nextjs#step-7-utilize-content-in-your-code) |
244
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/file_tree.png?raw=true) | **Организованная кодовая база**<br><br>Держите вашу кодовую базу более организованной: 1 компонент = 1 словарь в той же папке. Переводы рядом с соответствующими компонентами повышают удобство поддержки и ясность.<br><br> - [Как работает Intlayer](https://intlayer.org/doc/concept/how-works-intlayer) |
245
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/url_routing.png?raw=true) | **Улучшенная маршрутизация**<br><br>Полная поддержка маршрутизации приложений, плавно адаптирующаяся к сложным структурам приложений для Next.js, React, Vite, Vue.js и т. д.<br><br> - [Изучить интеграцию с Next.js](https://intlayer.org/doc/environment/nextjs) |
246
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/markdown.png?raw=true) | **Поддержка Markdown**<br><br>Импортируйте и интерпретируйте локальные файлы и удаленный Markdown для многоязычного контента, такого как политики конфиденциальности, документация и т. д. Интерпретируйте и делайте метаданные Markdown доступными в вашем коде.<br><br> - [Файлы контента](https://intlayer.org/doc/concept/content/file) |
247
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/visual_editor.png?raw=true) | **Бесплатный визуальный редактор и CMS**<br><br>Для авторов контента доступны бесплатный визуальный редактор и CMS, что исключает необходимость в сторонней платформе локализации. Синхронизируйте ваш контент с помощью Git или полностью или частично переносите его во внешнее управление через CMS.<br><br> - [Редактор Intlayer](https://intlayer.org/doc/concept/editor) <br> - [CMS Intlayer](https://intlayer.org/doc/concept/cms) |
248
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/bundle.png?raw=true) | **Контент с поддержкой Tree-shaking**<br><br>Контент с поддержкой оптимизации tree-shaking, сокращающий размер финальной сборки. Загружает контент для каждого компонента, исключая любой неиспользуемый контент из вашей сборки. Поддерживает ленивую загрузку для повышения эффективности запуска приложения.<br><br> - [Оптимизация сборки приложения](https://intlayer.org/doc/concept/how-works-intlayer#app-build-optimization) |
249
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/static_rendering.png?raw=true) | **Статический рендеринг**<br><br>Не блокирует статический рендеринг.<br><br> - [Интеграция с Next.js](https://intlayer.org/doc/environment/nextjs) |
250
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/AI_translation.png?raw=true) | **Перевод с помощью ИИ**<br><br>Превратите ваш веб-сайт на 231 язык в один клик с помощью продвинутых инструментов перевода на базе ИИ от Intlayer, используя собственного ИИ-провайдера/API-ключ.<br><br> - [Интеграция CI/CD](https://intlayer.org/doc/concept/ci-cd) <br> - [Intlayer CLI](https://intlayer.org/doc/concept/cli) <br> - [Автозаполнение](https://intlayer.org/doc/concept/auto-fill) |
251
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/mcp.png?raw=true) | **Интеграция с MCP-сервером**<br><br>Предоставляет сервер MCP (Model Context Protocol) для автоматизации вашей IDE, обеспечивая бесшовное управление контентом и рабочие процессы i18n прямо в вашей среде разработки.<br><br> - [MCP-сервер](https://github.com/aymericzip/intlayer/blob/main/docs/ru/mcp_server.md) |
252
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/vscode_extension.png?raw=true) | **Расширение VSCode**<br><br>Intlayer предоставляет расширение для VSCode, которое помогает вам управлять вашим контентом и переводами, создавать словари, переводить контент и многое другое.<br><br> - [Расширение VSCode](https://intlayer.org/doc/vs-code-extension) |
253
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/interoperability.png?raw=true) | **Совместимость**<br><br>Обеспечивает совместимость с react-i18next, next-i18next, next-intl и react-intl.<br><br> - [Intlayer и react-intl](https://intlayer.org/blog/intlayer-with-react-intl) <br> - [Intlayer и next-intl](https://intlayer.org/blog/intlayer-with-next-intl) <br> - [Intlayer и next-i18next](https://intlayer.org/blog/intlayer-with-next-i18next) |
254
- | Тестирование отсутствующих переводов (CLI/CI) | ✅ CLI: npx intlayer content test (аудит, подходящий для CI) |
234
+ | Возможность | Описание |
235
+ | ------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
236
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/frameworks.png?raw=true) | **Поддержка множества фреймворков**<br><br>Intlayer совместим со всеми основными фреймворками и библиотеками, включая Next.js, React, Vite, Vue.js, Nuxt, Preact, Express и другими. |
237
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/javascript_content_management.jpg?raw=true) | **Управление контентом на JavaScript**<br><br>Используйте гибкость JavaScript для эффективного определения и управления вашим контентом.<br><br> - [Объявление контента](https://intlayer.org/doc/concept/content) |
238
+ | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/compiler.jpg?raw=true" alt="Feature" width="700"> | **Компилятор**<br><br>Компилятор Intlayer автоматически извлекает контент из компонентов и генерирует файлы словарей.<br><br> - [Компилятор](https://intlayer.org/doc/compiler) |
239
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/per_locale_content_declaration_file.png?raw=true) | **Файл объявления контента для каждого языка**<br><br>Ускорьте разработку, объявив свой контент один раз перед автоматической генерацией.<br><br> - [Файл объявления контента для каждого языка](https://intlayer.org/doc/concept/per-locale-file) |
240
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/autocompletion.png?raw=true) | **Типобезопасная среда**<br><br>Используйте TypeScript для гарантии отсутствия ошибок в определениях контента и коде, одновременно получая преимущества автодополнения в IDE.<br><br> - [Настройка TypeScript](https://intlayer.org/doc/environment/vite-and-react#configure-typescript) |
241
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/config_file.png?raw=true) | **Упрощенная настройка**<br><br>Быстрый запуск с минимальной конфигурацией. Легко настраивайте параметры интернационализации, маршрутизации, ИИ, сборки и обработки контента.<br><br> - [Изучить интеграцию с Next.js](https://intlayer.org/doc/environment/nextjs) |
242
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/content_retrieval.png?raw=true) | **Упрощенное получение контента**<br><br>Нет необходимости вызывать вашу функцию `t` для каждого элемента контента. Получайте весь контент напрямую с помощью одного хука.<br><br> - [Интеграция с React](https://intlayer.org/doc/environment/create-react-app) |
243
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/server_component.png?raw=true) | **Согласованная реализация серверных компонентов**<br><br>Идеально подходит для серверных компонентов Next.js, используйте одну и ту же реализацию как для клиентских, так и для серверных компонентов, без необходимости передавать функцию `t` через каждый серверный компонент.<br><br> - [Серверные компоненты](https://intlayer.org/doc/environment/nextjs#step-7-utilize-content-in-your-code) |
244
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/file_tree.png?raw=true) | **Организованная кодовая база**<br><br>Держите вашу кодовую базу более организованной: 1 компонент = 1 словарь в той же папке. Переводы рядом с соответствующими компонентами повышают удобство поддержки и ясность.<br><br> - [Как работает Intlayer](https://intlayer.org/doc/concept/how-works-intlayer) |
245
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/url_routing.png?raw=true) | **Улучшенная маршрутизация**<br><br>Полная поддержка маршрутизации приложений, плавно адаптирующаяся к сложным структурам приложений для Next.js, React, Vite, Vue.js и т. д.<br><br> - [Изучить интеграцию с Next.js](https://intlayer.org/doc/environment/nextjs) |
246
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/markdown.png?raw=true) | **Поддержка Markdown**<br><br>Импортируйте и интерпретируйте локальные файлы и удаленный Markdown для многоязычного контента, такого как политики конфиденциальности, документация и т. д. Интерпретируйте и делайте метаданные Markdown доступными в вашем коде.<br><br> - [Файлы контента](https://intlayer.org/doc/concept/content/file) |
247
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/visual_editor.png?raw=true) | **Бесплатный визуальный редактор и CMS**<br><br>Для авторов контента доступны бесплатный визуальный редактор и CMS, что исключает необходимость в сторонней платформе локализации. Синхронизируйте ваш контент с помощью Git или полностью или частично переносите его во внешнее управление через CMS.<br><br> - [Редактор Intlayer](https://intlayer.org/doc/concept/editor) <br> - [CMS Intlayer](https://intlayer.org/doc/concept/cms) |
248
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/bundle.png?raw=true) | **Контент с поддержкой Tree-shaking**<br><br>Контент с поддержкой оптимизации tree-shaking, сокращающий размер финальной сборки. Загружает контент для каждого компонента, исключая любой неиспользуемый контент из вашей сборки. Поддерживает ленивую загрузку для повышения эффективности запуска приложения.<br><br> - [Оптимизация сборки приложения](https://intlayer.org/doc/concept/how-works-intlayer#app-build-optimization) |
249
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/static_rendering.png?raw=true) | **Статический рендеринг**<br><br>Не блокирует статический рендеринг.<br><br> - [Интеграция с Next.js](https://intlayer.org/doc/environment/nextjs) |
250
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/AI_translation.png?raw=true) | **Перевод с помощью ИИ**<br><br>Превратите ваш веб-сайт на 231 язык в один клик с помощью продвинутых инструментов перевода на базе ИИ от Intlayer, используя собственного ИИ-провайдера/API-ключ.<br><br> - [Интеграция CI/CD](https://intlayer.org/doc/concept/ci-cd) <br> - [Intlayer CLI](https://intlayer.org/doc/concept/cli) <br> - [Автозаполнение](https://intlayer.org/doc/concept/auto-fill) |
251
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/mcp.png?raw=true) | **Интеграция с MCP-сервером**<br><br>Предоставляет сервер MCP (Model Context Protocol) для автоматизации вашей IDE, обеспечивая бесшовное управление контентом и рабочие процессы i18n прямо в вашей среде разработки.<br><br> - [MCP-сервер](https://github.com/aymericzip/intlayer/blob/main/docs/ru/mcp_server.md) |
252
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/vscode_extension.png?raw=true) | **Расширение VSCode**<br><br>Intlayer предоставляет расширение для VSCode, которое помогает вам управлять вашим контентом и переводами, создавать словари, переводить контент и многое другое.<br><br> - [Расширение VSCode](https://intlayer.org/doc/vs-code-extension) |
253
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/interoperability.png?raw=true) | **Совместимость**<br><br>Обеспечивает совместимость с react-i18next, next-i18next, next-intl и react-intl.<br><br> - [Intlayer и react-intl](https://intlayer.org/blog/intlayer-with-react-intl) <br> - [Intlayer и next-intl](https://intlayer.org/blog/intlayer-with-next-intl) <br> - [Intlayer и next-i18next](https://intlayer.org/blog/intlayer-with-next-i18next) <br> - [Адаптеры совместимости Intlayer](https://intlayer.org/doc/compatibility) |
254
+ | Тестирование отсутствующих переводов (CLI/CI) | ✅ CLI: npx intlayer content test (аудит, подходящий для CI) |
255
255
 
256
256
  ## Сравнение Intlayer с другими решениями
257
257
 
@@ -290,3 +290,5 @@ export const ComponentExample = () => {
290
290
  `intlayer` также может помочь управлять вашими пространствами имен `react-intl`, `react-i18next`, `next-intl`, `next-i18next` и `vue-i18n`.
291
291
 
292
292
  Используя `intlayer`, вы можете объявить свой контент в формате вашей любимой библиотеки i18n, и intlayer сгенерирует ваши пространства имен в выбранном вами месте (например: `/messages/{{locale}}/{{namespace}}.json`).
293
+
294
+ Если вы хотите продолжать использовать API вашей текущей библиотеки i18n, `intlayer` также предоставляет **адаптеры совместимости (compat adapters)**: пакеты, предоставляющие точно такой же API, как `react-i18next`, `next-intl`, `react-intl`, `vue-i18n` и другие, но с содержимым из словарей Intlayer. Это позволяет мигрировать постепенно, не переписывая код. См. [документацию по адаптерам совместимости](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/compat/index.md).
@@ -914,7 +914,7 @@ Intlayer использует расширение модулей (module augmen
914
914
  - **Встроенный просмотр** переведённого контента.
915
915
  - **Быстрые действия** для лёгкого создания и обновления переводов.
916
916
 
917
- Для получения дополнительной информации о том, как использовать расширение, обратитесь к [документации расширения Intlayer для VS Code](https://intlayer.org/doc/ru/vs-code-extension).
917
+ Для получения дополнительной информации о том, как использовать расширение, обратитесь к [документации расширения Intlayer для VS Code](https://intlayer.org/ru/doc/vs-code-extension).
918
918
 
919
919
  ---
920
920
 
@@ -916,7 +916,7 @@ Intlayer использует расширение модулей (module augmen
916
916
  - **Встроенный просмотр** переведённого контента.
917
917
  - **Быстрые действия** для лёгкого создания и обновления переводов.
918
918
 
919
- Для получения дополнительной информации о том, как использовать расширение, обратитесь к [документации расширения Intlayer для VS Code](https://intlayer.org/doc/ru/vs-code-extension).
919
+ Для получения дополнительной информации о том, как использовать расширение, обратитесь к [документации расширения Intlayer для VS Code](https://intlayer.org/ru/doc/vs-code-extension).
920
920
 
921
921
  ### Продвинутые возможности
922
922
 
@@ -404,7 +404,7 @@ export const getLocale = (event: RequestEvent): Locale => {
404
404
  };
405
405
  ```
406
406
 
407
- > `getLocaleFromStorage` будет проверять локаль из заголовка или cookie в зависимости от вашей конфигурации. Подробнее смотрите в разделе [Configuration](https://intlayer.org/doc/configuration).
407
+ > `getLocaleFromStorage` будет проверять локаль из заголовка или cookie в зависимости от вашей конфигурации. Подробнее смотрите в разделе [Configuration](https://intlayer.org/doc/concept/configuration).
408
408
 
409
409
  > Функция `localeDetector` обрабатывает заголовок `Accept-Language` и возвращает наилучшее совпадение.
410
410
 
@@ -254,19 +254,21 @@ import {
254
254
  HeadContent,
255
255
  Scripts,
256
256
  createRootRouteWithContext,
257
+ getRouteApi,
257
258
  } from "@tanstack/solid-router";
258
259
  import { HydrationScript } from "solid-js/web";
259
260
  import { Suspense, type ParentComponent } from "solid-js";
260
261
  import { IntlayerProvider } from "solid-intlayer";
261
262
  import { defaultLocale, getHTMLTextDir } from "intlayer";
262
- import { Route as LocaleRoute } from "./{-$locale}/route";
263
+
264
+ const localeRoute = getRouteApi("/{-$locale}");
263
265
 
264
266
  export const Route = createRootRouteWithContext()({
265
267
  shellComponent: RootComponent,
266
268
  });
267
269
 
268
270
  const RootComponent: ParentComponent = (props) => {
269
- const params = LocaleRoute.useParams();
271
+ const params = localeRoute.useParams();
270
272
  const locale = params()?.locale ?? defaultLocale;
271
273
 
272
274
  return (
@@ -551,7 +553,7 @@ export default LocaleSwitcher;
551
553
 
552
554
  ```tsx fileName="src/routes/__root.tsx"
553
555
  const RootComponent: ParentComponent = (props) => {
554
- const params = LocaleRoute.useParams();
556
+ const params = localeRoute.useParams();
555
557
  const locale = params()?.locale ?? defaultLocale;
556
558
 
557
559
  return (