ASP.NET Core中提供了一些本地化服务和中间件,可将网站本地化为不同的语言文化。

ASP.NET Core中我们可以使用Microsoft.AspNetCore.Localization库来实现本地化。

在.NET Core 2.0以上版本, Microsoft.AspNetCore.Localization已经包含在了Microsoft.AspNetCore.All中,所以我们并不需要手动引入其他的类库。

创建一个MVC网站

为了测试ASP.NET Core的本地化,我们首先在Visual Studio 2017中创建一个MVC项目LocalizationSample。

配置Startup类

ASP.NET Core中,如果希望启动本地化,首先需要在 Startup类的 ConfigureServices方法中使用 services.AddLocalization添加本地化服务。

public void ConfigureServices(IServiceCollection services)
{   services.AddLocalization(o =>   {   o.ResourcesPath = "Resources";   }); services.AddMvc();
}

在这个方法中,我们指定了文件夹Resources作为存放翻译文件的目录。

注: 如果不指定存放翻译文件的目录, ASP.NET Core会默认从网站根目录下读取。

然后我们需要在 Configure方法中添加本地化中间件。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{   app.UseStaticFiles();   IList<CultureInfo> supportedCultures = new List<CultureInfo>   {   new CultureInfo("en-US"), new CultureInfo("zh-CN"), };  app.UseRequestLocalization(new RequestLocalizationOptions   {   DefaultRequestCulture = new RequestCulture("en-US"), SupportedCultures = supportedCultures, SupportedUICultures = supportedCultures    }); app.UseMvc(routes =>    {   routes.MapRoute(    name: "default",  template: "{controller=Home}/{action=Index}/{id?}");    });
}
  • app.UseRequestLocalization必须放置 app.UseMvc之前

  • DefaultRequestCulture参数指定了默认的语言文化,即用户不指定任何文化时的默认语言文化

  • SupportedCultures和 SupportedUICultures是指定当前应用支持的所有语言文化

注: SupportedCultures指定的是数字和日期格式, SupportedUICultures指定的翻译文件

添加资源文件

下面我们尝试添加一个资源文件

  1. 首先我们创建一个Resources文件夹,这就是我们在前面 Startup类中配置的目录名。

  2. 然后我们在Resource文件夹中添加一个资源文件,并命名为Controllers.HomeController.zh-CN.resx。

  3. 在这个资源文件中,添加一个字段Hello, 并设置其值为“你好”。

在Controller中获取本地化字符串

现在我们打开默认生成的 HomeController, 清空里面所有的action, 并添加一个新的action, 代码如下:

public class HomeController : Controller
{   public HomeController() {   }   public IActionResult Hello()    {   return Content("Hello");  }
}

启动项目之后访问/Home/Hello, 结果如下

下面我们修改HomeController的代码, 来引入本地化字符串访问器

public class HomeController : Controller
{   private readonly IStringLocalizer<HomeController> _localizer; public HomeController(IStringLocalizer<HomeController> localizer) {   _localizer = localizer;    }   public IActionResult Hello()    {   return Content(_localizer["Hello"]);  }
}

代码解释

  • IStringLocalizer是一个本地化字符串访问器的泛型接口,这里我们通过依赖注入的方式在 HomeController的构造函数中将其注入

  • 我们可以通过IStringLocalizer的属性访问器获取到对应字段在不同语言下的文本。

最终效果

现在我们启动程序, 重新访问/Home/Hello, 结果如下

你会发现结果没有变化,这是因为默认我们设置的语言文化是en-US, 但是我们之前没有添加en-US的资源文件,所以程序就直接将访问的字段名输出了。

现在我们修改URL, 访问/Home/Hello?ui-culture=zh-CN, 结果如下

我们期望的“你好”被正确输出了,这说明ASP.NET Core默认支持在Url中以culture参数的形式设置当前网站使用的语言文化。

资源文件命名

为什么我们之前添加了一个名为Controllers.HomeController.zh-CN.resx的资源文件,本地化字符串访问器 IStringLocalizer就能定位到这个文件并读取其中的字段属性呢?

这是由ASP.NET Core资源文件的命名约定决定的。

ASP.NET Core资源文件的名称由2部分组成:

  • 去掉程序集名称的完整类名

  • 语言文化名称

以前面的例子为例: 我们创建了一个本地化字符串访问器接口,它的泛型类型是 HomeController, 其完整类名是 LocalizationSample.Controllers.HomeController, 当前程序集的名称是 LocalizationSample, 所以去掉程序集名称之后,剩余部分是 Controllers.HomeController。当我们设置culture参数是zh-CN时, ASP.NET Core查找的资源文件名是Controllers.HomeController.zh-CN.resx, 这正是我们前面添加的中文语言文化资源文件名。

