ASP.NET Core WebAPI でローカリゼーションを実装する(単一リソースファイル)

ASP.NET Core WebAPI でローカリゼーションを実装する(単一リソースファイル)

Microsoft のデフォルトは、1 つのクラスに複数のリソースファイルを対応させる方法であり、使用がやや面倒です。本記事では、単一リソースファイルの使用方法を紹介します。つまり、プロジェクト全体のすべてのクラスが 1 セットの多言語リソースファイルに対応します。

最終更新 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"];
    }
}

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

さらに探索

関連読書

その他の記事
同じカテゴリ / 同じタグ 2022/04/13

ASP.NET Core WebApiの戻り結果統一包装の実践

WebApiの結果を統一して返す際に、より良い制限方法や、よりシンプルで強力な結果のラッピングについて考えるようになりました。絶えず考えを巡らせ改善する中で、ようやく初歩的な成果を得たので共有します。学びに終わりはなく、考えにも終わりはありません。皆様と共に励みたいと思います。

続きを読む