Blazor sunucu tarafında doğrulama iletisi (DataAnnotationsValidator) nasıl yerelleştirilir


10

VS 2019'un son sürümünde blazor 3.1 kullanıyorum.

şimdiye kadar sayfa etiketlerini (başlık, tablo alanları vb.) yerelleştirebiliyorum

Gelen ListEmployee.razorsayfada i tablo başlığı vb lokalize mümkün ve üzerinde AddEmplyeeValidation.razorsayfa i Yerelleştirmek formu etiketlere mümkün ama ben sorunu doğrulama mesajı lokalize var.

Doğrulama iletisi için Employee.csDoğrulama iletisi, bu dosya ve Resources/Dataklasörde ad olarak tanımlanmış olarak tanımlanıyor Data.Employee.ar.resxve Data.Employee.ar.resxbu çalışmıyor

System.ComponentModel.DataAnnotations kullanarak;

namespace BlazorSPA1.Data {genel sınıf Çalışanı {[MaxLength (50)] genel dize Kimliği {get; Ayarlamak; }

    [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; }
}

}

Nasıl Çalışan Ekle formu için dile dayalı Kaynak dosyalarından doğrulama mesajı yapabilirsiniz.

@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");
    }
}   

Birkaç makale okudum ve birkaç şey denedim ama hiçbir şey işe yaramıyor

Startup.cs` içindeki kod

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;
    });

Yerelleştirme için aşağıdaki örneği kullanıyorum, https://www.c-sharpcorner.com/article/localization-in-blazor-server/ hata mesajının nasıl yerelleştirileceğini göstermiyor

Referans için klasör yapısı resmi

resim açıklamasını buraya girin

İngilizce dosya için kaynak dosyası örneği aynı şekilde Arapça dosya da var

resim açıklamasını buraya girin

Aşağıdaki ekran görüntüsünde Alan adı Kaynak dosyasından alınacaktır, ancak Doğrulama iletisi yalnızca İngilizce olarak çalışmıyor olarak gösterilir

resim açıklamasını buraya girin

Yanıtlar:


7

İşte veri açıklama hata mesajlarını yerelleştirmek için benim çözüm. Biri alanlar, diğeri hata iletileri için olmak üzere iki kaynak dosyası oluşturuyorum.

  • DisplayNameResource alanları yerelleştirmek için
  • ErrorMessageResource hata mesajlarını yerelleştirmek için

resim açıklamasını buraya girin resim açıklamasını buraya girin resim açıklamasını buraya girin resim açıklamasını buraya girin

Görünüm modeli sınıfında Displayalan adını yerelleştirmek için öznitelik kullanın . Öznitelikte kaynak dosya kullanımı ResourceTypeözelliğini belirtmek için Display:

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

Ve doğrulama özniteliklerinde kaynak dosyasını belirtmek için ErrorMessageResourceNameve ErrorMessageResourceTypekullanın:

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

İşte tam örnek:

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; }
}

İçin hata mesajı MaxLengthErrorIS {0} cannot be longer than {1} character, böylece {0}lokalize dosyalanmış adıyla değiştirilecek ve {1}değiştirilecek 256size özniteliği üzerinde belirtilen[StringLength(256,...


1
Bu çalışacak gibi görünüyor bunu deneyeceğim .. Bu tür veya soru sık sık ortaya çıkacak ve çok dilli seçenekler çok var gibi Github bu yazı olabilir eğer takdir ediyorum ..
öğrenme

1
@Eğitim Kesinlikle github'a tam örnek vereceğim.
Mohsen Esmailpour

Blazor'un bağlamımda çok fazla örneği olmadığı için bu benim gibi birçok programcıya çok yardımcı olacak ...
öğrenme

1

Bu daha önce sorulmuştur:

Blazor'a ViewModel yerelleştirmesi nasıl eklenir?

FluentValidation kullanmanın daha iyi bir yaklaşım olacağını önerdim. İşte nasıl çalışabileceğini gösteren Github repoma bir bağlantı:

https://github.com/conficient/BlazorValidationLocalization


Aklımda bu tür bir çözüm vardı ama bu her biri için iki modal dosya olacak ve proje büyükse yönetilmesi zorlaşacaktır, Evet bu bir çözümdür ve bir şeyler yapar ...
öğrenme

"İki kalıcı dosya" ile ne demek istediğinizden emin değilim. FluxValidation ile resx'i kullanmaya devam edebilirsiniz. bkz. fluentvalidation.net/localization
Quango

-1

Bunu denemedim!

Asp.net çekirdeğinin resmi belgelerinde yerelleştirme bölümü vardır DataAnnotations Belki orada bazı ipuçları bulabilirsiniz .


Ben farklı bir şey denedim asp.net çekirdek için yeni ama farklı bir şey denemek, örnek bakarak kendi çözüm arıyor denedim bu soruları göndermeden önce işe yaramadı ama benim durumum için çalışmıyor gibi görünüyor ... biraz zor Ben asp.net MVC hiçbir deneyimi ile asp.net webform arka plan ... bu yüzden benim odak sadece asp.net çekirdek Razor sayfalara doğru .. bakalım
Öğrenme
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.