8

System.ComponentModel.DataAnnotationsASP.NET プロジェクトの文字列をオーバーライドしたいと考えています。サテライト アセンブリを作成したり、カスタム ビルド タスクをいじったりする必要はありal.exeますか? はいの場合でも、 に変換.resx.resourcesて にフィードする方法が見つかりませんでしたal.exe。いいえの場合、どこに置き、.resx.どのように名前を付けますか?

UPD: 明確にするために: アセンブリの既定のリソースの代わりに、カスタム リソース文字列を使用したかったのです。その文字列を使用するすべての場所で変更を加えたくありませんでした。結局のところ、リソースはそれらをオーバーライドするためだけに存在します。

4

5 に答える 5

5

Phil Haack の優れた記事Localizing ASP.Net MVC Validationでは、特に文字列のオーバーライドについて説明しています。DataAnnotationsこの記事は、それ以上に適用されますASP.net MVC。したがって、これはDataAnnotattionsを使用している場合に役立ちます。

以下に、Visual Studio でローカライズされたリソースを追加する最も簡単な手順を示します。

  1. Project Propertiesダイアログを開きます。
  2. タブを選択しResourcesます。
  3. クリックして、新しい既定のリソース ファイルを作成します。
  4. これにより、フォルダーに 2 つのファイルが作成されPropertiesます。
    • Resources.resx
    • Resources.Designer.cs
  5. Resources.resxが開いたら、 に変更Access ModifierPublicます。
  6. 文字列を追加します。

特定のカルチャ用のリソース ファイルを追加するには、必要があります。

  1. で右クリックProjectし ますSolution Explorer
  2. [追加] -> [新しいアイテム] -> [リソース ファイル] を選択します。
  3. 名前を付けてResources.en-us.resxください。(「en-us」を適切なコードに置き換えます)
  4. [追加] をクリックします
  5. フォルダにドラッグしPropertiesます。
  6. Resources.en-us.resxを開き、に変更Access ModifierPublicます。
  7. 文字列を追加します。
  8. サポートする必要がある文化ごとに繰り返します。

ビルド中、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 ビルド イベントを使用すると便利であることがわかりました。これらは私がとるステップです。

  1. Class Library私のソリューションで別のプロジェクトを作成します。
  2. .resxこのプロジェクトに自分のファイルを作成または追加します。
  3. 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 が私たちに思い出させたように、キーは一致する必要があります。

于 2010-04-05T01:07:35.417 に答える
2

これは奇妙ですが、特にオープン ソースのローカリゼーション テクノロジに精通している人々にとっては、システム アセンブリやサード パーティの署名付きアセンブリのサテライト アセンブリを構築することはできません。

メイン アセンブリが厳密な名前付けを使用している場合、サテライト アセンブリはメイン アセンブリと同じ秘密キーで署名する必要があります。メイン アセンブリとサテライト アセンブリの間で公開キーと秘密キーのペアが一致しない場合、リソースは読み込まれません。

同じことが自動的に可能かどうかはわかりませんが、衛星アセンブリなしでは可能です.

于 2010-04-07T13:45:10.150 に答える
1

検証属性のデフォルトのエラー メッセージ文字列をオーバーライドしたい場合、ErrorMessageResourceNameおよびErrorMessageResourceTypeプロパティを次のように設定することでそれを行うことができます。

[Required(ErrorMessageResourceName = "Required_Username", ErrorMessageResourceType = typeof(MyResourceFile)]
public string Username { get; set; }

Required_Username必要なエラー メッセージを含む MyResourceFile.resx という名前のリソース ファイルを作成できます。

お役に立てれば。

于 2010-04-03T05:59:04.693 に答える