@intlayer/docs 7.3.13 → 7.3.15
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_i18next.md +3 -0
- package/blog/ar/intlayer_with_next-i18next.md +3 -0
- package/blog/ar/intlayer_with_next-intl.md +3 -0
- package/blog/ar/intlayer_with_react-i18next.md +3 -0
- package/blog/ar/intlayer_with_react-intl.md +3 -0
- package/blog/ar/intlayer_with_vue-i18n.md +3 -0
- package/blog/de/intlayer_with_i18next.md +3 -0
- package/blog/de/intlayer_with_next-i18next.md +3 -0
- package/blog/de/intlayer_with_next-intl.md +3 -0
- package/blog/de/intlayer_with_react-i18next.md +3 -0
- package/blog/de/intlayer_with_react-intl.md +3 -0
- package/blog/de/intlayer_with_vue-i18n.md +3 -0
- package/blog/en/intlayer_with_i18next.md +7 -0
- package/blog/en/intlayer_with_next-i18next.md +3 -0
- package/blog/en/intlayer_with_next-intl.md +7 -0
- package/blog/en/intlayer_with_react-i18next.md +3 -0
- package/blog/en/intlayer_with_react-intl.md +3 -0
- package/blog/en/intlayer_with_vue-i18n.md +3 -0
- package/blog/en-GB/intlayer_with_i18next.md +3 -0
- package/blog/en-GB/intlayer_with_next-i18next.md +3 -0
- package/blog/en-GB/intlayer_with_next-intl.md +3 -0
- package/blog/en-GB/intlayer_with_react-i18next.md +3 -0
- package/blog/en-GB/intlayer_with_react-intl.md +3 -0
- package/blog/en-GB/intlayer_with_vue-i18n.md +3 -0
- package/blog/es/intlayer_with_i18next.md +3 -0
- package/blog/es/intlayer_with_next-i18next.md +3 -0
- package/blog/es/intlayer_with_next-intl.md +3 -0
- package/blog/es/intlayer_with_react-i18next.md +3 -0
- package/blog/es/intlayer_with_react-intl.md +3 -0
- package/blog/es/intlayer_with_vue-i18n.md +3 -0
- package/blog/fr/intlayer_with_i18next.md +3 -0
- package/blog/fr/intlayer_with_next-i18next.md +3 -0
- package/blog/fr/intlayer_with_next-intl.md +3 -0
- package/blog/fr/intlayer_with_react-i18next.md +3 -0
- package/blog/fr/intlayer_with_react-intl.md +3 -0
- package/blog/fr/intlayer_with_vue-i18n.md +3 -0
- package/blog/hi/intlayer_with_i18next.md +3 -0
- package/blog/hi/intlayer_with_next-i18next.md +3 -0
- package/blog/hi/intlayer_with_next-intl.md +3 -0
- package/blog/hi/intlayer_with_react-i18next.md +3 -0
- package/blog/hi/intlayer_with_react-intl.md +3 -0
- package/blog/hi/intlayer_with_vue-i18n.md +3 -0
- package/blog/id/intlayer_with_i18next.md +3 -0
- package/blog/id/intlayer_with_next-i18next.md +3 -0
- package/blog/id/intlayer_with_next-intl.md +3 -0
- package/blog/id/intlayer_with_react-i18next.md +3 -0
- package/blog/id/intlayer_with_react-intl.md +3 -0
- package/blog/id/intlayer_with_vue-i18n.md +3 -0
- package/blog/it/intlayer_with_i18next.md +3 -0
- package/blog/it/intlayer_with_next-i18next.md +3 -0
- package/blog/it/intlayer_with_next-intl.md +3 -0
- package/blog/it/intlayer_with_react-i18next.md +3 -0
- package/blog/it/intlayer_with_react-intl.md +3 -0
- package/blog/it/intlayer_with_vue-i18n.md +3 -0
- package/blog/ja/intlayer_with_i18next.md +3 -0
- package/blog/ja/intlayer_with_next-i18next.md +3 -0
- package/blog/ja/intlayer_with_next-intl.md +3 -0
- package/blog/ja/intlayer_with_react-i18next.md +3 -0
- package/blog/ja/intlayer_with_react-intl.md +3 -0
- package/blog/ja/intlayer_with_vue-i18n.md +3 -0
- package/blog/ko/intlayer_with_i18next.md +3 -0
- package/blog/ko/intlayer_with_next-i18next.md +3 -0
- package/blog/ko/intlayer_with_next-intl.md +3 -0
- package/blog/ko/intlayer_with_react-i18next.md +3 -0
- package/blog/ko/intlayer_with_react-intl.md +3 -0
- package/blog/ko/intlayer_with_vue-i18n.md +3 -0
- package/blog/pl/intlayer_with_i18next.md +3 -0
- package/blog/pl/intlayer_with_next-i18next.md +3 -0
- package/blog/pl/intlayer_with_next-intl.md +3 -0
- package/blog/pl/intlayer_with_react-i18next.md +3 -0
- package/blog/pl/intlayer_with_react-intl.md +3 -0
- package/blog/pl/intlayer_with_vue-i18n.md +3 -0
- package/blog/pt/intlayer_with_i18next.md +3 -0
- package/blog/pt/intlayer_with_next-i18next.md +3 -0
- package/blog/pt/intlayer_with_next-intl.md +3 -0
- package/blog/pt/intlayer_with_react-i18next.md +3 -0
- package/blog/pt/intlayer_with_react-intl.md +3 -0
- package/blog/pt/intlayer_with_vue-i18n.md +3 -0
- package/blog/ru/intlayer_with_i18next.md +3 -0
- package/blog/ru/intlayer_with_next-i18next.md +3 -0
- package/blog/ru/intlayer_with_next-intl.md +3 -0
- package/blog/ru/intlayer_with_react-i18next.md +3 -0
- package/blog/ru/intlayer_with_react-intl.md +3 -0
- package/blog/ru/intlayer_with_vue-i18n.md +3 -0
- package/blog/tr/intlayer_with_i18next.md +3 -0
- package/blog/tr/intlayer_with_next-i18next.md +3 -0
- package/blog/tr/intlayer_with_next-intl.md +3 -0
- package/blog/tr/intlayer_with_react-i18next.md +3 -0
- package/blog/tr/intlayer_with_vue-i18n.md +3 -0
- package/blog/vi/intlayer_with_i18next.md +3 -0
- package/blog/vi/intlayer_with_next-i18next.md +3 -0
- package/blog/vi/intlayer_with_next-intl.md +3 -0
- package/blog/vi/intlayer_with_react-i18next.md +3 -0
- package/blog/vi/intlayer_with_react-intl.md +3 -0
- package/blog/vi/intlayer_with_vue-i18n.md +3 -0
- package/blog/zh/intlayer_with_i18next.md +3 -0
- package/blog/zh/intlayer_with_next-i18next.md +3 -0
- package/blog/zh/intlayer_with_next-intl.md +3 -0
- package/blog/zh/intlayer_with_react-i18next.md +3 -0
- package/blog/zh/intlayer_with_react-intl.md +3 -0
- package/blog/zh/intlayer_with_vue-i18n.md +3 -0
- package/docs/ar/intlayer_with_lynx+react.md +1 -1
- package/docs/ar/intlayer_with_vite+react.md +99 -331
- package/docs/ar/plugins/sync-json.md +3 -0
- package/docs/de/intlayer_with_lynx+react.md +1 -1
- package/docs/de/intlayer_with_vite+react.md +116 -380
- package/docs/de/plugins/sync-json.md +3 -0
- package/docs/en/intlayer_with_vite+react.md +6 -10
- package/docs/en/plugins/sync-json.md +3 -0
- package/docs/en-GB/intlayer_with_vite+react.md +62 -74
- package/docs/en-GB/plugins/sync-json.md +3 -0
- package/docs/es/intlayer_with_vite+react.md +101 -333
- package/docs/es/plugins/sync-json.md +3 -0
- package/docs/fr/intlayer_with_vite+react.md +101 -357
- package/docs/fr/plugins/sync-json.md +3 -0
- package/docs/hi/intlayer_with_vite+react.md +120 -333
- package/docs/hi/plugins/sync-json.md +3 -0
- package/docs/id/intlayer_with_vite+react.md +7 -13
- package/docs/id/plugins/sync-json.md +3 -0
- package/docs/it/intlayer_with_lynx+react.md +1 -1
- package/docs/it/intlayer_with_vite+react.md +121 -393
- package/docs/it/plugins/sync-json.md +3 -0
- package/docs/ja/intlayer_with_vite+react.md +106 -378
- package/docs/ja/plugins/sync-json.md +3 -0
- package/docs/ko/intlayer_with_lynx+react.md +1 -1
- package/docs/ko/intlayer_with_vite+react.md +90 -322
- package/docs/ko/plugins/sync-json.md +3 -0
- package/docs/pl/intlayer_with_vite+react.md +25 -21
- package/docs/pl/plugins/sync-json.md +3 -0
- package/docs/pt/intlayer_with_vite+react.md +96 -328
- package/docs/pt/plugins/sync-json.md +3 -0
- package/docs/ru/intlayer_with_lynx+react.md +1 -1
- package/docs/ru/intlayer_with_vite+react.md +109 -362
- package/docs/ru/plugins/sync-json.md +3 -0
- package/docs/tr/intlayer_with_vite+react.md +132 -366
- package/docs/tr/plugins/sync-json.md +3 -0
- package/docs/vi/intlayer_with_vite+react.md +16 -19
- package/docs/vi/plugins/sync-json.md +3 -0
- package/docs/zh/intlayer_with_tanstack.md +1 -1
- package/docs/zh/intlayer_with_vite+react.md +91 -374
- package/docs/zh/plugins/sync-json.md +3 -0
- package/frequent_questions/ar/customized_locale_list.md +1 -1
- package/frequent_questions/de/customized_locale_list.md +1 -1
- package/frequent_questions/en/customized_locale_list.md +1 -1
- package/frequent_questions/en-GB/customized_locale_list.md +1 -1
- package/frequent_questions/es/customized_locale_list.md +1 -1
- package/frequent_questions/fr/customized_locale_list.md +1 -1
- package/frequent_questions/hi/customized_locale_list.md +1 -1
- package/frequent_questions/id/customized_locale_list.md +1 -1
- package/frequent_questions/it/customized_locale_list.md +1 -1
- package/frequent_questions/ja/customized_locale_list.md +1 -1
- package/frequent_questions/ko/customized_locale_list.md +1 -1
- package/frequent_questions/pl/customized_locale_list.md +1 -1
- package/frequent_questions/pt/customized_locale_list.md +1 -1
- package/frequent_questions/ru/customized_locale_list.md +1 -1
- package/frequent_questions/tr/customized_locale_list.md +1 -1
- package/frequent_questions/vi/customized_locale_list.md +1 -1
- package/frequent_questions/zh/customized_locale_list.md +1 -1
- package/package.json +10 -9
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2024-03-07
|
|
3
|
-
updatedAt:
|
|
4
|
-
title: Come tradurre la tua Vite
|
|
3
|
+
updatedAt: 2025-12-10
|
|
4
|
+
title: Come tradurre la tua applicazione Vite e React – guida i18n 2025
|
|
5
5
|
description: Scopri come aggiungere l'internazionalizzazione (i18n) alla tua applicazione Vite e React utilizzando Intlayer. Segui questa guida per rendere la tua app multilingue.
|
|
6
6
|
keywords:
|
|
7
7
|
- Internazionalizzazione
|
|
@@ -16,23 +16,19 @@ slugs:
|
|
|
16
16
|
- environment
|
|
17
17
|
- vite-and-react
|
|
18
18
|
applicationTemplate: https://github.com/aymericzip/intlayer-vite-react-template
|
|
19
|
-
youtubeVideo: https://www.youtube.com/watch?v=dS9L7uJeak4
|
|
19
|
+
youtubeVideo: https://www.youtube.com/watch?v=dS9L7uJeak4
|
|
20
20
|
history:
|
|
21
21
|
- version: 5.5.10
|
|
22
22
|
date: 2025-06-29
|
|
23
23
|
changes: Inizio cronologia
|
|
24
24
|
---
|
|
25
25
|
|
|
26
|
-
#
|
|
26
|
+
# Traduci il tuo sito web Vite e React usando Intlayer | Internazionalizzazione (i18n)
|
|
27
27
|
|
|
28
28
|
## Indice
|
|
29
29
|
|
|
30
30
|
<TOC/>
|
|
31
31
|
|
|
32
|
-
<iframe title="The best i18n solution for Vite and React? Discover Intlayer" class="m-auto aspect-[16/9] w-full overflow-hidden rounded-lg border-0" allow="autoplay; gyroscope;" loading="lazy" width="1080" height="auto" src="https://www.youtube.com/embed/dS9L7uJeak4?si=VaKmrYMmXjo3xpk2"/>
|
|
33
|
-
|
|
34
|
-
Consulta il [Template dell'Applicazione](https://github.com/aymericzip/intlayer-vite-react-template) su GitHub.
|
|
35
|
-
|
|
36
32
|
## Cos'è Intlayer?
|
|
37
33
|
|
|
38
34
|
**Intlayer** è una libreria innovativa e open-source per l'internazionalizzazione (i18n) progettata per semplificare il supporto multilingue nelle moderne applicazioni web.
|
|
@@ -48,6 +44,27 @@ Con Intlayer, puoi:
|
|
|
48
44
|
|
|
49
45
|
## Guida passo-passo per configurare Intlayer in un'applicazione Vite e React
|
|
50
46
|
|
|
47
|
+
<Tab defaultTab="video">
|
|
48
|
+
<TabItem label="Video" value="video">
|
|
49
|
+
|
|
50
|
+
<iframe title="The best i18n solution for Vite and React? Discover Intlayer" class="m-auto aspect-[16/9] w-full overflow-hidden rounded-lg border-0" allow="autoplay; gyroscope;" loading="lazy" width="1080" height="auto" src="https://www.youtube.com/embed/dS9L7uJeak4?si=VaKmrYMmXjo3xpk2"/>
|
|
51
|
+
|
|
52
|
+
</TabItem>
|
|
53
|
+
<TabItem label="Code" value="code">
|
|
54
|
+
|
|
55
|
+
<iframe
|
|
56
|
+
src="https://stackblitz.com/github/aymericzip/intlayer-vite-react-template?embed=1&ctl=1&file=intlayer.config.ts"
|
|
57
|
+
className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
|
|
58
|
+
title="Demo CodeSandbox - How to Internationalize your application using Intlayer"
|
|
59
|
+
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
|
|
60
|
+
loading="lazy"
|
|
61
|
+
/>
|
|
62
|
+
|
|
63
|
+
</TabItem>
|
|
64
|
+
</Tab>
|
|
65
|
+
|
|
66
|
+
Consulta il [Template dell'Applicazione](https://github.com/aymericzip/intlayer-vite-react-template) su GitHub.
|
|
67
|
+
|
|
51
68
|
### Passo 1: Installa le dipendenze
|
|
52
69
|
|
|
53
70
|
Installa i pacchetti necessari usando npm:
|
|
@@ -68,8 +85,7 @@ yarn add vite-intlayer --save-dev
|
|
|
68
85
|
```
|
|
69
86
|
|
|
70
87
|
- **intlayer**
|
|
71
|
-
|
|
72
|
-
Il pacchetto principale che fornisce strumenti di internazionalizzazione per la gestione della configurazione, la traduzione, la [dichiarazione dei contenuti](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/dictionary/get_started.md), la traspilazione e i [comandi CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/intlayer_cli.md).
|
|
88
|
+
Il pacchetto principale che fornisce strumenti di internazionalizzazione per la gestione della configurazione, la traduzione, la [dichiarazione dei contenuti](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/dictionary/content_file.md), la traspilazione e i [comandi CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/cli/index.md).
|
|
73
89
|
|
|
74
90
|
- **react-intlayer**
|
|
75
91
|
Il pacchetto che integra Intlayer con le applicazioni React. Fornisce provider di contesto e hook per l'internazionalizzazione in React.
|
|
@@ -418,7 +434,7 @@ module.exports = appContent;
|
|
|
418
434
|
|
|
419
435
|
> Le tue dichiarazioni di contenuto possono essere definite ovunque nella tua applicazione non appena sono incluse nella directory `contentDir` (di default, `./src`). E devono corrispondere all'estensione del file di dichiarazione del contenuto (di default, `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
420
436
|
|
|
421
|
-
> Per maggiori dettagli, consulta la [documentazione sulle dichiarazioni di contenuto](https://github.com/aymericzip/intlayer/blob/main/docs/docs/
|
|
437
|
+
> Per maggiori dettagli, consulta la [documentazione sulle dichiarazioni di contenuto](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/dictionary/content_file.md).
|
|
422
438
|
|
|
423
439
|
> Se il tuo file di contenuto include codice TSX, dovresti considerare di importare `import React from "react";` nel tuo file di contenuto.
|
|
424
440
|
|
|
@@ -567,7 +583,7 @@ const App = () => (
|
|
|
567
583
|
module.exports = App;
|
|
568
584
|
```
|
|
569
585
|
|
|
570
|
-
> Se vuoi usare il tuo contenuto in un attributo `string`, come `alt`, `title`, `href`, `aria-label`, ecc., devi chiamare il valore della funzione, come:
|
|
586
|
+
> Se vuoi usare il tuo contenuto in un attributo di tipo `string`, come `alt`, `title`, `href`, `aria-label`, ecc., devi chiamare il valore della funzione, come:
|
|
571
587
|
|
|
572
588
|
> ```jsx
|
|
573
589
|
> <img src={content.image.src.value} alt={content.image.value} />
|
|
@@ -638,87 +654,15 @@ Esempio:
|
|
|
638
654
|
- https://example.com/fr/about
|
|
639
655
|
```
|
|
640
656
|
|
|
641
|
-
|
|
657
|
+
Per impostazione predefinita, i percorsi non sono prefissati per la lingua predefinita. Se desideri aggiungere un prefisso anche per la lingua predefinita, puoi impostare l'opzione `middleware.prefixDefault` su `true` nella tua configurazione. Consulta la [documentazione sulla configurazione](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/configuration.md) per maggiori informazioni.
|
|
642
658
|
|
|
643
659
|
Per aggiungere il routing localizzato alla tua applicazione, puoi creare un componente `LocaleRouter` che avvolge le rotte della tua applicazione e gestisce il routing basato sulla lingua. Ecco un esempio che utilizza [React Router](https://reactrouter.com/home):
|
|
644
660
|
|
|
645
661
|
```tsx fileName="src/components/LocaleRouter.tsx" codeFormat="typescript"
|
|
646
|
-
//
|
|
647
|
-
import { type Locales, configuration, getPathWithoutLocale } from "intlayer"; // Funzioni di utilità e tipi da 'intlayer'
|
|
662
|
+
import { localeMap } from "intlayer"; // Funzioni di utilità e tipi da 'intlayer'
|
|
648
663
|
import type { FC, PropsWithChildren } from "react"; // Tipi React per componenti funzionali e props
|
|
649
664
|
import { IntlayerProvider } from "react-intlayer"; // Provider per il contesto di internazionalizzazione
|
|
650
|
-
import {
|
|
651
|
-
BrowserRouter,
|
|
652
|
-
Routes,
|
|
653
|
-
Route,
|
|
654
|
-
Navigate,
|
|
655
|
-
useLocation,
|
|
656
|
-
} from "react-router-dom"; // Componenti router per la gestione della navigazione
|
|
657
|
-
|
|
658
|
-
// Destrutturazione della configurazione da Intlayer
|
|
659
|
-
const { internationalization, middleware } = configuration;
|
|
660
|
-
const { locales, defaultLocale } = internationalization;
|
|
661
|
-
|
|
662
|
-
/**
|
|
663
|
-
* Un componente che gestisce la localizzazione e avvolge i figli con il contesto locale appropriato.
|
|
664
|
-
* Gestisce il rilevamento e la validazione della lingua basata sull'URL.
|
|
665
|
-
*/
|
|
666
|
-
const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
|
|
667
|
-
children,
|
|
668
|
-
locale,
|
|
669
|
-
}) => {
|
|
670
|
-
const { pathname, search } = useLocation(); // Ottieni il percorso URL corrente
|
|
671
|
-
|
|
672
|
-
// Determina la locale corrente, utilizzando quella di default se non fornita
|
|
673
|
-
const currentLocale = locale ?? defaultLocale;
|
|
674
|
-
|
|
675
|
-
// Rimuovi il prefisso della locale dal percorso per costruire un percorso base
|
|
676
|
-
const pathWithoutLocale = getPathWithoutLocale(
|
|
677
|
-
pathname // Percorso URL corrente
|
|
678
|
-
);
|
|
679
|
-
|
|
680
|
-
/**
|
|
681
|
-
* Se middleware.prefixDefault è true, la locale di default deve sempre essere prefissata.
|
|
682
|
-
*/
|
|
683
|
-
if (middleware.prefixDefault) {
|
|
684
|
-
// Valida la locale
|
|
685
|
-
if (!locale || !locales.includes(locale)) {
|
|
686
|
-
// Reindirizza alla locale di default con il percorso aggiornato
|
|
687
|
-
return (
|
|
688
|
-
<Navigate
|
|
689
|
-
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
690
|
-
replace // Sostituisce la voce corrente nella cronologia con quella nuova
|
|
691
|
-
/>
|
|
692
|
-
);
|
|
693
|
-
}
|
|
694
|
-
|
|
695
|
-
// Avvolge i figli con IntlayerProvider e imposta la locale corrente
|
|
696
|
-
return (
|
|
697
|
-
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
698
|
-
);
|
|
699
|
-
} else {
|
|
700
|
-
/**
|
|
701
|
-
* Quando middleware.prefixDefault è falso, la locale predefinita non è prefissata.
|
|
702
|
-
* Assicurarsi che la locale corrente sia valida e non la locale predefinita.
|
|
703
|
-
*/
|
|
704
|
-
if (
|
|
705
|
-
currentLocale.toString() !== defaultLocale.toString() &&
|
|
706
|
-
!locales
|
|
707
|
-
.filter(
|
|
708
|
-
(locale) => locale.toString() !== defaultLocale.toString() // Esclude la locale predefinita
|
|
709
|
-
)
|
|
710
|
-
.includes(currentLocale) // Controlla se la locale corrente è nella lista delle locale valide
|
|
711
|
-
) {
|
|
712
|
-
// Reindirizza al percorso senza prefisso della locale
|
|
713
|
-
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
714
|
-
}
|
|
715
|
-
|
|
716
|
-
// Avvolge i figli con IntlayerProvider e imposta la locale corrente
|
|
717
|
-
return (
|
|
718
|
-
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
719
|
-
);
|
|
720
|
-
}
|
|
721
|
-
};
|
|
665
|
+
import { BrowserRouter, Route, Routes } from "react-router-dom"; // Componenti router per la gestione della navigazione
|
|
722
666
|
|
|
723
667
|
/**
|
|
724
668
|
* Un componente router che configura le rotte specifiche per la locale.
|
|
@@ -727,257 +671,81 @@ const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
|
|
|
727
671
|
export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => (
|
|
728
672
|
<BrowserRouter>
|
|
729
673
|
<Routes>
|
|
730
|
-
{
|
|
731
|
-
|
|
732
|
-
(
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
/>
|
|
741
|
-
))}
|
|
742
|
-
|
|
743
|
-
{
|
|
744
|
-
// Se il prefisso per la locale predefinita è disabilitato, renderizza i figli direttamente nel percorso root
|
|
745
|
-
!middleware.prefixDefault && (
|
|
746
|
-
<Route
|
|
747
|
-
path="*"
|
|
748
|
-
element={
|
|
749
|
-
<AppLocalized locale={defaultLocale}>{children}</AppLocalized>
|
|
750
|
-
} // Avvolge i figli con la gestione della locale
|
|
751
|
-
/>
|
|
752
|
-
)
|
|
753
|
-
}
|
|
674
|
+
{localeMap(({ locale, urlPrefix }) => (
|
|
675
|
+
<Route
|
|
676
|
+
// Pattern di rotta per catturare la locale (es. /en/, /fr/) e corrispondere a tutti i percorsi successivi
|
|
677
|
+
path={`${urlPrefix}/*`}
|
|
678
|
+
key={locale}
|
|
679
|
+
element={
|
|
680
|
+
<IntlayerProvider locale={locale}>{children}</IntlayerProvider>
|
|
681
|
+
} // Avvolge i figli con la gestione della locale
|
|
682
|
+
/>
|
|
683
|
+
))}
|
|
754
684
|
</Routes>
|
|
755
685
|
</BrowserRouter>
|
|
756
686
|
);
|
|
757
687
|
```
|
|
758
688
|
|
|
759
689
|
```jsx fileName="src/components/LocaleRouter.mjx" codeFormat="esm"
|
|
760
|
-
|
|
761
|
-
import {
|
|
762
|
-
|
|
763
|
-
import {
|
|
764
|
-
import {
|
|
765
|
-
BrowserRouter,
|
|
766
|
-
Routes,
|
|
767
|
-
Route,
|
|
768
|
-
Navigate,
|
|
769
|
-
useLocation,
|
|
770
|
-
} from "react-router-dom"; // Componenti del router per la gestione della navigazione
|
|
771
|
-
|
|
772
|
-
// Destrutturazione della configurazione da Intlayer
|
|
773
|
-
const { internationalization, middleware } = configuration;
|
|
774
|
-
const { locales, defaultLocale } = internationalization;
|
|
775
|
-
|
|
776
|
-
/**
|
|
777
|
-
* Un componente che gestisce la localizzazione e avvolge i figli con il contesto della locale appropriata.
|
|
778
|
-
/**
|
|
779
|
-
* Gestisce il rilevamento e la validazione della localizzazione basata sull'URL.
|
|
780
|
-
*/
|
|
781
|
-
const AppLocalized = ({ children, locale }) => {
|
|
782
|
-
const { pathname, search } = useLocation(); // Ottiene il percorso URL corrente
|
|
783
|
-
|
|
784
|
-
// Determina la localizzazione corrente, utilizzando quella di default se non fornita
|
|
785
|
-
const currentLocale = locale ?? defaultLocale;
|
|
786
|
-
|
|
787
|
-
// Rimuove il prefisso della localizzazione dal percorso per costruire un percorso base
|
|
788
|
-
const pathWithoutLocale = getPathWithoutLocale(
|
|
789
|
-
pathname // Percorso URL corrente
|
|
790
|
-
);
|
|
791
|
-
|
|
792
|
-
/**
|
|
793
|
-
* Se middleware.prefixDefault è true, la localizzazione di default deve sempre essere prefissata.
|
|
794
|
-
*/
|
|
795
|
-
if (middleware.prefixDefault) {
|
|
796
|
-
// Valida la localizzazione
|
|
797
|
-
if (!locale || !locales.includes(locale)) {
|
|
798
|
-
// Reindirizza alla localizzazione di default con il percorso aggiornato
|
|
799
|
-
return (
|
|
800
|
-
<Navigate
|
|
801
|
-
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
802
|
-
replace // Sostituisce la voce corrente della cronologia con quella nuova
|
|
803
|
-
/>
|
|
804
|
-
);
|
|
805
|
-
}
|
|
806
|
-
|
|
807
|
-
// Avvolge i figli con IntlayerProvider e imposta la locale corrente
|
|
808
|
-
return (
|
|
809
|
-
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
810
|
-
);
|
|
811
|
-
} else {
|
|
812
|
-
/**
|
|
813
|
-
* Quando middleware.prefixDefault è false, la locale predefinita non è prefissata.
|
|
814
|
-
* Assicura che la locale corrente sia valida e non sia la locale predefinita.
|
|
815
|
-
*/
|
|
816
|
-
if (
|
|
817
|
-
currentLocale.toString() !== defaultLocale.toString() &&
|
|
818
|
-
!locales
|
|
819
|
-
.filter(
|
|
820
|
-
(locale) => locale.toString() !== defaultLocale.toString() // Esclude la locale predefinita
|
|
821
|
-
)
|
|
822
|
-
.includes(currentLocale) // Verifica se la locale corrente è nella lista delle localizzazioni valide
|
|
823
|
-
) {
|
|
824
|
-
// Reindirizza al percorso senza prefisso della localizzazione
|
|
825
|
-
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
826
|
-
}
|
|
827
|
-
|
|
828
|
-
// Avvolge i figli con IntlayerProvider e imposta la localizzazione corrente
|
|
829
|
-
return (
|
|
830
|
-
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
831
|
-
);
|
|
832
|
-
}
|
|
833
|
-
};
|
|
690
|
+
import { localeMap } from 'intlayer'; // Funzioni e tipi di utilità da 'intlayer'
|
|
691
|
+
import type { FC, PropsWithChildren } from 'react'; // Tipi React per componenti funzionali e props
|
|
692
|
+
import { IntlayerProvider } from 'react-intlayer'; // Provider per il contesto di internazionalizzazione
|
|
693
|
+
import { BrowserRouter, Route, Routes } from 'react-router-dom'; // Componenti router per la gestione della navigazione
|
|
834
694
|
|
|
835
695
|
/**
|
|
836
696
|
* Un componente router che configura le rotte specifiche per la localizzazione.
|
|
837
697
|
* Utilizza React Router per gestire la navigazione e rendere i componenti localizzati.
|
|
838
698
|
*/
|
|
839
|
-
export const LocaleRouter = ({ children }) => (
|
|
699
|
+
export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => (
|
|
840
700
|
<BrowserRouter>
|
|
841
701
|
<Routes>
|
|
842
|
-
{
|
|
843
|
-
|
|
844
|
-
(
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
/>
|
|
853
|
-
))}
|
|
854
|
-
|
|
855
|
-
{
|
|
856
|
-
// Se il prefisso per la locale predefinita è disabilitato, renderizza i figli direttamente al percorso root
|
|
857
|
-
!middleware.prefixDefault && (
|
|
858
|
-
<Route
|
|
859
|
-
path="*"
|
|
860
|
-
element={
|
|
861
|
-
<AppLocalized locale={defaultLocale}>{children}</AppLocalized>
|
|
862
|
-
} // Avvolge i figli con la gestione della locale
|
|
863
|
-
/>
|
|
864
|
-
)
|
|
865
|
-
}
|
|
702
|
+
{localeMap(({ locale, urlPrefix }) => (
|
|
703
|
+
<Route
|
|
704
|
+
// Modello di percorso per catturare la localizzazione (es. /en/, /fr/) e abbinare tutti i percorsi successivi
|
|
705
|
+
path={`${urlPrefix}/*`}
|
|
706
|
+
key={locale}
|
|
707
|
+
element={
|
|
708
|
+
<IntlayerProvider locale={locale}>{children}</IntlayerProvider>
|
|
709
|
+
} // Avvolge i figli con la gestione della localizzazione
|
|
710
|
+
/>
|
|
711
|
+
))}
|
|
866
712
|
</Routes>
|
|
867
713
|
</BrowserRouter>
|
|
868
714
|
);
|
|
869
715
|
```
|
|
870
716
|
|
|
871
717
|
```jsx fileName="src/components/LocaleRouter.cjx" codeFormat="commonjs"
|
|
872
|
-
|
|
873
|
-
const
|
|
874
|
-
const { IntlayerProvider
|
|
875
|
-
const {
|
|
876
|
-
BrowserRouter,
|
|
877
|
-
Routes,
|
|
878
|
-
Route,
|
|
879
|
-
Navigate,
|
|
880
|
-
useLocation,
|
|
881
|
-
} = require("react-router-dom"); // Componenti del router per la gestione della navigazione
|
|
882
|
-
|
|
883
|
-
// Destrutturazione della configurazione da Intlayer
|
|
884
|
-
const { internationalization, middleware } = configuration;
|
|
885
|
-
const { locales, defaultLocale } = internationalization;
|
|
718
|
+
const { localeMap } = require("intlayer"); // Funzioni e tipi di utilità da 'intlayer'
|
|
719
|
+
const React = require("react"); // Importa React
|
|
720
|
+
const { IntlayerProvider } = require("react-intlayer"); // Provider per il contesto di internazionalizzazione
|
|
721
|
+
const { BrowserRouter, Route, Routes } = require("react-router-dom"); // Componenti del router per la gestione della navigazione
|
|
886
722
|
|
|
887
723
|
/**
|
|
888
|
-
* Un componente che
|
|
889
|
-
*
|
|
724
|
+
* Un componente router che configura le rotte specifiche per la locale.
|
|
725
|
+
* Usa React Router per gestire la navigazione e renderizzare componenti localizzati.
|
|
890
726
|
*/
|
|
891
|
-
const
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
727
|
+
const LocaleRouter = ({ children }) =>
|
|
728
|
+
React.createElement(
|
|
729
|
+
BrowserRouter,
|
|
730
|
+
{},
|
|
731
|
+
React.createElement(
|
|
732
|
+
Routes,
|
|
733
|
+
{},
|
|
734
|
+
localeMap(({ locale, urlPrefix }) =>
|
|
735
|
+
React.createElement(Route, {
|
|
736
|
+
path: `${urlPrefix}/*`,
|
|
737
|
+
key: locale,
|
|
738
|
+
element: React.createElement(IntlayerProvider, { locale }, children),
|
|
739
|
+
})
|
|
740
|
+
)
|
|
741
|
+
)
|
|
900
742
|
);
|
|
901
743
|
|
|
902
|
-
|
|
903
|
-
* Se middleware.prefixDefault è true, la locale di default deve sempre essere prefissata.
|
|
904
|
-
*/
|
|
905
|
-
if (middleware.prefixDefault) {
|
|
906
|
-
// Valida la locale
|
|
907
|
-
if (!locale || !locales.includes(locale)) {
|
|
908
|
-
// Reindirizza alla locale di default con il percorso aggiornato
|
|
909
|
-
return (
|
|
910
|
-
<Navigate
|
|
911
|
-
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
912
|
-
replace // Sostituisce la voce corrente nella cronologia con quella nuova
|
|
913
|
-
/>
|
|
914
|
-
);
|
|
915
|
-
}
|
|
916
|
-
|
|
917
|
-
// Avvolge i figli con IntlayerProvider e imposta la locale corrente
|
|
918
|
-
return (
|
|
919
|
-
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
920
|
-
);
|
|
921
|
-
} else {
|
|
922
|
-
/**
|
|
923
|
-
* Quando middleware.prefixDefault è falso, la locale di default non è prefissata.
|
|
924
|
-
* Assicurarsi che la locale corrente sia valida e non la locale di default.
|
|
925
|
-
*/
|
|
926
|
-
if (
|
|
927
|
-
currentLocale.toString() !== defaultLocale.toString() &&
|
|
928
|
-
!locales
|
|
929
|
-
.filter(
|
|
930
|
-
(locale) => locale.toString() !== defaultLocale.toString() // Esclude la locale di default
|
|
931
|
-
)
|
|
932
|
-
.includes(currentLocale) // Controlla se la locale corrente è nella lista delle locale valide
|
|
933
|
-
) {
|
|
934
|
-
// Reindirizza al percorso senza prefisso della lingua
|
|
935
|
-
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
936
|
-
}
|
|
937
|
-
|
|
938
|
-
// Avvolge i figli con IntlayerProvider e imposta la lingua corrente
|
|
939
|
-
return (
|
|
940
|
-
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
941
|
-
);
|
|
942
|
-
}
|
|
943
|
-
};
|
|
944
|
-
|
|
945
|
-
/**
|
|
946
|
-
* Un componente router che configura le rotte specifiche per la lingua.
|
|
947
|
-
* Utilizza React Router per gestire la navigazione e rendere i componenti localizzati.
|
|
948
|
-
*/
|
|
949
|
-
const LocaleRouter = ({ children }) => (
|
|
950
|
-
<BrowserRouter>
|
|
951
|
-
<Routes>
|
|
952
|
-
{locales
|
|
953
|
-
.filter(
|
|
954
|
-
(locale) => middleware.prefixDefault || locale !== defaultLocale
|
|
955
|
-
)
|
|
956
|
-
.map((locale) => (
|
|
957
|
-
<Route
|
|
958
|
-
// Pattern della rotta per catturare la lingua (es. /en/, /fr/) e corrispondere a tutti i percorsi successivi
|
|
959
|
-
path={`/${locale}/*`}
|
|
960
|
-
key={locale}
|
|
961
|
-
element={<AppLocalized locale={locale}>{children}</AppLocalized>} // Avvolge i figli con la gestione della localizzazione
|
|
962
|
-
/>
|
|
963
|
-
))}
|
|
964
|
-
|
|
965
|
-
{
|
|
966
|
-
// Se il prefisso per la localizzazione predefinita è disabilitato, renderizza i figli direttamente al percorso radice
|
|
967
|
-
!middleware.prefixDefault && (
|
|
968
|
-
<Route
|
|
969
|
-
path="*"
|
|
970
|
-
element={
|
|
971
|
-
<AppLocalized locale={defaultLocale}>{children}</AppLocalized>
|
|
972
|
-
} // Avvolge i figli con la gestione della localizzazione
|
|
973
|
-
/>
|
|
974
|
-
)
|
|
975
|
-
}
|
|
976
|
-
</Routes>
|
|
977
|
-
</BrowserRouter>
|
|
978
|
-
);
|
|
744
|
+
exports.LocaleRouter = LocaleRouter;
|
|
979
745
|
```
|
|
980
746
|
|
|
747
|
+
> Nota: Se usi `routing.mode: 'no-prefix' | 'search-params'`, probabilmente non hai bisogno di usare la funzione `localeMap`.
|
|
748
|
+
|
|
981
749
|
Quindi, puoi utilizzare il componente `LocaleRouter` nella tua applicazione:
|
|
982
750
|
|
|
983
751
|
```tsx fileName="src/App.tsx" codeFormat="typescript"
|
|
@@ -1019,6 +787,8 @@ const App = () => (
|
|
|
1019
787
|
|
|
1020
788
|
In parallelo, puoi anche utilizzare il `intlayerProxy` per aggiungere il routing lato server alla tua applicazione. Questo plugin rileverà automaticamente la locale corrente basandosi sull'URL e imposterà il cookie della locale appropriata. Se non viene specificata alcuna locale, il plugin determinerà la locale più adatta in base alle preferenze linguistiche del browser dell'utente. Se non viene rilevata alcuna locale, verrà effettuato un reindirizzamento alla locale predefinita.
|
|
1021
789
|
|
|
790
|
+
> Nota che per usare `intlayerProxy` in produzione, devi spostare il pacchetto `vite-intlayer` da `devDependencies` a `dependencies`.
|
|
791
|
+
|
|
1022
792
|
```typescript {3,7} fileName="vite.config.ts" codeFormat="typescript"
|
|
1023
793
|
import { defineConfig } from "vite";
|
|
1024
794
|
import react from "@vitejs/plugin-react-swc";
|
|
@@ -1257,8 +1027,8 @@ const LocaleSwitcher = () => {
|
|
|
1257
1027
|
> - [`getHTMLTextDir` hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/packages/intlayer/getHTMLTextDir.md)
|
|
1258
1028
|
> - [`hrefLang` attribute](https://developers.google.com/search/docs/specialty/international/localized-versions?hl=fr)
|
|
1259
1029
|
> - [`lang` attribute](https://developer.mozilla.org/it/docs/Web/HTML/Global_attributes/lang)
|
|
1260
|
-
> - [`dir` attribute
|
|
1261
|
-
> - [`aria-current` attribute
|
|
1030
|
+
> - [`dir` attribute](https://developer.mozilla.org/it/docs/Web/HTML/Global_attributes/dir)
|
|
1031
|
+
> - [`aria-current` attribute](https://developer.mozilla.org/it/docs/Web/Accessibility/ARIA/Attributes/aria-current)
|
|
1262
1032
|
|
|
1263
1033
|
Di seguito il **Passo 9** aggiornato con spiegazioni aggiuntive ed esempi di codice migliorati:
|
|
1264
1034
|
|
|
@@ -1272,11 +1042,11 @@ Quando la tua applicazione supporta più lingue, è fondamentale aggiornare gli
|
|
|
1272
1042
|
- **Rendering del testo**: L'attributo `dir` (direzione) assicura che il testo venga visualizzato nell'ordine corretto (ad esempio, da sinistra a destra per l'inglese, da destra a sinistra per l'arabo o l'ebraico), essenziale per la leggibilità.
|
|
1273
1043
|
- **SEO**: I motori di ricerca utilizzano l'attributo `lang` per determinare la lingua della tua pagina, aiutando a mostrare il contenuto localizzato appropriato nei risultati di ricerca.
|
|
1274
1044
|
|
|
1275
|
-
Aggiornando dinamicamente questi attributi quando la
|
|
1045
|
+
Aggiornando dinamicamente questi attributi quando la locale cambia, garantisci un'esperienza coerente e accessibile per gli utenti in tutte le lingue supportate.
|
|
1276
1046
|
|
|
1277
1047
|
#### Implementazione del Hook
|
|
1278
1048
|
|
|
1279
|
-
Crea un hook personalizzato per gestire gli attributi HTML. L'hook ascolta i cambiamenti della
|
|
1049
|
+
Crea un hook personalizzato per gestire gli attributi HTML. L'hook ascolta i cambiamenti della locale e aggiorna gli attributi di conseguenza:
|
|
1280
1050
|
|
|
1281
1051
|
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx" codeFormat="typescript"
|
|
1282
1052
|
import { useEffect } from "react";
|
|
@@ -1305,7 +1075,7 @@ export const useI18nHTMLAttributes = () => {
|
|
|
1305
1075
|
|
|
1306
1076
|
```jsx fileName="src/hooks/useI18nHTMLAttributes.msx" codeFormat="esm"
|
|
1307
1077
|
import { useEffect } from "react";
|
|
1308
|
-
import { useLocale } from "
|
|
1078
|
+
import { useLocale } from "intlayer";
|
|
1309
1079
|
import { getHTMLTextDir } from "intlayer";
|
|
1310
1080
|
|
|
1311
1081
|
/**
|
|
@@ -1426,42 +1196,18 @@ module.exports = App;
|
|
|
1426
1196
|
|
|
1427
1197
|
Applicando queste modifiche, la tua applicazione:
|
|
1428
1198
|
|
|
1429
|
-
-
|
|
1430
|
-
-
|
|
1431
|
-
-
|
|
1432
|
-
|
|
1433
|
-
### (Opzionale) Passo 10: Creare un componente Link localizzato
|
|
1434
|
-
|
|
1435
|
-
// Applica l'hook per aggiornare gli attributi lang e dir del tag <html> in base alla locale.
|
|
1436
|
-
useI18nHTMLAttributes();
|
|
1437
|
-
|
|
1438
|
-
// ... Resto del tuo componente
|
|
1439
|
-
};
|
|
1440
|
-
|
|
1441
|
-
const App = () => (
|
|
1442
|
-
<IntlayerProvider>
|
|
1443
|
-
<AppContent />
|
|
1444
|
-
</IntlayerProvider>
|
|
1445
|
-
);
|
|
1446
|
-
|
|
1447
|
-
module.exports = App;
|
|
1448
|
-
|
|
1449
|
-
````
|
|
1450
|
-
|
|
1451
|
-
Applicando queste modifiche, la tua applicazione:
|
|
1452
|
-
|
|
1453
|
-
- Garantirà che l'attributo **lingua** (`lang`) rifletta correttamente la locale corrente, cosa importante per la SEO e il comportamento del browser.
|
|
1454
|
-
- Adatterà la **direzione del testo** (`dir`) in base alla locale, migliorando la leggibilità e l'usabilità per le lingue con ordini di lettura differenti.
|
|
1455
|
-
- Fornirà un'esperienza più **accessibile**, poiché le tecnologie assistive dipendono da questi attributi per funzionare in modo ottimale.
|
|
1199
|
+
- Garantire che l'attributo **language** (`lang`) rifletta correttamente la locale corrente, importante per la SEO e il comportamento del browser.
|
|
1200
|
+
- Adattare la **direzione del testo** (`dir`) in base alla locale, migliorando la leggibilità e l'usabilità per lingue con ordini di lettura differenti.
|
|
1201
|
+
- Fornire un'esperienza più **accessibile**, poiché le tecnologie assistive si basano su questi attributi per funzionare al meglio.
|
|
1456
1202
|
|
|
1457
1203
|
### (Opzionale) Passo 10: Creare un componente Link localizzato
|
|
1458
1204
|
|
|
1459
|
-
Per garantire che la navigazione della tua applicazione rispetti la
|
|
1205
|
+
Per garantire che la navigazione della tua applicazione rispetti la locale corrente, puoi creare un componente `Link` personalizzato. Questo componente aggiunge automaticamente il prefisso della lingua corrente agli URL interni. Ad esempio, quando un utente francofono clicca su un link alla pagina "About", viene reindirizzato a `/fr/about` invece che a `/about`.
|
|
1460
1206
|
|
|
1461
1207
|
Questo comportamento è utile per diversi motivi:
|
|
1462
1208
|
|
|
1463
1209
|
- **SEO e esperienza utente**: Gli URL localizzati aiutano i motori di ricerca a indicizzare correttamente le pagine specifiche per lingua e forniscono agli utenti contenuti nella loro lingua preferita.
|
|
1464
|
-
- **Coerenza**: Utilizzando un link localizzato in tutta l'applicazione, garantisci che la navigazione rimanga all'interno della
|
|
1210
|
+
- **Coerenza**: Utilizzando un link localizzato in tutta l'applicazione, garantisci che la navigazione rimanga all'interno della locale corrente, evitando cambiamenti di lingua imprevisti.
|
|
1465
1211
|
- **Manutenibilità**: Centralizzare la logica di localizzazione in un unico componente semplifica la gestione degli URL, rendendo il tuo codice più facile da mantenere ed estendere man mano che la tua applicazione cresce.
|
|
1466
1212
|
|
|
1467
1213
|
Di seguito è riportata l'implementazione di un componente `Link` localizzato in TypeScript:
|
|
@@ -1475,23 +1221,22 @@ import {
|
|
|
1475
1221
|
} from "react";
|
|
1476
1222
|
import { useLocale } from "react-intlayer";
|
|
1477
1223
|
|
|
1478
|
-
export interface LinkProps
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
> {}
|
|
1224
|
+
export interface LinkProps extends DetailedHTMLProps<
|
|
1225
|
+
AnchorHTMLAttributes<HTMLAnchorElement>,
|
|
1226
|
+
HTMLAnchorElement
|
|
1227
|
+
> {}
|
|
1483
1228
|
|
|
1484
1229
|
/**
|
|
1485
|
-
* Funzione di utilità per verificare se un
|
|
1230
|
+
* Funzione di utilità per verificare se un URL è esterno.
|
|
1486
1231
|
* Se l'URL inizia con http:// o https://, è considerato esterno.
|
|
1487
1232
|
*/
|
|
1488
1233
|
export const checkIsExternalLink = (href?: string): boolean =>
|
|
1489
1234
|
/^https?:\/\//.test(href ?? "");
|
|
1490
1235
|
|
|
1491
1236
|
/**
|
|
1492
|
-
*
|
|
1493
|
-
* Per i link interni, utilizza `getLocalizedUrl` per
|
|
1494
|
-
* Questo garantisce che la navigazione rimanga all'interno dello stesso contesto
|
|
1237
|
+
* Componente Link personalizzato che adatta l'attributo href in base alla locale corrente.
|
|
1238
|
+
* Per i link interni, utilizza `getLocalizedUrl` per anteporre la locale all'URL (es. /fr/about).
|
|
1239
|
+
* Questo garantisce che la navigazione rimanga all'interno dello stesso contesto locale.
|
|
1495
1240
|
*/
|
|
1496
1241
|
export const Link = forwardRef<HTMLAnchorElement, LinkProps>(
|
|
1497
1242
|
({ href, children, ...props }, ref) => {
|
|
@@ -1511,7 +1256,7 @@ export const Link = forwardRef<HTMLAnchorElement, LinkProps>(
|
|
|
1511
1256
|
);
|
|
1512
1257
|
|
|
1513
1258
|
Link.displayName = "Link";
|
|
1514
|
-
|
|
1259
|
+
```
|
|
1515
1260
|
|
|
1516
1261
|
```jsx fileName="src/components/Link.mjx" codeFormat="esm"
|
|
1517
1262
|
import { getLocalizedUrl } from "intlayer";
|
|
@@ -1526,9 +1271,9 @@ export const checkIsExternalLink = (href?: string): boolean =>
|
|
|
1526
1271
|
/^https?:\/\//.test(href ?? "");
|
|
1527
1272
|
|
|
1528
1273
|
/**
|
|
1529
|
-
*
|
|
1530
|
-
* Per i link interni, utilizza `getLocalizedUrl` per
|
|
1531
|
-
* Questo garantisce che la navigazione rimanga all'interno dello stesso contesto
|
|
1274
|
+
* Componente Link personalizzato che adatta l'attributo href in base alla locale corrente.
|
|
1275
|
+
* Per i link interni, utilizza `getLocalizedUrl` per anteporre la locale all'URL (es. /fr/about).
|
|
1276
|
+
* Questo garantisce che la navigazione rimanga all'interno dello stesso contesto locale.
|
|
1532
1277
|
*/
|
|
1533
1278
|
export const Link = forwardRef(({ href, children, ...props }, ref) => {
|
|
1534
1279
|
const { locale } = useLocale();
|
|
@@ -1554,21 +1299,21 @@ const { useLocale } = require("react-intlayer");
|
|
|
1554
1299
|
const { forwardRef } = require("react");
|
|
1555
1300
|
|
|
1556
1301
|
/**
|
|
1557
|
-
* Funzione di utilità per verificare se un
|
|
1302
|
+
* Funzione di utilità per verificare se un URL è esterno.
|
|
1558
1303
|
* Se l'URL inizia con http:// o https://, è considerato esterno.
|
|
1559
1304
|
*/
|
|
1560
1305
|
const checkIsExternalLink = (href) => /^https?:\/\//.test(href ?? "");
|
|
1561
1306
|
|
|
1562
1307
|
/**
|
|
1563
1308
|
* Un componente Link personalizzato che adatta l'attributo href in base alla locale corrente.
|
|
1564
|
-
* Per i link interni, utilizza `getLocalizedUrl` per
|
|
1565
|
-
* Questo garantisce che la navigazione rimanga
|
|
1309
|
+
* Per i link interni, utilizza `getLocalizedUrl` per aggiungere il prefisso della locale all'URL (es. /fr/about).
|
|
1310
|
+
* Questo garantisce che la navigazione rimanga nel contesto della stessa locale.
|
|
1566
1311
|
*/
|
|
1567
1312
|
const Link = forwardRef(({ href, children, ...props }, ref) => {
|
|
1568
1313
|
const { locale } = useLocale();
|
|
1569
1314
|
const isExternalLink = checkIsExternalLink(href);
|
|
1570
1315
|
|
|
1571
|
-
// Se il link è interno e
|
|
1316
|
+
// Se il link è interno e l'href è valido, ottieni l'URL localizzato.
|
|
1572
1317
|
const localizedHref = isExternalLink ? href : getLocalizedUrl(href, locale);
|
|
1573
1318
|
|
|
1574
1319
|
return (
|
|
@@ -1586,37 +1331,24 @@ const Link = forwardRef(({ href, children, ...props }, ref) => {
|
|
|
1586
1331
|
Link.displayName = "Link";
|
|
1587
1332
|
```
|
|
1588
1333
|
|
|
1589
|
-
|
|
1334
|
+
- Funzione di utilità per verificare se un URL è esterno.
|
|
1335
|
+
- Se l'URL inizia con http:// o https://, è considerato esterno.
|
|
1336
|
+
|
|
1337
|
+
#### Come funziona
|
|
1590
1338
|
|
|
1591
|
-
|
|
1592
|
-
La funzione di supporto `checkIsExternalLink` determina se un URL è esterno. I link esterni vengono lasciati invariati perché non necessitano di localizzazione.
|
|
1339
|
+
/\*\*
|
|
1593
1340
|
|
|
1594
|
-
- **
|
|
1341
|
+
- **Rilevamento dei link esterni**:
|
|
1342
|
+
La funzione helper `checkIsExternalLink` determina se un URL è esterno. I link esterni vengono lasciati invariati perché non necessitano di localizzazione.
|
|
1343
|
+
|
|
1344
|
+
- **Recupero della locale corrente**:
|
|
1595
1345
|
L'hook `useLocale` fornisce la locale corrente (ad esempio, `fr` per francese).
|
|
1596
1346
|
|
|
1597
1347
|
- **Localizzazione dell'URL**:
|
|
1598
|
-
|
|
1348
|
+
Per i link interni (cioè non esterni), `getLocalizedUrl` viene utilizzato per anteporre automaticamente all'URL la locale corrente. Questo significa che se il tuo utente è in francese, passando `/about` come `href` verrà trasformato in `/fr/about`.
|
|
1599
1349
|
|
|
1600
1350
|
- **Restituzione del Link**:
|
|
1601
|
-
Il componente restituisce un elemento `<a>` con l'URL localizzato, garantendo che la navigazione sia coerente con la
|
|
1602
|
-
|
|
1603
|
-
Integrando questo componente `Link` in tutta la tua applicazione, mantieni un'esperienza utente coerente e consapevole della lingua, beneficiando anche di un miglior SEO e usabilità.
|
|
1604
|
-
|
|
1605
|
-
### Configurare TypeScript
|
|
1606
|
-
|
|
1607
|
-
Intlayer utilizza l'augmentation dei moduli per sfruttare i vantaggi di TypeScript e rendere il tuo codice più robusto.
|
|
1608
|
-
|
|
1609
|
-

|
|
1610
|
-
|
|
1611
|
-

|
|
1612
|
-
|
|
1613
|
-
Assicurati che la tua configurazione di TypeScript includa i tipi generati automaticamente.
|
|
1614
|
-
|
|
1615
|
-
````json5 fileName="tsconfig.json"
|
|
1616
|
-
{
|
|
1617
|
-
// ... Le tue configurazioni TypeScript esistenti
|
|
1618
|
-
"include": [
|
|
1619
|
-
Il componente restituisce un elemento `<a>` con l'URL localizzato, garantendo che la navigazione sia coerente con la lingua selezionata.
|
|
1351
|
+
Il componente restituisce un elemento `<a>` con l'URL localizzato, garantendo che la navigazione sia coerente con la locale.
|
|
1620
1352
|
|
|
1621
1353
|
Integrando questo componente `Link` in tutta la tua applicazione, mantieni un'esperienza utente coerente e consapevole della lingua, beneficiando inoltre di un miglior SEO e usabilità.
|
|
1622
1354
|
|
|
@@ -1624,12 +1356,10 @@ Integrando questo componente `Link` in tutta la tua applicazione, mantieni un'es
|
|
|
1624
1356
|
|
|
1625
1357
|
Intlayer utilizza l'augmentation dei moduli per sfruttare i vantaggi di TypeScript e rendere il tuo codice più robusto.
|
|
1626
1358
|
|
|
1627
|
-
|
|
1628
1359
|

|
|
1629
1360
|
|
|
1630
1361
|

|
|
1631
1362
|
|
|
1632
|
-
|
|
1633
1363
|
Assicurati che la tua configurazione TypeScript includa i tipi generati automaticamente.
|
|
1634
1364
|
|
|
1635
1365
|
```json5 fileName="tsconfig.json"
|
|
@@ -1640,7 +1370,7 @@ Assicurati che la tua configurazione TypeScript includa i tipi generati automati
|
|
|
1640
1370
|
".intlayer/**/*.ts", // Includi i tipi generati automaticamente
|
|
1641
1371
|
],
|
|
1642
1372
|
}
|
|
1643
|
-
|
|
1373
|
+
```
|
|
1644
1374
|
|
|
1645
1375
|
### Configurazione Git
|
|
1646
1376
|
|
|
@@ -1649,7 +1379,7 @@ Si consiglia di ignorare i file generati da Intlayer. Questo ti permette di evit
|
|
|
1649
1379
|
Per farlo, puoi aggiungere le seguenti istruzioni al tuo file `.gitignore`:
|
|
1650
1380
|
|
|
1651
1381
|
```plaintext
|
|
1652
|
-
#
|
|
1382
|
+
# Ignora i file generati da Intlayer
|
|
1653
1383
|
.intlayer
|
|
1654
1384
|
```
|
|
1655
1385
|
|
|
@@ -1673,5 +1403,3 @@ Per maggiori dettagli su come utilizzare l'estensione, consulta la [documentazio
|
|
|
1673
1403
|
### Approfondimenti
|
|
1674
1404
|
|
|
1675
1405
|
Per approfondire, puoi implementare l'[editor visuale](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/intlayer_visual_editor.md) o esternalizzare i tuoi contenuti utilizzando il [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/intlayer_CMS.md).
|
|
1676
|
-
|
|
1677
|
-
---
|