2009-06-08 7 views
20

Pour le projet que je suis actuellement, je dois fournir des chaînes spécialement formatées à un service tiers pour le traitement. Et donc je vais construire les cordes comme ceci:Doit-on stocker des chaînes de format dans les ressources?

string someString = string.Format("{0}{1}{2}: Some message. Some percentage: {3}%", token1, token2, token3, number); 

plutôt coder en dur alors la chaîne, je pensais à le déplacer dans les ressources du projet:

string someString = string.Format(Properties.Resources.SomeString, token1, token2, token3, number); 

La deuxième option est à mon avis , pas aussi lisible que le premier, c'est-à-dire que la personne qui lit le code devra extraire les ressources de la corde pour déterminer à quoi ressemblera le résultat final.

Comment puis-je contourner ce problème? La chaîne de format codée en dur est-elle un mal nécessaire dans ce cas?

Répondre

14

Je pense que c'est un mal nécessaire, un que j'ai souvent utilisé. Quelque chose qui sent mauvais que je fais, est la suivante:

// "{0}{1}{2}: Some message. Some percentage: {3}%" 
string someString = string.Format(Properties.Resources.SomeString 
            ,token1, token2, token3, number); 

..at moins jusqu'à ce que le code est assez stable que je pourrais être gêné d'avoir vu que par les autres.

+5

Vous devriez aussi ajouter des commentaires au fichier de ressources pour dire quels sont les paramètres. Ceci est très utile pour les localisateurs si le fichier est traduit. –

+0

@CodingMonkey: convenu. Rendez la vie aussi facile pour les ingénieurs de localisation que possible. Vous ne voulez pas de devinettes de traduction. –

+1

@MichaelPetrotta> Comment stabiliser le code pour que ces chaînes {0} ne soient plus nécessaires? Je pense personnellement à ne pas utiliser 'string.Format' mais j'utilise:' "begin {middle} end" .Replace ("{middle}", middle) '. Bien sûr, cette approche a ses propres problèmes ... – Laoujin

2

Je ne vois pas pourquoi inclure la chaîne de format dans le programme est une mauvaise chose. Contrairement aux nombres magiques traditionnels non documentés, il est tout à fait évident de savoir ce qu'il fait à première vue. Bien sûr, si vous utilisez la chaîne de format à plusieurs endroits, elle doit certainement être stockée dans une variable en lecture seule appropriée pour éviter la redondance. Je suis d'accord que le garder dans les ressources est indirection inutile ici. Une exception possible serait si votre programme doit être localisé et que vous localisez via des fichiers de ressources.

+0

Oui, c'est une douleur, mais une certaine forme de redirection est presque essentielle pour la localisation. J'ai travaillé de l'autre côté de cette clôture, dans la localisation de logiciels, et croyez-moi, vous ne voulez pas nous envoyer du code. Ou essayez de fusionner les modifications en code. –

+0

Oui, mais la localisation de type gettext permet de conserver les chaînes d'origine dans le code, tout en ne livrant qu'un fichier pot (modèle) aux traducteurs. Donc, les fichiers de ressources ne sont pas la seule option. –

15

Il y a plusieurs raisons que vous voudriez faire ceci, mais la seule bonne raison est si vous allez localiser votre application dans une autre langue.

Si vous utilisez des chaînes de ressources, tenez compte de certaines choses.

  1. Inclure les chaînes de format dans la mesure du possible dans l'ensemble des chaînes de ressources que vous souhaitez localiser. Cela permettra au traducteur de réorganiser la position des éléments formatés pour les rendre mieux adaptés au contexte du texte traduit. Évitez d'avoir des chaînes dans vos jetons de format dans votre langue. Il est préférable d'utiliser pour les nombres. Par exemple, le message:

    "La valeur spécifiée doit être comprise entre {0} et {1}"

    est très bien si {0} et {1} sont des nombres comme 5 et 10. Si vous formatez dans des chaînes comme "cinq" et "dix" cela va rendre la localisation difficile.

  2. Vous pouvez obtenir le problème de lisibilité dont vous parlez simplement en nommant bien vos ressources.

    chaîne someString = chaîne.Format (Properties.Resources.IntegerRangeError, minValue, maxValue);

  3. Évaluez si vous générez des chaînes visibles par l'utilisateur au bon niveau d'abstraction dans votre code. En général, j'ai tendance à regrouper toutes les chaînes visibles de l'utilisateur dans le code le plus proche de l'interface utilisateur possible.Si un code d'E/S de fichier de bas niveau doit fournir des erreurs, il doit le faire avec des exceptions que vous gérez dans votre application et des messages d'erreur cohérents. Cela permettra également de consolider toutes vos chaînes qui nécessitent une localisation au lieu de les avoir parsemées tout au long de votre code.

3

Une chose que vous pouvez faire pour aider à ajouter des chaînes codées dur ou même accélérer l'ajout de chaînes à un fichier de ressources est d'utiliser CodeRush Xpress que vous pouvez télécharger gratuitement ici: http://www.devexpress.com/Products/Visual_Studio_Add-in/CodeRushX/

Une fois que vous écrivez votre chaîne, vous pouvez accéder au menu CodeRush et extraire dans un fichier de ressources en une seule étape. Très agréable.

Resharper a similar functionality.

+0

Ce n'est pas une solution à long terme. Votre code sera toujours rempli avec 'Properties.Resources.SomeString'nnn lorsque vous visitez votre code ** après ** la conversion, comme lors de la maintenance – MickyD

+0

Ce commentaire était assez ancien. Cependant 'Properties.Resources.SomeString' est la façon dont vous auriez accès aux chaînes dans un projet C# au moment et la localisation de resources.dll dans un processus externe était correcte. Vous ne voulez pas toujours localiser directement le fichier binaire, donc avoir le texte dans un fichier de ressources était la clé. –

1

oui vous pouvez enter image description here

nouvelle permet de voir comment

String.Format(Resource_en.PhoneNumberForEmployeeAlreadyExist,letterForm.EmployeeName[i]) 

cette volonté m'a donné un message dynamique à chaque fois que

par la façon dont je suis useing ResXManager