From ce866043fbf939ca684349c9d62b246790ce6c43 Mon Sep 17 00:00:00 2001 From: Florian Trayon <26360935+FlorianLeChat@users.noreply.github.com> Date: Thu, 21 Dec 2023 16:19:59 +0100 Subject: [PATCH] Improved support for loading pages with non-existent locales --- app/[locale]/layout.tsx | 13 ++++++++++++- middleware.ts | 4 +++- package-lock.json | 16 ++++++++-------- package.json | 2 +- utilities/i18n.ts | 35 +++++++++++++++++++++++++++-------- utilities/nodemailer.ts | 2 +- 6 files changed, 52 insertions(+), 20 deletions(-) diff --git a/app/[locale]/layout.tsx b/app/[locale]/layout.tsx index 7de0d01..195fa74 100644 --- a/app/[locale]/layout.tsx +++ b/app/[locale]/layout.tsx @@ -17,6 +17,9 @@ import { unstable_setRequestLocale } from "next-intl/server"; import { mkdir, readFile, writeFile } from "fs/promises"; import { Suspense, lazy, type ReactNode, type CSSProperties } from "react"; +// Importation des fonctions utilitaires. +import { getLanguages } from "@/utilities/i18n"; + // Importation des types. import type { Metadata, Viewport } from "next"; @@ -169,9 +172,11 @@ export async function generateMetadata(): Promise< } // Génération des paramètres pour les pages statiques. +const languages = getLanguages(); + export function generateStaticParams() { - return [ "en", "fr" ].map( ( locale ) => ( { locale } ) ); + return languages.map( ( locale ) => ( { locale } ) ); } // Création de la police de caractères Inter. @@ -203,6 +208,12 @@ export default function Layout( { // Définition de la langue de la page. unstable_setRequestLocale( locale ); + // Vérification du support de la langue. + if ( !languages.includes( locale ) ) + { + return null; + } + // Affichage du rendu HTML de la page. return ( ( { - timeZone: process.env.NEXT_PUBLIC_TIMEZONE, - messages: deepmerge( - ( await import( "../public/locales/en.json" ) ).default, - ( await import( `../public/locales/${ locale }.json` ) ).default - ) as unknown as AbstractIntlMessages -} ) ); \ No newline at end of file +export function getLanguages() +{ + // Liste des langues disponibles. + return [ "en", "fr" ]; +} + +export default getRequestConfig( async ( { locale } ) => +{ + // Vérification de la langue demandée par l'utilisateur. + if ( !getLanguages().includes( locale ) ) + { + notFound(); + } + + // Récupération des traductions dans le système de fichiers. + // Note : les traductions manquantes sont fusionnées avec celles de + // la langue par défaut. + return { + timeZone: process.env.NEXT_PUBLIC_TIMEZONE, + messages: deepmerge( + ( await import( "../public/locales/en.json" ) ).default, + ( await import( `../public/locales/${ locale }.json` ) ).default + ) as unknown as AbstractIntlMessages + }; +} ); \ No newline at end of file diff --git a/utilities/nodemailer.ts b/utilities/nodemailer.ts index dbb78e5..374d802 100644 --- a/utilities/nodemailer.ts +++ b/utilities/nodemailer.ts @@ -1,5 +1,5 @@ // -// Permet de personnaliser l'apparence et le contenu des courriels envoyés par Next Auth. +// Personnalisation de l'apparence et le contenu des courriels envoyés par Next Auth. // Source : https://next-auth.js.org/providers/email#customizing-emails // import { createTransport } from "nodemailer";