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

Ни в коем случае не раскрывайте секретный read/write API-ключ на стороне клиента в производственных средах.

Мы также добавим еще две переменные окружения: TACOTRANSLATE_DEFAULT_LOCALE и TACOTRANSLATE_ORIGIN.

  • TACOTRANSLATE_DEFAULT_LOCALE: Код локали по умолчанию, используемый в качестве запаса. В этом примере мы установим его в en для английского.
  • TACOTRANSLATE_ORIGIN: «папка», в которой будут храниться ваши строки, например URL вашего сайта. Узнайте больше об origins здесь.
.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 поддерживает рендеринг на стороне сервера. Это значительно улучшает пользовательский опыт, поскольку отображает переведённый контент сразу, вместо первоначальной вспышки непереведённого содержимого. Кроме того, мы можем пропустить сетевые запросы на клиенте, потому что у нас уже есть переводы, необходимые для страницы, которую просматривает пользователь.

Чтобы настроить рендеринг на стороне сервера, создайте или измените /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), мы будем использовать секретный read/write API-ключ, чтобы новые строки отправлялись на перевод.

Чтобы маршрутизация и перенаправления работали как ожидалось, нам нужно создать файл с именем /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.

На клиенте вы можете изменить cookie locale, чтобы поменять предпочитаемый пользователем язык. Пожалуйста, смотрите полный пример кода для идей о том, как это сделать!

Шаг 5: Разверните и протестируйте!

Готово! Ваше React-приложение теперь будет автоматически переводиться, когда вы добавляете какие-либо строки в компонент Translate. Обратите внимание, что только окружения с разрешениями read/write для API-ключа смогут создавать новые строки для перевода. Мы рекомендуем иметь закрытое и защищённое стендовое (staging) окружение, где вы сможете тестировать ваше production-приложение с таким 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Сделано в Норвегии