نحوهی پیادهسازی بینالمللیسازی در یک برنامهٔ 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: «پوشهای» که رشتههای شما در آن ذخیره میشوند، مانند آدرس وبسایت شما. برای کسب اطلاعات بیشتر دربارهٔ 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) باشیم، از کلید 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!