Quais são as alternativas para o arquivo resx

9

Estou desenvolvendo um aplicativo do Windows e quero armazenar todo o texto para etiquetas, botões de opção, botões, caixas de seleção e cabeçalhos de colunas de grades em um único local. Eu tentei usar um arquivo de classe, um arquivo xml, uma tabela de banco de dados e um arquivo de recurso.

Descobri que um arquivo de classe é a melhor maneira de armazenar todos esses textos, mas quero saber se existe algum caminho alternativo. Se eu estiver usando um arquivo de classe, terei que recompilar o projeto se houver alteração de texto.

Um arquivo de recurso funcionará corretamente para grandes quantidades de dados? Que tal um dicionário ou armazenamento de dados em variáveis?

sandeep.gosavi
fonte
1
@ sandeep.gosavi - Você disse que os arquivos de classe são a melhor maneira de armazenar informações e solicitou uma maneira alternativa. A maneira alternativa é usar um arquivo de recurso. Sua pergunta é muito vaga e não mostra quase nenhum esforço de pesquisa da sua parte.
Ramhound
2
@ sandeep.gosavi - Então dê a ele as escolhas. Você está pedindo o "melhor caminho", mas você já o tem.
Ramhound
1
Relacionados, mas não duplicados: Design de classe para objeto internacionalizado , Internacionalização: O que pensar? e estratégias eficazes para localização no .NET . Eu sei que o post não faz referência explícita I18N, mas se ele grasna como um pato ...
Dan Pichelman
1
Não atravesse post stackoverflow.com/q/18531904/839601 . A questão Stack Overflow poderia ter sido migrada. Você só precisava ter sinalizado.
ChrisF

Respostas:

5

Em resumo: Parece-me uma localização de recursos (tipos diferentes, como rótulos estáticos, texto, etc.). De um modo geral, as alterações no conteúdo do arquivo de recursos não devem exigir a recriação do aplicativo.

A desvantagem de armazenar recursos nas classes é que cada alteração / modificação exigirá uma recriação do aplicativo win-form.

Um arquivo de recurso funcionará corretamente para grandes quantidades de dados?

Eu acho que a limitação é a limitação de tamanho de arquivo do sistema operacional e é de 4 GB em sistemas de 32 bits, se bem me lembro. Para 64 bits, deve ser ainda maior. De qualquer forma, com o objetivo de armazenar o texto estático, ele deve ser mais do que suficiente.

Assim, na minha opinião, isso não deve ser feito em nenhum outro lugar se o texto for estático.

Uma abordagem alternativa seria criar uma classe para controlar o acesso aos seus arquivos de recursos. Essa classe pode ser usada para armazenar as chaves para acessar seus arquivos de recursos e ter uma maneira fortemente digitada de recuperar os recursos disponíveis do projeto.

Algumas referências nas respostas do SE sobre localização e recursos:

Referências do MSDN :

Yusubov
fonte
1
você se importaria de explicar mais sobre o que esses recursos fazem e por que os recomenda como resposta à pergunta? "Respostas apenas para links" não são bem-vindas no Stack Exchange
gnat
@ Yusubov: Passei por seus links, o recurso é uma boa opção, mas estou em busca de qualquer outra opção.
sandeep.gosavi
1
A resposta não tem apenas links, ela possui uma declaração com a opinião proposta da solução que irá funcionar.
precisa saber é o seguinte
@ sandeep.gosavi: IMHO, escolher arquivos de recursos como solução funcionará para o seu aplicativo win-forms. Como alternativa, você pode criar uma classe que controlaria o acesso aos seus recursos externos.
precisa saber é o seguinte
@Yusubov: o que é IMHO?
sandeep.gosavi
3

Eu acho que você mencionou tudo.
Se você deseja algo flexível, em que não precise recompilar, o banco de dados pode ser sua melhor opção.
Mas, caso contrário, eu iria com. Resx, pois esse é o padrão.
Salvar texto em arquivos de classe é uma péssima idéia.

Remy
fonte
2

Além do formato .resx, você também pode usar arquivos .txt ou .restext, que estão em um formato mais simples (e mais fácil de ler e editar).

Criando arquivos de recursos para aplicativos da área de trabalho (consulte a seção "Recursos em arquivos de texto")

O formato é essencialmente name = value, com a capacidade de ter comentários e compilação condicional.

Outra opção é usar o arquivo de origem ou de texto que você deseja e criar o arquivo .resources binário manualmente ou como parte de uma etapa de construção. (consulte "Recursos em arquivos .resrouces" no link acima).

De qualquer forma, há um pouco mais de trabalho para incluí-las no seu projeto e na compilação, mas ambos têm o benefício de ter suporte para vários idiomas, assim como o arquivo .resx.

crashmstr
fonte
2

Em C #, é quase certo que você esteja melhor usando um arquivo de recursos (que é um arquivo XML). Isso oferece os seguintes benefícios:

  • Remove a necessidade de recompilar toda a solução para alterações de texto.
  • Permite que o gerenciamento de strings seja feito por alguém que não seja o codificador (os codificadores não são necessariamente as melhores pessoas para escrever mensagens informativas de erro / usuário).
  • Permite localização bastante trivial.
TZHX
fonte
Então, qual é a alternativa para arquivos .resx?
Tohid
"Remove a necessidade de recompilar toda a solução para alterações de texto." - não, quando o recurso está incorporado
Konrad
1

