簡體   English   中英

Blazor WebAssembly 客戶端數據注釋本地化

[英]Blazor WebAssembly Client DataAnnotations Localization

Asp.net 核心服務器端本地化有據可查,對我有用。 但是如何在 Blazor webassembly 的客戶端本地化 DTO 模型上的 DataAnnotations?

在服務器端,我添加了下面的代碼,並且 DataAnnotations 已本地化。 一切都按預期工作。

...
services
.AddRazorPages()              .AddViewLocalization(Microsoft.AspNetCore.Mvc.Razor.LanguageViewLocationExpanderFormat.Suffix)
                .AddDataAnnotationsLocalization(
                    options =>
                    {
                        options.DataAnnotationLocalizerProvider = (type, factory) =>
                        {
                            return factory.Create(typeof(CommonStrings));
                        };

                    });
...

但是我如何在 Blazor 客戶端(webassembly)上做同樣的事情? 例如,我在客戶端有這個 model:

public class ApplicationUserDTO
    {
        public string Id { get; set; }

        [Required(ErrorMessage ="Field {0} is required")]
        [Display(Name ="First name")]
        public string FirstName { get; set; }

        [Required]
        [Display(Name = "Last name")]
        public string LastName { get; set; }

        [Required]
        [Display(Name = "Email")]
        public string Email { get; set; }

        [Required]
        [Display(Name = "Username")]
        public string Username { get; set; }


    }

我想通過<EditForm>組件將其發布到后端,然后在客戶端進行驗證。 我也想像在 aspnet.core 服務器上一樣本地化它 - 錯誤/驗證消息和顯示名稱......

我嘗試使用 LocalizedValidator 組件:

    public class MessageValidatorBase<TValue> : ComponentBase, IDisposable
    {
        private FieldIdentifier _fieldIdentifier;
        private EventHandler<ValidationStateChangedEventArgs> _stateChangedHandler
            => (sender, args) => StateHasChanged();
        [CascadingParameter]
        private EditContext EditContext { get; set; }
        [Parameter]
        public Expression<Func<TValue>> For { get; set; }
        [Parameter]
        public string Class { get; set; }
        protected IEnumerable<string> ValidationMessages =>
            EditContext.GetValidationMessages(_fieldIdentifier);
        protected override void OnInitialized()
        {
            _fieldIdentifier = FieldIdentifier.Create(For);
            EditContext.OnValidationStateChanged += _stateChangedHandler;
        }
        public void Dispose()
        {
            EditContext.OnValidationStateChanged -= _stateChangedHandler;
        }
    }

然后創建組件:

@typeparam TValue
@inherits MessageValidatorBase<TValue>
@inject StringLocalizationService _localizer
@foreach (var message in ValidationMessages)
{
    <div class="@Class">
        @_localizer[message]
        
    </div>
}

但問題是我已經在這里擴展了字符串。 例如,如果我有類似“需要字段 {0}”的錯誤消息,我會得到“需要字段名字”,因為我沒有具有該鍵的資源並且我不打算進行本地化為每個屬性名稱翻譯相同的錯誤消息...

[編輯] 我只是想知道是否有一些我沒有做的瑣碎事情,而不是完全自己實現它

WebAssembly 示例。

示例屬性

[MaxLength(5,  ErrorMessageResourceName = "LengthError", ErrorMessageResourceType = typeof(Resources.App))]
public string Prefix { get; set; }

在您的客戶端中創建一個名為 Resources 的文件夾。 為每種語言添加一個“.resx”文件以及一個默認值(無語言)。

在此處輸入圖像描述

確保將訪問修飾符設置為Public 在此處輸入圖像描述

法語示例 output。

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM