Локализация в ASP.Net core MVC не работает - невозможно найти файл ресурсов

Пытаясь локализовать свое приложение, я выполнил следующие действия: 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 (в нем есть запись для "Product").

Тем не менее, он не может найти файл ресурсов, и "Продукт" никогда не возвращается на французском языке. Я использую строку запроса, поэтому вот строка запроса:

localhost:3333/my?culture=fr

Также в представлении @Localizer["Product"] возвращает "Product".

Может кто-нибудь, пожалуйста, помогите мне найти то, что пропало?

РЕДАКТИРОВАТЬ:

После некоторого исследования я обнаружил, что культура меняется, но он не может найти файл ресурсов. Я использую VS2015. кто-нибудь может помочь?

Ответ 1

У меня была аналогичная проблема. Чем я понял, что " Localization.AspNetCore.TagHelpers" nuget packag отсутствовал в моем проекте. Похоже, это необходимый пакет для QueryStringRequestCultureProvider.

Ответ 2

Вам нужно добавить эти ссылки из nuget:

Microsoft.Extensions.Localization

а также Localization.AspNetCore.TagHelpers может быть хорошим помощником по тегам вместо того, чтобы каждый раз вводить материалы локализации в представления

Ответ 3

Для меня было проблемой, что имя папки проекта отличалось от корневого пространства имен! Core 3.0.

Ответ 4

По умолчанию Visual Studio IDE разрешает ссылки на сборки, но для этого требуются NuGets Microsoft.Extensions.Localization и Microsoft.Extensions.Localization.Abstractions. После того, как я добавил их в ссылку на проект, локатор ресурсов может найти файлы ресурсов!

Ответ 5

У меня была такая же проблема в .net core 2.2. Я вижу в отладчике свойства SearchedLocation enter image description here

Итак, я сначала создал файлы Controllers.HomesController.rsx без расширения языка с модификатором доступа "Public" для доступа к свойству enter image description here

и с помощью localizer ["Property] я нашел значение goood.

После того как я создал Controllers.HomeController.fr.resx, и он нашел хорошее значение с культурой в URL.

Ответ 6

У меня была та же проблема, и я исправил ее, удалив встроенных поставщиков, чтобы можно было использовать культуру запросов по умолчанию. Для этого вам нужно добавить этот код в ваши службы. Настройте в классе запуска:

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

Пожалуйста, посмотрите на этот другой ответ: Язык ASP.NET Core по умолчанию всегда английский

Ответ 7

Если корневое пространство имен сборки отличается от имени сборки:

Локализация не работает по умолчанию. Сбой локализации из-за способа поиска ресурсов в сборке. RootNamespace - это значение времени сборки, которое недоступно для выполняющегося процесса.

Если RootNamespace отличается от AssemblyName, включите в AssemblyInfo.cs следующее (значения параметров заменены фактическими значениями):

using System.Reflection;
using Microsoft.Extensions.Localization;

[assembly: ResourceLocation("Resource Folder Name")]
[assembly: RootNamespace("App Root Namespace")]

Подробнее здесь

Ответ 8

Я использую VS 2017 с таргетингом на .NET Core 2.1, и в моем случае файл проекта (.csproj) содержал несколько странных тегов ItemGroup, например:

<ItemGroup>
    <EmbeddedResource Remove="Resources\Controllers.HomeController.sv.resx" />
    ...
</ItemGroup>
<ItemGroup>
    <None Include="Resources\Controllers.HomeController.sv.resx" />
    ...
</ItemGroup>

Когда я удалил строки, он начал работать.

Ранее я экспериментировал с добавлением и удалением файлов ресурсов, что могло вызвать появление групп элементов, но странно, что Visual Studio вообще вставила эти строки. Похоже, ошибка.