TacoTranslate
/
التوثيقالتسعير
 
درس تعليمي
04 مايو

كيفية تنفيذ التعريب في تطبيق Next.js يستخدم App Router

اجعل تطبيق React الخاص بك أكثر سهولة للوصول إليه ووصل إلى أسواق جديدة من خلال التعريب (i18n).

مع ازدياد العولمة في العالم، أصبح من المهم بشكل متزايد لمطوري الويب بناء تطبيقات تستطيع تلبية احتياجات المستخدمين من دول وثقافات مختلفة. واحدة من الطرق الأساسية لتحقيق ذلك هي من خلال التدويل (i18n)، الذي يتيح لك تكييف تطبيقك مع لغات متنوعة، وعملات مختلفة، وتنسيقات تاريخ متعددة.

في هذا المقال، سنستعرض كيفية إضافة التدويل إلى تطبيقك React Next.js مع العرض من جانب الخادم. TL;DR: شاهد المثال الكامل هنا.

هذا الدليل لتطبيقات Next.js التي تستخدم App Router.
إذا كنت تستخدم Pages Router, راجع هذا الدليل بدلاً من ذلك.

الخطوة 1: تثبيت مكتبة i18n

لتنفيذ التدويل في تطبيق Next.js الخاص بك، سنبدأ أولاً باختيار مكتبة i18n. هناك عدة مكتبات شهيرة، بما في ذلك next-intl. في هذا المثال، سنستخدم مع ذلك TacoTranslate.

يقوم TacoTranslate تلقائيًا بترجمة النصوص الخاصة بك إلى أي لغة باستخدام الذكاء الاصطناعي المتقدم، ويحررك من إدارة ملفات JSON المملة.

دعنا نقوم بتثبيته باستخدام npm في الطرفية الخاصة بك:

npm install tacotranslate

الخطوة 2: إنشاء حساب مجاني على TacoTranslate

الآن بعد أن قمت بتثبيت الوحدة، حان الوقت لإنشاء حسابك في TacoTranslate، ومشروع ترجمة، ومفاتيح API المرتبطة به. أنشئ حسابًا هنا. إنه مجاني، ولا يتطلب منك إضافة بطاقة ائتمان.

داخل واجهة تطبيق TacoTranslate, قم بإنشاء مشروع، وانتقل إلى تبويب مفاتيح API الخاصة به. أنشئ مفتاحًا واحدًا من نوع read وآخر من نوع read/write. سنقوم بحفظهم كمتغيرات بيئية. مفتاح read هو ما نسميه public والمفتاح read/write هو secret. على سبيل المثال، يمكنك إضافتهم إلى ملف .env في جذر مشروعك.

.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: "المجلد" الذي ستُخزن فيه النصوص الخاصة بك، مثل عنوان URL لموقعك الإلكتروني. اقرأ المزيد عن الأصول هنا.
.env
TACOTRANSLATE_DEFAULT_LOCALE=en
TACOTRANSLATE_ORIGIN=your-website-url.com

الخطوة 3: إعداد TacoTranslate

لدمج TacoTranslate مع تطبيقك، ستحتاج إلى إنشاء عميل باستخدام مفاتيح API التي حصلت عليها سابقًا. على سبيل المثال، أنشئ ملفًا باسم /tacotranslate-client.js.

/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.

/app/[locale]/tacotranslate.tsx
'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] هو المعامل الديناميكي.

/app/[locale]/layout.tsx
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.

/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 ثانية، والحفاظ على تحديث ترجماتك باستمرار.

الخطوة 4: تنفيذ العرض من جانب الخادم

يدعم TacoTranslate العرض على جانب الخادم. هذا يحسن تجربة المستخدم بشكل كبير من خلال عرض المحتوى المترجم فورًا، بدلاً من ظهور وميض للمحتوى غير المترجم أولاً. بالإضافة إلى ذلك، يمكننا تخطي طلبات الشبكة على العميل، لأننا لدينا بالفعل الترجمات التي نحتاجها للصفحة التي يشاهدها المستخدم.

لإعداد العرض على جانب الخادم، قم بإنشاء أو تعديل /next.config.js:

/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, يمكننا إعادة توجيه المستخدمين إلى صفحات معروضة بلغتهم المفضلة.

/middleware.ts
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 لتغيير اللغة المفضلة لدى المستخدم. يرجى الاطلاع على كود المثال الكامل للحصول على أفكار حول كيفية القيام بذلك!

الخطوة 5: النشر والاختبار!

لقد انتهينا! سيتم الآن ترجمة تطبيق 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!

منتج من Nattskiftetصُنع في النرويج