[译]使用LazZiya.ExpressLocalization开发多语言支持的ASP.NET Core 2.x项目

640?wx_fmt=gif

介绍

开发多语言支持的ASP.NET Core 2.x Web应用程序需要大量的基础架构设置,并且耗费时间和精力。这篇文章,我们将使用LazZiya.ExpressLocalization nuget包一步本地化支持。

背景

大多数网络应用程序都是基于网址的本地化。因此我们可以在网址中看到所选的语言。例如http://www.example.com/en/Contact。不幸的是,ASP.NET Core 仅提供一下请求语言程序。

  • QueryStringRequestCultureProvider

  • CookieRequestCultureProvider

  • AcceptLanguageHeaderRequestCultureProvider

为了实现路由值本地化,我们需要构建自定义本地化程序并定义全局路由模版。基本上,我们需要完成一下本地化步骤才能拥有完全本地化的Web应用程序。

  • Build route value request culture provider

  • Define global route template for culture parameter

  • Setup DataAnnotations localization

  • Setup ModelBinding error messages localization

  • Setup identity describer error messsages

  • Setup view localization

  • Setup client side validation scripts for validating localized number, dates, etc.

  • Provide localized resources for each part 所有这些步骤都需要耗费大量工作和时间。因此,使用LazZiya.ExpressLocalization包的好处就是通过简单的代码消除在本地化设置方面耗费的时间和精力。

创建工程

让我们创建一个基于ASP.NET Core 2.2 的Web应用程序(我使用的是VS 2019)

  1. 创建一个新工程,选择ASP.NET Core Web Application.

    640?wx_fmt=png

  2. 点击下一步,给工程一个友好的名称,点击创建

     640?wx_fmt=png

  3. 选择Web应用程序,并确保将身份验证更改为个人用户账户

     640?wx_fmt=png

  4. 点击创建,等待解决方案创建完成。完成后,可以通过解决方案资源管理器中选择项目名称来执行测试运行,然后按(CTRL+B)构建项目,按(CTRL+W)在浏览器中运行,而不是调试。

     640?wx_fmt=png

安装 LazZiya.ExpressLocalization

  1. 在项目名称下的解决方案资源管理器中,右键单击Dependencies并选择Manage

    Nuget Packages

     640?wx_fmt=png

  2. 转到Browse选项卡,并搜索LazZiya,选择LazZiya.ExpressLocalization,点击Install,选择最新版本(写这篇文章是最新版本为v1.1.1)

     640?wx_fmt=png

  3. 它将要求安装两个软件包,点击OK,等待安装完成

  • LazZiya.ExpressLocalization (required for all localization setup)

  • LazZiya.TagHelpers (required for client side localization validation and language dropdown)

创建本地化资源

我已经为项目准备了本地化资源,因此你不必郎芬时间来创建本地化资源。 在项目根路径创建一个新文件夹命名为“LocalizationResources”

640?wx_fmt=png

在LocalizationResources文件夹下,创建个public类, 名称为“ViewLocalizationResource”,这个类将用于对资源文件进行分组已进行视图本地化。

namespace ExpressLocalizationSample.LocalizationResources	
{	public class ViewLocalizationResource	{	}	
}

在LocalizationResources 文件夹下创建public类,名称为“ExpressLocalizationResource”,此类用于对identity,模型绑定(model binding)和数据注解(data annotation)的分组资源文件。

  1. namespace ExpressLocalizationSample.LocalizationResources

  2. {

  3. public class ExpressLocalizationResource

  4. {

  5. }

  6. }

我们将使用这两个类将资源类型传递个快速本地化方法。

最后,从此存储库文件夹下载先关的语言资源文件。请注意,你需要为每种语言下载两个文件,例如ExpressLocalizationResource.tr.resx 和ViewLocalizationResource.tr.resx。复制下载的文件到LocalizationResources文件夹

640?wx_fmt=png

在代码中使用

最后,我们已经准备好进行本地化设置了。 打开startup.cs文件并添加所需的语言列表,然后添加一步本地化设置,

  1. var cultures = new[]

  2. {

  3. new CultureInfo("tr"),

  4. new CultureInfo("ar"),

  5. new CultureInfo("hi"),

  6. new CultureInfo("en"),

  7. };


  8. services.AddMvc()

  9. .AddExpressLocalization<ExpressLocalizationResource, ViewLocalizationResource>(

  10. ops =>

  11. {

  12. ops.ResourcesPath = "LocalizationResources";

  13. ops.RequestLocalizationOptions = o =>

  14. {

  15. o.SupportedCultures = cultures;

  16. o.SupportedUICultures = cultures;

  17. o.DefaultRequestCulture = new RequestCulture("en");

  18. };

  19. })

  20. .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

