本地化文件无法有效地在 MVC ASP.NET Core 2.2 中呈现 Razor 页面
Localization file not effective rendering a Razor page in MVC ASP.NET Core 2.2
我的 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 的文件。控制器 HomeController 包含注入。
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
文件。
要在视图中使用本地化,您必须遵循 Views.{ControllerName}.{ViewName}.resx
模式。例如,如果您有 HomeController
和 About
视图,您需要有 Views.Home.About.resx
文件才能使用本地化。
另一个约定资源 reader 在搜索本地化文件时会在各自的文件夹中搜索文件,而不是按点分隔的名称。例如,如果 ResourcesPath
设置为 "Resources"
,则以下变体相等
Resources.Views.Home.About.resx
Resources\Views.Home.About.resx
Resources\Views\Home.About.resx
Resources\Views\Home\About.resx
因此可以按文件夹构建本地化文件。
并且您没有指定在 Startup.cs
中添加了 app.UseRequestLocalization()
。如果您不这样做,您的应用程序将无法确定请求文化,并且它将始终指向默认资源文件。阅读更多 in the docs.
备注
有两种配置 RequestLocalizationOptions
请求本地化的方法,通过 services.Configure<RequestLocalizationOptions>
或将构造的选项对象(或委托)传递给 app.UseRequestLocalization
。实际上,这些方法之间没有区别,它们在本地化中间件方面完全相同。但是,如果在应用程序的任何时候您需要获取 RequestLocalizationOptions
,您将无法获取传递给 app.UseRequestLocalization
的值。但是用 services.Configure<RequestLocalizationOptions>
很容易实现(这是描述的一般方法 in the docs)
public class HomeController : Controller
{
private readonly RequestLocalizationOptions _requestLocalizationOptions;
public HomeController(IOptions<RequestLocalizationOptions> options)
{
_requestLocalizationOptions = options.Value;
}
//..
}
我的 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 的文件。控制器 HomeController 包含注入。
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
文件。
要在视图中使用本地化,您必须遵循 Views.{ControllerName}.{ViewName}.resx
模式。例如,如果您有 HomeController
和 About
视图,您需要有 Views.Home.About.resx
文件才能使用本地化。
另一个约定资源 reader 在搜索本地化文件时会在各自的文件夹中搜索文件,而不是按点分隔的名称。例如,如果 ResourcesPath
设置为 "Resources"
,则以下变体相等
Resources.Views.Home.About.resx
Resources\Views.Home.About.resx
Resources\Views\Home.About.resx
Resources\Views\Home\About.resx
因此可以按文件夹构建本地化文件。
并且您没有指定在 Startup.cs
中添加了 app.UseRequestLocalization()
。如果您不这样做,您的应用程序将无法确定请求文化,并且它将始终指向默认资源文件。阅读更多 in the docs.
备注
有两种配置 RequestLocalizationOptions
请求本地化的方法,通过 services.Configure<RequestLocalizationOptions>
或将构造的选项对象(或委托)传递给 app.UseRequestLocalization
。实际上,这些方法之间没有区别,它们在本地化中间件方面完全相同。但是,如果在应用程序的任何时候您需要获取 RequestLocalizationOptions
,您将无法获取传递给 app.UseRequestLocalization
的值。但是用 services.Configure<RequestLocalizationOptions>
很容易实现(这是描述的一般方法 in the docs)
public class HomeController : Controller
{
private readonly RequestLocalizationOptions _requestLocalizationOptions;
public HomeController(IOptions<RequestLocalizationOptions> options)
{
_requestLocalizationOptions = options.Value;
}
//..
}