Question

Est-il possible de mettre les fichiers de ressources (.resx) dans les sous-dossiers à l'intérieur App_GlobalResources?

Par exemple:

  

/App_GlobalResources/someresources/myfile.resx

     

/App_GlobalResources/someresources/myfile.fr-fr.resx

     

/App_GlobalResources/othereresources/otherfile.resx

     

/App_GlobalResources/othereresources/otherfile.fr-fr.resx

Ou, sont tous les fichiers .resx placés directement à l'intérieur App_GlobalResources?

S'il est possible d'utiliser des sous-dossiers, comment voulez-vous accéder à des ressources dans les sous-dossiers programme?

Était-ce utile?

La solution

Techniquement, oui, il est possible, mais il y a des pièges. Tout d'abord, permettez-moi de vous montrer un exemple. Supposons que mon dossier App_GlobalResources ressemble à ceci:

/App_GlobalResources
    /Test
        TestSubresource.resx
    TestResource.resx

Chaque fichier de ressources a une seule entrée appelée « TestString ». J'ai ajouté chaque fichier de ressources en utilisant le menu Visual Studio il a créé une classe pour moi. Par défaut, toutes les classes ajoutées au dossier App_GlobalResources auront le même espace de noms Resource. Donc, si je veux utiliser le générateur de classe et je veux Test dans l'espace de noms, je dois aller dans le fichier TestSubresource.Designer.cs et modifier manuellement l'espace de noms. Une fois que je fais ça, je peux faire ce qui suit:

var rootResource = Resources.TestResource.TestString;
var subResource = Resources.Test.TestSubResource.TestString;

Je peux aussi les référencer en utilisant GetGlobalResourceObject:

var rootResource = GetGlobalResourceObject( "TestResource", "TestString" );
var subResource1 = GetGlobalResourceObject( "TestSubresource", "TestString" );

Notez que j'utilise toujours le « TestSubresource » comme le moyen de référencer les ressources dans ce dossier, même si elle est dans un sous-dossier. Maintenant, l'une des captures, est que tous les fichiers doivent être uniques dans tous les dossiers dans App_GlobalResources ou votre projet jetteront une erreur d'exécution. Si j'ajoute une ressource nommée « TestResource.resx » à / Test, il lancera l'erreur d'exécution suivant:

  

Le fichier de ressources « /App_GlobalResources/TestResource.resx » ne peut pas être   utilisé, comme il est en conflit avec un autre fichier avec le même nom.).

Cela est vrai même si je change l'espace de noms sur la nouvelle ressource.

Donc, en conclusion, oui, il est possible, mais vous augmentez les chances d'obtenir une erreur d'exécution en raison de deux fichiers de ressources nommés de manière identique dans les différentes parties de la structure du dossier App_GlobalResources qui est autorisé par le système de fichiers, mais pas par .NET .

Autres conseils

Il est possible. Au moins, j'ai réussi à le faire.

Dans un site web j'ai ajouté le dossier App_GlobalResources. A l'intérieur, j'ai créé un autre dossier « MonDossier » et placé fichier MyResource.resx à l'intérieur. fichier resx contenait une paire MyKey1 -. MyValue1

En utilisant la méthode de GetResource de la "MyValue1" classe suivante, je tirai avec succès pour name = "MyKey1"

static class Class1 {

    static Assembly FindGlobalResAssembly() {
        foreach(Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) {
            if(asm.FullName.StartsWith("App_GlobalResources."))
                return asm;
        }
        return null;
    }

    public static object GetResource(string name) {
        Assembly asm = FindGlobalResAssembly();
        if(asm == null)
            return null;
        return new ResourceManager("Resources.MyResource", asm).GetObject(name);
    }

}

Cette approche fonctionne en fiducie moyenne aussi.

Il semble que les dossiers ne font aucune différence lorsque l'accès aux ressources à partir du code.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top