2010-08-19 61 views
3

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

感谢

回答

0

如果您正在使用的网站(ASP.NET网站项目模板),你可能想这样做:HttpContext.GetGlobalResourceObject(classKey, resourceKey)其中的ClassKey是你的.resx文件的名称,获取ResourceKey是在本地化字符串您资源。

如果您使用的web应用,你有你的资源作为一个单独的项目(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

相关问题