本文共 6538 字,大约阅读时间需要 21 分钟。
目录
开发多语言的SP.NET Core 2.x Web应用程序需要大量的基础架构设置,并且需要花费时间和精力。在本文中,我们将使用LazZiya.ExpressLocalization nuget包一步本地化我们的Web应用程序。
大多数Web应用程序都使用基于URL的本地化,因此我们可以在URL中查看所选文化,例如http://www.example.com/en/Contact。不幸的是,ASP.NET Core仅提供以下请求文化提供程序:
为了实现路由本地化,我们需要构建自定义本地化提供程序并定义全局路由模板,因此基本上,我们需要完成以下本地化步骤才能拥有完全本地化的Web应用程序:
所有这些步骤都需要大量工作并且花费太多的时间。因此,LazZiya.ExpressLocalization nuget包的好处是,它通过简单的代码行消除了本地化设置的时间和工作量。
让我们首先创建一个基本的ASP.NET Core 2.2 Web应用程序(我正在使用VS2019):
1、通过选择ASP.NET Core Web Application创建一个新项目:
2、单击Next,为项目指定一个友好名称,然后单击Create:
3、选择Web应用程序,并确保将身份验证更改为个人用户帐户。
4、单击Create并等待解决方案创建基本模板,完成后,您可以通过在解决方案资源管理器中选择项目名称来执行测试运行,然后按(Ctrl + B)构建项目,然后(Ctrl + W)在浏览器中无需调试即可运行。
1、在项目名称下的解决方案资源管理器中,右键单击Dependencies并选择“Manage Nuget Packages ”。
2、转到“浏览”选项卡并搜索“LazZiya”,选择“LazZiya.ExpressLocalization”并单击“安装”,选择最新版本(撰写本文时的v1.1.1):
3、它将要求安装两个软件包,单击“确定”和等待安装完成:
我已经为项目准备了本地化资源,因此您不必浪费时间来创建本地化资源。
在项目根目录下,创建一个新文件夹并将其命名为“LocalizationResources”:
在LocalizationResources文件夹下,创建新public类并将其命名为“ViewLocalizationResource”,此类将用于对资源文件进行分组以进行视图本地化:
namespace ExpressLocalizationSample.LocalizationResources{ public class ViewLocalizationResource { }}
在LocalizationResources文件夹下,创建新public类并将其命名为“ExpressLocalizationResource”,此类将用于将资源文件分组以进行标识、模型绑定和数据注释。
namespace ExpressLocalizationSample.LocalizationResources{ public class ExpressLocalizationResource { }}
我们将使用这两个类将资源类型传递给快速定位方法。
最后,从此下载相关的文化资源。请注意,您需要为每种文化下载两个文件,例如(ExpressLocalizationResource.tr.resx和ViewLocalizationResource.tr.resx)。将下载的文件复制到“LocalizationResources ”文件夹。
最后,我们已准备好进行本地化设置。:)
打开startup.cs文件并添加所需的文化列表,然后添加一步本地化设置,如下所示:
var cultures = new[]{ new CultureInfo("tr"), new CultureInfo("ar"), new CultureInfo("hi"), new CultureInfo("en"),};services.AddMvc() .AddExpressLocalization( ops => { ops.ResourcesPath = "LocalizationResources"; ops.RequestLocalizationOptions = o => { o.SupportedCultures = cultures; o.SupportedUICultures = cultures; o.DefaultRequestCulture = new RequestCulture("en"); }; }) .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
然后在Configure方法下,配置应用程序以使用请求本地化:
app.UseRequestLocalization();
在Pages文件夹下,打开_ViewImports.cshtml文件并添加LazZiya.TagHelpers,它将有助于创建语言导航:
@using LazZiya.TagHelpers@addTagHelper *, LazZiya.TagHelpers
然后打开Pages / Shared / _Layout.cshtml文件,并在标签下添加语言导航标签助手_LoginPartial,如下所示:
LanguageNav有一个必需参数“view-context”,阅读有关更多信息。
我们准备第一次运行:
这么好,到目前为止我们的导航支持文化,但我们仍然需要本地化视图文本以查看本地化版本。
已下载文件的“ViewLocalizationResource.xx.resx ”中已提供默认项目的本地化文本。如果需要为视图添加更多自定义文本,请将它们添加到“ViewLocalizationResource.xx.resx ”文件中。
打开Pages / _ViewImports.cshtml文件并注入ExpressLocalization已经附带的SharedCultureLocalizer:
@using LazZiya.ExpressLocalization@inject SharedCultureLocalizer _loc
然后打开Pages / Index.cshtml并使用文本的localizer函数:
@page@model IndexModel@{ ViewData["Title"] = _loc.Text("Home page");}@_loc.Text("Welcome")
@_loc.Text("Learn about building Web apps with ASP.NET Core").
使用相同的过程来本地化其他视图中的所有文本。
当页面处于默认设置以外的任何区域性时,如果单击“隐私”,“登录”或“注册”链接,您将注意到我们正在丢失所选文化,这是因为我们未将文化路由值添加到链接。
打开Pages / _ViewImports.cshtml并添加引用System.Globalization:
@using System.Globalization
然后打开Pages / _LoginPartial.cshtml并在页面顶部添加一个culture参数,如下所示:
@{ var culture = CultureInfo.CurrentCulture.Name;}
使用此参数为culture所有链接提供路由值,如下所示:
@_loc.Text("Register")
对项目中的所有视图执行此操作。
需要对登录,注册和配置文件等相关标识进行搭建才能进行修改。
右键单击项目名称,选择Add - > New Scaffolded Item ...
选择Identity并单击Add:
选择“覆盖所有文件 ”并选择“ApplicationDbContext”:
单击“添加”后,将创建一个新的“Areas”文件夹,包括所有与标识相关的视图:
标识区域有三个_ViewImports文件夹:
像以前对Pages / _ViewImports.cshtml所做的那样,将以下代码添加到所有代码中:
@using System.Globalization@using LazZiya.TagHelpers@addTagHelper *, LazZiya.TagHelpers@using LazZiya.ExpressLocalization@inject SharedCultureLocalizer _loc
像以前一样浏览视图并使用本地化步骤来本地化视图并添加culture路由参数。以下是Register.cshtml页面:
@page@model RegisterModel@{ ViewData["Title"] = _loc.Text("Register"); var culture = CultureInfo.CurrentCulture.Name;}@ViewData["Title"]
@section Scripts {}
如果你运行页面,并做一些无效的输入,你会发现,验证消息都是英文的,所以我们需要本地化的数据注解的消息,如Required,StringLength等。
打开Areas/Identity/Pages/Account/Register.cshtml.cs文件,并在页面顶部添加对“LazZiya.ExpressLocalization.Messages”的引用; 它包含一个以便于使用的所有DataAnnotations错误消息的预定义struct:
@using LazZiya.ExpressLocalization.Messages;
然后修改输入模型,如下所示:
public class InputModel{ [Required(ErrorMessage = DataAnnotationsErrorMessages.RequiredAttribute_ValidationError)] [EmailAddress(ErrorMessage = DataAnnotationsErrorMessages.EmailAddressAttribute_Invalid)] [Display(Name = "Email")] public string Email { get; set; } [Required(ErrorMessage = DataAnnotationsErrorMessages.RequiredAttribute_ValidationError)] [StringLength(100, ErrorMessage = DataAnnotationsErrorMessages.StringLengthAttribute_ValidationErrorIncludingMinimum, MinimumLength = 6)] [DataType(DataType.Password)] [Display(Name = "Password")] public string Password { get; set; } [DataType(DataType.Password)] [Display(Name = "Confirm password")] [Compare("Password", ErrorMessage = DataAnnotationsErrorMessages.CompareAttribute_MustMatch)] public string ConfirmPassword { get; set; }}
编译并运行项目,您将看到本地化数据注释错误消息:
服务器端验证工作正常,但我们仍然需要添加客户端验证,因此在提交表单之前,将在客户端验证输入字段。
客户端验证的一个主要问题是验证本地化输入,如数字、日期等。例如,如果您使用的是十进制输入,您将看到本地化数字(如1.3)的验证错误在英语区域中有效,但对于土耳其语无效,因为它应该是1,3(逗号而不是句点)。
在这里,我们将使用另一个有用的标签助手LazZiya.TagHelpers。
打开Register.cshtml页面并在默认验证脚本partial下添加标签助手:
@section Scripts {}
这就是全部,现在将在使用本地化验证消息提交表单之前验证字段:
您可以从GitHub下载包含超过19种文化的示例项目:
原文地址:
转载地址:http://eizhj.baihongyu.com/