web-dev-qa-db-fra.com

Quelles sont les alternatives au fichier resx

Je développe une application Windows et je souhaite stocker tout le texte des étiquettes, des boutons radio, des boutons, des cases à cocher et des en-têtes de colonne des grilles à un seul endroit. J'ai essayé d'utiliser un fichier de classe, un fichier xml, une table de base de données et un fichier de ressources.

J'ai trouvé qu'un fichier de classe est le meilleur moyen de stocker tous ces textes, mais je veux savoir s'il existe un autre moyen? Si j'utilise un fichier de classe, je devrai recompiler le projet si un texte change.

Un fichier de ressources fonctionnera-t-il correctement pour les données de grandes quantités? Qu'en est-il d'un dictionnaire ou du stockage de données dans des variables?

9
sandeep.gosavi

En bref: Cela me semble être une localisation de ressources (différents types comme des étiquettes statiques, du texte, etc.). De manière générale, les modifications du contenu du fichier de ressources ne devraient pas nécessiter une reconstruction de l'application.

Le désavantage pour stocker les ressources dans les classes , est que chaque changement/modification nécessitera une reconstruction de l'application win-form.

Un fichier de ressources fonctionnera-t-il correctement pour les données de grandes quantités?

Je pense que la limitation est la limitation de la taille du fichier du système d'exploitation et qui est de 4 Go sur les systèmes 32 bits, si je me souviens bien. Pour 64 bits, il devrait être encore plus grand. Quoi qu'il en soit, dans le but de stocker le texte statique, il devrait être plus que suffisant.

Ainsi, à mon avis, cela ne devrait pas être fait ailleurs si le texte sera statique.

Une approche alternative consisterait à créer une classe pour contrôler l'accès à vos fichiers de ressources. Cette classe peut être utilisée pour stocker les clés pour accéder à vos fichiers de ressources et un moyen fortement typé pour récupérer les ressources disponibles du projet.

Quelques références sur les réponses SE sur la localisation et les ressources:

Références de [~ # ~] msdn [~ # ~] :

5
Yusubov

Je pense que vous avez à peu près tout mentionné.
Si vous voulez quelque chose de flexible, où vous n'avez pas besoin de recompiler, alors la base de données pourrait être votre meilleure option.
Mais sinon j'irais avec .resx, car c'est la norme.
Enregistrer du texte dans des fichiers de classe est une assez mauvaise idée.

3
Remy

En C #, il est presque certainement préférable d'utiliser un fichier de ressources (qui est un fichier XML). Cela vous offre les avantages suivants:

  • Supprime la nécessité de recompiler la solution entière pour les changements de texte.
  • Permet à la gestion des chaînes d'être effectuée par une personne autre que le codeur (les codeurs ne sont pas nécessairement les meilleures personnes pour écrire des messages d'erreur/d'information de l'utilisateur).
  • Permet une localisation assez banale.
2
TZHX

Outre le format .resx, vous pouvez également utiliser des fichiers .txt ou .restext, qui sont dans un format plus simple (et plus facile à lire et à modifier).

Création de fichiers de ressources pour les applications de burea (voir la section "Ressources dans les fichiers texte")

Le format est essentiellement name = value, avec la possibilité d'avoir des commentaires et une compilation conditionnelle.

Une autre option consiste à utiliser le fichier source ou texte de votre choix et à créer le fichier binaire .resources manuellement ou dans le cadre d'une étape de génération. (voir "Ressources dans les fichiers .resrouces" à partir du lien ci-dessus).

Quoi qu'il en soit, il y a un peu plus de travail pour les intégrer dans votre projet et les compiler, mais ils ont tous les deux l'avantage de prendre en charge plusieurs langues, tout comme le fichier .resx.

2
crashmstr

J'avais une exigence similaire auparavant et j'ai stocké des ressources dans un fichier .resx mais j'ai décidé d'utiliser des classes pour stocker les clés.

Par exemple, disons que j'ai des ressources pour l'écran de retrait bancaire.

J'ai créé une classe simple sur le modèle de

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

J'ai ensuite implémenté une classe pour récupérer des ressources. Mon objectif était d'avoir une manière fortement typée de retirer des ressources. Je voulais également rendre testable l'unité de récupération des ressources. J'ai extrait une interface pour récupérer des ressources: IResource.

Chaque fois que je voulais utiliser des ressources, j'obtenais une implémentation via le conteneur IoC.

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

Enfin, en ce qui concerne l'utilisation de la ressource, j'aurais quelque chose du genre:

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

Dans la ligne ci-dessus, j'ai utilisé l'expression lambda qui m'a permis de visualiser toutes les ressources disponibles via intellisense.

En ce qui concerne les tests unitaires, je me moquais de IResource et je lui fixais des attentes.

Par exemple:

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

Notez également que nous avons extrait une interface pour la récupération des ressources. Pour cette raison, nous sommes maintenant en mesure de stocker des ressources où nous voulons. Par exemple:

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
}

J'ai écrit ci-dessus du haut de ma tête dans le bloc-notes, donc si vous avez des problèmes, faites-le moi savoir et j'ajouterai l'implémentation plus tard.

1
CodeART

Je viens de faire quelque chose de similaire après cette procédure pas à pas CodeProject: link

C'est pour faire plusieurs fichiers texte facilement actualisables en fichiers de ressources que vous pouvez ajouter à votre projet afin d'avoir différentes langues (dans mon cas, une zone de liste déroulante me permet de basculer entre autant de langues que je crée de fichiers de ressources pour)

L'avantage de ce fichier par rapport aux fichiers .resx est que vous ne pouvez en avoir qu'une par langue et par projet, au lieu d'en avoir une par langue et par formulaire

Juste autre chose à réfléchir

1
iabbott

Portable Object (.po) est très populaire et à peu près un standard en dehors du monde .NET. Je l'ai vu utilisé dans quelques projets C # (par exemple https://github.com/OrchardCMS/OrchardCore/tree/d729a2048a4390380d99e7be9f7968ff8f8e9271/src/OrchardCore/OrchardCore.Localization.Core ). Il n'y a pas de support officiel pour cela, mais le format n'est pas si complexe et il y a des bibliothèques pour cela: https://github.com/neris/NGettext

Le format est certainement plus simple que .resx car il n'est pas basé sur XML. Vous disposez également de nombreux outils, par exemple pootle, poedit et plus ...

Une autre option consiste à utiliser un format simple (ou personnalisé) comme JSON/YAML/TOML, ou même quelque chose d'aussi simple que Key=Value en texte brut avec une convention de dénomination de fichier comme Locale.{languagecode2-country/regioncode2}. Vous pouvez ensuite l'intégrer en tant que ressource dans votre assembly :) Mais ensuite, vous devez créer votre propre outil de traduction, ou un convertisseur de/vers po/resx pour travailler avec l'outillage existant.

En dehors de cela, .resx est la voie officielle et le premier choix. L'outillage est également décent: https://github.com/tom-englert/ResXResourceManager

1
Konrad