نحوه پیادهسازی بینالمللیسازی در یک اپلیکیشن 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
: “پوشهای” که رشتههای شما در آن ذخیره خواهند شد، مانند آدرس وبسایت شما. برای اطلاعات بیشتر درباره مبداها اینجا را بخوانید.
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';
توجه کنید که نشان میدهد این یک مولفهٔ کلاینت است.
با آمادهشدن 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 میگوید صفحه را پس از ۶۰ ثانیه مجدداً بسازد و ترجمههای شما را بهروز نگه دارد.
مرحله ۴: پیادهسازی رندر سمت سرور
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
را مطابق با مستندات Middleware در 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!