Subpastas em app_globalResources (asp.net)
-
23-09-2019 - |
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?
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.