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