@intlayer/docs 8.10.1 → 8.11.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 (198) hide show
  1. package/blog/en/i18n_using_next-i18next.md +3 -3
  2. package/blog/en/i18n_using_next-intl.md +3 -3
  3. package/blog/en/list_i18n_technologies/frameworks/angular.md +3 -3
  4. package/blog/en/list_i18n_technologies/frameworks/react-native.md +3 -3
  5. package/blog/en/list_i18n_technologies/frameworks/react.md +3 -3
  6. package/blog/en/list_i18n_technologies/frameworks/svelte.md +3 -3
  7. package/blog/en/list_i18n_technologies/frameworks/vue.md +3 -3
  8. package/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +3 -3
  9. package/dist/cjs/common.cjs +3 -1
  10. package/dist/cjs/common.cjs.map +1 -1
  11. package/dist/cjs/generated/blog.entry.cjs +0 -1
  12. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  13. package/dist/cjs/generated/docs.entry.cjs +39 -20
  14. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  15. package/dist/cjs/generated/frequentQuestions.entry.cjs +0 -1
  16. package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
  17. package/dist/cjs/generated/legal.entry.cjs +0 -1
  18. package/dist/cjs/generated/legal.entry.cjs.map +1 -1
  19. package/dist/esm/common.mjs +3 -1
  20. package/dist/esm/common.mjs.map +1 -1
  21. package/dist/esm/generated/docs.entry.mjs +39 -19
  22. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  23. package/dist/types/common.d.ts.map +1 -1
  24. package/dist/types/generated/docs.entry.d.ts +2 -1
  25. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  26. package/docs/ar/benchmark/nextjs.md +1 -1
  27. package/docs/ar/benchmark/solid.md +1 -1
  28. package/docs/ar/benchmark/svelte.md +1 -1
  29. package/docs/ar/benchmark/tanstack.md +1 -1
  30. package/docs/ar/dictionary/markdown.md +165 -7
  31. package/docs/ar/{intlayer_with_angular.md → intlayer_with_angular_19.md} +8 -7
  32. package/docs/ar/intlayer_with_angular_21.md +412 -0
  33. package/docs/bn/intlayer_with_angular_21.md +412 -0
  34. package/docs/cs/intlayer_with_angular_21.md +412 -0
  35. package/docs/de/benchmark/nextjs.md +1 -1
  36. package/docs/de/benchmark/solid.md +1 -1
  37. package/docs/de/benchmark/svelte.md +1 -1
  38. package/docs/de/benchmark/tanstack.md +1 -1
  39. package/docs/de/dictionary/markdown.md +165 -7
  40. package/docs/de/{intlayer_with_angular.md → intlayer_with_angular_19.md} +8 -7
  41. package/docs/de/intlayer_with_angular_21.md +412 -0
  42. package/docs/en/benchmark/nextjs.md +1 -1
  43. package/docs/en/benchmark/solid.md +1 -1
  44. package/docs/en/benchmark/svelte.md +1 -1
  45. package/docs/en/benchmark/tanstack.md +1 -1
  46. package/docs/en/dictionary/markdown.md +167 -7
  47. package/docs/en/intlayer_with_adonisjs.md +3 -3
  48. package/docs/en/intlayer_with_analog.md +3 -3
  49. package/docs/en/{intlayer_with_angular.md → intlayer_with_angular_19.md} +10 -9
  50. package/docs/en/intlayer_with_angular_21.md +412 -0
  51. package/docs/en/intlayer_with_astro.md +3 -3
  52. package/docs/en/intlayer_with_astro_lit.md +3 -3
  53. package/docs/en/intlayer_with_astro_preact.md +3 -3
  54. package/docs/en/intlayer_with_astro_react.md +3 -3
  55. package/docs/en/intlayer_with_astro_solid.md +3 -3
  56. package/docs/en/intlayer_with_astro_svelte.md +3 -3
  57. package/docs/en/intlayer_with_astro_vanilla.md +3 -3
  58. package/docs/en/intlayer_with_astro_vue.md +3 -3
  59. package/docs/en/intlayer_with_create_react_app.md +3 -3
  60. package/docs/en/intlayer_with_express.md +3 -3
  61. package/docs/en/intlayer_with_fastify.md +3 -3
  62. package/docs/en/intlayer_with_hono.md +3 -3
  63. package/docs/en/intlayer_with_lynx+react.md +3 -3
  64. package/docs/en/intlayer_with_nestjs.md +3 -3
  65. package/docs/en/intlayer_with_next-i18next.md +3 -3
  66. package/docs/en/intlayer_with_next-intl.md +3 -3
  67. package/docs/en/intlayer_with_nextjs_14.md +3 -3
  68. package/docs/en/intlayer_with_nextjs_15.md +3 -3
  69. package/docs/en/intlayer_with_nextjs_16.md +3 -3
  70. package/docs/en/intlayer_with_nextjs_compiler.md +3 -3
  71. package/docs/en/intlayer_with_nextjs_no_locale_path.md +3 -3
  72. package/docs/en/intlayer_with_nextjs_page_router.md +3 -3
  73. package/docs/en/intlayer_with_nuxt.md +3 -3
  74. package/docs/en/intlayer_with_react_native+expo.md +3 -3
  75. package/docs/en/intlayer_with_react_router_v7.md +3 -3
  76. package/docs/en/intlayer_with_react_router_v7_fs_routes.md +3 -3
  77. package/docs/en/intlayer_with_svelte_kit.md +3 -3
  78. package/docs/en/intlayer_with_tanstack+solid.md +3 -3
  79. package/docs/en/intlayer_with_tanstack.md +3 -3
  80. package/docs/en/intlayer_with_vanilla.md +3 -3
  81. package/docs/en/intlayer_with_vite+lit.md +3 -3
  82. package/docs/en/intlayer_with_vite+preact.md +3 -3
  83. package/docs/en/intlayer_with_vite+react.md +3 -3
  84. package/docs/en/intlayer_with_vite+react_compiler.md +3 -3
  85. package/docs/en/intlayer_with_vite+solid.md +3 -3
  86. package/docs/en/intlayer_with_vite+svelte.md +3 -3
  87. package/docs/en/intlayer_with_vite+vanilla.md +3 -3
  88. package/docs/en/intlayer_with_vite+vue.md +3 -3
  89. package/docs/en-GB/benchmark/nextjs.md +1 -1
  90. package/docs/en-GB/benchmark/solid.md +1 -1
  91. package/docs/en-GB/benchmark/svelte.md +1 -1
  92. package/docs/en-GB/benchmark/tanstack.md +1 -1
  93. package/docs/en-GB/dictionary/markdown.md +161 -0
  94. package/docs/en-GB/{intlayer_with_angular.md → intlayer_with_angular_19.md} +8 -7
  95. package/docs/en-GB/intlayer_with_angular_21.md +412 -0
  96. package/docs/es/benchmark/nextjs.md +1 -1
  97. package/docs/es/benchmark/solid.md +1 -1
  98. package/docs/es/benchmark/svelte.md +1 -1
  99. package/docs/es/benchmark/tanstack.md +1 -1
  100. package/docs/es/dictionary/markdown.md +165 -7
  101. package/docs/es/{intlayer_with_angular.md → intlayer_with_angular_19.md} +8 -7
  102. package/docs/es/intlayer_with_angular_21.md +412 -0
  103. package/docs/fr/benchmark/nextjs.md +1 -1
  104. package/docs/fr/benchmark/solid.md +1 -1
  105. package/docs/fr/benchmark/svelte.md +1 -1
  106. package/docs/fr/benchmark/tanstack.md +1 -1
  107. package/docs/fr/dictionary/markdown.md +165 -7
  108. package/docs/fr/{intlayer_with_angular.md → intlayer_with_angular_19.md} +8 -7
  109. package/docs/fr/intlayer_with_angular_21.md +412 -0
  110. package/docs/hi/benchmark/nextjs.md +1 -1
  111. package/docs/hi/benchmark/solid.md +1 -1
  112. package/docs/hi/benchmark/svelte.md +1 -1
  113. package/docs/hi/benchmark/tanstack.md +1 -1
  114. package/docs/hi/dictionary/markdown.md +165 -7
  115. package/docs/hi/{intlayer_with_angular.md → intlayer_with_angular_19.md} +8 -7
  116. package/docs/hi/intlayer_with_angular_21.md +412 -0
  117. package/docs/id/benchmark/nextjs.md +1 -1
  118. package/docs/id/benchmark/solid.md +1 -1
  119. package/docs/id/benchmark/svelte.md +1 -1
  120. package/docs/id/benchmark/tanstack.md +1 -1
  121. package/docs/id/dictionary/markdown.md +165 -7
  122. package/docs/id/{intlayer_with_angular.md → intlayer_with_angular_19.md} +8 -7
  123. package/docs/id/intlayer_with_angular_21.md +412 -0
  124. package/docs/it/benchmark/nextjs.md +1 -1
  125. package/docs/it/benchmark/solid.md +1 -1
  126. package/docs/it/benchmark/svelte.md +1 -1
  127. package/docs/it/benchmark/tanstack.md +1 -1
  128. package/docs/it/dictionary/markdown.md +165 -7
  129. package/docs/it/{intlayer_with_angular.md → intlayer_with_angular_19.md} +8 -7
  130. package/docs/it/intlayer_with_angular_21.md +412 -0
  131. package/docs/ja/benchmark/nextjs.md +1 -1
  132. package/docs/ja/benchmark/solid.md +1 -1
  133. package/docs/ja/benchmark/svelte.md +1 -1
  134. package/docs/ja/benchmark/tanstack.md +1 -1
  135. package/docs/ja/{intlayer_with_angular.md → intlayer_with_angular_19.md} +8 -7
  136. package/docs/ja/intlayer_with_angular_21.md +412 -0
  137. package/docs/ko/benchmark/nextjs.md +1 -1
  138. package/docs/ko/benchmark/solid.md +1 -1
  139. package/docs/ko/benchmark/svelte.md +1 -1
  140. package/docs/ko/benchmark/tanstack.md +1 -1
  141. package/docs/ko/dictionary/markdown.md +165 -7
  142. package/docs/ko/{intlayer_with_angular.md → intlayer_with_angular_19.md} +8 -7
  143. package/docs/ko/intlayer_with_angular_21.md +412 -0
  144. package/docs/nl/intlayer_with_angular_21.md +412 -0
  145. package/docs/pl/benchmark/nextjs.md +1 -1
  146. package/docs/pl/benchmark/solid.md +1 -1
  147. package/docs/pl/benchmark/svelte.md +1 -1
  148. package/docs/pl/benchmark/tanstack.md +1 -1
  149. package/docs/pl/dictionary/markdown.md +165 -7
  150. package/docs/pl/{intlayer_with_angular.md → intlayer_with_angular_19.md} +8 -7
  151. package/docs/pl/intlayer_with_angular_21.md +412 -0
  152. package/docs/pt/benchmark/nextjs.md +1 -1
  153. package/docs/pt/benchmark/solid.md +1 -1
  154. package/docs/pt/benchmark/svelte.md +1 -1
  155. package/docs/pt/benchmark/tanstack.md +1 -1
  156. package/docs/pt/dictionary/markdown.md +165 -7
  157. package/docs/pt/{intlayer_with_angular.md → intlayer_with_angular_19.md} +8 -7
  158. package/docs/pt/intlayer_with_angular_21.md +412 -0
  159. package/docs/ru/benchmark/nextjs.md +1 -1
  160. package/docs/ru/benchmark/solid.md +1 -1
  161. package/docs/ru/benchmark/svelte.md +1 -1
  162. package/docs/ru/benchmark/tanstack.md +1 -1
  163. package/docs/ru/dictionary/markdown.md +161 -0
  164. package/docs/ru/{intlayer_with_angular.md → intlayer_with_angular_19.md} +8 -7
  165. package/docs/ru/intlayer_with_angular_21.md +412 -0
  166. package/docs/tr/benchmark/nextjs.md +1 -1
  167. package/docs/tr/benchmark/solid.md +1 -1
  168. package/docs/tr/benchmark/svelte.md +1 -1
  169. package/docs/tr/benchmark/tanstack.md +1 -1
  170. package/docs/tr/dictionary/markdown.md +165 -7
  171. package/docs/tr/{intlayer_with_angular.md → intlayer_with_angular_19.md} +8 -7
  172. package/docs/tr/intlayer_with_angular_21.md +412 -0
  173. package/docs/uk/benchmark/nextjs.md +1 -1
  174. package/docs/uk/benchmark/solid.md +1 -1
  175. package/docs/uk/benchmark/svelte.md +1 -1
  176. package/docs/uk/benchmark/tanstack.md +1 -1
  177. package/docs/uk/dictionary/markdown.md +165 -7
  178. package/docs/uk/{intlayer_with_angular.md → intlayer_with_angular_19.md} +8 -7
  179. package/docs/uk/intlayer_with_angular_21.md +412 -0
  180. package/docs/ur/intlayer_with_angular_21.md +412 -0
  181. package/docs/vi/benchmark/nextjs.md +1 -1
  182. package/docs/vi/benchmark/solid.md +1 -1
  183. package/docs/vi/benchmark/svelte.md +1 -1
  184. package/docs/vi/benchmark/tanstack.md +1 -1
  185. package/docs/vi/dictionary/markdown.md +165 -7
  186. package/docs/vi/{intlayer_with_angular.md → intlayer_with_angular_19.md} +8 -7
  187. package/docs/vi/intlayer_with_angular_21.md +412 -0
  188. package/docs/zh/benchmark/nextjs.md +1 -1
  189. package/docs/zh/benchmark/solid.md +1 -1
  190. package/docs/zh/benchmark/svelte.md +1 -1
  191. package/docs/zh/benchmark/tanstack.md +1 -1
  192. package/docs/zh/dictionary/markdown.md +165 -7
  193. package/docs/zh/{intlayer_with_angular.md → intlayer_with_angular_19.md} +8 -7
  194. package/docs/zh/intlayer_with_angular_21.md +412 -0
  195. package/docs/zh-TW/intlayer_with_angular_21.md +412 -0
  196. package/package.json +7 -7
  197. package/src/common.ts +12 -6
  198. package/src/generated/docs.entry.ts +39 -19