然后在Configure方法下,配置应用程序以使用请求本地化

  1. app.UseRequestLocalization();

添加语言导航

在Pages文件夹下,打开_ViewImports.cshtml文件,并添加LazZiya.TagHelpers,这个有助于创建语言导航。

  1. @using LazZiya.TagHelpers

  2. @addTagHelper *, LazZiya.TagHelpers

打开Pages/Shared/Layout.cshtml文件,并在LoginPartial 标签添加语言导航标签。

  1. <partial name="_LoginPartial" />

  2. <language-nav view-context="ViewContext"></language-nav>

LanguageNav有一个必须的参数“view-context”。可以查阅有关LanguageNav tag helper资源。

我们进行第一次运行:

640?wx_fmt=png

运行的很好,到目前为止我们的导航支持多语言,但我们仍然需要本地化视图已查看本地化版本。

本地化视图

已下载的“ViewLocalizationResource.xx.resx”文件中已提供默认项目的本地化文本,如果需要为视图添加更多自定义文本,需要将它们添加到“ViewLocalizationResource.xx.resx”文件中。 打开Pages/_ViewImport.cshtml文件并注入SharedCultureLocalizer,需要引用ExpressLocalization。

  1. @using LazZiya.ExpressLocalization

  2. @inject SharedCultureLocalizer _loc

