2009-01-12 9 views
4

Nous avons des fichiers de ressources générés automatiquement dans notre projet dans Visual Studio 2008, avec quelques versions localisées, et dans l'une de ces versions localisées, il y a une chaîne qui dans ce cas est vide.Ressources dans le fichier de projet dans VS2008 est «réutilisé» de manière créative par le concepteur de formulaire, possible d'éviter?

Plus explicite. Nous avons un fichier de ressources de base, avec beaucoup de ressources de chaîne. Nous avons alors 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 est maintenant que le concepteur de formulaire est assez content d'avoir trouvé une ressource pour une chaîne, et ne s'arrêtera apparemment à rien pour réutiliser cette ressource pour des chaînes vides, il assignera une propriété dans le code du concepteur généré pour un forme. Par exemple, si pour une raison quelconque une propriété sur un contrôle n'est pas spécifiée avec une valeur par défaut (donc elle sera sérialisée au code même si elle est vide), alors elle référencera notre ressource au lieu d'écrire le vide littéral de chaîne dans le code C#.

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

Voici un code abrégé exemple:

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

Dans ce cas, l'dash_red_shift_info_description n'a pas de valeur pour les paramètres régionaux sv-SE, de sorte que le concepteur, quand il voit une chaîne vide dans le code, WILL essayez de lier à cette ressource. Mais le SystemMessagesResources_sv_SE n'est pas une classe existante, mais apparemment un nom de classe généré pour la version localisée suédoise du fichier de ressources SystemMessagesResources, qui est compilé dans une classe.

Est-ce possible d'éviter? Nous sommes un peu fatigués de la recherche/remplacement chaque fois que nous changeons quelque chose dans les fichiers de formulaire, et nous sommes à peu près sûrs qu'il y a une chose que nous avons fait pour que ça arrive, mais nous sommes pas capable de trouver la cause de cela nous-mêmes.

Le code ci-dessus serait, si nous avons supprimé la ressource, lire comme ceci:

this.rpAllFields.KeyTip = ""; 

Répondre

2

Vous pourriez essayer de créer une ressource de chaîne empty_string, définie comme "" pour tous les paramètres régionaux. Si vous en faites la première ressource, le concepteur de formulaires choisira (espérons-le) toujours celui-ci comme valeur à saupoudrer dans vos formulaires. De cette façon, au moins, vous utiliserez une chaîne désignée à cet effet.

+0

Le problème est que vous ne pouvez pas modifier les fichiers de ressources ou les gérer. S'il s'agissait d'une tierce personne ou si vous avez besoin d'une modification non standard pour travailler autour des espaces, vous vous tirerez dans le pied. – Klathzazt

0

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 à vide dans certaines langues prises en charge (si vous utilisez la concaténation de chaînes pour certains éléments d'interface utilisateur), oui.

Mais si mon scénario ne ressemblait pas à ceci, je ferais simplement une petite place à l'entrée de la ressource avec la chaîne vide. Je voudrais juste dire, "Quel texte d'interface utilisateur autonome se traduit par vide, de toute façon?".

Si je vraiment besoin de la ressource à vide dans certains cas, (où il représente un article dans une langue et où aucun mot équivalent existe dans un autre), je voudrais essayer de voir si je pouvais produire la même effectuez d'une autre manière.

+0

L'entrée de ressource a une valeur dans la langue d'origine, mais pas dans l'autre, d'où la chaîne vide. Si je supprime l'entrée de ressource, elle retournera par défaut à la langue d'origine, ce qui est également faux. –

+0

Utilisez-vous cette chaîne vide tout seul (comme le texte d'un élément de l'interface utilisateur, par exemple) ou est-elle concaténée avec d'autres chaînes pour former une phrase? Si c'est le cas, je distrairais juste les puristes pendant une seconde et coderais en dur la ressource irrégulière dans une propriété sensible aux paramètres régionaux. – Ishmaeel

0

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

Et ce que vous dites est: vous avez une définition littérale de chaîne vide dans votre espace de noms (le premier trouvé) mais cela cause un problème? Ne sera-t-il pas vide à tout moment? Lorsque vous compilez le code - il fait des choses bizarres comme ça 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 génération automatisée à la volée de fichiers d'assemblage: le compilateur est assez intelligent pour savoir que cela ne fait pas de différence, mais pour nous, il renomme 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 en avons fait un global. Ce que je vois ici, c'est que votre espace de noms global remplit les blancs - vous voudrez peut-être en avoir un 'below' qui évalue toutes les chaînes nulles.

Je n'ai pas travaillé avec cela depuis plus d'un an alors pardonnez-moi si ma formulation est pauvre, mais ce que je veux dire est: pensez XML. Vous devez utiliser explicitement l'espace de noms dans les propriétés ou les affecter plus bas (comme la propriété jointe dans xaml).

J'espère que cette aide (et logique)

+0

Ceci est un fichier de ressource entièrement géré et généré par l'éditeur de ressources, donc à moins que je ne souhaite réécrire le système de ressources entier, je doute que je puisse simplement introduire des espaces de noms sur un coup de tête ici. –

2

Si le problème est causé par une chaîne vide dans le fichier de ressources, quel serait l'effet est d'en faire un espace. Ainsi, au lieu de "" le fichier de ressources contient "". Je ne sais pas si c'est la meilleure solution mais je serais intéressé de 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'avoir une valeur qui devrait être indéfinie soit défini comme un espace ...