چگونه بینالمللیسازی را در یک برنامه 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: کد محلی (locale) پیشفرض که بهعنوان مقدار بازگشتی استفاده میشود. در این مثال، آن را رویenبرای زبان انگلیسی تنظیم خواهیم کرد.TACOTRANSLATE_ORIGIN: «پوشهای» که رشتههای شما در آن ذخیره خواهند شد، مانند آدرس وبسایت (URL) شما. برای اطلاعات بیشتر درباره 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 ایجاد کنید؛ این چیدمان ریشهای (root 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 اطمینان میدهد که تمام کدهای locale که برای پروژهتان فعال کردهاید، از پیش رندر شدهاند.
حالا بیایید اولین صفحهٔ خود را بسازیم! فایلی با نام /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 میگوید صفحه را پس از 60 ثانیه دوباره بسازد و ترجمههای شما را بهروز نگه دارد.
مرحله ۴: پیادهسازی رندر سمت سرور
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 عمومی را نمایش خواهد داد. اگر در یک محیط محلی، آزمایشی یا پیشتولید (staging) هستیم (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 را تغییر دهید تا زبان ترجیحی کاربر را عوض کنید. برای ایدههایی دربارهٔ نحوهٔ انجام این کار، لطفاً کد نمونهٔ کامل را در مشاهده کنید!
مرحلهٔ ۵: استقرار دهید و آزمایش کنید!
تمام شد! از این پس، هرگاه رشتهای را در یک کامپوننت Translate اضافه کنید، اپلیکیشن React شما بهصورت خودکار ترجمه خواهد شد. توجه داشته باشید که تنها محیطهایی که مجوز read/write را روی کلید API دارند قادر به ایجاد رشتههای جدید برای ترجمه خواهند بود. پیشنهاد میکنیم یک محیط staging بسته و امن داشته باشید تا بتوانید اپلیکیشن تولیدی خود را با چنین کلید 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!