Többnyelvű nextjs
February 1, 2024
February 1, 2024
A projekt során implementáljuk a next-intl 3.0 újítását egy egyszerű példán keresztül. A fő nagy előnye az oldalak url címének a könnyű lokalizációjának a beállítása és annak a kezelése. A next-intl működik page és app roterrel is, de igazán app router-rel hozza ki az erejét. Amennyiben lokalizálnád a nextjs weboldalad mindenképp érdemes lehet kipróbálni.
A projekt során 0-ról indulunk és az alap nextjs-et használjuk majd typescript környezetbe.
POWERSHELLnpx create-next-app@latest
Typescript, Tailwindcss, src/ folder és az App router legyen bekapcsolva
(Amennyiben src/ folder-t nem szeretnél akkor a kód annyiban változik, hogy az src foldert nem kell hozzáadni a helyekhez)
A több nyelvűség eléréséhez letöltjük a next-intl csomagot
POWERSHELLnpm i next-intl
Az egységesség és az egyszerűség miatt app/page.tsx-et módosítjuk és hozzáadunk egy app/about/page.tsx fájlt a későbbi tesztelésekhez.
TYPESCRIPT//src/app/page.tsximport Link from "next/link";export default function Home() {return (<main className="flex min-h-screen flex-col items-center justify-between p-24">Get started by editing<Link href="/about">about</Link></main>);}
TYPESCRIPT//src/app/about/page.tsximport Link from "next/link";export default function About() {return (<main className="flex min-h-screen flex-col items-center justify-between p-24">The 'About' page provides essential information about our company or project, including our mission and values. Join us to shape the future together!<Link href="/">back to home</Link></main>);}
next.Config.mjs módosítása a következő képpen:
JAVASCRIPT//next.Config.mjsimport createNextIntlPlugin from 'next-intl/plugin';const withNextIntl = createNextIntlPlugin();/** @type {import('next').NextConfig} */const nextConfig = {};export default withNextIntl(nextConfig);
middleware.ts hozzáadása
TYPESCRIPT//src/middleware.tsimport createMiddleware from "next-intl/middleware";import { locales, defaultLocale } from "./navigation";export default createMiddleware({locales,defaultLocale,});export const config = {// Match only internationalized pathnamesmatcher: ["/", "/(hu|en)/:path*"],};
i18n.ts hozzáadása
TYPESCRIPT//src/i18n.tsimport { notFound } from "next/navigation";import { getRequestConfig } from "next-intl/server";import {locales} from "./navigation"export default getRequestConfig(async ({ locale }) => {// Validate that the incoming `locale` parameter is validif (!locales.includes(locale as any)) notFound();return {messages: (await import(`../messages/${locale}.json`)).default,};});
navigation.ts hozzáadása
Itt állítjuk be:
TYPESCRIPT//src/navigation.tsimport {createSharedPathnamesNavigation,} from "next-intl/navigation";export const defaultLocale = "en";export const locales = ["en", "hu"] as const;export const { Link, redirect, usePathname, useRouter } =createSharedPathnamesNavigation({ locales });
A két nyelvű szövegek létrehozása Ez egy messages nevű mappába történik a főkönyvtárba. A mappába minden nyelvhez létre kell hozni a nyelvnek megfelelő json fájlt. Itt már előre bevittem a szükséges neveket
JSON//messages/en.json{"Index": {"title": "Hello world!","getStarted": "Get started by editing","about": "about"},"About": {"aboutText": "The 'About' page provides essential information about our company or project, including our mission and values. Join us to shape the future together!","home": "back to home"}}
JSON//messages/hu.json{"Index": {"title": "Szia Világ!","getStarted": "Kezdd el a szerkesztést","about": "rólunk"},"About": {"aboutText": "Az 'About' oldal bemutatja cégünk vagy projektünk alapvető információit, küldetését és értékeit. Csatlakozz hozzánk, hogy együtt formálhassuk a jövőt!","home": "vissza a főoldalra"}}
Az app mappa alatt a [locale] folder létrehozása és abba tegyük bele az “about mappát”, a page.tsx és a layout.tsx fájlt.
A layout html language lokalizáció
TYPESCRIPT//src/app/[locale]/layout.tsx...export default function RootLayout({children,params: { locale },}: Readonly<{children: React.ReactNode;params: { locale: string };}>) {return (<html lang={locale}><body className={inter.className}>{children}</body></html>);}
Az újonan létrehozott Link elem kicserélése a kódba amit a createSharedPathnamesNavigation segítségével hoztunk létre.
A useTranslations használata. Az Index megnevezés alatt behívjuk a többi message elemet a fő oldalra. (Amennyiben async függvényünk van a useTranslations helyett a await getTranslations kell használni)
TYPESCRIPT//src/app/[locale]/page.tsximport { useTranslations } from "next-intl";import { Link } from "@/navigation";export default function Home() {const t = useTranslations("Index");return (<main className="flex min-h-screen flex-col items-center justify-between p-24">{t("getStarted")}<Link href="/about">{t("about")}</Link></main>);}
Ugyanígy kicseréljük az “about” oldalt is
TYPESCRIPT//src/app/[locale]/about/page.tsximport { useTranslations } from "next-intl";import { Link } from "@/navigation";export default function About() {const t = useTranslations("About");return (<main className="flex min-h-screen flex-col items-center justify-between p-24">{t("aboutText")}<Link href="/">{t("home")}</Link></main>);}
Az oldalakhoz még hozzá kell adni egy komponenst ami segítségevel tudunk nyelvet váltani
TYPESCRIPT//src/components/localeSwitcher.tsx"use client";import { useLocale } from "next-intl";import { useRouter, usePathname } from "../navigation";export default function LocaleSwitcher() {const locale = useLocale();const router = useRouter();const pathName = usePathname();const alternativeLocale = locale === "en" ? "hu" : "en";const switchLocale = () => {router.push(pathName, { locale: alternativeLocale });};return (<div className="rounded-lg border bg-white px-4 py-2 text-sm text-black dark:border-neutral-800 dark:bg-transparent dark:text-white "><button onClick={switchLocale} className="">{locale}</button></div>);}
Utána hozzá kell adni a page.tsx fájlokhoz
TYPESCRIPT//src/app/[locale]/page.tsximport LocaleSwitcher from "@/components/localeSwitcher";...export default function Home() {const t = useTranslations("Index");return (<main className="flex min-h-screen flex-col items-center justify-between p-24"><LocaleSwitcher />...</main>);}
Az így létrejött weboldalunkon a nyelv állítható, de az url-ek nem több nyevűek.
A módosítása nagyon egyszerű csak két elemet kell módosítani: navigation.ts-t és a middleware.ts-t
TYPESCRIPT//src/navigation.tsimport {Pathnames,createLocalizedPathnamesNavigation,} from "next-intl/navigation";...export const pathnames = {"/": "/","/about": {en: "/about",hu: "/rolunk",},} satisfies Pathnames<typeof locales>;export const { Link, redirect, usePathname, useRouter } =createLocalizedPathnamesNavigation({ locales, pathnames });
TYPESCRIPT...import { locales, pathnames, defaultLocale } from "./navigation";export default createMiddleware({// A list of all locales that are supportedlocales,pathnames,defaultLocale,});...
Az újban az “about” oldal már “rolunk” weboldal alatt talalható meg magyarul
Ez egy elég alap program, de egy jó kezdő pont a next-intl nyelv beállításának a folyamatához. Nagyobb projekteken is hasonlóan egyszerűen működik a folyamat.
A teljes kész kód megtalálható:
https://github.com/balazsfaragodev/Next.js---next-intl---TypeScript-Simple-Internationalization
Oszd meg ezt a cikket
Indítsd a napod a legújabb technológiai áttörésekkel. Csatlakozz most, és merülj el az innovációban!