首页 > 解决方案 > 根据文化和会话状态值加载资源文件

问题描述

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

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

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

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

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

解决方案


请参考官方文档示例

您可以使用以下代码创建一个 _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 部分的代码。检查Startup.cs


推荐阅读