Как локализовать сообщение проверки (DataAnnotationsValidator) на стороне сервера Blazor - PullRequest
10 голосов
/ 09 января 2020

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

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

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

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

с использованием System.ComponentModel .DataAnnotations;

пространство имен BlazorSPA1.Data {publi c class Employee {[MaxLength (50)] publi c 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/

Изображение структуры папки для ссылки

enter image description here

Пример файла ресурсов для версии Engli sh таким же образом, у меня есть файл Arabi c также

enter image description here

На скриншоте ниже вы Имя поля извлекается из файла ресурсов, но для сообщения проверки отображается только на английском языке sh, так как оно не работает

enter image description here

Ответы [ 3 ]

7 голосов
/ 13 января 2020

Вот мое решение для локализации сообщений об ошибках аннотации данных. Я создаю два файла ресурсов, один для полей и другой для сообщений об ошибках.

  • DisplayNameResource для локализующих полей
  • ErrorMessageResource для локализации сообщений об ошибках

enter image description here enter image description here enter image description here enter image description here

В представлении использования модели класса 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 голос
/ 14 января 2020

Это спрашивалось ранее:

Как добавить локализацию ViewModel в Blazor?

Я предположил, что лучше использовать FluentValidation. Вот ссылка на мой репозиторий Github, который демонстрирует, как он может работать:

https://github.com/conficient/BlazorValidationLocalization

0 голосов
/ 15 января 2020

Я не пробовал это!

В официальных документах asp. net есть раздел, как локализовать DataAnnotations Может быть, вы найдете подсказки там .

...