ASP.Net Core (.Net 7) 中的本地化根本不起作用

问题描述 投票:0回答:1

在观看了一些视频并阅读了一些博客之后,我发现自己在 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

但是,页面仅显示资源键文本。我单击“主页”但没有任何变化。我在浏览器中刷新页面,但没有任何变化。

我在这里缺少什么想法吗?

c# asp.net-core localization .net-7.0
1个回答
0
投票

但是,页面仅显示资源键文本。我点击主页 但没有任何改变。我在浏览器中刷新页面,但什么也没有 变化。

我在这里缺少什么想法吗?

根据您共享的代码和描述,我尝试使用您的代码片段、资源文件、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();

输出:

注意:参考此官方文档并且您可以在此处下载或查看示例。

© www.soinside.com 2019 - 2024. All rights reserved.