预期目标:https://myweb.com/zh-CN/api/post、https://myweb.com/en-US/api/post
即通过地址实现多语言切换。
在startup.cs中配置:
1 public void Configure(IApplicationBuilder app, IWebHostEnvironment env) 2 { 3 if (env.IsDevelopment()) 4 { 5 app.UseDeveloperExceptionPage(); 6 } 7 8 app.UseHttpsRedirection(); 9 10 app.UseRouting(); 11 12 app.UseAuthorization(); 13 14 app.UseStaticFiles(); 15 16 CultureInfo[] supportedCultures = new[] 17 { 18 new CultureInfo("en"), 19 new CultureInfo("zh-CN") 20 }; 21 22 var options = new RequestLocalizationOptions(); 23 options.DefaultRequestCulture = new RequestCulture("en"); 24 options.SupportedCultures = supportedCultures; 25 options.SupportedUICultures = supportedCultures; 26 27 options.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider { Options = options }); 28 29 app.UseRequestLocalization(options);//一定要放在这个位置 30 31 app.UseEndpoints(endpoints => 32 { 33 //endpoints.MapControllers(); 34 endpoints.MapControllerRoute(name: "default", pattern: "~/{culture}/{controller}/{action}"); 35 }); 36 }
采用MapControllerRoute配置路由则无需再为controler及其action配置属性路由,controler及其action会自动根据MapControllerRoute配置的共享路由配置自己的路由。如果仍然给controler及其action配置了属性路由,则系统则以ontroler及其action的属性路由为准。换句话说,MapControllerRoute配置的路由是共享路由,controler及其action配置的路由是针对单个controler及其action的个性化路由。个性化路由优先于共享路由。
RouteDataRequestCultureProvider是实现地址栏多语言切换的重要类,配合endpoints.MapControllerRoute的{culture}参数设置即可实现目标,它会根据路由规则自动读取地址栏对应的culture值设置为当前的cultureInfo。
上面的代码通过下面的方式修改,可以达到相同效果。
把16行到27行的代码定义到ConfigureServices(IServiceCollection services)方法中:
1 public void ConfigureServices(IServiceCollection services) 2 { 3 CultureInfo[] supportedCultures = new[] 4 { 5 new CultureInfo("en"), 6 new CultureInfo("zh-CN") 7 }; 8 9 services.Configure<RequestLocalizationOptions>(options => 10 { 11 options.DefaultRequestCulture = new RequestCulture("en"); 12 options.SupportedCultures = supportedCultures; 13 options.SupportedUICultures = supportedCultures; 14 15 options.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider { Options = options }); 16 }); 17 18 19 services.AddControllers(); 20 }
然后把第一段代码的16到29行改为:
app.UseRequestLocalization();
即可。效果是一样的!