J'ai deux projets:
Comment puis-je ajouter la localisation avec IStringLocalizer
à MyServices? Où doit être .resx
fichiers localisés?
Voilà comment je l'ai résolu. Merci à Popa Andrei de m'avoir dirigé au bon endroit.
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];
}
}
}
}
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()
...
}
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"];
}
@using Microsoft.AspNetCore.Mvc.Localization
@inject IHtmlLocalizer<ResourceLibrary.SharedResource> SharedLocalizer
<p>@SharedLocalizer["StringToTranslate"]</p>
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]; } }}
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?