106 votes

Pluralité dans les messages utilisateur

Plusieurs fois, lors de la génération de messages à afficher à l'utilisateur, le message contiendra un certain nombre de chose que je tiens à informer le client à ce sujet.

Je vais vous donner un exemple: Le client a choisi un certain nombre d'éléments à partir de 1, et a cliqué sur supprimer. Maintenant, je veux donner un message de confirmation au client, et je tiens à mentionner le nombre d'éléments qu'il a choisi pour minimiser la possibilité de lui faire une erreur en sélectionnant un tas d'éléments et en cliquant sur supprimer quand il ne veut supprimer l'un d'eux.

Une façon est de faire le générique de message comme ceci:

int noofitemsselected = SomeFunction();
string message = "You have selected " + noofitemsselected + " item(s). Are you sure you want to delete it/them?";

Le "problème" ici, c'est le cas où l' noofitemselected est de 1, et nous avons à écrire élément et il à la place des éléments et leur.

Ma solution normale sera quelque chose comme ceci

int noofitemsselected = SomeFunction();
string message = "You have selected " + noofitemsselected + " " + (noofitemsselected==1?"item" : "items") + ". Are you sure you want to delete " + (noofitemsselected==1?"it" : "them") + "?";

Cela devient très long et très méchant vraiment rapide si il y a beaucoup de références aux numéros de la pluralité à l'intérieur du code, et le message devient difficile à lire.

Donc ma questions est tout simplement. Sont-il de meilleures façons de générer des messages de ce genre?

MODIFIER

Je vois beaucoup de personnes a obtenu très accroché dans le cas que j'ai mentionné que le message doit être affiché à l'intérieur d'une boîte de message, et a tout simplement donné une réponse sur la façon d'éviter d'utiliser la boîte de message, et c'est tout bon.

Mais rappelez-vous que le problème de la pluralisation également s'appliquer à des textes d'autres endroits du programme, en plus des boîtes de message. Par exemple, une étiquette à côté d'une grille afficher le nombre de lignes sélectionnées dans la grille ont le même problème concernant la pluralisation.

Donc en fait cela s'applique à la plupart de texte qui est sorti d'une certaine façon de programmes, puis la solution n'est pas aussi simple que juste de changer le programme pour pas de texte de sortie plus :)

94voto

RoadWarrior Points 11588

Vous pouvez éviter tout cela en désordre pluralité tout simplement en supprimant les articles sans message et de donner à l'utilisateur une très bonne Annuler l'installation. Les utilisateurs ne lisent jamais rien. Vous devez construire une bonne Annuler l'installation dans le cadre de votre programme de toute façon.

Vous obtenez en fait 2 avantages lorsque vous createe un vaste Annuler l'installation. Le premier avantage rend la vie plus facile, en lui permettant de renverser et de minimiser les erreurs de lecture. Le second avantage est que votre application est en reflétant la vraie vie en permettant la reprise de la non-trivial de flux de travail (et pas seulement de faire des erreurs).

Une fois, j'ai écrit une application sans l'aide d'une seule boîte de dialogue ou un message de confirmation. Il a fallu un certain sérieux de la pensée et a été beaucoup plus difficile à mettre en œuvre à l'aide de la confirmation-type de messages. Mais finalement le résultat est plutôt agréable à utiliser en fonction de ses utilisateurs finaux.

53voto

slebetman Points 28276

Si il n'y a jamais de hasard, n'importe comment petit, que cette application devra être traduite dans d'autres langues, puis les deux sont mauvais. La bonne façon de le faire est:

string message = ( noofitemsselected==1 ?
  "You have selected " + noofitemsselected + " item. Are you sure you want to delete it?":
  "You have selected " + noofitemsselected + " items. Are you sure you want to delete them?"
);

C'est parce que les différentes langues de la poignée de la pluralité différemment. Certains, comme les Malais n'ont même pas syntaxique pluriels afin que les chaînes seraient généralement identiques. Séparant les deux chaînes de fait, il est plus facile de soutenir d'autres langues plus tard.

Sinon, si cette application est destinée à être consommée par le grand public et qui est censé être convivial puis la seconde méthode est préférable. Désolé, mais je ne sais pas vraiment une façon plus simple de le faire.

Si cette application est destinée à être consommée en interne par votre entreprise, alors ne le raccourci "item(s)" chose. Vous n'avez pas vraiment à impressionner quelqu'un lors de l'écriture de enterprisy code. Mais je vous le déconseille de le faire pour de public consommé de l'application, car cela donne l'impression que le programmeur est paresseux et donc une baisse de leur opinion sur la qualité de l'application. Croyez-moi, les petites choses comme cette question.

39voto

Cody Gray Points 102261

Que diriez-vous simplement:

string message = "Are you sure you want to delete " + noofitemsselected + " item(s)?"

De cette façon, vous éliminez l'accord en nombre des difficultés, et jusqu'à la fin avec une encore plus courte, plus le point de message d'erreur pour l'utilisateur comme un bonus. Nous savons tous que les utilisateurs ne lisent pas les messages d'erreur de toute façon. Le plus court, ils sont, plus ils sont susceptibles d'au moins coup d'œil sur le texte.

Ou, armés de cette connaissance que les utilisateurs ne lisent pas les messages d'erreur, vous pouvez à l'approche de ce d'une manière différente. Ignorez le message de confirmation tout à fait, et il suffit de fournir une fonction d'annulation qui Fonctionne, tout Simplement, indépendamment de ce qui a été supprimé. La plupart des utilisateurs sont déjà habitués à l'annulation d'une opération quand ils remarquent qu'il n'était pas ce qu'ils voulaient, et sont susceptibles de trouver ce comportement plus naturel que d'avoir à traiter avec un autre pop-up.

20voto

Berin Loritsch Points 3863

Qu'en est ce que Java a eu pendant des années: java.texte.MessageFormat et ChoiceFormat? Voir http://download.oracle.com/javase/1.4.2/docs/api/java/text/MessageFormat.html pour plus d'informations.

MessageFormat form = new MessageFormat("The disk \"{1}\" contains {0}.");
form.applyPattern(
   "There {0,choice,0#are no files|1#is one file|1<are {0,number,integer} files}.");

Object[] testArgs = {new Long(12373), "MyDisk"};

System.out.println(form.format(testArgs));

// output, with different testArgs
output: The disk "MyDisk" are no files.
output: The disk "MyDisk" is one file.
output: The disk "MyDisk" are 1,273 files.

Dans votre cas, vous voulez quelque chose d'un peu plus simple:

MessageFormat form = new MessageFormat("Are you sure you want to delete {0,choice,1#one item,1<{0,number.integer} files}?");

L'avantage de cette approche est qu'il fonctionne bien avec l'i18n faisceaux, et vous pouvez fournir correctement les traductions pour les langues (comme le Japonais) qui n'ont pas la notion de pluriel ou singulier des mots.

12voto

Jens Points 14829

J’irais avec pas coder en dur le message, mais offrant deux messages dans un fichier de ressources distinct. Comme

et puis leur alimentation dans String.Format comme

Je pense que cette approche est plus facile à localiser et à entretenir. Tous les messages de l’interface utilisateur serait une locaion unique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X