Universal Router — это гибкая библиотека маршрутизации для JavaScript, которая позволяет строить сложные маршруты с динамическими параметрами, вложенными маршрутами и условными обработчиками. Организация мультиязычных маршрутов требует внимательного подхода к структуре URL, обработке параметров и локализации контента.
Мультиязычные маршруты обычно представляют собой путь с префиксом
языка: /en/about, /ru/about,
/fr/about. Префикс языка может быть обязательным или
опциональным, что зависит от архитектуры приложения.
Для поддержки мультиязычных маршрутов рекомендуется использовать вложенные маршруты, где первый уровень отвечает за язык:
import UniversalRouter from 'universal-router';
const routes = [
{
path: '/:lang(en|ru|fr)?',
children: [
{
path: '',
action: ({ params }) => `Главная страница (${params.lang || 'ru'})`,
},
{
path: 'about',
action: ({ params }) => `Страница "О нас" (${params.lang || 'ru'})`,
},
{
path: 'contact',
action: ({ params }) => `Контакты (${params.lang || 'ru'})`,
},
],
},
];
const router = new UniversalRouter(routes);
router.resolve('/en/about').then(console.log); // Страница "О нас" (en)
router.resolve('/contact').then(console.log); // Контакты (ru)
Ключевые моменты:
:lang обозначает язык и может быть
опциональным.params.lang || 'ru' позволяет установить язык по
умолчанию, если он не указан в URL.При большом количестве языков удобно автоматически генерировать маршруты. Это позволяет избежать дублирования кода:
const languages = ['en', 'ru', 'fr'];
const pages = ['about', 'contact', 'services'];
const routes = languages.flatMap(lang =>
pages.map(page => ({
path: `/${lang}/${page}`,
action: () => `${page} (${lang})`
}))
);
const router = new UniversalRouter(routes);
Преимущества подхода:
Universal Router поддерживает middleware через before и
after функции, что удобно для глобальной установки языка
приложения:
const router = new UniversalRouter(routes, {
context: { currentLang: 'ru' },
resolveRoute(context, params) {
if (params.lang) {
context.currentLang = params.lang;
}
return context;
}
});
router.resolve('/fr/about').then(result => {
console.log(router.context.currentLang); // fr
});
Особенности:
context) позволяет хранить состояние
выбранного языка.Для удобства пользователей и SEO важно обрабатывать URL без префикса языка и перенаправлять на язык по умолчанию:
{
path: '/',
action: () => ({ redirect: '/ru' }),
},
{
path: '/:lang(en|ru|fr)',
children: [...routesForLang]
}
Преимущества:
Вложенные маршруты помогают организовать сложную структуру, например, для разделов сайта с разделами на разных языках:
{
path: '/:lang(en|ru)',
children: [
{
path: 'blog',
children: [
{ path: '', action: () => 'Список постов' },
{ path: ':id', action: ({ params }) => `Пост ${params.id}` },
],
},
],
}
Преимущества вложенности:
translations[lang][key] для
быстрого доступа.Мультиязычные маршруты в Universal Router обеспечивают гибкость, масштабируемость и интеграцию с современными системами локализации, что делает библиотеку удобной для построения крупных веб-приложений с поддержкой нескольких языков.