NetCore 国际化最佳实践

NetCore 国际化最佳实践

ASP.NET Core中提供了一些本地化服务和中间件,可将网站本地化为不同的语言文化。ASP.NET Core中我们可以使用Microsoft.AspNetCore.Localization库来实现本地化。但是默认只支持使用资源文件方式做多语言存储,很难在实际场景中使用。有没有可能支持官方资源文件的基础上还能支持动态添加修改多语言呢,答案是有的,那就是NetPro.Globalization

安装

Package Manager方式:

Install-Package NetPro.Globalization 6.0.10

.NET CLI 方式:

dotnet add package NetPro.Globalization --version 6.0.10

PackageReference:

<PackageReference Include="NetPro.Globalization" Version="6.0.10" />

.NET CLI 方式:

paket add NetPro.Globalization --version 6.0.10

基于NetPro环境的初始化

如基于NetPro环境的使用,比较简单,在执行安装步骤后配置多语言持久化的sqlite地址即可

"Globalization": {"UIQueryStringKey": "language", //请求的query携带的多语言参数名,默认为language"ConnectionString": "Data Source=Globalization.db;Cache=Shared", //sqlite地址"Cultures": ["zh-CN","en-US"],"Annotations": true, //是否打开注册数据注解本地化服务"Record": true //不存在是否记录(自动插入数据库默认语系),默认true}

脱离NetPro环境的使用

如不是基于NetPro环境的使用,比需要手动进行各项初始化

public void ConfigureServices(IServiceCollection services){services.AddGlobalization();}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env){//置于app.UseRouting()后便可;var configuration = app.ApplicationServices.GetService<IConfiguration>();var globalization = configuration.GetSection(nameof(Globalization)).Get<Globalization>();var cultures = globalization?.Cultures ?? new string[] { };var localizationOptions = new RequestLocalizationOptions().AddSupportedUICultures(cultures);localizationOptions.RequestCultureProviders.Insert(0, new QueryStringRequestCultureProvider { UIQueryStringKey = globalization.UIQueryStringKey });localizationOptions.RequestCultureProviders.Insert(1, new AcceptLanguageHeaderRequestCultureProvider());localizationOptions.RequestCultureProviders.Insert(2, new CookieRequestCultureProvider());app.UseRequestLocalization(localizationOptions);}

使用

public class GlobalizationDemoController : ControllerBase{private readonly IStringLocalizer<NetPro.Globalization.Globalization> _localizer;//建议使用NetPro.Globalization.Globalization 统一的类提供字符串承载,过多语言碎片public GlobalizationDemoController(, IStringLocalizer<NetPro.Globalization.Globalization> localizer){_localizer = localizer;}/// <summary>/// 多语言国际化示例/// </summary>[HttpGet("globalization")]public IActionResult Globalization(){var localMsg = _localizer["当前时间为"] + $":{DateTime.Now}";return Ok(new { localMsg });}}

客户端处理

客户端请求接口时,依次支持,query,header,cookie等三种方式携带多语言标识

  • query 默认 language; 支持修改UIQueryStringKey节点覆盖默认参数名,推荐query方式

  • header 默认 Accept-Language

  • cookie 默认为 .AspNetCore.Culture  既:(Microsoft.AspNetCore.Localization.CookieRequestCultureProvider.DefaultCookieName)

实验:

中文环境:

request http://localhost:5001/api/globalizationdemo/globalization?language=zh-CN
response localMsg: "当前时间为:2022/6/11 14:47:01"

英文环境:

request http://localhost:5001/api/globalizationdemo/globalization?language=en-US
response localMsg: "当前时间为:2022/6/11 14:47:01"

发现依然中文,原因是找不到对应的语言,会自动将_localizer[string]中的字符串作为默认值插入,此时只需要手动再插入一条en-US的翻译即可

4da0525fea1f04a59a9660b1d29527f0.png

再次请求:

request http://localhost:5001/api/globalizationdemo/globalization?language=en-US
response localMsg: "This  time is:2022/6/11 14:50:25"

总结

除了以上支持sqlite数据库存储多语言信息,同时也支持微软默认的资源文件方式,并且使用方式与原生一致,不会有新的学习成本。

NetPro.Globalizatio:

https://github.com/LeonKou/NetPro/tree/dev_6.0/src/Library/NetPro.Globalization

NetPro框架Github地址:

https://github.com/LeonKou/NetPro

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/285084.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

复分析——第1章——复分析准备知识(E.M. Stein R. Shakarchi)

第一章 复分析准备知识 (Preliminaries to Complex Analysis) The sweeping development of mathematics during the last two centuries is due in large part to the introduction of complex numbers; paradoxically, this is based on the seemingly absurd no…

网构软件-Internetware

网构软件&#xff0c;973项目提的一个概念。概念。作为一种新型软件形态&#xff0c;它应该涵盖哪些研究范畴&#xff1f;评价它成功的基本标准是什么&#xff1f;我们看待一件事物&#xff0c;首先都会从已知的认知空间里寻找与之对应者。那么&#xff0c;能与网构相对应的大概…

List集合的remove一个对象的方法

import java.util.ArrayList;import java.util.List;class A{   public boolean equals(Object obj){     return true;   }} public class ListTest2 { public static void main(String[] args) {   // TODO Auto-generated method stub     System.out.println…

【ArcGIS微课1000例】0009:ArcGIS影像拼接(镶嵌、镶嵌至新栅格)

本课程以 DEM数据为例,讲述ArcGIS中影像的拼接方法及注意事项。 文章目录 方法一:Mosaic工具方法二:Mosaic To New Raster工具实验数据下载观察两个数据,接边处切合效果很好。 方法一:Mosaic工具 使用Mosaic工具要千万注意,Mosaic的结果是将输入栅格追加到目标栅格上,…

Python:file (read,readline,readline )使用方法

Python读取文件时&#xff0c;在使用readlin、readlines时会有疑惑&#xff0c;下面给大家详解&#xff1a;一、例&#xff1a;a.txt的内容为 aaa 123 bbb 456二、首先我先设置个变量&#xff1a; a"a.txt" cfile(a)三、此时我们分别看下使用read、readl…

C语言试题170之矩阵转置

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款刷算法、笔试、面经、拿大公司offer神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:设有一矩…

【ArcGIS微课1000例】0010:ArcGIS影像裁剪(裁剪、掩膜提取)

文章目录 裁剪方法方法一:Extract By Mask(按掩膜提取)方法二:Clip(裁剪)数据下载裁剪方法 方法一:Extract By Mask(按掩膜提取) 加载配套的实验数据,运行Extract By Mask(按掩膜提取)工具,参数设置如下: 掩膜提取结果: 方法二:Clip(裁剪) 加载配套的实验…

阿里创新自动化测试工具平台--Doom

背景 信息系统上线后通常会需要迭代升级甚至重构&#xff0c;如何确保系统原有业务的正确性非常重要。曾经有一家叫瑞穗证券的证券公司因为一个系统bug导致了数亿美金的损失&#xff0c;赔掉了公司一年的利润。这样的极端例子虽然少见&#xff0c;但是却像达摩克利斯之剑警示着…

《微信读书》自定义样式

一直用微信读书看书&#xff0c;但是微信读书的Web版的布局不太喜欢。 重写下它的样式再加上单击关闭工具栏&#xff0c;这样看着舒服多了^_^&#xff1a; /*浮动工具栏*/ document.getElementsByClassName("readerControls")[0].style.left"0"; document.…

内核态和用户态的区别

当一个任务&#xff08;进程&#xff09;执行系统调用而陷入内核代码中执行时&#xff0c;我们就称进程处于内核运行态&#xff08;或简称为内核态&#xff09;。此时处理器处于特权级最高的&#xff08;0级&#xff09;内核代码中执行。当进程处于内核态时&#xff0c;执行的内…

C# NanoFramework WIFI扫描、连接和HttpWebRequest 之 ESP32

可喜可贺新板子终于到了&#xff0c;啥也不说&#xff0c;赶紧搞起来。ESP32的主要功能就是WIFI&#xff0c;有了WIFI &#xff0c;就可以直接连接家里的WIFI路由器啥的&#xff0c;直接连接到外网了&#xff0c;这个时候&#xff0c;它就相当于是一个小型的电脑或手机&#xf…

【ArcGIS微课1000例】0011:ArcGIS空间查询(按位置选择Select by Location)完全案例详解

利用按位置选择工具,您可以根据要素相对于另一图层要素的位置来进行选择。例如,如果您想了解最近的洪水影响了多少家庭,那么可以选择该洪水边界内的所有家庭。 您可使用多种选择方法,选择与同一图层或其他图层中的要素接近或重叠的点、线或面要素。 文章目录 1、点—点查询…

C语言试题171之实现希尔排序算法

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款刷算法、笔试、面经、拿大公司offer神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目: 实现希…

[转]收集android上开源的酷炫的交互动画和视觉效果:Interactive-animation

原文链接&#xff1a;http://www.open-open.com/lib/view/open1411443332703.html 描述&#xff1a;收集android上开源的酷炫的交互动画和视觉效果。 1.交互篇 2.视觉篇 交互篇 1.SlidingUpPanelLayout 项目介绍&#xff1a;他的库提供了一种简单的方式来添加一个可拖动滑动面板…

EntityFramework用法探索(三)CodeFirst流畅API

Code First Fluent API&#xff0c;使用流畅API来定义模型映射。 同样使用与上文 Database First 模式相同的例子&#xff0c;假设需要设计一个零售系统&#xff0c;我们先构建一个 Customer 类。 1 public class Customer 2 { 3 public long Id { get; set; } 4 p…

[转]JS导出PDF

通过纯js将网页保存为pdf&#xff0c;A4分页&#xff0c;无需服务端参与 1.引入js库文件&#xff1a; <script src"../static/jspdf/html2canvas.js"></script><script src"../static/jspdf/jsPdf.debug.js"></script> 2.思路&a…

js浏览器对象模型(BOM)

浏览器对象模型(Browser Object Model,BOM)&#xff1a;浏览器为js提供的对象集合。 1 windows对象 windows对象&#xff1a;表示浏览器的框架以及与其相关的内容&#xff0c;比如滚动条和导航栏图标等等。或者说windows对象就代表浏览器本身。windows对象是个全局对象&#xf…

Hello Playwright:(8)等待页面加载

在我们前面的文章中&#xff0c;我们始终使用await page.GotoAsync(url);加载页面&#xff0c;我们的目的是等待足够长的时间让页面上的元素出现。但是&#xff0c;我们更希望永远不要因为等待浪费任何时间。WaitUntilGotoAsync方法的定义如下&#xff1a;Task<IResponse?&…

【ArcGIS微课1000例】0012:ArcGIS创建及连接ArcSDE企业级地理数据库实例

文章目录 实验材料实验过程创建企业级数据库连接企业级数据库创建要素类要素入库实验材料 ArcGIS:版本为10.2Server.ecp:版本为10.2SQL Server:版本为2008实验过程 创建企业级数据库 企业级地理数据库的创建需要通过工具箱来实现。 数据库平台:SQL Server 实例:localhos…

C语言试题172之实现冒泡排序算法

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款刷算法、笔试、面经、拿大公司offer神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:实现冒泡…