系列导航及源代码

需求

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

参考资料

  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. 爆款预订,2022 年最值得关注的后台框架 —— Fantastic-admin

    前言 如果 2021 年你还没有听说过 Fantastic-admin ,那即将到来的 2022 年可不要再错过了. Fantastic-admin 做为一款开箱即用的 Vue 中后台管理系统框架,距 ...

  2. java 输入输出IO流 字符流 FileWriter FileReader

    为什么要使用字符流 当使用字节流读取文本文件时,可能会有一个小问题.就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储.所以Java提供一些字符流类,以字符为单位读写 ...

  3. c++之常见数据类型(int,double,float,long double long long 与std::string之间)相互转换(含MFC的CString、含C++11新特性函数)

    --- 已经通过初步测试---- ------------------ 下面的是传统常见数据类型的转换(非c++11)---------------  std::string 与其他常用类型相互转换, ...

  4. 【经验】 Java BigInteger类以及其在算法题中的应用

    [经验] Java BigInteger类以及其在算法题中的应用 标签(空格分隔): 经验 本来在刷九度的数学类型题,有进制转换和大数运算,故而用到了java BigInteger类,使用了之后才发现 ...

  5. Labeling Balls(poj3687)

    Labeling Balls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13109   Accepted: 3782 D ...

  6. web安全之burpsuite实战

    burpsuite暴力破解实战 一.burpsuite的下载及安装使用b站有详细参考   二.burpsuite: 1.熟悉comparer,repeater,intruder模块. (1) comp ...

  7. 快速登陆linux服务器

    前言 本文适用于喜欢原生终端的用户,钟爱第三方ssh客户端的可以无视....客户端可以保存用户信息和密码,比较无脑.mac可以使用终端,win可以使用git的bash. 上次分享了配置非对称秘钥免密登 ...

  8. 『学了就忘』vim编辑器基础 — 96、末行模式中的相关命令

    目录 1.在文档中显示行号 2.是否显示文档内容相关颜色 3.是否将查找的字符串高亮显示 4.是否显示右下角的状态栏 5.是否在左下角显示如"--INSERT--"之类的状态栏 6 ...

  9. wiodows /linux CMD

    windows : netstat -ano      查看所有端口使用情况 netstat -ano |findstr "端口号"     查看特定端口号 tasklist |f ...

  10. Sharpness-Aware Minimization for Efficiently Improving Generalization

    目录 概 主要内容 代码 Foret P., Kleiner A., Mobahi H., Neyshabur B. Sharpness-aware minimization for efficien ...