【问题标题】:Load resource file based on culture and session state value根据文化和会话状态值加载资源文件
【发布时间】:2021-03-03 14:57:46
【问题描述】:

我需要根据文化 [Lauguage] 更改 .Net 核心 mvc Web 应用程序的内容,以及将根据下拉选择设置的特定会话值。

我有一个州 [PA、VA、.. 等] 的下拉列表,因此创建了资源文件 viewname.PA.en.resx、viewname.VA.en.resx。

需要根据我的下拉选择和语言文化加载适当的资源文件。

目前它仅基于加载的语言文化。

【问题讨论】:

    标签: asp.net-core-mvc asp.net-core-3.1


    【解决方案1】:

    请参考official documentsample

    您可以使用以下代码创建一个 _SelectLanguagePartial.cshtml 部分视图:

    @using Microsoft.AspNetCore.Builder
    @using Microsoft.AspNetCore.Http.Features
    @using Microsoft.AspNetCore.Localization
    @using Microsoft.AspNetCore.Mvc.Localization
    @using Microsoft.Extensions.Options
    
    @inject IViewLocalizer Localizer
    @inject IOptions<RequestLocalizationOptions> LocOptions
    
    @{
        var requestCulture = Context.Features.Get<IRequestCultureFeature>();
        var cultureItems = LocOptions.Value.SupportedUICultures
            .Select(c => new SelectListItem { Value = c.Name, Text = c.DisplayName })
            .ToList();
        var returnUrl = string.IsNullOrEmpty(Context.Request.Path) ? "~/" : $"~{Context.Request.Path.Value}";
    }
    
    <div title="@Localizer["Request culture provider:"] @requestCulture?.Provider?.GetType().Name">
        <form id="selectLanguage" asp-controller="Home" 
              asp-action="SetLanguage" asp-route-returnUrl="@returnUrl" 
              method="post" class="form-horizontal" role="form">
            <label asp-for="@requestCulture.RequestCulture.UICulture.Name">@Localizer["Language:"]</label> <select name="culture"
              onchange="this.form.submit();"
              asp-for="@requestCulture.RequestCulture.UICulture.Name" asp-items="cultureItems">
            </select>
        </form>
    </div>
    

    然后,将Views/Shared/_SelectLanguagePartial.cshtml 文件添加到布局文件的页脚部分,以便所有视图都可以使用:

    <div class="container body-content" style="margin-top:60px">
        @RenderBody()
        <hr>
        <footer>
            <div class="row">
                <div class="col-md-6">
                    <p>&copy; @System.DateTime.Now.Year - Localization</p>
                </div>
                <div class="col-md-6 text-right">
                    @await Html.PartialAsync("_SelectLanguagePartial")
                </div>
            </div>
        </footer>
    </div>
    

    然后,在 Home Controller SetLanguage 方法中,设置文化 cookie。

    [HttpPost]
    public IActionResult SetLanguage(string culture, string returnUrl)
    {
        Response.Cookies.Append(
            CookieRequestCultureProvider.DefaultCookieName,
            CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
            new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
        );
    
        return LocalRedirect(returnUrl);
    }
    

    [注意] 您不能将 _SelectLanguagePartial.cshtml 插入此项目的示例代码。 GitHub 上的 Localization.StarterWeb 项目具有通过依赖注入容器将 RequestLocalizationOptions 流向 Razor 部分的代码。检查the Startup.cs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多