Як локалізувати повідомлення про перевірку (DataAnnotationsValidator) на стороні сервера блазору


10

Я використовую blazor 3.1 в останній версії VS 2019.

поки що я в змозі локалізувати мітки сторінки (назва, поля таблиці тощо)

На ListEmployee.razorсторінці я можу локалізувати заголовок таблиці тощо, а на AddEmplyeeValidation.razorсторінці я можу Локалізувати мітки форми, але у мене є проблема з локалізацією повідомлення про перевірку.

для повідомлення про Employee.csвалідацію повідомлення для перевірки визначено в цьому файлі та Resources/Dataпапці з ім'ям, визначеним як, Data.Employee.ar.resxі Data.Employee.ar.resxце не працює

використання System.ComponentModel.DataAnnotations;

простір імен BlazorSPA1.Data {Співробітник публічного класу {[MaxLength (50)] public string Id {get; набір; }

    [Required (ErrorMessage ="Name is RRRequired")]
    [StringLength(20, ErrorMessage = "Name is too long.")]
    public string Name { get; set; }

    [Required]
    [StringLength(20)]
    public string Department { get; set; }
    [MaxLength(100)]
    public string Designation { get; set; }
    [MaxLength(100)]
    public string Company { get; set; }
    [MaxLength(100)]
    public string City { get; set; }
}

}

Як я можу, як повідомлення про перевірку файлів ресурсів на основі мови для форми "Додати співробітника".

@page "/addemployeeValidation"
@inject NavigationManager NavigationManager
@inject IEmployeeService EmployeeService
@inject IStringLocalizer<AddEmployeeValidation> L

<h2>Create Employee</h2>
<hr />
<EditForm Model="@employee" OnValidSubmit="@CreateEmployee">
    <DataAnnotationsValidator />
    <ValidationSummary />
    <div class="row">
        <div class="col-md-8">
            <div class="form-group">
                <label for="Name" class="control-label">@L["Name"]</label>
                <input for="Name" class="form-control" @bind="@employee.Name" />
                <ValidationMessage For="@(()=> employee.Name)" />
            </div>
            <div class="form-group">
                <label for="Department" class="control-label">@L["Department"]</label>
                <input for="Department" class="form-control" @bind="@employee.Department" />
            </div>
            <div class="form-group">
                <label for="Designation" class="control-label">@L["Designation"]</label>
                <input for="Designation" class="form-control" @bind="@employee.Designation" />
            </div>
            <div class="form-group">
                <label for="Company" class="control-label">@L["Company"]</label>
                <input for="Company" class="form-control" @bind="@employee.Company" />
            </div>
            <div class="form-group">
                <label for="City" class="control-label">@L["City"]</label>
                <input for="City" class="form-control" @bind="@employee.City" />
            </div>
        </div>
    </div>
    <div class="row">
        <div class="col-md-4">
            <div class="form-group">
                <input type="submit" class="btn btn-primary" value="Save" />
                <input type="button" class="btn" @onclick="@Cancel" value="Cancel" />
            </div>
        </div>
    </div>
</EditForm>

@code {

    Employee employee = new Employee();

    protected async Task CreateEmployee()
    {
        await EmployeeService.CreateEmployee(employee);
        NavigationManager.NavigateTo("listemployees");
    }


    void Cancel()
    {
        NavigationManager.NavigateTo("listemployees");
    }
}   

Я прочитав кілька статей і спробував мало чого, але, здається, нічого не працює

