چگونه بینالمللیسازی را در یک برنامهٔ 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: «پوشهای» که رشتههای شما در آن ذخیره خواهند شد، مانند نشانی وبسایت شما. برای اطلاعات بیشتر درباره مبداها اینجا بخوانید.
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 اطمینان میدهد که تمام کدهای زبان (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 میگوید صفحه را پس از ۶۰ ثانیه بازسازی کند و ترجمههای شما را بهروز نگه دارد.
مرحله ۴: پیادهسازی رندر سمت سرور
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 را تغییر دهید تا زبان ترجیحی کاربر تغییر کند. برای ایدههایی دربارهٔ نحوهٔ انجام این کار، لطفاً کد نمونهٔ کامل را ببینید!
مرحله 5: برنامه را راهاندازی و آزمایش کنید!
تمام شد! برنامهٔ React شما اکنون بهطور خودکار ترجمه خواهد شد هر بار که شما هر رشتهای را به یک کامپوننت Translate اضافه کنید. توجه داشته باشید که تنها محیطهایی که دسترسی 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!