C# 本地化文件在MVC ASP.NET Core 2.2中无法有效呈现Razor页面
我的剃须刀页面看起来像这样C# 本地化文件在MVC ASP.NET Core 2.2中无法有效呈现Razor页面,c#,asp.net-core,localization,asp.net-core-2.2,C#,Asp.net Core,Localization,Asp.net Core 2.2,我的剃须刀页面看起来像这样 @using Microsoft.AspNetCore.Mvc.Localization @inject IViewLocalizer Localizer <h1>@Localizer["Index"]</h1> ... @使用Microsoft.AspNetCore.Mvc.Localization @注入IViewLocalizer定位器 @定位器[“索引”] ... My Startup.cs包含以下内容 public void Co
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
<h1>@Localizer["Index"]</h1>
...
@使用Microsoft.AspNetCore.Mvc.Localization
@注入IViewLocalizer定位器
@定位器[“索引”]
...
My 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;
});
...
}
public void配置服务(IServiceCollection服务)
{
...
services.AddLocalization(a=>a.ResourcesPath=“/”;
services.Configure(a=>
{
CultureInfo[]支持的文化={
新文化信息(“sv SE”),
新文化信息(“se”)
};
a、 DefaultRequestCulture=新的RequestCulture(“se”);
a、 支持的文化=支持的文化;
a、 支持教育=支持文化;
});
...
}
我将名为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;
}
...
}
公共类HomeController:控制器
{
私有只读上下文\u上下文;
专用只读IStringLocalizer\u localizer;
公共HomeController(上下文上下文,IStringLocalizer)
{
_上下文=上下文;
_定位器=定位器;
}
...
}
应用程序不会崩溃,但重新排序的字符串是索引,而不是RESX文件中的值。我试着尽可能地跟踪,但显然我错过了什么。我需要帮助找到那是什么
我在构造函数中中断并检查了_localizer[“Index”]的值。正如预期的那样,未找到文件的标志设置为true。检查SearchedLocation的值会为我提供Web…Controllers.MemberController。我不知道这三个点是否是项目根目录中RESX文件的正确点。我也希望se出现在名称中的某个位置。如果您想将资源文件放在项目的根目录中,您应该设置
ResourcesPath
,如下所示
services.AddLocalization(a => a.ResourcesPath = ""); //empty string
使用此设置,SearchedLocation
将为您提供指向项目根目录中的Controllers.MemberController.resx
文件的Web.Controllers.MemberController
要在视图中使用本地化,您必须遵循视图{ControllerName}.{ViewName}.resx
模式。例如,如果您有HomeController
和About
视图,则需要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
因此,可以通过文件夹来构造本地化文件
您没有指定在Startup.cs
中添加了app.UseRequestLocalization()
。如果您不这样做,您的应用程序将无法确定请求区域性,并且它将始终指向默认资源文件。阅读更多
注意
有两种方法可以通过服务为请求本地化配置RequestLocalizationOptions
。配置或将构造的选项对象(或委托)传递给app.UseRequestLocalization
。实际上,这些方法之间没有区别,它们在本地化中间件方面完全相同。但是,如果在应用程序的任何一点上,您需要获取RequestLocalizationOptions
,则无法获取传递给app.UseRequestLocalization
的值。但是使用服务很容易。配置(描述了一般方法)
公共类HomeController:控制器
{
私有只读RequestLocalizationOptions _RequestLocalizationOptions;
公共家庭控制器(IOPS选项)
{
_requestLocalizationOptions=options.Value;
}
//..
}
你的赏金会在23小时59分钟后到来,伙计。该网站不会让我现在就提供它。抱歉。如果没有指定其他内容,那么默认的资源文件是什么?如果我注入IStringLocalization,它会指向Lang.resx,而没有语言代码吗?@donkeybananano,它会指向Lang.resx,而语言代码对应于请求区域性。您可以通过在您获得奖金的地址中添加?culture=sv SE
来测试不同的文化。我差点忘了。这么提醒是件好事。话虽如此,这个问题当然得到了回答,但我想知道你是否有一个在行话之间切换的好方法的快速提示。目前,我已将默认语言设置为sv,它可以充分工作。然而,迟早,我希望能够进步,能够选择语言。在菜单中,我可以添加一个切换器,这样GUI部分就不成问题了。但是,更改正在使用的RESX和编写所选行话的故事等业务逻辑是我担心做出错误选择的领域。@Donkeybana最简单的方法是使用cookie本地化。创建接受区域性作为字符串的操作,从中创建RequestCulture
,然后通过使用CookieRequestCultureProvider.MakeCookieValue
和键CookieRequestCultureProvider.DefaultCookieName
生成cookie值来设置响应cookie。当您设置cookie时,它将在后续请求中使用,因此可以说它将被“存储”。若您确实希望在datase中存储用户区域性,那个么您需要实现自己的RequestCultureProvider
,以按当前用户从数据库中获取区域性。希望能有帮助。
public class HomeController : Controller
{
private readonly RequestLocalizationOptions _requestLocalizationOptions;
public HomeController(IOptions<RequestLocalizationOptions> options)
{
_requestLocalizationOptions = options.Value;
}
//..
}