Android pluriels traitement de “zéro”
Si les suivants au pluriel ressource dans ma strings.xml:
<plurals name="item_shop">
<item quantity="zero">No item</item>
<item quantity="one">One item</item>
<item quantity="other">%d items</item>
</plurals>
Je suis de montrer le résultat à l'utilisateur à l'aide de:
textView.setText(getQuantityString(R.plurals.item_shop, quantity, quantity));
Il fonctionne bien avec 1 et au-dessus, mais si la quantité est 0, puis je vois "0 articles".
Est valeur "zéro" pris en charge uniquement dans la langue arabe, la documentation semble indiquer?
Ou ai-je raté quelque chose?
- Ce problème est signalé ici code.google.com/p/android/issues/detail?id=8287 . Pas encore fixée :/
- Je ne pense pas que ses un bug: Notez que la sélection est basée sur la grammaire de la nécessité. Une chaîne de zéro en anglais seront ignorés, même si la quantité est 0, car 0 n'est pas grammaticalement différent de 2, ou tout autre nombre, sauf 1 ("zéro" livres", "un livre", "deux livres", et ainsi de suite)
- Malheureusement, toutes les langues ne sont identique à l'anglais
- Je pense que c'est un bug dans le sens que, d'une grammaire de côté, 99% des fois j'ai besoin de l'utiliser, j'avais besoin de la fonctionnalité manquante. Donc, oui, je crois que c'est un bug de Google ne sera probablement jamais corrigé. En tant que tel, une solution de contournement est nécessaire. Vous voyez, les Api sont là pour aider le consommateur, de faire les choses, et non pas exclusivement à représenter des concepts abstraits à partir du monde réel. Si Zéro aurait été pris en charge hors de la boîte, les deux groupes (ceux qui ont besoin de la grammaire de l'exactitude et ceux qui ne le font pas), pourrait s'en tirer sans avoir à utiliser quelque chose de différent.
Vous devez vous connecter pour publier un commentaire.
Android méthode de l'internationalisation est assez limité. J'ai eu beaucoup plus de succès en utilisant le standard de
java.text.MessageFormat
.Fondamentalement, tout ce que vous avez à faire est d'utiliser la norme de chaîne de ressource de ce genre:
Puis, à partir du code tout ce que vous avez à faire est la suivante:
Vous pouvez lire plus sur les chaînes de format dans le javadoc MessageFormat
MessageFormat
classe ne comprend pas. Ce que je recommande, c'est que vous passez la valeur du dernier chiffre comme un paramètre supplémentaire qui vous permet de faire des choix sur ce. Ceci est nécessaire pour le russe, au moins, et probablement d'autres langages similaires ainsi.0 Items
de laN items
et “1 point” pour le singulier.¯\_(ツ)_/¯
Bon de voir qu'Android est de régler les problèmes des utilisateurs rapport à l'utilisation quotidienne au lieu de ce que nous obtenons: abstractions qui sont parfois ok, parfois bonnes, parfois médiocres.De http://developer.android.com/guide/topics/resources/string-resource.html#Plurals:
Noter que la sélection est basée sur la grammaire de la nécessité. Une chaîne de zéro en anglais seront ignorés, même si la quantité est 0, car 0 n'est pas grammaticalement différent de 2, ou tout autre nombre, sauf 1 ("zéro" livres", "un livre", "deux livres", et ainsi de suite). Ne pas être induit en erreur, soit par le fait que, disons, les deux sons comme il ne peut s'appliquer qu'à la quantité 2: une langue peut exiger que 2, 12, 102 (et ainsi de suite) sont tous traités comme l'un de l'autre, mais différemment pour d'autres quantités. Compter sur votre traducteur pour savoir ce que les distinctions de leur langue en fait il insiste sur les.
En conclusion, "zéro" n'est utilisé que pour certaines langues (en va de même pour les 'deux' 'quelques', etc.) parce que les autres langues n'ont pas de spécial conjugaison et donc le "zéro" de terrain est considéré comme inutile
Android est à l'aide de la CLDR pluriels système, et c'est juste pas comment ça marche (donc ne vous attendez pas à changer).
Le système est décrit ici:
http://cldr.unicode.org/index/cldr-spec/plural-rules
En bref, il est important de comprendre que "l'on" ne signifie pas le numéro 1. Au lieu de ces mots-clés sont des catégories, et le nombre n qui appartiennent à chaque catégorie sont définis par les règles dans la CLDR de la base de données:
http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
S'il semble y avoir pas de langage qui utilise des "zéro" pour autre chose que 0, il y a des langues qui assigne à 0 à la "une". Il ya certainement beaucoup de cas où les "deux" contient d'autres numéros que seulement 2.
Si Android où pour vous permettre de faire ce que vous souhaitiez, vos applications ne pouvait pas être correctement traduit dans un grand nombre de langues plus complexes pluriel règles.
Voici une solution de contournement, je suis en utilisant de traiter ce problème sans avoir à passer MessageFormat.
J'ai d'abord extraire le "zéro" de la chaîne dans sa propre chaîne de ressource.
Alors j'ai une des méthodes pratiques dans mon propre ResourcesUtil
Maintenant quand je veux utiliser une chaîne de caractères spécifique pour la quantité zéro j'appelle:
Je souhaite qu'il y ait quelque chose de mieux, mais au moins fait le travail tout en gardant la ressource de chaîne XML lisible.
Si vous utilisez la liaison de données, vous pouvez contourner ce avec quelque chose comme: