web-dev-qa-db-ja.com

SharedResourcesを使用したASP.NET Core Localization

こんにちはSharedResourcesファイルについて質問があります。ここのチュートリアルで一見します: https://docs.Microsoft.com/en-us/aspnet/core/fundamentals/localization 、私はそうではありません正しく取得できるかどうかを確認してください。

SharedResources.csクラスを作成することになっていますが、どこに配置する必要があり、空にする必要がありますか、それともデータを入力する必要がありますか?

リソースファイルについても同様です。SharedResources.da.resxファイルを作成して、そこにすべての共有文字列を配置する必要がありますか?どこに行くべきですか?

そして、IHtmlLocalizer<SharedResources>を使用するときは、単に@usingと記述し、SharedResources.csが存在する名前空間を指すようにしますか?

ResourcesフォルダーにSharedResources.csSharedResources.da.resxを入れて、それを使用してWebサイトの言語をデンマーク語に変更しようとしましたが、機能しません。 Index.da.resxIViewLocalizerなどの専用のリソースファイルを使用しても問題ありませんが、IHtmlLocalizer<SharedResources>は機能しないようです。

ページの下部にリンクされているサンプルプロジェクトを見たときに、SharedResourcesが使用されている場所が見つからなかったので、誰かがそれをサンプルで更新してくれたら素晴らしいと思います。

ここに私がそれをやろうとした方法があります:

Views/Home/Index.cshtml:

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

Startup.csのConfigureServicesの上部:

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

Startup.csのConfigureの上部:

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
});

Resourcesフォルダーには、共有文字列を含むShared.csおよびShared.da.resxという空のクラスが含まれます。名前をSharedResources.csおよびSharedResources.da.resxに変更する必要がありますか?

さて、少し掘り下げて、さらに試行錯誤を繰り返した後、質問に対する答えを見つけて、すべてが機能するようになりました。私が見つけたものは次のとおりです。

SharedResources.csクラスを作成することになっていますが、どこに配置する必要があり、空にする必要がありますか、それともデータを入力する必要がありますか?

ANSWER:SharedResources.csはプロジェクトのルートフォルダーまたはResourcesフォルダーに配置できますが、最も重要なことは、名前空間を設定する必要があることですプロジェクトのルートへ。私の場合、namespace Funkipedia。また、データを含める必要はなく、クラス宣言のみを含める必要があります。

リソースファイルについても同様です。SharedResources.da.resxファイルを作成して、そこにすべての共有文字列を配置する必要がありますか?どこに行くべきですか?

ANSWER:はい、.csファイルと同じ名前のリソースファイルを作成する必要がありますneeds Resourcesフォルダー内。

そして、IHtmlLocalizer<SharedResources>を使用するときは、単に@usingと記述し、SharedResources.csが存在する名前空間を指すようにしますか?

ANSWER:ビューでIHtmlLocalizerIStringLocalizerを使用する場合は、これを一番上に記述する必要があります。 .cshtmlファイル:

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

@using Microsoft.Extensions.Localizationは、IStringLocalizerを使用する場合にのみ必要です。

これが、リソースファイルやASP.NET Coreアプリケーションのローカライズを初めて使用する他のユーザーにも役立つことを願っています。

私のチームでも機能するセットアップを追加したいと思います。 (もちろん)あなたと同じ原理に基づいていますが、プロジェクトのルートにリソース関連のファイルを配置することを強制しないので、ファイルの場所をより柔軟にできると思います。

私の理解はIStringLocalizer<T>の概念はプレースホルダーTypeで、そのフルネームは相対パスに変換され、実際のリソースファイルを見つけるために使用されます。この変換を行うために、LocalizationOptions.ResourcesPath(ある場合)。

あなたが持っていると言う:

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

だから、アイデアを与えるために、ステップバイステップで何が起こるかです

  1. SomeClass氏名:Com.Company.Project.Area.Whatever.SomeClass
  2. それを.resxファイルパスに変換します:Com\Company\Project\Area\Whatever\SomeClass.resx
  3. 接頭辞にResourcesPathの内容:Localized\Com\Company\Project\Area\Whatever\SomeClass.resx

これは、リソースファイルが検索される実際のパスです。

全体として、SharedResources.csプロジェクトのルートの下にあるResourcesPathフォルダーの下のパスとしてそのフルネームを複製する限り、どこでも好きな場所に空のクラスがあります。

例では:

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

カバーの下では、resxファイルから生成されたクラスがディレクトリツリーから名前空間を取得するため、また、文字列ローカライザーがnotプレースホルダータイプの前にResourcesPath

6
superjos

ASP.NET Core 2.0で私がうまくいったのは次のとおりです。

  1. SharedResources.csをResourcesというフォルダーに配置します。
  2. SharedResources.xx-yy.resxリソースファイルもResourcesフォルダーに配置します。
  3. ResourcesPathオプションを指定せずにservices.AddLocalization()を呼び出します。