如果你不喜欢这种方式,ASP.NET Core还提供了另外一种资源文件的组织方式

你可以Resources目录下创建以下目录结构

  • Resources

    • Controllers

      • HomeController.zh-CN.resx

本地化字符串访问器也能自动定位到这个文件。

默认的语言文化提供器

ASP.NET Core的本地化中间件默认支持3种语言文化提供器

  • URL中的查询字符串

  • Cookie

  • 请求头

URL中的查询字符串

ASP.NET Core会从URL中的culture参数中获取当前应用使用的语言文化,这就是前面例子中,“你好”能正确输出的原因

除了指定ui-culture参数,你还可以使用culture参数指定当前格式化时间,数字等所使用的语言文化。

?culture=zh-CN&ui-culture=zh-CN  ?culture=zh-CN ?ui-culture=zh-CN

Tips: 当只指定culture或ui-culture参数时,ASP.NET Core会自动将culture和ui-culture设置成一样的。即?culture=zh-CN等同于?culture=zh-CN&ui-culture=zh-CN

Cookie

ASP.NET Core中还支持使用Cookie的方式设置当前应用使用的语言文化。默认使用的Cookie名称是.AspNetCore.Culture。

.AspNetCore.Culture的值格式如下

c=zh-CN|uic=zh-CN  c=zh-CN    uic=zh-CN

其中c表示culture, uic表示ui-culture。

下面我们使用Chrome的开发者工具, 为当前网页添加语言文化Cookie

然后我们访问/Home/Hello, "你好"也被正确的输出了

这说明ASP.NET Core从Cookie中读取到了语言文化配置

请求头

除了URL查询字符串和Cookie, ASP.NET Core还支持在请求头中指定语言文化。请求头中语言文化字段名称是 Accept-Language。

Accept-Language的文档,参见https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Accept-Language

这里我们使用Postman来测试一下,我们设置Accept-Language为zh-CN, zh;q=0.9, 结果如下

如何在View中使用本地化

除了Controller, 我们更多的是在View中使用本地化。 如果希望在View中使用本地化,首先需要在 Startup类的 ConfigureServices方法中启用View本地化。

public void ConfigureServices(IServiceCollection services)
{   services.AddMvc()   .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix);
}

这里 LanguageViewLocationExpanderFormat支持2种方式,这个和前面Controller的本地化文件名称约定类似

  • Suffix, 例/Resources/Home/Hello.zh-CN.resx

  • Path, 例/Resources/Home/zh-CN/Hello.resx

下面我们修改HomeController的代码, Hello方法将返回一个View

HomeController

public IActionResult Hello()
{   //return Content(_localizer["Hello"]);    return View();
}

Hello.cshtml

@{ ViewData["Title"] = "Hello";
}   <h2>Good Bye</h2>

然后我们创建如下图的目录结构, 并创建资源文件Hello.zh-CN.resx, 并添加GoodBye字段,其值为"再见"

使用ViewLocalizer

ViewLocalizer类可以帮助我们在Razor视图中使用本地化文本。现在我们来修改Hello.cshtml, 在文件添加本地化引用,并注入一个ViewLocalizer对象

@using Microsoft.AspNetCore.Mvc.Localization  @inject IViewLocalizer Localizer
@{ ViewData["Title"] = "Hello";
}   <h2>@Localizer["GoodBye"]</h2>

这里我们使用ViewLocalizer读取了本地化文本,它的用法和 IStringLocalier一样,都是通过属性访问器访问对应字段的本地化文本。

最终效果

现在我们运行程序并访问/Home/Hello, 结果如下

然后我们继续访问/Home/Hello?ui-culture=zh-CN, 结果如下

本地化字符串读取成功

本篇源代码 https://github.com/lamondlu/aspnetcore_localizationsample

