news 2026/7/4 7:33:29

Hello Web API系列教程——Web API与国际化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Hello Web API系列教程——Web API与国际化

在.net平台中,软件的国际化主要依靠工作线程的国际化来完成。在.net框架的的处理线程中,我们通过设置Thread.CurrentCulture属性来实现对日期、时间、数字、货币值、文本的排序顺序,负载约定和字符串比较的默认值的格式确定,默认情况下,这个属性来自于“控制面板”的“区域和语言选项”中的用户区域性。当然,在软件运行过程中也可以通过手动的方式强制改变Thread.CurrentCulture属性值。CurrentUICulture属性则用来确定需要向用户呈现的资源格式,它对软件的操作界面来说最有用,因为它标识了在显示UI元素时应使用的语言。在.net中通常给软件设置不同的UI资源文件,使得软件运行时通过CurrentUICulture属性值来选择不同语言的资源文件渲染软件界面。线程的CurrentUICulture 和 CurrentCulture 属性一般设置为同一个CultureInfo对象,也就是就他它使用相同的语言、国家信息,然而也可将它们设为不同的对象。例如一个美国人在北京借用了一台操作系统是简体中文版的计算机进行工作时,就可以通过这种方式让软件满足美国用户的使用需求。

下面的例子解释了对于不同的Thread.CurrentCulture属性值,同一个日期字符串转换为日期类型时会生成不同结果

1 static void Main(string[] args) 2 { 3 string birthdate = "02/06/2013"; 4 DateTime dateTime; 5 dateTime = DateTime.Parse(birthdate); 6 Console.WriteLine(dateTime.ToString("yyyy年MM月dd日")); 7 Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-GB"); 8 dateTime = DateTime.Parse(birthdate); 9 Console.WriteLine(dateTime.ToString("yyyy年MM月dd日")); 10 Console.Read(); 11 }

下面的例子解释了对于不同的Thread.CurrentUICulture属性值,框架会选择不同的资源文件读取其中的值,以便向使用不同语言的用户呈现不同的信息。运行前,需要在项目中建立如下的资源文件。

每个资源文件的内容如下:

其中,文件名中的语言代码代表不同的国家及使用的语言,如en-US=美国英语、en-GB=英国英语等等。文件名不带语言代码的为默认资源文件,框架会根据当前计算机所在的区域来调用这个资源文件。由于我在中国,并且使用简体中文的操作系统,所以,会将默认资源文件中的中文字符读出。

1 static void Main(string[] args) 2 { 3 string hello; 4 hello = International.Hello; 5 Console.WriteLine(hello); 6 Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("ja-JP"); 7 hello = International.Hello; 8 Console.WriteLine(hello); 9 Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US"); 10 hello = International.Hello; 11 Console.WriteLine(hello); 12 Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-GB"); 13 hello = International.Hello; 14 Console.WriteLine(hello); 15 Console.Read(); 16 }

那么在Web API中,如何确定用户来自哪个国家以及使用哪种语言、文化呢?由于Web API无法主动读取用户所有区域的信息,那么就只能被动地从用户那里获取此类信息。而这部分信息则会被包含在用户提交的HTTP请求头信息中。比如:


Accept-Language: en-us, en-gb;q=0.8, en;q=0.7


在这段HTTP请求头信息中,所传达的信息就是用户可接受的语言和地区文化。每种国家及语言后面的参数q称为相对质量的因素(relative quality factor),代表用户对于该种语言可接受的优先度(取值0.0~1.0,默认值为1.0)。总之通俗一来就讲,上面这段头信息的意思就是用户首选是美式英语,如果不支持的话,没关系,那就英式英语吧,再不行的话,其它类型的英语也可以。

上面的这段请求头信息提交到服务器时,会被封装在HttpRequestMessage类(System.Net.Http命名空间)的Headers属性中,我们可以很轻易地在Web API的控制器中读取到。参考以下例子

1 public void Post(Object obj) 2 { 3 HttpHeaderValueCollection<StringWithQualityHeaderValue> acceptedLanguages = Request.Headers.AcceptLanguage; 4 foreach (StringWithQualityHeaderValue language in acceptedLanguages) 5 { 6 Debug.WriteLine(language.Value); 7 Debug.WriteLine(language.Quality); 8 } 9 }

当然,在实际的开发中,上面的方法不是推荐的方法。更加科学的方法是我们新建一个自定义的DelegatingHandler,简单一点来讲,DelegatingHandler是HTTP请求通道中的过滤器。我们可以在这个DelegatingHandler中读取Accept-Language信息,并且设置处理线程的Thread.CurrentCulture属性和CurrentUICulture属性。源码如下:

