3

私の Web アプリケーションは、ResourceManager を使用してサテライト アセンブリに配置されたリソース ファイルを介してローカリゼーションを処理しています。アプリケーションが成長しているため、resx ファイルを (言語ごとに) 複数のファイルに分割したいのですが、クライアント側では、読み取りたいファイルごとに ResourceManager インスタンスを作成する必要があるようです。複数のresxファイルを1つにラップする方法はありますか?

ありがとう

4

1 に答える 1

0

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 ファイルに複数の「名前空間」を許可する場合があることに注意してください (スクリーンショットを添付) )

カスタム名前空間の使用

于 2015-05-19T21:57:41.883 に答える