然后打开Pages/Index.cshtml并使用文本本地化方法。

  1. @page

  2. @model IndexModel

  3. @{

  4. ViewData["Title"] = _loc.Text("Home page");

  5. }


  6. <div class="text-center">

  7. <h1 class="display-4">@_loc.Text("Welcome")</h1>

  8. <p>@_loc.Text("Learn about

  9. <a href='https://docs.microsoft.com/aspnet/core'>

  10. building Web apps with ASP.NET Core</a>").</p>

  11. </div>

使用相同的过程来本地化其他视图中的所有文本。

640?wx_fmt=png

本地化URLs

虽然页面处理默认的语言中,但是如果点击PrivacyLoginReigster链接,将会注意到我们丢失了所选的语言,这是因为我们未将语言路由值添加到链接中。

打开Pages/Index.cshtml文件,添加System.Globalization的引用 @usingSystem.Globalization

然后打开Pages/_LoginPartial.cshtml文件,在页面顶部添加一个culture参数

  1. @{

  2. var culture = CultureInfo.CurrentCulture.Name;

  3. }

使用此参数为所有链接提供语言路由值,

  1. <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register"

  2. asp-route-culture="@culture">@_loc.Text("Register")</a>

对项目中所有的视图执行此操作。

本地化身份验证视图

诸如登录、注册、和配置文件等相关Identity进行搭建后才能进行修改。 右键点击项目名称,选择Add --> New Scaffolded Item...

640?wx_fmt=png

选择Identity,并点击Add

640?wx_fmt=png

选择Override all files,并选择ApplicationDbContext

640?wx_fmt=png

点击Add后,将创建一个新的域文件夹,包括所有与Identity相关的视图

640?wx_fmt=png

Identity域包括三个_ViewImports文件夹:

  • Areas/Identity/Pages/_ViewImports.cshtml

  • Areas/Identity/Pages/Account/_ViewImports.cshtml

  • Areas/Identity/Pages/Account/Manage/ViewImports.cshtml 像以前对Pages/ViewImports.cshtml所做的那样,将以下代码添加到所有的这些文件中

  1. @using System.Globalization


  2. @using LazZiya.TagHelpers

  3. @addTagHelper *, LazZiya.TagHelpers


  4. @using LazZiya.ExpressLocalization

  5. @inject SharedCultureLocalizer _loc

像以前一样,浏览修改里面的视图文件并添加上语言路径参数,以下是对Register.cshtml页面的修改

  1. @page

  2. @model RegisterModel

  3. @{

  4. ViewData["Title"] = _loc.Text("Register");

  5. var culture = CultureInfo.CurrentCulture.Name;

  6. }


  7. <h1>@ViewData["Title"]</h1>


  8. <div class="row">

  9. <div class="col-md-4">

  10. <form asp-route-returnUrl="@Model.ReturnUrl"


  11. method="post" asp-route-culture="@culture">

  12. <h4>@_loc.Text("Create a new account").</h4>

  13. <hr />

  14. <div asp-validation-summary="All" class="text-danger"></div>

  15. <div class="form-group">

  16. <label asp-for="Input.Email"></label>

  17. <input asp-for="Input.Email" class="form-control" />

  18. <span asp-validation-for="Input.Email"


  19. class="text-danger"></span>

  20. </div>

  21. <div class="form-group">

  22. <label asp-for="Input.Password"></label>

  23. <input asp-for="Input.Password" class="form-control" />

  24. <span asp-validation-for="Input.Password"


  25. class="text-danger"></span>

  26. </div>

  27. <div class="form-group">

  28. <label asp-for="Input.ConfirmPassword"></label>

  29. <input asp-for="Input.ConfirmPassword" class="form-control" />

  30. <span asp-validation-for="Input.ConfirmPassword"


  31. class="text-danger"></span>

  32. </div>

  33. <button type="submit"


  34. class="btn btn-primary">@_loc.Text("Register")</button>

  35. </form>

  36. </div>

  37. </div>


  38. @section Scripts {

  39. <partial name="_ValidationScriptsPartial" />

  40. }

本地化DataAnnotations

如果你运行页面并执行一些无效的输入,你会发现验证消息是英文的,因此我们需要本地化数据注释消息,如Required、StringLength等。

640?wx_fmt=png

打开Areas/Identity/Pages/Account/Register.cshtml.cs文件并在顶部添加LazZiya.ExpressLocalization.Messages的引用,它包含所有DataAnnotations错误消息的预定义结构,以便于使用: @usingLazZiya.ExpressLocalization.Messages;

然后修改输入模型如下所示:

  1. public class InputModel

  2. {

  3. [Required(ErrorMessage = DataAnnotationsErrorMessages.RequiredAttribute_ValidationError)]

  4. [EmailAddress(ErrorMessage = DataAnnotationsErrorMessages.EmailAddressAttribute_Invalid)]

  5. [Display(Name = "Email")]

  6. public string Email { get; set; }


  7. [Required(ErrorMessage = DataAnnotationsErrorMessages.RequiredAttribute_ValidationError)]

  8. [StringLength(100, ErrorMessage =

  9. DataAnnotationsErrorMessages.StringLengthAttribute_ValidationErrorIncludingMinimum,

  10. MinimumLength = 6)]

  11. [DataType(DataType.Password)]

  12. [Display(Name = "Password")]

  13. public string Password { get; set; }


  14. [DataType(DataType.Password)]

  15. [Display(Name = "Confirm password")]

  16. [Compare("Password",

  17. ErrorMessage = DataAnnotationsErrorMessages.CompareAttribute_MustMatch)]

  18. public string ConfirmPassword { get; set; }

  19. }

编译并允许项目,将看到本地化数据注释的错误消息

640?wx_fmt=png

客户端验证

服务器端验证工作正常,但是我们仍然需要添加客户端验证,因此在提交表单之前,将在客户端验证输入字段。 客户端验证的一个主要问题就是验证数字、日期等本地化输入。例如,如果你使用小数输入,你讲看到1.3的本地化数字验证在英文中有效,但是对土耳其语无效,因为它应为1,3(逗号而不是句点) 在这里,我们将使用LazZiya.TagHelpers附带的另一个有用的tag helper。 打开Register.cshtml页面并在默认验证脚本partial下添加 tag helper。

  1. @section Scripts {

  2. <partial name="_ValidationScriptsPartial" />

  3. <localization-validation-scripts></localization-validation-scripts>

  4. }

这就是全部,现在将在使用本地化验证消息提交表单之前验证字段。

640?wx_fmt=png

示例项目

你可以从Github下载包含超过19种语言包的示例项目

  • https://github.com/LazZiya/ExpressLocalizationSample

参考

在这里阅读有关使用nuget包的更多详细信息:

  • LazZiya.TagHelpers

  • Manually installing client side localization validation scripts

  • Manually creating language drop down navigation

  • Even more can be found on my website http://ziyad.info

原文地址

https://www.codeproject.com/Articles/5061604/Developing-Multicultural-ASP-NET-Core-2-x-Project

注:原创声明为翻译原创



.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 
640?wx_fmt=jpeg

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

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

相关文章

2019 ICPC World Finals Problem B. Beautiful Bridges

2019 ICPC World Finals Problem B. Beautiful Bridges Solution 太菜了&#xff0c;sbsbsb题调了一个下午。 首先有一个显然的O(n3)O(n^3)O(n3)的dpdpdp&#xff0c;令fif_ifi​表示最后一个桥柱在iii的最小代价&#xff0c;枚举上一个桥柱jjj&#xff0c;因为地面超过桥拱…

ac 梦幻布丁 启发式合并

题意&#xff1a;中文题。 对于每种颜色&#xff0c;我们都可以看成一个集合。让后把一种颜色变成另一种颜色就转换成了把两个集合的合并问题。显然我们有一个复杂度为O(NlogN)O(NlogN)O(NlogN)的启发式合并能完美的解决这个问题。 解决合并问题了&#xff0c;现在需要解决如何…

VS Code 1.35 发布!全新 logo 来临,远程开发进入稳定版

近期&#xff08; 北京时间 2019 年 6 月 6 日 &#xff09;&#xff0c;微软发布了 Visual Studio Code 1.35 版本&#xff0c;带来了众多更新。全新的 logo全新的图标来啦~ 这一次的图标更新历时两个月&#xff0c;VS Code 团队倾听了用户们的反馈。大家对新图标还喜欢吗&…

P2617 Dynamic Rankings 整体二分

树套树板子题&#xff0c;但是整体二分不管是时间复杂度还是空间复杂度都表现更优秀&#xff0c;所以用整体二分来水一波。 普通的整体二分是没有修改操作的。然鹅我们处理修改操作也比较容易&#xff0c;直接减上这个数&#xff0c;让后加上修改之后的数即可。这样按照时间戳来…

基于Domain Driven Design&Clean Architecture原则分层的新启动模板

本文的内容将在0.18.0中发布. Abp中文网将同步更新框架.敬请期待...MVC应用程序启动模板介绍MVC应用程序启动模板是基于领域驱动设计(DDD)分层(或根据偏好分层)的应用程序结构.在这篇文档中详细介绍了解决方案结构和项目参阅ASP.NET Core MVC 模板入门创建此模板的新解决方案并…

.Net Core 微服务容器系列基础目录篇

1.开场白HI&#xff0c;各位老铁&#xff0c;大家端午好&#xff0c;之前写了些关于.net core商城系列的文章&#xff0c;有点乱&#xff0c;今天心血来潮想着整理一下&#xff08;今天只是先把目录列出来&#xff0c;后面的每篇文章这两天会进行重新修改的&#xff0c;目前先将…

感谢诸君的陪伴,见证微信 SDK 的成长,内含黑科技福利

Senparc.Weixin SDK5000Stars5000 Star5005005000 Stars今天 SDK 已经超过 5000 Stars在此感谢大家的每一份支持和一直以来的关注是你们的信任和陪伴给了我们前行的力量 在未来的日子里也希望大家能够继续支持我们我们将以优秀的产品和服务来回馈你们的支持&#xff01;愿我们携…

我,宇宙最强编辑器,支持远程开发

Visual Studio Code 五月份更新之 1.35 版本已发布。此次更新的亮点包括更新 Visual Studio Code 图标 - 新版本更新了 logo。改进“转到定义&#xff08;Go to Definition&#xff09;”行为 - 通过多个定义的显示&#xff0c;更快速进行导航&#xff08;Navigation&#xff0…

.NET Core Run On Docker By Kubernetes 系列文章汇总

前言介绍.NET Core是微软新一代主力编程平台&#xff0c;开源、免费、跨平台、轻量级、高性能&#xff0c;支持Linux、Docker、k8s等环境&#xff0c;适合开发微服务、云原生、大型互联网应用、全开源解决方案。Docker是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们…

HDU - 1811 Rank of Tetris 并查集 + 拓扑序 +me

link 题意&#xff1a; 首先看到排名自然想到拓扑序&#xff0c;但是存在等于的情况&#xff0c;这就启发我们把等于的情况缩成一个点&#xff0c;让后在缩点后的图中进行拓扑即可。 对于不合法的情况当然是拓扑序没有遍历到应该遍历的点&#xff0c;所以只需要检查遍历了几个…

.NET Core 中使用 Humanizer 显示友好时间格式

今天在将一个 .net framework 项目迁移至 .net core 的过程中&#xff0c;在迁移到显示友好时间格式&#xff08;比如“1分钟前”&#xff0c;“1小时前”&#xff09;的代码时&#xff0c;找了找看有没有对应的开源库&#xff0c;结果找到了 Humanizer &#xff0c;顺手体验了…

Codeforces Round #698 (Div. 2)

B题 题意&#xff1a;定义一个牛逼的数是这个数十进制中至少包含一个数d。 现在给定d和若干询问&#xff0c;每个询问一个x&#xff0c;问x能否分解成若干d构成的牛逼的数之和。 看起来挺难搞的&#xff0c;不能快速的判断是否是牛逼的数而且也不能很好的挑选合适的数组成x。那…

Visual Studio 2019 16.1 使用 .NET Core 3.0

一.前言早在很久之前微软便公布 .NET Core 3.0 将支持开发Winform应用程序等等新特性&#xff0c;现如今 .NET Core 3.0 预览版已经出来第五个预览版了&#xff0c;从 .NET Core 2.2 到 3.0 将是一个大的跨越&#xff0c;从发布的预览版本个数来看&#xff0c;将会增加很多的功…

Insider Dev Tour 2019 全球巡演 苏州站

Insider Dev Tour微软&#xff0c;全球&#xff0c;巡演&#xff0c;内幕大会介绍Insider Dev Tour 是 Microsoft Build 技术大会的全球巡演活动&#xff0c;是微软面向广大开发者、技术爱好者&#xff0c;介绍其未来技术发展方向的盛会。在 Microsoft Build之后&#xff0c;会…

.NET Core 性能分析: xUnit.Performance 简介

xunit-performance 是xUnit的一个扩展&#xff0c; 使用它可以对.NET Core项目进行性能测试。官网&#xff1a;https://github.com/Microsoft/xunit-performancexUnit大家可能都用过&#xff0c;它是用来做单元测试的&#xff0c;它可以很快给开发人员功能是否OK的反馈。和xUni…

TeamCity+Rancher+Docker实现.Net Core项目DevOps

1.准备项1.1.服务器一台&#xff0c;1H4G&#xff08;更小内存应该也可以&#xff0c;自行测试&#xff09;&#xff0c;系统&#xff1a;Ubuntu 16.04 64位1.2.数据库一个&#xff0c;MYSQL,MSSQL都可以&#xff08;还有其他的&#xff0c;自行配置&#xff09;,教程是MSSQL1.…

.NET工程师的书单

短暂的假期里抽空整理了一份书单&#xff0c;以个人的见解这些应该是值得.NET工程师至少去看一遍的书籍。但所罗列的仅包括国内目前已出版的国外书籍的英文版&#xff0c;并不包含中文翻译及相关领域的中文书籍。这里没有任何歧视之意&#xff0c;只是更推荐工程师具备熟练阅读…

微服务架构下静态数据通用缓存机制

在分布式系统中&#xff0c;特别是最近很火的微服务架构下&#xff0c;有没有或者能不能总结出一个业务静态数据的通用缓存处理机制或方案&#xff0c;这篇文章将结合一些实际的研发经验&#xff0c;尝试理清其中存在的关键问题以及探寻通用的解决之道。什么是静态数据这里静态…

Codeforces Round #700 (Div. 2) C. Searching Local Minimum 交互二分

传送门 题意: 给一个数组&#xff0c;让你找到a[i]<min(a[i1],a[i−1])a[i]<min(a[i1],a[i-1])a[i]<min(a[i1],a[i−1])位置iii&#xff0c;每次询问iii可以得到a[i]a[i]a[i]&#xff0c;最多询问100次&#xff0c;且a[0]a[n1]∞a[0]a[n1]∞a[0]a[n1]∞。 我们考虑假…

WCF服务端的.NET Core支持项目Core WCF 正式启动

长期以来在wcf客户端库https://github.com/dotnet/wcf里反应最强烈的就是.NET Core的服务端支持https://github.com/dotnet/wcf/issues/2695&#xff0c;在build 2019大会上微软明确说明在将WinForms&#xff0c;WPF和Entity Framework 6添加到.NET Core 3.0后&#xff0c;不打…