1 namespace HelloWebAPI.Infrastructure 2 { 3 public class CultureHandler : DelegatingHandler 4 { 5 6 private List<string> supportedCulture = new List<string>() 7 { 8 "zh-cn", "en-us", "ja-jp" 9 }; 10 11 protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) 12 { 13 HttpHeaderValueCollection<StringWithQualityHeaderValue> acceptedLanguage = request.Headers.AcceptLanguage; 14 if (acceptedLanguage != null && acceptedLanguage.Count > 0) 15 { 16 StringWithQualityHeaderValue preferredLanguage = 17 acceptedLanguage.OrderByDescending(e => e.Quality ?? 1.0D) 18 .Where(e => !e.Quality.HasValue || e.Quality.Value > 0.0D) 19 .FirstOrDefault( 20 e => supportedCulture.Contains(e.Value, StringComparer.OrdinalIgnoreCase)); 21 if (preferredLanguage != null) 22 { 23 // 如需要,此处也可同时设置CurrentCulture属性 24 Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(preferredLanguage.Value); 25 } 26 27 if (acceptedLanguage.Any(e => e.Value == "*" &&(!e.Quality.HasValue || e.Quality.Value > 0.0D))) 28 { 29 string selectedCulture = 30 supportedCulture.FirstOrDefault(e => !acceptedLanguage.Any( 31 ee => 32 ee.Value.Equals(e, StringComparison.OrdinalIgnoreCase) && ee.Quality.HasValue && 33 ee.Quality.Value == 0.0D)); 34 if (!string.IsNullOrWhiteSpace(selectedCulture)) 35 { 36 // 如需要,此处也可同时设置CurrentCulture属性 37 Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(selectedCulture); 38 } 39 } 40 } 41 return base.SendAsync(request, cancellationToken); 42 } 43 } 44 }

上面的这段代码中,假设系统支持的语言有美式英语、简体中文、日文。并且如果用户支持多种语言,该DelegatingHandler也会根据头信息中的相对质量的因素q进行排序以确定首选语言。

打开WebApiConfig.cs文件,注册自定义的DelegatingHandler,在Register静态方法中添加如下的语句。

1 public static void Register(HttpConfiguration config) 2 { 3 config.Routes.MapHttpRoute( 4 name: "DefaultApi", 5 routeTemplate: "api/{controller}/{id}", 6 defaults: new { id = RouteParameter.Optional } 7 ); 8 config.MessageHandlers.Add(new CultureHandler()); 9 }

应用场景一:根据用户所在的国家和使用的语言,向用户提供不同语言的响应

在项目中,新建一个App_GlobalResources文件夹,该文件为ASP.net的专属文件夹,专门用于存放资源文件。分别建立几个对应语言的资源文件。文件中均有一个同键不同值的字符串“NotFound”,该字符串用于提示用户找不到指定的文件或资源。

在控制器中,建立一个示例动作方法如下:

1 public class EmployeesController : ApiController 2 { 3 public HttpResponseMessage Get(int id) 4 { 5 // 业务逻辑,此处省略 6 return Request.CreateErrorResponse(HttpStatusCode.NotFound, Resources.Message.NotFound); 7 } 8 }

为了调试,我们使用Fiddler来进行,运行项目之后,我们通过设置HTTP请求头信息中的Accept-Lanuage,可以得到不同语言的响应。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/4 7:32:28

基于CNN-GRU和SHAP的DOA信号分类与可解释分析

1. 项目概述&#xff1a;基于深度学习的DOA分类预测与可解释分析这个项目实现了一个融合CNN和GRU的深度学习模型&#xff0c;用于DOA&#xff08;Direction of Arrival&#xff09;信号的分类预测&#xff0c;并引入SHAP分析进行模型可解释性研究。整套方案采用Matlab实现&…

作者头像 李华
网站建设 2026/7/4 7:27:15

实战手册:3步掌握EditThisCookie高效管理浏览器Cookie的秘籍

实战手册&#xff1a;3步掌握EditThisCookie高效管理浏览器Cookie的秘籍 【免费下载链接】Edit-This-Cookie EditThisCookie is the famous Google Chrome/Chromium extension for editing cookies 项目地址: https://gitcode.com/gh_mirrors/ed/Edit-This-Cookie 在当…

作者头像 李华
网站建设 2026/7/4 7:23:25

PCB涂层检测:确保电路板可靠性的关键技术

1. PCB涂层检查为何成为质量防线的关键环节在PCB制造过程中&#xff0c;涂层质量直接影响着电路板的可靠性和使用寿命。我经手过的一个工业控制板项目就曾因为阻焊层厚度不均导致批量性绝缘失效&#xff0c;返工成本高达六位数。这个惨痛教训让我深刻认识到&#xff1a;涂层检查…

作者头像 李华
网站建设 2026/7/4 7:23:22

TI新一代汽车半导体解析:ADAS与自动驾驶优化方案

1. 德州仪器CES汽车半导体新品解析2024年CES展会上&#xff0c;德州仪器&#xff08;TI&#xff09;首次公开展示了其最新一代汽车半导体解决方案&#xff0c;包括Jacinto 7处理器系列和新型雷达传感器芯片。这些产品线专门针对ADAS&#xff08;高级驾驶辅助系统&#xff09;和…

作者头像 李华
网站建设 2026/7/4 7:22:42

大一离散数学建模:nwpu-cram图论应用案例解析

大一离散数学建模&#xff1a;nwpu-cram图论应用案例解析 【免费下载链接】nwpu-cram 西北工业大学/西工大/nwpu/npu软件学院复习(突击)资料&#xff01;&#xff01; 项目地址: https://gitcode.com/GitHub_Trending/nw/nwpu-cram nwpu-cram作为西北工业大学软件学院的…

作者头像 李华