web-dev-qa-db-fra.com

Localisation ASP.NET Core avec l'aide de SharedResources

Bonjour, j'ai une question sur le fichier SharedResources. Il est regardé dans le tutoriel ici: https://docs.Microsoft.com/en-us/aspnet/core/fundamentals/localization , et je ne suis pas sûr si je l'obtiens correctement.

Je suis censé créer un SharedResources.cs classe, mais où dois-je le mettre et doit-il être vide ou dois-je le remplir avec des données?

Il en va de même pour le fichier de ressources, dois-je créer un SharedResources.da.resx fichier et y mettre toutes mes chaînes partagées? Où cela devrait-il aller?

Et quand j'utilise IHtmlLocalizer<SharedResources> dois-je simplement écrire @using et pointez-le vers l'espace de noms où SharedResources.cs réside?

J'ai essayé de mettre SharedResources.cs et SharedResources.da.resx dans le dossier Ressources et utilisez-le pour changer la langue du site Web en danois, mais cela ne fonctionne pas. Utilisation d'un fichier de ressources dédié comme Index.da.resx et IViewLocalizer fonctionne bien, mais IHtmlLocalizer<SharedResources> ne semble pas fonctionner.

Quand j'ai regardé l'exemple de projet lié au bas de la page, je n'ai trouvé aucun endroit où SharedResources est utilisé, ce serait génial si quelqu'un le mettait à jour avec un exemple de cela.

Voici comment j'ai essayé de le faire:

Vues/Accueil/Index.cshtml:

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

En haut de ConfigureServices dans Startup.cs:

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

En haut de Configure dans 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
});

Le dossier des ressources contient une classe vide appelée Shared.cs et Shared.da.resx qui contient des chaînes partagées. Dois-je peut-être en changer le nom en SharedResources.cs et SharedResources.da.resx?

D'accord, après quelques recherches et encore plus d'essais et d'erreurs, j'ai trouvé des réponses à mes questions et tout a fonctionné. Voici ce que j'ai trouvé:

Je suis censé créer un SharedResources.cs classe, mais où dois-je le mettre et doit-il être vide ou dois-je le remplir avec des données?

RÉPONSE: SharedResources.cs peut être placé dans le dossier racine du projet ou dans le dossier Ressources, mais le plus important est que l'espace de noms doit être défini à la racine du projet. Dans mon cas namespace Funkipedia. Et il n'a pas besoin de contenir de données, juste la déclaration de classe.

Il en va de même pour le fichier de ressources, dois-je créer un SharedResources.da.resx fichier et y mettre toutes mes chaînes partagées? Où cela devrait-il aller?

RÉPONSE: Oui, vous devez créer un fichier de ressources appelé le même que le fichier .cs et besoins à mettre dans le dossier Ressources.

Et quand j'utilise IHtmlLocalizer<SharedResources> dois-je simplement écrire @using et pointez-le vers l'espace de noms où SharedResources.cs réside?

RÉPONSE: Lorsqu'il s'agit d'utiliser IHtmlLocalizer et/ou IStringLocalizer en vue, vous devez écrire ceci en haut de .cshtml fichier:

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

Notez que @using Microsoft.Extensions.Localization n'est nécessaire que si vous utilisez IStringLocalizer

J'espère que cela aidera ceux qui pourraient être nouveaux dans les fichiers de ressources et la localisation des applications ASP.NET Core.

Je voudrais également ajouter la configuration qui fonctionne pour mon équipe. Il est basé sur le même principe que le vôtre (bien sûr), mais je pense qu'il permet une plus grande flexibilité sur l'emplacement de vos fichiers, car il ne vous oblige pas à mettre des fichiers liés aux ressources à la racine du projet.

Ma compréhension est que IStringLocalizer<T> a le concept d'un espace réservéType, dont le nom complet sera converti en un chemin relatif et utilisé pour trouver le fichier de ressources réel. Pour effectuer cette conversion, il utilise également les informations de LocalizationOptions.ResourcesPath, si seulement.

Dites que vous avez:

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

Voici donc ce qui se passe, étape par étape, juste pour donner une idée:

  1. SomeClass nom complet: Com.Company.Project.Area.Whatever.SomeClass
  2. convertir cela en chemin de fichier .resx: Com\Company\Project\Area\Whatever\SomeClass.resx
  3. préfixez cela avec ResourcesPath contenu: Localized\Com\Company\Project\Area\Whatever\SomeClass.resx

C'est le chemin réel où les fichiers de ressources seront recherchés.

Donc, dans l'ensemble, vous pouvez placer votre SharedResources.cs classe vide où vous voulez, tant que vous répliquez son nom complet en tant que chemin sous le dossier ResourcesPath sous la racine du projet.

Dans l'exemple:

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

Sous le couvercle, cette arborescence de répertoires est nécessaire car les classes générées à partir du fichier resx prendront leur espace de noms dans l'arborescence de répertoires, et également parce que le localisateur de chaînes pas supprimera l'espace de noms racine lors du préfixe du type d'espace réservé avec ResourcesPath.

6
superjos

Voici ce qui a fonctionné pour moi (dans ASP.NET Core 2.0):

  1. Placez SharedResources.cs dans un dossier appelé Resources.
  2. Placez également les fichiers de ressources SharedResources.xx-yy.resx dans le dossier Resources.
  3. Appelez services.AddLocalization () sans option ResourcesPath.
2