介绍

开发多语言支持的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.

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

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

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

安装 LazZiya.ExpressLocalization

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

    Nuget Packages

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

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

  • LazZiya.ExpressLocalization (required for all localization setup)

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

创建本地化资源

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

在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文件夹

在代码中使用

最后,我们已经准备好进行本地化设置了。 打开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资源。

我们进行第一次运行:

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

本地化视图

已下载的“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>

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

本地化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...

选择Identity,并点击Add

选择Override all files,并选择ApplicationDbContext

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

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等。

打开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. }

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

客户端验证

服务器端验证工作正常,但是我们仍然需要添加客户端验证,因此在提交表单之前,将在客户端验证输入字段。 客户端验证的一个主要问题就是验证数字、日期等本地化输入。例如,如果你使用小数输入,你讲看到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. }

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

示例项目

你可以从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 

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

  1. 使用LazZiya.ExpressLocalization开发多语言ASP.NET Core 2.x项目

    目录 介绍 背景 创建项目 安装LazZiya.ExpressLocalization 创建本地化资源 使用代码 添加语言导航 本地化视图 本地化URL 本地化标识(Identity)视图 本地化数据 ...

  2. c开发 易语言支持库,易写易库-用易语言开发易语言支持库.pdf

    易写易库-用易语言开发易语言支持库 易写易库(EXEK)用户手册 版本:0.2 作者:liigo,/liigo 时间:2008.10 概述 EXEK EXEK "易写易库(EEXXEEKK) ...

  3. “易写易库(EXEK)”项目启动,用易语言开发易语言支持库

    "易写易库"(EXEK,E Xie E Ku)项目已经启动,用易语言开发易语言支持库.我(liigo)准备用一个月左右的业余时间,完成本项目的一期工程. 用易语言开发易语言支持库, ...

  4. 将 ASP.NET Core 2.1 升级到最新的长期支持版本ASP.NET Core 3.1

    目录 前言 Microsoft.AspNetCore.Mvc.ViewFeatures.Internal 消失了 升级到 ASP.NET Core 3.1 项目文件(.csproj) Program. ...

  5. 使用LazZiya.ExpressLocalization开发多区域性ASP.NET Core 3、2、1项目

    目录 背景 创建项目 安装LazZiya.ExpressLocalization 创建本地化资源 添加语言导航 本地化视图 选项1 选项2 本地化URL 本地化身份(Identity)视图 本地化自定 ...

  6. 使用Docker支持创建ASP.NET Core应用程序

    目录 背景 Docker包含什么? 我们为什么需要它? 使用Docker支持创建ASP.NET核心应用程序 什么是Dockerfile? 从Dockerfile生成Docker镜像 容纳现有的多层应用 ...

  7. C#如何开发多语言支持的Winform程序

    C# Winform项目多语言实现(支持简/繁/英三种语言) 有很多种方案实现多语言,我在这里介绍一种最简单最容易理解的,作为教学材题应该从通俗易懂入手.在写这篇文章之前,本来想用枚举窗体对象成员的方 ...

  8. 具有完整静态文件(JS、CSS)支持的 ASP.NET Core 3.x 动态可加载插件

    从 Github 下载源代码 - 961 KB 介绍 从3.0版开始,ASP.NET Core提供了一种使用Application Parts将应用程序拆分为模块的方法. 一个解决方案可能包含一个We ...

  9. ASP.NET Core MVC+EF Core从开发到部署

    笔记本电脑装了双系统(Windows 10和Ubuntu16.04)快半年了,平时有时间就喜欢切换到Ubuntu系统下耍耍Linux,熟悉熟悉Linux命令.Shell脚本以及Linux下的各种应用的 ...

最新文章

  1. python实现找零钱_找零钱的最优步骤 探究(python)
  2. WebStorm设置Ctrl+0恢复默认字体大小,设置全局字号大小
  3. TPFanControl v0.62 + 汉化补丁
  4. ExtJS入门(01)部署介绍
  5. 企业实战(Jenkins+GitLab+SonarQube)_08_jenkins安装和第一个Java项目构建
  6. 2. OD-爆破exe验证程序
  7. 素数筛选法(埃氏筛 欧拉筛)
  8. 不用ajax调用搞后台小技巧
  9. 惠普企业警告:Sudo 漏洞可使攻击者获得 Aruba 平台的 root 权限
  10. Unity3D吐槽2--AnimationEvent
  11. Angular 分页
  12. Flutter系列之改变CupertinoSwitch的大小
  13. 京东方高级副总裁姜幸群:AIoT技术赋能企业物联网转型
  14. 笔记本光驱改固态硬盘装系统小记
  15. 导函数连续、可导、可微、连续、有界、可积的关系,史上最全!一张图搞定!
  16. 编程需要那些数学和计算机知识点,学习编程需要哪些基础?
  17. Vue绘制折线图并渲染数据
  18. python dataframe根据多列排名并生成序号_将rank字段添加到pandas dataframe,按唯一组和多列排序...
  19. eclipse注释出现问号
  20. 全站仪,激光跟踪仪,激光干涉仪,激光测距仪

热门文章

  1. Teams的Incoming Webhook
  2. 如何使用卡巴斯基急救盘清理感染的PC
  3. 智能家居设备_您的智能家居设备正在监视您吗?
  4. 二进制安位处理_处理器与安​​全性之间的联系是什么?
  5. matlab胡良剑第五章,MATLAB习题参考答案(胡良剑,孙晓君)
  6. 三、Python-列表
  7. UVA 1609 Foul Play 不公平竞赛 (构(luan)造(gao)+递归)
  8. 九度 1376 最近零子序列
  9. 图像处理技术(二)滤波去噪
  10. VS扩展CodeMaid代码整理插件