wake-up-neo.com

ASP.NET Core-Lokalisierung mit Hilfe von SharedResources

Hallo, ich habe eine Frage zur SharedResources-Datei. Es wird im Tutorial hier kurz vorgestellt: https://docs.Microsoft.com/en-us/aspnet/core/fundamentals/localization , und ich bin es nicht sicher, ob ich es richtig verstehe.

Ich soll eine SharedResources.cs - Klasse erstellen, aber wo soll ich sie ablegen und sollte sie leer sein oder muss ich sie mit Daten füllen?

Gleiches gilt für die Ressourcendatei. Soll ich eine SharedResources.da.resx - Datei erstellen und alle meine freigegebenen Zeichenfolgen dort ablegen? Wohin soll es gehen?

Und wenn ich IHtmlLocalizer<SharedResources> Verwende, schreibe ich dann einfach @using Und zeige es auf den Namespace, in dem sich SharedResources.cs Befindet?

Ich habe versucht, SharedResources.cs Und SharedResources.da.resx In den Ordner Resources zu kopieren und die Sprache der Website in Dänisch zu ändern, aber es funktioniert nicht. Die Verwendung einer dedizierten Ressourcendatei wie Index.da.resx Und IViewLocalizer funktioniert einwandfrei, aber IHtmlLocalizer<SharedResources> Scheint nicht zu funktionieren.

Wenn ich mir das Beispielprojekt ansah, das unten auf der Seite verlinkt ist, fand ich keinen Ort, an dem SharedResources verwendet wird. Es wäre großartig, wenn jemand es mit einem Beispiel dafür aktualisieren würde.

So habe ich es versucht:

Views/Home/Index.cshtml:

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

Oben in ConfigureServices in Startup.cs:

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

Oben in Configure in 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
});

Der Ressourcenordner enthält eine leere Klasse mit dem Namen Shared.cs Und Shared.da.resx, Die gemeinsam genutzte Zeichenfolgen enthält. Muss ich den Namen möglicherweise in SharedResources.cs Und SharedResources.da.resx Ändern?

Okay, nach einigem Stöbern und noch mehr Versuchen habe ich Antworten auf meine Fragen gefunden und alles zum Laufen gebracht. Folgendes habe ich gefunden:

Ich soll eine SharedResources.cs - Klasse erstellen, aber wo soll ich sie ablegen und sollte sie leer sein oder muss ich sie mit Daten füllen?

ANTWORT: SharedResources.cs Kann im Stammordner des Projekts oder im Ressourcenordner abgelegt werden, aber das Wichtigste ist, dass der Namespace sein sollte Legen Sie das Stammverzeichnis des Projekts fest. In meinem Fall namespace Funkipedia. Und es muss keine Daten enthalten, nur die Klassendeklaration.

Gleiches gilt für die Ressourcendatei. Soll ich eine SharedResources.da.resx - Datei erstellen und alle meine freigegebenen Zeichenfolgen dort ablegen? Wohin soll es gehen?

ANTWORT: Ja, Sie müssen eine Ressourcendatei erstellen, die die gleiche Bezeichnung wie die CS-Datei hat und die benötigt soll in den Ordner Resources gestellt werden.

Und wenn ich IHtmlLocalizer<SharedResources> Verwende, schreibe ich dann einfach @using Und zeige es auf den Namespace, in dem sich SharedResources.cs Befindet?

ANTWORT: Wenn Sie IHtmlLocalizer und/oder IStringLocalizer in view verwenden möchten, müssen Sie dies oben schreiben der .cshtml Datei:

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

Beachten Sie, dass @using Microsoft.Extensions.Localization Nur benötigt wird, wenn Sie IStringLocalizer verwenden.

Ich hoffe, dass dies anderen helfen wird, die mit Ressourcendateien und der Lokalisierung von ASP.NET Core-Anwendungen noch nicht vertraut sind.

Ich möchte das Setup hinzufügen, das auch für mein Team funktioniert. Es basiert (natürlich) auf dem gleichen Prinzip wie das Ihre, aber ich glaube, dass es mehr Flexibilität für den Speicherort Ihrer Dateien bietet, da Sie nicht gezwungen sind, ressourcenbezogene Dateien im Projektstammverzeichnis abzulegen.

Mein Verständnis ist, dass IStringLocalizer<T> Das Konzept eines PlatzhaltersType hat, dessen vollständiger Name in einen relativen Pfad konvertiert und verwendet wird, um die tatsächliche Ressourcendatei zu finden. Für diese Konvertierung werden ggf. auch Informationen aus LocalizationOptions.ResourcesPath Verwendet.

Angenommen, Sie haben:

// 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)
    {
      // ...
    }
  }
}

Also, hier ist was passiert, Schritt für Schritt, nur um eine Idee zu geben:

  1. SomeClass vollständiger Name: Com.Company.Project.Area.Whatever.SomeClass
  2. konvertiere das in .resx Dateipfad: Com\Company\Project\Area\Whatever\SomeClass.resx
  3. voranstellen mit ResourcesPath content: Localized\Com\Company\Project\Area\Whatever\SomeClass.resx

Dies ist der tatsächliche Pfad, in dem nach Ressourcendateien gesucht wird.

Alles in allem können Sie also Ihre leere Klasse SharedResources.cs Beliebig platzieren, solange Sie ihren vollständigen Namen als Pfad unter dem Ordner ResourcesPath im Projektstamm replizieren.

Im Beispiel:

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

Dieser Verzeichnisbaum wird im Hintergrund benötigt, da Klassen, die aus einer resx-Datei generiert wurden, ihren Namespace aus dem Verzeichnisbaum übernehmen und der String-Lokalisierer nicht Root-Namespace entfernt, wenn dem Platzhaltertyp ResourcesPath.

6
superjos

Folgendes hat bei mir funktioniert (in ASP.NET Core 2.0):

  1. Platzieren Sie SharedResources.cs in einem Ordner namens Resources.
  2. Platzieren Sie die Ressourcendateien SharedResources.xx-yy.resx auch im Ordner Resources.
  3. Rufen Sie services.AddLocalization () ohne ResourcesPath-Option auf.