使用多个resx文件进行本地化

时间:2010-08-19 14:08:03

标签: .net localization resx resourcemanager

我的Web应用程序通过使用ResourceManager放置在附属程序集中的资源文件来处理本地化。由于应用程序正在增长,我想将resx文件拆分为多个文件(对于每种语言),但在客户端,似乎我必须为我想要读取的每个文件创建一个ResourceManager实例。有没有办法将多个resx文件包装成单个文件?

由于

1 个答案:

答案 0 :(得分:0)

如果您使用的是网站(ASP.NET网站项目模板),您可能需要这样做: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文件的多个“命名空间”(附带屏幕截图) )

Using Custom Namespaces