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;q0.8, en;q0.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 HttpHeaderValueCollectionStringWithQualityHeaderValue 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 Liststring supportedCulture new Liststring() 7 { 8 zh-cn, en-us, ja-jp 9 }; 10 11 protected override System.Threading.Tasks.TaskHttpResponseMessage SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) 12 { 13 HttpHeaderValueCollectionStringWithQualityHeaderValue 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可以得到不同语言的响应。

相关新闻

5分钟掌握CC Switch:AI编程工具统一管理平台终极指南

5分钟掌握CC Switch:AI编程工具统一管理平台终极指南

5分钟掌握CC Switch:AI编程工具统一管理平台终极指南 【免费下载链接】cc-switch A cross-platform desktop All-in-One assistant for Claude Code, Codex, OpenCode, OpenClaw, Gemini CLI & Hermes Agent. Only official website: ccswitch.io 项目地址: h…

2026/7/4 7:33:39阅读更多 →
电脑磁盘清理神器Czkawka:免费开源帮你轻松释放50GB+空间

电脑磁盘清理神器Czkawka:免费开源帮你轻松释放50GB+空间

电脑磁盘清理神器Czkawka:免费开源帮你轻松释放50GB空间 【免费下载链接】czkawka Multi functional app to find duplicates, empty folders, similar images etc. 项目地址: https://gitcode.com/GitHub_Trending/cz/czkawka 还在为电脑磁盘空间不足而烦恼…

2026/7/4 7:33:39阅读更多 →
为什么你的Linux终端需要Terminator-themes?提升开发效率的终极解决方案

为什么你的Linux终端需要Terminator-themes?提升开发效率的终极解决方案

为什么你的Linux终端需要Terminator-themes?提升开发效率的终极解决方案 【免费下载链接】terminator-themes :metal: The biggest collection of themes for Terminator terminal. 项目地址: https://gitcode.com/gh_mirrors/te/terminator-themes 你是否曾…

2026/7/4 7:33:39阅读更多 →
CANN/ge DataFlow Python API参考

CANN/ge DataFlow Python API参考

# DataFlow构图接口参考(Python) 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效…

2026/7/4 8:23:45阅读更多 →
Reacord自定义适配器开发指南:扩展你的消息交互能力

Reacord自定义适配器开发指南:扩展你的消息交互能力

Reacord自定义适配器开发指南:扩展你的消息交互能力 【免费下载链接】reacord Create interactive Discord messages using React. ⚛ 项目地址: https://gitcode.com/gh_mirrors/re/reacord Reacord是一个允许开发者使用React创建交互式Discord消息的强大工…

2026/7/4 8:23:45阅读更多 →
E-Viewer开发者指南:如何贡献代码并参与开源项目协作

E-Viewer开发者指南:如何贡献代码并参与开源项目协作

E-Viewer开发者指南:如何贡献代码并参与开源项目协作 E-Viewer是一款专为Windows 10/11设计的e-hentai.org客户端,作为开源项目,它欢迎所有开发者参与贡献。本指南将详细介绍如何贡献代码、参与协作以及项目结构,帮助新手快速融入…

2026/7/4 8:23:45阅读更多 →
深入理解tools.cli的核心功能:parse-opts函数全方位解析

深入理解tools.cli的核心功能:parse-opts函数全方位解析

深入理解tools.cli的核心功能:parse-opts函数全方位解析 【免费下载链接】tools.cli Command-line processing 项目地址: https://gitcode.com/gh_mirrors/to/tools.cli 欢迎来到Clojure命令行工具库的深度解析!🚀 如果你是Clojure开发…

2026/7/4 8:23:45阅读更多 →
DeepSeek与豆包中文实测:办公学习场景下的AI应用选择指南

DeepSeek与豆包中文实测:办公学习场景下的AI应用选择指南

1. 项目概述:一场真实用户视角下的大模型应用对比实验你爱用DeepSeek 还是豆包呢?——这句话最近在朋友圈、技术群、甚至咖啡馆闲聊里频繁出现,它不像一句简单的功能询问,更像一个生活切口:我们正不知不觉地把AI当成日…

2026/7/4 8:23:45阅读更多 →
从0到1理解electron-redux架构:单源真理设计模式详解

从0到1理解electron-redux架构:单源真理设计模式详解

从0到1理解electron-redux架构:单源真理设计模式详解 【免费下载链接】electron-redux Use redux in the main and browser processes in electron 项目地址: https://gitcode.com/gh_mirrors/el/electron-redux 如果你正在使用Electron开发桌面应用&#xf…

2026/7/4 8:18:45阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/7/3 14:18:39阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/7/3 14:38:35阅读更多 →
端到端自动驾驶:从GTC‘26看工程可信落地的核心逻辑

端到端自动驾驶:从GTC‘26看工程可信落地的核心逻辑

1. 项目概述:当算法工程师走进GTC26展厅,看到的不是芯片,而是“端到端”的呼吸节奏“端到端”这三个字,在GTC’26现场出现的频率,高得像NVLink带宽测试时的峰值曲线——它不再是一个论文里的技术路径选项,而…

2026/7/4 0:02:48阅读更多 →
缺牙修复科普:常见义齿类型与选择参考

缺牙修复科普:常见义齿类型与选择参考

缺牙修复科普:常见义齿类型与选择参考牙齿缺失是中老年人群中较为常见的口腔问题,不仅会造成咀嚼不便、进食受影响,长期还可能对营养摄入与日常社交带来困扰。义齿是改善缺牙问题的常用方式,目前市面上的义齿种类较多,…

2026/7/4 0:02:48阅读更多 →
STM32F091RC与LTC6904实现高精度方波信号生成

STM32F091RC与LTC6904实现高精度方波信号生成

1. 项目概述:LTC6904与STM32F091RC的精准方波生成方案在嵌入式系统开发中,精确的时钟信号和定时控制往往是项目成败的关键。LTC6904作为一款低功耗、高精度的可编程振荡器芯片,与STM32F091RC这款ARM Cortex-M0内核微控制器的组合,…

2026/7/4 0:02:48阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/4 1:16:56阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/4 2:33:55阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/4 2:33:55阅读更多 →