风中灵药
我的眼泪划伤了夜,那么的脆弱...

预期目标: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();

即可。效果是一样的!

posted on 2021-11-08 22:12  风中灵药  阅读(350)  评论(0编辑  收藏  举报