Многоязычные сообщения проверки ASP.Net для форм

Я занимаюсь веб-формами и хочу перейти на ASP.Net Core и Blazor. У меня нет опыта работы с MVC на всякий случай, если кто-то может дать свой отзыв на основе MVC.

Меня интересует только страница ASP.Net Core Razor.

В веб-форме я использую два файла для многоязычного веб-сайта, например, я могу хранить связанные сообщения проверки на странице .aspx или в связанных файлах js, если необходимо, в то время как в Core все работает по-другому. В веб-форме я могу сохранить сообщение проверки в самом файле .aspx, в то время как в ядре ASP.Net я использовал класс Single Model, и там определено сообщение проверки.

Структура веб-формы

-en
--index
--aboutus
..
..
-ar
--index
--aboutus

Структура папок ASP.Net Core

Pages
-en
--index
--aboutus
..
..
-ar
--index
--aboutus

Скажем, в папке Pages я создаю две папки: одну для английского языка, а другую для арабского, а в Core мы допустим, что я определил свою проверку в файле модели. Поскольку у меня есть один файл модели для обоих языков, как я могу показать сообщение проверки для конкретного языка?

Ниже приведен код только для примера

using System;
using System.ComponentModel.DataAnnotations;

public class Starship
{
    [Required]
    [StringLength(16,
        ErrorMessage = "Identifier too long (16 character limit).")]
    public string Identifier { get; set; }

    public string Description { get; set; }

    [Required]
    public string Classification { get; set; }

    [Range(1, 100000,
        ErrorMessage = "Accommodation invalid (1-100000).")]
    public int MaximumAccommodation { get; set; }

    [Required]
    [Range(typeof(bool), "true", "true",
        ErrorMessage = "This form disallows unapproved ships.")]
    public bool IsValidatedDesign { get; set; }

    [Required]
    public DateTime ProductionDate { get; set; }
}

Проблема, с которой я столкнулся, так как у меня есть один файл модели, который имеет проверку на английском языке, как я могу показать проверку на арабском языке самым простым и простым способом в ядре ASP.Net

Предполагая, что мой URL-адрес похож на

www.example.com/en/ 
www.example.com/en/aboutus/ 
www.example.com/en/contact/

www.example.com/ar/ 
www.example.com/ar/aboutus/ 
www.example.com/ar/contact/

Может ли сообщение проверки на основе языка отображаться только на основе вышеуказанного URL-адреса без использования какой-либо функции глобализации для страниц веб-сайтов, которые имеют какие-либо формы и т. Д.


person Learning    schedule 02.01.2020    source источник


Ответы (2)


Может ли сообщение проверки на основе языка отображаться только на основе вышеуказанного URL-адреса без использования какой-либо функции глобализации для страниц веб-сайта, которые имеют какие-либо формы и т. Д.

Да, сообщения проверки могут отображаться со ссылкой на параметр культуры в маршруте. Но для того, чтобы локализация работала должным образом, вам необходимо проделать некоторую настройку.

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .AddDataAnnotationsLocalization(options => {
            options.DataAnnotationLocalizerProvider = (type, factory) =>
                factory.Create(typeof(SharedResource));
        });
}

www.example.com/ar/contact/

Глядя на URL-адрес, вам нужен поставщик культуры запроса данных маршрута. По умолчанию Asp.Net Core использует поставщиков культур QueryString, Cookie и AccpetLanguageHeader (см. docs для более подробной информации), поэтому, если вы хотите использовать значение маршрута для локализации, вам необходимо настроить поставщика культуры данных маршрута:

services.Configure<RequestLocalizationOptions>(ops =>
{
    ops.DefaultRequestCulture = new RequestCulture("en");
    ops.SupportedCultures = mySupportedCultures;
    ops.SupportedUICultures = mySupportedUICultures;

    // add RouteDataRequestCultureProvider to the beginning of the providers list. 
    ops.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider(cultures));
});

Но это не все! Есть много других тем, которые следует учитывать для правильной локализации веб-приложений Asp.Net Core:

  • Локализация просмотров
  • Локализация DataAnnotations
  • Локализация ошибок ModelBinding
  • Локализация ошибок IdentityDescriber
  • Пользовательская локализация сообщений серверной части
  • Локализация сообщений валидации на стороне клиента

Вы можете прочитать официальную документацию для Asp.Net -Основная глобализация и локализация.

Кроме того, я написал несколько статей, подробно описывающих локализацию, см. Разработка мультикультурного веб-приложения .


как я могу показать валидацию на арабском языке самым простым и простым способом в ядре ASP.Net

Если вы ищете быстрый и простой способ, вы можете использовать пакет nuget LazZiya.ExpressLocalization, он предлагает очень простой способ настройки всех локализаций:

//add reference to :
using LazZiya.ExpressLocalization;