深入研究.NET Core的本地化机制相关推荐

  1. linux热插拔原理,.NET Core 的热插拔机制的深入探索

    原标题:.NET Core 的热插拔机制的深入探索 转自:老禄 cnblogs.com/LucasDot/p/13956384.html 一.依赖文件*.deps.json的读取 依赖文件内容如下.一 ...

  2. ASP .NET Core 的运行机制和启动(转)

    今天看到一位高人写的一篇讲述ASP .NET Core 的运行机制和启动的文章,非常好,部分内容转一下. ASP.NET Core 的启动和运行机制 - 车骑 - 博客园 (cnblogs.com)h ...

  3. SMART 监控项研究以及存储健康分级机制

    在机械硬盘技术极为成熟的当下,硬盘损坏对普通消费者来说似乎越来越遥远,我自己用的一台 X200 笔记本从 2009 年买来用到现在,那块日立硬盘一点问题都没出过,好像都没有理由换笔记本了嘤嘤嘤-- 不 ...

  4. 集群环境下,你不得不注意的ASP.NET Core Data Protection 机制

    引言 最近线上环境遇到一个问题,就是ASP.NET Core Web应用在单个容器使用正常,扩展多个容器无法访问的问题.查看容器日志,发现以下异常: System.Security.Cryptogra ...

  5. 伦敦大学研究:新的长寿机制,延长端粒,阻止衰老

    衰老,是一个复杂.多阶段.渐进的过程,发生在生命的整个过程.随着时间的流逝,人体的器官.肌肉会逐渐衰老,一些疾病也伴随着年龄的增长而发生,包括癌症.糖尿病.心血管疾病等. 所有细胞都逃不过衰老的命运, ...

  6. 上周热点回顾(10.8-10.14)

    热点随笔: · 微软是如何重写C#编译器并使它开源的(Liam Wang) · 京东云,100倍故障时长赔付,呵呵(影子卓卓) · 码农晋升为技术管理者后,痛并快乐着的纠结内心(IVAN-jsjwk) ...

  7. 前沿科技 | 中科院科学家研究揭示灵活行动选择的神经机制

    来源:中国科学院 6月24日,中国科学院科学家团队--脑科学与智能技术卓越创新中心(神经科学研究所).上海脑科学与类脑研究中心.神经科学国家重点实验室姚海珊研究组在eLife上在线发表了题为<次 ...

  8. 高性能dhcp服务器,基于线程池机制的高性能DHCP服务器研究与实现

    摘要: 随着互联网的蓬勃发展,IP地址资源越来越紧张.DHCP服务是在现有IPv4协议基础上解决IP地址资源短缺问题的有效途径. 目前,多数DHCP服务器是单线程运行,串行处理客户请求的.其应用于大型 ...

  9. dhcp计算机毕业论文,基于线程池机制的高性能DHCP服务器研究与实现-计算机科学与技术专业毕业论文.docx...

    文档介绍: 西北丁业大学硕士学位论文 摘要摘 要随着互联网的蓬勃发展,IP地址资源越来越紧张.DHCP服务是在现有IPv4协议基础上解决IP地址资源短缺问题的有效途径.目前,多数DHCP服务器是单线程 ...

最新文章

  1. SqlDataReader.GetSchemaTable
  2. ubuntu16搭建z-blog博客
  3. 如何在Cloud for Customer overview UI上扩展新的按钮
  4. android中在代码中动态布按钮和画板局并绘制曲线
  5. GCC-__attribute__()(一)属性机制
  6. Linux 测试连接端口
  7. Python随记(27)bs4爬取豆瓣250
  8. 结识51CTO学院后【51CTO学院三周年】
  9. MFC实现简易绘图软件
  10. latex表格内容上下居中_latex怎么让表格里的字上下垂直居中?
  11. ISR:中断服务程序(interrupt service routine)
  12. CL210红帽OpenStack平台架构--介绍overcloud
  13. 【软件测试】软件测试的定义、软件测试的目的
  14. [资源]_清华大学计算机视频教程_31门_种子ed2k_BT下载
  15. 4.如何用代码写计算数学问题
  16. 基于vivado开发xilinx系列FPGA的冷知识(1)——自定义IP核的封装与后期修改
  17. 视频教程-MVC5+EF6之巧租房系统-.NET
  18. Apache#一文掌握Apache Web服务
  19. u盘数据恢复的原理_数据恢复:手把手教你六种U盘数据恢复方法
  20. 我们的机房更环保,数据更安全?

热门文章

  1. Horspool 字符串快速查找算法
  2. 男人别让爱你的女孩流泪
  3. .text 0.958之间居的中文汉化下载
  4. html 文本横竖切换,(横竖屏切换/强制横屏)CSS3 transform 怎样才能中心旋转?
  5. Android 4 +https(如何启动TLS1 1 and TLS1 2)
  6. 1、Locust压力测试环境搭建
  7. golang实现自定义驱动的Cache
  8. saltstack的安装(转载连接)
  9. Funambol DM 安装过程
  10. 在C#中使用SQLite