@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-
|
|
4
|
+
title: react-i18next vs react-intl vs Intlayer
|
|
5
5
|
description: Integra react-i18next con next-intl e Intlayer per l'internazionalizzazione (i18n) di un'app React
|
|
6
6
|
keywords:
|
|
7
7
|
- next-intl
|
|
8
8
|
- react-i18next
|
|
9
9
|
- Intlayer
|
|
10
10
|
- Internazionalizzazione
|
|
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 | Internazionalizzazione (i18n) in React
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
Questa guida confronta tre opzioni consolidate per l'i18n in **React**: **react-intl** (FormatJS), **react-i18next** (i18next) e **Intlayer**.
|
|
23
|
+
Ci concentriamo su applicazioni **React plain** (ad esempio, Vite, CRA, SPA). Se usi Next.js, consulta il nostro confronto dedicato a Next.js.
|
|
23
24
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
## 1. Introduzione
|
|
27
|
-
|
|
28
|
-
L'internazionalizzazione (i18n) nelle applicazioni React può essere realizzata in diversi modi. Le tre librerie presentate qui hanno filosofie di design diverse, set di funzionalità e supporto della comunità:
|
|
25
|
+
Valutiamo:
|
|
29
26
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
27
|
+
- Architettura e organizzazione dei contenuti
|
|
28
|
+
- TypeScript e sicurezza
|
|
29
|
+
- Gestione delle traduzioni mancanti
|
|
30
|
+
- Contenuti ricchi e capacità di formattazione
|
|
31
|
+
- Prestazioni e comportamento di caricamento
|
|
32
|
+
- Esperienza sviluppatore (DX), strumenti e manutenzione
|
|
33
|
+
- SEO/routing (dipendente dal framework)
|
|
33
34
|
|
|
34
|
-
|
|
35
|
+
> **tl;dr**: Tutti e tre possono localizzare un'app React. Se desideri **contenuti a livello di componente**, **tipi TypeScript rigorosi**, **controlli delle chiavi mancanti in fase di build**, **dizionari ottimizzati con tree-shaking** e strumenti editoriali integrati (Visual Editor/CMS + traduzione AI opzionale), **Intlayer** è la scelta più completa per codebase React modulari.
|
|
35
36
|
|
|
36
37
|
---
|
|
37
38
|
|
|
38
|
-
##
|
|
39
|
-
|
|
40
|
-
### Panoramica
|
|
41
|
-
|
|
42
|
-
[**React-Intl**](https://formatjs.io/docs/react-intl/) è parte della suite [FormatJS](https://formatjs.io/). Fornisce un potente set di **API e componenti** per gestire la formattazione dei messaggi, la pluralizzazione, la data/ora e la formattazione dei numeri. React-Intl è ampiamente utilizzato nelle applicazioni aziendali, principalmente perché fa parte di un ecosistema che standardizza la sintassi e la formattazione dei messaggi.
|
|
43
|
-
|
|
44
|
-
### Caratteristiche Chiave
|
|
45
|
-
|
|
46
|
-
- **Sintassi del Messaggio ICU**: Offre una sintassi completa per l'interpolazione dei messaggi, la pluralizzazione e altro.
|
|
47
|
-
- **Formattazione Localizzata**: Utilità integrate per formattare date, ore, numeri e tempi relativi in base alla lingua.
|
|
48
|
-
- **Componenti Dichiarativi**: Espone `<FormattedMessage>`, `<FormattedNumber>`, `<FormattedDate>`, ecc., per un utilizzo senza soluzione di continuità in JSX.
|
|
49
|
-
- **Ecosistema Ricco**: Si integra bene con gli strumenti FormatJS (ad es., [babel-plugin-react-intl](https://formatjs.io/docs/tooling/babel-plugin/)) per estrarre, gestire e compilare messaggi.
|
|
50
|
-
|
|
51
|
-
### Flusso di Lavoro Tipico
|
|
52
|
-
|
|
53
|
-
1. **Definisci cataloghi di messaggi** (solitamente file JSON per ogni lingua).
|
|
54
|
-
2. **Avvolgi la tua app** in `<IntlProvider locale="it" messages={messages}>`.
|
|
55
|
-
3. **Usa** `<FormattedMessage id="myMessage" defaultMessage="Ciao mondo" />` o il hook `useIntl()` per accedere alle stringhe di traduzione.
|
|
56
|
-
|
|
57
|
-
### Vantaggi
|
|
58
|
-
|
|
59
|
-
- Ben consolidato e utilizzato in molti ambienti di produzione.
|
|
60
|
-
- Formattazione di messaggi avanzata, inclusa pluralizzazione, genere, fusi orari e altro.
|
|
61
|
-
- Supporto forte per gli strumenti per l'estrazione e la compilazione dei messaggi.
|
|
62
|
-
|
|
63
|
-
### Svantaggi
|
|
39
|
+
## Posizionamento ad alto livello
|
|
64
40
|
|
|
65
|
-
-
|
|
66
|
-
-
|
|
41
|
+
- **react-intl** - Formattazione basata su ICU e allineata agli standard (date/numeri/plurali) con un'API matura. I cataloghi sono tipicamente centralizzati; la sicurezza delle chiavi e la validazione in fase di build dipendono in gran parte da te.
|
|
42
|
+
- **react-i18next** - Estremamente popolare e flessibile; namespaces, rilevatori e molti plugin (ICU, backend). Potente, ma la configurazione può espandersi man mano che i progetti crescono.
|
|
43
|
+
- **Intlayer** - Modello di contenuto incentrato sul componente per React, **tipizzazione TS rigorosa**, **controlli in fase di build**, **tree-shaking**, oltre a **Visual Editor/CMS** e **traduzioni assistite da AI**. Funziona con React Router, Vite, CRA, ecc.
|
|
67
44
|
|
|
68
45
|
---
|
|
69
46
|
|
|
70
|
-
##
|
|
47
|
+
## Matrice delle funzionalità (focus su React)
|
|
48
|
+
|
|
49
|
+
| Funzionalità | `react-intlayer` (Intlayer) | `react-i18next` (i18next) | `react-intl` (FormatJS) |
|
|
50
|
+
| ------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
|
|
51
|
+
| **Traduzioni Vicino ai Componenti** | ✅ Sì, contenuto collocato con ogni componente | ❌ No | ❌ No |
|
|
52
|
+
| **Integrazione TypeScript** | ✅ Avanzata, tipi rigorosi generati automaticamente | ⚠️ Base; configurazione extra per sicurezza | ✅ Buona, ma meno rigorosa |
|
|
53
|
+
| **Rilevamento Traduzioni Mancanti** | ✅ Evidenziazione errori TypeScript e errori/avvisi in fase di compilazione | ⚠️ Principalmente stringhe di fallback a runtime | ⚠️ Stringhe di fallback |
|
|
54
|
+
| **Contenuto Ricco (JSX/Markdown/componenti)** | ✅ Supporto diretto | ⚠️ Limitato / solo interpolazione | ⚠️ Sintassi ICU, non vero JSX |
|
|
55
|
+
| **Traduzione basata su AI** | ✅ Sì, supporta più provider AI. Utilizzabile con le proprie chiavi API. Considera il contesto della tua applicazione e l'ambito del contenuto | ❌ No | ❌ No |
|
|
56
|
+
| **Editor Visivo** | ✅ Sì, Editor Visivo locale + CMS opzionale; può esternalizzare il contenuto del codice; integrabile | ❌ No / disponibile tramite piattaforme di localizzazione esterne | ❌ No / disponibile tramite piattaforme di localizzazione esterne |
|
|
57
|
+
| **Routing Localizzato** | ✅ Sì, supporta percorsi localizzati out of the box (funziona con Next.js e Vite) | ⚠️ Non integrato, richiede plugin (es. `next-i18next`) o configurazione personalizzata del router | ❌ No, solo formattazione dei messaggi, il routing deve essere manuale |
|
|
58
|
+
| **Generazione Dinamica delle Rotte** | ✅ Sì | ⚠️ Plugin/ecosistema o configurazione manuale | ❌ Non fornito |
|
|
59
|
+
| **Pluralizzazione** | ✅ Modelli basati su enumerazioni | ✅ Configurabile (plugin come i18next-icu) | ✅ (ICU) |
|
|
60
|
+
| **Formattazione (date, numeri, valute)** | ✅ Formatter ottimizzati (Intl sotto il cofano) | ⚠️ Tramite plugin o utilizzo personalizzato di Intl | ✅ Formatter ICU |
|
|
61
|
+
| **Formato del contenuto** | ✅ .tsx, .ts, .js, .json, .md, .txt, (.yaml WIP) | ⚠️ .json | ✅ .json, .js |
|
|
62
|
+
| **Supporto ICU** | ⚠️ In lavorazione | ⚠️ Tramite plugin (i18next-icu) | ✅ Sì |
|
|
63
|
+
| **SEO Helpers (hreflang, sitemap)** | ✅ Strumenti integrati: helper per sitemap, robots.txt, metadata | ⚠️ Plugin della community/manuale | ❌ Non incluso nel core |
|
|
64
|
+
| **Ecosistema / Community** | ⚠️ Più piccolo ma in rapida crescita e reattivo | ✅ Il più grande e maturo | ✅ Grande |
|
|
65
|
+
| **Rendering lato server e Componenti Server** | ✅ Sì, ottimizzato per SSR / Componenti Server React | ⚠️ Supportato a livello di pagina ma è necessario passare le funzioni t sull'albero dei componenti per i componenti server figli | ❌ Non supportato, è necessario passare le funzioni t sull'albero dei componenti per i componenti server figli |
|
|
66
|
+
| **Tree-shaking (caricamento solo del contenuto usato)** | ✅ Sì, per componente al momento della build tramite plugin Babel/SWC | ⚠️ Di solito carica tutto (può essere migliorato con namespace/suddivisione del codice) | ⚠️ Di solito carica tutto |
|
|
67
|
+
| **Lazy loading** | ✅ Sì, per locale / per dizionario | ✅ Sì (ad esempio, backend/namespace su richiesta) | ✅ Sì (bundle di locale suddivisi) |
|
|
68
|
+
| **Rimozione del contenuto non utilizzato** | ✅ Sì, per dizionario al momento della build | ❌ No, solo tramite segmentazione manuale dei namespace | ❌ No, tutti i messaggi dichiarati sono inclusi nel bundle |
|
|
69
|
+
| **Gestione di Grandi Progetti** | ✅ Favorisce la modularità, adatto per sistemi di design | ⚠️ Richiede una buona disciplina nella gestione dei file | ⚠️ I cataloghi centrali possono diventare molto grandi |
|
|
71
70
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
[**React-i18next**](https://react.i18next.com/) è un'estensione React di [i18next](https://www.i18next.com/), uno dei framework i18n JavaScript più popolari. Offre **caratteristiche estensive** per traduzioni a runtime, caricamento lazy e rilevamento della lingua, rendendolo estremamente flessibile per una vasta gamma di casi d'uso.
|
|
75
|
-
|
|
76
|
-
### Caratteristiche Chiave
|
|
77
|
-
|
|
78
|
-
- **Struttura di Traduzione Flessibile**: Non legato a un formato singolo come ICU. Puoi memorizzare traduzioni in JSON, utilizzare l'interpolazione, la pluralizzazione, ecc.
|
|
79
|
-
- **Cambio Lingua Dinamico**: Plugin di rilevamento lingua integrati e aggiornamenti a runtime.
|
|
80
|
-
- **Traduzioni Annidate e Strutturate**: Puoi annidare facilmente le traduzioni all'interno del JSON.
|
|
81
|
-
- **Ecosistema di Plugin Estensivo**: Per rilevamento (browser, percorso, sottodominio, ecc.), caricamento delle risorse, caching e altro.
|
|
82
|
-
|
|
83
|
-
### Flusso di Lavoro Tipico
|
|
84
|
-
|
|
85
|
-
1. **Installa `i18next` & `react-i18next`.**
|
|
86
|
-
2. **Configura i18n** per caricare traduzioni (JSON) e impostare il rilevamento o il fallback della lingua.
|
|
87
|
-
3. **Avvolgi la tua app** in `I18nextProvider`.
|
|
88
|
-
4. **Usa il hook `useTranslation()`** o il componente `<Trans>` per visualizzare le traduzioni.
|
|
71
|
+
---
|
|
89
72
|
|
|
90
|
-
|
|
73
|
+
## Confronto Approfondito
|
|
91
74
|
|
|
92
|
-
|
|
93
|
-
- Comunità molto attiva e grande ecosistema di plugin.
|
|
94
|
-
- Facilità di **caricamento dinamico** delle traduzioni (ad es., da un server, su richiesta).
|
|
75
|
+
### 1) Architettura e scalabilità
|
|
95
76
|
|
|
96
|
-
|
|
77
|
+
- **react-intl / react-i18next**: La maggior parte delle configurazioni mantiene **cartelle di locale centralizzate** per lingua, a volte suddivise in **namespace** (i18next). Funziona bene all'inizio ma diventa una superficie condivisa man mano che le app crescono.
|
|
78
|
+
- **Intlayer**: Promuove **dizionari per componente (o per funzionalità)** **collocati insieme** all'interfaccia utente che servono. Questo mantiene chiara la proprietà, facilita la duplicazione/migrazione dei componenti e riduce il turnover delle chiavi tra i team. Il contenuto non utilizzato è più facile da identificare e rimuovere.
|
|
97
79
|
|
|
98
|
-
|
|
99
|
-
- Se preferisci traduzioni fortemente tipizzate, potresti aver bisogno di configurazioni TypeScript aggiuntive.
|
|
80
|
+
**Perché è importante:** Il contenuto modulare rispecchia l'interfaccia utente modulare. I grandi codebase React rimangono più puliti quando le traduzioni vivono con i componenti a cui appartengono.
|
|
100
81
|
|
|
101
82
|
---
|
|
102
83
|
|
|
103
|
-
|
|
84
|
+
### 2) TypeScript e sicurezza
|
|
104
85
|
|
|
105
|
-
|
|
86
|
+
- **react-intl**: Tipizzazioni solide, ma **nessuna tipizzazione automatica delle chiavi**; devi applicare tu stesso i pattern di sicurezza.
|
|
87
|
+
- **react-i18next**: Tipizzazioni forti per gli hook; la **tipizzazione rigorosa delle chiavi** richiede tipicamente configurazioni extra o generatori.
|
|
88
|
+
- **Intlayer**: **Genera automaticamente tipi rigorosi** dal tuo contenuto. L'autocompletamento dell'IDE e gli **errori a tempo di compilazione** individuano errori di battitura e chiavi mancanti prima dell'esecuzione.
|
|
106
89
|
|
|
107
|
-
|
|
90
|
+
**Perché è importante:** Spostare i fallimenti **a sinistra** (alla fase di build/CI) riduce i problemi in produzione e accelera i cicli di feedback per gli sviluppatori.
|
|
108
91
|
|
|
109
|
-
|
|
92
|
+
---
|
|
110
93
|
|
|
111
|
-
|
|
112
|
-
- **Routing & Middleware Integrati**: Moduli opzionali per routing localizzati (ad es., `/it/about`, `/fr/about`) e middleware server per rilevare la lingua dell'utente.
|
|
113
|
-
- **Tipi TypeScript Auto-generati**: Garantisce sicurezza dei tipi con funzionalità come completamento automatico e rilevamento degli errori a tempo di compilazione.
|
|
114
|
-
- **Traduzioni Dinamiche e Ricche**: Può includere JSX/TSX nelle traduzioni per casi d'uso più complessi (ad es., link, testo in grassetto, icone nelle traduzioni).
|
|
94
|
+
### 3) Gestione delle traduzioni mancanti
|
|
115
95
|
|
|
116
|
-
|
|
96
|
+
- **react-intl / react-i18next**: Di default usano **fallback a runtime** (eco della chiave o lingua predefinita). Puoi aggiungere linting/plugin, ma non è garantito durante la build.
|
|
97
|
+
- **Intlayer**: **Rilevamento a tempo di build** con avvisi o errori quando mancano lingue/chiavi richieste.
|
|
117
98
|
|
|
118
|
-
|
|
119
|
-
2. **Crea `intlayer.config.ts`** per definire le lingue disponibili e la lingua predefinita.
|
|
120
|
-
3. **Usa la CLI di Intlayer** o un plugin per **trasformare** le dichiarazioni di contenuto.
|
|
121
|
-
4. **Avvolgi la tua app** in `<IntlayerProvider>` e recupera il contenuto con `useIntlayer("keyName")`.
|
|
99
|
+
**Perché è importante:** Il fallimento della CI su stringhe mancanti previene la “misteriosa” presenza di inglese nelle interfacce non inglesi.
|
|
122
100
|
|
|
123
|
-
|
|
101
|
+
---
|
|
124
102
|
|
|
125
|
-
|
|
126
|
-
- **Contenuto ricco** possibile (ad es., passando nodi React come traduzioni).
|
|
127
|
-
- **Routing Localizzato** pronto all'uso.
|
|
128
|
-
- Integrato con strumenti di build popolari (CRA, Vite) per una facile configurazione.
|
|
103
|
+
### 4) Contenuti ricchi e formattazione
|
|
129
104
|
|
|
130
|
-
|
|
105
|
+
- **react-intl**: Eccellente supporto **ICU** per plurali, selezioni, date/numeri e composizione dei messaggi. JSX può essere usato, ma il modello mentale rimane incentrato sul messaggio.
|
|
106
|
+
- **react-i18next**: Interpolazione flessibile e **`<Trans>`** per incorporare elementi/componenti; ICU disponibile tramite plugin.
|
|
107
|
+
- **Intlayer**: I file di contenuto possono includere **nodi ricchi** (JSX/Markdown/componenti) e **metadati**. La formattazione utilizza Intl sotto il cofano; i modelli di plurale sono ergonomici.
|
|
131
108
|
|
|
132
|
-
|
|
133
|
-
- Maggiore attenzione a un approccio di "dichiarazione di contenuto a livello di componente", potrebbe rappresentare un cambiamento rispetto ai tipici cataloghi .json.
|
|
134
|
-
- Ecosistema e comunità più piccoli rispetto alle librerie più consolidate.
|
|
109
|
+
**Perché è importante:** I testi UI complessi (link, parti in grassetto, componenti inline) sono più facili da gestire quando la libreria supporta chiaramente i nodi React.
|
|
135
110
|
|
|
136
111
|
---
|
|
137
112
|
|
|
138
|
-
|
|
113
|
+
### 5) Prestazioni e comportamento di caricamento
|
|
114
|
+
|
|
115
|
+
- **react-intl / react-i18next**: Di solito gestisci manualmente la **divisione dei cataloghi** e il **caricamento lazy** (namespace/import dinamici). Efficace ma richiede disciplina.
|
|
116
|
+
- **Intlayer**: Esegue il **tree-shaking** dei dizionari non utilizzati e supporta il **caricamento lazy per dizionario/per locale** out-of-the-box.
|
|
139
117
|
|
|
140
|
-
|
|
141
|
-
| ----------------------------------- | ----------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
142
|
-
| **Caso d'uso principale** | Traduzioni basate su stringhe, formattazione di date/numero, sintassi messaggio ICU | i18n completo con facile cambio dinamico, annidamento, ecosistema di plugin | Traduzioni tipizzate con focus su contenuti dichiarativi, routing localizzato & middleware server opzionale |
|
|
143
|
-
| **Approccio** | Utilizza `<IntlProvider>` & componenti di messaggio FormatJS | Utilizza `I18nextProvider` & il hook `useTranslation()` | Utilizza `<IntlayerProvider>` & il hook `useIntlayer()` con dichiarazioni di contenuto |
|
|
144
|
-
| **Formato di Localizzazione** | Stringhe basate su ICU (cataloghi JSON o JavaScript) | File risorsa JSON (o caricamenti personalizzati). Formato ICU opzionale tramite plugin i18next | Dichiarazioni `.content.[ts/js/tsx]` o JSON; possono contenere stringhe o componenti React |
|
|
145
|
-
| **Routing** | Gestito esternamente (nessun routing localizzato integrato) | Gestito esternamente con plugin i18next (rilevamento percorso, sottodominio, ecc.) | Supporto per routing localizzato integrato (ad es., `/it/about`, `/fr/about`), più middleware server opzionale (per SSR/Vite) |
|
|
146
|
-
| **Supporto TypeScript** | Buono (tipi per pacchetti ufficiali) | Buono ma configurazione extra per traduzioni tipizzate se si desidera un controllo rigido | Eccellente (definizioni di tipo auto-generate per chiavi di contenuto e traduzioni) |
|
|
147
|
-
| **Pluralizzazione e Formattazione** | Avanzata: formattazione integrata di data/ora/numero, supporto plural/gender | Pluralizzazione configurabile. La formattazione di data/ora viene tipicamente eseguita tramite librerie esterne o plugin i18next | Può fare affidamento su standard JavaScript Intl o includere logica nel contenuto. Non è specializzato come FormatJS, ma gestisce i casi tipici. |
|
|
148
|
-
| **Comunità & Ecosistema** | Ampia, parte dell'ecosistema FormatJS | Molto ampia, altamente attiva, molti plugin (rilevamento, caching, framework) | Più piccola ma in crescita; approccio moderno e open-source |
|
|
149
|
-
| **Curva di Apprendimento** | Moderata (apprendimento della sintassi del messaggio ICU, convenzioni FormatJS) | Bassa a moderata (utilizzo diretto, ma configurazione avanzata può diventare verbosa) | Moderata (concetto di dichiarazioni di contenuto e passaggi di build specializzati) |
|
|
118
|
+
**Perché è importante:** Bundle più piccoli e meno stringhe inutilizzate migliorano le prestazioni di avvio e navigazione.
|
|
150
119
|
|
|
151
120
|
---
|
|
152
121
|
|
|
153
|
-
|
|
122
|
+
### 6) DX, strumenti e manutenzione
|
|
154
123
|
|
|
155
|
-
|
|
124
|
+
- **react-intl / react-i18next**: Ampio ecosistema comunitario; per i flussi editoriali solitamente si adottano piattaforme di localizzazione esterne.
|
|
125
|
+
- **Intlayer**: Include un **Editor Visivo gratuito** e un **CMS opzionale** (mantieni i contenuti in Git o esternalizzali). Offre inoltre un’**estensione per VSCode** per la creazione di contenuti e una **traduzione assistita da AI** utilizzando le tue chiavi provider.
|
|
156
126
|
|
|
157
|
-
|
|
158
|
-
- Preferisci un approccio più “**basato sugli standard**” alle traduzioni.
|
|
159
|
-
- Non hai bisogno di routing localizzati o chiavi di traduzione fortemente tipizzate.
|
|
127
|
+
**Perché è importante:** Gli strumenti integrati accorciano il ciclo tra sviluppatori e autori di contenuti - meno codice di collegamento, meno dipendenze da fornitori.
|
|
160
128
|
|
|
161
|
-
|
|
129
|
+
---
|
|
162
130
|
|
|
163
|
-
|
|
164
|
-
- Vuoi un rilevamento lingua **basato su plugin** (ad es., da URL, cookie, storage locale) o caching avanzato.
|
|
165
|
-
- Hai bisogno del più grande ecosistema, con molte integrazioni esistenti per vari framework (Next.js, React Native, ecc.).
|
|
131
|
+
## Quando scegliere quale?
|
|
166
132
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
- Hai bisogno di **routing localizzato integrato** o vuoi facilmente incorporarlo nella tua configurazione SSR o Vite.
|
|
171
|
-
- Desideri un approccio moderno o semplicemente vuoi una singola libreria che copra sia la **gestione del contenuto** (i18n) che il **routing** in modo sicuro rispetto ai tipi.
|
|
133
|
+
- **Scegli react-intl** se desideri un formato messaggi **ICU-first** con un’API semplice e conforme agli standard e il tuo team è a suo agio nel mantenere manualmente cataloghi e controlli di sicurezza.
|
|
134
|
+
- **Scegli react-i18next** se ti serve l’**ampiezza dell’ecosistema di i18next** (rilevatori, backend, plugin ICU, integrazioni) e accetti una configurazione più complessa per ottenere maggiore flessibilità.
|
|
135
|
+
- **Scegli Intlayer** se apprezzi il **contenuto a livello di componente**, il **TypeScript rigoroso**, le **garanzie a tempo di compilazione**, il **tree-shaking** e gli strumenti editoriali **completi** - specialmente per applicazioni React **grandi e modulari**.
|
|
172
136
|
|
|
173
137
|
---
|
|
174
138
|
|
|
175
|
-
##
|
|
176
|
-
|
|
177
|
-
Ogni libreria offre una soluzione robusta per l'internazionalizzazione di un'applicazione React:
|
|
178
|
-
|
|
179
|
-
- **React-Intl** eccelle nella formattazione dei messaggi ed è una scelta popolare per soluzioni aziendali che si concentrano sulla sintassi dei messaggi ICU.
|
|
180
|
-
- **React-i18next** fornisce un ambiente altamente flessibile e guidato dai plugin per esigenze i18n avanzate o dinamiche.
|
|
181
|
-
- **Intlayer** offre un approccio **moderno e fortemente tipizzato** che unisce dichiarazioni di contenuto, routing localizzato avanzato e integrazioni basate su plugin (CRA, Vite).
|
|
139
|
+
## Note pratiche per la migrazione (react-intl / react-i18next → Intlayer)
|
|
182
140
|
|
|
183
|
-
|
|
141
|
+
- **Migra in modo incrementale**: Inizia con una funzionalità o una rotta; mantieni i cataloghi legacy in parallelo durante la transizione.
|
|
142
|
+
- **Adotta dizionari per componente**: Colloca il contenuto insieme ai componenti per ridurre l'accoppiamento.
|
|
143
|
+
- **Abilita controlli rigorosi**: Lascia che gli errori a tempo di compilazione evidenzino precocemente chiavi/locale mancanti in CI.
|
|
144
|
+
- **Misura i bundle**: Aspettati riduzioni man mano che le stringhe inutilizzate vengono eliminate.
|
|
184
145
|
|
|
185
146
|
---
|
|
186
147
|
|
|
187
|
-
|
|
148
|
+
## Conclusione
|
|
188
149
|
|
|
189
|
-
|
|
190
|
-
- [Documentazione React-i18next](https://react.i18next.com/)
|
|
191
|
-
- [Guida all'Inizio con Intlayer + CRA](/#) (dal tuo documento)
|
|
192
|
-
- [Guida all'Inizio con Intlayer + Vite & React](/#) (dal tuo documento)
|
|
150
|
+
Tutte e tre le librerie localizzano React in modo efficace. La differenza sta in quanta **infrastruttura** devi costruire per raggiungere una configurazione **sicura e scalabile**:
|
|
193
151
|
|
|
194
|
-
|
|
152
|
+
- Con **Intlayer**, **contenuti modulari**, **tipizzazione TypeScript rigorosa**, **sicurezza a tempo di compilazione**, **bundle ottimizzati con tree-shaking** e **strumenti editoriali** sono impostazioni predefinite - non incombenze.
|
|
153
|
+
- Se il tuo team valorizza la **manutenibilità e la velocità** in app React multi-locale e basate su componenti, Intlayer offre il flusso di lavoro per sviluppatori e contenuti più **completo** oggi disponibile.
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2024-08-11
|
|
3
|
+
updatedAt: 2025-08-23
|
|
4
|
+
title: vue-i18n vs Intlayer
|
|
5
|
+
description: Confronta vue-i18n con Intlayer per l'internazionalizzazione (i18n) in app Vue/Nuxt
|
|
6
|
+
keywords:
|
|
7
|
+
- vue-i18n
|
|
8
|
+
- Intlayer
|
|
9
|
+
- Internazionalizzazione
|
|
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 | Internazionalizzazione Vue (i18n)
|
|
21
|
+
|
|
22
|
+
Questa guida confronta due popolari opzioni i18n per **Vue 3** (e **Nuxt**): **vue-i18n** e **Intlayer**.
|
|
23
|
+
Ci concentriamo sugli strumenti moderni di Vue (Vite, Composition API) e valutiamo:
|
|
24
|
+
|
|
25
|
+
1. **Architettura e organizzazione dei contenuti**
|
|
26
|
+
2. **TypeScript e sicurezza**
|
|
27
|
+
3. **Gestione delle traduzioni mancanti**
|
|
28
|
+
4. **Routing e strategia URL**
|
|
29
|
+
5. **Prestazioni e comportamento di caricamento**
|
|
30
|
+
6. **Esperienza sviluppatore (DX), strumenti e manutenzione**
|
|
31
|
+
7. **SEO e scalabilità per progetti di grandi dimensioni**
|
|
32
|
+
|
|
33
|
+
> **tl;dr**: Entrambi possono localizzare app Vue. Se desideri **contenuti a livello di componente**, **tipi TypeScript rigorosi**, **controlli delle chiavi mancanti in fase di build**, **dizionari tree-shaken** e **helper integrati per router/SEO** oltre a **Editor Visivo e traduzioni AI**, **Intlayer** è la scelta più completa e moderna.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Posizionamento ad alto livello
|
|
38
|
+
|
|
39
|
+
- **vue-i18n** - La libreria i18n de-facto per Vue. Formattazione flessibile dei messaggi (stile ICU), blocchi SFC `<i18n>` per messaggi locali e un grande ecosistema. La sicurezza e la manutenzione su larga scala dipendono principalmente da te.
|
|
40
|
+
- **Intlayer** - Modello di contenuto incentrato sui componenti per Vue/Vite/Nuxt con **tipizzazione TS rigorosa**, **controlli in fase di build**, **tree-shaking**, **helper per router e SEO**, **Editor Visivo/CMS** opzionale e **traduzioni assistite da AI**.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Confronto delle funzionalità affiancate (focalizzato su Vue)
|
|
45
|
+
|
|
46
|
+
| Funzionalità | **Intlayer** | **vue-i18n** |
|
|
47
|
+
| --------------------------------------------------- | --------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
|
|
48
|
+
| **Traduzioni vicino ai componenti** | ✅ Sì, contenuto collocato per componente (es. `MyComp.content.ts`) | ✅ Sì, tramite blocchi SFC `<i18n>` (opzionale) |
|
|
49
|
+
| **Integrazione TypeScript** | ✅ Avanzata, tipi **rigorosi** generati automaticamente e completamento chiavi | ✅ Buona tipizzazione; **sicurezza rigorosa delle chiavi richiede configurazioni/discipline aggiuntive** |
|
|
50
|
+
| **Rilevamento traduzioni mancanti** | ✅ Avvisi/errori in **fase di build** e visibilità in TS | ⚠️ Fallback/avvisi a runtime |
|
|
51
|
+
| **Contenuti ricchi (componenti/Markdown)** | ✅ Supporto diretto per nodi ricchi e file di contenuto Markdown | ⚠️ Limitato (componenti tramite `<i18n-t>`, Markdown tramite plugin esterni) |
|
|
52
|
+
| **Traduzione con AI** | ✅ Flussi di lavoro integrati usando le tue chiavi provider AI | ❌ Non integrato |
|
|
53
|
+
| **Editor Visivo / CMS** | ✅ Editor Visivo gratuito e CMS opzionale | ❌ Non integrato (usa piattaforme esterne) |
|
|
54
|
+
| **Routing localizzato** | ✅ Helper per Vue Router/Nuxt per generare percorsi localizzati, URL e `hreflang` | ⚠️ Non core (usa Nuxt i18n o configurazioni personalizzate di Vue Router) |
|
|
55
|
+
| **Generazione dinamica delle rotte** | ✅ Sì | ❌ Non fornito (fornito da Nuxt i18n) |
|
|
56
|
+
| **Pluralizzazione e formattazione** | ✅ Schemi di enumerazione; formatter basati su Intl | ✅ Messaggi in stile ICU; formatter Intl |
|
|
57
|
+
| **Formati di contenuto** | ✅ `.ts`, `.js`, `.json`, `.md`, `.txt` (YAML in lavorazione) | ✅ `.json`, `.js` (più blocchi SFC `<i18n>`) |
|
|
58
|
+
| **Supporto ICU** | ⚠️ In lavorazione | ✅ Sì |
|
|
59
|
+
| **Helper SEO (sitemap, robots, metadata)** | ✅ Helper integrati (indipendenti dal framework) | ❌ Non core (Nuxt i18n/comunità) |
|
|
60
|
+
| **SSR/SSG** | ✅ Funziona con Vue SSR e Nuxt; non blocca il rendering statico | ✅ Funziona con Vue SSR/Nuxt |
|
|
61
|
+
| **Tree-shaking (spedire solo il contenuto usato)** | ✅ Per componente al momento della build | ⚠️ Parziale; richiede suddivisione manuale del codice/messaggi asincroni |
|
|
62
|
+
| **Caricamento lazy** | ✅ Per locale / per dizionario | ✅ Supporta messaggi di locale asincroni |
|
|
63
|
+
| **Rimozione del contenuto non utilizzato** | ✅ Sì (a tempo di build) | ❌ Non integrato |
|
|
64
|
+
| **Manutenibilità di progetti di grandi dimensioni** | ✅ Favorisce una struttura modulare e amichevole per i design system | ✅ Possibile, ma richiede una forte disciplina su file/namespace |
|
|
65
|
+
| **Ecosistema / comunità** | ⚠️ Più piccolo ma in rapida crescita | ✅ Grande e maturo nell'ecosistema Vue |
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Confronto approfondito
|
|
70
|
+
|
|
71
|
+
### 1) Architettura e scalabilità
|
|
72
|
+
|
|
73
|
+
- **vue-i18n**: Le configurazioni comuni utilizzano **cataloghi centralizzati** per locale (opzionalmente suddivisi in file/namespace). I blocchi SFC `<i18n>` permettono messaggi locali, ma i team spesso tornano ai cataloghi condivisi man mano che i progetti crescono.
|
|
74
|
+
- **Intlayer**: Promuove **dizionari per componente** memorizzati accanto al componente che servono. Questo riduce i conflitti tra team, mantiene il contenuto facilmente rintracciabile e limita naturalmente la deriva/chiavi non utilizzate.
|
|
75
|
+
|
|
76
|
+
**Perché è importante:** In grandi app Vue o design system, il **contenuto modulare** scala meglio rispetto ai cataloghi monolitici.
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
### 2) TypeScript e sicurezza
|
|
81
|
+
|
|
82
|
+
- **vue-i18n**: Buon supporto TS; la **tipizzazione rigorosa delle chiavi** richiede tipicamente schemi/generici personalizzati e convenzioni attente.
|
|
83
|
+
- **Intlayer**: **Genera tipi rigorosi** dal tuo contenuto, offrendo **autocompletamento nell’IDE** e **errori a tempo di compilazione** per errori di battitura o chiavi mancanti.
|
|
84
|
+
|
|
85
|
+
**Perché è importante:** Il typing forte intercetta i problemi **prima** del runtime.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
### 3) Gestione delle traduzioni mancanti
|
|
90
|
+
|
|
91
|
+
- **vue-i18n**: Avvisi/fallback **a runtime** (es. fallback su locale o chiave).
|
|
92
|
+
- **Intlayer**: Rilevamento **a build-time** con avvisi/errori su tutte le localizzazioni e chiavi.
|
|
93
|
+
|
|
94
|
+
**Perché è importante:** L’applicazione a build-time mantiene l’interfaccia di produzione pulita e coerente.
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
### 4) Strategia di routing e URL (Vue Router/Nuxt)
|
|
99
|
+
|
|
100
|
+
- **Entrambi** possono funzionare con rotte localizzate.
|
|
101
|
+
- **Intlayer** fornisce helper per **generare percorsi localizzati**, **gestire i prefissi di localizzazione** ed emettere **`<link rel="alternate" hreflang>`** per la SEO. Con Nuxt, integra il routing del framework.
|
|
102
|
+
|
|
103
|
+
**Perché è importante:** Meno strati di collegamento personalizzati e **SEO più pulita** tra le localizzazioni.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
### 5) Prestazioni e comportamento di caricamento
|
|
108
|
+
|
|
109
|
+
- **vue-i18n**: Supporta messaggi di localizzazione asincroni; evitare un bundle eccessivo è responsabilità tua (dividi i cataloghi con attenzione).
|
|
110
|
+
- **Intlayer**: **Ottimizza l’albero** durante la build e **carica in modo lazy per dizionario/località**. Il contenuto non utilizzato non viene incluso.
|
|
111
|
+
|
|
112
|
+
**Perché è importante:** Bundle più piccoli e avvio più veloce per app Vue multi-localizzazione.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
### 6) Esperienza sviluppatore e strumenti
|
|
117
|
+
|
|
118
|
+
- **vue-i18n**: Documentazione e community mature; solitamente ti affiderai a **piattaforme di localizzazione esterne** per i flussi editoriali.
|
|
119
|
+
- **Intlayer**: Fornisce un **Editor Visivo gratuito**, un **CMS** opzionale (compatibile con Git o esternalizzato), un’**estensione VSCode**, utility **CLI/CI** e **traduzioni assistite da AI** utilizzando le tue chiavi provider.
|
|
120
|
+
|
|
121
|
+
**Perché è importante:** Costi operativi ridotti e un ciclo sviluppo–contenuto più breve.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
### 7) SEO, SSR & SSG
|
|
126
|
+
|
|
127
|
+
- **Entrambi** funzionano con Vue SSR e Nuxt.
|
|
128
|
+
- **Intlayer**: Aggiunge **helper SEO** (sitemap/metadata/`hreflang`) indipendenti dal framework e ben integrati con le build Vue/Nuxt.
|
|
129
|
+
|
|
130
|
+
**Perché è importante:** SEO internazionale senza configurazioni personalizzate complesse.
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Perché Intlayer? (Problema e approccio)
|
|
135
|
+
|
|
136
|
+
La maggior parte degli stack i18n (incluso **vue-i18n**) parte da **cataloghi centralizzati**:
|
|
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
|
+
Oppure con cartelle per locale:
|
|
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
|
+
Questo spesso rallenta lo sviluppo man mano che le app crescono:
|
|
169
|
+
|
|
170
|
+
1. **Per un nuovo componente** crei/modifichi cataloghi remoti, colleghi namespace e traduci (spesso tramite copia/incolla manuale da strumenti AI).
|
|
171
|
+
2. **Quando modifichi componenti** cerchi chiavi condivise, traduci, mantieni i locali sincronizzati, rimuovi chiavi inutilizzate e allinei le strutture JSON.
|
|
172
|
+
|
|
173
|
+
**Intlayer** delimita il contenuto **per componente** e lo mantiene **vicino al codice**, come già facciamo con CSS, storie, test e documentazione:
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
.
|
|
177
|
+
└── components
|
|
178
|
+
└── MyComponent
|
|
179
|
+
├── MyComponent.content.ts
|
|
180
|
+
└── MyComponent.vue
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
**Dichiarazione del contenuto** (per 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
|
+
**Utilizzo in Vue** (Composition API):
|
|
203
|
+
|
|
204
|
+
```vue fileName="./components/MyComponent/MyComponent.vue"
|
|
205
|
+
<script setup lang="ts">
|
|
206
|
+
import { useIntlayer } from "vue-intlayer"; // Integrazione Vue
|
|
207
|
+
const { greeting } = useIntlayer("component-example");
|
|
208
|
+
</script>
|
|
209
|
+
|
|
210
|
+
<template>
|
|
211
|
+
<span>{{ greeting }}</span>
|
|
212
|
+
</template>
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
Questo approccio:
|
|
216
|
+
|
|
217
|
+
- **Accelera lo sviluppo** (dichiara una volta; completamento automatico IDE/AI).
|
|
218
|
+
- **Pulisce il codice** (1 componente = 1 dizionario).
|
|
219
|
+
- **Facilita duplicazione/migrazione** (copia un componente e il suo contenuto insieme).
|
|
220
|
+
- **Evita chiavi inutilizzate** (i componenti non usati non importano contenuti).
|
|
221
|
+
- **Ottimizza il caricamento** (i componenti caricati in modo lazy portano con sé il loro contenuto).
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## Funzionalità aggiuntive di Intlayer (rilevanti per Vue)
|
|
226
|
+
|
|
227
|
+
- **Supporto cross-framework**: Funziona con Vue, Nuxt, Vite, React, Express e altri.
|
|
228
|
+
- **Gestione contenuti basata su JavaScript**: Dichiara nel codice con piena flessibilità.
|
|
229
|
+
- **File di dichiarazione per ogni locale**: Definisci tutte le localizzazioni e lascia che gli strumenti generino il resto.
|
|
230
|
+
- **Ambiente con tipizzazione sicura**: Configurazione TS robusta con completamento automatico.
|
|
231
|
+
- **Recupero contenuti semplificato**: Un singolo hook/composable per ottenere tutti i contenuti di un dizionario.
|
|
232
|
+
- **Codebase organizzata**: 1 componente = 1 dizionario nella stessa cartella.
|
|
233
|
+
- **Routing migliorato**: Helper per percorsi e metadata localizzati di **Vue Router/Nuxt**.
|
|
234
|
+
- **Supporto Markdown**: Importa Markdown remoto/locale per ogni locale; espone il frontmatter al codice.
|
|
235
|
+
- **Editor Visuale gratuito & CMS opzionale**: Creazione contenuti senza piattaforme di localizzazione a pagamento; sincronizzazione compatibile con Git.
|
|
236
|
+
- **Contenuti tree-shakable**: Include solo ciò che viene utilizzato; supporta il caricamento lazy.
|
|
237
|
+
- **Compatibile con rendering statico**: Non blocca la generazione statica (SSG).
|
|
238
|
+
- **Traduzioni potenziate dall’IA**: Traduci in 231 lingue utilizzando il tuo provider AI/chiave API.
|
|
239
|
+
- **Server MCP & estensione VSCode**: Automatizza i flussi di lavoro i18n e la creazione di contenuti direttamente nel tuo IDE.
|
|
240
|
+
- **Interoperabilità**: Collegamenti con **vue-i18n**, **react-i18next** e **react-intl** quando necessario.
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Quando scegliere quale?
|
|
245
|
+
|
|
246
|
+
- **Scegli vue-i18n** se vuoi l’**approccio standard di Vue**, ti senti a tuo agio a gestire cataloghi/namespace da solo e la tua app è di **dimensioni piccole o medie** (o già usi Nuxt i18n).
|
|
247
|
+
- **Scegli Intlayer** se apprezzi il **contenuto scoped per componente**, il **TypeScript rigoroso**, le **garanzie a build-time**, il **tree-shaking** e gli strumenti **batteries-included** per routing/SEO/editor-specialmente per **codebase Vue/Nuxt grandi e modulari**.
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
## Note pratiche per la migrazione (vue-i18n → Intlayer)
|
|
252
|
+
|
|
253
|
+
- **Inizia per funzionalità**: Sposta una rotta/vista/componente alla volta nei dizionari locali di Intlayer.
|
|
254
|
+
- **Collega durante la migrazione**: Mantieni i cataloghi vue-i18n in parallelo; sostituisci gradualmente le ricerche.
|
|
255
|
+
- **Abilita controlli rigorosi**: Permetti al rilevamento in fase di build di evidenziare presto chiavi/locale mancanti.
|
|
256
|
+
- **Adotta helper per router/SEO**: Standardizza il rilevamento della localizzazione e i tag `hreflang`.
|
|
257
|
+
- **Misura i bundle**: Aspettati **riduzioni delle dimensioni del bundle** man mano che il contenuto non utilizzato viene escluso.
|
|
258
|
+
|
|
259
|
+
---
|
|
260
|
+
|
|
261
|
+
## Conclusione
|
|
262
|
+
|
|
263
|
+
Sia **vue-i18n** che **Intlayer** localizzano bene le app Vue. La differenza è **quanto devi costruire da solo** per ottenere una configurazione robusta e scalabile:
|
|
264
|
+
|
|
265
|
+
- Con **Intlayer**, **contenuti modulari**, **TypeScript rigoroso**, **sicurezza a tempo di compilazione**, **bundle ottimizzati con tree-shaking** e **strumenti per router/SEO/editor** sono disponibili **pronti all'uso**.
|
|
266
|
+
- Se il tuo team dà priorità a **manutenibilità e velocità** in un'app Vue/Nuxt multilingue e basata su componenti, Intlayer offre l'esperienza **più completa** oggi disponibile.
|
|
267
|
+
|
|
268
|
+
Consulta il documento ['Perché Intlayer?'](https://intlayer.org/doc/why) per maggiori dettagli.
|
|
@@ -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: Next.jsアプリのためにnext-i18nextとIntlayerを連携する
|
|
6
6
|
keywords:
|
|
@@ -24,7 +24,6 @@ Both next-i18next and Intlayer are open-source internationalization (i18n) frame
|
|
|
24
24
|
Both solutions include three principal notions:
|
|
25
25
|
|
|
26
26
|
1. **コンテンツ宣言**: アプリケーションの翻訳可能なコンテンツを定義するための方法。
|
|
27
|
-
|
|
28
27
|
- `i18next`の場合は`resource`として名付けられ、コンテンツ宣言は、1つまたは複数の言語の翻訳のためのキー-バリューのペアを含む構造化されたJSONオブジェクトです。詳細については、[i18nextのドキュメント](https://www.i18next.com/translation-function/essentials)を参照してください。
|
|
29
28
|
- `Intlayer`の場合は`content declaration file`として名付けられ、コンテンツ宣言は構造化データをエクスポートするJSON、JS、またはTSファイルになることができます。詳細については、[Intlayerのドキュメント](https://intlayer.org/fr/doc/concept/content)を参照してください。
|
|
30
29
|
|
|
@@ -209,8 +208,8 @@ const content = {
|
|
|
209
208
|
content: {
|
|
210
209
|
myTranslatedContent: t({
|
|
211
210
|
en: "Hello World",
|
|
212
|
-
fr: "Bonjour le monde",
|
|
213
211
|
es: "Hola Mundo",
|
|
212
|
+
fr: "Bonjour le monde",
|
|
214
213
|
}),
|
|
215
214
|
},
|
|
216
215
|
} satisfies Dictionary;
|
|
@@ -227,8 +226,8 @@ const content = {
|
|
|
227
226
|
content: {
|
|
228
227
|
myTranslatedContent: t({
|
|
229
228
|
en: "Hello World",
|
|
230
|
-
fr: "Bonjour le monde",
|
|
231
229
|
es: "Hola Mundo",
|
|
230
|
+
fr: "Bonjour le monde",
|
|
232
231
|
}),
|
|
233
232
|
},
|
|
234
233
|
};
|
|
@@ -242,8 +241,8 @@ module.exports = {
|
|
|
242
241
|
content: {
|
|
243
242
|
myTranslatedContent: t({
|
|
244
243
|
en: "Hello World",
|
|
245
|
-
fr: "Bonjour le monde",
|
|
246
244
|
es: "Hola Mundo",
|
|
245
|
+
fr: "Bonjour le monde",
|
|
247
246
|
}),
|
|
248
247
|
},
|
|
249
248
|
};
|