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>
3 Réponses :
J'utilise dotnet core2.1, les étapes devraient être les mêmes.
services.AddMvc() .AddRazorPagesOptions(o => { o.Conventions.Add(new CultureTemplateRouteModelConvention()); });
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)); });
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 >.
Cela ne répond pas du tout à la question
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
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.
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