resource net istringlocalizer asp and asp.net asp.net-core asp.net-core-middleware asp.net-core-localization

asp.net - istringlocalizer - net core culture



ASP.NET Core Localization con ayuda de SharedResources (3)

Hola, tengo una pregunta sobre el archivo SharedResources. Se puede ver en el tutorial aquí: , y no estoy seguro de si lo recibo correctamente.

Se supone que SharedResources.cs crear una clase SharedResources.cs , pero ¿dónde debería colocarlo y debería estar vacío o debo rellenarlo con algunos datos?

Lo mismo ocurre con el archivo de recursos, ¿debo crear un archivo SharedResources.da.resx y colocar todas mis cadenas compartidas allí? ¿Dónde debería ir?

Y cuando uso IHtmlLocalizer<SharedResources> ¿simplemente escribo @using y lo @using al espacio de nombres donde reside SharedResources.cs ?

Intenté colocar SharedResources.cs y SharedResources.da.resx en la carpeta Recursos y lo uso para cambiar el idioma del sitio web a danés, pero no funciona. El uso de archivos de recursos dedicados como Index.da.resx e IViewLocalizer funciona bien, pero IHtmlLocalizer<SharedResources> no parece funcionar.

Cuando miré el proyecto de ejemplo vinculado en la parte inferior de la página, no encontré ningún lugar donde se usara SharedResources, sería genial si alguien lo actualizara con un ejemplo de eso.

Así es como traté de hacerlo:

Vistas / Inicio / Index.cshtml:

@using Funkipedia.Resources @using Microsoft.AspNetCore.Mvc.Localization @inject IHtmlLocalizer<Shared> SharedLocalizer ... <p>@SharedLocalizer["Hei"]</p> ...

En la parte superior de ConfigureServices en Startup.cs:

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

En la parte superior de Configurar en Startup.cs:

var supportedCultures = new List<CultureInfo> { new CultureInfo("nb-NO"), new CultureInfo("sv-SE"), new CultureInfo("da-DK") }; app.UseRequestLocalization(new RequestLocalizationOptions { DefaultRequestCulture = new RequestCulture("nb-NO"), SupportedCultures = supportedCultures, SupportedUICultures = supportedCultures });

La carpeta de recursos contiene una clase vacía llamada Shared.cs y Shared.da.resx que contiene cadenas compartidas. ¿Es posible que deba cambiar su nombre a SharedResources.cs y SharedResources.da.resx ?


De acuerdo, después de investigar un poco y aún más pruebas y errores, he encontrado respuestas a mis preguntas y he conseguido que todo funcione. Esto es lo que encontré:

Se supone que SharedResources.cs crear una clase SharedResources.cs , pero ¿dónde debería colocarlo y debería estar vacío o debo rellenarlo con algunos datos?

RESPUESTA: SharedResources.cs puede colocarse en la carpeta raíz del proyecto o en la carpeta Recursos, pero lo más importante es que el espacio de nombres debe establecerse en la raíz del proyecto. En mi caso namespace Funkipedia . Y no necesita contener ningún dato, solo la declaración de clase.

Lo mismo ocurre con el archivo de recursos, ¿debo crear un archivo SharedResources.da.resx y colocar todas mis cadenas compartidas allí? ¿Dónde debería ir?

RESPUESTA: Sí, necesita crear un archivo de recursos llamado igual que el archivo .cs y debe colocarse en la carpeta Recursos.

Y cuando uso IHtmlLocalizer<SharedResources> ¿simplemente escribo @using y lo @using al espacio de nombres donde reside SharedResources.cs ?

RESPUESTA: Cuando se trata de usar IHtmlLocalizer y / o IStringLocalizer a la vista, debe escribir esto en la parte superior del archivo .cshtml :

@using Microsoft.AspNetCore.Mvc.Localization @using Microsoft.Extensions.Localization @inject IViewLocalizer Localizer @inject IStringLocalizer<SharedResources> SharedLocalizer @inject IHtmlLocalizer<SharedResources> SharedHtmlLocalizer

Tenga en cuenta que @using Microsoft.Extensions.Localization solo es necesario si utiliza IStringLocalizer

Espero que esto ayude a otros que puedan ser nuevos en los archivos de recursos y la localización de las aplicaciones Core de ASP.NET.


Esto es lo que funcionó para mí (en ASP.NET Core 2.0):

  1. Coloque SharedResources.cs en una carpeta llamada Recursos.
  2. Coloque los archivos de recursos SharedResources.xx-yy.resx en la carpeta Recursos.
  3. Llame a services.AddLocalization () sin la opción ResourcesPath.

Me gustaría agregar la configuración que también funciona para mi equipo. Está basado en el mismo principio que el tuyo (por supuesto), pero creo que permite un poco más de flexibilidad en la ubicación de tus archivos, ya que no te obliga a poner archivos relacionados con recursos en la raíz del proyecto.

Entiendo que IStringLocalizer<T> tiene el concepto de un Type marcador de posición , cuyo nombre completo se convertirá en una ruta relativa y se usará para encontrar el archivo de recursos real. Para hacer esta conversión, también usa información de LocalizationOptions.ResourcesPath , si existe.

Di que tienes:

// in ProjectRoot/Startup.cs services.AddLocalization(opts => { opts.ResourcesPath = "Localized"; }); // in ProjectRoot/Area/Whatever/SomeClass.cs namespace Com.Company.Project.Area.Whatever { public class SomeClass { public SomeClass(IStringLocalizer<SomeClass> localizer) { // ... } } }

Así que esto es lo que sucede, paso a paso, solo para dar una idea:

  1. SomeClass fullname: Com.Company.Project.Area.Whatever.SomeClass
  2. conviértalo a la ruta del archivo .resx: Com/Company/Project/Area/Whatever/SomeClass.resx
  3. prefijo que con el contenido de ResourcesPath : Localized/Com/Company/Project/Area/Whatever/SomeClass.resx

Esa es la ruta real donde se buscarán los archivos de recursos.

Entonces, en general, puede colocar su clase vacía SharedResources.cs donde quiera, siempre y cuando replique su nombre completo como una ruta en la carpeta ResourcesPath en la raíz del proyecto.

En el ejemplo:

/ --Area --Whatever --SomeClass.cs --Localized --Com --Company --Project --Area --Whatever --SomeClass.resx --SomeClass.fr.resx --SomeClass.da.resx

Debajo de la portada, ese árbol de directorios es necesario porque las clases generadas a partir del archivo resx tomarán su espacio de nombres del árbol de directorios, y también porque el localizador de cadenas no eliminará el espacio de nombres de la raíz al colocar el tipo de marcador de posición con ResourcesPath .