Viele Male, wenn Nachrichten an den Benutzer zu zeigen , zu erzeugen, werden die Nachricht eine Reihe von enthalten etwas , dass ich über die Kunden informieren will.
Ich gebe ein Beispiel: Der Kunde hat eine Anzahl von Artikeln ab 1 ausgewählt und auf Löschen geklickt. Jetzt möchte ich dem Kunden eine Bestätigungsnachricht geben und die Anzahl der von ihm ausgewählten Artikel erwähnen, um die Wahrscheinlichkeit eines Fehlers zu minimieren, indem er eine Reihe von Artikeln auswählt und auf Löschen klickt, wenn er nur einen löschen möchte Sie.
Eine Möglichkeit besteht darin, die generische Nachricht folgendermaßen zu erstellen:
int noofitemsselected = SomeFunction();
string message = "You have selected " + noofitemsselected + " item(s). Are you sure you want to delete it/them?";
Das "Problem" hier ist der Fall, wo noofitemselected
1 ist, und wir müssen Artikel und es anstelle von Artikeln und ihnen schreiben .
Meine normale Lösung wird so etwas sein
int noofitemsselected = SomeFunction();
string message = "You have selected " + noofitemsselected + " " + (noofitemsselected==1?"item" : "items") + ". Are you sure you want to delete " + (noofitemsselected==1?"it" : "them") + "?";
Dies wird ziemlich schnell und ziemlich schnell sehr böse, wenn es viele Verweise auf die Zahlenvielfalt im Code gibt und die eigentliche Nachricht schwer zu lesen ist.
Meine Fragen sind also einfach. Gibt es bessere Möglichkeiten, solche Nachrichten zu generieren?
BEARBEITEN
Ich sehe, dass viele Personen in dem Fall, dass ich erwähnte, dass die Nachricht in einem Nachrichtenfeld angezeigt werden soll, sehr aufgehängt sind und einfach eine Antwort gegeben haben, wie man die Verwendung des Nachrichtenfelds überhaupt vermeiden kann, und das ist alles gut .
Denken Sie jedoch daran, dass das Problem der Pluralisierung neben Meldungsfeldern auch für Texte an anderen Stellen im Programm gilt. Beispielsweise hat eine Beschriftung neben einem Raster, die die Anzahl der im Raster ausgewählten Linien anzeigt, das gleiche Problem hinsichtlich der Pluralisierung.
Dies gilt also grundsätzlich für die meisten Texte, die auf irgendeine Weise aus Programmen ausgegeben werden, und dann ist die Lösung nicht so einfach, das Programm so zu ändern, dass kein Text mehr ausgegeben wird :)
quelle
Antworten:
Wenn es jemals eine noch so kleine Chance gibt, dass diese App in andere Sprachen übersetzt werden muss, sind beide falsch. Der richtige Weg, dies zu tun, ist:
Dies liegt daran, dass verschiedene Sprachen mit Pluralität unterschiedlich umgehen. Einige wie Malaiisch haben nicht einmal syntaktische Pluralformen, daher wären die Zeichenfolgen im Allgemeinen identisch. Das Trennen der beiden Zeichenfolgen erleichtert später die Unterstützung anderer Sprachen.
Andernfalls ist die zweite Methode vorzuziehen, wenn diese App von der Öffentlichkeit genutzt werden soll und benutzerfreundlich sein soll. Entschuldigung, aber ich kenne keinen kürzeren Weg, dies zu tun.
Wenn diese App nur intern von Ihrem Unternehmen verwendet werden soll, führen Sie die Verknüpfung aus
"item(s)"
. Sie müssen niemanden wirklich beeindrucken, wenn Sie Enterprisy-Code schreiben. Ich würde jedoch davon abraten, dies für öffentlich konsumierte Apps zu tun, da dies den Eindruck erweckt, dass der Programmierer faul ist und somit seine Meinung über die Qualität der App verringert. Vertrauen Sie mir, kleine Dinge wie diese Angelegenheit.quelle
noofitemsselected
in diesem Beispiel sogar für die erste Option optimieren . da Sie wissen, dass es 1. istSie können all diese unordentliche Vielzahl vermeiden, indem Sie einfach die Elemente ohne Nachricht löschen und dem Benutzer eine wirklich gute Rückgängig-Funktion geben. Benutzer lesen nie etwas . Sie sollten ohnehin eine gute Rückgängig-Funktion als Teil Ihres Programms erstellen.
Sie erhalten tatsächlich zwei Vorteile, wenn Sie eine umfassende Rückgängig-Funktion erstellen. Der erste Vorteil erleichtert dem Benutzer das Leben, indem er Fehler rückgängig machen und das Lesen minimieren kann. Der zweite Vorteil ist, dass Ihre App das wirkliche Leben widerspiegelt, indem sie die Umkehrung des nicht trivialen Workflows ermöglicht (nicht nur Fehler).
Ich habe einmal eine App geschrieben, ohne einen einzigen Dialog oder eine Bestätigungsnachricht zu verwenden. Es erforderte einige ernsthafte Überlegungen und war erheblich schwieriger zu implementieren als die Verwendung von Bestätigungsnachrichten. Aber das Endergebnis war laut den Endbenutzern ziemlich gut zu verwenden.
quelle
Wie wäre es einfach:
Auf diese Weise beseitigen Sie die Schwierigkeiten bei der Nummernvereinbarung und erhalten als Bonus eine noch kürzere, präzisere Fehlermeldung für den Benutzer. Wir alle wissen, dass Benutzer ohnehin keine Fehlermeldungen lesen . Je kürzer sie sind, desto wahrscheinlicher ist es, dass sie zumindest einen Blick darauf werfen auf den Text werfen.
Mit dem Wissen, dass Benutzer keine Fehlermeldungen lesen, können Sie dies auch anders angehen. Überspringen Sie die Bestätigungsmeldung vollständig und stellen Sie einfach eine Funktion zum Rückgängigmachen bereit, die funktioniert, unabhängig davon, was gelöscht wurde. Die meisten Benutzer sind bereits daran gewöhnt, einen Vorgang rückgängig zu machen, wenn sie feststellen, dass er nicht ihren Wünschen entspricht, und finden dieses Verhalten wahrscheinlich natürlicher, als sich mit einem anderen nervigen Popup befassen zu müssen.
quelle
Was ist mit dem, was Java seit Jahren hat: java.text.MessageFormat und ChoiceFormat? Weitere Informationen finden Sie unter http://download.oracle.com/javase/1.4.2/docs/api/java/text/MessageFormat.html .
In Ihrem Fall möchten Sie etwas Einfacheres:
Der Vorteil dieses Ansatzes besteht darin, dass er gut mit den i18n-Bundles zusammenarbeitet und Sie Übersetzungen für Sprachen (wie Japanisch) bereitstellen können, die kein Konzept für mehrere oder einzelne Wörter haben.
quelle
Ich würde die Nachricht nicht fest codieren, sondern zwei Nachrichten in einer separaten Ressourcendatei bereitstellen. Mögen
und dann füttere sie in String.Format wie
Ich denke, dass dieser Ansatz einfacher zu lokalisieren und zu pflegen ist. Alle UI-Nachrichten befinden sich an einem einzigen Ort.
quelle
Sie können das Problem vollständig umgehen, indem Sie die Nachricht anders formulieren.
quelle
Das erste, was ich vorschlagen würde, ist: verwenden
string.Format
. Damit können Sie so etwas tun:Außerdem habe ich in WPF-Apps Systeme gesehen, bei denen eine Ressourcenzeichenfolge durch zwei Nachrichten getrennt ist: eine Singular- und eine Pluralnachricht (oder sogar eine Null / Einzel / Viele-Nachricht). Ein benutzerdefinierter Konverter könnte dann verwendet werden, um diese Ressource zu analysieren und die relevante (formatierte) Zeichenfolge zu verwenden. Ihre Xaml sieht also ungefähr so aus:
quelle
Für Englisch viele Antworten oben. Für andere Sprachen ist es schwieriger, da Pluralformen vom Geschlecht des Substantivs und der Wortendung abhängen. Einige Beispiele auf Französisch:
Regelmäßig männlich:
Regelmäßig weiblich
Unregelmäßig männlich (endet mit 's')
Das gleiche Problem besteht in den meisten lateinischen Sprachen und verschlimmert sich in Deutsch oder Russisch, wo es drei Geschlechter gibt (makulin, weiblich und neutral).
Sie müssen aufpassen, wenn Ihr Ziel darin besteht, mehr als nur Englisch zu beherrschen.
quelle
Um pluralisierte Nachrichten zu haben, die richtig lokalisiert werden können, ist es meiner Meinung nach ratsam, zuerst eine Indirektionsebene zwischen der Nummer und einer Nachricht zu erstellen.
Verwenden Sie beispielsweise eine Konstante, um anzugeben, welche Nachricht angezeigt werden soll. Rufen Sie die Nachricht mit einer Funktion ab, mit der die Implementierungsdetails ausgeblendet werden.
Erstellen Sie als Nächstes ein Wörterbuch, das die möglichen Nachrichten und Variationen enthält, und teilen Sie Variationen mit, wann sie verwendet werden sollten.
Jetzt können Sie einfach den Schlüssel finden, der dem entspricht,
quantity
und den Wert vonquantity
mit dieser Nachricht interpolieren .Dieses vereinfachte und naive Beispiel, aber ich sehe keinen anderen vernünftigen Weg, dies zu tun und in der Lage zu sein, L10N und I18N gut zu unterstützen.
quelle
Sie müssen die folgende Funktion von VBA nach C # übersetzen, aber Ihre Verwendung würde sich ändern zu:
Ich habe eine VBA-Funktion, die ich in MS Access verwende, um genau das zu tun, wovon Sie sprechen. Ich weiß, dass ich für das Posten von VBA in Stücke gehackt werde, aber hier geht es trotzdem. Der Algorithmus sollte aus den Kommentaren ersichtlich sein:
Die Verwendung wurde in den obigen Codekommentaren etwas eingeschränkt, daher werde ich sie hier wiederholen:
Ja, diese Lösung ignoriert Sprachen, die nicht Englisch sind. Ob das wichtig ist, hängt von Ihren Anforderungen ab.
quelle
Sie können den Plural automatisch generieren, siehe z. Plural Generator .
Für Pluralerzeugungsregeln siehe Wikipedia
quelle
Wie wäre es mit einem allgemeineren Weg. Vermeiden Sie die Pluralisierung im zweiten Satz:
Ich finde heraus, dass auf diese Weise die Zahl am Ende der Zeile steht, was wirklich leicht zu erkennen ist. Diese Lösung würde in jeder Sprache mit derselben Logik funktionieren.
quelle
Number
(ich antwortete, während ich mein Baby in den Schlaf wiegte).Mein allgemeiner Ansatz besteht darin, eine "Einzel- / Pluralfunktion" wie folgt zu schreiben:
Dann rufe ich im Hauptteil der Nachricht diese Funktion auf:
Dies ist nicht viel besser, aber zumindest (a) setzt die Entscheidung in eine Funktion und macht den Code ein wenig unübersichtlich, und (b) ist flexibel genug, um mit unregelmäßigen Pluralformen umzugehen. dh es ist leicht genug, Substantiv (n, "Kind", "Kinder") und dergleichen zu sagen.
Natürlich funktioniert dies nur für Englisch, aber das Konzept ist leicht auf Sprachen mit komplexeren Endungen erweiterbar.
Mir fällt ein, dass Sie den letzten Parameter für den einfachen Fall optional machen könnten:
quelle
Internationalisierung
Ich gehe davon aus, dass Sie Unterstützung bei der Internationalisierung wünschen. In diesem Fall haben verschiedene Sprachen unterschiedliche Muster für Pluralformen (z. B. eine spezielle Pluralform für 2 von etwas oder kompliziertere Sprachen wie Polnisch), und Sie können sich nicht darauf verlassen, ein einfaches Muster auf Ihre Zeichenfolge anzuwenden etwas reparieren.
Sie können die
ngettext
Funktion von GNU Gettext verwenden und zwei englische Nachrichten in Ihrem Quellcode bereitstellen. Gettext bietet die Infrastruktur, um bei der Übersetzung in andere Sprachen aus anderen (möglicherweise mehr) Nachrichten auszuwählen. Eine vollständige Beschreibung der Pluralunterstützung von GNU gettext finden Sie unter http://www.gnu.org/software/hello/manual/gettext/Plural-forms.html .GNU Gettext steht unter der LGPL.
ngettext
wirdGettextResourceManager.GetPluralString
im C # -Port von Gettext benannt.(Wenn Sie keine Lokalisierungsunterstützung benötigen und Gettext nicht sofort verwenden möchten, schreiben Sie Ihre eigene Funktion, die dies für Englisch ausführt, und übergeben Sie zwei vollständige Nachrichten. Wenn Sie später 1010 benötigen, können Sie dies tun Hinzufügen durch Umschreiben einer einzelnen Funktion.)
quelle
Wie wäre es, Funktion wie zu schreiben
.. und verwenden Sie es, wann immer Sie brauchen?
quelle
Für das erste Problem, ich meine Pluralize, können Sie Inflector verwenden .
Und für die zweite können Sie eine Zeichenfolgendarstellungserweiterung mit einem Namen wie ToPronounString verwenden.
quelle
Genau diese Frage wurde mir gestern von einem Mitglied unseres Teams gestellt.
Da es hier auf StackOverflow wieder auftauchte, dachte ich, das Universum sagte mir, ich solle versuchen, eine anständige Lösung zu finden.
Ich habe schnell etwas zusammengestellt und es ist keineswegs perfekt, aber es könnte von Nutzen sein oder eine Diskussion / Entwicklung auslösen.
Dieser Code basiert auf der Idee, dass es 3 Nachrichten geben kann. Eine für null Artikel, eine für einen Artikel und eine für mehr als einen Artikel, die der folgenden Struktur folgen:
singlePropertyName
singlePropertyName_Zero
singlePropertyName_Plural
Ich habe eine interne Klasse zum Testen erstellt, um die Ressourcenklasse nachzuahmen. Ich habe dies noch nicht mit einer tatsächlichen Ressourcendatei getestet, daher muss ich noch das vollständige Ergebnis sehen.
Hier ist der Code (derzeit habe ich einige Generika eingefügt, bei denen ich weiß, dass ich den dritten Parameter einfach als Typ angeben könnte, und auch der zweite Parameter ist eine Zeichenfolge. Ich denke, es gibt eine Möglichkeit, diese beiden Parameter zu etwas Besserem zu kombinieren, aber ich ' Ich werde darauf zurückkommen, wenn ich einen freien Moment habe.
Ressourcenklasse testen:
und meine schnelle Ausführungsmethode
quelle
singlePropertyName_All
, um dies noch deutlicher zu machen.Aus meiner Sicht ist Ihre erste Lösung die am besten geeignete. Wenn Sie die Anwendung zur Unterstützung mehrerer Sprachen benötigen, kann die zweite Option mühsam sein. Mit dem Faustansatz ist es einfach, den Text ohne großen Aufwand zu lokalisieren.
quelle
Sie könnten eine allgemeinere Nachricht wie "Sind Sie sicher, dass Sie die ausgewählten Elemente löschen möchten" auswählen.
quelle
Ich komme darauf an, wie schön eine Nachricht sein soll. Vom einfachsten zum schwierigsten:
Schreiben Sie Ihre Fehlermeldung erneut, um eine Pluralisierung zu vermeiden. Nicht so schön für Ihren Benutzer, aber schneller.
Verwenden Sie eine allgemeinere Sprache, geben Sie jedoch die Nummer (n) an.
Verwenden Sie ein "Pluralisierungs" - und Inflektorsystem ala Rails, damit Sie sagen
pluralize(5,'bunch')
und erhalten können5 bunches
. Rails hat dafür ein gutes Muster.Für die Internationalisierung müssen Sie sich ansehen, was Java bietet. Dies unterstützt eine Vielzahl von Sprachen, einschließlich solcher, die unterschiedliche Formen von Adjektiven mit 2 oder 3 Elementen haben. Die "s" -Lösung ist sehr englisch zentriert.
Welche Option Sie wählen, hängt von Ihren Produktzielen ab. - ndp
quelle
Warum möchten Sie eine Nachricht präsentieren, die die Benutzer tatsächlich verstehen können? Es widerspricht 40 Jahren Programmiergeschichte. Nein, wir haben eine gute Sache vor uns, verderben Sie sie nicht mit verständlichen Botschaften.
(j / k)
quelle
Mach es wie in World of Warcraft:
quelle
Mit wird es etwas kürzer
quelle
Ein Ansatz, den ich nicht erwähnt habe, wäre die Verwendung eines Substitutions- / Auswahl-Tags (z. B. "Sie sind dabei, {0} [? I ({0} = 1): / cactus / cacti /] zu quetschen"). (Mit anderen Worten, lassen Sie einen formatähnlichen Ausdruck die Ersetzung angeben, basierend darauf, ob das als Ganzzahl verwendete Argument Null gleich 1 ist.) Ich habe solche Tags in den Tagen vor .net gesehen; mir sind keine bekannt Standard für sie in .net, noch weiß ich nicht, wie ich sie am besten formatieren kann.
quelle
Ich würde für eine Minute über den Tellerrand hinaus denken. Alle Vorschläge hier sind entweder die Pluralisierung (und die Sorge um mehr als eine Pluralisierungsstufe, das Geschlecht usw.) oder sie werden überhaupt nicht verwendet und bieten ein schönes Rückgängigmachen.
Ich würde den nicht-lingualen Weg gehen und dafür visuelle Warteschlangen verwenden. Stellen Sie sich beispielsweise eine iPhone-App vor, bei der Sie Elemente auswählen, indem Sie sich den Finger abwischen. Bevor Sie sie mit der Master-Löschtaste löschen, werden die ausgewählten Elemente "geschüttelt" und ein Fragezeichen mit dem Titel "V" (OK) oder "X" (Abbrechen) angezeigt.
Oder stellen Sie sich in der 3D-Welt von Kinekt / Move / Wii vor, Sie wählen die Dateien aus, bewegen Ihre Hand zur Löschtaste und werden aufgefordert, Ihre Hand zur Bestätigung über Ihren Kopf zu bewegen (unter Verwendung der gleichen visuellen Symbole wie zuvor erwähnt, z. B. stattdessen Wenn Sie aufgefordert werden, 3 Dateien zu löschen, werden 3 Dateien mit einem schwebenden halbtransparenten roten X angezeigt, und Sie werden aufgefordert, etwas zu tun, um dies zu bestätigen.
quelle