簡體   English   中英

如何在ASP.NET Core 2.2中創建鏈接以切換語言?

[英]How to create a link to switch language in ASP.NET Core 2.2?

網站支持多種語言。 支持多語言(包括路線)的代碼已經到位並且可以正常使用。

本地化使用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使用此鏈接?

我設法通過語言下拉列表的局部視圖來做到這一點。

  • 通過將RequestLocalizationOptions注入部分視圖,首先獲得受支持的區域性列表
  • 將路線數據值和查詢字符串參數也收集到字典中,因此,如果您具有如下所示的鏈接,它將捕獲所有參數。

    / zh-CN / Products /?page = 5&keyword = bla-bla-bla

  • 循環播放受支持的區域性以創建鏈接,並在循環中將{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。

更新

我創建了一個nuget包,該包使用一行代碼創建了一個語言導航菜單:)

  • 安裝nuget包
PM > Install-Package LazZiya.RazorLibrary -Version 1.0.1
  • 創建語言導航下拉列表:
<partial name="/Areas/LazZiya/Pages/_LanguageMenu.cshtml" />

與.NetCote 2.1或更高版本以及Bootstrap 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>

欲了解更多詳情,請訪問項目網站 ,觀看現場演示


這不是超級優雅,但應該可以解決。 這里僅以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);

而且看起來還不錯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM