Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 本地化文件在MVC ASP.NET Core 2.2中无法有效呈现Razor页面_C#_Asp.net Core_Localization_Asp.net Core 2.2 - Fatal编程技术网

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;
    }

    //..
}