1

我是一个想要迁移到 ASP.Net Core 和 Blazor 的网络表单人,我没有任何背景,MVC以防万一有人基于MVC.

我只对 ASP.Net Core Razor 页面感兴趣。

在 web 表单中,我将两个文件用于多语言网站,例如,我可以将相关的验证消息保存在 .aspx 页面或相关的 js 文件中(如果需要),而在 Core 中它的作用不同。在 webform 中,我可以将验证消息保存在 .aspx 文件本身中,而在 ASP.Net 核心中,我一直在使用 Single Model 类,并且在那里定义了验证消息。

网络表单结构

-en
--index
--aboutus
..
..
-ar
--index
--aboutus

ASP.Net Core 文件夹结构

Pages
-en
--index
--aboutus
..
..
-ar
--index
--aboutus

让我们说在Pages文件夹下我创建了两个文件夹,一个用于英语,另一个用于阿拉伯语,在核心中我们让我们说我已经在模型文件中定义了我的验证。由于我有两种语言的模型文件,如何显示特定于语言的验证消息

下面的代码只是示例

using System;
using System.ComponentModel.DataAnnotations;

public class Starship
{
    [Required]
    [StringLength(16,
        ErrorMessage = "Identifier too long (16 character limit).")]
    public string Identifier { get; set; }

    public string Description { get; set; }

    [Required]
    public string Classification { get; set; }

    [Range(1, 100000,
        ErrorMessage = "Accommodation invalid (1-100000).")]
    public int MaximumAccommodation { get; set; }

    [Required]
    [Range(typeof(bool), "true", "true",
        ErrorMessage = "This form disallows unapproved ships.")]
    public bool IsValidatedDesign { get; set; }

    [Required]
    public DateTime ProductionDate { get; set; }
}

我面临的问题,因为我有一个模型文件,其中有英文验证我如何在 ASP.Net 核心中以最简单的方式显示阿拉伯语验证

假设我的网址是

www.example.com/en/ 
www.example.com/en/aboutus/ 
www.example.com/en/contact/

www.example.com/ar/ 
www.example.com/ar/aboutus/ 
www.example.com/ar/contact/

基于语言的验证消息能否仅基于上述 URL 显示,而无需对具有任何表单等的网站页面使用任何全球化功能。

4

2 回答 2

3

是否可以仅基于上述 url 显示基于语言的验证消息,而无需对具有任何表单等的网站页面使用任何全球化功能。

是的,可以参考路线中的文化参数显示验证消息。但是为了使本地化正常工作,您需要进行一些设置。

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .AddDataAnnotationsLocalization(options => {
            options.DataAnnotationLocalizerProvider = (type, factory) =>
                factory.Create(typeof(SharedResource));
        });
}

www.example.com/ar/contact/

查看 url,您需要路由数据请求文化提供者。默认情况下,Asp.Net Core 使用 QueryString、Cookie 和 AccpetLanguageHeader 文化提供者(有关详细信息,请参阅文档),因此如果您想使用路由值进行本地化,您需要设置路由数据文化提供者:

services.Configure<RequestLocalizationOptions>(ops =>
{
    ops.DefaultRequestCulture = new RequestCulture("en");
    ops.SupportedCultures = mySupportedCultures;
    ops.SupportedUICultures = mySupportedUICultures;

    // add RouteDataRequestCultureProvider to the beginning of the providers list. 
    ops.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider(cultures));
});

但这还不是全部!要正确本地化 Asp.Net Core Web 应用程序,还有许多其他主题需要考虑:

  • 查看本地化
  • DataAnnotations 本地化
  • ModelBinding 错误本地化
  • IdentityDescriber 错误本地化
  • 自定义后端消息本地化
  • 客户端验证消息本地化

您可以阅读Asp.Net-Core 全球化和本地化的官方文档。

此外,我写了一些详细描述本地化的文章,请参阅开发多元文化 Web 应用程序


我如何在 ASP.Net 核心中以最简单的方式显示阿拉伯语验证

如果您正在寻找一种快速简便的方法,您可以使用LazZiya.ExpressLocalization nuget 包,它为所有本地化设置提供了非常简单的方法:

//add reference to :
using LazZiya.ExpressLocalization;

//setup express localization under ConfigureServices method:
public void ConfigureServices(IServiceCollection services)
{
    //other configuration settings....

    var cultures = new CultureInfo[]
    {
        new CultureInfo("en"),
        new CultureInfo("tr"),
        new CultureInfo("ar")
    };

    services.AddRazorPages()
        //ExpressLocalizationResource and ViewLocalizationResource are available in :
        // https://github.com/LazZiya/ExpressLocalizationSample
        .AddExpressLocalization<ExpressLocalizationResource, ViewLocalizationResource>(
            exOps =>
            {
                exOps.ResourcesPath = "LocalizationResources";
                exOps.RequestLocalizationOptions = ops =>
                {
                    ops.SupportedCultures = cultures;
                    ops.SupportedUICultures = cultures;
                    ops.DefaultRequestCulture = new RequestCulture("en");
                };
            });
}

这几乎是您设置“快速”本地化所需的全部内容。在这里,您可以找到使用 ExpressLocalization 的分步教程示例 github 存储库

于 2020-01-02T07:50:03.467 回答
1

现在你使用这个:

[Required]
[StringLength(16, ErrorMessage = "Identifier too long (16 character limit).")]
public string Identifier { get; set; }

但是当您更改为多语言时,您需要像这样使用:

[Required(ErrorMessageResourceType = typeof(MyProject.Resources.Starship),
      ErrorMessageResourceName = "IdentifierRequired")]
[StringLength(16, ErrorMessageResourceType = typeof(MyProject.Resources.Starship),
      ErrorMessageResourceName = "IdentifierLength")]
public string Identifier { get; set; }

为了使用此选项,必须自动生成与引用的 .resx 资源文件关联的类。为此,我们必须在 .resx 文件的属性中将其自定义工具属性设置为 ResXFileCodeGenerator 或 PublicResXFileCodeGenerator。

于 2021-01-20T23:22:10.307 回答