ASP.NET Core WebApi 实现本地化
1.在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("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.测试效果