Как локализовать сообщение проверки (DataAnnotationsValidator) на стороне сервера Blazor


10

Я использую Blazor 3.1 в последней версии VS 2019.

пока я могу локализовать ярлыки страниц (заголовок, поля таблицы и т. д.)

На ListEmployee.razorстранице я могу локализовать заголовок таблицы и т. Д., А на AddEmplyeeValidation.razorстранице я могу локализовать метки форм, но у меня проблема с локализацией сообщения проверки.

для проверки сообщения для Employee.csпроверки сообщения определены в этом файле и Resources/Dataпапке с именем, определенным как, Data.Employee.ar.resxи Data.Employee.ar.resxэто не работает

using System.ComponentModel.DataAnnotations;

пространство имен BlazorSPA1.Data {публичный класс Employee {[MaxLength (50)] публичная строка 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; }
}

Сообщение об ошибке для MaxLengthErroris {0} cannot be longer than {1} character, поэтому {0}будет заменено на локализованное имя файла и {1}будет заменено на 256указанный вами атрибут[StringLength(256,...


1
Я попробую это, кажется, это должно сработать. Я был бы признателен, если бы вы могли опубликовать это на Github, так как этот вопрос или вопрос часто поднимаются и существует огромное количество многоязычных вариантов.
Обучение

1
@ Обучаясь, я приведу полный пример на GitHub наверняка.
Мохсен Эсмаилпур

Это очень поможет многим программистам, таким как я, потому что у Блазора нет большого примера в моем контексте ...
Изучение

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 ... поэтому я сосредоточен только на основных страницах Razor asp.net ... давайте посмотрим
Обучение
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.