私には2つのプロジェクトがあります。
IStringLocalizer
を使用してローカライズをMyServicesに追加するにはどうすればよいですか?どこにある必要があります.resx
ファイルが見つかりましたか?
これは私がそれを解決した方法です。正しい場所に案内してくれたPopa Andreiの回答に感謝します。
解決策->右クリック->追加->新しいプロジェクト...-> .Net標準->クラスライブラリ-> ResourceLibraryという名前を使用しました
ResourceLibrary
|- Resources
|----- SharedResource.resx
|----- SharedResource.he.resx
|- SharedResource.cs
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];
}
}
}
}
Webappプロジェクトを右クリック->追加->参照...->リソースライブラリの確認
あなたのwebappのstartup.csで:
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>
MyServicesプロジェクトに.resxファイルを保存し、キーに基づいてリソースを取得するメソッドを作成できます。 MyServicesからIStringLocalizerにアクセスするには、Microsoft.Extensions.Localization.Abstractions
nugetをインストールする必要があります。
基本的にローカリゼーション設定はMyWebApp(スタートアップクラス)にとどまる必要がありますが、MyServicesIStringLocalizerを使用するためにそのナゲットを追加し、GetResourceValueByKey(key)のようなメソッドを作成する必要があります。このメソッドは、MyServicesプロジェクトが参照される場所ならどこからでも呼び出すことができます。
Microsoft.Extensions.Localizationを使用;
namespace GlobalizationLibrary { public class SharedResource:ISharedResource { private readonly IStringLocalizer _localizer;public SharedResource(IStringLocalizer<SharedResources> localizer) { _localizer = localizer; } public string GetResourceValueByKey(string resourceKey) { return _localizer[resourceKey]; } }}
典型的な解決策の1つは、MyServicesアセンブリが(画面に表示される実際のリソースを返す代わりに)リソースキーを返すことです。 MyWebAppの一部として.resxファイルを作成し、各リソースキーのリソース値を設定できます。このように、MyServiceは、それぞれが独自のリソース表現を持つさまざまなUIアプリで利用できます。
もう1つのアプローチは、.resxファイルをMyService自体の一部として保持することです。 MyWebAppは他のアセンブリをロードし、そこからリソースファイルを読み取ることができます。
さらに別のオプションは、リソースを新しいアセンブリとして保持し、再びそれをMyWebAppからロードすることです。
別のアセンブリから.resxファイルにアクセスする方法の詳細については、次のSO回答を確認してください-
埋め込まれた.resxを別のアセンブリで読み取るにはどうすればよいですか