Skip to main content
 首页 » 编程设计

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

2024年02月04日33jyk

我正在尝试全局化和本地化我的西类牙语 ASP.NET Core 2.0 Web 应用程序。我正在尝试关注 docs ,但这些文档似乎并不适用于 Core 2.0,因为它们似乎没有涵盖 Razor Pages。只有 Controller 和 View 。尽管如此,无论我是更改请求 header 中的文化,还是使用文档中显示的查询字符串,本地化都不起作用。对我做错了什么有任何见解吗?

 http://localhost:26417/?culture=es&ui-culture=es 

Startup.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?}"); 
    }); 
} 

_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 

_Layout.cshtml

<a class="navbar-brand" asp-page="/Index">@Localizer["Part Database"]</a> 

文件结构

资源文件

注意事项:

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

请您参考如下方法:

我从来没有让 ViewLocalizer 在布局页面中工作,它似乎只适用于实际 View 。要在 _Layout.cshtml 中使用本地化字符串,这是我必须做的。

1。创建一个虚拟类

这是为了以后可以查找资源文件。资源文件的路径应反射(reflect)您放置此文件的位置。例如,如果您将虚拟文件放在 Models/_Shared.cs 中,则资源文件应该在 Resources/Models/_Shared.es.resx 中。

namespace WebApp.Models 
{ 
    // dummy class for shared resource strings 
    public class _Shared 
    { 
    } 
} 

2。在 _ViewImports.cshtml

中注入(inject)一个 IHtmlLocalizer

(或者直接放在_Layout.cshtml的顶部)

@inject IHtmlLocalizer<Models._Shared> SharedLocalizer 

3。在 _Layout.cshtml 中使用 SharedLocalizer 而不是 Localizer

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

<a class="navbar-brand" asp-page="/Index">@SharedLocalizer["Part Database"]</a> 

更新:验证这在 Razor Pages 项目中有效。