手机版

深入讲解中的本地化机制 净核心

时间:2021-08-29 来源:互联网 编辑:宝哥软件园 浏览:

前言

ASP.NET芯提供部分本地化服务和中间件,可以将网站本地化为不同的语言和文化。

在ASP.NET核心,我们可以使用微软。aspnetcore。实现本地化的本地化库。

在上面的版本中。NET Core 2.0,微软。微软已经包含了本地化。所有,所以我们不需要手动引入其他类库。

创建一个MVC网站

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

配置启动类

在ASP.NET芯,如果要开始本地化,需要通过使用服务添加本地化服务。在启动类的ConfigureServices方法中添加本地化。

public void ConfigureServices(IServiceCollection services){ services。添加本地化(o={ o . Resources path=' Resources ';});服务。AddMvc();}在这种方法中,我们将Resources文件夹指定为存储翻译文件的目录。

注意:如果您没有指定存储翻译文件的目录,默认情况下,ASP.NET核心将从网站的根目录中读取它们。

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

public void Configure(IApplicationBuilder应用程序,IHostingEnvironment env){ app。UseStaticFiles();IListCultureInfo supported cultures=new list culture info { new culture info(' en-US '),new CultureInfo('zh-CN ',};app。UseRequestLocalization(new RequestLocalizationOptions { DefaultRequestCulture=new RequestCulture(' en-US '),supported cultures=supported cultures });app。UseMvc(routes={ routes。MapRoute(name: 'default ',template : ' { controller=Home }/{ action=Index }/{ id?}');});}app。UseRequestLocalization必须放在app.UseMvc之前,DefaultRequestCulture参数指定默认语言和区域性。也就是说,当用户未指定任何区域性时,默认语言和区域性SupportedCultures和supporteduiccultures指定当前应用程序支持的所有语言和区域性。注意: SupportedCultures指定数字和日期格式,SupportedCultures指定翻译文件。

添加资源文件

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

首先,我们创建一个Resources文件夹,这是我们在前面的Startup类中配置的目录名。然后我们在资源文件夹中添加一个资源文件,并将其命名为controller . homecontroller . zh-cn . resx .在这个资源文件中,添加一个字段Hello,并将其值设置为“Hello”。

在控制器中获取本地化字符串

现在我们打开默认生成的HomeController,清空其中的所有操作,并添加一个新的操作。代码如下:

公共类HomeController : Controller { public HomeController(){ } public IActionResult Hello(){ return Content(' Hello ');}}项目启动后访问/首页/Hello,结果如下

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

公共类HomeController : Controller { private readonly is inglocalizerhomecontroller _ localizer;公共HomeController(is tinglocalizerhomecontroller localizer localizer localizer){ _ localizer=localizer;} public IActionResult Hello() {返回Content(_ localizer[' Hello ']);}}代码解释

Istlinglocalizer是本地化字符串访问器的通用接口。这里,我们通过依赖注入的方式将它注入到HomeController的构造函数中。我们可以通过istringglocalizer的属性访问器获取不同语言对应字段的文本。最终效果

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

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

现在让我们修改网址并访问/主页/你好?Ui-culture=zh-CN,结果如下

预期的“Hello”输出正确,说明ASP.NET芯默认支持以Url中文化参数的形式设置当前网站使用的语言和文化。

资源文件命名

为什么我们之前添加了一个名为controller . homecontroller . zh-cn . resx的资源文件,本地化的字符串访问器IStringLocalizer可以定位这个文件并读取其中的字段属性?

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

ASP.NET核心资源文件的名称由两部分组成:

移除程序集名称的完整类名。以前面的例子为例:

我们创建了一个本地化的字符串访问器接口,它的泛型类型是HomeController,它的完整类名是LocalizationSample。控制器。HomeController,当前程序集的名称是Localizationsample,所以去掉程序集名称后,剩下的就是controllers.HomeController,当我们将区域性参数设置为zh-CN时,ASP.NET Core找到的资源文件名是controller . HomeController . zh-CN . resx,这正是我们之前添加的中文语言和区域性资源文件名。

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

您可以在资源目录下创建以下目录结构

资源

控制器

HomeController.zh-CN.resx

本地化字符串访问器也可以自动定位该文件。

默认语言和区域性提供程序

默认情况下,ASP.NET核心的本地化中间件支持三种语言和文化提供商

网址Cookie中的查询字符串请求标题网址中的查询字符串

ASP。NET core将从URL中的区域性参数获取当前应用程序使用的语言和区域性,这就是为什么在前面的示例中可以正确输出“hello”

除了指定ui-culture参数之外,还可以使用区域性参数来指定用于当前格式化时间和数字的语言和区域性。

?culture=zh-CNui-culture=zh-CN?文化=zh-CN?Ui-culture=zh-CNTips:当仅指定区域性或Ui-culture参数时,ASP.NET核心将自动将区域性和ui-culture设置为相同。那是?文化=zh-CN相当于?文化=zh-CNui-文化=zh-CN

饼干

ASP。NET Core还支持使用Cookie设置当前应用程序使用的语言和区域性。默认的Cookie名称是。文化

的值格式。AspNetCore。文化如下

c=zh-cn | UIC=zh-CNC=zh-cn UIC=zh-cn其中c代表文化,UIC代表ui-culture。

接下来,我们使用Chrome的开发工具向当前网页添加语言和文化Cookie

然后我们访问了/Home/Hello,也正确输出了“Hello”

这表明ASP.NET核心已经从Cookie中读取了语言和文化配置

请求标题

除了URL查询字符串和cookies,ASP.NET核心还支持在请求头中指定语言和文化。请求头中的语言和区域性字段的名称是“接受-语言”。

接受语言的文档见https://developer . Mozilla . org/zh-cn/docs/web/http/headers/Accept-Language

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

如何在视图中使用本地化

除了控制器,我们在视图中更多地使用本地化。如果要在视图中使用本地化,应该首先在启动类的ConfigureServices方法中启用视图本地化。

public void ConfigureServices(IServiceCollection services){ services。AddMvc()。addviewclocalization(languageviewclocationexpanderformat。后缀);}这里,languageviewplocationexpanderformat支持两种方式,类似于Controller之前的本地化文件名约定

后缀,例如/resources/home/Hello . zh-cn . resxpath,例如/resources/home/zh-cn/hello . resx接下来,我们修改HomeController的代码,hello方法将返回一个View

家庭控制器

public IActionResult Hello(){//返回Content(_ localizer[' Hello ']);返回视图();}Hello.cshtml

@ { view data[' Title ']=' Hello ';} H2再见/H2然后我们创建如下所示的目录结构,创建资源文件Hello.zh-CN.resx,并添加值为“再见”的再见字段

使用视图本地化器

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

@使用微软。AspNetCore . MVC . localization @ inject iview Localizer Localizer @ { view data[' Title ']=' Hello ';} H2 @ Localizer[' PayOn ']/H2这里,我们使用ViewLocalizer来读取本地化文本,其用法与IStringLocalier相同,IStringLocalier通过属性访问器来访问对应字段的本地化文本。

最终效果

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

然后我们继续参观/回家/你好?Ui-culture=zh-CN,结果如下

已成功读取本地化字符串

这个源代码https://github.com/lamondlu/aspnetcore_localizationsample(本地下载)

摘要

以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。

版权声明:深入讲解中的本地化机制 净核心是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。