ASP.NET Core Web APIのローカライズ(単一リソースファイル)

ASP.NET Core Web APIのローカライズ(単一リソースファイル)

マイクロソフトのデフォルトは、複数のリソースファイルに対応するクラスであり、使用はより面倒ですが、この記事では、単一のリソースファイルの使用方法、すなわち、プロジェクト全体のすべてのクラスが多言語リソースファイルのセットに対応しています。

最后更新 2022/06/22 22:37
HueiFeng
预计阅读 2 分钟
分类
ASP.NET Core
标签
.NET C# ASP.NET Core Web API ローカリゼーション。

在 Startup ConfigureServices 注册本地化所需要的服务AddLocalizationConfigure<RequestLocalizationOptions>

public void ConfigureServices(IServiceCollection services)
{
    services.AddLocalization();
    services.Configure<RequestLocalizationOptions>(options =>
    {
        var supportedCultures = new List<CultureInfo>
        {
            new CultureInfo("en-us"),
            new CultureInfo("zh-cn")
        };

        options.DefaultRequestCulture = new RequestCulture(culture: "en-us", uiCulture: "en-us");
        options.SupportedCultures = supportedCultures;
        options.SupportedUICultures = supportedCultures;
        options.RequestCultureProviders = new IRequestCultureProvider[] { new RouteDataRequestCultureProvider { IndexOfCulture = 1, IndexofUiCulture = 1 } };
    });
    services.Configure<RouteOptions>(options =>
    {
        options.ConstraintMap.Add("culture", typeof(LanguageRouteConstraint));
    });
    services.AddControllers();
}

在 Startup.cs 类的 Configure 方法中添加请求本地化中间件。

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

RequestCultureProvider 它使用简单的委托来确定当前的本地化区域性,当然我们还可以通过RequestCultureProvider自定义源的请求区域信息比如说配置文件或者数据库都是可以的.或者说我们可以选用默认的一些方式让我们去获取到当前区域.

ASP.NET Coreローカリゼーションには、実行中のリクエストの現在のロケールを決定する4つの方法があります。

  • QueryStringRequestCultureProvider
  • CookieRequestCultureProvider
  • AcceptLanguageHeaderRequestCultureProvider
  • CustomRequestCultureProvider

以下のように、ルーティング方式で現在のエリアを特定します

public class RouteDataRequestCultureProvider : RequestCultureProvider
{
    public int IndexOfCulture;
    public int IndexofUiCulture;

    public override Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
    {
        if (httpContext == null)
            throw new ArgumentNullException(nameof(httpContext));
        string uiCulture;

        string culture = uiCulture = httpContext.Request.Path.Value.Split('/')[IndexOfCulture];

        var providerResultCulture = new ProviderCultureResult(culture, uiCulture);

        return Task.FromResult(providerResultCulture);
    }
}

IRouteConstraintは以下のコードスニペットで実装されており、ルートに対応する制約を行います。

public class LanguageRouteConstraint : IRouteConstraint
{
    public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
    {

        if (!values.ContainsKey("culture"))
            return false;

        var culture = values["culture"].ToString();
        return culture == "en-us" || culture == "zh-cn";
    }
}

ゾーンリソースファイルの追加

[Route("{culture:culture}/[controller]")]
[ApiController]
public class HomeController : ControllerBase
{
    private readonly IStringLocalizer<Resource> localizer;
    public HomeController(IStringLocalizer<Resource> localizer)
    {
        this.localizer = localizer;
    }
    public string Get()
    {
        return localizer["Home"];
    }
}

Reference:https://github.com/hueifeng/BlogSample/tree/master/src/LocalizationSingleResx

Keep Exploring

延伸阅读

更多文章
同分类 / 同标签 2022/04/13

ASP.NET Core WebApiが結果を返す統一パッケージングプラクティス

WebApiの統一結果のリターンについては、より多くのステップを考えさせられました。第一に、統一形式のリターンをより良く制限する方法、第二に、結果のパッケージングがよりシンプルで強力でなければなりません。絶え間ない思考と改善の中で、最終的に予備的な結果があり、それを共有し、無限の思考を学ぶことは無限であり、あなたと一緒に働くことを願っています。

继续阅读