1. 程式人生 > 實用技巧 >ASP.NET Core WebApi 實現本地化

ASP.NET Core WebApi 實現本地化

1.在StartupConfigureServices註冊本地化所需要的服務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("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