Мне удалось сделать это с частичным представлением для выпадающего списка языков.
- Сначала получите список поддерживаемых культур, введя
RequestLocalizationOptions
в частичное представление
Соберите значения данных маршрута и параметры строки запроса также в словарь, поэтому, если у вас есть ссылка, как показано ниже, она будет перехватывать все параметры.
/ EN-US / Продукты /? Страница = 5 & ключевое слово = бла-бла-бла
Зацикливание в поддерживаемых культурах для создания ссылок и замены значения маршрута {culture}
на соответствующее в цикле. Единственное, что нужно учитывать - это определить {culture}
в глобальном маршруте.
вот мой _Languages.cshtml
частичный вид:
@using Microsoft.AspNetCore.Builder
@using Microsoft.Extensions.Options
@inject IOptions<RequestLocalizationOptions> LocOps
@{
var requestCulture = CultureInfo.CurrentCulture;
var supportedCultures = LocOps.Value.SupportedUICultures
.Select(c => new SelectListItem
{
Value = $"{c.Name}",
Text = $"{c.DisplayName}"
}).ToList();
var routeData = new Dictionary<string, string>();
foreach (var r in ViewContext.RouteData.Values)
{
routeData.Add(r.Key, r.Value.ToString());
}
foreach(var qs in Context.Request.Query)
{
routeData.Add(qs.Key, qs.Value);
}
}
<div class="dropdown">
<a class="btn-sm btn-default border border-secondary dropdown-toggle" href="#" role="button" id="dropdownLang" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
@($"{requestCulture.DisplayName}")
</a>
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownLang">
@foreach (var culture in supportedCultures)
{
if (culture.Value.ToLower() != requestCulture.Name.ToLower())
{
// replace {culture} value with the one from the list
routeData["culture"] = culture.Value;
<a class="dropdown-item small"
asp-all-route-data="@routeData">
@culture.Text
</a>
}
}
</div>
</div>
Кстати, я использую загрузчик 4.
UPDATE
Я создал пакет nuget, который создает меню языковой навигации с одной строкой кода:)
PM > Install-Package LazZiya.RazorLibrary -Version 1.0.1
- создать выпадающий список языков:
<partial name="/Areas/LazZiya/Pages/_LanguageMenu.cshtml" />
совместимо с .NetCote 2.1 или более поздней версией и начальной загрузкой 4
- Примечание: имя ключа маршрута должно быть
culture
ОБНОВЛЕНИЕ 2 (14.04.2019)
Я создал помощник по тегам, который поддерживает все версии текущих структур ядра dotnet для создания языковой навигации в зависимости от поддерживаемых культур или списка культур, выбранных вручную.
установить пакет nuget (он также содержит еще один полезный тег-помощник):
Install-Package LazZiya.TagHelpers -Version 2.0.0
добавить помощники тегов в _ViewImports.cshtml
@addTagHelper *, LazZiya.TagHelpers
Создание языковой навигации:
<language-nav view-context="ViewContext"></language-nav>
для более подробной информации посетите веб-сайт проекта , см. живые демонстрации