Startup ConfigureServices でローカライゼーションに必要なサービス AddLocalization と Configure<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