Domanda

E 'possibile inserire i file di risorse (resx) all'interno di sottocartelle all'interno App_GlobalResources?

Ad esempio:

  

/App_GlobalResources/someresources/myfile.resx

     

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

     

/App_GlobalResources/othereresources/otherfile.resx

     

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

In alternativa, sono tutti i file .resx collocati direttamente all'interno App_GlobalResources?

Se è possibile utilizzare le sottocartelle, come si fa a livello di codice accedere alle risorse all'interno di sottocartelle?

È stato utile?

Soluzione

Tecnicamente, sì, è possibile, ma ci sono alcune insidie. In primo luogo, mi permetta di mostrare un esempio. Supponiamo che la mia cartella App_GlobalResources appare in questo modo:

/App_GlobalResources
    /Test
        TestSubresource.resx
    TestResource.resx

Ogni file risorsa ha una sola voce denominata "TestString". Ho aggiunto ogni file di risorse utilizzando il menu di Visual Studio in modo da creare una classe per me. Per impostazione predefinita, tutte le classi aggiunti alla cartella App_GlobalResources avranno lo stesso spazio dei nomi di Resource. Quindi, se voglio utilizzare il generatore di classe e voglio Test nello spazio dei nomi, ho bisogno di andare nel file TestSubresource.Designer.cs e modificare manualmente lo spazio dei nomi. Una volta che lo faccio, posso effettuare le seguenti operazioni:

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

Posso anche fare riferimento utilizzando GetGlobalResourceObject:

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

Si noti che ho ancora utilizzare il "TestSubresource" come mezzo per fare riferimento le risorse in quel file anche se è in una sottocartella. Ora, una delle catture, è che tutti i file devono essere univoci in tutte le cartelle in App_GlobalResources o il vostro progetto getteranno un errore di runtime. Se posso aggiungere una risorsa denominata "TestResource.resx" per / Test, getterà il seguente errore di runtime:

  

Il file di risorse '/App_GlobalResources/TestResource.resx' non può essere   utilizzato, come è in conflitto con un altro file con lo stesso nome.).

Questo è vero anche se cambio lo spazio dei nomi sulla nuova risorsa.

Quindi, in conclusione, sì, è possibile, ma si aumenta la probabilità di ottenere un errore di runtime a causa di due file di risorse con lo stesso nome in diverse parti della struttura di cartelle App_GlobalResources che è consentito dal file system, ma non per .NET .

Altri suggerimenti

E 'possibile. Almeno, sono riuscito a farlo.

All'interno di un sito web ho aggiunto la cartella App_GlobalResources. Al suo interno ho creato un'altra cartella "MiaCartella" e messo il file MyResource.resx all'interno. resx conteneva un paio MyKey1 -. MyValue1

Utilizzando il metodo GetResource della classe seguente ho estratto con successo "MyValue1" per 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);
    }

}

Questo approccio funziona nella fiducia media anche.

Sembra che le cartelle non fanno differenza quando si accede a risorse dal codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top