Universal Router — это гибкая библиотека для маршрутизации в JavaScript, которая позволяет создавать динамические маршруты с поддержкой асинхронных действий и сложных сценариев обработки URL. Одним из важных аспектов при работе с мультиязычными приложениями является настройка fallback для языков, когда пользователь обращается к ресурсу на языке, который отсутствует или не поддерживается.
Fallback язык — это язык, который используется по умолчанию, если запрошенный пользователем язык не найден в конфигурации маршрутов. В Universal Router это реализуется через обработку маршрутов с условием проверки языка в параметрах URL. Обычно такой подход предполагает хранение списка поддерживаемых языков и определение дефолтного.
Пример структуры:
const supportedLanguages = ['en', 'fr', 'de'];
const defaultLanguage = 'en';
Здесь supportedLanguages содержит допустимые языки, а
defaultLanguage — язык, на который будет перенаправлен
пользователь, если запрошенный отсутствует.
Маршруты можно организовать с использованием динамических параметров.
Основная идея — создать маршрут вида /:lang/..., где
:lang — это параметр языка. Затем, в функции
action маршрута проверять его корректность и при
необходимости перенаправлять на fallback.
import UniversalRouter from 'universal-router';
const routes = [
{
path: '/:lang(en|fr|de)?',
async action(context) {
let { lang } = context.params;
// Если язык не указан или не поддерживается, используем defaultLanguage
if (!lang || !supportedLanguages.includes(lang)) {
lang = defaultLanguage;
return { redirect: `/${lang}` };
}
return { page: `home-${lang}` };
}
}
];
const router = new UniversalRouter(routes);
В данном примере используется регулярное выражение для ограничения
параметра :lang только поддерживаемыми значениями. Если
язык отсутствует, выполняется редирект на
defaultLanguage.
Для приложений с большим количеством страниц и языков удобнее генерировать маршруты программно. Это позволяет избежать дублирования кода и упростить поддержку.
const pages = ['home', 'about', 'contact'];
const routes = supportedLanguages.flatMap(lang =>
pages.map(page => ({
path: `/${lang}/${page}`,
action: () => ({ page: `${page}-${lang}` })
}))
);
// Добавляем fallback маршрут
routes.push({
path: '(.*)',
action: ({ pathname }) => {
const fallbackPath = `/${defaultLanguage}${pathname}`;
return { redirect: fallbackPath };
}
});
Здесь создаются маршруты для каждой комбинации языка и страницы. Fallback маршрут перехватывает любые неподдерживаемые пути и перенаправляет на дефолтный язык с сохранением части пути.
Universal Router поддерживает асинхронные действия. Это особенно полезно, если нужно подгружать контент на выбранном языке или проверять доступность страницы на сервере перед редиректом.
{
path: '/:lang(en|fr|de)?/:page?',
async action({ params }) {
let { lang, page } = params;
if (!supportedLanguages.includes(lang)) {
lang = defaultLanguage;
}
if (!page) {
page = 'home';
}
// Симуляция асинхронной загрузки контента
const content = await fetchContent(lang, page);
return { lang, page, content };
}
}
Функция fetchContent может делать запрос на сервер,
выбирать переводы и возвращать готовую страницу. Если язык недоступен,
fallback гарантирует корректный результат без ошибки 404.
Fallback для языков удобно использовать вместе с SEO-настройками.
Можно автоматически добавлять <link rel="alternate">
для разных языков или устанавливать мета-теги в зависимости от
выбранного языка.
async function action({ params }) {
let { lang } = params;
if (!supportedLanguages.includes(lang)) lang = defaultLanguage;
document.documentElement.lang = lang;
return {
page: `content-${lang}`,
meta: {
title: `Мой сайт - ${lang.toUpperCase()}`,
description: `Описание страницы на ${lang}`
}
};
}
Таким образом, fallback язык влияет не только на навигацию, но и на корректное формирование HTML-документа и SEO-параметров.
Fallback язык в Universal Router является ключевым инструментом для мультиязычных приложений, позволяя контролировать навигацию, контент и SEO-параметры в условиях отсутствия нужного языка.