@@ -17,6 +17,9 @@ slugs:
17
17
  - content
18
18
  - markdown
19
19
  history:
20
+ - version: 8.11.0
21
+ date: 2026-05-28
22
+ changes: "Permitir a pré-análise do AST do Markdown para SSR / hidratação"
20
23
  - version: 8.10.0
21
24
  date: 2026-05-19
22
25
  changes: "Adicionado suporte a arquivos `.content.md`"
@@ -66,13 +69,10 @@ Você pode declarar conteúdo Markdown usando a função `md` ou simplesmente co
66
69
  Exemplo de estrutura de diretórios:
67
70
 
68
71
  ```text
69
- content/
70
- ├── en/
71
- │ └── markdown-file.en.content.md
72
- ├── fr/
73
- │ └── markdown-file.fr.content.md
74
- └── es/
75
- └── markdown-file.es.content.md
72
+ content
73
+ ├── markdown-file.en.content.md
74
+ ├── markdown-file.fr.content.md
75
+ └── markdown-file.es.content.md
76
76
  ```
77
77
 
78
78
  Você pode adicionar no front-matter quaisquer propriedades definidas na [Definição de Dicionário](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/dictionary/content_file.md)
@@ -1152,6 +1152,164 @@ export class MyComponent {
1152
1152
 
1153
1153
  ---
1154
1154
 
1155
+ ## Renderização no Lado do Servidor (SSR) e Hidratação
1156
+
1157
+ Em comparação com outros analisadores de Markdown, como remark / rehype, o Intlayer Markdown é livre de dependências e roda tanto no cliente quanto no servidor.
1158
+
1159
+ No entanto, o Intlayer otimiza a análise para frameworks de Renderização no Lado do Servidor (SSR) (como Next.js App Router, React Router, Nuxt, SvelteKit, etc.).
1160
+
1161
+ Em vez de enviar strings Markdown brutas para o cliente e analisá-las no navegador (o que acarreta uma perda de desempenho), o Intlayer permite pré-analisar o Markdown em uma Árvore de Sintaxe Abstrata (AST) no servidor.
1162
+
1163
+ Você pode usar a função `parseMarkdown` do pacote Intlayer do seu framework no lado do servidor para gerar uma AST serializável (objeto `ParsedMarkdown`) e passá-la diretamente para o frontend. Todos os utilitários de renderização do Intlayer (como `<MarkdownRenderer>`, `useMarkdownRenderer`, etc.) aceitam automaticamente esse objeto AST e o renderizam perfeitamente.
1164
+
1165
+ ### Exemplo em uma Arquitetura Servidor/Cliente
1166
+
1167
+ <Tabs group="framework">
1168
+ <Tab label="React Router" value="react">
1169
+
1170
+ ```tsx fileName="server.ts"
1171
+ import { parseMarkdown } from "react-intlayer/markdown";
1172
+
1173
+ // 1. No servidor: Analisar o markdown em uma AST serializável
1174
+ export const loader = async () => {
1175
+ const markdownString = "## My title \n\nLorem Ipsum";
1176
+ const ast = parseMarkdown(markdownString);
1177
+
1178
+ // Retornar a AST como JSON para o cliente
1179
+ return Response.json({ content: ast });
1180
+ };
1181
+ ```
1182
+
1183
+ ```tsx fileName="client.tsx"
1184
+ import { useLoaderData } from "react-router";
1185
+ import { MarkdownRenderer } from "react-intlayer/markdown";
1186
+
1187
+ // 2. No cliente: Renderizar a AST diretamente sem reanalisar
1188
+ export default function Page() {
1189
+ const { content } = useLoaderData();
1190
+
1191
+ // O renderizador aceita uma string bruta ou a AST analisada
1192
+ return <MarkdownRenderer content={content} />;
1193
+ }
1194
+ ```
1195
+
1196
+ </Tab>
1197
+ <Tab label="Next.js" value="nextjs">
1198
+
1199
+ ```tsx fileName="app/page.tsx"
1200
+ import { parseMarkdown } from "next-intlayer/markdown";
1201
+ import { MarkdownRenderer } from "next-intlayer/markdown";
1202
+
1203
+ export default async function Page() {
1204
+ // 1. Analisar o markdown em uma AST serializável no servidor
1205
+ const markdownString = "## My title \n\nLorem Ipsum";
1206
+ const ast = parseMarkdown(markdownString);
1207
+
1208
+ // 2. Renderizar a AST diretamente
1209
+ // Em um Server Component, isso funciona perfeitamente e passa a AST
1210
+ // diretamente para os componentes de cliente subjacentes, se necessário.
1211
+ return <MarkdownRenderer content={ast} />;
1212
+ }
1213
+ ```
1214
+
1215
+ </Tab>
1216
+ <Tab label="Vue / Nuxt" value="vue">
1217
+
1218
+ ```vue fileName="pages/index.vue"
1219
+ <script setup lang="ts">
1220
+ import { parseMarkdown } from "vue-intlayer/markdown";
1221
+ import { MarkdownRenderer } from "vue-intlayer/markdown";
1222
+
1223
+ // 1. Buscar e analisar o markdown em uma AST no servidor
1224
+ const { data: ast } = await useAsyncData('markdown', () => {
1225
+ const markdownString = "## My title \n\nLorem Ipsum";
1226
+ return parseMarkdown(markdownString);
1227
+ });
1228
+ </script>
1229
+
1230
+ <template>
1231
+ <!-- 2. No cliente: Renderizar a AST diretamente sem reanalisar -->
1232
+ <MarkdownRenderer :content="ast" />
1233
+ </template>
1234
+ ```
1235
+
1236
+ </Tab>
1237
+ <Tab label="SvelteKit" value="svelte">
1238
+
1239
+ ```typescript fileName="+page.server.ts"
1240
+ import { parseMarkdown } from "svelte-intlayer/markdown";
1241
+
1242
+ // 1. No servidor: Analisar o markdown em uma AST serializável
1243
+ export const load = async () => {
1244
+ const markdownString = "## My title \n\nLorem Ipsum";
1245
+ const ast = parseMarkdown(markdownString);
1246
+
1247
+ // Retornar a AST para o cliente
1248
+ return { content: ast };
1249
+ };
1250
+ ```
1251
+
1252
+ ```svelte fileName="+page.svelte"
1253
+ <script lang="ts">
1254
+ import { MarkdownRenderer } from "svelte-intlayer/markdown";
1255
+ export let data;
1256
+ </script>
1257
+
1258
+ <!-- 2. No cliente: Renderizar a AST diretamente sem reanalisar -->
1259
+ <MarkdownRenderer value={data.content} />
1260
+ ```
1261
+
1262
+ </Tab>
1263
+ <Tab label="Angular" value="angular">
1264
+
1265
+ O SSR do Angular normalmente resolve os dados no servidor durante o carregamento inicial e hidrata no cliente. Você pode usar resolvers para passar a AST.
1266
+
1267
+ ```typescript fileName="app.resolver.ts"
1268
+ import { Injectable } from "@angular/core";
1269
+ import { Resolve } from "@angular/router";
1270
+ import { parseMarkdown, type ParsedMarkdown } from "angular-intlayer/markdown";
1271
+
1272
+ @Injectable({ providedIn: "root" })
1273
+ export class MarkdownResolver implements Resolve<ParsedMarkdown> {
1274
+ resolve(): ParsedMarkdown {
1275
+ const markdownString = "## My title \n\nLorem Ipsum";
1276
+ // 1. No servidor: Analisar o markdown em uma AST serializável
1277
+ return parseMarkdown(markdownString);
1278
+ }
1279
+ }
1280
+ ```
1281
+
1282
+ ```typescript fileName="app.component.ts"
1283
+ import { Component } from "@angular/core";
1284
+ import { ActivatedRoute } from "@angular/router";
1285
+ import { IntlayerMarkdownService, type ParsedMarkdown } from "angular-intlayer/markdown";
1286
+
1287
+ @Component({
1288
+ selector: "app-root",
1289
+ template: `<div [innerHTML]="renderedMarkdown"></div>`,
1290
+ })
1291
+ export class AppComponent {
1292
+ renderedMarkdown: string = "";
1293
+
1294
+ constructor(
1295
+ private route: ActivatedRoute,
1296
+ private markdownService: IntlayerMarkdownService
1297
+ ) {
1298
+ // 2. No cliente: Renderizar a AST diretamente sem reanalisar
1299
+ this.route.data.subscribe((data) => {
1300
+ this.renderedMarkdown = this.markdownService.renderMarkdown(
1301
+ data.markdownAst
1302
+ ) as string;
1303
+ });
1304
+ }
1305
+ }
1306
+ ```
1307
+
1308
+ </Tab>
1309
+ </Tabs>
1310
+
1311
+ Esse padrão garante que a lógica de análise do Markdown seja executada inteiramente no servidor, reduzindo significativamente o tempo de execução no cliente e melhorando a velocidade de hidratação inicial.
1312
+
1155
1313
  ## Referência de opções
1156
1314
 
1157
1315
  Essas opções podem ser passadas para `MarkdownProvider`, `MarkdownRenderer`, `useMarkdownRenderer` e `renderMarkdown`.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  createdAt: 2025-04-18
3
3
  updatedAt: 2026-05-06
4
- title: Angular i18n - Como traduzir um app Angular em 2026
4
+ title: Angular i18n - Como traduzir um app Angular 19 (Webpack)
5
5
  description: Descubra como tornar seu site Angular multilíngue. Siga a documentação para internacionalizar (i18n) e traduzi-lo.
6
6
  keywords:
7
7
  - Internacionalização
@@ -13,8 +13,9 @@ slugs:
13
13
  - doc
14
14
  - environment
15
15
  - angular
16
- applicationTemplate: https://github.com/aymericzip/intlayer-angular-template
17
- applicationShowcase: https://intlayer-angular-template.vercel.app
16
+ - 19
17
+ applicationTemplate: https://github.com/aymericzip/intlayer-angular-19-template
18
+ applicationShowcase: https://intlayer-angular-19-template.vercel.app
18
19
  history:
19
20
  - version: 8.9.0
20
21
  date: 2026-05-04
@@ -27,7 +28,7 @@ history:
27
28
  changes: "Histórico inicial"
28
29
  ---
29
30
 
30
- # Traduza seu site Angular usando Intlayer | Internacionalização (i18n)
31
+ # Traduza seu site Angular 19 (Webpack) usando Intlayer | Internacionalização (i18n)
31
32
 
32
33
  ## Tabela de Conteúdos
33
34
 
@@ -52,7 +53,7 @@ Com o Intlayer, você pode:
52
53
  <Tab label="Código" value="code">
53
54
 
54
55
  <iframe
55
- src="https://ide.intlayer.org/aymericzip/intlayer-angular-template?file=intlayer.config.ts"
56
+ src="https://ide.intlayer.org/aymericzip/intlayer-angular-19-template?file=intlayer.config.ts"
56
57
  className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
57
58
  title="Demo CodeSandbox - Como internacionalizar sua aplicação usando Intlayer"
58
59
  sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
@@ -63,7 +64,7 @@ Com o Intlayer, você pode:
63
64
  <Tab label="Demo" value="demo">
64
65
 
65
66
  <iframe
66
- src="https://intlayer-angular-template.vercel.app"
67
+ src="https://intlayer-angular-19-template.vercel.app"
67
68
  className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
68
69
  title="Demo - intlayer-angular-template"
69
70
  sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
@@ -73,7 +74,7 @@ Com o Intlayer, você pode:
73
74
  </Tab>
74
75
  </Tabs>
75
76
 
76
- Veja o [Modelo de Aplicação](https://github.com/aymericzip/intlayer-angular-template) no GitHub.
77
+ Veja o [Modelo de Aplicação](https://github.com/aymericzip/intlayer-angular-19-template) no GitHub.
77
78
 
78
79
  ### Passo 1: Instalar Dependências
79
80
 
@@ -0,0 +1,412 @@
1
+ ---
2
+ createdAt: 2025-04-18
3
+ updatedAt: 2026-05-06
4
+ title: Angular i18n - Como traduzir um aplicativo Angular 21 (Vite) em 2026
5
+ description: Descubra como tornar seu site Angular multilíngue. Siga a documentação para internacionalizá-lo (i18n) e traduzi-lo.
6
+ keywords:
7
+ - Internacionalização
8
+ - Documentação
9
+ - Intlayer
10
+ - Angular
11
+ - JavaScript
12
+ slugs:
13
+ - doc
14
+ - environment
15
+ - angular
16
+ applicationTemplate: https://github.com/aymericzip/intlayer-angular-21-template
17
+ applicationShowcase: https://intlayer-angular-21-template.vercel.app/
18
+ history:
19
+ - version: 8.9.0
20
+ date: 2026-05-04
21
+ changes: "Atualizar o uso da API useIntlayer do Solid para acesso direto a propriedades"
22
+ - version: 8.0.0
23
+ date: 2026-01-26
24
+ changes: "Lançamento da versão estável"
25
+ - version: 8.0.0
26
+ date: 2025-12-30
27
+ changes: "Adicionar comando init"
28
+ - version: 5.5.10
29
+ date: 2025-06-29
30
+ changes: "Histórico inicial"
31
+ ---
32
+
33
+ # Traduza seu site Angular 21 (Vite) usando Intlayer | Internacionalização (i18n)
34
+
35
+ ## Índice
36
+
37
+ <TOC/>
38
+
39
+ ## O que é Intlayer?
40
+
41
+ **Intlayer** é uma biblioteca inovadora e de código aberto de internacionalização (i18n) projetada para simplificar o suporte multilíngue em aplicações web modernas.
42
+
43
+ Com Intlayer, você pode:
44
+
45
+ - **Gerenciar traduções facilmente** usando dicionários declarativos no nível do componente.
46
+ - **Localizar metadados dinamicamente**, rotas e conteúdo.
47
+ - **Garantir o suporte ao TypeScript** com tipos gerados automaticamente, melhorando o preenchimento automático e a detecção de erros.
48
+ - **Beneficiar-se de recursos avançados**, como detecção dinâmica e alternância de localidade.
49
+
50
+ ---
51
+
52
+ ## Guia Passo a Passo para Configurar o Intlayer em uma Aplicação Angular
53
+
54
+ <Tabs defaultTab="code">
55
+ <Tab label="Código" value="code">
56
+
57
+ <iframe
58
+ src="https://ide.intlayer.org/aymericzip/intlayer-angular-21-template?file=intlayer.config.ts"
59
+ className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
60
+ title="Demo CodeSandbox - Como internacionalizar sua aplicação usando Intlayer"
61
+ sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
62
+ loading="lazy"
63
+ />
64
+
65
+ </Tab>
66
+ <Tab label="Demonstração" value="demo">
67
+
68
+ <iframe
69
+ src="https://intlayer-angular-21-template.vercel.app/"
70
+ className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
71
+ title="Demo - intlayer-angular-template"
72
+ sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
73
+ loading="lazy"
74
+ />
75
+
76
+ </Tab>
77
+ </Tabs>
78
+
79
+ Veja o [Modelo de Aplicação](https://github.com/aymericzip/intlayer-angular-21-template) no GitHub.
80
+
81
+ ### Passo 1: Instalar Dependências
82
+
83
+ Instale os pacotes necessários usando o npm:
84
+
85
+ ```bash packageManager="npm"
86
+ npm install intlayer angular-intlayer
87
+ npm install @angular-builders/custom-esbuild --save-dev
88
+ npx intlayer init
89
+ ```
90
+
91
+ ```bash packageManager="pnpm"
92
+ pnpm add intlayer angular-intlayer
93
+ pnpm add @angular-builders/custom-esbuild --save-dev
94
+ pnpm intlayer init
95
+ ```
96
+
97
+ ```bash packageManager="yarn"
98
+ yarn add intlayer angular-intlayer
99
+ yarn add @angular-builders/custom-esbuild --save-dev
100
+ yarn intlayer init
101
+ ```
102
+
103
+ ```bash packageManager="bun"
104
+ bun add intlayer angular-intlayer
105
+ bun add @angular-builders/custom-esbuild --dev
106
+ bun x intlayer init
107
+ ```
108
+
109
+ - **intlayer**
110
+
111
+ O pacote principal que fornece ferramentas de internacionalização para gerenciamento de configuração, tradução, [declaração de conteúdo](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/dictionary/content_file.md), transpilação e [comandos CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/cli/index.md).
112
+
113
+ - **angular-intlayer**
114
+ O pacote que integra o Intlayer à aplicação Angular. Ele fornece provedores de contexto e hooks para internacionalização Angular.
115
+
116
+ - **@angular-builders/custom-esbuild**
117
+ Necessário para personalizar a configuração esbuild da Angular CLI.
118
+
119
+ ### Passo 2: Configuração do seu projeto
120
+
121
+ Crie um arquivo de configuração para configurar os idiomas da sua aplicação:
122
+
123
+ ```typescript fileName="intlayer.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
124
+ import { Locales, type IntlayerConfig } from "intlayer";
125
+
126
+ const config: IntlayerConfig = {
127
+ internationalization: {
128
+ locales: [
129
+ Locales.ENGLISH,
130
+ Locales.FRENCH,
131
+ Locales.SPANISH,
132
+ // Seus outros idiomas
133
+ ],
134
+ defaultLocale: Locales.ENGLISH,
135
+ },
136
+ };
137
+
138
+ export default config;
139
+ ```
140
+
141
+ > Por meio desse arquivo de configuração, você pode configurar URLs localizadas, redirecionamento de middleware, nomes de cookies, a localização e a extensão de suas declarações de conteúdo, desabilitar os logs do Intlayer no console e muito mais. Para uma lista completa dos parâmetros disponíveis, consulte a [documentação de configuração](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/configuration.md).
142
+
143
+ ### Passo 3: Integrar o Intlayer na sua Configuração Angular
144
+
145
+ Para integrar o Intlayer com o Angular CLI, você precisa usar um builder personalizado. Este guia assume que você está usando Vite/esbuild (padrão para projetos Angular 21).
146
+
147
+ Primeiro, modifique seu `angular.json` para usar o construtor esbuild personalizado. Atualize as configurações `build` e `serve`:
148
+
149
+ ```json5 fileName="angular.json"
150
+ {
151
+ "projects": {
152
+ "your-app-name": {
153
+ "architect": {
154
+ "build": {
155
+ "builder": "@angular-builders/custom-esbuild:application", // replace "@angular/build:application"
156
+ "options": {
157
+ "define": {
158
+ "process.env": "{}",
159
+ },
160
+ "plugins": ["./esbuild.plugins.ts"],
161
+ "browser": "src/main.ts",
162
+ // ...
163
+ },
164
+ },
165
+ "serve": {
166
+ "builder": "@angular-builders/custom-esbuild:dev-server", // replace "@angular/build:dev-server"
167
+ "options": {
168
+ "prebundle": {
169
+ "exclude": [
170
+ "intlayer",
171
+ "angular-intlayer",
172
+ "@intlayer/config/built",
173
+ "@intlayer/core"
174
+ ]
175
+ },
176
+ },
177
+ },
178
+ },
179
+ },
180
+ }
181
+ ```
182
+
183
+ > Certifique-se de substituir `your-app-name` pelo nome real do seu projeto em `angular.json`.
184
+
185
+ Em seguida, crie um arquivo `esbuild.plugins.ts` na raiz do seu projeto:
186
+
187
+ ```typescript fileName="esbuild.plugins.ts"
188
+ import { intlayerEsbuildPlugin } from "angular-intlayer/esbuild";
189
+
190
+ export default [intlayerEsbuildPlugin()];
191
+ ```
192
+
193
+ > A função `intlayerEsbuildPlugin` configura o esbuild com o Intlayer. Ela injeta o plugin para gerenciar arquivos de declaração de conteúdo e configura alias para desempenho ideal.
194
+
195
+ > **Usuários do NX**: Os construtores Angular do NX carregam arquivos de plug-in por meio da resolução ESM nativa do Node e não compilam arquivos de plug-in TypeScript dinamicamente. Use um arquivo `.mjs` e atualize a referência `plugins` no `angular.json` de acordo:
196
+ >
197
+ > ```javascript fileName="esbuild.plugins.mjs"
198
+ > import { intlayerEsbuildPlugin } from "angular-intlayer/esbuild";
199
+ >
200
+ > export default [intlayerEsbuildPlugin()];
201
+ > ```
202
+ >
203
+ > Em seguida, no `angular.json`, aponte para `"./esbuild.plugins.mjs"` em vez de `"./esbuild.plugins.ts"`.
204
+
205
+ ### Passo 4: Declare seu Conteúdo
206
+
207
+ Crie e gerencie suas declarações de conteúdo para armazenar traduções:
208
+
209
+ ```tsx fileName="src/app/app.content.ts" contentDeclarationFormat=["typescript", "esm", "cjs"]
210
+ import { t, type Dictionary } from "intlayer";
211
+
212
+ const appContent = {
213
+ key: "app",
214
+ content: {
215
+ title: t({
216
+ en: "Hello",
217
+ fr: "Bonjour",
218
+ es: "Hola",
219
+ }),
220
+ congratulations: t({
221
+ en: "Congratulations! Your app is running. 🎉",
222
+ fr: "Félicitations! Votre application est en cours d'exécution. 🎉",
223
+ es: "¡Felicidades! Tu aplicación está en ejecución. 🎉",
224
+ }),
225
+ exploreDocs: t({
226
+ en: "Explore the Docs",
227
+ fr: "Explorer les Docs",
228
+ es: "Explorar los Docs",
229
+ }),
230
+ learnWithTutorials: t({
231
+ en: "Learn with Tutorials",
232
+ fr: "Apprendre com Tutoriels",
233
+ es: "Aprender con los Tutorios",
234
+ }),
235
+ cliDocs: "CLI Docs",
236
+ angularLanguageService: t({
237
+ en: "Angular Language Service",
238
+ fr: "Service de Langage Angular",
239
+ es: "Servicio de Lenguaje Angular",
240
+ }),
241
+ angularDevTools: "Angular DevTools",
242
+ github: "Github",
243
+ twitter: "Twitter",
244
+ youtube: "Youtube",
245
+ },
246
+ } satisfies Dictionary;
247
+
248
+ export default appContent;
249
+ ```
250
+
251
+ > Suas declarações de conteúdo podem ser definidas em qualquer lugar de sua aplicação, desde que sejam incluídas no diretório `contentDir` (por padrão, `./src`). E que correspondam à extensão do arquivo de declaração de conteúdo (por padrão, `.content.{json,ts,tsx,js,jsx,mjs,cjs}`).
252
+
253
+ > Para mais detalhes, consulte a [documentação de declaração de conteúdo](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/dictionary/content_file.md).
254
+
255
+ ### Passo 5: Utilize o Intlayer no seu Código
256
+
257
+ Para utilizar os recursos de internacionalização do Intlayer em toda a sua aplicação Angular, você precisa fornecer o Intlayer na configuração da sua aplicação.
258
+
259
+ ```typescript fileName="src/app/app.config.ts"
260
+ import { ApplicationConfig } from "@angular/core";
261
+ import { provideRouter } from "@angular/router";
262
+ import { provideIntlayer } from "angular-intlayer";
263
+ import { routes } from "./app.routes";
264
+
265
+ export const appConfig: ApplicationConfig = {
266
+ providers: [
267
+ provideRouter(routes),
268
+ provideIntlayer(), // Adicione o provedor Intlayer aqui
269
+ ],
270
+ };
271
+ ```
272
+
273
+ Em seguida, você pode usar a função `useIntlayer` em qualquer componente.
274
+
275
+ ```typescript fileName="src/app/app.component.ts"
276
+ import { Component } from "@angular/core";
277
+ import { RouterOutlet } from "@angular/router";
278
+ import { useIntlayer } from "angular-intlayer";
279
+
280
+ @Component({
281
+ selector: "app-root",
282
+ standalone: true,
283
+ imports: [RouterOutlet],
284
+ templateUrl: "./app.component.html",
285
+ styleUrl: "./app.component.css",
286
+ })
287
+ export class AppComponent {
288
+ content = useIntlayer("app");
289
+ }
290
+ ```
291
+
292
+ E no seu template:
293
+
294
+ ```html fileName="src/app/app.component.html"
295
+ <div class="content">
296
+ <h1>{{ content().title }}</h1>
297
+ <p>{{ content().congratulations }}</p>
298
+ </div>
299
+ ```
300
+
301
+ O conteúdo Intlayer é retornado como um `Signal`, então você acessa os valores chamando o sinal: `content().title`.
302
+
303
+ ### (Opcional) Passo 6: Mude o idioma do seu conteúdo
304
+
305
+ Para mudar o idioma do seu conteúdo, você pode usar a função `setLocale` fornecida pela função `useLocale`. Isso permite que você defina o idioma do aplicativo e atualize o conteúdo de acordo.
306
+
307
+ Crie um componente para alternar entre os idiomas:
308
+
309
+ ```typescript fileName="src/app/locale-switcher.component.ts"
310
+ import { Component } from "@angular/core";
311
+ import { CommonModule } from "@angular/common";
312
+ import { useLocale } from "angular-intlayer";
313
+
314
+ @Component({
315
+ selector: "app-locale-switcher",
316
+ standalone: true,
317
+ imports: [CommonModule],
318
+ template: `
319
+ <div class="locale-switcher">
320
+ <select
321
+ [value]="locale()"
322
+ (change)="setLocale($any($event.target).value)"
323
+ >
324
+ @for (loc of availableLocales; track loc) {
325
+ <option [value]="loc">{{ loc }}</option>
326
+ }
327
+ </select>
328
+ </div>
329
+ `,
330
+ })
331
+ export class LocaleSwitcherComponent {
332
+ localeCtx = useLocale();
333
+
334
+ locale = this.localeCtx.locale;
335
+ availableLocales = this.localeCtx.availableLocales;
336
+ setLocale = this.localeCtx.setLocale;
337
+ }
338
+ ```
339
+
340
+ Em seguida, use este componente no seu `app.component.ts`:
341
+
342
+ ```typescript fileName="src/app/app.component.ts"
343
+ import { Component } from "@angular/core";
344
+ import { RouterOutlet } from "@angular/router";
345
+ import { useIntlayer } from "angular-intlayer";
346
+ import { LocaleSwitcherComponent } from "./locale-switcher.component";
347
+
348
+ @Component({
349
+ selector: "app-root",
350
+ standalone: true,
351
+ imports: [RouterOutlet, LocaleSwitcherComponent],
352
+ templateUrl: "./app.component.html",
353
+ styleUrl: "./app.component.css",
354
+ })
355
+ export class AppComponent {
356
+ content = useIntlayer("app");
357
+ }
358
+ ```
359
+
360
+ ### Configurar TypeScript
361
+
362
+ O Intlayer usa o aumento de módulo para obter os benefícios do TypeScript e tornar sua base de código mais forte.
363
+
364
+ ![Autocompletar](https://github.com/aymericzip/intlayer/blob/main/docs/assets/autocompletion.png?raw=true)
365
+
366
+ ![Erro de tradução](https://github.com/aymericzip/intlayer/blob/main/docs/assets/translation_error.png?raw=true)
367
+
368
+ Certifique-se de que sua configuração do TypeScript inclua os tipos gerados automaticamente.
369
+
370
+ ```json5 fileName="tsconfig.json"
371
+ {
372
+ // ... Suas configurações TypeScript existentes
373
+ "include": [
374
+ // ... Suas configurações TypeScript existentes
375
+ ".intlayer/**/*.ts", // Incluir os tipos gerados automaticamente
376
+ ],
377
+ }
378
+ ```
379
+
380
+ ### Configuração do Git
381
+
382
+ É recomendável ignorar os arquivos gerados pelo Intlayer. Isso permite que você evite confirmá-los no seu repositório Git.
383
+
384
+ Para fazer isso, você pode adicionar as seguintes instruções ao seu arquivo `.gitignore`:
385
+
386
+ ```bash
387
+ # Ignorar os arquivos gerados pelo Intlayer
388
+ .intlayer
389
+ ```
390
+
391
+ ### Extensão do VS Code
392
+
393
+ Para melhorar sua experiência de desenvolvimento com o Intlayer, você pode instalar a extensão oficial **Intlayer VS Code Extension**.
394
+
395
+ [Instalar do VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
396
+
397
+ Esta extensão oferece:
398
+
399
+ - **Autocompletar** para chaves de tradução.
400
+ - **Detecção de erros em tempo real** para traduções ausentes.
401
+ - **Visualizações integradas** do conteúdo traduzido.
402
+ - **Ações rápidas** para criar e atualizar facilmente traduções.
403
+
404
+ Para obter mais detalhes sobre como usar a extensão, consulte a [documentação da Extensão do VS Code do Intlayer](https://intlayer.org/doc/vs-code-extension).
405
+
406
+ ---
407
+
408
+ ### Vá além
409
+
410
+ Para ir mais longe, você pode implementar o [editor visual](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/intlayer_visual_editor.md) ou externalizar o seu conteúdo usando o [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/intlayer_CMS.md).
411
+
412
+ ---
@@ -165,7 +165,7 @@ Intlayer пытается оптимизировать все эти аспек
165
165
 
166
166
  Звезды на GitHub - это сильный индикатор популярности проекта, доверия сообщества и долгосрочной актуальности. Хотя они не являются прямым показателем технического качества, они отражают, сколько разработчиков считают проект полезным, следят за его прогрессом и, вероятно, будут его использовать. Для оценки ценности проекта звезды помогают сравнивать популярность альтернатив и дают представление о росте экосистемы.
167
167
 
168
- [![Star History Chart](https://api.star-history.com/chart?repos=i18next%2Fnext-i18next%2Camannn%2Fnext-intl%2Clingui%2Fjs-lingui%2Cvinissimus%2Fnext-translate%2Cinostudio%2Fnext-international%2Copral%2paraglide-js%2Ctolgee%2Ftolgee-js%2Caymericzip%2Fintlayer&type=date&legend=top-left)](https://www.star-history.com/#i18next/next-i18next&amannn/next-intl&lingui/js-lingui&vinissimus/next-translate&inostudio/next-international&opral/paraglide-js&tolgee/tolgee-js&aymericzip/intlayer)
168
+ [![Star History Chart](https://api.star-history.com/chart?repos=i18next%2Fnext-i18next%2Camannn%2Fnext-intl%2Clingui%2Fjs-lingui%2Cvinissimus%2Fnext-translate%2Cinostudio%2Fnext-international%2Copral%2Fparaglide-js%2Ctolgee%2Ftolgee-js%2Caymericzip%2Fintlayer&type=date&legend=top-left)](https://www.star-history.com/#i18next/next-i18next&amannn/next-intl&lingui/js-lingui&vinissimus/next-translate&inostudio/next-international&opral/paraglide-js&tolgee/tolgee-js&aymericzip/intlayer)
169
169
 
170
170
  ## Результаты в деталях
171
171
 
@@ -121,7 +121,7 @@ history:
121
121
 
122
122
  Звезды на GitHub - это сильный индикатор популярности проекта, доверия сообщества и долгосрочной актуальности. Хотя они не являются прямым показателем технического качества, они отражают, сколько разработчиков считают проект полезным, следят за его прогрессом и, вероятно, будут его использовать. Для оценки ценности проекта звезды помогают сравнивать популярность альтернатив и дают представление о росте экосистемы.
123
123
 
124
- [![Star History Chart](https://api.star-history.com/chart?repos=solidjs-community%2Fsolid-primitives%2Cmbarzda%2Fsolid-i18next%2Copral%2paraglide-js%2Caymericzip%2Fintlayer&type=date&legend=top-left)](https://www.star-history.com/#solidjs-community/solid-primitives&mbarzda/solid-i18next&opral/paraglide-js&aymericzip/intlayer)
124
+ [![Star History Chart](https://api.star-history.com/chart?repos=solidjs-community%2Fsolid-primitives%2Cmbarzda%2Fsolid-i18next%2Copral%2Fparaglide-js%2Caymericzip%2Fintlayer&type=date&legend=top-left)](https://www.star-history.com/#solidjs-community/solid-primitives&mbarzda/solid-i18next&opral/paraglide-js&aymericzip/intlayer)
125
125
 
126
126
  ## Результаты в деталях
127
127