Asp.net core 2.x/3.x 的 Globalization 和 localization 的使用 (一) 使用方法
由于Api的接口需要返回多语言,因此参考了网上很多篇文章,,有些文章写的太过于理论,看起来比较费劲,今天下午搞了一个下午,总结了一下经验,,
做这个功能时,主要参考了两篇文章:
https://blog.johnwu.cc/article/ironman-day21-asp-net-core-localization.html
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-3.1
大家可对照着看
一般有两种情况: 一种是web项目需要返回多语言,,一种是dll里,需要单独实现多语言的,比如插件中
前提,项目中需要引入 Microsoft.Extensions.Localization 包
一.Web 项目中
如果是默认创建的Asp.net core的项目,以及引用完Microsoft.Extensions.Localization包了,所以不需要额外引入
1.资源文件的位置问题
网上的教程中,提到一个SharedResource的用法,并且是放在Resources文件夹中,今天试了很多次,发觉是这么用的,
比如在不同的area中:
创建一个Resources文件夹,
然后添加一个叫SharedResource的类,内容啥都不需要就要一个空的类而已
再添加对应语言的资源文件,如: SharedResource.en.resx 或者 SharedResource.th.resx
结构:

SharedResource.cs :
namespace ZKXT.Devices.Api.Areas.AppApi.Resources
{
public class SharedResource{}
}
2.Start.cs 中:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<RequestLocalizationOptions>(options =>
{
options.DefaultRequestCulture = new RequestCulture("zn-cn"); //默认的语言
});
services.AddLocalization(); //注册相应Service
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
var support = new List<CultureInfo>()
{
new CultureInfo("zh-cn"), //注册多种语言,具体可以查看http://www.lingoes.net/zh/translator/langcode.htm找对应
new CultureInfo("en"),
new CultureInfo("th")
};
app.UseRequestLocalization(x =>
{
x.SetDefaultCulture("zh-cn");
x.SupportedCultures = support; //设置支持的语言
x.SupportedUICultures = support; //设置UI语言,这里有个很大的坑,如果不设置该属性,在Action中,CultureInfo.CurrentCulture返回的是正确的语言,但是在CultureInfo.CurrentUICulture返回的是默认语言
x.AddInitialRequestCultureProvider(new AcceptLanguageHeaderRequestCultureProvider()); //设置判断当前语言的方式,我项目中是使用了Accept-Language 的header值作为判断
});
}
2.Controller中:
在构造函数中注入
public DevicesController(IStringLocalizer<SharedResource> localize=null):ControllerBase
注意: 这里的SharedResource,一定是要对应的area中的,框架会根据SharedResource对应的namespace转换成对应的路径,并读取相应的资源文件,这个比较重要.
二. dll中
1.需手动引入 Microsoft.Extensions.Localization 包
2.需要在web项目中注入后,在request中自动设定当前线程的语言
3.资源文件目录结构如图:

