Узнайте, как реализовать бесшовную интернационализацию (i18n) в ваших приложениях на Next.js для охвата глобальной аудитории. Рассматриваются маршрутизация, перевод контента и лучшие практики.
Интернационализация в Next.js: Создание многоязычных приложений для глобальной аудитории
В современном взаимосвязанном мире создание приложений, ориентированных на глобальную аудиторию, — это уже не роскошь, а необходимость. Next.js, мощный фреймворк для React, предоставляет надежные функции для реализации интернационализации (i18n), позволяя создавать многоязычные приложения, которые обеспечивают локализованный опыт для пользователей по всему миру. Это подробное руководство проведет вас через основные концепции, техники и лучшие практики создания интернационализированных приложений на Next.js.
Понимание интернационализации и локализации
Прежде чем углубляться в особенности i18n в Next.js, давайте проясним ключевые термины:
- Интернационализация (i18n): Процесс проектирования и разработки приложения таким образом, чтобы его можно было легко адаптировать к различным языкам и регионам без внесения инженерных изменений. Это включает в себя абстрагирование текста, форматирования и других элементов, зависящих от локали.
- Локализация (l10n): Процесс адаптации приложения к конкретному языку и региону. Сюда входит перевод текста, настройка форматов даты и времени, символов валют и многого другого.
По сути, i18n готовит ваше приложение к локализации. Отделяя зависящие от языка элементы от основного кода, вы упрощаете локализацию приложения для разных рынков.
Зачем внедрять интернационализацию в Next.js?
Внедрение i18n в ваше приложение на Next.js предлагает множество преимуществ:
- Расширение охвата: Охватите более широкую аудиторию, предоставляя контент на предпочитаемом ею языке.
- Улучшение пользовательского опыта: Предложите более персонализированный и увлекательный опыт для пользователей из разных регионов.
- Улучшение SEO: Улучшите поисковую оптимизацию (SEO), предоставляя локализованный контент, нацеленный на конкретные географические регионы.
- Повышение конверсии: Увеличьте конверсию, представляя информацию на родном языке пользователя, что способствует доверию и пониманию.
- Глобальное присутствие бренда: Создайте более сильное глобальное присутствие бренда, демонстрируя приверженность инклюзивности и ориентацию на разнообразную аудиторию.
Функции и конфигурация i18n в Next.js
Next.js предлагает встроенную поддержку i18n через свои функции маршрутизации и управления контентом. Ниже представлен разбор важных функций:
1. Настройка i18n в next.config.js
Основная конфигурация i18n находится в файле next.config.js
. Вот пример:
/** @type {import('next').NextConfig} */
const nextConfig = {
i18n: {
locales: ['en', 'es', 'fr'], // Массив поддерживаемых локалей (коды языков)
defaultLocale: 'en', // Локаль, используемая по умолчанию
localeDetection: true, // Включить/выключить автоматическое определение локали на основе настроек браузера (необязательно)
// domains: [
// {
// domain: 'example.com',
// defaultLocale: 'en',
// },
// {
// domain: 'example.es',
// defaultLocale: 'es',
// },
// ],
},
}
module.exports = nextConfig;
Объяснение:
locales
: Массив, содержащий коды языков (например,'en'
для английского,'es'
для испанского,'fr'
для французского), которые поддерживает ваше приложение. Обязательно следуйте кодам языков ISO 639-1 для единообразия.defaultLocale
: Язык по умолчанию, который будет использовать ваше приложение. Это язык, который отображается, если в URL не указан другой язык или он не определен по настройкам браузера пользователя. Выберите язык, который является репрезентативным для вашей основной целевой аудитории.localeDetection
: Логическое значение, которое контролирует, будет ли Next.js автоматически определять предпочтительный язык пользователя на основе настроек его браузера. Если установлено значениеtrue
, Next.js попытается перенаправить пользователя на соответствующую языковую версию вашего сайта.domains
(необязательно): Массив, который позволяет связать локали с конкретными доменами. Это полезно, если у вас есть отдельные домены для разных языков (например,example.com
для английского,example.es
для испанского).
2. Маршрутизация с префиксами локалей
Next.js автоматически добавляет к маршрутам префикс локали. Например, если у вас есть страница по адресу /about
и локаль — 'es' (испанский), URL станет /es/about
. Это позволяет создавать разные языковые версии страниц и дает возможность поисковым системам индексировать контент для каждой локали. Фреймворк берет на себя перенаправление и маршрутизацию.
3. Использование хука useRouter
Хук useRouter
из next/router
предоставляет доступ к текущей локали и другой информации о маршрутизации.
import { useRouter } from 'next/router';
function MyComponent() {
const router = useRouter();
const { locale, locales, defaultLocale } = router;
return (
Текущая локаль: {locale}
Доступные локали: {locales.join(', ')}
Локаль по умолчанию: {defaultLocale}
);
}
export default MyComponent;
Объект router
предлагает следующие ключевые свойства:
locale
: Текущая выбранная локаль (например, 'en', 'es', 'fr').locales
: Массив всех поддерживаемых локалей, определенных вnext.config.js
.defaultLocale
: Локаль по умолчанию, установленная вnext.config.js
.asPath
: Путь, отображаемый в браузере, включая префикс локали (например,/es/about
).pathname
: Путь без префикса локали (например,/about
).
Стратегии перевода контента
После того как вы настроили свое приложение Next.js для i18n, вам нужно будет реализовать стратегии для перевода вашего контента. Вот несколько популярных подходов:
1. Использование специализированной системы управления переводами (TMS)
Для крупномасштабных проектов с большим количеством языков настоятельно рекомендуется использовать TMS. Популярные варианты включают:
- Phrase: Облачная TMS с интеграциями для различных платформ, включая Next.js. Предлагает функции для совместной работы и автоматизированные рабочие процессы.
- Localize: Еще одна облачная TMS, которая поддерживает широкий спектр форматов файлов и предоставляет функции управления переводами.
- Crowdin: Мощная TMS, очень популярная в сообществе open-source, хорошо интегрируется с Next.js, позволяя командам эффективно переводить контент.
Преимущества:
- Централизованное управление переводами.
- Функции для совместной работы переводчиков.
- Автоматизация процессов перевода.
- Интеграция с вашим процессом разработки.
2. Создание JSON-файлов с переводами
Для небольших проектов использование JSON-файлов для хранения переводов является простым и эффективным методом.
Пример структуры каталогов:
/src
├── locales
│ ├── en.json
│ └── es.json
├── components
│ └── MyComponent.js
└── pages
└── index.js
Пример en.json
:
{
"greeting": "Hello, world!",
"welcomeMessage": "Welcome to our website."
}
Пример es.json
:
{
"greeting": "¡Hola, mundo!",
"welcomeMessage": "Bienvenido a nuestro sitio web."
}
Пример MyComponent.js
:
import { useRouter } from 'next/router';
import en from '../locales/en.json';
import es from '../locales/es.json';
function MyComponent() {
const { locale } = useRouter();
const t = locale === 'es' ? es : en;
return (
{t.greeting}
{t.welcomeMessage}
);
}
export default MyComponent;
Этот подход обеспечивает гибкость и прост для небольших проектов. Его, как правило, легко обновлять и поддерживать.
3. Использование библиотеки для переводов
Несколько JavaScript-библиотек упрощают перевод контента в ваших React-компонентах.
next-i18next
: Популярная библиотека, специально разработанная для Next.js. Она хорошо интегрируется с фреймворком и предоставляет такие функции, как рендеринг на стороне сервера (SSR) и перевод на стороне клиента.react-i18next
: Библиотека i18n общего назначения для React. Вы можете использовать ее в своих приложениях Next.js, хотя она может потребовать больше настроек по сравнению сnext-i18next
.
Пример с next-i18next
(Установка: npm install next-i18next i18next react-i18next
):
Создайте файл конфигурации i18n (например, i18n.js
в вашем корневом каталоге):
// i18n.js
import { createServerSideHelpers } from 'next-i18next'
import { i18n } from './next-i18next.config'
export function initI18next(req, res, namespaces = ['common']) {
const helpers = createServerSideHelpers(
req,
res,
i18n,
namespaces
)
return helpers
}
export { appWithTranslation } from 'next-i18next'
export { i18n }
Создайте конфигурацию Next.js для next-i18next.
// next-i18next.config.js
const { i18n } = require('./next-i18next.config');
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
i18n: {
defaultLocale: 'en',
locales: ['en', 'es', 'fr'],
},
// другая конфигурация
}
module.exports = nextConfig
Добавьте конфигурацию и импорт для перевода в ваш _app.js
:
import { appWithTranslation } from 'next-i18next';
import '../styles/globals.css';
function MyApp({ Component, pageProps }) {
return ;
}
export default appWithTranslation(MyApp);
Создайте папку и заполните ее локалями для ваших переводов.
/public
└── locales
├── en
│ └── common.json
├── es
│ └── common.json
└── fr
└── common.json
Пример en/common.json:
{
"greeting": "Hello, world!",
"welcomeMessage": "Welcome to our website."
}
Использование перевода в компоненте:
import { useTranslation } from 'next-i18next';
function MyComponent() {
const { t } = useTranslation('common');
return (
{t('greeting')}
{t('welcomeMessage')}
);
}
export default MyComponent;
В этом примере используется хук useTranslation
для получения переводов на основе текущей локали.
Работа с динамическими маршрутами и генерацией статических сайтов (SSG)
Интернационализация усложняется при работе с динамическими маршрутами (например, посты в блоге, страницы продуктов) и генерацией статических сайтов (SSG).
1. Динамические маршруты (например, /blog/[slug])
Для динамических маршрутов вам потребуется сгенерировать правильные пути для каждой локали во время сборки с помощью getStaticPaths
. Эта функция возвращает массив путей, которые Next.js должен предварительно отрендерить.
export async function getStaticPaths() {
const paths = [];
const locales = ['en', 'es', 'fr'];
const posts = await fetchPosts(); // Получаем данные постов блога
posts.forEach(post => {
locales.forEach(locale => {
paths.push({
params: {
slug: post.slug,
},
locale,
});
});
});
return {
paths,
fallback: false, // или 'blocking', если вы хотите показывать состояние загрузки
};
}
export async function getStaticProps({ params, locale }) {
const post = await getPostBySlug(params.slug, locale);
return {
props: {
post,
},
};
}
Объяснение:
getStaticPaths
: Эта функция итерирует по вашим постам в блоге и генерирует путь для каждого поста и каждой локали. Объектparams
содержит параметры маршрута (например, слаг поста блога).locale
: Этот параметр предоставляет текущую локаль, позволяя вам получить переведенный контент для конкретной локали.fallback
: Определяет, как Next.js обрабатывает пути, не определенные вgetStaticPaths
.fallback: false
генерирует страницы 404 для неопределенных путей.fallback: 'blocking'
предварительно рендерит страницы по запросу.
2. Генерация статических сайтов (SSG) с getStaticProps
В getStaticProps
вы можете получать переведенный контент на основе параметра locale
.
export async function getStaticProps({ params, locale }) {
// Получаем контент на основе локали и параметров
const { post } = await getPostBySlug(params.slug, locale);
return {
props: {
post,
},
};
}
Функция getPostBySlug
должна получать переведенный контент для заданного слага и локали, который может быть извлечен из ваших файлов перевода, базы данных или CMS.
3. Рендеринг на стороне сервера (SSR) с getServerSideProps
Для контента, который необходимо получать во время запроса, используйте getServerSideProps
. Это полезно, если контент часто меняется или персонализирован для каждого пользователя.
export async function getServerSideProps({ params, locale, req, res }) {
// Получаем данные на основе локали и параметров (например, из базы данных)
const data = await fetchData(params.slug, locale);
return {
props: {
data,
},
};
}
Лучшие практики для интернационализации в Next.js
Следование этим лучшим практикам поможет вам создавать надежные, удобные в обслуживании и дружественные к пользователю многоязычные приложения:
- Планируйте заранее: Учитывайте интернационализацию с самого начала вашего проекта. Гораздо проще реализовать ее на начальном этапе, чем дорабатывать позже.
- Отделяйте контент от кода: Храните весь переводимый текст в отдельных файлах (например, JSON-файлах или TMS) и избегайте жесткого кодирования текста непосредственно в ваших компонентах.
- Используйте систему управления переводами (TMS): Для крупных проектов TMS может упростить процесс перевода и улучшить совместную работу.
- Тщательно тестируйте: Тестируйте ваше приложение на всех поддерживаемых языках, чтобы обеспечить точность переводов, правильное форматирование и корректное отображение в разных браузерах и на разных устройствах. Тестируйте на реальных устройствах, а не только на эмуляторах.
- Учитывайте языки с письмом справа налево (RTL): Если вы поддерживаете такие языки, как арабский или иврит, убедитесь, что ваш дизайн и макет адаптированы для направления текста справа налево. Next.js не обрабатывает это автоматически, поэтому требуются CSS или другие решения.
- Обрабатывайте форматирование даты и времени: Используйте библиотеки или встроенные функции для форматирования дат и времени в соответствии с локалью пользователя. Moment.js и date-fns — две популярные и полезные библиотеки.
- Управляйте форматированием чисел и валют: Правильно форматируйте числа и символы валют в зависимости от локали пользователя.
- Оптимизируйте SEO: Используйте метатеги для конкретных языков (
hreflang
), чтобы помочь поисковым системам правильно индексировать ваш контент. Включайте коды языков в ваши URL. - Приоритезируйте пользовательский опыт: Предоставьте пользователям ясный и интуитивно понятный способ переключения между языками. Рассмотрите возможность автоматического определения языка на основе настроек браузера.
- Будьте в курсе обновлений: Поддерживайте актуальность вашей версии Next.js и библиотек i18n, чтобы пользоваться последними функциями и исправлениями безопасности.
- Учитывайте доступность (a11y): Убедитесь, что ваш переведенный контент доступен для пользователей с ограниченными возможностями. Предоставляйте альтернативный текст для изображений и используйте соответствующие ARIA-атрибуты. Используйте скринридеры для тестирования.
Аспекты SEO для интернационализированных сайтов
Оптимизация вашего интернационализированного сайта для поисковых систем крайне важна для привлечения органического трафика со всего мира. Вот некоторые ключевые практики SEO:
- Теги
hreflang
: Внедряйте тегиhreflang
в<head>
вашего HTML, чтобы сообщить поисковым системам о языковых и региональных вариациях вашего контента. Это критически важно для SEO. Например:<link rel="alternate" hreflang="en" href="https://example.com/en/" />
и<link rel="alternate" hreflang="es" href="https://example.com/es/" />
- URL-адреса для конкретных языков: Используйте коды языков в ваших URL (например,
/en/about
,/es/acerca-de
). Это ясно указывает на язык контента как пользователям, так и поисковым системам. - Локализованный контент: Переводите ваш контент точно и естественно. Машинные переводы должны быть проверены носителем языка.
- Локализованные мета-описания и заголовки: Пишите уникальные и привлекательные мета-описания и заголовки для каждого языка, чтобы улучшить рейтинг кликов в результатах поиска.
- XML-карты сайта: Создавайте и отправляйте XML-карты сайта, которые включают все языковые вариации ваших страниц.
- Внутренняя перелинковка: Используйте соответствующие внутренние ссылки между языковыми версиями вашего контента.
- Исследование ключевых слов для конкретной страны: Проводите исследование ключевых слов на каждом языке, чтобы определить термины, которые пользователи ищут в каждом регионе.
Пример: Создание простого многоязычного блога
Давайте создадим упрощенный пример многоязычного блога с использованием Next.js. Это даст более конкретное представление о том, как применять рассмотренные выше концепции.
1. Настройка проекта
Создайте новый проект Next.js:
npx create-next-app my-multi-lang-blog
cd my-multi-lang-blog
2. Настройка i18n (next.config.js
)
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
i18n: {
locales: ['en', 'es', 'fr'],
defaultLocale: 'en',
},
}
module.exports = nextConfig
3. Создание файлов перевода
Создайте папку locales
в корневом каталоге и добавьте следующие JSON-файлы:
locales/en.json
:
{
"title": "Welcome to My Blog",
"postTitle": "My First Post",
"postContent": "This is the content of my first blog post."
}
locales/es.json
:
{
"title": "Bienvenido a mi Blog",
"postTitle": "Mi Primer Post",
"postContent": "Este es el contenido de mi primer publicación de blog."
}
locales/fr.json
:
{
"title": "Bienvenue sur Mon Blog",
"postTitle": "Mon Premier Article",
"postContent": "Ceci est le contenu de mon premier article de blog."
}
4. Создание компонента поста блога (например, components/BlogPost.js
)
import { useRouter } from 'next/router';
import en from '../locales/en.json';
import es from '../locales/es.json';
import fr from '../locales/fr.json';
function BlogPost() {
const router = useRouter();
const { locale } = router;
let translations;
switch (locale) {
case 'es':
translations = es;
break;
case 'fr':
translations = fr;
break;
default:
translations = en;
}
return (
{translations.postTitle}
{translations.postContent}
);
}
export default BlogPost;
5. Создание главной страницы (pages/index.js
)
import { useRouter } from 'next/router';
import BlogPost from '../components/BlogPost';
import en from '../locales/en.json';
import es from '../locales/es.json';
import fr from '../locales/fr.json';
function HomePage() {
const router = useRouter();
const { locale, locales } = router;
let translations;
switch (locale) {
case 'es':
translations = es;
break;
case 'fr':
translations = fr;
break;
default:
translations = en;
}
return (
);
}
export default HomePage;
Этот упрощенный пример демонстрирует основные принципы интернационализации в Next.js. Вы можете расширить эту базовую структуру, включив более сложные функции, такие как динамические маршруты и интеграцию с системами управления переводами. Рассмотрите возможность улучшения ссылок выше с помощью компонента Link
и добавления соответствующего атрибута locale
.
6. Запуск приложения
Запустите приложение с помощью:
npm run dev
Теперь вы можете получить доступ к своему блогу по адресам http://localhost:3000
(английский), http://localhost:3000/es
(испанский) и http://localhost:3000/fr
(французский). Вы должны увидеть, что заголовок и контент поста блога переведены в соответствии с выбранной локалью.
Заключение
Next.js предоставляет исчерпывающий набор функций для реализации интернационализации в ваших веб-приложениях. Следуя принципам и техникам, изложенным в этом руководстве, вы сможете создавать многоязычные приложения, которые предоставляют локализованный опыт пользователям по всему миру. Не забывайте планировать свою стратегию i18n заранее, выбирать подходящий для ваших нужд метод перевода и ставить в приоритет пользовательский опыт. При тщательном планировании и исполнении вы сможете создавать приложения, которые находят отклик у глобальной аудитории и открывают новые возможности для роста. Постоянное обучение, отслеживание последних релизов и лучших практик гарантирует, что вы эффективно используете свои инструменты и технологии.
По мере развития технологий ожидайте появления более продвинутых функций i18n. Возможность охватить пользователей из разных культур и языковых групп останется ключевым приоритетом для разработчиков приложений по всему миру. Поэтому овладение основами i18n — это ценный навык, который повысит вашу ценность на современном глобальном рынке разработки.