چگونه بینالمللیسازی را در یک برنامهٔ 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 keys آن بروید. یک کلید 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 وبسایت شما. برای کسب اطلاعات بیشتر دربارهٔ مبادی اینجا را بخوانید.
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 عمومی را نمایش خواهد داد. اگر در یک محیط محلی، آزمایشی یا پیشتولید (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
کامپوننت اضافه کنید. توجه داشته باشید که فقط محیطهایی که روی کلید API مجوز read/write
دارند قادر خواهند بود رشتههای جدیدی را برای ترجمه ایجاد کنند. ما توصیه میکنیم یک محیط مرحلهای (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!