@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
@@ -0,0 +1,336 @@
1
+ ---
2
+ createdAt: 2026-08-12
3
+ updatedAt: 2026-08-12
4
+ title: Plugin de ESLint | Reglas de lint para Intlayer
5
+ description: Detecta cadenas hardcodeadas, llamadas dinámicas que el compilador de Intlayer no puede optimizar y contenido de diccionario sin usar, con eslint-plugin-intlayer. Funciona con ESLint y oxlint, en React, Vue, Svelte, Angular y Astro.
6
+ keywords:
7
+ - Intlayer
8
+ - ESLint
9
+ - oxlint
10
+ - Lint
11
+ - i18n
12
+ - Internacionalización
13
+ - no-raw-text
14
+ - Cadenas hardcodeadas
15
+ - Traducciones sin usar
16
+ - Contenido muerto
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: "Historial inicial"
28
+ author: aymericzip
29
+ ---
30
+
31
+ # Plugin de ESLint x OXLint
32
+
33
+ `eslint-plugin-intlayer` detecta los tipos de error de i18n que TypeScript no puede ver:
34
+
35
+ 1. **Texto hardcodeado** que nunca llegó a un diccionario.
36
+ 2. **Llamadas dinámicas** que pasan el chequeo de tipos y se ejecutan, pero que el compilador de Intlayer no puede optimizar.
37
+ 3. **Contenido muerto** — diccionarios y campos que nada en el proyecto lee (opcional mediante activación).
38
+
39
+ Las claves de diccionario desconocidas, las rutas de campo desconocidas y las locales faltantes ya son errores de compilación, así que el plugin no las repite.
40
+
41
+ ## Instalación
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
+ Requiere ESLint 9 o posterior (flat config).
56
+
57
+ ## Uso
58
+
59
+ El plugin funciona tanto en ESLint como en [oxlint](https://oxc.rs): las mismas reglas, las mismas opciones.
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
+ O activa las reglas una por una:
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
+ Dos advertencias: el soporte de plugins JS en oxlint aún está en fase alfa, y oxlint no admite parsers personalizados; por lo tanto, los archivos `.vue`, `.svelte`, `.astro` y las plantillas de Angular no se analizan allí. Ejecuta oxlint sobre tus archivos JS/TS/JSX y mantén ESLint para el resto.
105
+
106
+ `no-unused-content` se omite intencionadamente arriba: necesita el directorio de trabajo y la ruta del archivo analizado del contexto de la regla, lo cual el puente alfa de plugins JS no garantiza. Ejecútala bajo ESLint.
107
+
108
+ </Tab>
109
+ </Tabs>
110
+
111
+ ### Configuraciones
112
+
113
+ | Configuración | `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 (+ literales fuera de JSX) | error | error | error | off |
117
+ | `contract-only` | off | error | error | off | off |
118
+
119
+ `recommended` mantiene deliberadamente `no-raw-text` en `warn`: apuntarla a una base de código existente detecta todas las cadenas no traducidas de golpe, lo cual no debería romper tu compilación desde el primer día.
120
+
121
+ `enforce-adapter-import` está desactivada por defecto — actívala explícitamente si la deseas.
122
+
123
+ `no-unused-content` está desactivada en todas las configuraciones, incluida `strict`. Es la única regla que lee tu configuración de Intlayer y recorre tus archivos fuente desde el disco, por lo que activarla debe ser una elección deliberada en lugar de algo que un ajuste preestablecido haga por ti.
124
+
125
+ ## Reglas
126
+
127
+ ### `no-raw-text`
128
+
129
+ Informa sobre el texto orientado al usuario que no está declarado en un diccionario. Utiliza la misma detección que `intlayer extract`, por lo que se ignoran nombres de marcas, clases CSS e identificadores técnicos.
130
+
131
+ ```jsx
132
+ // ✗ Reportado
133
+ <h1>Welcome to our documentation</h1>
134
+ <input placeholder="Enter your email address" />
135
+
136
+ // ✓ Correcto
137
+ const { title } = useIntlayer("home");
138
+ <h1>{title}</h1>
139
+ ```
140
+
141
+ Los archivos de declaración de contenido (`*.content.ts`, …) se ignoran.
142
+
143
+ Para corregir un archivo completo de una vez, ejecuta `npx intlayer extract` y deja que el compilador mueva las cadenas a un diccionario por ti.
144
+
145
+ **Opciones**
146
+
147
+ ```javascript fileName="eslint.config.mjs" codeFormat="esm"
148
+ {
149
+ "intlayer/no-raw-text": [
150
+ "warn",
151
+ {
152
+ // Atributos cuyo valor es texto orientado al usuario.
153
+ // Por defecto: title, placeholder, alt, aria-label, label
154
+ attributes: ["title", "placeholder", "alt", "aria-label", "label"],
155
+
156
+ // Elementos cuyo contenido nunca es texto orientado al usuario.
157
+ // Por defecto: code, pre, script, style
158
+ ignoreElements: ["code", "pre", "script", "style"],
159
+
160
+ // Expresiones regulares para texto que nunca se debe reportar.
161
+ ignorePatterns: ["^Powered by"],
162
+
163
+ // También reportar literales de cadena fuera del marcado. Por defecto: false
164
+ includeStringLiterals: false,
165
+ },
166
+ ],
167
+ }
168
+ ```
169
+
170
+ ### `static-dictionary-key`
171
+
172
+ Requiere que la clave del diccionario sea un literal de cadena.
173
+
174
+ El compilador solo puede precargar un diccionario cuando puede leer la clave directamente en el punto de llamada. Con una clave calculada, omite silenciosamente la optimización e incluye todos los diccionarios en el empaquetado.
175
+
176
+ ```typescript
177
+ // ✗ Reportado
178
+ useIntlayer(dictionaryKey);
179
+ useIntlayer(`home-${suffix}`);
180
+ getTranslations({ namespace: page });
181
+
182
+ // ✗ Una variable sigue sin ser un literal
183
+ const key = "home";
184
+ useIntlayer(key);
185
+
186
+ // ✓ Correcto
187
+ useIntlayer("home");
188
+ getTranslations({ namespace: "home" });
189
+ ```
190
+
191
+ Esto se aplica a `useIntlayer`, `getIntlayer` y a todos los adaptadores de compatibilidad (`useTranslation`, `useTranslations`, `formatMessage`, `<FormattedMessage id>`, `<Trans i18nKey>`, …).
192
+
193
+ ### `no-dynamic-field-access`
194
+
195
+ Requiere que el campo que lees de un diccionario sea conocido estáticamente.
196
+
197
+ El compilador elimina los campos que no ve utilizados. Un acceso dinámico le resulta invisible, por lo que la lectura puede devolver `undefined` en tiempo de ejecución.
198
+
199
+ ```typescript
200
+ // ✗ Reportado
201
+ const content = useIntlayer("home");
202
+ content[fieldName];
203
+
204
+ const t = useTranslations("home");
205
+ t(messageKey);
206
+
207
+ // ✓ Correcto
208
+ content.title;
209
+ content["title"];
210
+ content.items[0];
211
+ t("hero.title");
212
+ ```
213
+
214
+ ### `enforce-adapter-import`
215
+
216
+ Prefiere el adaptador de compatibilidad `@intlayer/*` sobre el paquete original. El original solo se resuelve a Intlayer cuando el alias del empaquetador está configurado; el adaptador siempre lo hace. Corregible automáticamente con `--fix`.
217
+
218
+ ```typescript
219
+ // ✗ Reportado
220
+ import { useTranslation } from "react-i18next";
221
+ import { getTranslations } from "next-intl/server";
222
+
223
+ // ✓ Correcto
224
+ import { useTranslation } from "@intlayer/react-i18next";
225
+ import { getTranslations } from "@intlayer/next-intl/server";
226
+ ```
227
+
228
+ ### `no-unused-content`
229
+
230
+ **Desactivada por defecto.** Informa sobre contenido que nada en tu proyecto lee, además de claves de diccionario declaradas en más de un lugar.
231
+
232
+ ```typescript fileName="src/home.content.ts"
233
+ export default {
234
+ key: "home", // ✗ Reportado si ninguna llamada en el proyecto solicita "home"
235
+ content: {
236
+ title: t({ es: "Título", en: "Title" }),
237
+
238
+ // ✗ Reportado si nada lee `hero`
239
+ hero: {
240
+ subtitle: t({ es: "Subtítulo", en: "Subtitle" }),
241
+ },
242
+ },
243
+ };
244
+ ```
245
+
246
+ A diferencia de las otras reglas, esta no puede responder solo a partir del archivo evaluado: un campo no se usa únicamente en relación con todo el proyecto. En la primera declaración de contenido de una ejecución de lint, carga tu configuración de Intlayer, busca los archivos fuente que declara dicha configuración (`build.traversePattern`, `compiler.transformPattern`) y ejecuta el mismo analizador de uso que alimenta `@intlayer/lsp` y el tachado de "no utilizado" en la extensión de VS Code. El resultado se almacena en caché durante `cacheTtl` milisegundos, por lo que el escaneo ocurre una vez por ejecución en lugar de una vez por archivo.
247
+
248
+ **Opciones**
249
+
250
+ ```javascript fileName="eslint.config.mjs" codeFormat="esm"
251
+ {
252
+ "intlayer/no-unused-content": [
253
+ "warn",
254
+ {
255
+ // Reportar claves de diccionario que nada referencia. Por defecto: true
256
+ reportUnusedDictionaries: true,
257
+
258
+ // Reportar campos de contenido que nada lee. Por defecto: true
259
+ reportUnusedFields: true,
260
+
261
+ // Reportar claves declaradas en más de un lugar. Por defecto: true
262
+ reportDuplicateKeys: true,
263
+
264
+ // Expresiones regulares para rutas de campos que nunca se deben reportar.
265
+ ignoreFields: ["^meta"],
266
+
267
+ // Raíz del proyecto desde donde comienza el escaneo. Por defecto: directorio de trabajo de ESLint
268
+ baseDir: process.cwd(),
269
+
270
+ // Tiempo que se reutiliza un escaneo de proyecto, en ms. Por defecto: 30000
271
+ cacheTtl: 30000,
272
+ },
273
+ ],
274
+ }
275
+ ```
276
+
277
+ Reduce `cacheTtl` cuando ejecutes lint desde un servidor de editor de larga duración y quieras que tus ediciones se reflejen antes; configura `baseDir` cuando una sola ejecución de lint abarque varios proyectos de Intlayer en un monorepo.
278
+
279
+ > **Tiende al silencio.** Un falso positivo aquí eliminaría una traducción, por lo que no se reporta nada cuando el diccionario se consume de una manera que el análisis no puede rastrear: el objeto de contenido pasado en su totalidad, una función de traducción vinculada a partir de él (`const t = useTranslations("home")`), una declaración alcanzada mediante una importación directa (`useDictionary(myDictionary)`), un `nest()` de otro diccionario, o una lista de campos hecha no exhaustiva por un spread. Los componentes de un solo archivo (`.vue`, `.svelte`, `.astro`) se consideran como si usaran cada campo de los diccionarios que mencionan, ya que sus bloques de script no se analizan aquí.
280
+
281
+ `reportDuplicateKeys` lee los diccionarios no fusionados que la compilación escribe bajo `.intlayer/`, por lo que permanece silenciosa hasta que el proyecto se haya compilado al menos una vez. Dos declaraciones que comparten una clave se fusionan, lo cual es un patrón legítimo; el reporte existe porque un campo definido en ambos lados conserva silenciosamente solo uno de los dos valores.
282
+
283
+ El analizador se carga desde `@intlayer/lsp`, que se distribuye como ESM. Por lo tanto, la regla necesita una versión de Node que pueda hacer `require()` de un módulo ES: Node 20.19+ o 22.12+. En versiones anteriores no reporta nada en lugar de fallar la ejecución del lint.
284
+
285
+ ## Frameworks
286
+
287
+ Todas las reglas funcionan en todas las integraciones de Intlayer, incluso dentro de plantillas de Vue, Svelte y Angular. Solo necesitas indicarle a ESLint qué parser lee cada tipo de archivo.
288
+
289
+ | Framework | Archivos | Parser |
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
+ | Plantillas de 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
+ Instala solo los parsers que tu proyecto necesite.
335
+
336
+ > **Limitación conocida.** En plantillas de Vue y Angular, una expresión como `{{ content[key] }}` no se verifica con `no-dynamic-field-access`. Las lecturas dinámicas escritas en el bloque script se detectan normalmente.
@@ -207,7 +207,7 @@ export const ComponentExample = () => {
207
207
  Este enfoque te permite:
208
208
 
209
209
  1. **Aumentar la velocidad de desarrollo**
210
- - Los archivos `.content.{{ts|mjs|cjs|json}}` se pueden crear utilizando una extensión de VSCode
210
+ - Los archivos `.content.{ts|js|mjs|cjs|json|tsx|jsx|md|mdx|yaml|yml}` se pueden crear utilizando una extensión de VSCode
211
211
  - Las herramientas de autocompletado de IA en tu IDE (como GitHub Copilot) pueden ayudarte a declarar tu contenido, reduciendo el copiar/pegar
212
212
 
213
213
  2. **Limpiar tu base de código**
@@ -231,27 +231,27 @@ Este enfoque te permite:
231
231
 
232
232
  ## Características adicionales de Intlayer
233
233
 
234
- | Característica | Descripción |
235
- | ------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
236
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/frameworks.png?raw=true) | **Soporte Multi-Framework**<br><br>Intlayer es compatible con todos los frameworks y librerías principales, incluidos Next.js, React, Vite, Vue.js, Nuxt, Preact, Express y más. |
237
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/javascript_content_management.jpg?raw=true) | **Administración de contenido basada en JavaScript**<br><br>Aprovecha la flexibilidad de JavaScript para definir y administrar tu contenido de manera eficiente.<br><br> - [Declaración de contenido](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"> | **Compilador**<br><br>El compilador de Intlayer extrae automáticamente el contenido de los componentes y genera los archivos de diccionario.<br><br> - [Compilador](https://intlayer.org/doc/compiler) |
239
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/per_locale_content_declaration_file.png?raw=true) | **Archivo de declaración de contenido por idioma**<br><br>Acelera tu desarrollo declarando tu contenido una vez, antes de la generación automática.<br><br> - [Archivo de declaración de contenido por idioma](https://intlayer.org/doc/concept/per-locale-file) |
240
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/autocompletion.png?raw=true) | **Entorno seguro para tipos**<br><br>Aprovecha TypeScript para garantizar que tus definiciones de contenido y tu código estén libres de errores, mientras te beneficias del autocompletado del IDE.<br><br> - [Configuración de 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) | **Configuración simplificada**<br><br>Ponte en marcha rápidamente con una configuración mínima. Ajusta la configuración de internacionalización, enrutamiento, IA, compilación y manejo de contenido con facilidad.<br><br> - [Explorar la integración de Next.js](https://intlayer.org/doc/environment/nextjs) |
242
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/content_retrieval.png?raw=true) | **Obtención simplificada de contenido**<br><br>No es necesario llamar a tu función `t` para cada fragmento de contenido. Recupera todo tu contenido directamente usando un único hook.<br><br> - [Integración con 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) | **Implementación consistente de componentes de servidor**<br><br>Perfectamente adecuado para los componentes de servidor de Next.js, usa la misma implementación para componentes de cliente y de servidor, sin necesidad de pasar tu función `t` a través de cada componente de servidor.<br><br> - [Componentes de servidor](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) | **Base de código organizada**<br><br>Mantén tu base de código más organizada: 1 componente = 1 diccionario en la misma carpeta. Las traducciones cercanas a sus respectivos componentes mejoran la mantenibilidad y la claridad.<br><br> - [Cómo funciona 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) | **Enrutamiento mejorado**<br><br>Soporte completo de enrutamiento de aplicaciones, adaptándose sin problemas a estructuras de aplicaciones complejas, para Next.js, React, Vite, Vue.js, etc.<br><br> - [Explorar la integración de Next.js](https://intlayer.org/doc/environment/nextjs) |
246
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/markdown.png?raw=true) | **Soporte de Markdown**<br><br>Importa e interpreta archivos locales y Markdown remoto para contenido multilingüe como políticas de privacidad, documentación, etc. Interpreta y haz accesibles los metadatos de Markdown en tu código.<br><br> - [Archivos de contenido](https://intlayer.org/doc/concept/content/file) |
247
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/visual_editor.png?raw=true) | **Editor visual y CMS gratuitos**<br><br>Un editor visual y un CMS gratuitos están disponibles para los escritores de contenido, eliminando la necesidad de una plataforma de localización. Mantén tu contenido sincronizado usando Git, o externalízalo total o parcialmente con el CMS.<br><br> - [Editor de Intlayer](https://intlayer.org/doc/concept/editor) <br> - [CMS de Intlayer](https://intlayer.org/doc/concept/cms) |
248
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/bundle.png?raw=true) | **Contenido eliminable en compilación (Tree-shakable)**<br><br>Contenido eliminable en compilación, reduciendo el tamaño del bundle final. Carga contenido por componente, excluyendo cualquier contenido no utilizado de tu bundle. Soporta la carga diferida (lazy loading) para mejorar la eficiencia de carga de la aplicación.<br><br> - [Optimización de la compilación de aplicaciones](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) | **Renderizado estático**<br><br>No bloquea el renderizado estático.<br><br> - [Integración de Next.js](https://intlayer.org/doc/environment/nextjs) |
250
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/AI_translation.png?raw=true) | **Traducción basada en IA**<br><br>Transforma tu sitio web a 231 idiomas con un solo clic utilizando las herramientas avanzadas de traducción basadas en IA de Intlayer usando tu propio proveedor de IA/clave API.<br><br> - [Integración de CI/CD](https://intlayer.org/doc/concept/ci-cd) <br> - [CLI de Intlayer](https://intlayer.org/doc/concept/cli) <br> - [Autocompletar](https://intlayer.org/doc/concept/auto-fill) |
251
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/mcp.png?raw=true) | **Integración del servidor MCP**<br><br>Proporciona un servidor MCP (Model Context Protocol) para la automatización del IDE, lo que permite una gestión de contenido perfecta y flujos de trabajo de i18n directamente dentro de tu entorno de desarrollo.<br><br> - [Servidor MCP](https://github.com/aymericzip/intlayer/blob/main/docs/es/mcp_server.md) |
252
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/vscode_extension.png?raw=true) | **Extension de VSCode**<br><br>Intlayer proporciona una extensión de VSCode para ayudarte a administrar tu contenido y traducciones, compilar tus diccionarios, traducir tu contenido y más.<br><br> - [Extensión de VSCode](https://intlayer.org/doc/vs-code-extension) |
253
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/interoperability.png?raw=true) | **Interoperabilidad**<br><br>Permite la interoperabilidad con react-i18next, next-i18next, next-intl y react-intl.<br><br> - [Intlayer y react-intl](https://intlayer.org/blog/intlayer-with-react-intl) <br> - [Intlayer y next-intl](https://intlayer.org/blog/intlayer-with-next-intl) <br> - [Intlayer y next-i18next](https://intlayer.org/blog/intlayer-with-next-i18next) |
254
- | Probar traducciones faltantes (CLI/CI) | ✅ CLI: npx intlayer content test (auditoría compatible con CI) |
234
+ | Característica | Descripción |
235
+ | ------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
236
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/frameworks.png?raw=true) | **Soporte Multi-Framework**<br><br>Intlayer es compatible con todos los frameworks y librerías principales, incluidos Next.js, React, Vite, Vue.js, Nuxt, Preact, Express y más. |
237
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/javascript_content_management.jpg?raw=true) | **Administración de contenido basada en JavaScript**<br><br>Aprovecha la flexibilidad de JavaScript para definir y administrar tu contenido de manera eficiente.<br><br> - [Declaración de contenido](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"> | **Compilador**<br><br>El compilador de Intlayer extrae automáticamente el contenido de los componentes y genera los archivos de diccionario.<br><br> - [Compilador](https://intlayer.org/doc/compiler) |
239
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/per_locale_content_declaration_file.png?raw=true) | **Archivo de declaración de contenido por idioma**<br><br>Acelera tu desarrollo declarando tu contenido una vez, antes de la generación automática.<br><br> - [Archivo de declaración de contenido por idioma](https://intlayer.org/doc/concept/per-locale-file) |
240
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/autocompletion.png?raw=true) | **Entorno seguro para tipos**<br><br>Aprovecha TypeScript para garantizar que tus definiciones de contenido y tu código estén libres de errores, mientras te beneficias del autocompletado del IDE.<br><br> - [Configuración de 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) | **Configuración simplificada**<br><br>Ponte en marcha rápidamente con una configuración mínima. Ajusta la configuración de internacionalización, enrutamiento, IA, compilación y manejo de contenido con facilidad.<br><br> - [Explorar la integración de Next.js](https://intlayer.org/doc/environment/nextjs) |
242
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/content_retrieval.png?raw=true) | **Obtención simplificada de contenido**<br><br>No es necesario llamar a tu función `t` para cada fragmento de contenido. Recupera todo tu contenido directamente usando un único hook.<br><br> - [Integración con 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) | **Implementación consistente de componentes de servidor**<br><br>Perfectamente adecuado para los componentes de servidor de Next.js, usa la misma implementación para componentes de cliente y de servidor, sin necesidad de pasar tu función `t` a través de cada componente de servidor.<br><br> - [Componentes de servidor](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) | **Base de código organizada**<br><br>Mantén tu base de código más organizada: 1 componente = 1 diccionario en la misma carpeta. Las traducciones cercanas a sus respectivos componentes mejoran la mantenibilidad y la claridad.<br><br> - [Cómo funciona 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) | **Enrutamiento mejorado**<br><br>Soporte completo de enrutamiento de aplicaciones, adaptándose sin problemas a estructuras de aplicaciones complejas, para Next.js, React, Vite, Vue.js, etc.<br><br> - [Explorar la integración de Next.js](https://intlayer.org/doc/environment/nextjs) |
246
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/markdown.png?raw=true) | **Soporte de Markdown**<br><br>Importa e interpreta archivos locales y Markdown remoto para contenido multilingüe como políticas de privacidad, documentación, etc. Interpreta y haz accesibles los metadatos de Markdown en tu código.<br><br> - [Archivos de contenido](https://intlayer.org/doc/concept/content/file) |
247
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/visual_editor.png?raw=true) | **Editor visual y CMS gratuitos**<br><br>Un editor visual y un CMS gratuitos están disponibles para los escritores de contenido, eliminando la necesidad de una plataforma de localización. Mantén tu contenido sincronizado usando Git, o externalízalo total o parcialmente con el CMS.<br><br> - [Editor de Intlayer](https://intlayer.org/doc/concept/editor) <br> - [CMS de Intlayer](https://intlayer.org/doc/concept/cms) |
248
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/bundle.png?raw=true) | **Contenido eliminable en compilación (Tree-shakable)**<br><br>Contenido eliminable en compilación, reduciendo el tamaño del bundle final. Carga contenido por componente, excluyendo cualquier contenido no utilizado de tu bundle. Soporta la carga diferida (lazy loading) para mejorar la eficiencia de carga de la aplicación.<br><br> - [Optimización de la compilación de aplicaciones](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) | **Renderizado estático**<br><br>No bloquea el renderizado estático.<br><br> - [Integración de Next.js](https://intlayer.org/doc/environment/nextjs) |
250
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/AI_translation.png?raw=true) | **Traducción basada en IA**<br><br>Transforma tu sitio web a 231 idiomas con un solo clic utilizando las herramientas avanzadas de traducción basadas en IA de Intlayer usando tu propio proveedor de IA/clave API.<br><br> - [Integración de CI/CD](https://intlayer.org/doc/concept/ci-cd) <br> - [CLI de Intlayer](https://intlayer.org/doc/concept/cli) <br> - [Autocompletar](https://intlayer.org/doc/concept/auto-fill) |
251
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/mcp.png?raw=true) | **Integración del servidor MCP**<br><br>Proporciona un servidor MCP (Model Context Protocol) para la automatización del IDE, lo que permite una gestión de contenido perfecta y flujos de trabajo de i18n directamente dentro de tu entorno de desarrollo.<br><br> - [Servidor MCP](https://github.com/aymericzip/intlayer/blob/main/docs/es/mcp_server.md) |
252
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/vscode_extension.png?raw=true) | **Extension de VSCode**<br><br>Intlayer proporciona una extensión de VSCode para ayudarte a administrar tu contenido y traducciones, compilar tus diccionarios, traducir tu contenido y más.<br><br> - [Extensión de VSCode](https://intlayer.org/doc/vs-code-extension) |
253
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/interoperability.png?raw=true) | **Interoperabilidad**<br><br>Permite la interoperabilidad con react-i18next, next-i18next, next-intl y react-intl.<br><br> - [Intlayer y react-intl](https://intlayer.org/blog/intlayer-with-react-intl) <br> - [Intlayer y next-intl](https://intlayer.org/blog/intlayer-with-next-intl) <br> - [Intlayer y next-i18next](https://intlayer.org/blog/intlayer-with-next-i18next) <br> - [Adaptadores de compatibilidad de Intlayer](https://intlayer.org/doc/compatibility) |
254
+ | Probar traducciones faltantes (CLI/CI) | ✅ CLI: npx intlayer content test (auditoría compatible con CI) |
255
255
 
256
256
  ## Comparación de Intlayer con otras soluciones
257
257
 
@@ -290,3 +290,5 @@ Las estrellas de GitHub son un fuerte indicador de la popularidad de un proyecto
290
290
  `intlayer` también puede ayudar a gestionar tus espacios de nombres para `react-intl`, `react-i18next`, `next-intl`, `next-i18next` y `vue-i18n`.
291
291
 
292
292
  Usando `intlayer`, puedes declarar tu contenido en el formato de tu biblioteca de i18n favorita, e intlayer generará tus espacios de nombres en la ubicación de tu elección (ejemplo: `/messages/{{locale}}/{{namespace}}.json`).
293
+
294
+ Si deseas seguir usando la API de tu biblioteca i18n actual, `intlayer` también proporciona **adaptadores de compatibilidad (compat adapters)**: paquetes que exponen exactamente la misma API que `react-i18next`, `next-intl`, `react-intl`, `vue-i18n` y otras, pero servidas por los diccionarios de Intlayer. Esto te permite migrar progresivamente sin reescribir tu código. Consulta la [documentación de los adaptadores de compatibilidad](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/compat/index.md).
@@ -404,7 +404,7 @@ export const getLocale = (event: RequestEvent): Locale => {
404
404
  };
405
405
  ```
406
406
 
407
- > `getLocaleFromStorage` verificará la localidad desde el encabezado o la cookie dependiendo de tu configuración. Consulta [Configuración](https://intlayer.org/doc/configuration) para más detalles.
407
+ > `getLocaleFromStorage` verificará la localidad desde el encabezado o la cookie dependiendo de tu configuración. Consulta [Configuración](https://intlayer.org/doc/concept/configuration) para más detalles.
408
408
 
409
409
  > La función `localeDetector` procesará el encabezado `Accept-Language` y devolverá la mejor coincidencia.
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 @@ Como vimos en el Paso 5, puede gestionar los atributos `lang` y `dir` de la etiq
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 (
@@ -271,13 +271,15 @@ Configura tu diseño raíz para admitir la internacionalización mediante el uso
271
271
  ```tsx fileName="src/routes/__root.tsx"
272
272
  import {
273
273
  createRootRouteWithContext,
274
+ getRouteApi,
274
275
  HeadContent,
275
276
  Scripts,
276
277
  } from "@tanstack/react-router";
277
278
  import { defaultLocale, getHTMLTextDir } from "intlayer";
278
279
  import { type ReactNode } from "react";
279
280
  import { IntlayerProvider } from "react-intlayer";
280
- import { Route as LocaleRoute } from "./{-$locale}/route";
281
+
282
+ const localeRoute = getRouteApi("/{-$locale}");
281
283
 
282
284
  export const Route = createRootRouteWithContext<{}>()({
283
285
  head: () => ({
@@ -299,7 +301,7 @@ export const Route = createRootRouteWithContext<{}>()({
299
301
  });
300
302
 
301
303
  function RootDocument({ children }: { children: ReactNode }) {
302
- const params = LocaleRoute.useParams();
304
+ const params = localeRoute.useParams();
303
305
  const locale = params?.locale ?? defaultLocale;
304
306
 
305
307
  return (
@@ -632,7 +634,7 @@ Como se vio en el Paso 5, puedes gestionar los atributos `lang` y `dir` de la et
632
634
 
633
635
  ```tsx fileName="src/routes/__root.tsx"
634
636
  function RootDocument({ children }: { children: ReactNode }) {
635
- const params = LocaleRoute.useParams();
637
+ const params = localeRoute.useParams();
636
638
  const locale = params?.locale ?? defaultLocale;
637
639
 
638
640
  return (