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


10

최신 버전의 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/

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

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

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

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

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

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

답변:


7

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

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


1
나는 이것을 시도 할 것이다. 그것이 효과가있는 것 같다 .. 이런 종류의 질문이나 질문이 종종 제기되고 많은 다국어 옵션이 있기 때문에 Github에 이것을 게시 할 수 있다면 고맙겠습니다.
학습

1
@Learning github에 대한 완전한 예를 확실히 보여 드리겠습니다.
Mohsen Esmailpour

Blazor가 제 상황에서 많은 모범을 보이지 않기 때문에 이것은 저와 같은 많은 프로그래머에게 큰 도움이 될 것입니다 ...
Learning

1

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

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

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

https://github.com/conficient/BlazorValidationLocalization


내가 마음에 이러한 유형의 솔루션하지만 각각에 대해이 두 가지 모달 파일을했고 프로젝트가 큰 경우 관리하기가 어려워 질 것, 예 이것은 해결하려면 메이크업 일 작업입니다 ...
학습

"두 모달 파일"이 무슨 뜻인지 잘 모르겠습니다. FluentValidation과 함께 resx를 계속 사용할 수 있습니다. 참조 fluentvalidation.net/localization
Quango

-1

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

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


나는 asp.net 코어를 처음 사용하지만이 질문을 게시하기 전에 다른 일을 시도했지만 효과가 없었습니다. 예를보고 내 자신의 솔루션을 찾고 다른 것을 시도했지만 내 경우에는 효과가없는 것 같습니다 ... 나의 초점은 asp.net 코어 면도기 페이지 만쪽으로 그래서 난 ... asp.net MVC에 경험이없는 asp.net 웹 양식 배경에서 왔어요 .. 우리가 보자
학습
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.