چگونه بینالمللیسازی را در یک برنامه Next.js که از App Router استفاده میکند پیادهسازی کنیم
با بینالمللیسازی (i18n)، اپلیکیشن React خود را قابل دسترستر کنید و به بازارهای جدید دست یابید.
با جهانیتر شدن جهان، برای توسعهدهندگان وب روزبهروز مهمتر میشود که برنامههایی بسازند که بتوانند نیاز کاربران از کشورهای و فرهنگهای مختلف را برآورده کنند. یکی از راههای کلیدی برای رسیدن به این هدف، بینالمللیسازی (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: «پوشهای» که رشتههای شما در آن ذخیره خواهند شد، مانند آدرس وبسایت شما. برای کسب اطلاعات بیشتر در مورد origins اینجا را بخوانید.
TACOTRANSLATE_DEFAULT_LOCALE=en
TACOTRANSLATE_ORIGIN=your-website-url.comمرحله ۳: راهاندازی TacoTranslate
برای ادغام TacoTranslate با برنامهٔ خود، باید یک کلاینت ایجاد کنید که از کلیدهای API که قبلاً ساخته شدهاند استفاده کند. برای مثال، یک فایل به نام /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'; توجه کنید؛ این نشان میدهد که این یک کامپوننت سمت کلاینت است.
با آماده شدن ارائهدهندهٔ زمینه، یک فایل به نام /app/[locale]/layout.tsx ایجاد کنید، که قالب ریشهٔ برنامهٔ ما است. توجه داشته باشید که این مسیر دارای پوشهای است که از 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) باشیم، از کلید API مخفی read/write استفاده خواهیم کرد تا اطمینان حاصل کنیم که رشتههای جدید برای ترجمه ارسال میشوند.
برای اطمینان از اینکه مسیردهی و بازهدایت همانطور که انتظار میرود کار میکنند، باید فایلی با نام /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 را مطابق با مستندات میانافزار Next.js تنظیم کنید.
در سمت کلاینت میتوانید کوکی locale را تغییر دهید تا زبان ترجیحی کاربر را تغییر دهید. لطفاً برای ایدههایی دربارهٔ چگونگی انجام این کار، نمونه کد کامل را ببینید!
مرحله ۵: استقرار دهید و آزمایش کنید!
تمام شد! اکنون اپلیکیشن React شما بهطور خودکار زمانی که هر رشتهای را به یک مولفه Translate اضافه میکنید، ترجمه خواهد شد. توجه داشته باشید که تنها محیطهایی که اجازههای read/write روی کلید API دارند قادر خواهند بود رشتههای جدیدی برای ترجمه ایجاد کنند. ما توصیه میکنیم یک محیط تستی بسته و ایمن داشته باشید تا بتوانید نسخهٔ تولیدی خود را با چنین کلید API آزمایش کنید و پیش از راهاندازی، رشتههای جدید را اضافه نمایید. این کار از سرقت کلید API محرمانهٔ شما توسط افراد جلوگیری کرده و همچنین از حجیم شدن پروژهٔ ترجمهٔ شما با افزودن رشتههای جدید و نامرتبط جلوگیری میکند.
Be sure to check out the complete example over at our GitHub profile. There, you’ll also find an example of how to do this using the Pages Router! If you encounter any problems, feel free to reach out, and we’ll be more than happy to help.
TacoTranslate lets you automatically localize your React applications quickly to and from over 75 languages. Get started today!