在观看了一些视频并阅读了一些博客之后,我发现自己在 ASP.Net Core 项目中的本地化方面遇到了困难,部分原因是 .Net 6 和 .Net 7 中的 MVC 似乎有所不同(不再有startup.cs 文件等) .).
无论如何,我在 VS 2022 中开始使用新的 ASP.Net Core Web 应用程序。
然后我编辑我的program.cs 文件,使其看起来像这样(我添加的唯一内容应该是用于本地化)
using Microsoft.AspNetCore.Mvc.Razor;
using System.Globalization;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages()
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix);
builder.Services.AddLocalization(options =>
{
options.ResourcesPath = "Resources";
});
builder.Services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[]
{
new CultureInfo("en-US"),
new CultureInfo("vi-VN")
};
options.DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("en-US");
options.SupportedUICultures = supportedCultures;
});
var app = builder.Build();
app.UseRequestLocalization();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
然后我更改 Index.cshtml 文件,使其看起来像这样:
@page
@using Microsoft.AspNetCore.Mvc.Localization;
@inject IViewLocalizer Localizer;
@model IndexModel
@{
ViewData["Title"] = "Home page";
}
<h1>@Localizer["Welcome"]</h1>
接下来,我添加一个 Resources 文件夹,其中包含两个文件,如下所示:
英文资源是这样的:
越南资源是这样的:
当我在浏览器中运行它时,我看到这个:
在这里我们可以看到真正的问题是什么。它仅显示密钥,而不显示英语资源文件中的英文文本。
所以,然后我通过输入以下内容更改 URL 以使其切换为越南语:
http://localhost:54055/?ui-culture=vi-VN
但是,页面仅显示资源键文本。我单击“主页”但没有任何变化。我在浏览器中刷新页面,但没有任何变化。
我在这里缺少什么想法吗?
但是,页面仅显示资源键文本。我点击主页 但没有任何改变。我在浏览器中刷新页面,但什么也没有 变化。
我在这里缺少什么想法吗?
根据您共享的代码和描述,我尝试使用您的代码片段、资源文件、program.cs 文件上的配置似乎是正确的。但是您还没有调用上面定义的注册本地化服务。
为此,您应该在 HTTP 请求管道条件语句下方或在
app.UseRequestLocalization
服务之上调用 program.cs 文件中的 app.UseHttpsRedirection();
。这可能不会给当地人带来任何改变。
您可以按照以下方式进行操作:
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseRequestLocalization(app.Services.GetRequiredService<IOptions<RequestLocalizationOptions>>().Value); // You are missing this line
app.UseHttpsRedirection();
完整程序.cs:
using Microsoft.AspNetCore.Localization;
using Microsoft.Extensions.Options;
using System.Globalization;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services
.AddLocalization(options => options.ResourcesPath = "Resources");
builder.Services
.AddControllersWithViews()
.AddViewLocalization()
.AddDataAnnotationsLocalization();
builder.Services.Configure<RequestLocalizationOptions>(options =>
{
const string defaultCulture = "en-US";
var supportedCultures = new[]
{
new CultureInfo(defaultCulture),
new CultureInfo("es"),
new CultureInfo("vi"),
};
options.DefaultRequestCulture = new RequestCulture(defaultCulture);
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
});
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseRequestLocalization(app.Services.GetRequiredService<IOptions<RequestLocalizationOptions>>().Value);
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Localization}/{action=Index}/{id?}");
app.Run();
输出:
注意:请参考此官方文档并且您可以在此处下载或查看示例。