私の Web アプリケーションは、ResourceManager を使用してサテライト アセンブリに配置されたリソース ファイルを介してローカリゼーションを処理しています。アプリケーションが成長しているため、resx ファイルを (言語ごとに) 複数のファイルに分割したいのですが、クライアント側では、読み取りたいファイルごとに ResourceManager インスタンスを作成する必要があるようです。複数のresxファイルを1つにラップする方法はありますか?
ありがとう
私の Web アプリケーションは、ResourceManager を使用してサテライト アセンブリに配置されたリソース ファイルを介してローカリゼーションを処理しています。アプリケーションが成長しているため、resx ファイルを (言語ごとに) 複数のファイルに分割したいのですが、クライアント側では、読み取りたいファイルごとに ResourceManager インスタンスを作成する必要があるようです。複数のresxファイルを1つにラップする方法はありますか?
ありがとう
Web サイト (ASP.NET Web サイト プロジェクト テンプレート) を使用している場合は、これを行うことができます。HttpContext.GetGlobalResourceObject(classKey, resourceKey)ここで、classKey は .resx ファイルの名前であり、resourceKey はリソース内のローカライズされた文字列です。
WebApplications を使用していて、リソースを別のプロジェクト (C# ライブラリ) として持っている場合は、次のコードを確認することをお勧めします。
public class SatelliteResourceManager
{
private const string Resources = "Resources";
private readonly string _assemblyName;
public SatelliteResourceManager(string assemblyName)
{
_assemblyName = assemblyName;
}
public Assembly Assembly { get { return Assembly.Load(_assemblyName); } }
protected IEnumerable<Type> ResourceTypes
{
get
{
return Assembly.GetTypes().Where(a => a.IsClass && a.Namespace == Resources);
}
}
public IEnumerable<ResourceManager> GetAllManagers()
{
foreach (var manager in ResourceTypes)
{
yield return (ResourceManager) manager.GetProperty("ResourceManager").GetValue(this, null);
}
}
public string GetGlobalResource(string classKey, string resourceKey, string fallback)
{
var manager = GetAllManagers().FirstOrDefault(m => m.BaseName.EndsWith(classKey, StringComparison.InvariantCultureIgnoreCase));
if (manager != null) return manager.GetString(resourceKey);
return fallback;
}
}
リソース プロジェクト アセンブリ名でパラメーターを渡すことによって、クラスをインスタンス化する必要があります。この情報は、プロジェクト プロパティから取得できます。「Resources」フィールドも追加しました。これは、各 .resx ファイルのデフォルトの名前空間をオーバーライドすることにした場合に役立ちます。このクラスを拡張して、.resx ファイルに複数の「名前空間」を許可する場合があることに注意してください (スクリーンショットを添付) )
