2010-07-06 4 views
15

Es gibt viele Instanzen in meinen Arbeitsprojekten, wo ich die Größe einiger Sammlungen in einem Satz anzeigen muss. Wenn die Größe der Sammlung beispielsweise 5 ist, wird "5 Benutzer" angezeigt. Wenn die Größe 1 oder 0 ist, wird "1 Benutzer" oder "0 Benutzer" angezeigt. Im Moment mache ich es mit if-else-Anweisungen, um zu bestimmen, ob das "s" gedruckt werden soll oder nicht, was mühsam ist.Effektive Art, Singular/Plural zu behandeln, basierend auf einigen Sammlungsgrößen

Ich frage mich, ob es eine Open-Source-JSP-Custom-Tag-Bibliothek gibt, die es mir ermöglicht, dies zu erreichen. Ich weiß, dass ich selbst einen schreiben kann ... im Grunde wird es 2 Parameter haben: <lib:display word="user" collection="userList" />. Abhängig von der Sammlungsgröße wird bestimmt, ob ein "s" angehängt wird oder nicht. Aber diese Implementierung wird nicht zu robust sein, weil ich auch "ies" behandeln muss und einige Wörter keine davon verwenden. Anstatt ein halbfertiges Tool zu erstellen, hoffe ich, dass es eine robustere Bibliothek gibt, die ich sofort verwenden könnte. Ich mache mir keine Sorgen, dass ich das Wort in diesem Fall mit einem Präfix versehen kann.

Ich benutze übrigens Java.

Vielen Dank.

+0

In Verbindung stehende http://stackoverflow.com/questions/5907296/java-api-for-plural-forms-of-english-words –

Antwort

27

Werfen Sie einen Blick auf inflector, ein Java-Projekt, das Sie Noun.pluralOf("user") tun können, oder Noun.pluralOf("user", userList.size()) und welche behandelt eine Reihe von Variationen und ungewöhnlichen Fällen (Person-> Menschen, loaf-> Brote, etc.), sowie Sie können bei Bedarf benutzerdefinierte Zuordnungsregeln definieren.

+1

Die Fülle von Sachen, die für Java verfügbar sind, ist erstaunlich! Danke für diese Info, die mir und anderen einen Ausflug in die Tiefen von RoR ersparen könnte. +1. Als nächstes: KitchenSink.jar :) –

+0

Okay ... ernsthaft, WOW! :) Ich dachte, du ziehst nur meine Beine, und tatsächlich ist das echt! Vielen Dank, ich werde mich bald darum kümmern. @Carl: Ja, wir brauchen auch kitchenSink.jar. – limc

+0

+1 für die Überraschung! factor – omerkudat

0

Diese Funktionalität ist in Ruby on Rails integriert. Ich weiß nicht genau, wo, aber es sollte einfach genug sein, um im Quellcode zu finden, und dann könnte man einfach den Code kritisieren.

EDIT: Gefunden Sie einen Code (! Sehr hilfreiche Kommentare)

Wenn ich es richtig, es ist in erster Linie eine Frage der anhängt erinnern ein "s" zu den meisten Wörtern, obwohl ich glaube, dass es eine Liste (wahrscheinlich Hash, Fehlerwörterbuch) von einigen allgemeinen Ausnahmen gibt. Bemerkenswert ist die Umwandlung von "Person" zu "Menschen" :)

Sie wären natürlich in einer Welt der Schmerzen, wenn Sie entschieden haben, dass Sie dies auf andere Sprachen als Englisch internationalisieren wollen. Willkommen in der Welt der höchst unregelmäßigen Grammatiken und viel Glück!

+0

Vielen Dank! Hölle, wenn ich das internationalisieren muss, könnte ich genauso gut meine eigene Sprache erfinden, wo ein Pluralwort immer mit einem YAY endet ... ex: 5 userYAY. :) – limc

10

Hmm, ich verstehe nicht, warum Sie eine Bibliothek dafür brauchen. Ich würde denken, die Funktion, es zu tun ist trivial:

public String singlePlural(int count, String singular, String plural) 
{ 
    return count==1 ? singular : plural; 
} 

Anrufe würden wie folgt aussehen:

singlePlural(count, "user", "users"); 
singlePlural(count, "baby", "babies"); 
singlePlural(count, "person", "people"); 
singlePlural(count, "cherub", "cherubim"); 
... etc ... 

