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的值格式如下

  1. c=zh-CN|uic=zh-CN
  2.  
  3. c=zh-CN
  4.  
  5. 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本地化。

  1. public
    void
    ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddMvc()
  4. .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix);
  5. }

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

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

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

HomeController

  1. public IActionResult Hello()
  2. {
  3. //return Content(_localizer["Hello"]);
  4. return View();
  5. }

Hello.cshtml

  1.  
  2. @{
  3. ViewData["Title"] = "Hello";
  4. }
  5.  
  6. <h2>Good Bye</h2>
  7.  

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

使用ViewLocalizer

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

  1. @using Microsoft.AspNetCore.Mvc.Localization
  2.  
  3. @inject IViewLocalizer Localizer
  4. @{
  5. ViewData["Title"] = "Hello";
  6. }
  7.  
  8. <h2>@Localizer["GoodBye"]</h2>
  1.  

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

    最终效果

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

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

    本地化字符串读取成功

.NET Core多语言的更多相关文章

  1. ASP.NET Core多语言 (转载)

    ASP.NET Core中提供了一些本地化服务和中间件,可将网站本地化为不同的语言文化.ASP.NET Core中我们可以使用Microsoft.AspNetCore.Localization库来实现 ...

  2. .NET CORE 多语言实现方案

    根据市场需求,基于.NET CORE平台开发的RoadFlow工作流平台需要实现多语言版本.经过方案讨论和比对,决定采用.NET自带的本地化功能来实现多语言.话不多说,直接上实现方式. 首先修改Sta ...

  3. 华为联运游戏或应用审核驳回:HMS Core升级提示语言类型错误

    问题描述 最近项目组应用集成华为的HMS Core SDK相关能力后,发布地区选择中国大陆,提交审核,华为审核驳回:在低于2.5.3版本的华为移动服务手机上启动时或调出支付时拉起升级提示为英文,正确的 ...

  4. .NET Core全新路线图(译)

    标签: .NETCore 翻译 承接张善友大大的.NET Core全新路线图,翻译了原文,水平有限,尽量一观. 原文地址<.NET Core Roadmap>,原作者Scott Hunte ...

  5. .Net Core[译文]

    新文档 /* GitHub stylesheet for MarkdownPad (http://markdownpad.com) */ /* Author: Nicolas Hery - http: ...

  6. asp.net core系列 32 EF查询数据 必备知识(1)

    一.查询的工作原理 Entity Framework Core 使用语言集成查询 (LINQ) 来查询数据库中的数据. 通过 LINQ 可使用 C#(或你选择的其他 .NET 语言)基于派生上下文和实 ...

  7. Dart 语言简述

    Dart是一种“结构化的web编程”语言,Dart编程语言在所有现代浏览器和环境中提供高性能.Dart是谷歌开发的计算机编程语言,后来被ECMA认定为标准. Dart重要的概念: 1.所有的东西都是对 ...

  8. 【目录】asp.net core系列篇

    随笔分类 - asp.net core系列篇 asp.net core系列 68 Filter管道过滤器 摘要: 一.概述 本篇详细了解一下asp.net core filters,filter叫&q ...

  9. .Net Core 智能提示汉化包

    在.Net Core 2.x 版本,Microsoft 官方没有提供 .Net Core 正式版的多语言安装包.因此,我们在用.Net Core 2.x 版本作为框架目标编写代码时,智能提成是英文的. ...

随机推荐

  1. js判断是手机还是PC端

    有时接触一些手机上的适应,需要知道是pc 还是移动端 function IsPC() { var userAgentInfo = navigator.userAgent; var Agents = [ ...

  2. C++学习笔记(2)----模板

    1. 与其他任何类相同,我们既可以在类模板内部,也可以在类模板外部为其定义成员函数,且定义在类模板内的成员函数被隐式声明为内联函数. 2. 默认情况下,对于一个实例化了的类模板,其成员只有在使用时才被 ...

  3. Jarvis OJ-Reverse题目Writeup

    做一道更一道吧233333 DD-Android Easy 下载apk,先安装一下试试吧…… 猜测是输入正确的内容后给flag吧 将后缀改成zip,解压,用dex2jar处理classes.dex,然 ...

  4. 线性表的顺序存储结构之顺序表类的实现_Java

    在上一篇博文——线性表接口的实现_Java中,我们实现了线性表的接口,今天让我们来实现线性表的顺序存储结构——顺序表类. 首先让我们来看下顺序表的定义: 线性表的顺序存储是用一组连续的内存单元依次存放 ...

  5. php foreach 报 “Cannot create references to elements of a temporary array expression”

    今天在项目中用php foreach数据库查询结果时,为了方便没有判断数据是否存在,直接用(array)强制转换数据时,刚开始网页始终打不开,就报502,一头懵,突然间php报“Cannot crea ...

  6. github连接提示

    解决办法: 1,将连接方式从http更换为ssh.注意,github.com后面一定有(冒号): git remote rm origin git remote add origingit@githu ...

  7. springboot监控

    springboot版本 <parent> <groupId>org.springframework.boot</groupId> <artifactId&g ...

  8. Sentinel配置及部署

    一.sentinel.conf  port 26379 dir /opt/redis-3.0.7/dataSentinel sentinel monitor mymaster 192.168.1.15 ...

  9. Azure 中部署WordPress的方法

    一.Azure 中创建WordPress虚拟机(1).登陆Azure:打开Azure 官网,点击右侧上方的登陆Azure门户,输入Azure帐号与密码,点击 登陆 . (2).创建Wordpress虚 ...

  10. Project Euler 44: Find the smallest pair of pentagonal numbers whose sum and difference is pentagonal.

    In Problem 42 we dealt with triangular problems, in Problem 44 of Project Euler we deal with pentago ...