локализация в asp.net core 2.0 бритвенное веб-приложение без mvc - PullRequest
0 голосов
/ 11 сентября 2018

Каждый пример, который я нашел, включая официальную документацию Microsoft по локализации на https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-2.1,, использует контроллер для выполнения действия по настройке и сохранению требуемой культуры.Мое веб-приложение ASP.NET Core 2.1 НЕ является MVC, поэтому не имеет контроллера.Я пробовал несколько способов обойти это, включая добавление фиктивного контроллера в мой проект, но я все еще не могу заставить переключатель Культура работать.

Мой метод запуска класса Configure содержит следующий код:

            var supportedCultures = new[]
        {
            new CultureInfo("en-US"),
            new CultureInfo("hi-IN")
        };

        app.UseRequestLocalization(new RequestLocalizationOptions
        {
            DefaultRequestCulture = new RequestCulture(DefaultCulture.Name),
            // Formatting numbers, dates, etc.
            SupportedCultures = supportedCultures,
            // UI strings that we have localized.
            SupportedUICultures = supportedCultures
        });
        app.UseHttpsRedirection();
        app.UseAuthentication();
        app.UseStaticFiles();
        app.UseCookiePolicy();
        app.UseMvc();

Метод ConfigureServices содержит этот код:

            // Add the localization services to the services container
        services.AddLocalization(options => options.ResourcesPath = "Resources");

        // Add MVC Services to the Services Collection.
        services.AddMvc()
            // Add support for finding localized views, based on file name suffix, e.g. Index.fr.cshtml
            .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
            // Add support for localizing strings in data annotations (e.g. validation messages) via the
            // IStringLocalizer abstractions.
            .AddDataAnnotationsLocalization();

        // Configure supported cultures and localization options
        var supportedCultures = new[]
        {
            new CultureInfo("en-US"),
            new CultureInfo("hi-IN")
        };

        services.Configure<RequestLocalizationOptions>(options =>
        {
            // State what the default culture for your application is. This will be used if no specific culture
            // can be determined for a given request.
            options.DefaultRequestCulture = new RequestCulture(DefaultCulture.Name, DefaultCulture.Name);

            // You must explicitly state which cultures your application supports.
            // These are the cultures the app supports for formatting numbers, dates, etc.
            options.SupportedCultures = supportedCultures;

            // These are the cultures the app supports for UI strings, i.e. we have localized resources for.
            options.SupportedUICultures = supportedCultures;
        });

        // Register the email service used for "contacts".
        services.AddSingleton<IEmailSender, EmailSender>();

        // Configure startup to use the SendGrid options.
        services.Configure<AuthMessageSenderOptions>(Configuration);

        // Add cross-origin resource sharing services to the specified IServiceCollection.
        //
        // The Policy specifed as an option will allow any method.
        services.AddCors(options => options.AddPolicy("CorsPolicy", b => b.AllowAnyMethod()));

И DefaultCulture:

DefaultCulture = new CultureInfo(Configuration["Localization:DefaultCulture"]); 

Где файл настроек содержит строку «en-US».

Затем я использую код _SelectLanguagePartial.cshtml из образца документации Localization:

<div title="@Localizer["Request culture provider:"] @requestCulture?.Provider?.GetType().Name">
<form id="selectLanguage" asp-controller="Home" 
      asp-action="SetLanguage" asp-route-returnUrl="@returnUrl" 
      method="post" class="form-horizontal" role="form">
    <label asp-for="@requestCulture.RequestCulture.UICulture.Name">@Localizer["Language:"]</label> 
    <select name="culture" onchange="this.form.submit();" asp-for="@requestCulture.RequestCulture.UICulture.Name" asp-items="cultureItems"></select>
</form>

Прежде всего, нет контроллера.Как именно я могу реализовать эту функцию в веб-приложении ASP.NET Core не-MVC?

1 Ответ

0 голосов
/ 11 сентября 2018

Вам не нужно использовать контроллеры, недавно я опубликовал пошаговое руководство по разработке мультикультурного веб-приложения с ASP.NET Core Razor Pages; Вы можете найти его здесь:

http://www.ziyad.info/en/articles/10-Developing_Multicultural_Web_Application

Я использовал подход с использованием значения маршрута, но вы можете расширить его, чтобы использовать строку запроса, cookie или принятое значение заголовка для выбора культуры.

На сайте вы можете увидеть живую демонстрацию и ссылку на исходный код проекта на github.

Кроме того, вам также может понадобиться проверить локализацию сообщений об ошибках идентификации:

http://ziyad.info/en/articles/20-Localizing_Identity_Error_Messages

Надеюсь, это поможет:)

[UPDATE]

Пример, который я предоставил, использует файлы общих ресурсов. Если вы хотите использовать сопоставление файлов ресурсов, относящихся к представлению, создайте файлы ресурсов для каждого представления / культуры в папке «Ресурсы» и оставьте структуру папок ресурсов похожей на связанные представления.

например, если у нас есть представление с именем «MyView» внутри папки страниц:

Страницы / MyView.cshtml

Файлы ресурсов должны выглядеть следующим образом:

Ресурсы / Страницы / MyView.tr-TR.resx

Ресурсы / Страницы / MyView.ar-SY.resx

Resources / Pages / MyView.hi-IN.resx

Чтобы использовать локализацию внутри представлений, введите IViewLocalizer:

@using Microsoft.AspNetCore.Mvc.Localization    
@inject IViewLocalizer _loc

<h4>@_loc["My view title"]</h4>

и для ViewModel / DataAnnotations создайте другой файл ресурсов для каждой культуры:

Посмотреть модель:

Страницы / MyViewModel.cshtml.cs

Имя файла ресурса:

Ресурсы / Страницы / MyViewModel.tr-TR.resx

Ресурсы / Страницы / MyViewModel.ar-SY.resx

Ресурсы / Страницы / MyViewModel.hi-IN.resx

Заполните файлы ресурсов соответствующими отображаемыми именами свойств модели и сообщениями с комментариями к данным, затем измените файл startup.cs, очистив код общего ресурса для DataAnnotations и оставив его без параметров:

services.AddMvc()
                .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
                .AddViewLocalization(o=>o.ResourcesPath = "Resources")

                // Option A: use this for localization with shared resource
                /*
                .AddDataAnnotationsLocalization(o=> {
                    var type = typeof(ViewResource);
                    var assemblyName = new AssemblyName(type.GetTypeInfo().Assembly.FullName);
                    var factory = services.BuildServiceProvider().GetService<IStringLocalizerFactory>();
                    var localizer = factory.Create("ViewResource", assemblyName.Name);
                    o.DataAnnotationLocalizerProvider = (t, f) => localizer;
                })
                */

                // Option B: use this for localization by view specific resource
                .AddDataAnnotationsLocalization() 

                .AddRazorPagesOptions(o => {
                    o.Conventions.Add(new CultureTemplateRouteModelConvention());
                });

Кстати, я обновил пример GitHub, теперь он содержит представление "AnotherPage", локализованное с использованием файлов определенных ресурсов.

...