Arhn - архитектура программирования

ASP.NET Core Globalization and Localization - не загружает значение

Привет, я пытаюсь реализовать локализацию для ASP.NET Core, но я не могу вернуть переведенное значение - оно всегда возвращает значение «ключа» - «Загрузить». Когда я печатаю культуру - она ​​возвращает «fr», значит, культура установлена ​​правильно. Честно говоря, у меня нет идей ...

Я следую этому руководству: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization

Смотрим и на этот образец: https://github.com/aspnet/Entropy/tree/dev/samples/Localization.StarterWeb

Когда я создаю проект, файл ресурсов компилируется и копируется по адресу: obj / Debug / netcoreapp1.1 / BoilerPlate.Resources.Controllers.ValuesController.fr.resources

и

bin / Debug / netcoreapp1.1 / fr / BoilerPlate.resources.dll

$ dotnet --info
.NET Command Line Tools (1.0.0-rc3-004530)

Product Information:
 Version:            1.0.0-rc3-004530
 Commit SHA-1 hash:  0de3338607

Startup.cs

 public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddMvc();
        services.AddLocalization(options => options.ResourcesPath = "Resources");

        services.Configure<RequestLocalizationOptions>(options =>
       {
           var supportedCultures = new[]
           {
                new CultureInfo("fr"),
           };

           // State what the default culture for your application is. This will be used if no specific culture
           // can be determined for a given request.
           options.DefaultRequestCulture = new RequestCulture(culture: "fr", uiCulture: "fr");

           // You must explicitly state which cultures your application supports.
           // These are the cultures the app supports for formatting numbers, dates, etc.
           options.SupportedCultures = supportedCultures;

           // These are the cultures the app supports for UI strings, i.e. we have localized resources for.
           options.SupportedUICultures = supportedCultures;
       });
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

        app.UseStatusCodePages();
        app.UseDeveloperExceptionPage();

        var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
        app.UseRequestLocalization(locOptions.Value);

        app.UseMvc();
    }

ValuesController.cs

private readonly IStringLocalizer<ValuesController> _localizer;
        public ValuesController(IStringLocalizer<ValuesController> localizer)
        {
            _localizer = localizer;
        }

 // GET api/values/5
        [HttpGet("{id}")]
        public string Get(int id)
        {

            var rqf = Request.HttpContext.Features.Get<IRequestCultureFeature>();
            var culture = rqf.RequestCulture.Culture;
            System.Console.WriteLine($"Culture: {culture}");

            return _localizer["Load"];
            // return "value";
        }

Ресурсы / Controllers.ValuesController.fr.resx

...
  <data name="Load" xml:space="preserve">
    <value>Load this value!</value>
  </data>
...

Ответы:


1

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

Ресурсы ›Контроллеры› YourController.fr.resx

Ресурсы ›Просмотры› YourController ›YourView.fr.resx

Также пропустил services.AddMvc (). AddViewLocalization (); при запуске для локализации просмотров.

Редактировать

Я только что сделал тест с новым проектом. Вот Startup.cs:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddLocalization(options => options.ResourcesPath = "Resources");

        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        app.UseRequestLocalization(BuildLocalizationOptions());

        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

        app.UseMvc();
    }

    private RequestLocalizationOptions BuildLocalizationOptions()
    {
        var supportedCultures = new List<CultureInfo>
        {
            new CultureInfo("fr")
        };

        var options = new RequestLocalizationOptions
        {
            DefaultRequestCulture = new RequestCulture("fr"),
            SupportedCultures = supportedCultures,
            SupportedUICultures = supportedCultures
        };

        // this will force the culture to be fr. 
        // It must be changed to allow multiple cultures, but you can use to test now
        options.RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(context =>
        {
            var result = new ProviderCultureResult("fr", "fr");

            return Task.FromResult(result);
        }));

        return options;
    }

Надеюсь, это тебе поможет.

С уважением,

08.03.2017
  • Привет @Tiago Я пробовал обе структуры. Согласно документации, мы можем использовать эту структуру: имя ресурса Точка или имя пути Resources / Controllers.HomeController.fr.resx Dot Resources / Controllers / HomeController.fr.resx Путь, и я не использую представления. Я просто возвращаю ответ от контроллера. Это WebAPI - представления не используются. 08.03.2017
  • @PetarIvanov, я обновил свой ответ на основе нового проекта, который я только что создал. Это сработало. Я просто хотел бы добавить, что я тестировал, используя структуру папок моего ответа. 08.03.2017
  • Странная вещь ... Я создал новый проект в Windows, скопировал / вставил свой код, и он заработал. Отправьте только что созданный проект на машину * nix, запустите его, и он заработает. С тех пор заработал и мой старый код. Единственная разница - это ссылка на то, что VS2017 добавляет в файл csproj: ‹ItemGroup› ‹DotNetCliToolReference Include = Microsoft.VisualStudio.Web.CodeGeneration.Tools Version = 1.0.0 /› ‹/ItemGroup› ‹ItemGroup› ‹Обновление встроенного ресурса = Ресурсы \ Контроллеры \ ValuesController.fr.resx ›‹Generator› ResXFileCodeGenerator ‹/Generator›‹ / EmbeddedResou ... 08.03.2017
  • Мне интересно, была ли решена эта проблема, потому что я подозреваю, что это тоже моя проблема. stackoverflow.com/questions/54914990 / 28.02.2019
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..