【问题标题】:The Language does not change in the ASP.NET Core Web applicationASP.NET Core Web 应用程序中的语言没有改变
【发布时间】:2017-07-24 14:13:19
【问题描述】:

我按照Globalization and localizationBuilding simple multilingual ASP.NET Core website 教程为我的应用程序添加语言切换。

所以,我创建了一个局部视图

@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();
}

<div title="@Localizer["Request culture provider:"] @requestCulture?.Provider?.GetType().Name">
    <form id="selectLanguage" asp-controller="Home"
          asp-action="SetLanguage" asp-route-returnUrl="@Context.Request.Path"
          method="post" class="form-horizontal" role="form">
        @Localizer["Language:"] 
        <select name="culture"
                onchange="this.form.submit();"
                asp-for="@requestCulture.RequestCulture.UICulture.Name" asp-items="cultureItems"></select>
    </form>
</div>

添加在_Layout的页脚

<div class="col-md-6 text-right">
    @await Html.PartialAsync("_SelectLanguagePartial")
</div>

并像这样配置 Startup.cs:

services.AddLocalization(options => options.ResourcesPath = "Resources");

services.AddMvc()
    .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
    .AddDataAnnotationsLocalization();

services.Configure<RequestLocalizationOptions>(options =>
{
    var supportedCultures = new[]
    {
        new CultureInfo("es"),
        new CultureInfo("en")
    };

    options.DefaultRequestCulture = new RequestCulture(culture: "es", uiCulture: "es");
    options.SupportedCultures = supportedCultures;
    options.SupportedUICultures = supportedCultures;    

});

我添加了一个Resources 文件夹,其中

Views.Home.Index.es.resx
Views.Home.Index.en.resx
Views.Shared._Layout.es.resx
Views.Shared._Layout.en.resx

我也做过Install-Package Microsoft.AspNetCore.Authentication.Cookies

当我加载主视图时,我选择了西班牙语选项。但是当我尝试选择“英语”时,它会加载,但会回滚西班牙语版本,所以我最终看不到我的英语内容。问题出在哪里?

【问题讨论】:

    标签: asp.net-core asp.net-core-1.1 asp.net-core-localization


    【解决方案1】:

    即使您已使用 Joe Auddette 的答案更新了代码,也为那些没有使其工作的人添加额外的答案。

    CookieOptions 阻止了我很长时间才使事情正常进行:

    [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),
                IsEssential = true,  //critical settings to apply new culture
                Path = "/",
                HttpOnly = false,
            }
        );
    
        return LocalRedirect(returnUrl);
    }
    

    IsEssential 在源代码中有以下 cmets:

    表明此 cookie 是否对应用程序运行至关重要 正确。如果为真,则可能会绕过同意策略检查。这 默认值为 false。

    并且consent policy 设置在startup.cs

    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies 
        // is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });
    

    【讨论】:

      【解决方案2】:

      您是否添加了 javascript 来使语言选择器回发?

      (function () {
      $("#selectLanguage select").change(function () {
          $(this).parent().submit();
      });
      }());
      

      您是否在 Configure 中连接了请求本地化中间件?

      var locOptions= app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
      app.UseRequestLocalization(locOptions.Value);
      

      你是否在 HomeController 中添加了这样的方法:

      [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);
      }
      

      【讨论】:

      • 我缺少前两个选项。第一个在教程中没有提到,第二个我没有正确阅读!非常感谢 !第三个会抛出一个例外,而不是这种情况:)
      • DisplayAttribute 本地化存在问题...肯定是另一回事,但似乎还没有工作...
      • 我的问题又是一个 :) 我使用了自定义的@Html.DisplayShortNameFor(),所以,这里提出的解决方案stackoverflow.com/questions/45234670/… 没有考虑到国际化
      • “标准”DisplayNameFor 无需其他东西即可工作
      猜你喜欢
      • 2018-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      • 1970-01-01
      相关资源
      最近更新 更多