如何根据文化来阅读资源键和值

时间:2019-05-14 05:27:31

标签: c# asp.net-web-api asp.net-core localization

我正在处理本地化项目,试图从资源文件中读取值时卡在中间。

我已经完成了以下所有配置。

配置本地化:

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 :(得分:0)

您需要为多个类使用一个资源字符串,因此您需要创建一个空的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>

如果您仍有问题,请告诉我