none
Problemas con Globalizacion y localizacion RRS feed

  • Pregunta

  • Hola, veran estoy con un proyecto que requiere de 2 idiomas (español e ingles). He mirado las guias, los videos y la documentacion de microsoft y no logro que me funcione los idiomas segun su hoja de recurso.

    No se si me falta algo en el codigo o si falta instalar algo en el visual estudio, ya que actualmente estoy usando el core 2.2

    De momento estaba experimentando con la localizacion del view.

    Startup

    using System;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.HttpsPolicy;
    using Microsoft.AspNetCore.Localization;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.Mvc.Razor;
    using Microsoft.EntityFrameworkCore;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Options;
    
    namespace Prueba_Multi_Lenguaje
    {
        public class Startup
        {
            public Startup(IConfiguration configuration)
            {
                Configuration = configuration;
            }
    
            public IConfiguration Configuration { get; }
    
            // This method gets called by the runtime. Use this method to add services to the container.
            public void ConfigureServices(IServiceCollection services)
            {
                services.Configure<CookiePolicyOptions>(options =>
                {
                    // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                    options.CheckConsentNeeded = context => true;
                    options.MinimumSameSitePolicy = SameSiteMode.None;
                });
    
                services.AddLocalization(options => options.ResourcesPath = "Resources");
    
                services.AddMvc()
                    .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix,options => options.ResourcesPath = "Resources")
                    .AddDataAnnotationsLocalization();
                    //.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    
                services.Configure<RequestLocalizationOptions>(options =>
                    {
                        var idiomasSoportados = new[]
                        {
                            new CultureInfo("es"),
                            new CultureInfo("en")
                        };
                        options.DefaultRequestCulture = new RequestCulture(culture: "es", uiCulture: "es");
                        options.SupportedCultures = idiomasSoportados;
                        options.SupportedUICultures = idiomasSoportados;
    
                    }
                );
    
            // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
            public void Configure(IApplicationBuilder app, IHostingEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
                else
                {
                    app.UseExceptionHandler("/Home/Error");
                    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                    app.UseHsts();
                }
    
                //app.UseHttpsRedirection();
                app.UseStaticFiles();
                app.UseCookiePolicy();
    
                var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
                app.UseRequestLocalization(locOptions.Value);
    
    
                app.UseMvc(routes =>
                {
                    routes.MapRoute(
                        name: "default",
                        template: "{controller=Home}/{action=Inicio}/{id?}");
                });
            }
        }
    }
    

    View - Inicio

    @using Microsoft.AspNetCore.Mvc.Localization;
    @inject IViewLocalizer Localizer
    
                    <div>
                        <p>@Localizer["IntroduccionTexto"]</p>
                    </div>

    Recurso en Español

    Key=IntroduccionTexto
    Value=Hola

    Recurso en Ingles

    Key=IntroduccionTexto
    Value=Hello

    Estructura del proyecto


    lunes, 2 de diciembre de 2019 23:57

Respuestas

  • Vale Chicos no se si sentir verguenza por la resolución de mi problema.

    Vera cuando cree el proyecto original tenia un nombre asi "Pagina Web", Visual Studio lo acepto sin problema e incluso adapto el valor de la proiedad de la aplicación "Espacio de nombres predeterminado" ha "Pagina_Web", pero de la propiedad de la aplicación "Nombre de ensamblado" como "Pagina Web".

    Como ya habia tenido exito al mover todos los archivos del proyecto original a uno de prueba y veia que funcionaba pense en crear un nuevo proyecto desde cero con el mismo nombre pensado que algo interno estaba mal y resulta que se me replica el error en el nuevo proyecto.

    Y sin darme cuenta pense "sera que el espacio en blanco esta dando problemas" y en efecto me puse ha cambiar los nombre y FUNCIONO. Despues fui descartando que propiedad me daba ese problema y era en "Espacio de nombres predeterminado" lo he  dejado en "Pagina_web" y ya funciona el Localization.

    Gracias por la ayuda ofrecida.

    • Marcado como respuesta nobunagaii miércoles, 4 de diciembre de 2019 19:16
    miércoles, 4 de diciembre de 2019 19:16

