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 מתרגמת אוטומטית את המחרוזות שלך לכל שפה באמצעות AI חדיש, ומשחררת אותך מהניהול המתיש של קבצי JSON.

בוא נתקין אותה באמצעות npm במסוף שלך:

npm install tacotranslate

שלב 2: צור חשבון TacoTranslate חינמי

עכשיו כשהמודול מותקן, הגיע הזמן ליצור חשבון ב-TacoTranslate, פרויקט תרגום ומפתחות API קשורים. צור חשבון כאן. זה בחינם, ולא דורש הוספת כרטיס אשראי.

בתוך ממשק המשתמש של TacoTranslate, צור פרויקט ונווט ללשונית API keys. צור מפתח אחד מסוג 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: ה"תקייה" שבה יאוחסנו המחרוזות שלך, כגון כתובת האתר שלך. קרא/י עוד על מקורות כאן.
.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 מבטיח שכל קודי השפות שהפעלת עבור הפרויקט שלך מופיעים מראש.

עכשיו, בואו נבנה את הדף הראשון שלנו! צרו קובץ בשם /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 תומך בשרת בצד rendering. זה משפר בצורה ניכרת את חוויית המשתמש על ידי הצגת תוכן מתורגם מיד, במקום הבזק של תוכן לא מתורגם בהתחלה. בנוסף, נוכל לדלג על בקשות רשת בצד הלקוח, מכיוון שכבר יש לנו את התרגומים הדרושים לדף שהמשתמש צופה בו.

כדי להגדיר הצגה בצד השרת, צור או ערוך את הקובץ /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 בהתאם ל-תיעוד ה-Next.js Middleware.

בצד הלקוח, ניתן לשנות את העוגייה locale כדי לשנות את שפת ברירת המחדל של המשתמש. אנא עיין ב- קוד הדוגמה המלא לרעיונות כיצד לעשות זאת!

שלב 5: הפעל וערוך בדיקות!

סיימנו! אפליקציית ה-React שלך כעת תתורגם אוטומטית כאשר תוסיף מחרוזות כלשהן לרכיב Translate. שים לב שרק סביבות עם הרשאות read/write על מפתח ה-API יוכלו ליצור מחרוזות חדשות לתרגום. אנו ממליצים על סביבה סגורה ומאובטחת לבדיקות שבה תוכל לבדוק את אפליקציית הפרודקשן שלך עם מפתח API כזה, להוסיף מחרוזות חדשות לפני העלאת האתר לאוויר. זאת כדי למנוע מכל אחד לגנוב את מפתח ה-API הסודי שלך, וכדי למנוע הרחבה מיותרת של פרויקט התרגום שלך באמצעות הוספת מחרוזות לא קשורות.

ודאו ללבדוק את הדוגמה המלאה בפרופיל שלנו ב-GitHub. שם, תוכלו גם למצוא דוגמה כיצד לעשות זאת באמצעות Pages Router ! אם תיתקלו בבעיות, אל תהססו ליצור קשר, ואנחנו נשמח לעזור לכם.

TacoTranslate מאפשר לכם לאתר אוטומטית את אפליקציות ה-React שלכם במהירות לכל שפה וממנה. התחילו היום!

מוצר מ-Nattskiftetמיוצר בנורווגיה