ASP.Net 核心 2.0 Web 应用程序中的本地化
Localization in ASP.Net Core 2.0 Web Application
我正在尝试全球化和本地化我的 ASP.NET 西班牙语核心 2.0 Web 应用程序。我正在尝试遵循 docs,但文档似乎并不适用于 Core 2.0,因为它们似乎没有涵盖 Razor Pages。只有控制器和视图。尽管如此,无论我是更改请求 headers 中的区域性还是使用文档中显示的查询字符串,本地化都不起作用。对我做错了什么有任何见解吗?
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 在布局页面中工作,它似乎只适用于实际视图。要在 _Layout.cshtml
中使用本地化字符串,这是我必须做的。
1。创建一个虚拟 class
这是为了以后可以查到资源文件。资源文件的路径应反映您放置此文件的位置。例如,如果您将虚拟文件放在 Models/_Shared.cs
中,则资源文件应该放在 Resources/Models/_Shared.es.resx
.
中
namespace WebApp.Models
{
// dummy class for shared resource strings
public class _Shared
{
}
}
2。在 _ViewImports.cshtml
中注入一个 IHtmlLocalizer
(或者放在_Layout.cshtml
的最前面)
@inject IHtmlLocalizer<Models._Shared> SharedLocalizer
3。在 _Layout.cshtml
中使用 SharedLocalizer
而不是 Localizer
SharedLocalizer 也可用于其他视图,您需要使用相同的共享资源而不是在不同的资源文件中重复翻译。
<a class="navbar-brand" asp-page="/Index">@SharedLocalizer["Part Database"]</a>
更新: 已验证这在 Razor Pages 项目中有效。
我正在尝试全球化和本地化我的 ASP.NET 西班牙语核心 2.0 Web 应用程序。我正在尝试遵循 docs,但文档似乎并不适用于 Core 2.0,因为它们似乎没有涵盖 Razor Pages。只有控制器和视图。尽管如此,无论我是更改请求 headers 中的区域性还是使用文档中显示的查询字符串,本地化都不起作用。对我做错了什么有任何见解吗?
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 在布局页面中工作,它似乎只适用于实际视图。要在 _Layout.cshtml
中使用本地化字符串,这是我必须做的。
1。创建一个虚拟 class
这是为了以后可以查到资源文件。资源文件的路径应反映您放置此文件的位置。例如,如果您将虚拟文件放在 Models/_Shared.cs
中,则资源文件应该放在 Resources/Models/_Shared.es.resx
.
namespace WebApp.Models
{
// dummy class for shared resource strings
public class _Shared
{
}
}
2。在 _ViewImports.cshtml
中注入一个 IHtmlLocalizer
(或者放在_Layout.cshtml
的最前面)
@inject IHtmlLocalizer<Models._Shared> SharedLocalizer
3。在 _Layout.cshtml
中使用 SharedLocalizer
而不是 Localizer
SharedLocalizer 也可用于其他视图,您需要使用相同的共享资源而不是在不同的资源文件中重复翻译。
<a class="navbar-brand" asp-page="/Index">@SharedLocalizer["Part Database"]</a>
更新: 已验证这在 Razor Pages 项目中有效。