@intlayer/docs 5.8.0-canary.0 → 5.8.0
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.
- package/blog/ar/intlayer_with_next-i18next.md +2 -2
- package/blog/ar/next-i18next_vs_next-intl_vs_intlayer.md +96 -219
- package/blog/ar/react-i18next_vs_react-intl_vs_intlayer.md +88 -129
- package/blog/ar/vue-i18n_vs_intlayer.md +268 -0
- package/blog/de/intlayer_with_next-i18next.md +2 -2
- package/blog/de/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/de/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/de/vue-i18n_vs_intlayer.md +268 -0
- package/blog/en/intlayer_with_next-i18next.md +2 -2
- package/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +89 -220
- package/blog/en/react-i18next_vs_react-intl_vs_intlayer.md +85 -123
- package/blog/en/vue-i18n_vs_intlayer.md +268 -0
- package/blog/en-GB/intlayer_with_next-i18next.md +2 -2
- package/blog/en-GB/next-i18next_vs_next-intl_vs_intlayer.md +85 -218
- package/blog/en-GB/react-i18next_vs_react-intl_vs_intlayer.md +80 -130
- package/blog/en-GB/vue-i18n_vs_intlayer.md +258 -0
- package/blog/es/intlayer_with_next-i18next.md +2 -2
- package/blog/es/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/es/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/es/vue-i18n_vs_intlayer.md +268 -0
- package/blog/fr/intlayer_with_next-i18next.md +2 -2
- package/blog/fr/next-i18next_vs_next-intl_vs_intlayer.md +91 -214
- package/blog/fr/react-i18next_vs_react-intl_vs_intlayer.md +86 -127
- package/blog/fr/vue-i18n_vs_intlayer.md +269 -0
- package/blog/hi/intlayer_with_next-i18next.md +2 -2
- package/blog/hi/next-i18next_vs_next-intl_vs_intlayer.md +97 -220
- package/blog/hi/react-i18next_vs_react-intl_vs_intlayer.md +89 -130
- package/blog/hi/vue-i18n_vs_intlayer.md +268 -0
- package/blog/it/intlayer_with_next-i18next.md +2 -2
- package/blog/it/next-i18next_vs_next-intl_vs_intlayer.md +91 -214
- package/blog/it/react-i18next_vs_react-intl_vs_intlayer.md +86 -127
- package/blog/it/vue-i18n_vs_intlayer.md +268 -0
- package/blog/ja/intlayer_with_next-i18next.md +2 -2
- package/blog/ja/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/ja/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/ja/vue-i18n_vs_intlayer.md +268 -0
- package/blog/ko/intlayer_with_next-i18next.md +2 -2
- package/blog/ko/next-i18next_vs_next-intl_vs_intlayer.md +95 -217
- package/blog/ko/react-i18next_vs_react-intl_vs_intlayer.md +89 -130
- package/blog/ko/vue-i18n_vs_intlayer.md +268 -0
- package/blog/pt/intlayer_with_next-i18next.md +2 -2
- package/blog/pt/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/pt/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/pt/vue-i18n_vs_intlayer.md +268 -0
- package/blog/ru/intlayer_with_next-i18next.md +2 -2
- package/blog/ru/next-i18next_vs_next-intl_vs_intlayer.md +94 -217
- package/blog/ru/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/ru/vue-i18n_vs_intlayer.md +268 -0
- package/blog/zh/intlayer_with_next-i18next.md +2 -2
- package/blog/zh/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/zh/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/zh/vue-i18n_vs_intlayer.md +269 -0
- package/dist/cjs/generated/blog.entry.cjs +41 -0
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +41 -0
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/types/generated/blog.entry.d.ts +1 -0
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/docs/ar/formatters.md +417 -31
- package/docs/ar/how_works_intlayer.md +2 -4
- package/docs/ar/interest_of_intlayer.md +7 -10
- package/docs/ar/intlayer_CMS.md +2 -3
- package/docs/ar/intlayer_visual_editor.md +2 -3
- package/docs/ar/intlayer_with_tanstack.md +1 -1
- package/docs/ar/introduction.md +4 -4
- package/docs/de/formatters.md +444 -34
- package/docs/de/introduction.md +2 -2
- package/docs/en/dictionary/enumeration.md +2 -2
- package/docs/en/dictionary/function_fetching.md +2 -2
- package/docs/en/dictionary/get_started.md +2 -2
- package/docs/en/dictionary/translation.md +2 -2
- package/docs/en/formatters.md +383 -15
- package/docs/en/how_works_intlayer.md +2 -4
- package/docs/en/interest_of_intlayer.md +40 -29
- package/docs/en/intlayer_CMS.md +2 -3
- package/docs/en/intlayer_visual_editor.md +2 -3
- package/docs/en/intlayer_with_create_react_app.md +2 -2
- package/docs/en/intlayer_with_express.md +2 -2
- package/docs/en/intlayer_with_tanstack.md +1 -1
- package/docs/en/introduction.md +4 -4
- package/docs/en/packages/express-intlayer/index.md +2 -2
- package/docs/en/packages/intlayer/getConfiguration.md +2 -3
- package/docs/en/packages/intlayer/getEnumeration.md +2 -7
- package/docs/en/packages/intlayer/getHTMLTextDir.md +2 -4
- package/docs/en/packages/intlayer/getLocaleLang.md +2 -4
- package/docs/en/packages/intlayer/getLocaleName.md +2 -3
- package/docs/en/packages/intlayer/getLocalizedUrl.md +2 -8
- package/docs/en/packages/intlayer/getMultilingualUrls.md +2 -7
- package/docs/en/packages/intlayer/getPathWithoutLocale.md +2 -3
- package/docs/en/packages/intlayer/getTranslation.md +2 -4
- package/docs/en/packages/intlayer/index.md +2 -2
- package/docs/en/packages/next-intlayer/index.md +2 -2
- package/docs/en/packages/next-intlayer/t.md +2 -2
- package/docs/en/packages/next-intlayer/useDictionary.md +2 -2
- package/docs/en/packages/next-intlayer/useIntlayer.md +2 -2
- package/docs/en/packages/next-intlayer/useLocale.md +2 -2
- package/docs/en/packages/react-intlayer/index.md +2 -2
- package/docs/en/packages/react-intlayer/t.md +2 -2
- package/docs/en/packages/react-intlayer/useI18n.md +2 -2
- package/docs/en/packages/react-intlayer/useIntlayer.md +2 -2
- package/docs/en/packages/react-intlayer/useLocale.md +2 -2
- package/docs/en/packages/react-scripts-intlayer/index.md +2 -2
- package/docs/en/packages/solid-intlayer/index.md +2 -2
- package/docs/en/packages/vite-intlayer/index.md +2 -2
- package/docs/en-GB/formatters.md +402 -16
- package/docs/en-GB/how_works_intlayer.md +2 -4
- package/docs/en-GB/interest_of_intlayer.md +7 -10
- package/docs/en-GB/intlayer_with_tanstack.md +1 -1
- package/docs/en-GB/introduction.md +2 -2
- package/docs/es/formatters.md +438 -28
- package/docs/es/how_works_intlayer.md +2 -4
- package/docs/es/interest_of_intlayer.md +7 -10
- package/docs/es/intlayer_with_tanstack.md +1 -1
- package/docs/es/introduction.md +2 -2
- package/docs/fr/formatters.md +438 -28
- package/docs/fr/how_works_intlayer.md +2 -4
- package/docs/fr/interest_of_intlayer.md +7 -10
- package/docs/fr/intlayer_with_tanstack.md +1 -1
- package/docs/fr/introduction.md +2 -2
- package/docs/hi/formatters.md +430 -39
- package/docs/hi/how_works_intlayer.md +2 -4
- package/docs/hi/interest_of_intlayer.md +7 -10
- package/docs/hi/intlayer_with_tanstack.md +1 -1
- package/docs/hi/introduction.md +2 -2
- package/docs/it/formatters.md +438 -30
- package/docs/it/how_works_intlayer.md +2 -4
- package/docs/it/interest_of_intlayer.md +7 -10
- package/docs/it/intlayer_with_tanstack.md +1 -1
- package/docs/it/introduction.md +2 -2
- package/docs/ja/formatters.md +435 -47
- package/docs/ja/how_works_intlayer.md +2 -4
- package/docs/ja/interest_of_intlayer.md +7 -10
- package/docs/ja/intlayer_with_tanstack.md +1 -1
- package/docs/ja/introduction.md +2 -2
- package/docs/ko/formatters.md +432 -41
- package/docs/ko/how_works_intlayer.md +2 -4
- package/docs/ko/interest_of_intlayer.md +7 -10
- package/docs/ko/intlayer_with_tanstack.md +1 -1
- package/docs/ko/introduction.md +2 -2
- package/docs/pt/formatters.md +416 -30
- package/docs/pt/how_works_intlayer.md +2 -4
- package/docs/pt/intlayer_with_tanstack.md +1 -1
- package/docs/pt/introduction.md +2 -2
- package/docs/ru/autoFill.md +2 -2
- package/docs/ru/configuration.md +1 -40
- package/docs/ru/formatters.md +438 -28
- package/docs/ru/how_works_intlayer.md +5 -7
- package/docs/ru/index.md +1 -1
- package/docs/ru/interest_of_intlayer.md +8 -11
- package/docs/ru/intlayer_CMS.md +7 -8
- package/docs/ru/intlayer_cli.md +4 -7
- package/docs/ru/intlayer_visual_editor.md +5 -6
- package/docs/ru/intlayer_with_angular.md +1 -1
- package/docs/ru/intlayer_with_create_react_app.md +5 -5
- package/docs/ru/intlayer_with_lynx+react.md +1 -1
- package/docs/ru/intlayer_with_nextjs_15.md +3 -3
- package/docs/ru/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/ru/intlayer_with_nuxt.md +1 -1
- package/docs/ru/intlayer_with_react_native+expo.md +2 -2
- package/docs/ru/intlayer_with_tanstack.md +3 -3
- package/docs/ru/intlayer_with_vite+preact.md +3 -3
- package/docs/ru/intlayer_with_vite+react.md +3 -3
- package/docs/ru/intlayer_with_vite+solid.md +1 -1
- package/docs/ru/intlayer_with_vite+svelte.md +1 -1
- package/docs/ru/intlayer_with_vite+vue.md +2 -2
- package/docs/ru/introduction.md +5 -5
- package/docs/ru/locale_mapper.md +1 -1
- package/docs/ru/packages/@intlayer/api/index.md +2 -2
- package/docs/ru/packages/@intlayer/chokidar/index.md +1 -1
- package/docs/ru/packages/@intlayer/cli/index.md +2 -2
- package/docs/ru/packages/@intlayer/config/index.md +2 -2
- package/docs/ru/packages/@intlayer/core/index.md +2 -2
- package/docs/ru/packages/@intlayer/design-system/index.md +2 -2
- package/docs/ru/packages/@intlayer/dictionary-entry/index.md +2 -2
- package/docs/ru/packages/@intlayer/editor/index.md +1 -1
- package/docs/ru/packages/@intlayer/editor-react/index.md +1 -1
- package/docs/ru/packages/@intlayer/webpack/index.md +1 -1
- package/docs/ru/packages/angular-intlayer/index.md +1 -1
- package/docs/ru/packages/express-intlayer/index.md +3 -3
- package/docs/ru/packages/express-intlayer/t.md +1 -1
- package/docs/ru/packages/intlayer/getEnumeration.md +3 -8
- package/docs/ru/packages/intlayer/getTranslation.md +3 -5
- package/docs/ru/packages/intlayer/getTranslationContent.md +1 -3
- package/docs/ru/packages/intlayer/index.md +3 -3
- package/docs/ru/packages/intlayer-cli/index.md +1 -1
- package/docs/ru/packages/intlayer-editor/index.md +2 -2
- package/docs/ru/packages/lynx-intlayer/index.md +1 -1
- package/docs/ru/packages/next-intlayer/index.md +4 -4
- package/docs/ru/packages/next-intlayer/t.md +4 -4
- package/docs/ru/packages/next-intlayer/useLocale.md +3 -3
- package/docs/ru/packages/nuxt-intlayer/index.md +1 -1
- package/docs/ru/packages/preact-intlayer/index.md +1 -1
- package/docs/ru/packages/react-intlayer/index.md +4 -4
- package/docs/ru/packages/react-intlayer/t.md +4 -4
- package/docs/ru/packages/react-native-intlayer/index.md +1 -1
- package/docs/ru/packages/react-scripts-intlayer/index.md +3 -3
- package/docs/ru/packages/solid-intlayer/index.md +3 -3
- package/docs/ru/packages/svelte-intlayer/index.md +1 -1
- package/docs/ru/packages/vite-intlayer/index.md +3 -3
- package/docs/ru/packages/vue-intlayer/index.md +1 -1
- package/docs/ru/per_locale_file.md +1 -1
- package/docs/ru/roadmap.md +3 -5
- package/docs/ru/vs_code_extension.md +1 -1
- package/docs/zh/formatters.md +446 -38
- package/docs/zh/how_works_intlayer.md +2 -4
- package/docs/zh/interest_of_intlayer.md +7 -10
- package/docs/zh/intlayer_with_tanstack.md +1 -1
- package/docs/zh/introduction.md +2 -2
- package/frequent_questions/ar/domain_routing.md +1 -1
- package/frequent_questions/en/domain_routing.md +1 -1
- package/frequent_questions/en-GB/domain_routing.md +1 -1
- package/frequent_questions/es/domain_routing.md +1 -1
- package/frequent_questions/fr/domain_routing.md +1 -1
- package/frequent_questions/hi/domain_routing.md +1 -1
- package/frequent_questions/it/domain_routing.md +1 -1
- package/frequent_questions/ko/domain_routing.md +1 -1
- package/frequent_questions/pt/domain_routing.md +1 -1
- package/frequent_questions/ru/domain_routing.md +1 -1
- package/frequent_questions/ru/get_locale_cookie.md +4 -4
- package/frequent_questions/ru/static_rendering.md +1 -2
- package/frequent_questions/zh/domain_routing.md +1 -1
- package/package.json +7 -7
- package/src/generated/blog.entry.ts +41 -0
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
---
|
|
2
|
-
createdAt:
|
|
3
|
-
updatedAt: 2025-
|
|
2
|
+
createdAt: 2025-08-23
|
|
3
|
+
updatedAt: 2025-08-23
|
|
4
4
|
title: next-i18next vs next-intl vs Intlayer
|
|
5
|
-
description:
|
|
5
|
+
description: Comparar next-i18next com next-intl e Intlayer para a internacionalização (i18n) de uma aplicação Next.js
|
|
6
6
|
keywords:
|
|
7
7
|
- next-intl
|
|
8
8
|
- next-i18next
|
|
9
9
|
- Intlayer
|
|
10
10
|
- Internacionalização
|
|
11
|
-
-
|
|
11
|
+
- Blog
|
|
12
12
|
- Next.js
|
|
13
13
|
- JavaScript
|
|
14
14
|
- React
|
|
@@ -17,269 +17,146 @@ slugs:
|
|
|
17
17
|
- next-i18next-vs-next-intl-vs-intlayer
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
-
# next-i18next VS next-intl VS
|
|
20
|
+
# next-i18next VS next-intl VS intlayer | Internacionalização (i18n) no Next.js
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
Este guia compara três opções amplamente usadas de i18n para **Next.js**: **next-intl**, **next-i18next** e **Intlayer**.
|
|
23
|
+
Focamos no **Next.js 13+ App Router** (com **React Server Components**) e avaliamos:
|
|
23
24
|
|
|
24
|
-
|
|
25
|
+
1. **Arquitetura e organização de conteúdo**
|
|
26
|
+
2. **TypeScript e segurança**
|
|
27
|
+
3. **Tratamento de traduções faltantes**
|
|
28
|
+
4. **Roteamento e middleware**
|
|
29
|
+
5. **Desempenho e comportamento de carregamento**
|
|
30
|
+
6. **Experiência do desenvolvedor (DX), ferramentas e manutenção**
|
|
31
|
+
7. **SEO e escalabilidade para projetos grandes**
|
|
25
32
|
|
|
26
|
-
|
|
27
|
-
2. **Suporte a TypeScript**
|
|
28
|
-
3. **Gerenciamento de traduções ausentes**
|
|
29
|
-
4. **Suporte a Componentes de Servidor**
|
|
30
|
-
5. **Roteamento e middleware aprimorados** para Next.js
|
|
31
|
-
6. **Simplicidade de configuração**
|
|
32
|
-
|
|
33
|
-
O guia também fornece uma **análise aprofundada do Intlayer**, mostrando por que pode ser uma escolha forte, especialmente para Next.js 13+, incluindo **App Router** e **Componentes de Servidor**.
|
|
33
|
+
> **resumo**: Todos os três podem localizar uma aplicação Next.js. Se você deseja **conteúdo com escopo por componente**, **tipos TypeScript rigorosos**, **verificações de chaves ausentes em tempo de build**, **dicionários otimizados por tree-shaking** e **helpers de App Router + SEO de primeira classe**, **Intlayer** é a escolha mais completa e moderna.
|
|
34
34
|
|
|
35
35
|
---
|
|
36
36
|
|
|
37
|
-
##
|
|
38
|
-
|
|
39
|
-
### 1. next-intl
|
|
37
|
+
## Posicionamento em alto nível
|
|
40
38
|
|
|
41
|
-
**
|
|
39
|
+
- **next-intl** - Formatação de mensagens leve e direta com suporte sólido para Next.js. Catálogos centralizados são comuns; a experiência do desenvolvedor (DX) é simples, mas a segurança e a manutenção em larga escala permanecem principalmente sob sua responsabilidade.
|
|
40
|
+
- **next-i18next** - i18next com roupagem Next.js. Ecossistema maduro e recursos via plugins (por exemplo, ICU), mas a configuração pode ser verbosa e os catálogos tendem a se centralizar conforme os projetos crescem.
|
|
41
|
+
- **Intlayer** - Modelo de conteúdo centrado em componentes para Next.js, **tipagem TS rigorosa**, **verificações em tempo de build**, **tree-shaking**, **middleware e helpers de SEO integrados**, **Editor Visual/CMS** opcional e **traduções assistidas por IA**.
|
|
42
42
|
|
|
43
|
-
|
|
44
|
-
- **Suporte a TypeScript**: Integração básica com TypeScript. Algumas definições de tipo existem, mas não estão fortemente centradas na auto-geração de definições TypeScript a partir de seus arquivos de tradução.
|
|
45
|
-
- **Traduções Ausentes**: Mecanismo de fallback básico. Por padrão, recai sobre uma chave ou uma string de locale padrão. Não há ferramentas robustas prontas para uso para checagens avançadas de traduções ausentes.
|
|
46
|
-
- **Suporte a Componentes de Servidor**: Funciona com Next.js 13+ em geral, mas o padrão é menos especializado para uso profundo do lado do servidor (por exemplo, componentes de servidor com roteamento dinâmico complexo).
|
|
47
|
-
- **Roteamento & Middleware**: O suporte a middleware é possível, mas limitado. Normalmente, depende do `Middleware` do Next.js para detecção de locale, ou configuração manual para reescrita de caminhos de locale.
|
|
48
|
-
- **Simplicidade da Configuração**: Muito direto. Mínimo boilerplate é necessário.
|
|
43
|
+
---
|
|
49
44
|
|
|
50
|
-
|
|
45
|
+
## Comparação de Recursos Lado a Lado (focado em Next.js)
|
|
46
|
+
|
|
47
|
+
| Recurso | `next-intlayer` (Intlayer) | `next-intl` | `next-i18next` |
|
|
48
|
+
| -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ |
|
|
49
|
+
| **Traduções Próximas aos Componentes** | ✅ Sim, conteúdo localizado junto a cada componente | ❌ Não | ❌ Não |
|
|
50
|
+
| **Integração com TypeScript** | ✅ Avançada, tipos estritos gerados automaticamente | ✅ Boa | ⚠️ Básica |
|
|
51
|
+
| **Detecção de Tradução Ausente** | ✅ Destaque de erro no TypeScript e erro/aviso em tempo de compilação | ⚠️ Recurso de fallback em tempo de execução | ⚠️ Recurso de fallback em tempo de execução |
|
|
52
|
+
| **Conteúdo Rico (JSX/Markdown/componentes)** | ✅ Suporte direto | ❌ Não projetado para nós ricos | ⚠️ Limitado |
|
|
53
|
+
| **Tradução com IA** | ✅ Sim, suporta múltiplos provedores de IA. Usável com suas próprias chaves de API. Considera o contexto da sua aplicação e o escopo do conteúdo | ❌ Não | ❌ Não |
|
|
54
|
+
| **Editor Visual** | ✅ Sim, Editor Visual local + CMS opcional; pode externalizar conteúdo da base de código; incorporável | ❌ Não / disponível via plataformas externas de localização | ❌ Não / disponível via plataformas externas de localização |
|
|
55
|
+
| **Roteamento Localizado** | ✅ Sim, suporta caminhos localizados nativamente (funciona com Next.js & Vite) | ✅ Integrado, App Router suporta o segmento `[locale]` | ✅ Integrado |
|
|
56
|
+
| **Geração Dinâmica de Rotas** | ✅ Sim | ✅ Sim | ✅ Sim |
|
|
57
|
+
| **Pluralização** | ✅ Padrões baseados em enumeração | ✅ Bom | ✅ Bom |
|
|
58
|
+
| **Formatação (datas, números, moedas)** | ✅ Formatadores otimizados (Intl por trás dos panos) | ✅ Bom (helpers Intl) | ✅ Bom (helpers Intl) |
|
|
59
|
+
| **Formato de Conteúdo** | ✅ .tsx, .ts, .js, .json, .md, .txt, (.yaml em desenvolvimento) | ✅ .json, .js, .ts | ⚠️ .json |
|
|
60
|
+
| **Suporte ICU** | ⚠️ Em desenvolvimento | ✅ Sim | ⚠️ Via plugin (`i18next-icu`) |
|
|
61
|
+
| **Auxiliares de SEO (hreflang, sitemap)** | ✅ Ferramentas integradas: auxiliares para sitemap, robots.txt, metadados | ✅ Bom | ✅ Bom |
|
|
62
|
+
| **Ecossistema / Comunidade** | ⚠️ Menor, mas crescendo rápido e reativa | ✅ Médio porte, focado em Next.js | ✅ Médio porte, focado em Next.js |
|
|
63
|
+
| **Renderização no lado do servidor & Componentes de Servidor** | ✅ Sim, otimizado para SSR / Componentes de Servidor React | ⚠️ Suportado a nível de página, mas é necessário passar funções t na árvore de componentes para componentes filhos de servidor | ⚠️ Suportado a nível de página, mas é necessário passar funções t na árvore de componentes para componentes filhos de servidor |
|
|
64
|
+
| **Tree-shaking (carregar apenas conteúdo usado)** | ✅ Sim, por componente em tempo de build via plugins Babel/SWC | ⚠️ Parcial | ⚠️ Parcial |
|
|
65
|
+
| **Carregamento preguiçoso (Lazy loading)** | ✅ Sim, por localidade / por dicionário | ✅ Sim (por rota/por localidade), necessita de gestão de namespace | ✅ Sim (por rota/por localidade), necessita de gestão de namespace |
|
|
66
|
+
| **Remoção de conteúdo não utilizado** | ✅ Sim, por dicionário em tempo de build | ❌ Não, pode ser gerenciado manualmente com gestão de namespace | ❌ Não, pode ser gerenciado manualmente com gestão de namespace |
|
|
67
|
+
| **Gestão de Grandes Projetos** | ✅ Incentiva modularidade, adequado para sistemas de design | ✅ Modular com configuração | ✅ Modular com configuração |
|
|
51
68
|
|
|
52
69
|
---
|
|
53
70
|
|
|
54
|
-
|
|
71
|
+
## Comparação detalhada
|
|
55
72
|
|
|
56
|
-
|
|
73
|
+
### 1) Arquitetura e escalabilidade
|
|
57
74
|
|
|
58
|
-
- **
|
|
59
|
-
- **
|
|
60
|
-
- **Traduções Ausentes**: o i18next oferece interpolação/fallbacks. No entanto, a detecção de traduções ausentes geralmente precisa de configuração extra ou plugins de terceiros.
|
|
61
|
-
- **Suporte a Componentes de Servidor**: O uso básico com Next.js 13 é documentado, mas o uso avançado (por exemplo, integração profunda com componentes de servidor, geração de rotas dinâmicas) pode ser complicado.
|
|
62
|
-
- **Roteamento & Middleware**: Depende fortemente do `Middleware` do Next.js e reescritas para subcaminhos de locale. Para configurações mais complexas, você pode precisar mergulhar na configuração avançada do i18next.
|
|
63
|
-
- **Simplicidade da Configuração**: Abordagem familiar para aqueles acostumados ao i18next. No entanto, pode ficar mais pesado em boilerplate quando recursos avançados de i18n são necessários (namespaces, múltiplos locales de fallback, etc.).
|
|
75
|
+
- **next-intl / next-i18next**: Por padrão, utiliza **catálogos centralizados** por localidade (além de **namespaces** no i18next). Funciona bem no início, mas frequentemente se torna uma grande área compartilhada com aumento do acoplamento e da rotatividade de chaves.
|
|
76
|
+
- **Intlayer**: Incentiva dicionários **por componente** (ou por funcionalidade) **co-localizados** com o código que eles atendem. Isso reduz a carga cognitiva, facilita a duplicação/migração de partes da interface e diminui conflitos entre equipes. Conteúdo não utilizado é naturalmente mais fácil de identificar e eliminar.
|
|
64
77
|
|
|
65
|
-
**
|
|
78
|
+
**Por que isso importa:** Em grandes bases de código ou configurações de sistemas de design, **conteúdo modular** escala melhor do que catálogos monolíticos.
|
|
66
79
|
|
|
67
80
|
---
|
|
68
81
|
|
|
69
|
-
###
|
|
70
|
-
|
|
71
|
-
**Foco Principal**: Uma biblioteca moderna e open-source de i18n especificamente adaptada para **App Router** do Next.js (12, 13, 14 e 15) com suporte embutido para **Componentes de Servidor** e **Turbopack**.
|
|
82
|
+
### 2) TypeScript & segurança
|
|
72
83
|
|
|
73
|
-
|
|
84
|
+
- **next-intl**: Suporte sólido ao TypeScript, mas **as chaves não são estritamente tipadas por padrão**; você precisará manter padrões de segurança manualmente.
|
|
85
|
+
- **next-i18next**: Tipagens básicas para hooks; **tipagem estrita das chaves requer ferramentas/configurações adicionais**.
|
|
86
|
+
- **Intlayer**: **Gera tipos estritos** a partir do seu conteúdo. A **autocompletação no IDE** e os **erros em tempo de compilação** capturam erros de digitação e chaves ausentes antes do deploy.
|
|
74
87
|
|
|
75
|
-
|
|
88
|
+
**Por que isso importa:** A tipagem forte desloca falhas para a **esquerda** (CI/build) em vez de para a **direita** (tempo de execução).
|
|
76
89
|
|
|
77
|
-
|
|
78
|
-
- Isso torna seu código mais **modular e manutenível**, especialmente em grandes bases de código.
|
|
79
|
-
|
|
80
|
-
2. **Suporte a TypeScript**
|
|
81
|
-
|
|
82
|
-
- **Definições de tipo auto-geradas**: No momento em que você define seu conteúdo, o Intlayer gera tipos que alimentam a conclusão automática e capturam erros de tradução.
|
|
83
|
-
- Minimiza erros em tempo de execução, como chaves ausentes e oferece **conclusão automática** avançada diretamente em seu IDE.
|
|
84
|
-
|
|
85
|
-
3. **Gerenciamento de Traduções Ausentes**
|
|
90
|
+
---
|
|
86
91
|
|
|
87
|
-
|
|
88
|
-
- Isso garante que você nunca envie acidentalmente traduções faltantes em seus idiomas.
|
|
92
|
+
### 3) Tratamento de traduções ausentes
|
|
89
93
|
|
|
90
|
-
|
|
94
|
+
- **next-intl / next-i18next**: Dependem de **fallbacks em tempo de execução** (ex.: mostrar a chave ou o idioma padrão). A build não falha.
|
|
95
|
+
- **Intlayer**: **Detecção em tempo de build** com **avisos/erros** para locais ou chaves ausentes.
|
|
91
96
|
|
|
92
|
-
|
|
93
|
-
- Fornece provedores especializados (`IntlayerServerProvider`, `IntlayerClientProvider`) para **isolar o contexto do servidor** (vital ao lidar com Next.js 13+).
|
|
97
|
+
**Por que isso importa:** Detectar lacunas durante a build evita “strings misteriosas” em produção e está alinhado com gates rigorosos de lançamento.
|
|
94
98
|
|
|
95
|
-
|
|
99
|
+
---
|
|
96
100
|
|
|
97
|
-
|
|
98
|
-
- Lida dinamicamente com caminhos localizados (por exemplo, `/en-US/about` vs. `/fr/about`) com configuração mínima.
|
|
99
|
-
- Oferece métodos auxiliares como `getMultilingualUrls` para gerar links de idiomas alternativos (ótimo para **SEO**).
|
|
101
|
+
### 4) Roteamento, middleware e estratégia de URL
|
|
100
102
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
- Um plugin wrapper `withIntlayer(nextConfig)` que **injeta** todas as variáveis de ambiente e observadores para seu conteúdo.
|
|
104
|
-
- **Sem grandes configurações de fallback**, o sistema foi feito para "simplesmente funcionar" com mínima fricção.
|
|
103
|
+
- Todos os três funcionam com **roteamento localizado do Next.js** no App Router.
|
|
104
|
+
- **Intlayer** vai além com **middleware i18n** (detecção de localidade via headers/cookies) e **helpers** para gerar URLs localizadas e tags `<link rel="alternate" hreflang="…">`.
|
|
105
105
|
|
|
106
|
-
|
|
106
|
+
**Por que isso importa:** Menos camadas personalizadas; **UX consistente** e **SEO limpo** entre as localidades.
|
|
107
107
|
|
|
108
108
|
---
|
|
109
109
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
| **Recurso** | **next-intl** | **next-i18next** | **Intlayer** |
|
|
113
|
-
| ------------------------------------------ | ---------------------------------------------- | ----------------------------------------------- | ----------------------------------------------- |
|
|
114
|
-
| **Manter traduções perto dos componentes** | Parcial – tipicamente uma pasta de locales | Não é padrão – frequentemente `public/locales` | **Sim – recomendado e fácil** |
|
|
115
|
-
| **TypeScript Autogerado** | Definições TS básicas | Suporte TS básico | **Sim – avançado e pronto para uso** |
|
|
116
|
-
| **Detecção de traduções ausentes** | Principalmente strings fallback | Principalmente strings fallback | **Sim – checagens em tempo de construção** |
|
|
117
|
-
| **Suporte a Componentes de Servidor** | Funciona, mas não é especializado | Suportado, mas pode ser verboso | **Total suporte com provedores especializados** |
|
|
118
|
-
| **Roteamento & Middleware** | Integrado manualmente com o middleware do Next | Fornecido via reescrita de configuração | **Middleware i18n dedicado + hooks avançados** |
|
|
119
|
-
| **Complexidade da Configuração** | Simples, configuração mínima | Tradicional, pode ser verboso para uso avançado | **Um arquivo de configuração e plugin** |
|
|
120
|
-
|
|
121
|
-
---
|
|
110
|
+
### 5) Alinhamento com Server Components (RSC)
|
|
122
111
|
|
|
123
|
-
|
|
112
|
+
- **Todos** suportam Next.js 13+.
|
|
113
|
+
- **Intlayer** suaviza a **fronteira servidor/cliente** com uma API consistente e providers projetados para RSC, para que você não precise passar formatadores ou funções t através das árvores de componentes.
|
|
124
114
|
|
|
125
|
-
|
|
115
|
+
**Por que isso importa:** Modelo mental mais limpo e menos casos extremos em árvores híbridas.
|
|
126
116
|
|
|
127
|
-
|
|
117
|
+
---
|
|
128
118
|
|
|
129
|
-
|
|
119
|
+
### 6) Performance e comportamento de carregamento
|
|
130
120
|
|
|
131
|
-
|
|
121
|
+
- **next-intl / next-i18next**: Controle parcial via **namespaces** e **divisões por rota**; risco de incluir strings não usadas se a disciplina falhar.
|
|
122
|
+
- **Intlayer**: **Elimina código morto** na build e **carrega de forma preguiçosa por dicionário/locale**. Conteúdo não usado não é enviado.
|
|
132
123
|
|
|
133
|
-
|
|
124
|
+
**Por que isso importa:** Pacotes menores e inicialização mais rápida, especialmente em sites multilíngues.
|
|
134
125
|
|
|
135
|
-
|
|
126
|
+
---
|
|
136
127
|
|
|
137
|
-
|
|
128
|
+
### 7) DX, ferramentas e manutenção
|
|
138
129
|
|
|
139
|
-
|
|
130
|
+
- **next-intl / next-i18next**: Normalmente você integra plataformas externas para traduções e fluxos editoriais.
|
|
131
|
+
- **Intlayer**: Inclui um **Editor Visual gratuito** e **CMS opcional** (compatível com Git ou externalizado). Além disso, **extensão para VSCode** para autoria de conteúdo e **traduções assistidas por IA** usando suas próprias chaves de provedores.
|
|
140
132
|
|
|
141
|
-
|
|
142
|
-
- Um `intlayerMiddleware` padrão não requer reescritas profundas de configuração.
|
|
133
|
+
**Por que isso importa:** Reduz os custos operacionais e encurta o ciclo entre desenvolvedores e autores de conteúdo.
|
|
143
134
|
|
|
144
|
-
|
|
135
|
+
---
|
|
145
136
|
|
|
146
|
-
|
|
147
|
-
- Uso claro e direto para ambos **componentes de servidor** e **cliente** via `IntlayerServerProvider` e `IntlayerClientProvider`.
|
|
137
|
+
## Quando escolher qual?
|
|
148
138
|
|
|
149
|
-
|
|
150
|
-
|
|
139
|
+
- **Escolha next-intl** se você quer uma solução **minimalista**, está confortável com catálogos centralizados e seu aplicativo é de **pequeno a médio porte**.
|
|
140
|
+
- **Escolha next-i18next** se você precisa do **ecossistema de plugins do i18next** (por exemplo, regras avançadas ICU via plugins) e sua equipe já conhece o i18next, aceitando **mais configuração** para maior flexibilidade.
|
|
141
|
+
- **Escolha Intlayer** se você valoriza **conteúdo com escopo por componente**, **TypeScript rigoroso**, **garantias em tempo de build**, **tree-shaking** e ferramentas completas de roteamento/SEO/edição - especialmente para **Next.js App Router** e **bases de código grandes e modulares**.
|
|
151
142
|
|
|
152
143
|
---
|
|
153
144
|
|
|
154
|
-
##
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
1. **Instalar & Configurar**
|
|
162
|
-
|
|
163
|
-
```bash
|
|
164
|
-
npm install intlayer next-intlayer
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
```ts
|
|
168
|
-
// intlayer.config.ts
|
|
169
|
-
import { Locales, type IntlayerConfig } from "intlayer";
|
|
170
|
-
|
|
171
|
-
const config: IntlayerConfig = {
|
|
172
|
-
internationalization: {
|
|
173
|
-
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
174
|
-
defaultLocale: Locales.ENGLISH,
|
|
175
|
-
},
|
|
176
|
-
};
|
|
177
|
-
export default config;
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
2. **Usar o Plugin**
|
|
181
|
-
|
|
182
|
-
```ts
|
|
183
|
-
// next.config.mjs
|
|
184
|
-
import { withIntlayer } from "next-intlayer/server";
|
|
185
|
-
|
|
186
|
-
/** @type {import('next').NextConfig} */
|
|
187
|
-
const nextConfig = {};
|
|
188
|
-
|
|
189
|
-
export default withIntlayer(nextConfig);
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
3. **Adicionar Middleware**
|
|
193
|
-
|
|
194
|
-
```ts
|
|
195
|
-
// src/middleware.ts
|
|
196
|
-
export { intlayerMiddleware as middleware } from "next-intlayer/middleware";
|
|
197
|
-
|
|
198
|
-
export const config = {
|
|
199
|
-
matcher:
|
|
200
|
-
"/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)",
|
|
201
|
-
};
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
4. **Criar um Layout Localizado**
|
|
205
|
-
|
|
206
|
-
```tsx
|
|
207
|
-
// src/app/[locale]/layout.tsx
|
|
208
|
-
import { getHTMLTextDir } from "intlayer";
|
|
209
|
-
import { NextLayoutIntlayer } from "next-intlayer";
|
|
210
|
-
|
|
211
|
-
const LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => {
|
|
212
|
-
const { locale } = params;
|
|
213
|
-
return (
|
|
214
|
-
<html lang={locale} dir={getHTMLTextDir(locale)}>
|
|
215
|
-
<body>{children}</body>
|
|
216
|
-
</html>
|
|
217
|
-
);
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
export { generateStaticParams } from "next-intlayer";
|
|
221
|
-
export default LocaleLayout;
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
5. **Declarar & Usar Conteúdo**
|
|
225
|
-
|
|
226
|
-
```tsx
|
|
227
|
-
// src/app/[locale]/page.content.ts
|
|
228
|
-
import { t } from "intlayer";
|
|
229
|
-
|
|
230
|
-
export default {
|
|
231
|
-
key: "page",
|
|
232
|
-
content: {
|
|
233
|
-
getStarted: {
|
|
234
|
-
main: t({
|
|
235
|
-
en: "Get started by editing",
|
|
236
|
-
fr: "Commencez par éditer",
|
|
237
|
-
es: "Comience por editar",
|
|
238
|
-
}),
|
|
239
|
-
pageLink: "src/app/page.tsx",
|
|
240
|
-
},
|
|
241
|
-
},
|
|
242
|
-
};
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
```tsx
|
|
246
|
-
// src/app/[locale]/page.tsx
|
|
247
|
-
import { IntlayerServerProvider } from "next-intlayer/server";
|
|
248
|
-
import { IntlayerClientProvider, useIntlayer } from "next-intlayer";
|
|
249
|
-
|
|
250
|
-
const PageContent = () => {
|
|
251
|
-
const { content } = useIntlayer("page");
|
|
252
|
-
return (
|
|
253
|
-
<>
|
|
254
|
-
<p>{content.getStarted.main}</p>
|
|
255
|
-
<code>{content.getStarted.pageLink}</code>
|
|
256
|
-
</>
|
|
257
|
-
);
|
|
258
|
-
};
|
|
259
|
-
|
|
260
|
-
export default function Page({ params }) {
|
|
261
|
-
return (
|
|
262
|
-
<IntlayerServerProvider locale={params.locale}>
|
|
263
|
-
<IntlayerClientProvider locale={params.locale}>
|
|
264
|
-
<PageContent />
|
|
265
|
-
</IntlayerClientProvider>
|
|
266
|
-
</IntlayerServerProvider>
|
|
267
|
-
);
|
|
268
|
-
}
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
</details>
|
|
145
|
+
## Notas práticas de migração (next-intl / next-i18next → Intlayer)
|
|
146
|
+
|
|
147
|
+
- **Comece por funcionalidade**: Mova uma rota ou componente de cada vez para **dicionários locais**.
|
|
148
|
+
- **Mantenha os catálogos antigos em paralelo**: Faça a ponte durante a migração; evite um grande corte abrupto.
|
|
149
|
+
- **Ative verificações rigorosas**: Permita que a detecção em tempo de build identifique lacunas cedo.
|
|
150
|
+
- **Adote middleware e helpers**: Padronize a detecção de localidade e as tags de SEO em todo o site.
|
|
151
|
+
- **Meça os bundles**: Espere **reduções no tamanho do bundle** à medida que o conteúdo não utilizado é descartado.
|
|
272
152
|
|
|
273
153
|
---
|
|
274
154
|
|
|
275
155
|
## Conclusão
|
|
276
156
|
|
|
277
|
-
|
|
157
|
+
As três bibliotecas têm sucesso na localização básica. A diferença está em **quanto trabalho você precisa fazer** para alcançar uma configuração robusta e escalável no **Next.js moderno**:
|
|
278
158
|
|
|
279
|
-
- **
|
|
280
|
-
-
|
|
281
|
-
- Oferecendo **poderosa auto-geração de TypeScript** para código mais seguro
|
|
282
|
-
- Lidando com **traduções ausentes** em tempo de construção
|
|
283
|
-
- Fornecendo uma abordagem **simplificada e de configuração única** com roteamento e middleware avançados
|
|
159
|
+
- Com **Intlayer**, **conteúdo modular**, **TS rigoroso**, **segurança em tempo de build**, **bundles otimizados por tree-shaking** e **ferramentas de App Router + SEO de primeira classe** são **padrões**, não tarefas.
|
|
160
|
+
- Se sua equipe valoriza **manutenibilidade e velocidade** em um app multi-idioma orientado a componentes, o Intlayer oferece a experiência **mais completa** atualmente.
|
|
284
161
|
|
|
285
|
-
|
|
162
|
+
Consulte o documento ['Por que Intlayer?'](https://intlayer.org/doc/why) para mais detalhes.
|