ドキュメント によると:
ランタイムは、非検証属性のローカライズされた文字列を検索しません。上記のコードでは、「Email」([Display(Name = "Email")]から)はローカライズされません。
DisplayAttributeでテキストをローカライズする方法を探しています。適切な方法でそれを行うための提案はありますか?
ResourceType
にDisplayAttribute
を設定して、テキストのローカライズに使用できます。
リソースを追加する.resx
ファイルをプロジェクトに追加します。例: MyResources.resx
、フィールドのリソースを追加します。
次に、フィールドの名前とMyResources
のDisplayAttribute
タイプを参照します
[Display(Name = "RememberMe", ResourceType = typeof(MyResources))]
public bool RememberMe { get; set; }
ローカライズされたリソースは自動的にプルスルーされます(テキストボックスを参照)
注:現在、RC2にはバグがあり、リソース値に非ラテン文字を使用するとNotImplementedException
がスローされます:- https://github.com/aspnet/Razor/issues/76
ビュー内であろうとデータ注釈であろうと、すべてのローカリゼーションの中央の場所を持つことは、私が考えることができる最善のアプローチであり、これが私が仕事に取り掛かった方法です。ローカリゼーション用の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;
});
このように、DataAnnotationLocalizerProviderはResources。{culture} .rexリソースファイルには、No code gen)のアクセス修飾子が必要です-デフォルト言語にリソースが必要ないことを前提としています。コードが生成されず、同じ名前の空のクラスを作成する必要があるため、リソースファイルにアクセスできます。
_ ViewImports.cshtmlファイルに以下を挿入します
@inject IHtmlLocalizer<Resources> Localizer
これを行うことにより、ローカリゼーションの目的で任意のビューで使用されるグローバル変数Localizerが得られます。
---(
ASP.NET Coreでのグローバリゼーションとローカリゼーション に関する詳細情報を見つけることができます。
エラーで苦労している人(@ lucius、@ vladislav)の場合:
ローカリゼーションに失敗したため、プロパティ 'Name'を取得できません。タイプ 'Xxxx.EmployeeResx'はパブリックではないか、 'FirstName'という名前のパブリック静的文字列プロパティを含みません。
これは、デフォルトでInternalに設定されている.resxファイルのアクセス修飾子が原因で発生します(私の場合はコードなし世代)。リソースファイルツールバーの[アクセス修飾子]ドロップダウンでpublicに変更します。
その後、リソースタイプからプロパティを確認できるようになります。
また、フィールド名には特別な記号を使用しないことを検討してください。これらは自動生成されたC#プロパティ名の基礎です。フィールド名はC#のフレンドリ名に変換されるため、リソースファイルフィールドの名前と自動生成されたプロパティの名前の間に不整合が生じる可能性があります。ハイフンを避けるのが最善です-
またはドット.
アンダースコア_
は大丈夫です。自動生成されたプロパティがどのように見えるかは、関連するリソースファイルの下のresource_file_name.Designer.csクラスでいつでも調べることができます。
Code Digest にこのトピックに関する良い記事を書いたBalaMuruganに感謝します。
実際、私はフォロワーのための簡単な解決策を見つけました。ほとんどの場合、表示名は入力フィールドのラベルで使用されます。したがって、必要に応じてこれを実行します。
<label asp-for="Email">@Localizer["Email"]</label>
もちろん、プロパティ名は@Html.DisplayNameFor
で渡すことができますが、ほとんどの場合、これはすでにうまく機能しています。
クラスプロパティと列挙型のDisplay属性のローカリゼーションを含むローカリゼーションを示すプロジェクトを作成しました。
プロジェクトはここにあります https://github.com/feradz/ASPNetCoreLocalization/wiki
Display属性は、ASP.NET Core1.0より前のアプローチを使用してローカライズする必要があります。プロジェクトのDataAnnotations.resx
ファイルを見てください。
Name
のDisplay
プロパティには、空のスペースや特殊文字を含めることはできません。
[Display(Name = "NoSpacesAndSpecialChanractersHere", ResourceType = typeof(Resources.DataAnnotations))]
public string FirstName { get; set; }
ResourceType
は、完全修飾リソースクラス名である必要があります(つまり、名前空間を含む)。