Next.js-də next-intl ilə i18n Konfiqurasiyası
İnkişaf etdirdiyimiz tətbiqlərin qlobal auditoriyaya xitab etməsi üçün beynəlxalqlaşdırma (i18n) mühüm rol oynayır. Bu yazıda Next.js və next-intl kitabxanasından istifadə edərək i18n sisteminin necə qurulacağını izah edəcəyik.
Addım 1: Paketlərin Qurulması
npm install next-intl
Əgər TypeScript istifadə edirsinizsə, aşağıdakıları da əlavə edin:
npm install -D @types/react
Layihə Strukturu
Aşağıdakı kimi bir qovluq strukturu qurmağınız tövsiyə olunur:
/locales
├── en.json
└── az.json
/app
└── [locale]
├── page.tsx
└── layout.tsx
/i18n
├── request.ts
└── routing.ts
/middleware.ts
/next.config.mjs
Addım 2: next.config.mjs Faylı
// next.config.mjs
import createNextIntlPlugin from "next-intl/plugin";
const withNextIntl = createNextIntlPlugin({
defaultLocale: "en",
locales: ["en", "az"],
});
/** @type {import('next').NextConfig} */
const nextConfig = {
images: {
formats: ["image/avif", "image/webp"],
},
};
export default withNextIntl(nextConfig);
Addım 3: i18n/routing.ts Konfiqurasiya Faylı
// i18n/routing.ts
import { defineRouting } from "next-intl/routing";
export const routing = defineRouting({
locales: ["en", "az"],
defaultLocale: "en",
localePrefix: "always",
});
Addım 4: middleware.ts
// middleware.ts
import createMiddleware from "next-intl/middleware";
import { routing } from "@/i18n/routing";
export default createMiddleware({
...routing,
});
export const config = {
matcher: ["/", "/(en|az)/:path*"],
};
Addım 5: i18n/request.ts - Dinamik Tərcümələrin Yüklənməsi
// i18n/request.ts
import { getRequestConfig } from "next-intl/server";
import { routing } from "@/i18n/routing";
import { notFound } from "next/navigation";
export default getRequestConfig(async ({ locale }) => {
if (!routing.locales.includes(locale as any)) notFound();
return {
locale,
messages: (await import(`@/locales/${locale}.json`)).default,
};
});
Addım 6: Layout Faylı
// app/[locale]/layout.tsx
import { getMessages } from "next-intl/server";
import { NextIntlClientProvider } from "next-intl";
export default async function RootLayout({
children,
params: { locale },
}: {
children: React.ReactNode;
params: { locale: string };
}) {
const messages = await getMessages();
return (
<html lang={locale}>
<body>
<NextIntlClientProvider locale={locale} messages={messages}>
{children}
</NextIntlClientProvider>
</body>
</html>
);
}
Addım 7: Tərcümələrdən İstifadə (Client Komponentində)
"use client";
import { useTranslations } from "next-intl";
export default function HomePage() {
const t = useTranslations("Home");
return <h1>{t("title")}</h1>;
}
Nümunə Tərcümə Faylı (locales/en.json)
{
"Home": {
"title": "Welcome to my site!"
}
}
// locales/az.json
{
"Home": {
"title": "Saytıma xoş gəlmisiniz!"
}
}
Rəylər