Код у Startup.cs`

services.AddServerSideBlazor (options => options.DetailedErrors = true);

    services.AddLocalization(options => options.ResourcesPath = "Resources");
    var supportedCultures = new List<CultureInfo> { new CultureInfo("en"), new CultureInfo("ar") };
    services.Configure<RequestLocalizationOptions>(options =>
    {
        options.DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("en");
        options.SupportedUICultures = supportedCultures;
    });

Я використовую такий приклад для локалізації, він не показує, як локалізувати повідомлення про помилку https://www.c-sharpcorner.com/article/localization-in-blazor-server/

Зображення структури папки для перегляду

введіть тут опис зображення

Приклад файлу ресурсу для англійської версії так само, як і арабський файл

введіть тут опис зображення

На скріншоті нижче ви будете витягувати назву поля з файлу ресурсу, але повідомлення про валідацію відображається лише англійською мовою, оскільки його не працює

введіть тут опис зображення

Відповіді:


7

Ось моє рішення щодо локалізації повідомлень про помилки в анотації даних. Я створюю два файли ресурсів, один для полів та інший для повідомлень про помилки.

  • DisplayNameResource для локалізації полів
  • ErrorMessageResource для локалізації повідомлень про помилки

введіть тут опис зображення введіть тут опис зображення введіть тут опис зображення введіть тут опис зображення

У перегляді модельного класу використовується Displayатрибут для локалізації імені поля. Щоб вказати файл ресурсу, використовуйте ResourceTypeвластивість для Displayатрибута:

[Display(Name = "Address", ResourceType = typeof(DisplayNameResource))]

А для атрибутів перевірки використовуйте ErrorMessageResourceNameта ErrorMessageResourceTypeвкажіть файл ресурсу:

[Required(ErrorMessageResourceName = "RequiredError", ErrorMessageResourceType = typeof(ErrorMessageResource))]

Ось повний приклад:

public class SomeViewModel
{
    [Display(Name = "Address", ResourceType = typeof(DisplayNameResource))]
    [Required(ErrorMessageResourceName = "RequiredError", ErrorMessageResourceType = typeof(ErrorMessageResource))]
    [StringLength(256, ErrorMessageResourceName = "MaxLengthError", ErrorMessageResourceType = typeof(ErrorMessageResource))]
    public string Address { get; set; }

    [Display(Name = "Phone", ResourceType = typeof(DisplayNameResource))]
    [Required(ErrorMessageResourceName = "RequiredError", ErrorMessageResourceType = typeof(ErrorMessageResource))]
    [RegularExpression("^09([0-9]{9})$", ErrorMessageResourceName = "PhoneLengthError", ErrorMessageResourceType = typeof(ErrorMessageResource))]
    public string Phone { get; set; }

    [Display(Name = "Password", ResourceType = typeof(DisplayNameResource))]
    [Required(ErrorMessageResourceName = "RequiredError", ErrorMessageResourceType = typeof(ErrorMessageResource))]
    [StringLength(50, MinimumLength = 6, ErrorMessageResourceType = typeof(ErrorMessageResource), ErrorMessageResourceName = "MinxMaxLengthError")]
    public string Password { get; set; }

    [Display(Name = "ConfirmPassword", ResourceType = typeof(DisplayNameResource))]
    [Required(ErrorMessageResourceName = "RequiredError", ErrorMessageResourceType = typeof(ErrorMessageResource))]
    [StringLength(50, MinimumLength = 6, ErrorMessageResourceType = typeof(ErrorMessageResource), ErrorMessageResourceName = "MinxMaxLengthError")]
    [Compare("Password", ErrorMessageResourceName = "PasswordConfirmMisMatch", ErrorMessageResourceType = typeof(ErrorMessageResource))]
    public string ConfirmPassword { get; set; }
}

Повідомлення про помилку для MaxLengthErrorє {0} cannot be longer than {1} character, тому воно {0}буде замінено локалізованим іменем поданого файлу і {1}буде замінено на 256вказаний вами атрибут[StringLength(256,...


1
Я спробую це, схоже, це має спрацювати. Буду вдячний, якщо ви можете опублікувати це на Github, оскільки цей вид або питання часто виникають, і існує велика кількість багатомовних варіантів ..
Навчання

1
@Learning Я напевно поставлю повний приклад на github.
Mohsen Esmailpour

Це буде дуже корисно для багатьох програмістів, як я, тому що Блазор не має багато прикладу в моєму контексті ...
Навчання

1

Це було задано раніше:

Як додати локалізацію ViewModel до Blazor?

Я припустив, що краще використовувати FluentValidation. Ось посилання на моє репо Github, яке демонструє, як це могло працювати:

https://github.com/conficient/BlazorValidationLocalization


Я мав на увазі таке рішення, але це буде два модальних файли для кожного, і якщо проект великий, це буде важко керувати. Так, це обробка і змушення справи ...
Навчання

Не зовсім впевнений, що ви маєте на увазі під "двома модальними файлами". Ви все ще можете використовувати resx за допомогою FluentValidation. см fluentvalidation.net/localization
Quango

-1

Я цього не пробував!

В офіційних документах ядра asp.net є розділ, як локалізувати DataAnnotations Можливо, ви знайдете там деякі підказки .


Я новачок в ядрі asp.net, я спробував іншу річ, але не працював, перш ніж розміщувати ці питання, я намагався шукати рішення самостійно, дивлячись на приклад, намагаюся іншу річ, але це не здається, що працює у моєму випадку ... це трохи важко Я з веб-форми asp.net без досвіду роботи з asp.net MVC ... тому я зосереджуюсь лише на основних сторінках бритви asp.net. Подивимось
Навчання
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.