Disons que vous faites un logiciel de blog et que vous souhaitez montrer le nombre de commentaires une entrée gagnée. Vous pourriez le faire de cette façon: qui pourrait entraîner: p> mais si une entrée n'avait que 1 commentaire, je veux que le ligne pour dire "commentaire" plutôt que "commentaires". Et en ligne Quelle est la meilleure façon de faire face à cela? P> p> si / else code> s sont laides et répétitifs. P>
7 Réponses :
Créer une fonction qui prend un numéro et un mot, et renvoie une chaîne contenant les deux. Il appendra un "s" (ou consultera un dictionnaire que vous construisez) lorsque le numéro est plus grand que 1. P>
Je ferais la fonction ajouter le S si le nombre n'est pas 1, de sorte que 0 obtient également la forme plurielle.
Que feriez-vous appeler une telle fonction?
La pluralise semble être le nom le plus ajusté.
+1 C'est la manière appropriée, mais peut être compliqué lorsque vous devez faire face aux différentes variations de la langue anglaise. (c'est-à-dire une activité dont vous auriez besoin pour faire des activités au lieu de l'activité). Avoir un dictionnaire que vous construisez est approprié, mais peut être une douleur à suivre.
Peut-être que le 3ème argument transmis à cette fonction peut être le mot pluriel? Par exemple, si vous l'avez fait: pluralize ($ NUM, "commentaire"); code> il retournerait "commentaires", mais si vous l'avez fait:
pluralize (($ NUM, "activité", "Activités '); code> puis il renvoie des activités plutôt que des activités
@Click Upvote: Vous venez d'inventer quelque chose de similaire à la fonction ngetext, veuillez consulter ma réponse ci-dessous :-)
Cela peut être compliqué lorsque le logiciel doit être localisé, car certaines langues gèrent le pluriel / singulier différemment de l'anglais.
Eh bien, certaines langues sont encore plus compliquées. Singular, double et pluriel chacun d'entre eux liés à la masculinité et répété à nouveau avec des nombres tels que 101, 102, 10x ... 201 ... SO. Toutes les langues ne sont pas aussi simples que l'anglais en ce qui concerne ce problème.
Je dirais aussi que toutes les langues ne sont pas aussi difficiles i> comme anglais quand il s'agit de ce problème :)
Pas le plus élégant, mais le plus facile à produire "Commentaire (s)".
[Entry title] [Content........] 1 Comment(s)
Comme vous le note, cela n'est pas très élégant ... Quand je vois une telle sortie, je me demande toujours pourquoi l'ordinateur n'a pas dépensé le milliseconde supplémentaire pour comprendre si le "S" devrait être là ou non :-)
Pourquoi ne pas prendre le temps d'humaniser les choses encore plus ...
@FlushLips: Sauf quand une langue a trois formes plurielles ou plus. Comme expliqué ci-dessous, la fonction ngetext est la solution la plus générale. Il permet à un traducteur d'inclure toutes ses formes plurielles dans le fichier «.po» et la droite sera sélectionnée au moment de l'exécution.
Cela me surprend que personne ne l'a suggéré encore, mais ce que je fais habituellement est d'utiliser l'opérateur conditionnel: Remarque: la chaîne ne devrait bien sûr pas être codée dur comme celle-ci du tout , mais plutôt chargé à partir d'un référentiel de ressources, où il est stocké avec un espace réservé de formatage pour le numéro, de sorte que vous puissiez gérer des langues dans lesquelles le numéro doit apparaître le dernier (ou au milieu): P> // should load "{0} Comments" or "{0} Comment" if we run in an English locale
string comments = string.Format(
numComments != 1 ? GetResource("Comments") : GetResource("Comment"),
numComments);
Ce n'est pas la bonne façon de faire l'internationalisation. La langue autre que l'anglais a leurs propres règles pour les formes plurielles; par exemple. Lituanien a trois formes différentes: "1 Komentaraas", "2 Komentarai", "10 Komentarų". Le cadre GNU GetText Populaire en C Programmes C a une solution pour cela (la fonction ngetext). Je ne connais pas Java / C # / php, je ne peux donc pas dire quelle est la solution correcte canonique là-bas.
@Marius: Merci pour ces informations. Je n'étais pas au courant de ces règles lituaniennes. J'ai fait un peu de logiciel international (événement a formulé un logiciel de traduction de textes ui pour un grand client) mais n'a jamais rencontré de telles exigences. Très intéressant! Je ne plongerai pas en détail ici, je voulais juste introduire le concept de ramasser les textes d'un référentiel de ressources, plutôt que de les coder fort.
@Fredrik: J'ai également été surtout la première fois que j'ai entendu parler de langues avec plus de deux formes plurielles ... je suis danois et habitué à deux formes :-) Heureusement, la fonction ngetext peut y faire face, s'il vous plaît voir ma réponse ailleurs sur cette page.
Beaucoup de langues ont plus de deux formes plurielles; Par exemple, IIRC, toutes les langues slaves font (le russe fait certainement).
Veuillez utiliser le ngetext code>
fonction pour les choses comme ça. Ce
vous permet de traiter correctement avec les pluriels en anglais et autres
langues, une fois et pour tous. Vous l'utilisez comme ceci:
#: test.php:7 msgid "foo" msgid_plural "foos" msgstr[0] "" msgstr[1] "" #: test.php:8 msgid "bar" msgid_plural "bars" msgstr[0] "" msgstr[1] ""
Il serait répétitif de l'utiliser avec un imprimeur tout le temps, mais peut-être une fonction wrapper peut être écrite qui fait le printf et le% d. Peut-être que vous pourriez écrire le corps de cette fonction et mettre à jour votre réponse? Fonction Plururize ($ NUM, $ Mots-mots, $ pluralword = '') code>
@Click Upvote: Bonne idée. J'ai fait la fonction avec trois arguments obligatoires - la chaîne plurale est nécessaire pour que XGetText puisse reconnaître l'appel de la fonction et le traiter correctement.
Consultez le Module Inflector Rails . Ceci fournit une belle solution centralisée et configurable à ce problème. P>
en C / C ++, vous pouvez faire ce qui suit. Vous pourrez peut-être faire quelque chose de similaire dans php.
printf("%d Comment%s\n", numComments, numComments == 1 ? " \b" : "s");
+1 pour votre nom d'utilisateur, parce que cela m'a dit de. C'est un intelligent et je serais intéressé à savoir combien de susvotes vous avez eu pour cela seul. :)
Je suis à moitié tenté de bowervote juste pour lutter contre les effets des personnes qui évitent