使用.NET 6开发TodoList应用(29)——实现静态字符串本地化功能
系列导航及源代码
需求
在开发一些需要支持多种语言的应用程序时,我们需要根据切换的语言来对应展示一些静态的字符串字段,在本文中我们暂时不去讨论如何结合前端一起来实现根据切换当前应用程序的Culture来实现字符串的自动切换和日期时间的切换,只通过一个简单的例子来展示如何在.NET Web API项目中实现多语言字符串的功能。
目标
作为演示,实现支持英文和中文的本地化语言。
原理与思路
实现静态字符串的本地化切换功能实际很简单,我们只需要借助Microsoft.Extensions.Localization
包就可以完成一个最简单的本地化功能。实现过程分为:1)引入本地化依赖注入;2)添加资源文件;3)本地化配置。
实现
引入本地化依赖注入
为了验证静态字符串的本地化功能,我们在TodoListController
中注入本地化IStringLocalizer<T>
功能并新增一个演示接口:
TodoListController.cs
private readonly IStringLocalizer<TodoListController> _localizer;
public TodoListController(IMediator mediator, IStringLocalizer<TodoListController> localizer)
{
_mediator = mediator;
_localizer = localizer;
}
// .....
[HttpGet("meta")]
public ApiResponse<string> GetTodoListMeta()
{
var response = ApiResponse<string>.Success(_localizer["TodoListMeta"]);
return response;
}
添加资源文件
我们在Api
项目中添加资源文件作为演示目的,新建Resources
文件夹,并新增两个文件Controllers.TodoListController.en-us.resx
和Controllers.TodoListController.zh.resx
:
在资源编辑器中可以对其进行编辑:
在对应的resx
文件中生成的位置:
<data name="TodoListMeta" xml:space="preserve">
<value>This is a TodoList Controller</value>
</data>
和
<data name="TodoListMeta" xml:space="preserve">
<value>这是一个TodoList应用控制器</value>
</data>
添加本地化配置
最后我们在Program
中对本地化进行配置:
Program.cs
// 引入本地化服务
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");
// 省略其他...
// 引入本地化中间件
var supportedCultures = new[] { "en-US", "zh" };
var localizationOptions = new RequestLocalizationOptions()
.SetDefaultCulture(supportedCultures[0])
.AddSupportedCultures(supportedCultures)
.AddSupportedUICultures(supportedCultures);
app.UseRequestLocalization(localizationOptions);
app.MapDefaultControllerRoute();
验证
启动Api
项目,执行获取TodoList/meta
的请求:
验证1: 请求不携带任何Culture信息
则使用默认配置的en-US
:
验证2: 请求携带culture=en-us查询字符串
指定使用en-Us
:
验证3: 请求携带culture=zh查询字符串
指定使用zh
:
可以看到我们可以根据不同的culture对应返回本地化后的字符串内容。
总结
关于静态字符串的本地化功能本文只做了最基础的介绍,此外还可以通过DataAnnotation
的方式对Dto的属性字段进行本地化控制,微软的官方文档可以作为不同应用场景的参考:Globalization and localization in ASP.NET Core。
因为在实际开发中,如果需要大量用到本地化(Localization)的功能,那么提供国际化(Globalization)也是必要的,并且这两个方面在实现上一般都会借助更为成熟的框架(例如ABP)使用已经包装好的模块功能。所以文章不做过多展开,上面提供的官方文档已经足以应对日常的开发。
下一篇文章我们会将应用程序使用Docker进行打包,并且向容器中添加证书以实现HTTPS方式访问。
参考资料
最新文章
- css浮雕效果
- uploadify 自动访问url 初始化 自动请求
- EF 随机排序
- 【BZOJ】【3196】Tyvj 1730 二逼平衡树
- 自从用了Less 编写css,你比以前更快了~(sublime编译)
- Django处理文件上传File Uploads
- php基础知识【函数】(8)xml和变量函数
- Apache Maven 入门篇(下)
- linux操作提示:“Can&;#39;t open file for writing”或“operation not permitted”的解决的方法
- YouTube图片幻灯片分享技巧
- Java操作*.properties
- mysql日志详细解析【转载】
- 获取Ip所在城市名与详细
- 【angular】 ng-click 失效
- 26、jQuery
- Adjoint of SE(3)
- js模拟队列----小优先队列
- [Unity插件]Lua行为树(五):装饰节点Repeater
- SpringCloud 详解配置刷新的原理 使用jasypt自动加解密后 无法使用 springcloud 中的自动刷新/refresh功能
- 又一国产855旗舰突然现身:支持5G
热门文章
- Java网络多线程编程:对象流错误导致Connection reset
- C++ 未初始化内存出现 flashback
- Spring核心原理分析之MVC九大组件(1)
- java 图形化小工具Abstract Window Toolit 常用组件
- SPQuery ViewAttributes Sharepoint列表查询范围
- 复杂SQL案例:用户退款信息查询
- springboot整合阿里云视频点播接口
- 【LeetCode】911. Online Election 解题报告(Python)
- 【LeetCode】165. Compare Version Numbers 解题报告(Python)
- 【LeetCode】592. Fraction Addition and Subtraction 解题报告(Python)