//setup express localization under ConfigureServices method:
public void ConfigureServices(IServiceCollection services)
{
    //other configuration settings....

    var cultures = new CultureInfo[]
    {
        new CultureInfo("en"),
        new CultureInfo("tr"),
        new CultureInfo("ar")
    };

    services.AddRazorPages()
        //ExpressLocalizationResource and ViewLocalizationResource are available in :
        // https://github.com/LazZiya/ExpressLocalizationSample
        .AddExpressLocalization<ExpressLocalizationResource, ViewLocalizationResource>(
            exOps =>
            {
                exOps.ResourcesPath = "LocalizationResources";
                exOps.RequestLocalizationOptions = ops =>
                {
                    ops.SupportedCultures = cultures;
                    ops.SupportedUICultures = cultures;
                    ops.DefaultRequestCulture = new RequestCulture("en");
                };
            });
}

Это почти все, что нужно для настройки «экспресс» локализации. Здесь вы можете найти шаг пошаговое руководство по использованию ExpressLocalization и образец репозитория github

person LazZiya    schedule 02.01.2020
comment
Ранее я смотрел аналогичный пример, где пользователь использовал пакет LazZiya ... это было слишком много для начинающего, возможно, мне нужно посмотреть на него еще раз, чтобы правильно понять его, и если он хорошо работает для меня. Я избегал использования Location using Resource file в asp.net для Single .aspx для всех языков, поскольку это непрактично с течением времени, поскольку у меня были разные элементы дизайна для разных языков, поэтому лучшим подходом для меня было использование отдельных файлов для каждого языка, что требовало дополнительного времени, но давало меня гибкость, поэтому я хочу использовать тот же подход в ядре asp.net, поскольку я хочу преобразовать тот же проект в ядро - person Learning; 02.01.2020
comment
Я заметил, что в вашем примере вы используете один файл для разных языков, в то время как я хочу использовать отдельные файлы для разных языков, как указано в моем вопросе. Да, нужно будет использовать отдельный файл для авторизации входа, как указано в вашем примере. Я бы хотел, чтобы вы также коснулись моего сценария в своем примере кода. - person Learning; 02.01.2020
comment
Технически и логически использовать один файл для разных языков некорректно! в моем образце уже есть отдельные файлы для каждого языка. см. их здесь. Кроме того, вы можете использовать один файл ресурсов для каждого языка или вы можете использовать несколько файлов ресурсов как описано в ридми. - person LazZiya; 02.01.2020
comment
Я не говорю о файлах ресурсов, я говорю об индексе страниц Razor, о нас, контактах и ​​т.д. - person Learning; 02.01.2020
comment
Хорошо, вы имеете в виду файлы общих ресурсов :) на самом деле да, в моем примере используются файлы общих ресурсов, поэтому вам не нужно создавать отдельные ресурсы для каждого представления. Но вы же так хотите? - person LazZiya; 02.01.2020
comment
Кстати, при использовании общих файлов ресурсов легко добавить новую культуру, все, что вам нужно, - это еще один файл ресурсов. Но если вы используете отдельные ресурсы для каждого представления, будет больше рабочей нагрузки, чтобы добавить много ресурсов для всех представлений в проекте. В любом случае, выбирать способ, отвечающий вашим потребностям, остается за вами. - person LazZiya; 02.01.2020
comment
@Ziya, я смотрю ваш код github.com/LazZiya/ExpressLocalizationSampleCore3/tree/master / и хочу знать, когда я меняю язык, он также меняет путь URL-адреса instancepl /en/ на /ar где и как в коде, который был изменен - person Learning; 09.01.2020
comment
ну, когда язык изменен, страница снова перенаправляется на тот же uri, но с выбранной новой культурой. {культура} шаблон маршрута уже определен в ExpressLocalization будет первым параметром в маршруте. Затем провайдер культуры маршрута определяет текущую культуру. в зависимости от значения маршрута {culture}. - person LazZiya; 09.01.2020

Теперь вы используете это:

[Required]
[StringLength(16, ErrorMessage = "Identifier too long (16 character limit).")]
public string Identifier { get; set; }

Но когда вы переходите на мультиязычность, вам нужно использовать вот так:

[Required(ErrorMessageResourceType = typeof(MyProject.Resources.Starship),
      ErrorMessageResourceName = "IdentifierRequired")]
[StringLength(16, ErrorMessageResourceType = typeof(MyProject.Resources.Starship),
      ErrorMessageResourceName = "IdentifierLength")]
public string Identifier { get; set; }

Чтобы использовать эту опцию, классы, связанные с указанными файлами ресурсов .resx, должны быть автоматически сгенерированы. Для этого в свойствах файла .resx мы должны установить для его свойства Custom tool значение ResXFileCodeGenerator или PublicResXFileCodeGenerator.

person Anton Nikolayevich    schedule 20.01.2021