public class Base
{
private static IStringLocalizerFactory _factory = null;
private string _name="";
static Base()
{
_factory = new ResourceManagerStringLocalizerFactory(Options.Create(new LocalizationOptions(){ ResourcesPath = "Resources" }),
NullLoggerFactory.Instance);
_name=typeof(Base).Assembly.GetName().Name;
}
protected virtual IStringLocalizer GetLocalizer() //后续使用该函数,即可返回对应的Localizer
{
return _factory.Create("SharedResource", _name); //这里能指定名称,就不是非要新建个 SharedResource 类了,看了factory的源码,Create的实现自带缓存功能,所以不会每次都new一个类,因此直接Create就好,不需要自己做缓存
}
}
Asp.net core 2.x/3.x 的 Globalization 和 localization 的使用 (一) 使用方法的更多相关文章
- ASP.NET Core依赖注入系统学习教程:关于服务注册使用到的方法
在.NET Core的依赖注入框架中,服务注册的信息将会被封装成ServiceDescriptor对象,而这些对象都会存储在IServiceCollection接口类型表示的集合中,另外,IServi ...
- asp.net core不通过构造方法从容器中获取对象及解决通过这种方法NLog获取对象失败的问题
一般想从容器中获取对象,我们都是通过构造方法获取对象,但有些条件不允许不能通过构造方法获取对象,我们必须单独从容器中单独创建获取找个对象,这样我们就不行把找个容器静态保存起来供全局diaoy 一. 简 ...
- ASP.NET Core 1.1 静态文件、路由、自定义中间件、身份验证简介
概述 之前写过一篇关于<ASP.NET Core 1.0 静态文件.路由.自定义中间件.身份验证简介>的文章,主要介绍了ASP.NET Core中StaticFile.Middleware ...
- ASP.NET Core 1.0 静态文件、路由、自定义中间件、身份验证简介
概述 ASP.NET Core 1.0是ASP.NET的一个重要的重新设计. 例如,在ASP.NET Core中,使用Middleware编写请求管道. ASP.NET Core中间件对HttpCon ...
- 细说ASP.NET Core与OWIN的关系
前言 最近这段时间除了工作,所有的时间都是在移植我以前实现的一个Owin框架,相当移植到到Core的话肯定会有很多坑,这个大家都懂,以后几篇文章可能会围绕这个说下,暂时就叫<Dotnet Cor ...
- ASP.NET Core 源码阅读笔记(3) ---Microsoft.AspNetCore.Hosting
有关Hosting的基础知识 Hosting是一个非常重要,但又很难翻译成中文的概念.翻译成:寄宿,大概能勉强地传达它的意思.我们知道,有一些病毒离开了活体之后就会死亡,我们把那些活体称为病毒的宿主. ...
- 在ASP.NET Core中使用Apworks快速开发数据服务
不少关注我博客的朋友都知道我在2009年左右开发过一个名为Apworks的企业级应用程序开发框架,旨在为分布式企业系统软件开发提供面向领域驱动(DDD)的框架级别的解决方案,并对多种系统架构风格提供支 ...
- 10分钟学会在windows/Linux下设置ASP.Net Core开发环境并部署应用
创建和开发ASP.NET Core应用可以有二种方式:最简单的方式是通过Visual Studio 2017 来创建,其优点是简单方便,但需要安装最新版本Visual Studio 2017 prev ...
- ASP.NET Core 运行原理解剖[2]:Hosting补充之配置介绍
在上一章中,我们介绍了 ASP.NET Core 的启动过程,主要是对 WebHost 源码的探索.而本文则是对上文的一个补充,更加偏向于实战,详细的介绍一下我们在实际开发中需要对 Hosting 做 ...
随机推荐
- 二、webdriver API
目录 1. webdriver中常用属性 2. 浏览器页面操作 3. 鼠标操作 4. 键盘操作 5. 下拉框操作 1. webdriver中常用属性 import time from selenium ...
- 使用Selenium对网页元素进行定位的诸种方法
使用Selenium进行自动化操作,首先要做的就是通过webdriver的get()方法打开一个URL链接. 在打开链接,完成页面加载之后,就可以通过Selenium提供的接口,在页面上进行各种操作了 ...
- 1049 数列的片段和 (20 分)C语言
给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段.例如,给定数列 { 0.1, 0.2, 0.3, 0.4 },我们有 (0.1) (0.1, 0.2) (0.1, 0.2, 0.3) ...
- Go数组和切片你不知道的区别
开篇语 数组和切片是两种不同的数据结构,比较常见,在Go语言中同时存在,今天我们就一起来看看他们在使用方式上,原理上的一些区别? 数组 在Go语言中,数组是一种具有相同类型固定大小的一种数据结构. 我 ...
- 如何在Go项目中输出版本信息?
我们经常在使用CLI工具的时候,都会有这样的参数输出: ``` ➜ ~ docker version Client: Docker Engine - Community Version: 18.09. ...
- .Net Core Linux 下面的操作
这里以 Ubuntu 8.04版本为例: 1. 注册 Microsoft 密钥 注册产品存储库 安装必需的依赖项 wget -q https://packages.microsoft.com/ ...
- 关于i++的底层原理分析
首先看一道典型题 public class Test { static int x, y, z; static { int x = 5;//局部变量 x--; } static { x--; } pu ...
- 从头学pytorch(十六):VGG NET
VGG AlexNet在Lenet的基础上增加了几个卷积层,改变了卷积核大小,每一层输出通道数目等,并且取得了很好的效果.但是并没有提出一个简单有效的思路. VGG做到了这一点,提出了可以通过重复使⽤ ...
- redux一些自习时候自己写的的单词
setState:设置状态 render:渲染,挂载 dispatchEvent : 派发事件 dispatch:分发,派遣:库里的一个方法,简而言之相当于一个actions和reducer监听方法更 ...
- EF 使用lambda表达式 更新一对多数据时报错
1.需求 更新一对多表中的附表数据,表结构如下: 2.思路 个人觉得一个个去对比关联的附表数据是删除还是添加比较麻烦,就直接清空主表关联的附表,然后重新建立关联关系. 3.弊端 如果附表(前提是附表 ...