Todas las respuestas

  • Hola de nuevo, acabo de levantar un proyecto de prueba para probar aparte el sistema localizacion y resulta que en l proyecto de prueba SI funciona bien el cambio de idioma.

    Asi que compare los 2 startup y el del proyecto lo he puesto practicamente igual que el de prueba.

    Pero sin exito, pude notar que en la configuracion original mente puse la configuracion para HTTPS. Esto lo elimine de la configuracion pero aun persiste el problema.

    martes, 3 de diciembre de 2019 11:16
  • hola

    >>no logro que me funcione los idiomas segun su hoja de recurso

    no funciona porque siempre visualizas el mismo idioma o porque tienes algun mensaje de error?

    Entiedo la cultura la cambias en esta linea

    options.DefaultRequestCulture = new RequestCulture(culture: "es",uiCulture: "es");

    o sea detienes la ejecucion del VS, pones "en" para cambiarle el idioma y vuelves arrancar

    Cuando haces esto detienes el IIS Express ? porque puede que no esta pasando por ese option

    prueba ademas poner un breakpoint para ver si pasa por el ConfigureServices(), porque puede que solo pase la primera vez que ejecutas pero depsues ya no lo haga sino detienes el host

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 3 de diciembre de 2019 16:26
  • >>no funciona porque siempre visualizas el mismo idioma o porque tienes algun mensaje de error?

    Según el comportamiento del Localization deberia de mostrar el value segun la cultura que uno envie por la URL, pero muestra el nombre del key en este caso "IntroduccionTexto" en vez de "Hola" o "Hello".

    >>Entiedo la cultura la cambias en esta linea

    >> options.DefaultRequestCulture = new RequestCulture(culture: "es",uiCulture: "es");

    Hoy levante un proyecto desde cero y pude lograr funcionar el Localization en el proyecto nuevo, basado en este exito ajuste las linea del proyecto que presenta el problema pero aun haci no es capas de mostrar los valores que le corresponde.

    >> detienes la ejecucion del VS, pones "en" para cambiarle el idioma y vuelves arrancar

    el idioma lo cambio por el envio de parametros por URL "localhost:9999/?culture=es". Pero tambien he intentado cambiarlo desde el Startup y nada.

    >> porque puede que no esta pasando por ese option

    he colocado un breakpoint en las lineas que configuran el  Localization y al desplegar pasa por todos los breakpoint.

    Nota: Puedo notar que cuando despliego con "IIS Express" no muestra ningun error o advertencia si introdusco una cultura no soportada por ejemplo "ggg", pero yo estoy usando el despliege de tipo "Proyecto" para poder hacer pruebas desde un movil (en este caso no lo he probado en el movil) y noto que la consola me muestra este Warning

    warn: Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware[1]
          QueryStringRequestCultureProvider returned the following unsupported cultures 'ggg'.
    warn: Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware[2]
          QueryStringRequestCultureProvider returned the following unsupported UI Cultures 'ggg'.

    Puedo asumir que la configuracion esta bien a cierto punto??

    ADICIONAL!!!!!

    Tras la prueba exitosa con un proyecto desde cero con https dejo adjunto el nuevo Startup

    using System;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.HttpsPolicy;
    using Microsoft.AspNetCore.Localization;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.Mvc.Razor;
    using Microsoft.EntityFrameworkCore;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    
    namespace Prueba_Multi_Lenguaje
    {
        public class Startup
        {
            public Startup(IConfiguration configuration)
            {
                Configuration = configuration;
            }
    
            public IConfiguration Configuration { get; }
    
            // This method gets called by the runtime. Use this method to add services to the container.
            public void ConfigureServices(IServiceCollection services)
            {
                services.Configure<CookiePolicyOptions>(options =>
                {
                    // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                    options.CheckConsentNeeded = context => true;
                    options.MinimumSameSitePolicy = SameSiteMode.None;
                });
    
                services.AddLocalization(options => options.ResourcesPath = "Resources");
    
                services.AddMvc()
                    .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
                    .AddDataAnnotationsLocalization()
                    .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
                  
            // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
            public void Configure(IApplicationBuilder app, IHostingEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
                else
                {
                    app.UseExceptionHandler("/Home/Error");
                    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                    app.UseHsts();
                }
    
                var supportedCultures = new[]
    {
        new CultureInfo("en"),
        new CultureInfo("es")
    };
    
                app.UseRequestLocalization(new RequestLocalizationOptions
                {
                    DefaultRequestCulture = new RequestCulture(culture: "en"),
                    // Formatting numbers, dates, etc.
                    SupportedCultures = supportedCultures,
                    // UI strings that we have localized.
                    SupportedUICultures = supportedCultures
                });
    
                app.UseHttpsRedirection();
                app.UseStaticFiles();
                app.UseCookiePolicy();
    
                app.UseMvc(routes =>
                {
                    routes.MapRoute(
                        name: "default",
                        template: "{controller=Home}/{action=Inicio}/{id?}");
                });
            }
        }
    }
    

    martes, 3 de diciembre de 2019 21:33
  • Vale ahora si que tengo un enorme problema.

    Acabo de pasar todo el protecto al proyecto nuevo que use para probar el Localization y ahora si funciona perfectamente.

    Debo de tener algo en el proyecto original que esta bloqueandolo

    miércoles, 4 de diciembre de 2019 13:28
  • Vale Chicos no se si sentir verguenza por la resolución de mi problema.

    Vera cuando cree el proyecto original tenia un nombre asi "Pagina Web", Visual Studio lo acepto sin problema e incluso adapto el valor de la proiedad de la aplicación "Espacio de nombres predeterminado" ha "Pagina_Web", pero de la propiedad de la aplicación "Nombre de ensamblado" como "Pagina Web".

    Como ya habia tenido exito al mover todos los archivos del proyecto original a uno de prueba y veia que funcionaba pense en crear un nuevo proyecto desde cero con el mismo nombre pensado que algo interno estaba mal y resulta que se me replica el error en el nuevo proyecto.

    Y sin darme cuenta pense "sera que el espacio en blanco esta dando problemas" y en efecto me puse ha cambiar los nombre y FUNCIONO. Despues fui descartando que propiedad me daba ese problema y era en "Espacio de nombres predeterminado" lo he  dejado en "Pagina_web" y ya funciona el Localization.

    Gracias por la ayuda ofrecida.

    • Marcado como respuesta nobunagaii miércoles, 4 de diciembre de 2019 19:16
    miércoles, 4 de diciembre de 2019 19:16