系列导航及源代码

需求

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

    10月5日微软推出了Win11正式版本,但是仍然不支持apk格式,不免让人失望.下面是Win11商业版本下载地址: 下载地址1: ed2k://|file|zh-cn_windows_11_busin ...

  2. 报表(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 好吧,今天这一篇,偷懒放水,不就是[报表]嘛,想看的话一个一个功能按钮点出来看就知道是咋肥四了,我就不一一截图了哈. 嗯, ...

  3. CSS的三大特性(继承、层叠和优先级)

    CSS的三大特性(继承.层叠和优先级) 1.css属性的继承 CSS中有些属性是可继承的,何为属性的继承? 一个元素如果没有设置某些属性的值,就会跟随(继承)父元素的属性值.当然,一个元素如果有设置自 ...

  4. CF102B Sum of Digits 题解

    Content 给定一个数 \(n\),每次操作可以将 \(n\) 变成 \(n\) 各位数之和.问你几次操作之后可以将 \(n\) 变为一位数. 数据范围:\(1\leqslant n\leqsla ...

  5. java 多线程:Thread类;Runnable接口

    1,进程和线程的基本概念: 1.什么是进程: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机 ...

  6. 制作一个文档同步工具,自动同步到gitee中。。。

    之所以要做这个工具是为了让自己可以随时用电脑时能记录日常工作或生活.一般只需要简单记录下就行了.这样我在家里的和公司里的记录都能同步看到. 这样后期整理的时候看到几个关键词就能想起来具体的事情,有的也 ...

  7. go实现pdf电子签名-自动识别签名位置

    一. 技术选型 由于要识别签名位置,所以得要能解析pdf的文本布局,要能得到每个布局元素的文本位置坐标.而最终的签名需要合成到pdf上,所以还需要有编辑pdf的需求. pdf布局分析:pdfminer ...

  8. centos下修改hosts文件以及生效命令

    修改 vim /etc/hosts 生效 service network restart 或者 /etc/init.d/network restart

  9. 【LeetCode】120. Triangle 解题报告(Python)

    [LeetCode]120. Triangle 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址htt ...

  10. Collision(hdu5114)

    Collision Time Limit: 15000/15000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others)Tot ...