Eu tinha um requisito semelhante antes e armazenei recursos em um arquivo .resx, mas decidi usar classes para armazenar as chaves.

Por exemplo, digamos que tenho recursos para a tela de saque bancário.

Eu criei uma classe simples nas linhas de

public class BankingWithdrawalResource
{
   public string WithdrawFunds { get; set; }
}

Eu implementei uma classe para recuperar recursos. Meu objetivo era ter uma maneira fortemente tipada de extrair recursos. Eu também queria tornar a unidade de recuperação de recursos testável. Eu extraído uma interface para recuperar recursos: IResource.

Cada vez que eu queria usar recursos, eu recebia uma implementação por meio do contêiner de IoC.

var resource = Dependency.Resolve<IResource>();

Finalmente, quando se tratava de usar o recurso, eu teria algo nas linhas de:

resource.For<BankingWithdrawalResource>(p => p.WithdrawFunds)

Na linha acima, usei a expressão lambda que me permitia visualizar todos os recursos disponíveis por meio do intellisense.

Quando se tratava de testes de unidade, eu zombava IResourcee estabelecia expectativas.

Por exemplo:

resourceMock.Expect(a => a.For<BankingWithdrawalResource>(p => p.WithdrawFunds)).Repeat.Once();

Observe também que extraímos uma interface para recuperação de recursos. Por esse motivo, agora podemos armazenar recursos em qualquer lugar que desejarmos. Por exemplo:

public class DatabaseResource : IResource
{
   // Logic to retrieve resources from database
   // Won't cause recompilation
}

public class XmlResource : IResource
{
   // Logic to retrieve resources from xml files
}

public class DefaultResource : IResource
{
   // Will cause recompilation as resources are stored in .resx
}

Eu escrevi acima do topo da minha cabeça no bloco de notas, então se você tiver algum problema, avise-me e adicionarei a implementação mais tarde.

CodeART
fonte
O dis-vantagem para armazenar recursos em aulas, é que cada mudança / modificação exigirá um re-build do aplicativo de forma vitória
Yusubov
Estou um pouco confuso, por favor, corrija-me se estiver errado. O que eu entendi é que você está armazenando dados no arquivo de recurso e, para recuperá-lo, está usando classe.
sandeep.gosavi
1
Você não mudará de classe, pois mudar de classe significa alterar as chaves de recurso. Se você estiver alterando as chaves de recurso, significa que não pensou na primeira vez. O que você pode estar mudando são entradas reais no arquivo de recursos, no arquivo xml ou no banco de dados. Isso irá recompilar o aplicativo. Se seus requisitos não permitirem a recompilação, deixe a maioria do meu exemplo como está e implemente um provedor de recursos para o banco de dados ou outra fonte que não fará com que o aplicativo seja recompilado.
CodeART 30/08/13
1
@ sandeep.gosavi Tenho uma classe para armazenar chaves de recursos e uma classe para recuperar recursos. A vantagem é que eu não preciso mais usar "cordas mágicas" toda vez que retiro recursos, em vez disso, obtenho uma lista de recursos disponíveis por meio do intellisense. Também posso substituir facilmente meu provedor de recursos (de resx para banco de dados). Finalmente, é facilmente testável.
CodeART 30/08
1
OK, entendi. Você pode, por favor, me fornecer um código de demonstração, porque eu sou novo no dotnet
sandeep.gosavi
1

Acabei de fazer algo semelhante após esta explicação passo a passo do CodeProject: link

É para transformar vários arquivos de texto facilmente atualizáveis ​​em arquivos de recursos que você pode adicionar ao seu projeto para ter idiomas diferentes (no meu caso, uma caixa de combinação permite que eu mude entre tantos idiomas quanto crio arquivos de recursos)

A vantagem disso em relação aos arquivos .resx é que você pode ter apenas 1 por idioma por projeto, em vez de ter 1 por idioma por formulário

Apenas outra coisa para pensar

iabbott
fonte
1

O Objeto Portátil (.po) é muito popular e praticamente um padrão fora do mundo .NET. Eu o vi usado em alguns projetos C # (por exemplo, https://github.com/OrchardCMS/OrchardCore/tree/d729a2048a4390380d99e7be9f7968ff8f8e9271/src/OrchardCore/OrchardCore.Localization.Core ). Não há suporte oficial para ele, mas o formato não é tão complexo e existem algumas bibliotecas para ele: https://github.com/neris/NGettext

O formato é definitivamente mais simples que o .resx, pois não é baseado em XML. Você tem muitas ferramentas para isso, por exemplo, pootle, poedit e muito mais ...

Outra opção é usar algum formato simples (ou personalizado) como JSON / YAML / TOML, ou mesmo algo tão simples quanto Key=Valueem texto sem formatação com alguma convenção de nomenclatura de arquivos Locale.{languagecode2-country/regioncode2}. Você pode então incorporá-lo como um recurso em sua montagem :) Mas é necessário criar sua própria ferramenta de tradução ou algum conversor de / para po / resx para trabalhar com as ferramentas existentes.

Fora isso, .resx é o caminho oficial e a primeira opção a seguir. As ferramentas também são decentes: https://github.com/tom-englert/ResXResourceManager

Konrad
fonte