您当前的位置: 首页 >  ssl

寒冰屋

暂无认证

  • 1浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

寒冰屋 发布时间:2019-06-04 21:00:32 ,浏览量:1

目录

介绍

背景

创建项目

安装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)在浏览器中无需调试即可运行。

安装LazZiya.ExpressLocalization

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

2、转到“浏览”选项卡并搜索“LazZiya”,选择“LazZiya.ExpressLocalization”并单击“安装”,选择最新版本(撰写本文时的v1.1.1):

3、它将要求安装两个软件包,单击“确定”和等待安装完成:

  1. LazZiya.ExpressLocalization (所有本地化设置都需要)
  2. 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").

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

本地化URL

当页面处于默认设置以外的任何区域性时,如果单击“隐私”,“登录”或“注册”链接,您将注意到我们正在丢失所选文化,这是因为我们未将文化路由值添加到链接。

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

关注
打赏
1665926880
查看更多评论
立即登录/注册

微信扫码登录

0.0763s