چگونه در یک برنامه 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 میگوید صفحه را پس از ۶۰ ثانیه دوباره بسازد و ترجمههای شما را بهروز نگه دارد.
قدم ۴: پیادهسازی رندرینگ سمت سرور
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 دارند قادر خواهند بود رشتههای جدیدی برای ترجمه ایجاد کنند. ما توصیه میکنیم محیط مرحلهبندی بسته و امنی داشته باشید که در آن بتوانید برنامه تولید خود را با چنین کلید API آزمایش کنید و قبل از راهاندازی، رشتههای جدید اضافه کنید. این کار از سرقت کلید API مخفی شما توسط هرکسی جلوگیری میکند و همچنین از افزایش بیرویه پروژه ترجمه شما به دلیل اضافه کردن رشتههای جدید و نامرتبط جلوگیری خواهد کرد.
حتماً نمونه کامل را در نمایه گیتهاب ما مشاهده کنید. آنجا همچنین نمونهای خواهید یافت که چگونه این کار را با استفاده از Pages Router انجام دهید! اگر با هر مشکلی مواجه شدید، آزادانه تماس بگیرید و ما خوشحال خواهیم شد که به شما کمک کنیم.
تاکوترنسلیت به شما امکان میدهد برنامههای React خود را به سرعت و به صورت خودکار به هر زبانی ترجمه کنید. امروز شروع کنید!