web-dev-qa-db-ja.com

ASP.NET Coreの外部クラスライブラリでのローカリゼーション

私には2つのプロジェクトがあります。

  • MyWebApp-ASP.NET Core Web API
  • MyServices-上記のプロジェクトに役立つサービスを含む.NET Coreクラスライブラリ

IStringLocalizerを使用してローカライズをMyServicesに追加するにはどうすればよいですか?どこにある必要があります.resxファイルが見つかりましたか?

17
Yurii N.

これは私がそれを解決した方法です。正しい場所に案内してくれた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>
16
Shiran Dror

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]; } }}
3
Popa Andrei

典型的な解決策の1つは、MyServicesアセンブリが(画面に表示される実際のリソースを返す代わりに)リソースキーを返すことです。 MyWebAppの一部として.resxファイルを作成し、各リソースキーのリソース値を設定できます。このように、MyServiceは、それぞれが独自のリソース表現を持つさまざまなUIアプリで利用できます。

もう1つのアプローチは、.resxファイルをMyService自体の一部として保持することです。 MyWebAppは他のアセンブリをロードし、そこからリソースファイルを読み取ることができます。

さらに別のオプションは、リソースを新しいアセンブリとして保持し、再びそれをMyWebAppからロードすることです。

別のアセンブリから.resxファイルにアクセスする方法の詳細については、次のSO回答を確認してください-

埋め込まれた.resxを別のアセンブリで読み取るにはどうすればよいですか

dllに埋め込まれた.resxから文字列リソースにアクセスしますか?

別のアセンブリの.resxにアクセスする方法

3
ArunGeorge