Phil Haack の優れた記事Localizing ASP.Net MVC Validationでは、特に文字列のオーバーライドについて説明しています。DataAnnotations
この記事は、それ以上に適用されますASP.net MVC
。したがって、これはDataAnnotattionsを使用している場合に役立ちます。
以下に、Visual Studio でローカライズされたリソースを追加する最も簡単な手順を示します。
Project Properties
ダイアログを開きます。
- タブを選択し
Resources
ます。
- クリックして、新しい既定のリソース ファイルを作成します。
- これにより、フォルダーに 2 つのファイルが作成され
Properties
ます。
- Resources.resx
- Resources.Designer.cs
- Resources.resxが開いたら、 に変更
Access Modifier
しPublic
ます。
- 文字列を追加します。
特定のカルチャ用のリソース ファイルを追加するには、必要があります。
- で右クリック
Project
し
ますSolution Explorer
。
- [追加] -> [新しいアイテム] -> [リソース
ファイル] を選択します。
- 名前を付けて
Resources.en-us.resx
ください。(「en-us」を適切なコードに置き換えます)
- [追加] をクリックします
- フォルダにドラッグし
Properties
ます。
- Resources.en-us.resxを開き、に変更
Access Modifier
しPublic
ます。
- 文字列を追加します。
- サポートする必要がある文化ごとに繰り返します。
ビルド中、VS は.resxファイルを.resourceファイルに変換し、ラッパー クラスをビルドします。その後、名前空間を介してアクセスできますYourAssembly.Properties.Resources
。
この using ステートメントで。
using YourAssembly.Properties;
次のような属性で装飾できます。
[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "MyStringName")]
注: 一貫性を保つために、Propertiesフォルダーを使用しました。App_GlobalResources を使用するには、.resxファイルをそこに移動し、using ステートメントをディレクトリ名と一致するように変更します。このような:
using YourAssembly.App_GlobalResources;
編集: 厳密に型指定されたリソース名に最も近いのは、次のようなことです。
public class ResourceNames
{
public const string EmailRequired = "EmailRequired";
}
次に、このような属性で装飾できます。
[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = ResourceNames.EmailRequired)]
クライアント カルチャの自動検出を有効にするには、globalizationセクションをweb.configファイルに追加します。
<configuration>
<system.web>
<globalization enableClientBasedCulture="true" culture="auto:en-us" uiCulture="auto:en-us"/>
</system.web>
<configuration>
ここでは、クライアント ベースのカルチャを有効にし、カルチャとuicultureを " auto " に設定し、デフォルトは " en-us " に設定しています。
個別のサテライト アセンブリの作成:
MSDNのサテライト アセンブリの作成に関する記事も役立ちます。サテライト アセンブリを初めて使用する場合は、「リソースのパッケージ化と配置」を必ずお読みください。
過去にサテライト アセンブリを作成するとき、VS ビルド イベントを使用すると便利であることがわかりました。これらは私がとるステップです。
Class Library
私のソリューションで別のプロジェクトを作成します。
.resx
このプロジェクトに自分のファイルを作成または追加します。
Post-Build Event
ダイアログに aを追加しProject Properties
ます。(下のように)
サンプル VS ポストビルド スクリプト:
set RESGEN="C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\resgen.exe"
set LINKER="C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\al.exe"
set ASSEMBLY=$(TargetName)
set SOURCEDIR=$(ProjectDir)
Set OUTDIR=$(TargetDir)
REM Build Default Culture Resources (en)
%RESGEN% %SOURCEDIR%en\%ASSEMBLY%.en.resx %SOURCEDIR%en\%ASSEMBLY%.resources
REM Embed Default Culture
%LINKER% /t:lib /embed:%SOURCEDIR%en\%ASSEMBLY%.resources /culture:en /out:%OUTDIR%%ASSEMBLY%.resources.dll
REM Embed English Culture
IF NOT EXIST %OUTDIR%en\ MKDIR $%OUTDIR%en\
%LINKER% /t:lib /embed:%SOURCEDIR%en\%ASSEMBLY%.resources /culture:en /out:%OUTDIR%en\%ASSEMBLY%.resources.dll
REM These are just a byproduct of using the project build event to run the resource build script
IF EXIST %OUTDIR%%ASSEMBLY%.dll DEL %OUTDIR%%ASSEMBLY%.dll
IF EXIST %OUTDIR%%ASSEMBLY%.pdb DEL %OUTDIR%%ASSEMBLY%.pdb
ResGen.exeを使用してファイルを変換.resx
したくない場合は、次のようにすることができます。
using System;
using System.Collections;
using System.IO;
using System.Resources;
namespace ResXConverter
{
public class ResxToResource
{
public void Convert(string resxPath, string resourcePath)
{
using (ResXResourceReader resxReader = new ResXResourceReader(resxPath))
using (IResourceWriter resWriter = new ResourceWriter(
new FileStream(resourcePath, FileMode.Create, FileAccess.Write)))
{
foreach (DictionaryEntry entry in resxReader)
{
resWriter.AddResource(entry.Key.ToString(), entry.Value);
}
resWriter.Generate();
resWriter.Close();
}
}
}
}
この方法で変換を行うことの潜在的な欠点の 1 つは、System.Windows.Forms.dll
. Assembly Linkerを引き続き使用する必要があります。
編集: アセンブリに署名する場合、wRAR が私たちに思い出させたように、キーは一致する必要があります。