web-dev-qa-db-fra.com

Localisation dans les bibliothèques de classes externes dans ASP.NET Core

J'ai deux projets:

  • MyWebApp - API Web ASP.NET Core
  • MyServices - Bibliothèque de classes .NET Core, qui contient des services utiles pour le projet ci-dessus

Comment puis-je ajouter la localisation avec IStringLocalizer à MyServices? Où doit être .resx fichiers localisés?

17
Yurii N.

Voilà comment je l'ai résolu. Merci à Popa Andrei de m'avoir dirigé au bon endroit.

Bibliothèque de classe

Solution -> clic droit -> Ajouter -> Nouveau projet ... -> Norme .Net -> Bibliothèque de classes -> J'ai utilisé le nom ResourceLibrary

ResourceLibrary
|- Resources
|----- SharedResource.resx
|----- SharedResource.he.resx
|- SharedResource.cs

Code SharedResource.cs:

using Microsoft.Extensions.Localization;

namespace ResourceLibrary
{
    public interface ISharedResource
    {
    }
    public class SharedResource : ISharedResource
    {
        private readonly IStringLocalizer _localizer;

        public SharedResource(IStringLocalizer<SharedResource> localizer)
        {
            _localizer = localizer;
        }

        public string this[string index]
        {
            get
            {
                return _localizer[index];
            }
        }
    }
}

application Web

Faites un clic droit sur le projet webapp -> Ajouter -> Référence ... -> Vérifier la bibliothèque de ressources

Dans votre startup.cs webapp:

using ResourceLibrary;
...

public void ConfigureServices(IServiceCollection services) {
    ...
    services.AddLocalization(o => { o.ResourcesPath = "Resources"; });

    services.Configure<RequestLocalizationOptions>(options =>
            {
                CultureInfo[] supportedCultures = new[]
                {
                    new CultureInfo("en"),
                    new CultureInfo("he")
                };

                options.DefaultRequestCulture = new RequestCulture("en");
                options.SupportedCultures = supportedCultures;
                options.SupportedUICultures = supportedCultures;
             });
     ...
     }

     public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
        ...
        app.UseRequestLocalization(); //before app.UseMvc()
        ...
        }

Exemple d'utilisation dans le contrôleur:

 using ResourceLibrary;
 ...

 public class ExampleController : Controller
    {
    private readonly IStringLocalizer<SharedResource> _sharedLocalizer;
    public EmailsController(IStringLocalizer<SharedResource> sharedLocalizer)
    {
        _sharedLocalizer = sharedLocalizer;
    }

    [HttpGet]
    public string Get()
    {
        return _sharedLocalizer["StringToTranslate"];
    }

Voir l'exemple:

@using Microsoft.AspNetCore.Mvc.Localization
@inject IHtmlLocalizer<ResourceLibrary.SharedResource> SharedLocalizer

<p>@SharedLocalizer["StringToTranslate"]</p>
16
Shiran Dror

Vous pouvez stocker les fichiers .resx sur le projet MyServices et créer une méthode pour récupérer les ressources en fonction des clés. Pour accéder à IStringLocalizer à partir de MyServices, vous devez installer Microsoft.Extensions.Localization.Abstractions Nuget.

Fondamentalement, les configurations de localisation doivent rester sur MyWebApp (classe de démarrage), mais sur MyServices vous devez ajouter ce nuget pour utiliser IStringLocalizer et créer une méthode comme GetResourceValueByKey (clé). Cette méthode peut être appelée de n'importe où MyServices projet sera référencé.

 en utilisant Microsoft.Extensions.Localization; 
 

namespace GlobalizationLibrary { classe publique SharedResource: ISharedResource { privé en lecture seule IStringLocalizer _localizer; public SharedResource(IStringLocalizer<SharedResources> localizer) { _localizer = localizer; } public string GetResourceValueByKey(string resourceKey) { return _localizer[resourceKey]; } }}
3
Popa Andrei

Une solution typique consiste à ce que votre assemblage MyServices renvoie des clés de ressource (au lieu de renvoyer les ressources réelles à afficher à l'écran). Vous pouvez avoir le fichier .resx dans le cadre de MyWebApp et avoir des valeurs de ressource pour chaque clé de ressource. De cette façon, votre MyService peut être utilisé par diverses applications d'interface utilisateur, chacune ayant sa propre représentation des ressources.

Une autre approche consisterait à conserver le fichier .resx dans le cadre de MyService lui-même. MyWebApp peut charger l'autre assembly et lire le fichier de ressources à partir de cela.

Une autre option serait de conserver les ressources en tant que nouvel assembly et de les charger à nouveau à partir de MyWebApp.

Vérifiez les réponses SO pour obtenir plus de détails sur la façon d'accéder aux fichiers .resx d'un autre assembly -

Comment puis-je lire le .resx intégré dans un assemblage différent

Accéder aux ressources des chaînes à partir du fichier .resx intégré dans la DLL?

Comment accéder au .resx d'un autre assembly?

3
ArunGeorge