ASP.Net 核心 MVC 中的本地化不起作用 - 无法找到资源文件
Posted
技术标签:
【中文标题】ASP.Net 核心 MVC 中的本地化不起作用 - 无法找到资源文件【英文标题】:Localization in ASP.Net core MVC not working - unable to locate resource file 【发布时间】:2017-01-01 03:40:35 【问题描述】:在尝试本地化我的应用程序时,我已按照以下步骤操作: https://docs.asp.net/en/latest/fundamentals/localization.html
这是我的代码:
Startup.cs
public List<IRequestCultureProvider> RequestCultureProviders get; private set;
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
services.AddLocalization(options => options.ResourcesPath = "Resources");
services.AddMvc()
.AddViewLocalization(options => options.ResourcesPath = "Resources")
.AddDataAnnotationsLocalization();
services.AddOptions();
services.AddTransient<IViewRenderingService, ViewRenderingService>();
services.AddTransient<IEmailSender, EmailSender>();
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
app.UseRequestLocalization(locOptions.Value);
app.UseStaticFiles();
app.UseFileServer(new FileServerOptions()
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory())),
EnableDirectoryBrowsing = true
);
var supportedCultures = new[]
new CultureInfo("en-US"),
new CultureInfo("fr"),
;
app.UseRequestLocalization(new RequestLocalizationOptions
DefaultRequestCulture = new RequestCulture("fr"),
// Formatting numbers, dates, etc.
SupportedCultures = supportedCultures,
// UI strings that we have localized.
SupportedUICultures = supportedCultures,
RequestCultureProviders = new List<IRequestCultureProvider>
new QueryStringRequestCultureProvider
QueryStringKey = "culture",
UIQueryStringKey = "ui-culture"
);
MyController.cs
public class MyController : Controller
private readonly IViewRenderingService _viewRenderingService;
private IStringLocalizer<MyController> _localizer;
private MyOptions _options;
//Constructor for dependency injection principle
public MyController(IViewRenderingService viewRenderingService, IStringLocalizer<MyController> localizer, IOptions<MyOptions> options)
_viewRenderingService = viewRenderingService;
_localizer = localizer;
_options = options.Value;
[HttpGet]
public string Get()
// _localizer["Name"]
return _localizer["Product"];
*.resx
文件存储在 Resources
文件夹中,名称为 Controllers.MyController.fr.resx
(其中有一个“产品”条目)。
但是,它无法找到资源文件,并且永远不会以法语返回“产品”。我使用的是查询字符串,所以这里是查询字符串:
localhost:3333/my?culture=fr
同样在视图中,@Localizer["Product"]
返回“产品”。
谁能帮我找出缺少的东西?
编辑:
经过一番调查,我发现文化正在发生变化,但是无法找到资源文件。我正在使用VS2015。谁能帮忙?
【问题讨论】:
法国的文化字符串是fr-FR
@JK。结果还是一样,如果你检查我提供的链接,他们也只使用了“fr”文化。
你找出问题所在了吗?
【参考方案1】:
我有类似的问题。比我发现的 我的项目中缺少“Localization.AspNetCore.TagHelpers” nuget 包。 看起来它是 QueryStringRequestCultureProvider 的必需包。
【讨论】:
感谢这个undocumented步骤! 在 asp.net 核心本地化的 msdn 文档中没有很好地记录和明确这样的事情!!! 让我难过很久 - 阅读/观看了很多教程,没有提及这一点。然后找到了这个评论,添加了这个包,一切正常。谢谢。 仅供参考,您确实意识到包Localization.AspNetCore.TagHelprs
不是来自Microsoft,对吗?当然它没有记录,也不是官方的。
对我来说是 NuGet 包Microsoft.Extensions.Localization
。【参考方案2】:
您需要从nuget
添加这些引用:
Microsoft.Extensions.Localization
还有Localization.AspNetCore.TagHelpers
可以成为一个很好的标签助手,而不是每次都将本地化内容注入视图
【讨论】:
【参考方案3】:默认情况下,Visual Studio IDE 会解析程序集引用,但它需要 Microsoft.Extensions.Localization 和 Microsoft.Extensions.Localization.Abstractions NuGet。一旦我将它们添加到项目引用中,资源定位器就能够找到资源文件!
【讨论】:
【参考方案4】:对我来说,项目文件夹的名称与根命名空间不同是个问题!核心 3.0。
【讨论】:
几个小时后,我身边出现了类似的问题!项目名称以数字开头,命名空间自动分配“_”作为前缀,但本地化不起作用。并且所有路径都是正确的(也在调试中检查)。核心 2.2【参考方案5】:我在 .net core 2.2 中遇到了同样的问题 我在调试器中看到属性 SearchedLocation
所以,我首先创建了没有语言扩展名的文件 Controllers.HomesController.rsx 并使用访问修饰符“Public”来访问该属性
使用 localizer["Property] 我找到了很好的价值。
在我创建了 Controllers.HomeController.fr.resx 之后,他发现了 url 中文化的良好价值。
【讨论】:
【参考方案6】:我遇到了同样的问题,我通过删除内置提供程序来修复它,以便能够使用默认的请求文化。 为此,您需要将此代码添加到您的服务中。在启动类中配置:
options.RequestCultureProviders = new List<IRequestCultureProvider>
new QueryStringRequestCultureProvider(),
new CookieRequestCultureProvider()
;
请查看其他答案: ASP .NET Core default language is always English
【讨论】:
【参考方案7】:如果程序集的根命名空间不同于程序集名称:
默认情况下本地化不起作用。 由于在程序集中搜索资源的方式,本地化失败。 RootNamespace 是一个构建时值,对执行进程不可用。
如果 RootNamespace 与 AssemblyName 不同,则在 AssemblyInfo.cs 中包含以下内容(将参数值替换为实际值):
using System.Reflection;
using Microsoft.Extensions.Localization;
[assembly: ResourceLocation("Resource Folder Name")]
[assembly: RootNamespace("App Root Namespace")]
More info here
【讨论】:
这对我有用,我编辑了项目文件并删除了我正在使用面向 .NET Core 2.1 的 VS 2017,在我的情况下,项目文件 (.csproj) 包含一些奇怪的 ItemGroup 标签,如下所示:
<ItemGroup>
<EmbeddedResource Remove="Resources\Controllers.HomeController.sv.resx" />
...
</ItemGroup>
<ItemGroup>
<None Include="Resources\Controllers.HomeController.sv.resx" />
...
</ItemGroup>
当我删除它开始工作的行时。
我之前一直在尝试添加和删除资源文件,这样可能会导致项目组出现,但奇怪的是 Visual Studio 插入了这些行。好像是个bug。
【讨论】:
【参考方案9】:我通过将 resx 资源文件的构建操作设置为“嵌入式资源”来解决它
【讨论】:
【参考方案10】:您只需使用以下命令在您的项目中添加“Localization.AspNetCore.TagHelpers”NuGet 包
Install-Package Localization.AspNetCore.TagHelpers -Version 0.6.0
希望能解决你的问题
【讨论】:
【参考方案11】:就我而言,问题在于我指定的是:
services.AddLocalization(options => options.ResourcesPath = "Resources");
和:
options.DataAnnotationLocalizerProvider = (type, factory) =>
factory.Create(typeof(DataAnnotations));
我的 DataAnnotations.resx 资源文件也位于“资源”命名空间下。这导致本地化程序在“MyApp.Resources.Resources.DataAnnotations”而不是“MyApp.Resources.DataAnnotations”中搜索字符串。
将第一行改为:
services.AddLocalization();
帮助解决了问题。
【讨论】:
【参考方案12】:就我而言,我实际上错过了ResourcesPath
的显式设置:
services.AddLocalization(options => options.ResourcesPath = "Resources");
【讨论】:
【参考方案13】:我花了一个小时试图弄清楚这一点,结果(就我而言)我没有将资源文件的访问修饰符设置为public
。公开后效果很好。
可能值得重新检查一下,以确保您不会白白浪费一个小时进行调试;)
【讨论】:
【参考方案14】:我对这个问题的解决方案是重命名生成的资源代码命名空间,例如:
来自
命名空间 ProjectName.Resources 到 命名空间项目名称
它对我有用。
【讨论】:
以上是关于ASP.Net 核心 MVC 中的本地化不起作用 - 无法找到资源文件的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET MVC Core 和实体框架中的 ToListAsync 不起作用
Grid中的kendoui ClientTemplate在asp.net mvc 4中不起作用
ASP.NET MVC 4 默认 _LoginPartial 模板注销不起作用