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