چگونه بینالمللیسازی را در یک برنامه Next.js که از App Router استفاده میکند پیادهسازی کنیم
برنامه React خود را با بینالمللیسازی (i18n) قابل دسترستر کنید و به بازارهای جدید دست پیدا کنید.
با جهانیتر شدن دنیا، برای توسعهدهندگان وب اهمیت بیشتری پیدا میکند که برنامههایی بسازند که قادر به پاسخگویی به کاربران از کشورهای مختلف و فرهنگهای متنوع باشند. یکی از راههای کلیدی برای رسیدن به این هدف، بینالمللیسازی (i18n) است که به شما اجازه میدهد برنامه خود را به زبانها، ارزها و فرمتهای تاریخ مختلف سازگار کنید.
در این مقاله، ما به بررسی نحوه افزودن بینالمللیسازی به برنامه React Next.js شما با رندرینگ سمت سرور میپردازیم. TL;DR: مثال کامل را اینجا ببینید.
این راهنما برای برنامههای Next.js است که از App Router استفاده میکنند.
اگر از Pages Router استفاده میکنید، به جای آن این راهنما را ببینید.
مرحله ۱: نصب یک کتابخانه i18n
برای پیادهسازی بینالمللیسازی در برنامه Next.js خود، ابتدا یک کتابخانه i18n انتخاب میکنیم. چندین کتابخانه محبوب وجود دارد، از جمله next-intl. اما در این مثال، ما از TacoTranslate استفاده خواهیم کرد.
TacoTranslate به صورت خودکار رشتههای شما را با استفاده از هوش مصنوعی پیشرفته به هر زبان ترجمه میکند و شما را از مدیریت خستهکننده فایلهای JSON بینیاز میسازد.
بیایید آن را با استفاده از npm در ترمینال خود نصب کنیم:
npm install tacotranslate
مرحله ۲: یک حساب رایگان در TacoTranslate بسازید
حالا که این ماژول را نصب کردهاید، وقت آن است که حساب TacoTranslate خود را ایجاد کنید، یک پروژه ترجمه بسازید و کلیدهای API مربوطه را دریافت کنید. اینجا حساب کاربری بسازید. این کار رایگان است و نیازی به افزودن کارت اعتباری ندارد.
در رابط کاربری برنامه TacoTranslate، یک پروژه ایجاد کنید و به تب کلیدهای API آن بروید. یک کلید read
و یک کلید read/write
بسازید. ما آنها را به عنوان متغیرهای محیطی ذخیره خواهیم کرد. کلید read
همان چیزی است که ما آن را public
مینامیم و کلید read/write
همان secret
است. به عنوان مثال، میتوانید آنها را در یک فایل .env
در ریشه پروژه خود اضافه کنید.
TACOTRANSLATE_PUBLIC_API_KEY=123456
TACOTRANSLATE_SECRET_API_KEY=789010
اطمینان حاصل کنید که کلید API مخفی read/write
را هرگز در محیطهای تولید سمت مشتری فاش نکنید.
ما همچنین دو متغیر محیطی دیگر اضافه خواهیم کرد: TACOTRANSLATE_DEFAULT_LOCALE
و TACOTRANSLATE_ORIGIN
.
TACOTRANSLATE_DEFAULT_LOCALE
: کد پیشفرض زبان پشتیبان. در این مثال، آن را رویen
برای زبان انگلیسی تنظیم خواهیم کرد.TACOTRANSLATE_ORIGIN
: "پوشه" ای که رشتههای شما در آن ذخیره میشود، مانند آدرس URL وبسایت شما. برای اطلاعات بیشتر درباره origins اینجا را بخوانید.
TACOTRANSLATE_DEFAULT_LOCALE=en
TACOTRANSLATE_ORIGIN=your-website-url.com
مرحله ۳: تنظیم TacoTranslate
To integrate TacoTranslate with your application, you’ll need to create a client using the API keys from earlier. For example, create a file named /tacotranslate-client.js
.
const {default: createTacoTranslateClient} = require('tacotranslate');
const tacoTranslate = createTacoTranslateClient({
apiKey:
process.env.TACOTRANSLATE_SECRET_API_KEY ??
process.env.TACOTRANSLATE_PUBLIC_API_KEY ??
process.env.TACOTRANSLATE_API_KEY,
projectLocale:
process.env.TACOTRANSLATE_IS_PRODUCTION === 'true'
? process.env.TACOTRANSLATE_PROJECT_LOCALE
: undefined,
});
module.exports = tacoTranslate;
ما بهزودی بهصورت خودکار TACOTRANSLATE_API_KEY
و TACOTRANSLATE_PROJECT_LOCALE
را تعریف خواهیم کرد.
ایجاد کلاینت در یک فایل جداگانه، استفاده مجدد از آن را بعدا آسان می کند. getLocales
فقط یک عملکرد کاربردی با برخی از خطاهای داخلی است. اکنون، فایلی به نام /app/[locale]/tacotranslate.tsx
ایجاد کنید، جایی که ارائه دهنده TacoTranslate
را پیاده سازی می کنیم.
'use client';
import React, {type ReactNode} from 'react';
import {
type TranslationContextProperties,
TacoTranslate as ImportedTacoTranslate,
} from 'tacotranslate/react';
import tacoTranslateClient from '@/tacotranslate-client';
export default function TacoTranslate({
locale,
origin,
localizations,
children,
}: TranslationContextProperties & {
readonly children: ReactNode;
}) {
return (
<ImportedTacoTranslate
client={tacoTranslateClient}
locale={locale}
origin={origin}
localizations={localizations}
>
{children}
</ImportedTacoTranslate>
);
}
توجه داشته باشید 'use client';
که نشان میدهد این یک کامپوننت سمت کلاینت است.
حال که context provider آماده است، یک فایل به نام /app/[locale]/layout.tsx
ایجاد کنید، که layout ریشهای در برنامه ما است. توجه داشته باشید که این مسیر دارای پوشهای است که از Dynamic Routes استفاده میکند، جایی که [locale]
پارامتر پویا است.
import React, {type ReactNode} from 'react';
import {type Locale, isRightToLeftLocaleCode} from 'tacotranslate';
import './global.css';
import tacoTranslateClient from '@/tacotranslate-client';
import TacoTranslate from './tacotranslate';
export async function generateStaticParams() {
const locales = await tacoTranslateClient.getLocales();
return locales.map((locale) => ({locale}));
}
type RootLayoutParameters = {
readonly params: Promise<{locale: Locale}>;
readonly children: ReactNode;
};
export default async function RootLayout({params, children}: RootLayoutParameters) {
const {locale} = await params;
const origin = process.env.TACOTRANSLATE_ORIGIN;
const localizations = await tacoTranslateClient.getLocalizations({
locale,
origins: [origin /* , other origins to fetch */],
});
return (
<html lang={locale} dir={isRightToLeftLocaleCode(locale) ? 'rtl' : 'ltr'}>
<body>
<TacoTranslate
locale={locale}
origin={origin}
localizations={localizations}
>
{children}
</TacoTranslate>
</body>
</html>
);
}
اولین نکتهای که باید توجه کنید این است که ما از پارامتر Dynamic Route
خود با نام [locale]
برای دریافت ترجمههای زبان مربوطه استفاده میکنیم. علاوه بر این، generateStaticParams
اطمینان حاصل میکند که همه کدهای زبانهایی که برای پروژهتان فعال کردهاید، به صورت پیشرندر شده آماده باشند.
حال بیایید اولین صفحه خود را بسازیم! فایلی با نام /app/[locale]/page.tsx
ایجاد کنید.
import React from 'react';
import {Translate} from 'tacotranslate/react';
export const revalidate = 60;
export default async function Page() {
return (
<Translate string="Hello, world!" />
);
}
توجه کنید به متغیر revalidate
که به Next.js میگوید پس از ۶۰ ثانیه صفحه را دوباره بسازد و ترجمههای شما را بهروز نگه دارد.
مرحله ۴: پیادهسازی رندر سمت سرور
TacoTranslate از رندر سمت سرور پشتیبانی میکند. این موضوع تجربه کاربری را بهطور قابل توجهی بهبود میبخشد زیرا محتواهای ترجمه شده را بلافاصله نمایش میدهد، به جای اینکه ابتدا یک لحظه محتواهای ترجمه نشده دیده شود. علاوه بر این، میتوانیم درخواستهای شبکهای در سمت کلاینت را رد کنیم، زیرا قبلاً ترجمههای مورد نیاز برای صفحهای که کاربر مشاهده میکند را داریم.
برای راهاندازی رندرینگ سمت سرور، فایل /next.config.js
را ایجاد یا ویرایش کنید:
const withTacoTranslate = require('tacotranslate/next/config').default;
const tacoTranslateClient = require('./tacotranslate-client');
module.exports = async () => {
const config = await withTacoTranslate(
{},
{
client: tacoTranslateClient,
isProduction:
process.env.TACOTRANSLATE_ENV === 'production' ||
process.env.VERCEL_ENV === 'production' ||
(!(process.env.TACOTRANSLATE_ENV || process.env.VERCEL_ENV) &&
process.env.NODE_ENV === 'production'),
}
);
// NOTE: Remove i18n from config when using the app router
return {...config, i18n: undefined};
};
بررسی isProduction
را متناسب با تنظیمات خود تغییر دهید. در صورت true
، TacoTranslate کلید API عمومی را نشان می دهد. اگر در یک محیط محلی، آزمایشی یا مرحله بندی (isProduction
is false
) هستیم، از کلید مخفی read/write
API استفاده می کنیم تا مطمئن شویم رشته های جدید برای ترجمه ارسال می شوند.
برای اطمینان از اینکه مسیریابی و بازنشانی به درستی کار میکند، باید فایلی به نام /middleware.ts
ایجاد کنیم. با استفاده از Middleware, میتوانیم کاربران را به صفحاتی که به زبان مورد علاقهشان ارائه شدهاند، هدایت کنیم.
import {type NextRequest} from 'next/server';
import {middleware as tacoTranslateMiddleware} from 'tacotranslate/next';
import tacoTranslate from '@/tacotranslate-client';
export const config = {
matcher: ['/((?!api|_next|favicon.ico).*)'],
};
export async function middleware(request: NextRequest) {
return tacoTranslateMiddleware(tacoTranslate, request);
}
اطمینان حاصل کنید که matcher
را مطابق با مستندات Middleware در Next.js تنظیم کردهاید.
در سمت کلاینت، میتوانید کوکی locale
را تغییر دهید تا زبان ترجیحی کاربر را تغییر دهید. لطفاً برای ایدههایی درباره چگونگی انجام این کار، به کد نمونه کامل مراجعه کنید!
مرحله ۵: استقرار دهید و آزمایش کنید!
ما تمام کردیم! حال برنامه React شما به طور خودکار ترجمه خواهد شد زمانی که هر رشتهای را به کامپوننت Translate
اضافه کنید. توجه داشته باشید که فقط محیطهایی که دسترسی read/write
روی کلید API دارند قادر خواهند بود رشتههای جدیدی برای ترجمه ایجاد کنند. ما توصیه میکنیم یک محیط staging بسته و امن داشته باشید که بتوانید برنامه تولیدی خود را با چنین کلید API آزمایش کنید و قبل از عرضه، رشتههای جدید را اضافه کنید. این کار از دزدیده شدن کلید API مخفی شما جلوگیری کرده و احتمالاً از اضافه شدن رشتههای جدید و نامرتبط به پروژه ترجمه شما جلوگیری میکند.
حتماً به مثال کامل در پروفایل گیتهاب ما سر بزنید. در آنجا همچنین یک مثال از نحوه انجام این کار با استفاده از Pages Router نیز خواهید یافت! اگر با مشکلی مواجه شدید، بدون تردید با ما تماس بگیرید، و ما با کمال میل آماده کمک به شما خواهیم بود.
TacoTranslate به شما این امکان را میدهد که بهصورت خودکار برنامههای React خود را به سرعت به هر زبانی و از هر زبانی بومیسازی کنید. همین امروز شروع کنید!