c# - Asp.Net Core 中的本地化

标签 c# asp.net-core localization asp.net-core-mvc asp.net-core-mvc-2.0

我一直按照此页面上的说明设置本地化:

https://learn.microsoft.com/en-us/aspnet/core/fundamentals/localization

然而,对我来说它似乎不起作用。这是我所做的:

启动.cs:

public class Startup
{
    public IConfigurationRoot Configuration { get; }

    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", true, true);

        builder.AddEnvironmentVariables();
        Configuration = builder.Build();
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddLocalization(o => o.ResourcesPath = "Resources");
        services.AddMvc(o =>
        {
            o.Filters.Add(typeof(GlobalExceptionFilter));
        }
        ).AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix).AddDataAnnotationsLocalization();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        var supportedCultures = new[]
        {
            new CultureInfo("es-MX"),
            new CultureInfo("en-US")
        };

        app.UseRequestLocalization(new RequestLocalizationOptions
        {
            DefaultRequestCulture = new RequestCulture("es-MX"),
            SupportedCultures = supportedCultures,
            SupportedUICultures = supportedCultures
        });

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
        }

        app.UseStaticFiles();
        app.UseAuthentication();

        app.UseMvcWithDefaultRoute();
        //app.UseMvc(routes =>
        //{
        //    routes.MapRoute(
        //        "default", "{controller=Home}/{action=Index}/{id?}");
        //});

        app.UseRewriter(new RewriteOptions().AddRedirectToHttps());
    }
}

我的 Layout.cshtml 包含以下内容:

@await Html.PartialAsync("_SelectLanguagePartial")

我的 _SelectLanguagePartial.cshtml 包含:

@using Microsoft.AspNetCore.Builder
@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" 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>

除此之外,我还创建了 2 个资源文件,ErrorMessages.ex-MX.resxErrorMessages.resx .

在我的 HomeController 中,我添加了这一行 ViewBag.Test = ErrorMessages.Test;在索引 View 中,我添加了 <p>@ViewBag.Test</p>

当我查看该页面时,我看到带有语言的下拉菜单,但那里只列出了英语。我在页面上显示的文本来自ErrorMessages.resx。 .

我错过了一步吗?为什么西类牙人在任何地方都学不会?正如您将在下面看到的,我什至尝试将西类牙语设置为主要文化,但没有任何区别。

编辑:

我尝试从列表中删除 eglish,结果我得到的下拉列表仍然存在,这次它列出了西类牙语。但是,文本仍然是英文。

然后我尝试将英语添加回项目中的第二个列表并将英语设置为主要语言,但下拉列表仅显示 1 种语言,西类牙语现在消失了。

最佳答案

大约一周前我遇到了同样的问题。我用这个解决了它:

public void ConfigureServices(IServiceCollection services)
{
    services.AddLocalization(options => options.ResourcesPath = "Resources");

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

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

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

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
    app.UseRequestLocalization(locOptions.Value);

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseBrowserLink();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

    app.UseStaticFiles();
    app.UseMvcWithDefaultRoute();
}

不过,还有一个评论。在 ASP.NET Core 中,不应创建默认的文化资源,只能创建特定的文化资源:

所以,给定

Views/Shared/Layout.cshtml

只创造

Resources/Views/Shared/Layout.es-MX.resx

另请注意,您通过此将西类牙语限制为墨西哥语,因此您应该有一个 es 回退,或者同时添加 eses -MX.

关于c# - Asp.Net Core 中的本地化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46984323/

相关文章:

asp.net-core - 尽管处于同一网络中,但无法使容器进行通信

asp.net-core - 使用 Serilog Asp.net 核心 dotnet 5 预览 7

python - 如何在 django 中将字符串转换为本地化日期

json - 如何在 ASP.NET Core WebAPI 中使用 Newtonsoft : Json. NET?

mysql - 数据库信息本地化

C# - 将 "."替换为 double 值中的 ","

c# - 加密和解密 19 位长的 BigInteger

c# - 自定义 BotState 存储 - 删除旧的状态数据条目

c# - 如何在源集合为空时强制 LINQ Sum() 返回 0

c# - 获取程序集的原始源代码位置