@intlayer/docs 5.7.8 → 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 +5 -6
- package/blog/ar/intlayer_with_next-intl.md +3 -4
- package/blog/ar/intlayer_with_react-i18next.md +1 -1
- package/blog/ar/intlayer_with_react-intl.md +1 -1
- 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 +5 -6
- package/blog/de/intlayer_with_react-intl.md +1 -1
- 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 +5 -6
- package/blog/en/intlayer_with_next-intl.md +3 -4
- package/blog/en/intlayer_with_react-i18next.md +1 -1
- package/blog/en/intlayer_with_react-intl.md +1 -1
- 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 +5 -6
- package/blog/en-GB/intlayer_with_next-intl.md +3 -4
- package/blog/en-GB/intlayer_with_react-i18next.md +1 -1
- package/blog/en-GB/intlayer_with_react-intl.md +1 -1
- 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 +5 -6
- package/blog/es/intlayer_with_next-intl.md +3 -4
- package/blog/es/intlayer_with_react-i18next.md +1 -1
- package/blog/es/intlayer_with_react-intl.md +1 -1
- 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 +5 -6
- package/blog/fr/intlayer_with_next-intl.md +3 -4
- package/blog/fr/intlayer_with_react-i18next.md +1 -1
- package/blog/fr/intlayer_with_react-intl.md +1 -1
- 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 +5 -6
- package/blog/hi/intlayer_with_next-intl.md +3 -4
- package/blog/hi/intlayer_with_react-i18next.md +1 -1
- package/blog/hi/intlayer_with_react-intl.md +1 -1
- 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 +5 -6
- package/blog/it/intlayer_with_next-intl.md +3 -4
- package/blog/it/intlayer_with_react-i18next.md +1 -1
- package/blog/it/intlayer_with_react-intl.md +1 -1
- 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 +5 -6
- package/blog/ja/intlayer_with_next-intl.md +3 -4
- package/blog/ja/intlayer_with_react-intl.md +1 -1
- 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 +5 -6
- package/blog/ko/intlayer_with_next-intl.md +3 -4
- package/blog/ko/intlayer_with_react-intl.md +1 -1
- 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 +5 -6
- package/blog/pt/intlayer_with_next-intl.md +3 -4
- package/blog/pt/intlayer_with_react-intl.md +1 -1
- 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 +5 -6
- package/blog/ru/intlayer_with_next-intl.md +3 -4
- package/blog/ru/intlayer_with_react-i18next.md +1 -1
- package/blog/ru/intlayer_with_react-intl.md +1 -1
- 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 +5 -6
- package/blog/zh/intlayer_with_next-intl.md +3 -4
- package/blog/zh/intlayer_with_react-i18next.md +1 -1
- package/blog/zh/intlayer_with_react-intl.md +1 -1
- 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/cjs/generated/docs.entry.cjs +41 -0
- package/dist/cjs/generated/docs.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/esm/generated/docs.entry.mjs +41 -0
- package/dist/esm/generated/docs.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/dist/types/generated/docs.entry.d.ts +1 -0
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/formatters.md +625 -0
- package/docs/ar/how_works_intlayer.md +2 -4
- package/docs/ar/interest_of_intlayer.md +159 -49
- 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 +7 -7
- package/docs/ar/packages/intlayer/index.md +3 -3
- package/docs/ar/packages/next-intlayer/index.md +3 -3
- package/docs/de/formatters.md +649 -0
- package/docs/de/interest_of_intlayer.md +161 -47
- package/docs/de/introduction.md +5 -5
- package/docs/de/packages/intlayer/index.md +3 -3
- package/docs/de/packages/next-intlayer/index.md +3 -3
- package/docs/de/packages/react-intlayer/index.md +3 -3
- 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 +618 -0
- package/docs/en/how_works_intlayer.md +2 -4
- package/docs/en/interest_of_intlayer.md +170 -46
- 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 +7 -7
- 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 +5 -5
- package/docs/en/packages/next-intlayer/index.md +5 -5
- 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 +5 -5
- 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 +625 -0
- package/docs/en-GB/how_works_intlayer.md +2 -4
- package/docs/en-GB/interest_of_intlayer.md +157 -53
- package/docs/en-GB/intlayer_with_tanstack.md +1 -1
- package/docs/en-GB/introduction.md +2 -2
- package/docs/en-GB/packages/intlayer/index.md +3 -3
- package/docs/en-GB/packages/next-intlayer/index.md +3 -3
- package/docs/en-GB/packages/react-intlayer/index.md +3 -3
- package/docs/es/formatters.md +649 -0
- package/docs/es/how_works_intlayer.md +2 -4
- package/docs/es/interest_of_intlayer.md +156 -47
- package/docs/es/intlayer_with_tanstack.md +1 -1
- package/docs/es/introduction.md +5 -5
- package/docs/es/packages/intlayer/index.md +3 -3
- package/docs/es/packages/next-intlayer/index.md +3 -3
- package/docs/fr/formatters.md +649 -0
- package/docs/fr/how_works_intlayer.md +2 -4
- package/docs/fr/interest_of_intlayer.md +157 -46
- package/docs/fr/intlayer_with_tanstack.md +1 -1
- package/docs/fr/introduction.md +5 -5
- package/docs/fr/packages/intlayer/index.md +3 -3
- package/docs/fr/packages/next-intlayer/index.md +3 -3
- package/docs/fr/packages/react-intlayer/index.md +3 -3
- package/docs/hi/formatters.md +630 -0
- package/docs/hi/how_works_intlayer.md +2 -4
- package/docs/hi/interest_of_intlayer.md +155 -42
- package/docs/hi/intlayer_with_tanstack.md +1 -1
- package/docs/hi/introduction.md +5 -5
- package/docs/hi/packages/intlayer/index.md +3 -3
- package/docs/hi/packages/next-intlayer/index.md +3 -3
- package/docs/hi/packages/react-intlayer/index.md +3 -3
- package/docs/it/formatters.md +647 -0
- package/docs/it/how_works_intlayer.md +2 -4
- package/docs/it/interest_of_intlayer.md +157 -46
- package/docs/it/intlayer_with_tanstack.md +1 -1
- package/docs/it/introduction.md +5 -5
- package/docs/it/packages/intlayer/index.md +3 -3
- package/docs/it/packages/next-intlayer/index.md +3 -3
- package/docs/it/packages/react-intlayer/index.md +3 -3
- package/docs/ja/formatters.md +649 -0
- package/docs/ja/how_works_intlayer.md +2 -4
- package/docs/ja/interest_of_intlayer.md +154 -48
- package/docs/ja/intlayer_with_tanstack.md +1 -1
- package/docs/ja/introduction.md +5 -5
- package/docs/ja/packages/intlayer/index.md +3 -3
- package/docs/ja/packages/next-intlayer/index.md +3 -3
- package/docs/ja/packages/react-intlayer/index.md +3 -3
- package/docs/ko/formatters.md +649 -0
- package/docs/ko/how_works_intlayer.md +2 -4
- package/docs/ko/interest_of_intlayer.md +157 -48
- package/docs/ko/intlayer_with_tanstack.md +1 -1
- package/docs/ko/introduction.md +5 -5
- package/docs/ko/packages/intlayer/index.md +3 -3
- package/docs/ko/packages/next-intlayer/index.md +3 -3
- package/docs/ko/packages/react-intlayer/index.md +3 -3
- package/docs/pt/formatters.md +625 -0
- package/docs/pt/how_works_intlayer.md +2 -4
- package/docs/pt/interest_of_intlayer.md +162 -47
- package/docs/pt/intlayer_with_tanstack.md +1 -1
- package/docs/pt/introduction.md +5 -5
- package/docs/pt/packages/intlayer/index.md +3 -3
- package/docs/pt/packages/next-intlayer/index.md +3 -3
- package/docs/pt/packages/react-intlayer/index.md +3 -3
- package/docs/ru/autoFill.md +2 -2
- package/docs/ru/configuration.md +1 -40
- package/docs/ru/formatters.md +649 -0
- package/docs/ru/how_works_intlayer.md +5 -7
- package/docs/ru/index.md +1 -1
- package/docs/ru/interest_of_intlayer.md +165 -50
- 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 +8 -8
- 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 +6 -6
- 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 +7 -7
- 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 +7 -7
- 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 +647 -0
- package/docs/zh/how_works_intlayer.md +2 -4
- package/docs/zh/interest_of_intlayer.md +155 -48
- package/docs/zh/intlayer_with_tanstack.md +1 -1
- package/docs/zh/introduction.md +5 -5
- package/docs/zh/packages/intlayer/index.md +3 -3
- package/docs/zh/packages/next-intlayer/index.md +3 -3
- package/docs/zh/packages/react-intlayer/index.md +3 -3
- 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 +11 -11
- package/src/generated/blog.entry.ts +41 -0
- package/src/generated/docs.entry.ts +41 -0
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-01-02
|
|
3
3
|
updatedAt: 2025-06-29
|
|
4
|
-
title: react-
|
|
5
|
-
description: Integre
|
|
4
|
+
title: react-i18next vs react-intl vs Intlayer
|
|
5
|
+
description: Integre react-i18next com next-intl e Intlayer para a internacionalização (i18n) de uma aplicação React
|
|
6
6
|
keywords:
|
|
7
7
|
- next-intl
|
|
8
8
|
- react-i18next
|
|
9
9
|
- Intlayer
|
|
10
10
|
- Internacionalização
|
|
11
|
-
-
|
|
11
|
+
- Blog
|
|
12
12
|
- Next.js
|
|
13
13
|
- JavaScript
|
|
14
14
|
- React
|
|
@@ -17,178 +17,137 @@ slugs:
|
|
|
17
17
|
- react-i18next-vs-react-intl-vs-intlayer
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
-
#
|
|
20
|
+
# react-Intl VS react-i18next VS intlayer | Internacionalização (i18n) em React
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
Este guia compara três opções consolidadas de i18n para **React**: **react-intl** (FormatJS), **react-i18next** (i18next) e **Intlayer**.
|
|
23
|
+
Focamos em aplicações **React puras** (ex.: Vite, CRA, SPA). Se você usa Next.js, veja nossa comparação dedicada para Next.js.
|
|
23
24
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
## 1. Introdução
|
|
27
|
-
|
|
28
|
-
A internacionalização (i18n) em aplicações React pode ser alcançada de várias maneiras. As três bibliotecas apresentadas aqui têm diferentes filosofias de design, conjuntos de recursos e suporte da comunidade:
|
|
25
|
+
Nós avaliamos:
|
|
29
26
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
27
|
+
- Arquitetura e organização de conteúdo
|
|
28
|
+
- TypeScript e segurança
|
|
29
|
+
- Tratamento de traduções ausentes
|
|
30
|
+
- Conteúdo rico e capacidades de formatação
|
|
31
|
+
- Desempenho e comportamento de carregamento
|
|
32
|
+
- Experiência do desenvolvedor (DX), ferramentas e manutenção
|
|
33
|
+
- SEO/roteamento (dependente do framework)
|
|
33
34
|
|
|
34
|
-
|
|
35
|
+
> **resumo**: Todos os três podem localizar uma aplicação React. Se você deseja **conteúdo com escopo por componente**, **tipagem TypeScript rigorosa**, **verificações de chaves ausentes em tempo de build**, **dicionários otimizados por tree-shaking** e ferramentas editoriais integradas (Editor Visual/CMS + tradução assistida por IA opcional), **Intlayer** é a escolha mais completa para bases de código React modulares.
|
|
35
36
|
|
|
36
37
|
---
|
|
37
38
|
|
|
38
|
-
##
|
|
39
|
-
|
|
40
|
-
### Visão Geral
|
|
41
|
-
|
|
42
|
-
[**React-Intl**](https://formatjs.io/docs/react-intl/) é parte da [FormatJS](https://formatjs.io/) suite. Ele fornece um conjunto poderoso de **APIs e componentes** para lidar com formatação de mensagens, pluralização, data/hora e formatação de números. O React-Intl é amplamente utilizado em aplicações corporativas, principalmente porque faz parte de um ecossistema que padroniza a sintaxe e a formatação das mensagens.
|
|
43
|
-
|
|
44
|
-
### Principais Recursos
|
|
45
|
-
|
|
46
|
-
- **Sintaxe de Mensagem ICU**: Oferece uma sintaxe abrangente para interpolação de mensagens, pluralização e muito mais.
|
|
47
|
-
- **Formatação Localizada**: Utilitários embutidos para formatar datas, horas, números e tempos relativos com base na localidade.
|
|
48
|
-
- **Componentes Declarativos**: Expõe `<FormattedMessage>`, `<FormattedNumber>`, `<FormattedDate>`, etc., para uso sem costura em JSX.
|
|
49
|
-
- **Ecossistema Rico**: Integra-se bem com as ferramentas FormatJS (por exemplo, [babel-plugin-react-intl](https://formatjs.io/docs/tooling/babel-plugin/) para extrair, gerenciar e compilar mensagens.
|
|
50
|
-
|
|
51
|
-
### Fluxo de Trabalho Típico
|
|
52
|
-
|
|
53
|
-
1. **Defina catálogos de mensagens** (geralmente arquivos JSON por localidade).
|
|
54
|
-
2. **Envolva seu aplicativo** em `<IntlProvider locale="pt" messages={messages}>`.
|
|
55
|
-
3. **Use** `<FormattedMessage id="myMessage" defaultMessage="Hello world" />` ou o hook `useIntl()` para acessar strings de tradução.
|
|
56
|
-
|
|
57
|
-
### Prós
|
|
58
|
-
|
|
59
|
-
- Bem estabelecido e usado em muitos ambientes de produção.
|
|
60
|
-
- Formatação avançada de mensagens, incluindo pluralização, gênero, fusos horários e mais.
|
|
61
|
-
- Forte suporte de ferramentas para extração e compilação de mensagens.
|
|
62
|
-
|
|
63
|
-
### Contras
|
|
39
|
+
## Posicionamento de alto nível
|
|
64
40
|
|
|
65
|
-
-
|
|
66
|
-
-
|
|
41
|
+
- **react-intl** - Formatação alinhada a padrões e centrada em ICU (datas/números/plurais) com uma API madura. Os catálogos são tipicamente centralizados; a segurança das chaves e a validação em tempo de build ficam majoritariamente a seu cargo.
|
|
42
|
+
- **react-i18next** - Extremamente popular e flexível; namespaces, detectores e muitos plugins (ICU, backends). Poderoso, mas a configuração pode se expandir conforme os projetos crescem.
|
|
43
|
+
- **Intlayer** - Modelo de conteúdo centrado em componentes para React, **tipagem TS rigorosa**, **verificações em tempo de build**, **tree-shaking**, além de **Editor Visual/CMS** e **traduções assistidas por IA**. Funciona com React Router, Vite, CRA, etc.
|
|
67
44
|
|
|
68
45
|
---
|
|
69
46
|
|
|
70
|
-
##
|
|
47
|
+
## Matriz de funcionalidades (foco em React)
|
|
48
|
+
|
|
49
|
+
| Recurso | `react-intlayer` (Intlayer) | `react-i18next` (i18next) | `react-intl` (FormatJS) |
|
|
50
|
+
| ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ |
|
|
51
|
+
| **Traduções Próximas aos Componentes** | ✅ Sim, conteúdo localizado junto a cada componente | ❌ Não | ❌ Não |
|
|
52
|
+
| **Integração com TypeScript** | ✅ Avançada, tipos estritos gerados automaticamente | ⚠️ Básica; configuração extra para segurança | ✅ Boa, mas menos estrita |
|
|
53
|
+
| **Detecção de Tradução Ausente** | ✅ Destaque de erro no TypeScript e erro/aviso em tempo de compilação | ⚠️ Principalmente strings de fallback em tempo de execução | ⚠️ Strings de fallback |
|
|
54
|
+
| **Conteúdo Rico (JSX/Markdown/componentes)** | ✅ Suporte direto | ⚠️ Limitado / apenas interpolação | ⚠️ Sintaxe ICU, não é JSX real |
|
|
55
|
+
| **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 |
|
|
56
|
+
| **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 |
|
|
57
|
+
| **Roteamento Localizado** | ✅ Sim, suporta caminhos localizados nativamente (funciona com Next.js & Vite) | ⚠️ Não embutido, requer plugins (ex: `next-i18next`) ou configuração personalizada do roteador | ❌ Não, apenas formatação de mensagens, roteamento deve ser manual |
|
|
58
|
+
| **Geração Dinâmica de Rotas** | ✅ Sim | ⚠️ Plugin/ecossistema ou configuração manual | ❌ Não fornecido |
|
|
59
|
+
| **Pluralização** | ✅ Padrões baseados em enumeração | ✅ Configurável (plugins como i18next-icu) | ✅ (ICU) |
|
|
60
|
+
| **Formatação (datas, números, moedas)** | ✅ Formatadores otimizados (Intl por baixo dos panos) | ⚠️ Via plugins ou uso customizado do Intl | ✅ Formatadores ICU |
|
|
61
|
+
| **Formato de Conteúdo** | ✅ .tsx, .ts, .js, .json, .md, .txt, (.yaml em desenvolvimento) | ⚠️ .json | ✅ .json, .js |
|
|
62
|
+
| **Suporte ICU** | ⚠️ Em desenvolvimento | ⚠️ Via plugin (i18next-icu) | ✅ Sim |
|
|
63
|
+
| **Ajuda para SEO (hreflang, sitemap)** | ✅ Ferramentas integradas: auxiliares para sitemap, robots.txt, metadados | ⚠️ Plugins da comunidade/manual | ❌ Não faz parte do núcleo |
|
|
64
|
+
| **Ecossistema / Comunidade** | ⚠️ Menor, mas crescendo rápido e reativa | ✅ Maior e madura | ✅ Grande |
|
|
65
|
+
| **Renderização do lado servidor & Componentes do Servidor** | ✅ Sim, otimizado para SSR / Componentes do Servidor React | ⚠️ Suportado a nível de página, mas é necessário passar funções t na árvore de componentes para componentes filhos do servidor | ❌ Não suportado, é necessário passar funções t na árvore de componentes para componentes filhos do servidor |
|
|
66
|
+
| **Tree-shaking (carregar apenas o conteúdo usado)** | ✅ Sim, por componente no momento da build via plugins Babel/SWC | ⚠️ Normalmente carrega tudo (pode ser melhorado com namespaces/divisão de código) | ⚠️ Normalmente carrega tudo |
|
|
67
|
+
| **Carregamento preguiçoso (Lazy loading)** | ✅ Sim, por localidade / por dicionário | ✅ Sim (ex.: backends/namespaces sob demanda) | ✅ Sim (divisão dos pacotes por localidade) |
|
|
68
|
+
| **Remoção de conteúdo não utilizado** | ✅ Sim, por dicionário em tempo de build | ❌ Não, apenas via segmentação manual por namespace | ❌ Não, todas as mensagens declaradas são empacotadas |
|
|
69
|
+
| **Gestão de Grandes Projetos** | ✅ Incentiva modularidade, adequado para sistemas de design | ⚠️ Requer boa disciplina de arquivos | ⚠️ Catálogos centrais podem ficar grandes |
|
|
71
70
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
[**React-i18next**](https://react.i18next.com/) é uma extensão React de [i18next](https://www.i18next.com/), um dos frameworks de i18n JavaScript mais populares. Ele oferece **recursos extensos** para traduções em tempo de execução, carregamento preguiçoso e detecção de idioma, tornando-o extremamente flexível para uma ampla variedade de casos de uso.
|
|
75
|
-
|
|
76
|
-
### Principais Recursos
|
|
77
|
-
|
|
78
|
-
- **Estrutura de Tradução Flexível**: Não está atada a um único formato como ICU. Você pode armazenar traduções em JSON, usar interpolação, pluralização, etc.
|
|
79
|
-
- **Alternância de Idioma Dinâmica**: Plugins de detector de idioma incorporados e atualizações em tempo de execução.
|
|
80
|
-
- **Traduções Aninhadas e Estruturadas**: Você pode aninhar traduções facilmente dentro de JSON.
|
|
81
|
-
- **Ecossistema de Plugins Extensivo**: Para detecção (navegador, caminho, subdomínio, etc.), carregamento de recursos, cache e mais.
|
|
82
|
-
|
|
83
|
-
### Fluxo de Trabalho Típico
|
|
84
|
-
|
|
85
|
-
1. **Instale `i18next` e `react-i18next`.**
|
|
86
|
-
2. **Configure i18n** para carregar traduções (JSON) e configurar detecção de idioma ou fallback.
|
|
87
|
-
3. **Envolva seu aplicativo** em `I18nextProvider`.
|
|
88
|
-
4. **Use o hook `useTranslation()`** ou o componente `<Trans>` para exibir traduções.
|
|
71
|
+
---
|
|
89
72
|
|
|
90
|
-
|
|
73
|
+
## Comparação detalhada
|
|
91
74
|
|
|
92
|
-
|
|
93
|
-
- Comunidade muito ativa e grande ecossistema de plugins.
|
|
94
|
-
- Facilidade de **carregamento dinâmico** de traduções (por exemplo, de um servidor, sob demanda).
|
|
75
|
+
### 1) Arquitetura e escalabilidade
|
|
95
76
|
|
|
96
|
-
|
|
77
|
+
- **react-intl / react-i18next**: A maioria das configurações mantém **pastas de localidade centralizadas** por idioma, às vezes divididas por **namespaces** (i18next). Funciona bem no início, mas torna-se uma área compartilhada à medida que os aplicativos crescem.
|
|
78
|
+
- **Intlayer**: Promove **dicionários por componente (ou por funcionalidade)** **co-localizados** com a interface de usuário que atendem. Isso mantém a propriedade clara, facilita a duplicação/migração de componentes e reduz a rotatividade de chaves entre equipes. Conteúdo não utilizado é mais fácil de identificar e remover.
|
|
97
79
|
|
|
98
|
-
|
|
99
|
-
- Se você prefere traduções fortemente tipadas, pode precisar de configurações adicionais do TypeScript.
|
|
80
|
+
**Por que isso importa:** Conteúdo modular reflete uma interface modular. Grandes bases de código React permanecem mais limpas quando as traduções vivem junto com os componentes a que pertencem.
|
|
100
81
|
|
|
101
82
|
---
|
|
102
83
|
|
|
103
|
-
|
|
84
|
+
### 2) TypeScript & segurança
|
|
104
85
|
|
|
105
|
-
|
|
86
|
+
- **react-intl**: Tipagens sólidas, mas **sem tipagem automática de chaves**; você mesmo deve aplicar padrões de segurança.
|
|
87
|
+
- **react-i18next**: Tipagens fortes para hooks; **tipagem estrita de chaves** geralmente requer configuração extra ou geradores.
|
|
88
|
+
- **Intlayer**: **Gera automaticamente tipos estritos** a partir do seu conteúdo. O autocompletar do IDE e os **erros em tempo de compilação** capturam erros de digitação e chaves ausentes antes da execução.
|
|
106
89
|
|
|
107
|
-
|
|
90
|
+
**Por que isso importa:** Mover falhas para a **esquerda** (para build/CI) reduz problemas em produção e acelera os ciclos de feedback dos desenvolvedores.
|
|
108
91
|
|
|
109
|
-
|
|
92
|
+
---
|
|
110
93
|
|
|
111
|
-
|
|
112
|
-
- **Roteamento & Middleware Incorporados**: Módulos opcionais para roteamento localizado (por exemplo, `/pt/sobre`, `/fr/about`) e middleware do servidor para detectar a localidade do usuário.
|
|
113
|
-
- **Tipos TypeScript Gerados Automaticamente**: Garante segurança de tipo com recursos como autocompletar e detecção de erros em tempo de compilação.
|
|
114
|
-
- **Traduções Dinâmicas e Ricas**: Podem incluir JSX/TSX em traduções para casos de uso mais complexos (por exemplo, links, texto em negrito, ícones em traduções).
|
|
94
|
+
### 3) Tratamento de traduções ausentes
|
|
115
95
|
|
|
116
|
-
|
|
96
|
+
- **react-intl / react-i18next**: Usam por padrão **fallbacks em tempo de execução** (eco da chave ou local padrão). Você pode adicionar linting/plugins, mas não é garantido na build.
|
|
97
|
+
- **Intlayer**: **Detecção em tempo de build** com avisos ou erros quando locais/chaves obrigatórios estão ausentes.
|
|
117
98
|
|
|
118
|
-
|
|
119
|
-
2. **Crie `intlayer.config.ts`** para definir localidades disponíveis e a localidade padrão.
|
|
120
|
-
3. **Use a CLI do Intlayer** ou o plugin para **transpilar** declarações de conteúdo.
|
|
121
|
-
4. **Envolva seu aplicativo** em `<IntlayerProvider>` e recupere o conteúdo com `useIntlayer("keyName")`.
|
|
99
|
+
**Por que isso importa:** Falhas no CI por strings ausentes evitam o vazamento do “inglês misterioso” em interfaces não inglesas.
|
|
122
100
|
|
|
123
|
-
|
|
101
|
+
---
|
|
124
102
|
|
|
125
|
-
|
|
126
|
-
- **Conteúdo rico** possível (por exemplo, passando nós React como traduções).
|
|
127
|
-
- **Roteamento Localizado** pronto para uso.
|
|
128
|
-
- Integrado com ferramentas de build populares (CRA, Vite) para configuração fácil.
|
|
103
|
+
### 4) Conteúdo rico e formatação
|
|
129
104
|
|
|
130
|
-
|
|
105
|
+
- **react-intl**: Excelente suporte **ICU** para plurais, seleções, datas/números e composição de mensagens. JSX pode ser usado, mas o modelo mental permanece centrado na mensagem.
|
|
106
|
+
- **react-i18next**: Interpolação flexível e **`<Trans>`** para incorporar elementos/componentes; ICU disponível via plugin.
|
|
107
|
+
- **Intlayer**: Arquivos de conteúdo podem incluir **nós ricos** (JSX/Markdown/componentes) e **metadados**. A formatação usa Intl internamente; padrões de plural são ergonômicos.
|
|
131
108
|
|
|
132
|
-
|
|
133
|
-
- Foco maior em uma abordagem de “declaração de conteúdo em nível de componente”, pode ser uma mudança em relação aos catálogos típicos em .json.
|
|
134
|
-
- Ecossistema e comunidade menores em comparação com as bibliotecas mais estabelecidas.
|
|
109
|
+
**Por que isso importa:** Textos complexos da interface do usuário (links, partes em negrito, componentes embutidos) são mais fáceis quando a biblioteca aceita nós React de forma limpa.
|
|
135
110
|
|
|
136
111
|
---
|
|
137
112
|
|
|
138
|
-
|
|
113
|
+
### 5) Desempenho e comportamento de carregamento
|
|
114
|
+
|
|
115
|
+
- **react-intl / react-i18next**: Normalmente você gerencia **divisão de catálogos** e **carregamento preguiçoso** manualmente (namespaces/importações dinâmicas). Eficaz, mas requer disciplina.
|
|
116
|
+
- **Intlayer**: **Elimina** dicionários não usados e suporta **carregamento preguiçoso por dicionário/por localidade** nativamente.
|
|
139
117
|
|
|
140
|
-
|
|
141
|
-
| ----------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
142
|
-
| **Caso de Uso Principal** | Traduções baseadas em string, formatação de data/número, sintaxe de mensagem ICU | i18n completo com fácil troca dinâmica, aninhamento, ecossistema de plugins | Traduções seguras em tipos com foco em conteúdo declarativo, roteamento localizado e middleware opcional de servidor |
|
|
143
|
-
| ** abordagem ** | Utilize `<IntlProvider>` & componentes de mensagem FormatJS | Utilize `I18nextProvider` & hook `useTranslation()` | Utilize `<IntlayerProvider>` & hook `useIntlayer()` com declarações de conteúdo |
|
|
144
|
-
| **Formato de Localização** | Strings baseadas em ICU (catálogos JSON ou JavaScript) | Arquivos de recurso JSON (ou carregadores personalizados). Formato ICU opcional via plugin i18next | Declarações em `.content.[ts/js/tsx]` ou JSON; podem conter strings ou componentes React |
|
|
145
|
-
| **Roteamento** | Tratado externamente (sem roteamento localizado embutido) | Tratado externamente com plugins i18next (detecção de caminho, subdomínio, etc.) | Suporte embutido para roteamento localizado (por exemplo, `/pt/sobre`, `/fr/about`), além de middleware opcional (para SSR/Vite) |
|
|
146
|
-
| **Suporte ao TypeScript** | Bom (tipagens para pacotes oficiais) | Bom, mas configuração extra para traduções tipadas se você quiser verificação rigorosa | Excelente (definições de tipo geradas automaticamente para chaves de conteúdo e traduções) |
|
|
147
|
-
| **Pluralização & Formatação** | Avançado: formatação de data/hora/número incorporada, suporte a plural/gênero | Pluralização configurável. A formatação de data/hora é normalmente feita por meio de libs externas ou plugin i18next | Pode depender de JavaScript Intl padrão ou embutir lógica no conteúdo. Não tão especializado quanto o FormatJS, mas lida com casos típicos. |
|
|
148
|
-
| **Comunidade & Ecossistema** | Grande, parte do ecossistema FormatJS | Muito grande, altamente ativo, muitos plugins (detecção, caching, frameworks) | Menor, mas crescente; abordagem moderna, open-source |
|
|
149
|
-
| **Curva de Aprendizado** | Moderada (aprendendo a sintaxe de mensagem ICU, convenções do FormatJS) | Baixa a moderada (uso direto, mas configuração avançada pode se tornar verbosa) | Moderada (conceito de declarações de conteúdo e etapas de build especializadas) |
|
|
118
|
+
**Por que isso importa:** Pacotes menores e menos strings não utilizadas melhoram o desempenho de inicialização e navegação.
|
|
150
119
|
|
|
151
120
|
---
|
|
152
121
|
|
|
153
|
-
|
|
122
|
+
### 6) DX, ferramentas e manutenção
|
|
154
123
|
|
|
155
|
-
|
|
124
|
+
- **react-intl / react-i18next**: Ecossistema comunitário amplo; para fluxos editoriais, normalmente você adota plataformas externas de localização.
|
|
125
|
+
- **Intlayer**: Inclui um **Editor Visual gratuito** e um **CMS opcional** (mantenha o conteúdo no Git ou externalize-o). Também oferece uma **extensão para VSCode** para autoria de conteúdo e **tradução assistida por IA** usando suas próprias chaves de provedor.
|
|
156
126
|
|
|
157
|
-
|
|
158
|
-
- Você prefere uma abordagem mais “**baseada em padrões**” para traduções.
|
|
159
|
-
- Você não requer roteamento localizado ou chaves de tradução fortemente tipadas.
|
|
127
|
+
**Por que isso importa:** Ferramentas integradas encurtam o ciclo entre desenvolvedores e autores de conteúdo - menos código de ligação, menos dependências de fornecedores.
|
|
160
128
|
|
|
161
|
-
|
|
129
|
+
---
|
|
162
130
|
|
|
163
|
-
|
|
164
|
-
- Você deseja detecção de idioma **baseada em plugins** (por exemplo, a partir de URL, cookies, armazenamento local) ou cache avançado.
|
|
165
|
-
- Você precisa do maior ecossistema, com muitas integrações existentes para vários frameworks (Next.js, React Native, etc.).
|
|
131
|
+
## Quando escolher qual?
|
|
166
132
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
- Você requer **roteamento localizado embutido** ou deseja facilmente incorporá-lo em sua configuração de SSR ou Vite.
|
|
171
|
-
- Você deseja uma abordagem moderna ou simplesmente quer uma única biblioteca que cubra tanto a **gestão de conteúdo** (i18n) quanto o **roteamento** de forma segura.
|
|
133
|
+
- **Escolha react-intl** se você quiser formatação de mensagens **priorizando ICU** com uma API direta e alinhada aos padrões, e sua equipe estiver confortável em manter catálogos e verificações de segurança manualmente.
|
|
134
|
+
- **Escolha react-i18next** se precisar da **amplitude do ecossistema do i18next** (detectores, backends, plugin ICU, integrações) e aceitar mais configuração para ganhar flexibilidade.
|
|
135
|
+
- **Escolha Intlayer** se você valoriza **conteúdo escopado por componente**, **TypeScript rigoroso**, **garantias em tempo de build**, **tree-shaking** e ferramentas editoriais **com tudo incluído** - especialmente para apps React **grandes e modulares**.
|
|
172
136
|
|
|
173
137
|
---
|
|
174
138
|
|
|
175
|
-
##
|
|
176
|
-
|
|
177
|
-
Cada biblioteca oferece uma solução robusta para internacionalizar uma aplicação React:
|
|
178
|
-
|
|
179
|
-
- **React-Intl** é excelente em formatação de mensagens e é uma escolha popular para soluções empresariais focadas na sintaxe de mensagem ICU.
|
|
180
|
-
- **React-i18next** fornece um ambiente altamente flexível, impulsionado por plugins para necessidades avançadas ou dinâmicas de i18n.
|
|
181
|
-
- **Intlayer** oferece uma abordagem **moderna e fortemente tipada** que une declarações de conteúdo, roteamento localizado avançado e integrações baseadas em plugins (CRA, Vite).
|
|
139
|
+
## Notas práticas de migração (react-intl / react-i18next → Intlayer)
|
|
182
140
|
|
|
183
|
-
|
|
141
|
+
- **Migre de forma incremental**: Comece com uma funcionalidade ou rota; mantenha os catálogos legados em paralelo durante a transição.
|
|
142
|
+
- **Adote dicionários por componente**: Coloque o conteúdo junto aos componentes para reduzir o acoplamento.
|
|
143
|
+
- **Habilite verificações rigorosas**: Permita que erros em tempo de build revelem chaves/locais faltantes cedo no CI.
|
|
144
|
+
- **Meça os bundles**: Espere reduções conforme strings não usadas forem eliminadas.
|
|
184
145
|
|
|
185
146
|
---
|
|
186
147
|
|
|
187
|
-
|
|
148
|
+
## Conclusão
|
|
188
149
|
|
|
189
|
-
|
|
190
|
-
- [Documentação do React-i18next](https://react.i18next.com/)
|
|
191
|
-
- [Intlayer + Guia de Introdução ao CRA](#) (do seu doc)
|
|
192
|
-
- [Intlayer + Guia de Introdução ao Vite & React](#) (do seu doc)
|
|
150
|
+
Todas as três bibliotecas localizam o React de forma eficaz. O diferencial é quanto de **infraestrutura** você precisa construir para alcançar uma configuração **segura e escalável**:
|
|
193
151
|
|
|
194
|
-
|
|
152
|
+
- Com o **Intlayer**, **conteúdo modular**, **tipagem TS rigorosa**, **segurança em tempo de compilação**, **pacotes otimizados por tree-shaking** e **ferramentas editoriais** são padrões - não tarefas.
|
|
153
|
+
- Se sua equipe valoriza **manutenibilidade e velocidade** em aplicativos React multi-idioma e orientados a componentes, o Intlayer oferece o fluxo de trabalho para desenvolvedores e conteúdo mais **completo** atualmente.
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2024-08-11
|
|
3
|
+
updatedAt: 2025-08-23
|
|
4
|
+
title: vue-i18n vs Intlayer
|
|
5
|
+
description: Comparação entre vue-i18n e Intlayer para internacionalização (i18n) em apps Vue/Nuxt
|
|
6
|
+
keywords:
|
|
7
|
+
- vue-i18n
|
|
8
|
+
- Intlayer
|
|
9
|
+
- Internacionalização
|
|
10
|
+
- i18n
|
|
11
|
+
- Blog
|
|
12
|
+
- Vue
|
|
13
|
+
- Nuxt
|
|
14
|
+
- JavaScript
|
|
15
|
+
slugs:
|
|
16
|
+
- blog
|
|
17
|
+
- vue-i18n-vs-intlayer
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# vue-i18n VS Intlayer | Internacionalização (i18n) em Vue
|
|
21
|
+
|
|
22
|
+
Este guia compara duas opções populares de i18n para **Vue 3** (e **Nuxt**): **vue-i18n** e **Intlayer**.
|
|
23
|
+
Focamos nas ferramentas modernas do Vue (Vite, Composition API) e avaliamos:
|
|
24
|
+
|
|
25
|
+
1. **Arquitetura & organização de conteúdo**
|
|
26
|
+
2. **TypeScript & segurança**
|
|
27
|
+
3. **Tratamento de traduções faltantes**
|
|
28
|
+
4. **Roteamento & estratégia de URL**
|
|
29
|
+
5. **Performance & comportamento de carregamento**
|
|
30
|
+
6. **Experiência do desenvolvedor (DX), ferramentas & manutenção**
|
|
31
|
+
7. **SEO & escalabilidade para grandes projetos**
|
|
32
|
+
|
|
33
|
+
> **resumo**: Ambos podem localizar apps Vue. Se você deseja **conteúdo com escopo de componente**, **tipos TypeScript rigorosos**, **verificações de chaves faltantes em tempo de build**, **dicionários otimizados por tree-shaking**, e **helpers integrados para roteamento/SEO** além de **Editor Visual & traduções com IA**, **Intlayer** é a escolha mais completa e moderna.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Posicionamento em alto nível
|
|
38
|
+
|
|
39
|
+
- **vue-i18n** - A biblioteca i18n padrão para Vue. Formatação flexível de mensagens (estilo ICU), blocos SFC `<i18n>` para mensagens locais, e um grande ecossistema. Segurança e manutenção em larga escala ficam principalmente por sua conta.
|
|
40
|
+
- **Intlayer** - Modelo de conteúdo centrado em componentes para Vue/Vite/Nuxt com **tipagem TS rigorosa**, **verificações em tempo de build**, **tree-shaking**, **helpers para roteador e SEO**, **Editor Visual/CMS** opcional e **traduções assistidas por IA**.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Comparação de Recursos Lado a Lado (focada em Vue)
|
|
45
|
+
|
|
46
|
+
| Recurso | **Intlayer** | **vue-i18n** |
|
|
47
|
+
| -------------------------------------------------- | ------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- |
|
|
48
|
+
| **Traduções próximas aos componentes** | ✅ Sim, conteúdo colocalizado por componente (ex.: `MyComp.content.ts`) | ✅ Sim, via blocos SFC `<i18n>` (opcional) |
|
|
49
|
+
| **Integração com TypeScript** | ✅ Avançada, tipos **estritos** gerados automaticamente e autocompletar de chaves | ✅ Boas tipagens; **segurança estrita de chaves requer configuração/disciplinas adicionais** |
|
|
50
|
+
| **Detecção de tradução ausente** | ✅ Avisos/erros em **tempo de build** e exposição no TS | ⚠️ Fallbacks/avisos em tempo de execução |
|
|
51
|
+
| **Conteúdo rico (componentes/Markdown)** | ✅ Suporte direto para nós ricos e arquivos de conteúdo Markdown | ⚠️ Limitado (componentes via `<i18n-t>`, Markdown via plugins externos) |
|
|
52
|
+
| **Tradução com IA** | ✅ Fluxos de trabalho integrados usando suas próprias chaves de provedores de IA | ❌ Não integrado |
|
|
53
|
+
| **Editor Visual / CMS** | ✅ Editor Visual gratuito e CMS opcional | ❌ Não integrado (use plataformas externas) |
|
|
54
|
+
| **Roteamento localizado** | ✅ Auxiliares para Vue Router/Nuxt para gerar caminhos localizados, URLs e `hreflang` | ⚠️ Não é parte do núcleo (use Nuxt i18n ou configuração personalizada do Vue Router) |
|
|
55
|
+
| **Geração dinâmica de rotas** | ✅ Sim | ❌ Não fornecido (Nuxt i18n fornece) |
|
|
56
|
+
| **Pluralização e formatação** | ✅ Padrões de enumeração; formatadores baseados em Intl | ✅ Mensagens no estilo ICU; formatadores Intl |
|
|
57
|
+
| **Formatos de conteúdo** | ✅ `.ts`, `.js`, `.json`, `.md`, `.txt` (YAML em desenvolvimento) | ✅ `.json`, `.js` (além de blocos SFC `<i18n>`) |
|
|
58
|
+
| **Suporte ICU** | ⚠️ Em desenvolvimento | ✅ Sim |
|
|
59
|
+
| **Auxiliares de SEO (sitemap, robots, metadados)** | ✅ Auxiliares integrados (independente de framework) | ❌ Não faz parte do núcleo (Nuxt i18n/comunidade) |
|
|
60
|
+
| **SSR/SSG** | ✅ Funciona com Vue SSR e Nuxt; não bloqueia a renderização estática | ✅ Funciona com Vue SSR/Nuxt |
|
|
61
|
+
| **Tree-shaking (enviar apenas o conteúdo usado)** | ✅ Por componente em tempo de build | ⚠️ Parcial; requer divisão manual de código/mensagens assíncronas |
|
|
62
|
+
| **Carregamento preguiçoso (Lazy loading)** | ✅ Por localidade / por dicionário | ✅ Suporte a mensagens de localidade assíncronas |
|
|
63
|
+
| **Purgar conteúdo não utilizado** | ✅ Sim (em tempo de build) | ❌ Não incorporado |
|
|
64
|
+
| **Manutenção em projetos grandes** | ✅ Incentiva estrutura modular, amigável a design systems | ✅ Possível, mas requer disciplina rigorosa de arquivos/namespace |
|
|
65
|
+
| **Ecossistema / comunidade** | ⚠️ Menor, mas crescendo rapidamente | ✅ Grande e madura no ecossistema Vue |
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Comparação detalhada
|
|
70
|
+
|
|
71
|
+
### 1) Arquitetura e escalabilidade
|
|
72
|
+
|
|
73
|
+
- **vue-i18n**: Configurações comuns usam **catálogos centralizados** por localidade (opcionalmente divididos em arquivos/namespace). Blocos SFC `<i18n>` permitem mensagens locais, mas as equipes frequentemente retornam a catálogos compartilhados conforme os projetos crescem.
|
|
74
|
+
- **Intlayer**: Promove **dicionários por componente** armazenados ao lado do componente que atendem. Isso reduz conflitos entre equipes, mantém o conteúdo descobrível e limita naturalmente a deriva/chaves não utilizadas.
|
|
75
|
+
|
|
76
|
+
**Por que isso importa:** Em grandes aplicativos Vue ou sistemas de design, **conteúdo modular** escala melhor do que catálogos monolíticos.
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
### 2) TypeScript & segurança
|
|
81
|
+
|
|
82
|
+
- **vue-i18n**: Bom suporte a TS; **tipagem estrita de chaves** normalmente requer esquemas/genéricos personalizados e convenções cuidadosas.
|
|
83
|
+
- **Intlayer**: **Gera tipos estritos** a partir do seu conteúdo, oferecendo **autocompletar no IDE** e **erros em tempo de compilação** para erros de digitação/chaves ausentes.
|
|
84
|
+
|
|
85
|
+
**Por que isso importa:** Tipagem forte detecta problemas **antes** da execução.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
### 3) Tratamento de traduções ausentes
|
|
90
|
+
|
|
91
|
+
- **vue-i18n**: Avisos/falhas em **tempo de execução** (ex.: fallback para localidade ou chave).
|
|
92
|
+
- **Intlayer**: Detecção em **tempo de build** com avisos/erros entre localidades e chaves.
|
|
93
|
+
|
|
94
|
+
**Por que isso importa:** Aplicação em tempo de build mantém a interface de produção limpa e consistente.
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
### 4) Estratégia de roteamento e URLs (Vue Router/Nuxt)
|
|
99
|
+
|
|
100
|
+
- **Ambos** podem funcionar com rotas localizadas.
|
|
101
|
+
- **Intlayer** fornece auxiliares para **gerar caminhos localizados**, **gerenciar prefixos de localidade** e emitir **`<link rel="alternate" hreflang>`** para SEO. Com Nuxt, complementa o roteamento do framework.
|
|
102
|
+
|
|
103
|
+
**Por que isso importa:** Menos camadas personalizadas e **SEO mais limpo** entre localidades.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
### 5) Desempenho e comportamento de carregamento
|
|
108
|
+
|
|
109
|
+
- **vue-i18n**: Suporta mensagens de localidade assíncronas; evitar sobrecarregamento é sua responsabilidade (divida os catálogos com cuidado).
|
|
110
|
+
- **Intlayer**: **Elimina código morto** na build e **carrega preguiçosamente por dicionário/localidade**. Conteúdo não utilizado não é enviado.
|
|
111
|
+
|
|
112
|
+
**Por que isso importa:** Pacotes menores e inicialização mais rápida para apps Vue multilíngues.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
### 6) Experiência do desenvolvedor e ferramentas
|
|
117
|
+
|
|
118
|
+
- **vue-i18n**: Documentação madura e comunidade consolidada; normalmente você dependerá de **plataformas externas de localização** para fluxos editoriais.
|
|
119
|
+
- **Intlayer**: Oferece um **Editor Visual gratuito**, **CMS** opcional (compatível com Git ou externalizado), uma **extensão para VSCode**, utilitários **CLI/CI** e **traduções assistidas por IA** usando suas próprias chaves de provedor.
|
|
120
|
+
|
|
121
|
+
**Por que isso importa:** Menor custo operacional e um ciclo de desenvolvimento–conteúdo mais curto.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
### 7) SEO, SSR & SSG
|
|
126
|
+
|
|
127
|
+
- **Ambos** funcionam com Vue SSR e Nuxt.
|
|
128
|
+
- **Intlayer**: Adiciona **auxiliares de SEO** (sitemaps/metadados/`hreflang`) que são independentes de framework e funcionam bem com builds Vue/Nuxt.
|
|
129
|
+
|
|
130
|
+
**Por que isso importa:** SEO internacional sem configurações personalizadas complexas.
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Por que Intlayer? (Problema & abordagem)
|
|
135
|
+
|
|
136
|
+
A maioria das pilhas i18n (incluindo **vue-i18n**) começa a partir de **catálogos centralizados**:
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
.
|
|
140
|
+
├── locales
|
|
141
|
+
│ ├── en.json
|
|
142
|
+
│ ├── es.json
|
|
143
|
+
│ └── fr.json
|
|
144
|
+
└── src
|
|
145
|
+
└── components
|
|
146
|
+
└── MyComponent.vue
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Ou com pastas por localidade:
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
.
|
|
153
|
+
├── locales
|
|
154
|
+
│ ├── en
|
|
155
|
+
│ │ ├── footer.json
|
|
156
|
+
│ │ └── navbar.json
|
|
157
|
+
│ ├── fr
|
|
158
|
+
│ │ ├── footer.json
|
|
159
|
+
│ │ └── navbar.json
|
|
160
|
+
│ └── es
|
|
161
|
+
│ ├── footer.json
|
|
162
|
+
│ └── navbar.json
|
|
163
|
+
└── src
|
|
164
|
+
└── components
|
|
165
|
+
└── MyComponent.vue
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Isso frequentemente desacelera o desenvolvimento conforme os apps crescem:
|
|
169
|
+
|
|
170
|
+
1. **Para um novo componente** você cria/edita catálogos remotos, conecta namespaces e traduz (frequentemente via copiar/colar manual de ferramentas de IA).
|
|
171
|
+
2. **Ao modificar componentes** você procura chaves compartilhadas, traduz, mantém as localidades sincronizadas, remove chaves obsoletas e alinha as estruturas JSON.
|
|
172
|
+
|
|
173
|
+
**Intlayer** delimita o conteúdo **por componente** e mantém-no **junto ao código**, como já fazemos com CSS, histórias, testes e documentação:
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
.
|
|
177
|
+
└── components
|
|
178
|
+
└── MyComponent
|
|
179
|
+
├── MyComponent.content.ts
|
|
180
|
+
└── MyComponent.vue
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
**Declaração de conteúdo** (por componente):
|
|
184
|
+
|
|
185
|
+
```ts fileName="./components/MyComponent/MyComponent.content.ts"
|
|
186
|
+
import { t, type Dictionary } from "intlayer";
|
|
187
|
+
|
|
188
|
+
const componentExampleContent = {
|
|
189
|
+
key: "component-example",
|
|
190
|
+
content: {
|
|
191
|
+
greeting: t({
|
|
192
|
+
en: "Hello World",
|
|
193
|
+
es: "Hola Mundo",
|
|
194
|
+
fr: "Bonjour le monde",
|
|
195
|
+
}),
|
|
196
|
+
},
|
|
197
|
+
} satisfies Dictionary;
|
|
198
|
+
|
|
199
|
+
export default componentExampleContent;
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
**Uso no Vue** (Composition API):
|
|
203
|
+
|
|
204
|
+
```vue fileName="./components/MyComponent/MyComponent.vue"
|
|
205
|
+
<script setup lang="ts">
|
|
206
|
+
import { useIntlayer } from "vue-intlayer"; // Integração Vue
|
|
207
|
+
const { greeting } = useIntlayer("component-example");
|
|
208
|
+
</script>
|
|
209
|
+
|
|
210
|
+
<template>
|
|
211
|
+
<span>{{ greeting }}</span>
|
|
212
|
+
</template>
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
Esta abordagem:
|
|
216
|
+
|
|
217
|
+
- **Acelera o desenvolvimento** (declare uma vez; IDE/IA completa automaticamente).
|
|
218
|
+
- **Limpa a base de código** (1 componente = 1 dicionário).
|
|
219
|
+
- **Facilita duplicação/migração** (copie um componente e seu conteúdo juntos).
|
|
220
|
+
- **Evita chaves mortas** (componentes não usados não importam conteúdo).
|
|
221
|
+
- **Otimiza o carregamento** (componentes carregados sob demanda trazem seu conteúdo junto).
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## Funcionalidades adicionais do Intlayer (relevantes para Vue)
|
|
226
|
+
|
|
227
|
+
- **Suporte multiplataforma**: Funciona com Vue, Nuxt, Vite, React, Express e mais.
|
|
228
|
+
- **Gerenciamento de conteúdo baseado em JavaScript**: Declare no código com total flexibilidade.
|
|
229
|
+
- **Arquivo de declaração por localidade**: Defina todas as localidades e deixe as ferramentas gerarem o restante.
|
|
230
|
+
- **Ambiente com tipagem segura**: Configuração forte de TS com autocompletar.
|
|
231
|
+
- **Recuperação simplificada de conteúdo**: Um único hook/composable para buscar todo o conteúdo de um dicionário.
|
|
232
|
+
- **Base de código organizada**: 1 componente = 1 dicionário na mesma pasta.
|
|
233
|
+
- **Roteamento aprimorado**: Auxiliares para caminhos e metadados localizados do **Vue Router/Nuxt**.
|
|
234
|
+
- **Suporte a Markdown**: Importe Markdown remoto/local por localidade; exponha frontmatter para o código.
|
|
235
|
+
- **Editor Visual gratuito e CMS opcional**: Criação de conteúdo sem plataforma de localização paga; sincronização amigável ao Git.
|
|
236
|
+
- **Conteúdo tree-shakable**: Envia apenas o que é usado; suporta carregamento preguiçoso.
|
|
237
|
+
- **Compatível com renderização estática**: Não bloqueia SSG.
|
|
238
|
+
- **Traduções com IA**: Traduza para 231 idiomas usando seu próprio provedor de IA/chave de API.
|
|
239
|
+
- **Servidor MCP & extensão VSCode**: Automatize fluxos de trabalho i18n e autoria dentro do seu IDE.
|
|
240
|
+
- **Interoperabilidade**: Integrações com **vue-i18n**, **react-i18next** e **react-intl** quando necessário.
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Quando escolher qual?
|
|
245
|
+
|
|
246
|
+
- **Escolha vue-i18n** se você quiser a **abordagem padrão do Vue**, estiver confortável gerenciando catálogos/namespace por conta própria, e seu app for **pequeno a médio porte** (ou já depender do Nuxt i18n).
|
|
247
|
+
- **Escolha Intlayer** se você valoriza **conteúdo escopado por componente**, **TypeScript rigoroso**, **garantias em tempo de build**, **tree-shaking**, e ferramentas completas para roteamento/SEO/editor - especialmente para **códigos Vue/Nuxt grandes e modulares**.
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
## Notas práticas de migração (vue-i18n → Intlayer)
|
|
252
|
+
|
|
253
|
+
- **Comece por funcionalidade**: Mova uma rota/visualização/componente de cada vez para os dicionários locais do Intlayer.
|
|
254
|
+
- **Ponte durante a migração**: Mantenha os catálogos vue-i18n em paralelo; substitua as consultas gradualmente.
|
|
255
|
+
- **Ative verificações rigorosas**: Permita que a detecção em tempo de compilação identifique cedo chaves/locais ausentes.
|
|
256
|
+
- **Adote auxiliares de roteador/SEO**: Padronize a detecção de localidade e as tags `hreflang`.
|
|
257
|
+
- **Meça os pacotes**: Espere **reduções no tamanho dos pacotes** à medida que o conteúdo não utilizado é excluído.
|
|
258
|
+
|
|
259
|
+
---
|
|
260
|
+
|
|
261
|
+
## Conclusão
|
|
262
|
+
|
|
263
|
+
Tanto o **vue-i18n** quanto o **Intlayer** localizam bem aplicações Vue. A diferença está em **quanto você precisa construir por conta própria** para alcançar uma configuração robusta e escalável:
|
|
264
|
+
|
|
265
|
+
- Com **Intlayer**, **conteúdo modular**, **TS rigoroso**, **segurança em tempo de build**, **bundles otimizados por tree-shaking** e **ferramentas para router/SEO/editor** vêm **prontos para usar**.
|
|
266
|
+
- Se sua equipe prioriza **manutenibilidade e velocidade** em um app Vue/Nuxt multi-local, orientado a componentes, o Intlayer oferece a experiência **mais completa** atualmente.
|
|
267
|
+
|
|
268
|
+
Consulte o documento ['Por que Intlayer?'](https://intlayer.org/doc/why) para mais detalhes.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
|
-
createdAt:
|
|
3
|
-
updatedAt: 2025-
|
|
2
|
+
createdAt: 2025-08-23
|
|
3
|
+
updatedAt: 2025-08-23
|
|
4
4
|
title: Intlayer и next-i18next
|
|
5
5
|
description: Интегрируйте Intlayer с next-i18next для приложения Next.js
|
|
6
6
|
keywords:
|
|
@@ -24,7 +24,6 @@ slugs:
|
|
|
24
24
|
Обе решения включают три основных понятия:
|
|
25
25
|
|
|
26
26
|
1. **Декларация контента**: Метод определения переводимого контента вашего приложения.
|
|
27
|
-
|
|
28
27
|
- Называемый `resource` в случае `i18next`, декларация контента - это структурированный объект JSON, содержащий пары ключ-значение для переводов на одном или нескольких языках. Смотрите [документацию i18next](https://www.i18next.com/translation-function/essentials) для получения дополнительной информации.
|
|
29
28
|
- Называемый `content declaration file` в случае `Intlayer`, декларация контента может быть JSON, JS или TS файлом, экспортирующим структурированные данные. Смотрите [документацию Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/doc/concept/content) для получения дополнительной информации.
|
|
30
29
|
|
|
@@ -213,8 +212,8 @@ const content = {
|
|
|
213
212
|
content: {
|
|
214
213
|
myTranslatedContent: t({
|
|
215
214
|
en: "Hello World",
|
|
216
|
-
fr: "Bonjour le monde",
|
|
217
215
|
es: "Hola Mundo",
|
|
216
|
+
fr: "Bonjour le monde",
|
|
218
217
|
}),
|
|
219
218
|
},
|
|
220
219
|
} satisfies Dictionary;
|
|
@@ -231,8 +230,8 @@ const content = {
|
|
|
231
230
|
content: {
|
|
232
231
|
myTranslatedContent: t({
|
|
233
232
|
en: "Hello World",
|
|
234
|
-
fr: "Bonjour le monde",
|
|
235
233
|
es: "Hola Mundo",
|
|
234
|
+
fr: "Bonjour le monde",
|
|
236
235
|
}),
|
|
237
236
|
},
|
|
238
237
|
};
|
|
@@ -246,8 +245,8 @@ module.exports = {
|
|
|
246
245
|
content: {
|
|
247
246
|
myTranslatedContent: t({
|
|
248
247
|
en: "Hello World",
|
|
249
|
-
fr: "Bonjour le monde",
|
|
250
248
|
es: "Hola Mundo",
|
|
249
|
+
fr: "Bonjour le monde",
|
|
251
250
|
}),
|
|
252
251
|
},
|
|
253
252
|
};
|