Локализация Blazor
Создание SEO-дружественных URL с указанием культуры в Blazor
Используйте маршруты вида /ru-ru/имя-страницы/ для прямого доступа.
Цель — стабильная система URL, а не просто переведённый текст.
Почему это важно
URL с указанием культуры помогают людям и поисковым роботам выбирать правильную страницу
Куки могут менять язык после запроса.
URL можно поделиться, проиндексировать, кэшировать и проверить.
Маршруты с указанием культуры подходят для публичных статей, страниц продуктов, документации и инструментов.
Содержание
Основные концепции
Разделяйте язык, регион, маршрут и версию контента
Держите эти понятия отдельно перед написанием кода маршрутизации.
Используйте язык для читаемого текста.
Английский, немецкий и французский — варианты языков.
Используйте регион для локальных особенностей.
en-us и en-gb могут требовать разного правописания, примеров и предложений.
Используйте маршруты для обнаружения.
Маршрут вроде /de-de/blazor/ даёт всем один стабильный адрес.
Используйте контент, когда намерения отличаются.
Создавайте отдельную версию, если юридические заметки, цены или примеры отличаются.
SEO-сигналы
Связывайте маршруты с указанием культуры с правилами canonical и hreflang
URL — лишь один из сигналов. Метаданные должны соответствовать ему.
Canonical URL
Указывайте для каждой локализованной страницы её собственный предпочтительный URL.
hreflang
Связывайте каждую реальную языковую или региональную версию с помощью hreflang.
x-default
Используйте x-default для нейтрального выбора или глобального резервного варианта.
BreadcrumbList
Делайте хлебные крошки с учётом культуры, чтобы схема соответствовала видимой иерархии маршрутов.
Связанная справочная информация
Метаданные и схема должны рассказывать одну и ту же историю
Используйте эти руководства при добавлении метаданных и структурированных данных.
Реализация
Создавайте правила маршрутизации по частям
Начните с одного сервиса, одного перенаправления и одного шаблона маршрута.
Контракт сервиса культуры
Централизуйте поддерживаемые культуры и разбор URL.
public sealed class CultureRouteService
{
private static readonly string[] SupportedCultures = ["en-us", "en-gb", "de-de"];
public string ResolveCulture(string? routeCulture)
{
if (SupportedCultures.Contains(routeCulture, StringComparer.OrdinalIgnoreCase))
{
return routeCulture!.ToLowerInvariant();
}
return "en-us";
}
}Точка перенаправления культуры
Установите cookie, затем вернитесь к маршруту культуры.
[Route("culture")]
public sealed class CultureController : Controller
{
[HttpGet("set")]
public IActionResult Set(string culture, string returnUrl)
{
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)));
return LocalRedirect(returnUrl);
}
}Настройка программы
Зарегистрируйте локализацию перед сопоставлением маршрутов контроллеров.
builder.Services.AddLocalization();
builder.Services.AddScoped<CultureRouteService>();
app.UseRequestLocalization(options =>
{
options.SetDefaultCulture("en-us");
options.AddSupportedCultures("en-us", "en-gb", "de-de");
options.AddSupportedUICultures("en-us", "en-gb", "de-de");
});
app.MapControllers();Маршрут страницы
Сделайте сегмент культуры частью каждого публичного маршрута.
@page "/{Culture}/pricing/"
<a href="@BuildCultureLink(PageRegistryKey.Blazor)">
Blazor guides
</a>Реальность маршрутов
Blazor может локализовать контент, но не шаблоны маршрутов
Сегмент культуры меняется; слаг остаётся стабильным. Переведённые слаги требуют собственного слоя маршрутизации.
Маршруты Razor @page используют буквальные шаблоны. Локализация переводит только текст страницы. PageRegistry и строки @page остаются под контролем кода.
/de-de/seo-friendly-culture-links-in-blazor/
Меняется только культура.
/de-de/seo-freundliche-culture-links-in-blazor/
Переведённые слаги требуют таблицы слагов. Им также нужны перенаправления, canonical, карты сайта и hreflang.
BuildCultureLink(PageRegistryKey.Blazor)
BuildCultureLink меняет культуру, а не слаги.
Распространённые ошибки
Большинство ошибок URL культуры связаны с несоответствием маршрутов
Шаблон маршрута редко является сложной частью.
Сохраняйте согласованность всех сигналов после смены языка.
Не перенаправляйте валидную культуру бесконечно.
Нормализуйте культуру один раз, затем прекращайте, если маршрут уже совпадает.
Не определяйте культуру по умолчанию поздно.
Используйте одну культуру по умолчанию для маршрутизации, метаданных, карты сайта и логики резервного варианта.
Не допускайте, чтобы две страницы имели одинаковый слаг для одной культуры.
Централизованные ссылки страниц облегчают проверку случайных конфликтов маршрутов.
Не скрывайте языковые маршруты только в клиентском состоянии.
Поисковым роботам и пользователям нужны реальные значения href до того, как Blazor станет интерактивным.
Проверка
Проверяйте каждый маршрут культуры перед публикацией
Проверяйте сгенерированный HTML, а не только код Razor.
- Откройте хотя бы один URL для каждой поддерживаемой культуры.
- Проверьте теги canonical и hreflang в сгенерированном исходном коде.
- Подтвердите, что схема FAQ соответствует видимым вопросам и ответам.
- Проверяйте перенаправления, чтобы неподдерживаемые культуры не зацикливались.
- Проверьте переведённые заголовки, описания, текст H1 и ключевые слова.
Частые вопросы
Являются ли URL с указанием культуры лучше cookie для SEO?
Да. URL с указанием культуры создают индексируемые и удобные для обмена страницы.
В чём разница между языком и регионом?
Язык управляет текстом. Регион — локальными примерами и предложениями.
Нужен ли мне всё ещё hreflang при использовании маршрутов с указанием культуры?
Да. Маршруты с указанием культуры делают URL понятными. hreflang связывает их между собой.
На что должен указывать canonical на локализованных страницах?
Обычно canonical указывает на ту же локализованную страницу.
Как избежать циклов перенаправления?
Перенаправляйте неподдерживаемые культуры один раз, затем остановитесь.