3
votes

Razor Page utilisant la localisation Core 2.2 ne fonctionne pas

J'ai un projet .NET Core 2.2

J'ai le code suivant dans mon démarrage

Méthode ConfigurationServices

 https://localhost:44345/?culture=es-ES

Méthode de configuration p>

    private readonly IStringLocalizer<IndexModel> Localizer;
    public IndexModel(IStringLocalizer<IndexModel> localizer)
    {
        Localizer = localizer;
    }

J'ai dans ma page d'index.csHtml

 @page
 @using Microsoft.AspNetCore.Mvc.Localization
 @model IndexModel
 @inject IViewLocalizer Localizer
 @{
     ViewData["Title"] = "Error";
 }
 <h3>Welcome to ASP.NET Localization</h3>
 <p>This is Localization</p>
 <h2>@Localizer["Overview"]</h2>

J'utilise les méthodes suivantes dans mon Index.cshtml.cs

       app.UseStaticFiles();
        app.UseCookiePolicy();
        var supportedCultures = new[]
        {
            new CultureInfo("en-US"),
            new CultureInfo("es-ES"),
        };
        app.UseRequestLocalization(new RequestLocalizationOptions
        {
            DefaultRequestCulture = new RequestCulture("en-US"),
            // Formatting numbers, dates, etc.
            SupportedCultures = supportedCultures,
            // UI strings that we have localized.
            SupportedUICultures = supportedCultures
        });
        app.UseStaticFiles();
        app.UseStaticFiles();
        app.UseMvc();

J'ai créé un fichier de ressources

\Resources\Index.es.resx

Il a actuellement une clé pour la vue d'ensemble.

Je charge l'application et essaie de changer la culture comme

services.AddLocalization(options => options.ResourcesPath = "Resources");
services.AddMvc()
    .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
    .AddDataAnnotationsLocalization();

Mais la chaîne ne change pas comme je m'y attendais!

p>


6 commentaires

vous devez changer la langue du navigateur pour que le code fonctionne


cool, mais nous voulons que l'utilisateur puisse sélectionner? finalement j'ai besoin d'une liste déroulante!


alors je pense que vous pouvez recharger la page pour que l'utilisateur voie le changement


Je change l'url ci-dessus en ajoutant? Culture = es-ES à l'url, mais cela ne change pas la langue


J'utilise la même fonctionnalité que vous et votre code ne prend pas en charge le chargement de la langue à l'aide de l'URL. Je pense que vous devez étudier comment le noyau asp.net gère le chargement de la langue à l'aide de l'URL


Je vais vérifier QueryStringRequestCultureProvider


3 Réponses :


2
votes

J'utilise dotnet core2.1, les étapes devraient être les mêmes.

  • créer un fournisseur de culture d'itinéraire:
services.AddMvc()
        .AddRazorPagesOptions(o => {
            o.Conventions.Add(new CultureTemplateRouteModelConvention());
        });

  • Ajoutez RouteValueRequestCultureProvider en haut de la liste des fournisseurs de cultures:
public class CultureTemplateRouteModelConvention : IPageRouteModelConvention
    {
        public void Apply(PageRouteModel model)
        {
            var selectorCount = model.Selectors.Count;
            for (var i = 0; i < selectorCount; i++)
            {
                var selector = model.Selectors[i];
                model.Selectors.Add(new SelectorModel
                {
                    AttributeRouteModel = new AttributeRouteModel
                    {
                        Order = -1,
                        Template = AttributeRouteModel.CombineTemplates(
                      "{culture?}",
                      selector.AttributeRouteModel.Template),
                    }
                });
            }
        }
    }

services.Configure<RequestLocalizationOptions>(ops =>
            {
                ops.DefaultRequestCulture = new RequestCulture("en");
                ops.SupportedCultures = cultures.OrderBy(x=>x.EnglishName).ToList();
                ops.SupportedUICultures = cultures.OrderBy(x => x.EnglishName).ToList();

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

  • configurer les services pour utiliser le modèle d'itinéraire de culture:
public class RouteValueRequestCultureProvider : IRequestCultureProvider
    {
        private readonly CultureInfo[] _cultures;

        public RouteValueRequestCultureProvider(CultureInfo[] cultures)
        {
            _cultures = cultures;
        }

        /// <summary>
        /// get {culture} route value from path string, 
        /// </summary>
        /// <param name="httpContext"></param>
        /// <returns>ProviderCultureResult depends on path {culture} route parameter, or default culture</returns>
        public Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
        {
            var defaultCulture = "en";

            var path = httpContext.Request.Path;

            if (string.IsNullOrWhiteSpace(path))
            {
                return Task.FromResult(new ProviderCultureResult(defaultCulture));
            }

            var routeValues = httpContext.Request.Path.Value.Split('/');
            if (routeValues.Count() <= 1)
            {
                return Task.FromResult(new ProviderCultureResult(defaultCulture));
            }

            if (!_cultures.Any(x => x.Name.ToLower() == routeValues[1].ToLower()))
            {
                return Task.FromResult(new ProviderCultureResult(defaultCulture));
            }

            return Task.FromResult(new ProviderCultureResult(routeValues[1]));
        }
    }

voir le tutoriel complet ici a >.


1 commentaires

Cela ne répond pas du tout à la question



0
votes

Les localisations des pages rasoir doivent se trouver dans le dossier Pages . Les localisations de la page de rasoir Index doivent donc être situées dans

\Resources\Pages\Index.es.resx


0 commentaires

0
votes

Avec le didacticiel lié, vous utilisez des ressources partagées, vous ne devez donc pas créer de sous-dossier dans Resources for Pages etc., mais simplement nommer chaque fichier resx ViewResource.xx.resx.


0 commentaires