ASP.Net Core 2.0 Web 应用程序中的本地化

Dre*_*pin 1 c# globalization localization asp.net-core-2.0 razor-pages

我正在尝试将我的 ASP.NET Core 2.0 Web 应用程序全球化并本地化为西班牙语。我正在尝试遵循文档,但这些文档似乎并不适用于 Core 2.0,因为它们似乎没有涵盖 Razor Pages。仅控制器和视图。然而,无论我更改请求标头中的区域性还是使用文档中所示的查询字符串,本地化都不起作用。对我做错了什么有任何见解吗?

 http://localhost:26417/?culture=es&ui-culture=es
Run Code Online (Sandbox Code Playgroud)

启动.cs

public void ConfigureServices( IServiceCollection services )
{
    services.AddDbContext<PartDbContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("PartDatabase"))
        );

    services.AddAuthentication(IISDefaults.AuthenticationScheme);

    services.AddLocalization(options => options.ResourcesPath = "Localization");
    services.AddMvc()
        .AddRazorPagesOptions(options => {
            //options.Conventions.AllowAnonymousToPage("/Index");
            // I can just use [AllowAnonymous] attribute
        })
        .AddViewLocalization()
        .AddDataAnnotationsLocalization();
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure( IApplicationBuilder app, IHostingEnvironment env )
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseBrowserLink();
    }
    var supportedCultures = new []
    {
        new CultureInfo("en"),
        new CultureInfo("es"),
    };
    app.UseRequestLocalization(new RequestLocalizationOptions {
        DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("en"),
        SupportedCultures = supportedCultures,
        SupportedUICultures = supportedCultures
    });
    app.UseStaticFiles();
    app.UseMvc(routes => {
        routes.MapRoute(name: "default", template: "{controller}/{action=Index}/{id?}");
    });
}
Run Code Online (Sandbox Code Playgroud)

_ViewImports.cshtml

@using PartDatabase
@using Microsoft.Extensions.Configuration
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Mvc.Localization
@namespace PartDatabase.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@inject IConfiguration Configuration
@inject  IAuthorizationService AuthorizationService
@inject IViewLocalizer Localizer
Run Code Online (Sandbox Code Playgroud)

_布局.cshtml

<a class="navbar-brand" asp-page="/Index">@Localizer["Part Database"]</a>
Run Code Online (Sandbox Code Playgroud)

文件结构

在此输入图像描述

资源文件

在此输入图像描述

笔记:

  • 我尝试将 _Layout.es.resx 移动到 Localization 文件夹的根目录。
  • 我尝试使用“资源”作为名称,而不是文档中显示的名称“本地化”,但我想相信该行options.ResourcesPath = "Localization"会使用不同的文件夹名称来照顾我。

joa*_*del 5

我从未让 ViewLocalizer 在布局页面中工作,它似乎仅适用于实际视图。要在 中使用本地化字符串_Layout.cshtml,这就是我必须做的。

1. 创建一个虚拟类

这是为了以后能够查找资源文件。资源文件的路径应反映您放置此文件的位置。例如,如果您将虚拟文件放入Models/_Shared.cs,则资源文件应位于Resources/Models/_Shared.es.resx

namespace WebApp.Models
{
    // dummy class for shared resource strings
    public class _Shared
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

2.注入一个IHtmlLocalizerin_ViewImports.cshtml

(或者只是把它放在顶部_Layout.cshtml

@inject IHtmlLocalizer<Models._Shared> SharedLocalizer
Run Code Online (Sandbox Code Playgroud)

3. 用SharedLocalizerin_Layout.cshtml代替Localizer

SharedLocalizer 也可以在其他视图中使用,您需要使用相同的共享资源,而不是在不同的资源文件中重复翻译。

<a class="navbar-brand" asp-page="/Index">@SharedLocalizer["Part Database"]</a>
Run Code Online (Sandbox Code Playgroud)

更新:已验证这是否适用于 Razor Pages 项目。