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.测试效果

 

 

 参考资料:https://www.cnblogs.com/netlock/p/13408376.html

posted @ 2020-09-01 11:40  优秀的代码搬运工zz  阅读(578)  评论(0编辑  收藏  举报