Les ressources du fichier de projet dans VS2008 sont réutilisées & # 8220; & # 8221; de manière créative par le concepteur de formulaire, possible d'éviter?

StackOverflow https://stackoverflow.com/questions/435466

Question

Nous avons des fichiers de ressources générés automatiquement dans notre projet dans Visual Studio 2008, avec des versions localisées et dans l'une de ces versions localisées, une chaîne qui, dans ce cas, est vide.

Plus explicite. Nous avons un fichier de ressources principal, avec beaucoup de ressources de chaîne. Nous avons ensuite 4 autres versions localisées de ce fichier, et dans l’un de ces autres fichiers localisés, une des chaînes reçoit une valeur vide.

Le problème, c’est que le concepteur de formulaire est très heureux d’avoir trouvé une ressource pour une chaîne et ne s’arrêtera apparemment pour rien car il ne réutilise cette ressource que pour une chaîne vide, il affectera une propriété dans le code de concepteur généré pour un formulaire. .

Par exemple, si pour une raison quelconque une propriété d'un contrôle n'est pas spécifiée avec une valeur par défaut (elle sera donc sérialisée en code même si elle est vide), elle référencera notre ressource au lieu d'écrire la chaîne vide. littéral dans le code C #.

Le problème est qu’il fait référence aux versions localisées et que celles-ci ne sont pas compilées en code.

Voici un exemple de code abrégé:

this.rpAllFields.KeyTip = 
  global::namespaces.SystemMessagesResources_sv_SE.
    dash_red_shift_info_description;

Dans ce cas, dash_red_shift_info_description n'a pas de valeur pour les paramètres régionaux sv-SE, aussi le concepteur, lorsqu'il voit une chaîne vide dans le code, tentera-t-il de créer un lien vers cette ressource. Mais SystemMessagesResources_sv_SE n'est pas une classe existante, mais apparemment un nom de classe généré pour la version suédoise localisée du fichier de ressources SystemMessagesResources, compilé dans une classe.

Est-ce possible d'éviter? Nous commençons à être assez fatigués par la recherche / remplacement chaque fois que nous modifions quelque chose dans les fichiers de formulaire, et nous sommes à peu près sûrs que nous avons réussi à faire en sorte que cela se produise, mais nous en sommes bien conscients. apparemment incapable de trouver la cause de cela nous-mêmes.

Si nous supprimions la ressource, le code ci-dessus se lirait comme suit:

this.rpAllFields.KeyTip = "";
Était-ce utile?

La solution

Vous pouvez essayer de créer une ressource chaîne empty_string, définie par """ pour chaque lieu. Si vous en faites la première ressource, le concepteur de formulaire choisira (espérons-le) toujours celle-ci comme valeur à répartir dans vos formulaires. De cette façon, vous utiliserez au moins une chaîne désignée à cette fin.

Autres conseils

Si le problème est causé par une chaîne vide dans le fichier de ressources, quelle en serait l'effet de créer un espace. Donc au lieu de " " le fichier de ressources contient " " ;. Je ne sais pas si c'est la meilleure solution, mais j'aimerais savoir si cela empêche le concepteur d'utiliser cette ressource comme chaîne vide par défaut. Cependant, ne sachant pas comment il est utilisé, je ne suis pas sûr que l’impact d’une valeur qui devrait être indéfinie soit défini comme un espace.

Combien avez-vous besoin d'une ressource dont la valeur est une chaîne vide? Je peux imaginer des scénarios multilingues dans lesquels une clé de ressource devrait correspondre à un blanc dans certaines des langues prises en charge (si vous utilisez la concaténation de chaînes pour certains éléments de l'interface utilisateur), oui.

Mais si mon scénario ne ressemblait pas à cela, je supprimerais simplement l'entrée de ressource avec la chaîne vide. Je dirais simplement: "De toute façon, quel texte d'interface utilisateur autonome se traduit par un blanc?".

Si j'avais vraiment besoin que la ressource soit vide dans certains cas (où elle représente un article dans une langue et où aucun mot équivalent n'existe dans une autre), j'essaierais de voir si pourrait produire le même effet d'une autre manière.

Un fichier de ressources généré et un exemple de code seraient utiles.

Et vous dites ceci: vous avez une définition littérale de chaîne vide dans votre espace de noms (la première trouvée) mais cela pose un problème? Ne sera-t-il pas vide en tout temps? Lorsque vous compilez le code, il fait des choses bizarres comme celle-ci pour économiser de l'espace. J'ai rencontré un problème similaire lors de la génération de fichiers XAML avec codebehind pour la création automatisée de fichiers d'assemblage à la volée: le compilateur est assez intelligent pour savoir que cela ne fait aucune différence, mais pour nous, il l'a fait car il renommerait les littéraux. (qui ont été utilisés ailleurs).

Pour contourner ce problème, nous avons utilisé des types nommés pour ces primitives dans notre espace de noms et l'avons rendu global. Ce que je vois ici, c’est que votre espace de noms global est en train de remplir les blancs. Vous voudrez peut-être en avoir un en dessous, qui évalue toutes les chaînes vides.

Je n'ai pas travaillé avec cela depuis plus d'un an, alors pardonnez-moi si ma formulation est mauvaise, mais ce que je veux dire, c'est: pensez à XML. Vous devez soit utiliser explicitement l'espace de noms dans les propriétés, soit leur attribuer une valeur inférieure (comme une propriété attachée dans xaml).

J'espère que cela aide (et a du sens)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top