ASP.NET Core WebApi 實現本地化
阿新 • • 發佈:2020-09-01
1.在StartupConfigureServices
註冊本地化所需要的服務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("zh-cn");//設定系統預設語言 options.SupportedCultures= supportedCultures; options.SupportedUICultures = supportedCultures; options.RequestCultureProviders = new List<IRequestCultureProvider> { new RouteDataRequestCultureProvider() }; }); services.Configure<RouteOptions>(options => { options.ConstraintMap.Add("culture", typeof(LanguageRouteConstraint)); }); services.AddControllers().AddDataAnnotationsLocalization(options =>
{
//用於模型驗證
options.DataAnnotationLocalizerProvider = (type, factory) =>
factory.Create(typeof(SharedResource));
}); }
2.在Startup.cs類的Configure
方法中新增請求本地化中介軟體。
var localizeOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>(); app.UseRequestLocalization(localizeOptions.Value);
3.新增RouteDataRequestCultureProvider類,並繼承RequestCultureProvider
RequestCultureProvider
說明:它使用簡單的委託來確定當前的本地化區域性,當然我們還可以通過RequestCultureProvider
自定義源的請求區域資訊比如說配置檔案或者資料庫都是可以的.或者說我們可以選用預設的一些方式讓我們去獲取到當前區域.
public class RouteDataRequestCultureProvider : RequestCultureProvider
{
public override Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
{
//在這裡切換系統語言
//以下是通過Headers傳值來切換語言,你也可以通過路由、cookie、url傳值來切換
if (httpContext == null)
{
throw new ArgumentNullException(nameof(httpContext));
}
var listCulture = new List<string> { "zh-cn", "en-us" };
string culture = httpContext.Request.Headers["culture"].ToString() ?? "zh-cn";
string uiCulture = culture = listCulture.Contains(culture) ? culture : "zh-cn";
var providerResultCulture = new ProviderCultureResult(culture, uiCulture);
return Task.FromResult(providerResultCulture);
}
}
4.新增區域資原始檔 SharedResource.resx
5.測試,以下我是使用swagger測試
[Route("api/[controller]")] [ApiController] public class HomeController : BaseController { private readonly IStringLocalizer<SharedResource> localizer; public HomeController(IStringLocalizer<SharedResource> localizer) { this.localizer = localizer; } [HttpPost] [Route("Get")] public string Get() { return localizer["Birthday"]; } }
模型驗證本地化
1.新增UserInfo
public class UserInfo { /// <summary> /// 手機電話 /// </summary> [Display(Name = "MobilePhone")] [Required(ErrorMessage = "String1")] [StringLength(20)] public string MobilePhone { get; set; } }
2.新增測試方法
[HttpPost] [Route("Add")] public bool Add(UserInfo user) { return true; }
3.測試效果