Как читать Ресурсный ключ и ценности на основе культуры - PullRequest
0 голосов
/ 14 мая 2019

Я работаю над проектом локализации и застрял в середине при попытке прочитать значения из файла ресурсов.

Я выполнил все конфигурации, как показано ниже.

Настройка локализации:

var supportedCultures = new List<CultureInfo>
        {
            new CultureInfo("en-US"),
            new CultureInfo("de-DE"),
            new CultureInfo("fr-FR")
        };
        services.Configure<RequestLocalizationOptions>(options =>
        {
            options.DefaultRequestCulture = new RequestCulture(supportedCultures[0]);
            options.SupportedCultures = supportedCultures;
            options.RequestCultureProviders.Insert(0, new CustomerCultureProvider());
        })

Настройка промежуточного программного обеспечения ASP.NET Core

app.UseRequestLocalization();

Поставщик пользовательского языка для обработки запросов

public class CustomerCultureProvider : RequestCultureProvider
{
    public override async Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
    {
        await Task.Yield();

        return new ProviderCultureResult("de-DE");
    }
}

Ниже приведена структура моего проекта:

enter image description here

Я пытаюсь прочитать ключ ресурса "Имя" в конечной точке API, как показано ниже:

[HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        var name = Employees.Name;
        return new string[] { name };
    }

Если я установлю de-DF культуры, я должен получить переведенный на немецкий язык текст, но он не дает ожидаемого результата.

Мой вопрос, как мы можем получить ключи на основе культуры, которую мы установили взапускать?и Как я могу установить путь к ресурсам в качестве файлов ресурсов в другом проекте?

1 Ответ

0 голосов
/ 14 мая 2019

Вам нужно использовать одну строку ресурсов для нескольких классов, поэтому вам нужно создать пустой класс SharedResource, а затем зарегистрироваться в Startup.cs следующим образом:

services.AddLocalization(options => options.ResourcesPath = "Resources");
services.AddMvc()
        .AddDataAnnotationsLocalization(options => {
            options.DataAnnotationLocalizerProvider = (type, factory) =>
                factory.Create(typeof(SharedResource));
        });

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

    options.DefaultRequestCulture = new RequestCulture(culture: enUSCulture, uiCulture: enUSCulture);
    options.SupportedCultures = supportedCultures;
    options.SupportedUICultures = supportedCultures;

    options.RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(async context =>
    {
        // My custom request culture logic
        return new ProviderCultureResult("en");
    }));
});

Затем вам нужно внедрить IViewLocalizer в ваше представление следующим образом

@using Microsoft.AspNetCore.Builder
@using Microsoft.AspNetCore.Http.Features
@using Microsoft.AspNetCore.Localization
@using Microsoft.AspNetCore.Mvc.Localization
@using Microsoft.Extensions.Options

@inject IViewLocalizer Localizer // here
@inject IOptions<RequestLocalizationOptions> LocOptions

@{
    var requestCulture = Context.Features.Get<IRequestCultureFeature>();
    var cultureItems = LocOptions.Value.SupportedUICultures
        .Select(c => new SelectListItem { Value = c.Name, Text = c.DisplayName })
        .ToList();
    var returnUrl = string.IsNullOrEmpty(Context.Request.Path) ? "~/" : $"~{Context.Request.Path.Value}";
}

<div title="@Localizer["Request culture provider:"] @requestCulture?.Provider?.GetType().Name">
    <form id="selectLanguage" asp-controller="Home" 
          asp-action="SetLanguage" asp-route-returnUrl="@returnUrl" 
          method="post" class="form-horizontal" role="form">
        <label asp-for="@requestCulture.RequestCulture.UICulture.Name">@Localizer["Language:"]</label> <select name="culture"
          onchange="this.form.submit();"
          asp-for="@requestCulture.RequestCulture.UICulture.Name" asp-items="cultureItems">
        </select>
    </form>
</div>

Пожалуйста, дайте мне знать, если у вас все еще есть проблемы

...