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

【讨论】:

这对我有用,我编辑了项目文件并删除了 属性。 为了帮助您确定值无法解析的原因,您可以注入 IStringLocalizerFactory 并查看 _localizerCache 非公共成员。你可以看到它正在尝试加载什么资源。 这绝对是我的问题。我很想分享一个建议,“不要在项目名称中使用连字符 (-),因为它们在程序集中保持原样,但在命名空间中更改为下划线 (_)”!!【参考方案8】:

我正在使用面向 .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 敲除绑定不起作用

ASP.NET MVC 4 默认 _LoginPartial 模板注销不起作用

asp.net mvc 中的标记 <a> 在项目中不起作用,而在另一个项目中起作用

用于 asp.net 核心的 Service Fabric 中 docker 中的 HTTPS 不起作用