[c#] Blazor 서버 측에서 유효성 검사 메시지 (DataAnnotationsValidator)를 지역화하는 방법

최신 버전의 VS 2019에서 blazor 3.1을 사용하고 있습니다.

지금까지 페이지 레이블 (제목, 테이블 필드 등)을 현지화 할 수 있습니다.

에서 ListEmployee.razor페이지 나 테이블 제목 등을 지역화 할 수 오전에 AddEmplyeeValidation.razor페이지 내가 로컬 라이즈 양식 라벨 수 있어요하지만 난이 문제를 확인 메시지를 현지화 있습니다.

유효성 검사 메시지의 Employee.cs유효성 검사 메시지는이 파일 및 Resources/Data폴더에 이름이 정의되어 정의되어 Data.Employee.ar.resx있으며 Data.Employee.ar.resx작동하지 않습니다.

System.ComponentModel.DataAnnotations 사용;

네임 스페이스 BlazorSPA1.Data {공개 클래스 직원 {[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 (옵션 => 옵션 .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/

굴절을위한 폴더 구조 이미지

여기에 이미지 설명을 입력하십시오

아랍어 파일과 같은 방식으로 영어 버전의 리소스 파일 예제

여기에 이미지 설명을 입력하십시오

아래 스크린 샷에서 필드 이름을 리소스 파일에서 가져오고 있지만 유효성 검사 메시지의 경우 작동하지 않는 것으로 영어로만 표시됩니다

여기에 이미지 설명을 입력하십시오



답변

다음은 데이터 주석 오류 메시지를 현지화하는 솔루션입니다. 필드와 오류 메시지를위한 두 개의 리소스 파일을 만듭니다.

  • DisplayNameResource 필드 현지화
  • ErrorMessageResource 오류 메시지 현지화

여기에 이미지 설명을 입력하십시오
여기에 이미지 설명을 입력하십시오
여기에 이미지 설명을 입력하십시오
여기에 이미지 설명을 입력하십시오

뷰 모델 클래스에서 Display필드 이름 현지화에 속성을 사용하십시오 . ResourceType속성에 자원 파일 사용 특성 을 지정하려면 Display다음을 수행하십시오.

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

그리고 유효성 검사 속성에서 ErrorMessageResourceNameErrorMessageResourceType을 사용하여 리소스 파일을 지정하십시오.

[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,...


답변

이것은 전에 요청되었습니다 :

Blazor에 ViewModel 현지화를 추가하는 방법?

FluentValidation을 사용하는 것이 더 좋은 방법이라고 제안했습니다. Github 저장소에 대한 링크는 다음과 같습니다.

https://github.com/conficient/BlazorValidationLocalization


답변

나는 이것을 시도하지 않았다!

asp.net 코어의 공식 문서에는 현지화 방법 섹션 있습니다. DataAnnotations
어쩌면 몇 가지 단서 를 찾을 수 있습니다 .


답변