Pergunta

É possível colocar arquivos de recursos (.resx) nas subpastas dentro do app_globalResources?

Por exemplo:

/Pp_globalResources/someResources/myfile.resx

/Pp_globalResources/someResources/myfile.fr-fr.resx

/Pp_globalResources/OtheResources/otherfile.resx

/Pp_globalResources/OtheResources/otherfile.fr-fr.resx

Ou, todos os arquivos .resx são colocados diretamente dentro do app_globalResources?

Se for possível usar subpastas, como você acessa programaticamente os recursos nas subpastas?

Foi útil?

Solução

Tecnicamente, sim, é possível, mas existem algumas armadilhas. Primeiro, deixe -me mostrar um exemplo. Suponha que meu App_GlobalResources Pasta parece assim:

/App_GlobalResources
    /Test
        TestSubresource.resx
    TestResource.resx

Cada arquivo de recurso possui uma única entrada chamada "teststring". Adicionei cada arquivo de recurso usando o menu Visual Studio, por isso criou uma classe para mim. Por padrão, todas as classes adicionadas ao App_GlobalResources pasta terá o mesmo espaço para nome de Resource. Então, se eu quiser usar o gerador de classe e eu quero Test No espaço para nome, preciso entrar no arquivo testSubResource.designer.cs e alterar manualmente o espaço para nome. Depois de fazer isso, posso fazer o seguinte:

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

Eu também posso fazer referência a eles usando GetGlobalResourceObject:

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

Observe que ainda uso o "TestSubResource" como meios para fazer referência aos recursos nesse arquivo, mesmo que esteja em uma subpasta. Agora, uma das capturas é que todos os arquivos devem ser únicos em todas as pastas em App_GlobalResources Ou seu projeto lançará um erro de tempo de execução. Se eu adicionar um recurso chamado "testResource.resx" para /test, ele lançará o seguinte erro de tempo de execução:

O arquivo de recursos '/pp_globalresources/testresource.resx' não pode ser usado, pois entra em conflito com outro arquivo com o mesmo nome.).

Isso é verdade mesmo se eu mudar o espaço para nome no novo recurso.

Então, em conclusão, sim, é possível, mas você aumenta as chances de obter um erro de tempo de execução por causa de dois arquivos de recursos denominados idênticos em diferentes partes do App_GlobalResources Estrutura da pasta que é permitida pelo sistema de arquivos, mas não pelo .NET.

Outras dicas

É possível. Pelo menos, consegui fazer isso.

Em um site, adicionei a pasta app_globalResources. Dentro dele, criei outra pasta "MyFolder" e coloquei o arquivo myResource.resx dentro. O arquivo resx continha um par MyKey1 - myValue1.

Usando o GetResource Método da seguinte classe I extraiu com sucesso "myValue1" para nome = "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);
    }

}

Essa abordagem também funciona em média confiança.

Parece que as pastas não fazem diferença ao acessar recursos do código.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top