Wenn die folgende plural ressource in meiner strings.xml enthalten ist:
<plurals name="item_shop">
<item quantity="zero">No item</item>
<item quantity="one">One item</item>
<item quantity="other">%d items</item>
</plurals>
Ich zeige dem Benutzer das Ergebnis mit:
textView.setText(getQuantityString(R.plurals.item_shop, quantity, quantity));
Es funktioniert gut mit 1 und höher, aber wenn die Menge 0 ist, sehe ich "0 Artikel". Wird der Wert "Null" nur in arabischer Sprache unterstützt, wie aus der Dokumentation hervorgeht? Oder fehlt mir etwas?
Antworten:
Die Android-Ressourcenmethode der Internationalisierung ist recht begrenzt. Ich habe mit dem Standard viel bessere Erfolge erzielt
java.text.MessageFormat
.Grundsätzlich müssen Sie lediglich die Standard-String-Ressource wie folgt verwenden:
Aus dem Code müssen Sie dann nur noch Folgendes tun:
Weitere Informationen zu den Formatzeichenfolgen finden Sie in den Javadocs für MessageFormat
quelle
Von http://developer.android.com/guide/topics/resources/string-resource.html#Plurals :
Beachten Sie, dass die Auswahl basierend auf der grammatikalischen Notwendigkeit getroffen wird. Eine Zeichenfolge für Null in Englisch wird ignoriert, auch wenn die Menge 0 ist, da 0 sich grammatikalisch nicht von 2 oder einer anderen Zahl außer 1 unterscheidet ("Null Bücher", "Ein Buch", "Zwei Bücher" usw.) auf). Lassen Sie sich auch nicht von der Tatsache irreführen, dass beispielsweise zwei Klänge nur für die Menge 2 gelten könnten: Eine Sprache kann erfordern, dass 2, 12, 102 (usw.) alle wie einander behandelt werden, aber unterschiedlich zu anderen Mengen. Verlassen Sie sich darauf, dass Ihr Übersetzer weiß, auf welchen Unterschieden seine Sprache tatsächlich besteht.
Zusammenfassend wird "Null" nur für bestimmte Sprachen verwendet (dasselbe gilt für "zwei", "wenige" usw.), da die anderen Sprachen keine spezielle Konjugation haben und daher das Feld "Null" als unnötig angesehen wird
quelle
Android verwendet das CLDR-Plural-System, und so funktioniert es einfach nicht (erwarten Sie also nicht, dass sich dies ändert).
Das System wird hier beschrieben:
http://cldr.unicode.org/index/cldr-spec/plural-rules
Kurz gesagt, es ist wichtig zu verstehen, dass "Eins" nicht die Zahl 1 bedeutet. Stattdessen sind diese Schlüsselwörter Kategorien, und die spezifischen Zahlen n, die zu jeder Kategorie gehören, werden durch Regeln in der CLDR-Datenbank definiert:
http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
Während es keine Sprache zu geben scheint, die "Null" für etwas anderes als 0 verwendet, gibt es Sprachen, die "Eins" 0 zuweisen. Es gibt sicherlich viele Fälle, in denen "zwei" andere Zahlen als nur 2 enthält.
Wenn Android es Ihnen ermöglicht, das zu tun, was Sie beabsichtigt haben, können Ihre Anwendungen nicht ordnungsgemäß in eine beliebige Anzahl von Sprachen mit komplexeren Pluralregeln übersetzt werden.
quelle
Hier ist eine Problemumgehung, mit der ich dieses Problem behebe, ohne zu MessageFormat zu wechseln.
Zuerst extrahiere ich die Zeichenfolge "Null" in eine eigene Zeichenfolgenressource.
Dann habe ich einige praktische Methoden in meinem eigenen ResourcesUtil
Jetzt rufe ich jedes Mal, wenn ich eine bestimmte Zeichenfolge für die Menge Null verwenden möchte, Folgendes auf:
Ich wünschte, es gäbe etwas Besseres, aber dies erledigt zumindest die Arbeit, während die XML-Zeichenfolgenressource lesbar bleibt.
quelle
Wenn Sie Datenbindung verwenden, können Sie dies wie folgt umgehen:
quelle
Ich habe eine Kotlin-Erweiterung geschrieben, um alle Szenarien zu behandeln, an die ich denken kann.
ich habe
zeroResId
als optional, so dass wir manchmal die Null behandeln wollen, indem wir "Keine Elemente" anstelle von "0 Elemente" anzeigen.Englisch behandelt Null grammatikalisch als Plural.
https://developer.android.com/guide/topics/resources/string-resource.html#Plurals
quelle