2010-08-19 6 views
3

Mon application Web gère la localisation via un fichier de ressources placé dans un assembly satellite à l'aide de ResourceManager. Étant donné que l'application est en croissance, je voudrais diviser le fichier resx en plusieurs fichiers (pour chaque langue), mais du côté client, il semble que je doive créer une instance de ResourceManager pour chaque fichier que je veux lire. Yat-il un moyen d'envelopper plusieurs fichiers resx en un seul?Localisation à l'aide de plusieurs fichiers resx

Merci

Répondre

0

Si vous utilisez des sites Web (sites Web ASP.NET modèle de projet) vous pouvez faire ceci: HttpContext.GetGlobalResourceObject(classKey, resourceKey) où le ClassKey est le nom de votre fichier .resx et resourcekey est la chaîne localisée dans votre Ressource.

Si vous utilisez des applications web et vous avez vos ressources comme un projet distinct (bibliothèque C#), vous pouvez jeter un oeil à ce code:

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; 
     } 
    } 

Vous devez par exemple la classe en passant une paramètre avec votre nom d'assembly de projet de ressource, vous pouvez obtenir cette information à partir des propriétés du projet. J'ai également ajouté un champ "Ressources" cela devrait être utile si vous avez décidé de remplacer l'espace de nom par défaut de chaque fichier .resx, sachez que vous pouvez étendre cette classe pour autoriser plusieurs "espaces de noms" pour vos fichiers .resx ci-joint)

Using Custom Namespaces

Questions connexes