چگونه بینالمللیسازی را در یک برنامه 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';
که نشان میدهد این یک کامپوننت کلاینت است.
حال که context provider آماده است، یک فایل به نام /app/[locale]/layout.tsx
ایجاد کنید، که 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 میگوید پس از ۶۰ ثانیه صفحه را دوباره بسازد و ترجمههای شما را بهروز نگه دارد، توجه کنید.
مرحله ۴: پیادهسازی رندر سمت سرور
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
)، از کلید مخفی read/write
API استفاده خواهیم کرد تا اطمینان حاصل شود رشتههای جدید برای ترجمه ارسال میشوند.
برای اطمینان از اینکه روتینگ و ریدایرکت همانطور که انتظار میرود کار میکند، باید فایلی به نام /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
را مطابق با مستندات Middleware در 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!