gpt4 book ai didi

c# - 本地化文件无法有效地在 MVC ASP.NET Core 2.2 中呈现 Razor 页面

转载 作者:太空狗 更新时间:2023-10-29 23:19:53 25 4
gpt4 key购买 nike

我的 Razor 页面看起来像这样。

@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
<h1>@Localizer["Index"]</h1>
...

我的 Startup.cs 包含以下内容。

public void ConfigureServices(IServiceCollection services)
{
...
services.AddLocalization(a => a.ResourcesPath = "/");

services.Configure<RequestLocalizationOptions>(a =>
{
CultureInfo[] supportedCultures = {
new CultureInfo("sv-SE"),
new CultureInfo("se")
};
a.DefaultRequestCulture = new RequestCulture("se");
a.SupportedCultures = supportedCultures;
a.SupportedUICultures = supportedCultures;
});
...
}

我直接在项目的根目录中放置了一个名为 Controllers.HomeController.se.resx 的文件。 Controller HomeController 包含注入(inject)。

public class HomeController : Controller
{
private readonly Context _context;
private readonly IStringLocalizer<HomeController> _localizer;

public HomeController(Context context, IStringLocalizer<HomeController> localizer)
{
_context = context;
_localizer = localizer;
}
...
}

应用程序没有崩溃但是重新生成的字符串是Index 而不是RESX 文件中的值。我试着关注 the docs尽可能接近,但显然我错过了一些东西。我需要帮助才能找到那是什么。

我在构造函数中设置了断点并检查了 _localizer["Index"] 的值。正如预期的那样,未找到文件的标志设置为 true。检查 SearchedLocation 的值给我 Web...Controllers.MemberController。我无法判断这三个点是否是项目根目录中 RESX 文件的正确点。我也在期待名字中的某处se

最佳答案

如果你想把你的资源文件放在项目的根目录下,你应该设置ResourcesPath如下

services.AddLocalization(a => a.ResourcesPath = ""); //empty string

使用此设置 SearchedLocation会给你Web.Controllers.MemberController指向Controllers.MemberController.resx文件在项目的根目录中。

要在 View 中使用本地化,您必须遵循 Views.{ControllerName}.{ViewName}.resx图案。例如,如果您有 HomeControllerAbout在其中查看你需要 Views.Home.About.resx文件以使用本地化。

搜索本地化文件时遵循的另一个约定资源阅读器是在各自的文件夹中搜索文件,而不是按点分隔的名称。例如,如果 ResourcesPath设置为 "Resources"以下变体是相同的

Resources.Views.Home.About.resx
Resources\Views.Home.About.resx
Resources\Views\Home.About.resx
Resources\Views\Home\About.resx

因此可以按文件夹构建本地化文件。

而且你没有指定你添加了app.UseRequestLocalization()在你的Startup.cs .如果您不这样做,您的应用程序将无法确定请求文化,并且它将始终指向默认资源文件。阅读更多 in the docs .

注意

有两种配置方式RequestLocalizationOptions对于请求本地化,通过 services.Configure<RequestLocalizationOptions>或将构造的选项对象(或委托(delegate))传递给 app.UseRequestLocalization .实际上,这些方法之间没有区别,它们在本地化中间件方面完全相同。但是如果在应用程序的任何时候你需要得到 RequestLocalizationOptions您将无法获得传递给 app.UseRequestLocalization 的值(value).但是很容易实现 services.Configure<RequestLocalizationOptions> (这是描述 in the docs 的一般方法)

public class HomeController : Controller
{
private readonly RequestLocalizationOptions _requestLocalizationOptions;

public HomeController(IOptions<RequestLocalizationOptions> options)
{
_requestLocalizationOptions = options.Value;
}

//..
}

关于c# - 本地化文件无法有效地在 MVC ASP.NET Core 2.2 中呈现 Razor 页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54679466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com