web-dev-qa-db-ja.com

ASP.NETコアDisplayAttributeローカリゼーション

ドキュメント によると:

ランタイムは、非検証属性のローカライズされた文字列を検索しません。上記のコードでは、「Email」([Display(Name = "Email")]から)はローカライズされません。

DisplayAttributeでテキストをローカライズする方法を探しています。適切な方法でそれを行うための提案はありますか?

9
David

ResourceTypeDisplayAttributeを設定して、テキストのローカライズに使用できます。

リソースを追加する.resxファイルをプロジェクトに追加します。例: MyResources.resx、フィールドのリソースを追加します。

enter image description here

次に、フィールドの名前とMyResourcesDisplayAttributeタイプを参照します

[Display(Name = "RememberMe", ResourceType  = typeof(MyResources))]
public bool RememberMe { get; set; }

ローカライズされたリソースは自動的にプルスルーされます(テキストボックスを参照)

enter image description here

:現在、RC2にはバグがあり、リソース値に非ラテン文字を使用するとNotImplementedExceptionがスローされます:- https://github.com/aspnet/Razor/issues/76

9
Sock

ビュー内であろうとデータ注釈であろうと、すべてのローカリゼーションの中央の場所を持つことは、私が考えることができる最善のアプローチであり、これが私が仕事に取り掛かった方法です。ローカリゼーション用のnugetパッケージをインストールした後、Startup.csファイルに次のコードを追加します

services.AddMvc().AddViewLocalization().AddDataAnnotationsLocalization(options => 
    options.DataAnnotationLocalizerProvider = (type, factory) => new StringLocalizer<Resources>(factory));

services.Configure<RequestLocalizationOptions>(options => {
   var cultures = new[]
   {
       new CultureInfo("en"),
       new CultureInfo("ar")
   };
   options.DefaultRequestCulture = new RequestCulture("en", "en");
   options.SupportedCultures = cultures;
   options.SupportedUICultures = cultures;
});

このように、DataAnnotationLocalizerProviderResources。{culture} .rexリソースファイルには、No code gen)のアクセス修飾子が必要です-デフォルト言語にリソースが必要ないことを前提としています。コードが生成されず、同じ名前の空のクラスを作成する必要があるため、リソースファイルにアクセスできます。

_ ViewImports.cshtmlファイルに以下を挿入します

@inject IHtmlLocalizer<Resources> Localizer

これを行うことにより、ローカリゼーションの目的で任意のビューで使用されるグローバル変数Localizerが得られます。

---(This is how a Central Location for String Localization

ASP.NET Coreでのグローバリゼーションとローカリゼーション に関する詳細情報を見つけることができます。

7
Rahma Sammaron

エラーで苦労している人(@ lucius、@ vladislav)の場合:

ローカリゼーションに失敗したため、プロパティ 'Name'を取得できません。タイプ 'Xxxx.EmployeeResx'はパブリックではないか、 'FirstName'という名前のパブリック静的文字列プロパティを含みません。

これは、デフォルトでInternalに設定されている.resxファイルのアクセス修飾子が原因で発生します(私の場合はコードなし世代)。リソースファイルツールバーの[アクセス修飾子]ドロップダウンでpublicに変更します。

[https://i.imgur.com/q3BK8T5.png]

その後、リソースタイプからプロパティを確認できるようになります。

enter image description here

また、フィールド名には特別な記号を使用しないことを検討してください。これらは自動生成されたC#プロパティ名の基礎です。フィールド名はC#のフレンドリ名に変換されるため、リソースファイルフィールドの名前と自動生成されたプロパティの名前の間に不整合が生じる可能性があります。ハイフンを避けるのが最善です-またはドット.アンダースコア_ は大丈夫です。自動生成されたプロパティがどのように見えるかは、関連するリソースファイルの下のresource_file_name.Designer.csクラスでいつでも調べることができます。

enter image description here

Code Digest にこのトピックに関する良い記事を書いたBalaMuruganに感謝します。

2
Prolog

実際、私はフォロワーのための簡単な解決策を見つけました。ほとんどの場合、表示名は入力フィールドのラベルで使用されます。したがって、必要に応じてこれを実行します。

<label asp-for="Email">@Localizer["Email"]</label>

もちろん、プロパティ名は@Html.DisplayNameForで渡すことができますが、ほとんどの場合、これはすでにうまく機能しています。

2
holmescn

クラスプロパティと列挙型のDisplay属性のローカリゼーションを含むローカリゼーションを示すプロジェクトを作成しました。

プロジェクトはここにあります https://github.com/feradz/ASPNetCoreLocalization/wiki

Display属性は、ASP.NET Core1.0より前のアプローチを使用してローカライズする必要があります。プロジェクトのDataAnnotations.resxファイルを見てください。

NameDisplayプロパティには、空のスペースや特殊文字を含めることはできません。

[Display(Name = "NoSpacesAndSpecialChanractersHere", ResourceType = typeof(Resources.DataAnnotations))]
public string FirstName { get; set; }

ResourceTypeは、完全修飾リソースクラス名である必要があります(つまり、名前空間を含む)。

1
feradz