目录
介绍
背景
创建项目
安装LazZiya.ExpressLocalization
创建本地化资源
使用代码
添加语言导航
本地化视图
本地化URL
本地化标识(Identity)视图
本地化数据注释
客户端验证
示例项目
- 下载示例 - 1.8 MB
开发多语言的SP.NET Core 2.x Web应用程序需要大量的基础架构设置,并且需要花费时间和精力。在本文中,我们将使用LazZiya.ExpressLocalization nuget包一步本地化我们的Web应用程序。
背景大多数Web应用程序都使用基于URL的本地化,因此我们可以在URL中查看所选文化,例如http://www.example.com/en/Contact。不幸的是,ASP.NET Core仅提供以下请求文化提供程序:
- QueryStringRequestCultureProvider
- CookieRequestCultureProvider
- AcceptLanguageHeaderRequestCultureProvider
为了实现路由本地化,我们需要构建自定义本地化提供程序并定义全局路由模板,因此基本上,我们需要完成以下本地化步骤才能拥有完全本地化的Web应用程序:
- 构建路由值请求文化提供者
- 为culture参数定义全局路由模板
- 设置DataAnnotations本地化
- 设置ModelBinding错误消息本地化
- 设置身份描述错误消息
- 设置视图本地化
- 设置客户端验证脚本以验证本地化的数字,日期等。
- 为每个部分提供本地化资源
所有这些步骤都需要大量工作并且花费太多的时间。因此,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、它将要求安装两个软件包,单击“确定”和等待安装完成:
- LazZiya.ExpressLocalization (所有本地化设置都需要)
- LazZiya.TagHelpers (客户端本地化验证和语言下拉列表所需)
我已经为项目准备了本地化资源,因此您不必浪费时间来创建本地化资源。
在项目根目录下,创建一个新文件夹并将其命名为“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”,阅读有关LanguageNav标记助手的更多信息。
我们准备第一次运行:
这么好,到目前为止我们的导航支持文化,但我们仍然需要本地化视图文本以查看本地化版本。
本地化视图已下载文件的“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")
对项目中的所有视图执行此操作。
本地化标识(Identity)视图需要对登录,注册和配置文件等相关标识进行搭建才能进行修改。
右键单击项目名称,选择Add - > New Scaffolded Item ...
选择Identity并单击Add:
选择“覆盖所有文件 ”并选择“ApplicationDbContext”:
单击“添加”后,将创建一个新的“Areas”文件夹,包括所有与标识相关的视图:
标识区域有三个_ViewImports文件夹:
- Areas/Identity/Pages/_ViewImports.cshtml
- Areas/Identity/Pages/Account/_ViewImports.cshtml
- Areas/Identity/Pages/Account/Manage/_ViewImports.cshtml
像以前对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"]
@_loc.Text("Create a new account").
@_loc.Text("Register")
@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种文化的示例项目:
- https://github.com/LazZiya/ExpressLocalizationSample
原文地址:https://www.codeproject.com/Articles/5061604/Developing-Multicultural-ASP-NET-Core-2-x-Project