Как создать ссылку для переключения языка в ASP.NET Core 2.2? - PullRequest
4 голосов
/ 02 апреля 2019

Сайт поддерживает несколько языков. Код для поддержки мультиязычности, включая маршруты, уже существует и работает.

Локализация настроена с использованием RouteDataRequestCultureProvider, как объяснено на https://joonasw.net/view/aspnet-core-localization-deep-dive.

app.UseRouter(routes =>
{
    routes.MapMiddlewareRoute("{culture=en-US}/{*mvcRoute}", subApp =>
    {
        subApp.UseRequestLocalization(localizationOptions);

        subApp.UseMvc(mvcRoutes =>
        {
             // Routes are here
        }   
    });
});

Как создать общий тег, который будет показывать текущую страницу на другом языке?

В идеале, я бы просто указал, на какой язык должна указывать эта ссылка и чтобы он сохранял все остальные параметры маршрута (например, текущий контроллер, текущее действие, текущая модель маршрута), чтобы я мог иметь эту ссылку в _Layout.cshtml

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

Мне удалось сделать это с частичным представлением для выпадающего списка языков.

  • Сначала получите список поддерживаемых культур, введя 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, который создает меню языковой навигации с одной строкой кода:)

  • установить пакет 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>

для более подробной информации посетите веб-сайт проекта , см. живые демонстрации


0 голосов
/ 02 апреля 2019

Это не супер элегантно, но должно сработать.Вот в качестве примера только для en-US и de-DE:

var switchLang = new Dictionary<string, string>{{"de-DE", "en-US"}, {"en-US", "de-DE"}};
var controller = Html.ViewContext.RouteData.Values["controller"].ToString();
var action = Html.ViewContext.RouteData.Values["action"].ToString();
var lang = System.Threading.Thread.CurrentThread.CurrentUICulture.Name;
var newLang = lang;
switchLang.TryGetValue(lang, out newLang);

Затем вы можете использовать контроллер переменной, action и newLang для создания ActionLink для другого языка.Я просто поместил строку в один из моих _Layout.cshtml, чтобы показать значение

var url = string.Format("{0}/{1}/{2}",newLang, controller, action);

И это выглядело нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...