@intlayer/docs 7.3.15 → 7.4.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.
@@ -19,9 +19,12 @@ slugs:
19
19
  applicationTemplate: https://github.com/aymericzip/intlayer-tanstack-start-template
20
20
  youtubeVideo: https://www.youtube.com/watch?v=_XTdKVWaeqg
21
21
  history:
22
+ - version: 7.4.0
23
+ date: 2025-12-11
24
+ changes: Introduce validatePrefix y añade el paso 14: Cómo gestionar páginas 404 con rutas localizadas.
22
25
  - version: 7.3.9
23
26
  date: 2025-12-05
24
- changes: Add step 13: Retrieve the locale in your server actions (Optional)
27
+ changes: Añade el paso 13: Obtener la configuración regional en tus server actions (Opcional)
25
28
  - version: 5.8.1
26
29
  date: 2025-09-09
27
30
  changes: Añadido para Tanstack Start
@@ -605,7 +608,134 @@ export const getLocaleServer = createServerFn().handler(async () => {
605
608
 
606
609
  ---
607
610
 
608
- ### Paso 14: Configurar TypeScript (Opcional)
611
+ ### Paso 14: Gestionar páginas no encontradas (Opcional)
612
+
613
+ Cuando un usuario visita una página que no existe, puedes mostrar una página personalizada de no encontrada y el prefijo de configuración regional puede afectar la forma en que se activa la página de no encontrada.
614
+
615
+ #### Entender el manejo de 404 de TanStack Router con prefijos de configuración regional
616
+
617
+ En TanStack Router, manejar páginas 404 con rutas localizadas requiere un enfoque de múltiples capas:
618
+
619
+ 1. **Ruta 404 dedicada**: Una ruta específica para mostrar la UI de 404
620
+ 2. **Validación a nivel de ruta**: Valida los prefijos de configuración regional y redirige los inválidos a 404
621
+ 3. **Ruta catch-all**: Captura cualquier ruta no coincidente dentro del segmento de configuración regional
622
+
623
+ ```tsx fileName="src/routes/{-$locale}/404.tsx"
624
+ import { createFileRoute } from "@tanstack/react-router";
625
+
626
+ // Esto crea una ruta dedicada /[locale]/404
627
+ // Se usa tanto como una ruta directa como importada como componente en otros archivos
628
+ export const Route = createFileRoute("/{-$locale}/404")({
629
+ component: NotFoundComponent,
630
+ });
631
+
632
+ // Exportado por separado para que pueda reutilizarse en notFoundComponent y rutas catch-all
633
+ export function NotFoundComponent() {
634
+ return (
635
+ <div>
636
+ <h1>404</h1>
637
+ </div>
638
+ );
639
+ }
640
+ ```
641
+
642
+ ```tsx fileName="src/routes/__root.tsx"
643
+ import { createRootRoute } from "@tanstack/react-router";
644
+
645
+ // La ruta raíz sirve como el diseño de nivel superior
646
+ // No maneja los 404 directamente - eso se delega a las rutas hijas
647
+ // Esto mantiene la raíz simple y permite que las rutas conscientes de la configuración regional gestionen su propia lógica 404
648
+ export const Route = createRootRoute({
649
+ component: Outlet,
650
+ });
651
+ ```
652
+
653
+ ```tsx fileName="src/routes/{-$locale}/route.tsx"
654
+ import { createFileRoute, Outlet, redirect } from "@tanstack/react-router";
655
+ import { validatePrefix } from "intlayer";
656
+ import { IntlayerProvider, useLocale } from "react-intlayer";
657
+
658
+ import { LocaleSwitcher } from "@/components/locale-switcher";
659
+ import { NotFoundComponent } from "./404";
660
+
661
+ export const Route = createFileRoute("/{-$locale}")({
662
+ // beforeLoad se ejecuta antes de que la ruta se renderice (tanto en el servidor como en el cliente)
663
+ // Es el lugar ideal para validar el prefijo de configuración regional
664
+ beforeLoad: ({ params }) => {
665
+ // Obtener la configuración regional de los parámetros de la ruta (no de los encabezados del servidor, ya que beforeLoad se ejecuta tanto en el cliente como en el servidor)
666
+ const localeParam = params.locale;
667
+
668
+ // validatePrefix verifica si la configuración regional es válida según tu configuración de intlayer
669
+ // Retorna: { isValid: boolean, localePrefix: string }
670
+ // - isValid: true si el prefijo coincide con una configuración regional configurada (o está vacío cuando el prefijo es opcional)
671
+ // - localePrefix: el prefijo validado o el prefijo de configuración regional predeterminado para redirecciones
672
+ const { isValid, localePrefix } = validatePrefix(localeParam);
673
+
674
+ if (isValid) {
675
+ // La configuración regional es válida, permitir que la ruta se renderice normalmente
676
+ return;
677
+ }
678
+
679
+ // Prefijo de configuración regional inválido (p. ej., /xyz/about donde "xyz" no es una configuración regional válida)
680
+ // Redirigir a la página 404 con un prefijo de configuración regional válido
681
+ // Esto asegura que la página 404 siga estando correctamente localizada
682
+ throw redirect({
683
+ to: "/{-$locale}/404",
684
+ params: { locale: localePrefix },
685
+ });
686
+ },
687
+ component: RouteComponent,
688
+ // notFoundComponent se llama cuando una ruta hija no existe
689
+ // p. ej., /en/pagina-inexistente activa esto dentro del diseño /en
690
+ notFoundComponent: NotFoundLayout,
691
+ });
692
+
693
+ function RouteComponent() {
694
+ const { defaultLocale } = useLocale();
695
+ const { locale } = Route.useParams();
696
+
697
+ return (
698
+ // Envuelve todo el segmento de configuración regional con IntlayerProvider
699
+ // Vuelve a defaultLocale cuando el parámetro locale es undefined (modo de prefijo opcional)
700
+ <IntlayerProvider locale={locale ?? defaultLocale}>
701
+ <Outlet />
702
+ </IntlayerProvider>
703
+ );
704
+ }
705
+
706
+ // NotFoundLayout envuelve el componente 404 con IntlayerProvider
707
+ // Esto asegura que las traducciones sigan funcionando en la página 404
708
+ function NotFoundLayout() {
709
+ const { defaultLocale } = useLocale();
710
+ const { locale } = Route.useParams();
711
+
712
+ return (
713
+ <IntlayerProvider locale={locale ?? defaultLocale}>
714
+ <NotFoundComponent />
715
+ {/* Incluir LocaleSwitcher para que los usuarios puedan cambiar el idioma incluso en 404 */}
716
+ <LocaleSwitcher />
717
+ </IntlayerProvider>
718
+ );
719
+ }
720
+ ```
721
+
722
+ ```tsx fileName="src/routes/{-$locale}/$.tsx"
723
+ import { createFileRoute } from "@tanstack/react-router";
724
+
725
+ import { NotFoundComponent } from "./404";
726
+
727
+ // La ruta $ (splat/catch-all) coincide con cualquier ruta que no coincida con otras rutas
728
+ // p. ej., /en/algun/ruta/profunda/anidada/invalida
729
+ // Esto asegura que TODAS las rutas no coincidentes dentro de una configuración regional muestren la página 404
730
+ // Sin esto, las rutas profundas no coincidentes podrían mostrar una página en blanco o un error
731
+ export const Route = createFileRoute("/{-$locale}/$")({
732
+ component: NotFoundComponent,
733
+ });
734
+ ```
735
+
736
+ ---
737
+
738
+ ### Paso 15: Configurar TypeScript (Opcional)
609
739
 
610
740
  Intlayer utiliza la ampliación de módulos para aprovechar las ventajas de TypeScript y fortalecer tu base de código.
611
741
 
@@ -19,9 +19,12 @@ slugs:
19
19
  applicationTemplate: https://github.com/aymericzip/intlayer-tanstack-start-template
20
20
  youtubeVideo: https://www.youtube.com/watch?v=_XTdKVWaeqg
21
21
  history:
22
+ - version: 7.4.0
23
+ date: 2025-12-11
24
+ changes: Ajout de validatePrefix et étape 14 : gestion des pages 404 avec routes localisées.
22
25
  - version: 7.3.9
23
26
  date: 2025-12-05
24
- changes: Add step 13: Retrieve the locale in your server actions (Optional)
27
+ changes: Ajout de l’étape 13 : récupération de la locale dans vos server actions (optionnel)
25
28
  - version: 5.8.1
26
29
  date: 2025-09-09
27
30
  changes: Ajout pour Tanstack Start
@@ -609,7 +612,134 @@ export const getLocaleServer = createServerFn().handler(async () => {
609
612
 
610
613
  ---
611
614
 
612
- ### Étape 14 : Configurer TypeScript (Optionnel)
615
+ ### Étape 14 : Gérer les pages non trouvées (Optionnel)
616
+
617
+ Lorsqu'un utilisateur visite une page inexistante, vous pouvez afficher une page personnalisée de non trouvée et le préfixe de locale peut affecter la façon dont la page de non trouvée est déclenchée.
618
+
619
+ #### Comprendre la gestion des 404 de TanStack Router avec les préfixes de locale
620
+
621
+ Dans TanStack Router, la gestion des pages 404 avec des routes localisées nécessite une approche multicouche :
622
+
623
+ 1. **Route 404 dédiée** : Une route spécifique pour afficher l'interface utilisateur 404
624
+ 2. **Validation au niveau de la route** : Valide les préfixes de locale et redirige ceux qui sont invalides vers 404
625
+ 3. **Route catch-all** : Capture tous les chemins non correspondants dans le segment de locale
626
+
627
+ ```tsx fileName="src/routes/{-$locale}/404.tsx"
628
+ import { createFileRoute } from "@tanstack/react-router";
629
+
630
+ // Ceci crée une route dédiée /[locale]/404
631
+ // Elle est utilisée à la fois comme route directe et importée comme composant dans d'autres fichiers
632
+ export const Route = createFileRoute("/{-$locale}/404")({
633
+ component: NotFoundComponent,
634
+ });
635
+
636
+ // Exporté séparément pour pouvoir être réutilisé dans notFoundComponent et les routes catch-all
637
+ export function NotFoundComponent() {
638
+ return (
639
+ <div>
640
+ <h1>404</h1>
641
+ </div>
642
+ );
643
+ }
644
+ ```
645
+
646
+ ```tsx fileName="src/routes/__root.tsx"
647
+ import { createRootRoute } from "@tanstack/react-router";
648
+
649
+ // La route racine sert de mise en page de niveau supérieur
650
+ // Elle ne gère pas les 404 directement - c'est délégué aux routes enfants
651
+ // Cela garde la racine simple et permet aux routes conscientes de la locale de gérer leur propre logique 404
652
+ export const Route = createRootRoute({
653
+ component: Outlet,
654
+ });
655
+ ```
656
+
657
+ ```tsx fileName="src/routes/{-$locale}/route.tsx"
658
+ import { createFileRoute, Outlet, redirect } from "@tanstack/react-router";
659
+ import { validatePrefix } from "intlayer";
660
+ import { IntlayerProvider, useLocale } from "react-intlayer";
661
+
662
+ import { LocaleSwitcher } from "@/components/locale-switcher";
663
+ import { NotFoundComponent } from "./404";
664
+
665
+ export const Route = createFileRoute("/{-$locale}")({
666
+ // beforeLoad s'exécute avant que la route ne soit rendue (à la fois sur le serveur et le client)
667
+ // C'est l'endroit idéal pour valider le préfixe de locale
668
+ beforeLoad: ({ params }) => {
669
+ // Obtenir la locale depuis les paramètres de route (pas depuis les en-têtes du serveur, car beforeLoad s'exécute à la fois sur le client et le serveur)
670
+ const localeParam = params.locale;
671
+
672
+ // validatePrefix vérifie si la locale est valide selon votre configuration intlayer
673
+ // Retourne : { isValid: boolean, localePrefix: string }
674
+ // - isValid: true si le préfixe correspond à une locale configurée (ou est vide lorsque le préfixe est optionnel)
675
+ // - localePrefix: le préfixe validé ou le préfixe de locale par défaut pour les redirections
676
+ const { isValid, localePrefix } = validatePrefix(localeParam);
677
+
678
+ if (isValid) {
679
+ // La locale est valide, permettre à la route de se rendre normalement
680
+ return;
681
+ }
682
+
683
+ // Préfixe de locale invalide (p. ex., /xyz/about où "xyz" n'est pas une locale valide)
684
+ // Rediriger vers la page 404 avec un préfixe de locale valide
685
+ // Cela garantit que la page 404 est toujours correctement localisée
686
+ throw redirect({
687
+ to: "/{-$locale}/404",
688
+ params: { locale: localePrefix },
689
+ });
690
+ },
691
+ component: RouteComponent,
692
+ // notFoundComponent est appelé lorsqu'une route enfant n'existe pas
693
+ // p. ex., /en/page-inexistante déclenche ceci dans la mise en page /en
694
+ notFoundComponent: NotFoundLayout,
695
+ });
696
+
697
+ function RouteComponent() {
698
+ const { defaultLocale } = useLocale();
699
+ const { locale } = Route.useParams();
700
+
701
+ return (
702
+ // Envelopper tout le segment de locale avec IntlayerProvider
703
+ // Revient à defaultLocale lorsque le paramètre locale est undefined (mode préfixe optionnel)
704
+ <IntlayerProvider locale={locale ?? defaultLocale}>
705
+ <Outlet />
706
+ </IntlayerProvider>
707
+ );
708
+ }
709
+
710
+ // NotFoundLayout enveloppe le composant 404 avec IntlayerProvider
711
+ // Cela garantit que les traductions fonctionnent toujours sur la page 404
712
+ function NotFoundLayout() {
713
+ const { defaultLocale } = useLocale();
714
+ const { locale } = Route.useParams();
715
+
716
+ return (
717
+ <IntlayerProvider locale={locale ?? defaultLocale}>
718
+ <NotFoundComponent />
719
+ {/* Inclure LocaleSwitcher pour que les utilisateurs puissent changer de langue même sur 404 */}
720
+ <LocaleSwitcher />
721
+ </IntlayerProvider>
722
+ );
723
+ }
724
+ ```
725
+
726
+ ```tsx fileName="src/routes/{-$locale}/$.tsx"
727
+ import { createFileRoute } from "@tanstack/react-router";
728
+
729
+ import { NotFoundComponent } from "./404";
730
+
731
+ // La route $ (splat/catch-all) correspond à tout chemin qui ne correspond pas à d'autres routes
732
+ // p. ex., /en/quelque/chemin/profond/imbriqué/invalide
733
+ // Cela garantit que TOUS les chemins non correspondants dans une locale affichent la page 404
734
+ // Sans cela, les chemins profonds non correspondants pourraient afficher une page blanche ou une erreur
735
+ export const Route = createFileRoute("/{-$locale}/$")({
736
+ component: NotFoundComponent,
737
+ });
738
+ ```
739
+
740
+ ---
741
+
742
+ ### Étape 15 : Configurer TypeScript (Optionnel)
613
743
 
614
744
  Intlayer utilise l'augmentation de module pour bénéficier de TypeScript et renforcer votre base de code.
615
745
 
@@ -19,9 +19,12 @@ slugs:
19
19
  applicationTemplate: https://github.com/aymericzip/intlayer-tanstack-start-template
20
20
  youtubeVideo: https://www.youtube.com/watch?v=_XTdKVWaeqg
21
21
  history:
22
+ - version: 7.4.0
23
+ date: 2025-12-11
24
+ changes: validatePrefix पेश किया गया और चरण 14 जोड़ा गया: स्थानीयकृत रूट्स के साथ 404 पेज हैंडल करना।
22
25
  - version: 7.3.9
23
26
  date: 2025-12-05
24
- changes: Add step 13: Retrieve the locale in your server actions (Optional)
27
+ changes: चरण 13 जोड़ा गया: सर्वर एक्शन्स में अपनी भाषा (locale) प्राप्त करें (वैकल्पिक)
25
28
  - version: 6.5.2
26
29
  date: 2025-10-03
27
30
  changes: दस्तावेज़ अपडेट
@@ -590,7 +593,134 @@ export const getLocaleServer = createServerFn().handler(async () => {
590
593
 
591
594
  ---
592
595
 
593
- ### चरण 14: टाइपस्क्रिप्ट कॉन्फ़िगर करें (वैकल्पिक)
596
+ ### चरण 14: पृष्ठ नहीं मिले प्रबंधित करें (वैकल्पिक)
597
+
598
+ जब कोई उपयोगकर्ता एक मौजूदा नहीं पृष्ठ पर जाता है, तो आप एक कस्टम पृष्ठ नहीं मिला प्रदर्शित कर सकते हैं और लोकेल उपसर्ग पृष्ठ नहीं मिला के ट्रिगर होने के तरीके को प्रभावित कर सकता है।
599
+
600
+ #### लोकेल उपसर्गों के साथ TanStack Router के 404 हैंडलिंग को समझना
601
+
602
+ TanStack Router में, स्थानीयकृत रूट के साथ 404 पृष्ठों को हैंडल करने के लिए एक बहु-परत दृष्टिकोण की आवश्यकता होती है:
603
+
604
+ 1. **समर्पित 404 रूट**: 404 UI प्रदर्शित करने के लिए एक विशिष्ट रूट
605
+ 2. **रूट-स्तरीय सत्यापन**: लोकेल उपसर्गों को सत्यापित करता है और अमान्य को 404 पर रीडायरेक्ट करता है
606
+ 3. **कैच-ऑल रूट**: लोकेल सेगमेंट के भीतर किसी भी मैच न होने वाले पथ को कैप्चर करता है
607
+
608
+ ```tsx fileName="src/routes/{-$locale}/404.tsx"
609
+ import { createFileRoute } from "@tanstack/react-router";
610
+
611
+ // यह एक समर्पित /[locale]/404 रूट बनाता है
612
+ // इसका उपयोग एक प्रत्यक्ष रूट के रूप में और अन्य फ़ाइलों में एक घटक के रूप में आयात किया जाता है
613
+ export const Route = createFileRoute("/{-$locale}/404")({
614
+ component: NotFoundComponent,
615
+ });
616
+
617
+ // अलग से निर्यात किया गया ताकि इसे notFoundComponent और catch-all रूट में पुन: उपयोग किया जा सके
618
+ export function NotFoundComponent() {
619
+ return (
620
+ <div>
621
+ <h1>404</h1>
622
+ </div>
623
+ );
624
+ }
625
+ ```
626
+
627
+ ```tsx fileName="src/routes/__root.tsx"
628
+ import { createRootRoute } from "@tanstack/react-router";
629
+
630
+ // रूट रूट शीर्ष-स्तरीय लेआउट के रूप में कार्य करता है
631
+ // यह 404 को सीधे हैंडल नहीं करता - यह चाइल्ड रूट को सौंपा जाता है
632
+ // यह रूट को सरल रखता है और लोकेल-जागरूक रूट को अपने स्वयं के 404 तर्क को प्रबंधित करने देता है
633
+ export const Route = createRootRoute({
634
+ component: Outlet,
635
+ });
636
+ ```
637
+
638
+ ```tsx fileName="src/routes/{-$locale}/route.tsx"
639
+ import { createFileRoute, Outlet, redirect } from "@tanstack/react-router";
640
+ import { validatePrefix } from "intlayer";
641
+ import { IntlayerProvider, useLocale } from "react-intlayer";
642
+
643
+ import { LocaleSwitcher } from "@/components/locale-switcher";
644
+ import { NotFoundComponent } from "./404";
645
+
646
+ export const Route = createFileRoute("/{-$locale}")({
647
+ // beforeLoad रूट रेंडर होने से पहले चलता है (सर्वर और क्लाइंट दोनों पर)
648
+ // लोकेल उपसर्ग को मान्य करने के लिए यह आदर्श स्थान है
649
+ beforeLoad: ({ params }) => {
650
+ // रूट पैरामीटर से लोकेल प्राप्त करें (सर्वर हेडर से नहीं, क्योंकि beforeLoad क्लाइंट और सर्वर दोनों पर चलता है)
651
+ const localeParam = params.locale;
652
+
653
+ // validatePrefix जांचता है कि लोकेल आपकी intlayer कॉन्फ़िग के अनुसार मान्य है या नहीं
654
+ // रिटर्न: { isValid: boolean, localePrefix: string }
655
+ // - isValid: true यदि उपसर्ग एक कॉन्फ़िग किए गए लोकेल से मेल खाता है (या खाली है जब उपसर्ग वैकल्पिक है)
656
+ // - localePrefix: मान्य उपसर्ग या रीडायरेक्ट के लिए डिफ़ॉल्ट लोकेल उपसर्ग
657
+ const { isValid, localePrefix } = validatePrefix(localeParam);
658
+
659
+ if (isValid) {
660
+ // लोकेल मान्य है, रूट को सामान्य रूप से रेंडर करने की अनुमति दें
661
+ return;
662
+ }
663
+
664
+ // अमान्य लोकेल उपसर्ग (उदा., /xyz/about जहां "xyz" एक मान्य लोकेल नहीं है)
665
+ // मान्य लोकेल उपसर्ग के साथ 404 पृष्ठ पर रीडायरेक्ट करें
666
+ // यह सुनिश्चित करता है कि 404 पृष्ठ अभी भी ठीक से स्थानीयकृत है
667
+ throw redirect({
668
+ to: "/{-$locale}/404",
669
+ params: { locale: localePrefix },
670
+ });
671
+ },
672
+ component: RouteComponent,
673
+ // notFoundComponent तब कहा जाता है जब एक चाइल्ड रूट मौजूद नहीं होता
674
+ // उदा., /en/अस्तित्वहीन-पृष्ठ /en लेआउट के भीतर इसे ट्रिगर करता है
675
+ notFoundComponent: NotFoundLayout,
676
+ });
677
+
678
+ function RouteComponent() {
679
+ const { defaultLocale } = useLocale();
680
+ const { locale } = Route.useParams();
681
+
682
+ return (
683
+ // पूरे लोकेल सेगमेंट को IntlayerProvider के साथ लपेटें
684
+ // जब लोकेल पैरामीटर undefined हो तो defaultLocale पर वापस जाता है (वैकल्पिक उपसर्ग मोड)
685
+ <IntlayerProvider locale={locale ?? defaultLocale}>
686
+ <Outlet />
687
+ </IntlayerProvider>
688
+ );
689
+ }
690
+
691
+ // NotFoundLayout 404 घटक को IntlayerProvider के साथ लपेटता है
692
+ // यह सुनिश्चित करता है कि अनुवाद 404 पृष्ठ पर अभी भी काम करते हैं
693
+ function NotFoundLayout() {
694
+ const { defaultLocale } = useLocale();
695
+ const { locale } = Route.useParams();
696
+
697
+ return (
698
+ <IntlayerProvider locale={locale ?? defaultLocale}>
699
+ <NotFoundComponent />
700
+ {/* LocaleSwitcher शामिल करें ताकि उपयोगकर्ता 404 पर भी भाषा बदल सकें */}
701
+ <LocaleSwitcher />
702
+ </IntlayerProvider>
703
+ );
704
+ }
705
+ ```
706
+
707
+ ```tsx fileName="src/routes/{-$locale}/$.tsx"
708
+ import { createFileRoute } from "@tanstack/react-router";
709
+
710
+ import { NotFoundComponent } from "./404";
711
+
712
+ // $ (splat/catch-all) रूट किसी भी पथ से मेल खाता है जो अन्य रूट से मेल नहीं खाता
713
+ // उदा., /en/कुछ/गहराई/से/निहित/अमान्य/पथ
714
+ // यह सुनिश्चित करता है कि लोकेल के भीतर सभी बेमेल पथ 404 पृष्ठ दिखाते हैं
715
+ // इसके बिना, बेमेल गहरे पथ एक खाली पृष्ठ या त्रुटि दिखा सकते हैं
716
+ export const Route = createFileRoute("/{-$locale}/$")({
717
+ component: NotFoundComponent,
718
+ });
719
+ ```
720
+
721
+ ---
722
+
723
+ ### चरण 15: टाइपस्क्रिप्ट कॉन्फ़िगर करें (वैकल्पिक)
594
724
 
595
725
  Intlayer टाइपस्क्रिप्ट के लाभ प्राप्त करने और आपके कोडबेस को मजबूत बनाने के लिए मॉड्यूल ऑगमेंटेशन का उपयोग करता है।
596
726
 
@@ -19,9 +19,12 @@ slugs:
19
19
  applicationTemplate: https://github.com/aymericzip/intlayer-tanstack-start-template
20
20
  youtubeVideo: https://www.youtube.com/watch?v=_XTdKVWaeqg
21
21
  history:
22
+ - version: 7.4.0
23
+ date: 2025-12-11
24
+ changes: Memperkenalkan validatePrefix dan menambah langkah 14: Menangani halaman 404 dengan rute terlokalisasi.
22
25
  - version: 7.3.9
23
26
  date: 2025-12-05
24
- changes: Add step 13: Retrieve the locale in your server actions (Optional)
27
+ changes: Menambah langkah 13: Mengambil locale di server actions Anda (Opsional)
25
28
  - version: 6.5.2
26
29
  date: 2025-10-03
27
30
  changes: Memperbarui dokumen
@@ -592,7 +595,134 @@ export const getLocaleServer = createServerFn().handler(async () => {
592
595
 
593
596
  ---
594
597
 
595
- ### Langkah 14: Konfigurasi TypeScript (Opsional)
598
+ ### Langkah 14: Mengelola halaman tidak ditemukan (Opsional)
599
+
600
+ Ketika pengguna mengunjungi halaman yang tidak ada, Anda dapat menampilkan halaman tidak ditemukan yang disesuaikan dan awalan locale dapat mempengaruhi cara halaman tidak ditemukan dipicu.
601
+
602
+ #### Memahami Penanganan 404 TanStack Router dengan Awalan Locale
603
+
604
+ Di TanStack Router, menangani halaman 404 dengan rute yang dilokalisasi memerlukan pendekatan berlapis:
605
+
606
+ 1. **Rute 404 khusus**: Rute spesifik untuk menampilkan UI 404
607
+ 2. **Validasi tingkat rute**: Memvalidasi awalan locale dan mengarahkan ulang yang tidak valid ke 404
608
+ 3. **Rute catch-all**: Menangkap semua jalur yang tidak cocok dalam segmen locale
609
+
610
+ ```tsx fileName="src/routes/{-$locale}/404.tsx"
611
+ import { createFileRoute } from "@tanstack/react-router";
612
+
613
+ // Ini membuat rute khusus /[locale]/404
614
+ // Digunakan baik sebagai rute langsung maupun diimpor sebagai komponen di file lain
615
+ export const Route = createFileRoute("/{-$locale}/404")({
616
+ component: NotFoundComponent,
617
+ });
618
+
619
+ // Diekspor secara terpisah agar dapat digunakan kembali di notFoundComponent dan rute catch-all
620
+ export function NotFoundComponent() {
621
+ return (
622
+ <div>
623
+ <h1>404</h1>
624
+ </div>
625
+ );
626
+ }
627
+ ```
628
+
629
+ ```tsx fileName="src/routes/__root.tsx"
630
+ import { createRootRoute } from "@tanstack/react-router";
631
+
632
+ // Rute root berfungsi sebagai tata letak tingkat atas
633
+ // Tidak menangani 404 secara langsung - itu didelegasikan ke rute anak
634
+ // Ini menjaga root tetap sederhana dan memungkinkan rute yang sadar locale mengelola logika 404 mereka sendiri
635
+ export const Route = createRootRoute({
636
+ component: Outlet,
637
+ });
638
+ ```
639
+
640
+ ```tsx fileName="src/routes/{-$locale}/route.tsx"
641
+ import { createFileRoute, Outlet, redirect } from "@tanstack/react-router";
642
+ import { validatePrefix } from "intlayer";
643
+ import { IntlayerProvider, useLocale } from "react-intlayer";
644
+
645
+ import { LocaleSwitcher } from "@/components/locale-switcher";
646
+ import { NotFoundComponent } from "./404";
647
+
648
+ export const Route = createFileRoute("/{-$locale}")({
649
+ // beforeLoad berjalan sebelum rute dirender (baik di server maupun klien)
650
+ // Ini adalah tempat ideal untuk memvalidasi awalan locale
651
+ beforeLoad: ({ params }) => {
652
+ // Dapatkan locale dari parameter rute (bukan dari header server, karena beforeLoad berjalan di klien dan server)
653
+ const localeParam = params.locale;
654
+
655
+ // validatePrefix memeriksa apakah locale valid menurut konfigurasi intlayer Anda
656
+ // Mengembalikan: { isValid: boolean, localePrefix: string }
657
+ // - isValid: true jika awalan cocok dengan locale yang dikonfigurasi (atau kosong ketika awalan opsional)
658
+ // - localePrefix: awalan yang divalidasi atau awalan locale default untuk pengalihan
659
+ const { isValid, localePrefix } = validatePrefix(localeParam);
660
+
661
+ if (isValid) {
662
+ // Locale valid, izinkan rute untuk dirender secara normal
663
+ return;
664
+ }
665
+
666
+ // Awalan locale tidak valid (misalnya, /xyz/about di mana "xyz" bukan locale yang valid)
667
+ // Alihkan ke halaman 404 dengan awalan locale yang valid
668
+ // Ini memastikan halaman 404 masih dilokalkan dengan benar
669
+ throw redirect({
670
+ to: "/{-$locale}/404",
671
+ params: { locale: localePrefix },
672
+ });
673
+ },
674
+ component: RouteComponent,
675
+ // notFoundComponent dipanggil ketika rute anak tidak ada
676
+ // misalnya, /en/halaman-tidak-ada memicu ini dalam tata letak /en
677
+ notFoundComponent: NotFoundLayout,
678
+ });
679
+
680
+ function RouteComponent() {
681
+ const { defaultLocale } = useLocale();
682
+ const { locale } = Route.useParams();
683
+
684
+ return (
685
+ // Bungkus seluruh segmen locale dengan IntlayerProvider
686
+ // Kembali ke defaultLocale ketika parameter locale adalah undefined (mode awalan opsional)
687
+ <IntlayerProvider locale={locale ?? defaultLocale}>
688
+ <Outlet />
689
+ </IntlayerProvider>
690
+ );
691
+ }
692
+
693
+ // NotFoundLayout membungkus komponen 404 dengan IntlayerProvider
694
+ // Ini memastikan terjemahan masih berfungsi di halaman 404
695
+ function NotFoundLayout() {
696
+ const { defaultLocale } = useLocale();
697
+ const { locale } = Route.useParams();
698
+
699
+ return (
700
+ <IntlayerProvider locale={locale ?? defaultLocale}>
701
+ <NotFoundComponent />
702
+ {/* Sertakan LocaleSwitcher agar pengguna dapat mengubah bahasa bahkan di 404 */}
703
+ <LocaleSwitcher />
704
+ </IntlayerProvider>
705
+ );
706
+ }
707
+ ```
708
+
709
+ ```tsx fileName="src/routes/{-$locale}/$.tsx"
710
+ import { createFileRoute } from "@tanstack/react-router";
711
+
712
+ import { NotFoundComponent } from "./404";
713
+
714
+ // Rute $ (splat/catch-all) cocok dengan jalur apa pun yang tidak cocok dengan rute lain
715
+ // misalnya, /en/beberapa/jalur/bersarang/mendalam/tidak-valid
716
+ // Ini memastikan SEMUA jalur yang tidak cocok dalam locale menampilkan halaman 404
717
+ // Tanpa ini, jalur dalam yang tidak cocok mungkin menampilkan halaman kosong atau kesalahan
718
+ export const Route = createFileRoute("/{-$locale}/$")({
719
+ component: NotFoundComponent,
720
+ });
721
+ ```
722
+
723
+ ---
724
+
725
+ ### Langkah 15: Konfigurasi TypeScript (Opsional)
596
726
 
597
727
  Intlayer menggunakan module augmentation untuk mendapatkan manfaat dari TypeScript dan membuat codebase Anda lebih kuat.
598
728