系列导航及源代码

需求

在开发一些需要支持多种语言的应用程序时,我们需要根据切换的语言来对应展示一些静态的字符串字段,在本文中我们暂时不去讨论如何结合前端一起来实现根据切换当前应用程序的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.resxControllers.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方式访问。

参考资料

  1. Globalization and localization in ASP.NET Core

使用.NET 6开发TodoList应用(29)——实现静态字符串本地化功能的更多相关文章

  1. 使用.NET 6开发TodoList应用(3)——引入第三方日志库

    需求 在我们项目开发的过程中,使用.NET 6自带的日志系统有时是不能满足实际需求的,比如有的时候我们需要将日志输出到第三方平台上,最典型的应用就是在各种云平台上,为了集中管理日志和查询日志,通常会选 ...

  2. 使用.NET 6开发TodoList应用(1)——系列背景

    前言 想到要写这样一个系列博客,初衷有两个:一是希望通过一个实践项目,将.NET 6 WebAPI开发的基础知识串联起来,帮助那些想要入门.NET 6服务端开发的朋友们快速上手,对使用.NET 6开发 ...

  3. 使用.NET 6开发TodoList应用(2)——项目结构搭建

    为了不影响阅读的体验,我把系列导航放到文章最后了,有需要的小伙伴可以直接通过导航跳转到对应的文章 : P TodoList需求简介 首先明确一下我们即将开发的这个TodoList应用都需要完成什么功能 ...

  4. 使用.NET 6开发TodoList应用(4)——引入数据存储

    需求 作为后端CRUD程序员(bushi,数据存储是开发后端服务一个非常重要的组件.对我们的TodoList项目来说,自然也需要配置数据存储.目前的需求很简单: 需要能持久化TodoList对象并对其 ...

  5. 使用.NET 6开发TodoList应用(5)——领域实体创建

    需求 上一篇文章中我们完成了数据存储服务的接入,从这一篇开始将正式进入业务逻辑部分的开发. 首先要定义和解决的问题是,根据TodoList项目的需求,我们应该设计怎样的数据实体,如何去进行操作? 长文 ...

  6. 使用.NET 6开发TodoList应用(5.1)——实现Repository模式

    需求 经常写CRUD程序的小伙伴们可能都经历过定义很多Repository接口,分别做对应的实现,依赖注入并使用的场景.有的时候会发现,很多分散的XXXXRepository的逻辑都是基本一致的,于是 ...

  7. 使用.NET 6开发TodoList应用(6)——使用MediatR实现POST请求

    需求 需求很简单:如何创建新的TodoList和TodoItem并持久化. 初学者按照教程去实现的话,应该分成以下几步:创建Controller并实现POST方法:实用传入的请求参数new一个数据库实 ...

  8. 使用.NET 6开发TodoList应用文章索引

    系列导航 使用.NET 6开发TodoList应用(1)--系列背景 使用.NET 6开发TodoList应用(2)--项目结构搭建 使用.NET 6开发TodoList应用(3)--引入第三方日志 ...

  9. 使用.NET 6开发TodoList应用(7)——使用AutoMapper实现GET请求

    系列导航 使用.NET 6开发TodoList应用文章索引 需求 需求很简单:实现GET请求获取业务数据.在这个阶段我们经常使用的类库是AutoMapper. 目标 合理组织并使用AutoMapper ...

随机推荐

  1. Lookup函数(Excel函数集团)

    此处文章均为本妖原创,供下载.学习.探讨! 文章下载源是Office365国内版1Driver,如有链接问题请联系我. 请勿用于商业!谢谢 下载地址:https://officecommunity-m ...

  2. 制作ota差分包

    制作ota包 . build/envsetup.sh lunch [product] make -j8 make otapackage -j8 cp out/target/product/projec ...

  3. 云小课|DGC数据开发之基础入门篇

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:欢迎来到DGC数据 ...

  4. centos7安装docker,并配置镜像加速

    yum安装gcc yum -y install gcc yum -y install gcc-c++ 卸载旧版本 (没有可忽略) yum -y remove docker docker-common ...

  5. Swagger请求报错:TypeError: Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot have body.

    TypeError: Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot have body. 如下图 ...

  6. UDP&串口调试助手用法(2)

    通道的是创建.删除.编辑.链接.断开 通道创建 通道删除 先选择要删除的通道,再点击删除通道即可 通道参数编辑 双击创建的通道 即可编辑通道 通道链接 通道创建成功,提示 点击链接即可链接通道 通道断 ...

  7. 警惕!PHP、Node、Ruby 和 Python 应用,漏洞还没结束!

    12 月 10 日凌晨,Apache 开源项目 Log4j2 的远程代码执行漏洞细节被公开,作为当前全球使用最广泛的 java 日志框架之一.该漏洞影响着很多全球使用量前列的开源组件,如 Apache ...

  8. JS事件冒泡与事件捕获怎么理解?

    在js中存在事件冒泡与事件捕获两种概念,这两个概念都是为了解决页面中事件流(事件发生顺序)的问题. 事件冒泡(dubbed bubbling) 事件冒泡我们从字面意思理解就是当用户行为触发我们页面的定 ...

  9. Android物联网应用程序开发(智慧园区)—— 图片预览界面

    效果图: 实现步骤: 1.首先在 build.gradle 文件中引入 RecycleView implementation 'com.android.support:recyclerview-v7: ...

  10. find 命令常用解释

    背景色是:orange #### find命令 find * path: 所有搜索的目录以及其所有子目录.默认为当前目录 * expression: 所有搜索的文件的特征 * cmd: 对搜索结果惊醒 ...