diese Bibliothek Vielleicht eine ganze Reihe anderer Dinge tut, die es nützlich zu machen. Ich nehme an, man könnte sagen, dass es ein Wörterbuch darüber liefert, was alle Pluralformen sind, aber in jedem Programm interessiert Sie nicht der Plural aller Wörter in der Sprache, nur die, die Sie in diesem Programm verwenden. Ich denke, wenn das Wort, das Singular oder Plural sein könnte, zur Kompilierungszeit nicht bekannt ist, wenn es etwas vom Benutzer eingegeben wird, dann würde ich ein Fremdwörterbuch haben, anstatt zu versuchen, eines selbst zu bauen.

bearbeiten

Plötzlich fällt mir ein, dass, was Sie gesucht haben allgemein eine Funktion zur Herstellung von Plurale war, eine Reihe von Regeln wie „in der Regel nur hinzufügen‚s‘verkörpert, aber wenn das Wort in endet "y" ändere das "y" in "ies", wenn es in "s" endet, ändere es in "ses", ... "usw. Ich denke auf Englisch, dass dies praktisch unmöglich wäre: Es gibt zu viele Sonderfälle, wie "Person/Leute" und "Kind/Kinder" usw. Ich denke, das Beste, was Sie tun könnten, wäre eine generische "add an s" Regel, vielleicht ein paar andere häufige Fälle, und dann eine lange Liste der Ausnahmen. Vielleicht könnte man in anderen Sprachen eine ziemlich einfache Regel aufstellen.

Also wenn ich sage, wenn das Wort zur Kompilierzeit nicht bekannt ist, aber von einer Benutzereingabe kommt, dann ist ja ein Fremdwörterbuch sehr wünschenswert.

+0

Ich behalte diese Annäherung im Auge, aber in meinem Fall ist das Substantiv etwas, das programmatisch von der Datenbank gezogen wird. – limc

+0

Ah, nun, das bringt dich auf die "wenn das Wort zur Kompilierzeit nicht bekannt ist" Ausnahme, die ich erwähnte. Also ja, in diesem Fall ist ein Fremdwörterbuch sehr nützlich. Siehe mein Update. – Jay

+0

Ihre Methode behandelt nicht mehrere Sprachen. Mehrere und einzelne Variationen können ein Durcheinander sein. Eine Möglichkeit, die Sie tun könnten, ist wie folgt: String-Funktion Plural (Regel, int Anzahl, Array Strings) { Int Plural = Regel (Anzahl); Return-Strings [Plural]; } Nicht valide Code, aber Sie sollten verstehen. Regel ist eine Funktion, die übergeben wird, um den Pluralindex zu bestimmen. Es sollte einen Test geben, um den Index 0 zurückzugeben, falls Plural nicht existiert. Wie auch immer, diese Methode ist scheiße. Sie sollten nur den "Schlüssel" und die Anzahl ... wie in gettext einfügen müssen. –

4

Dies wird in anderen Sprachen als Englisch kompliziert, die Inflector in der Zukunft unterstützen soll.

Ich bin vertraut mit tschechischen, wo user = uživatel und:

1 uživatel 
2 uživatelé 
3 uživatelé 
4 uživatelé 
5 uživatelů

...

Sie können sehen, warum mit fest codierten Singular Plural + geschriebene Programme un-i18n-fähig bekommen würde.

+0

Deshalb mag ich Sprachen, die nicht Singular oder Plural interessieren, wie Bahasa Melayu, ex: "1 orang", "2 orang" unabhängig von x-Benutzern. :) – limc

+0

Wirklich? Du sagst, dass es auf Tschechisch eine Form für 1, eine andere Form für 2-4 und eine andere Form für 5 gibt? Wie interessant. Warum 5 statt, sagen wir, 6 oder 42? Gibt es unterschiedliche Zahlen für verschiedene Wörter? Ich bin kein Philologe, aber das klingt so merkwürdig, dass es ziemlich interessant ist. – Jay

+0

Wirklich. Und es ist nicht nur Tschechisch. Sie könnten daran interessiert sein, über "dual" als Ergänzung zu "singular" und "plural" zu lesen: http://en.wikipedia.org/wiki/Dual_(grammatical_number) –