ASP.Net核心MVC中的本地化无法正常工作 - 无法找到资源文件

时间:2016-08-24 20:55:17

标签: c# asp.net-core asp.net-core-mvc globalization

在尝试本地化我的应用程序时,我已按照此处的步骤操作: 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(其中包含&#34条;产品&#34;)。

然而,它无法找到资源文件,并且&#34;产品&#34;永远不会用法语返回。我正在使用查询字符串,所以这里是查询字符串:

localhost:3333/my?culture=fr

同样在视图中,@Localizer["Product"]返回&#34;产品&#34;。

任何人都可以帮我找到丢失的东西吗?

修改

经过一番调查后,我发现文化正在发生变化,但无法找到资源文件。我正在使用VS2015。有人可以帮忙吗?

14 个答案:

答案 0 :(得分:27)

我有类似的问题。比我想通了 我的项目中缺少“ Localization.AspNetCore.TagHelpers ”nuget packag。 它看起来像是QueryStringRequestCultureProvider的必需包。

答案 1 :(得分:3)

我通过将resx资源文件的构建操作设置为“嵌入式资源”解决了该问题 enter image description here

答案 2 :(得分:1)

您需要从nuget添加以下引用:

Microsoft.Extensions.Localization

还有Localization.AspNetCore.TagHelpers可能是一个很好的标签帮助者,而不是每次都将本地化内容注入视图中

答案 3 :(得分:1)

在我的情况下,问题是我在指定:

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();

帮助解决了这个问题。

答案 4 :(得分:0)

默认情况下,Visual Studio IDE解析程序集引用,但需要Microsoft.Extensions.Localization和Microsoft.Extensions.Localization.Abstractions NuGets。将它们添加到项目参考中后,资源定位器便可以找到资源文件!

答案 5 :(得分:0)

对我来说,项目文件夹的名称与根名称空间不同是一个问题!核心3.0。

答案 6 :(得分:0)

.net core 2.2中存在相同的问题 我在调试器中看到属性SearchedLocation enter image description here

因此,我首先创建了不带语言扩展名的Controllers.HomesController.rsx文件,并使用了访问修饰符“ Public”来访问该属性 enter image description here

并使用localizer [“ Property],我发现了很好的值。

创建了Controllers.HomeController.fr.resx之后,他发现URL中的文化具有很好的价值。

答案 7 :(得分:0)

我遇到了同样的问题,并通过删除内置提供程序来解决此问题,以便能够使用默认的请求区域性。 为此,您需要将此代码添加到服务中。在启动类中进行配置:

    options.RequestCultureProviders = new List<IRequestCultureProvider>
    {
        new QueryStringRequestCultureProvider(),
        new CookieRequestCultureProvider()
    }; 

请查看以下其他答案: ASP .NET Core default language is always English

答案 8 :(得分:0)

如果程序集的根名称空间与程序集名称不同:

默认情况下,本地化无效。 由于在程序集中搜索资源的方式,本地化失败。 RootNamespace是一个构建时值,不适用于执行过程。

如果RootNamespace与AssemblyName不同,请在AssemblyInfo.cs中添加以下内容(用实际值替换参数值):

 subject_id     time_1         val
0   1   2173-04-03 12:35:00     5
1   1   2173-04-04 11:30:00     5
2   1   2173-04-05 16:00:00     5
5   1   2173-04-06 04:00:00     3

More info here

答案 9 :(得分:0)

我正在使用针对.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完全插入了这些行。好像是个错误。

答案 10 :(得分:0)

您只需使用以下命令在项目中添加“ Localization.AspNetCore.TagHelpers” NuGet程序包

Install-Package Localization.AspNetCore.TagHelpers -Version 0.6.0

我希望它能解决您的问题

答案 11 :(得分:0)

就我而言,我实际上缺少ResourcesPath的显式设置:

services.AddLocalization(options => options.ResourcesPath = "Resources");

答案 12 :(得分:0)

我花了一个小时试图找出答案,但事实证明(对于我而言)我没有将资源文件的访问修饰符设置为public。公开发布后,效果很好。 enter image description here

可能值得一试再进行一次检查,以确保您一个小时都不会白手起家;)

答案 13 :(得分:-1)

我对这个问题的解决方案是重命名生成的资源代码命名空间,例如:

来自

命名空间 ProjectName.Resources 到 命名空间项目名称

它对我有用。