Traitement des pluriels Android de «zéro»

Si vous avez la ressource plurielle suivante dans mon ssortingngs.xml:

 No item One item %d items  

Je montre le résultat à l’utilisateur en utilisant:

 textView.setText(getQuantitySsortingng(R.plurals.item_shop, quantity, quantity)); 

Cela fonctionne bien avec 1 et ci-dessus, mais si la quantité est 0 alors je vois “0 items”. La valeur “zéro” est-elle prise en charge uniquement en arabe, comme la documentation semble l’indiquer? Ou est-ce que je manque quelque chose?

La méthode d’internationalisation des ressources Android est assez limitée. J’ai eu beaucoup plus de succès en utilisant le standard java.text.MessageFormat .

En gros, tout ce que vous avez à faire est d’utiliser la ressource de chaîne standard comme ceci:

  {0,choice,0#No items|1#One item|1<{0} items}  

Ensuite, à partir du code, tout ce que vous avez à faire est le suivant:

 Ssortingng fmt = getResources().getText(R.ssortingng.item_shop).toSsortingng(); textView.setText(MessageFormat.format(fmt, amount)); 

Vous pouvez en savoir plus sur les chaînes de format dans javadocs pour MessageFormat

De http://developer.android.com/guide/topics/resources/ssortingng-resource.html#Plurals :

Notez que la sélection est faite en fonction de la nécessité grammaticale. Une chaîne pour zéro en anglais sera ignorée même si la quantité est 0, car 0 n’est pas différent grammaticalement de 2, ou tout autre nombre sauf 1 (“zéro livre”, “un livre”, “deux livres”, etc. sur). Ne soyez pas induit en erreur par le fait que, disons, deux sons comme il ne pourrait s’appliquer qu’à la quantité 2: une langue peut exiger que 2, 12, 102 (et ainsi de suite) soient tous traités quantités. Faites confiance à votre traducteur pour savoir quelles distinctions son langage insiste réellement.

En conclusion, «zéro» n’est utilisé que pour certaines langues (il en va de même pour «deux», «peu», etc.) car les autres langues n’ont pas de conjugaison particulière et le champ «zéro» est donc considéré comme inutile.

Android utilise le système de pluriels CLDR, et ce n’est pas comme cela que ça fonctionne (donc ne vous attendez pas à ce que cela change).

Le système est décrit ici:

http://cldr.unicode.org/index/cldr-spec/plural-rules

En résumé, il est important de comprendre que “un” ne signifie pas le nombre 1. Ces mots-clés sont plutôt des catégories et les nombres spécifiques n appartenant à chaque catégorie sont définis par des règles dans la firebase database CLDR:

http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html

Bien qu’il ne semble y avoir aucune langue utilisant “zéro” pour autre chose que 0, il existe des langues qui atsortingbuent 0 à “un”. Il y a certainement beaucoup de cas où “deux” contient d’autres nombres que 2.

Si Android vous permet de faire ce que vous vouliez, vos applications ne peuvent pas être correctement traduites dans un nombre quelconque de langues avec des règles plurielles plus complexes.

Voici une solution de contournement que j’utilise pour résoudre ce problème sans passer par MessageFormat.

D’abord, j’extrais la chaîne “zéro” dans sa propre ressource de chaîne.

 No items.   @ssortingng/x_items_zero One item. %d items.  

J’ai ensuite quelques méthodes pratiques dans mes propres ressources

 public static Ssortingng getQuantitySsortingngZero(Resources resources, int resId, int zeroResId, int quantity) { if (quantity == 0) { return resources.getSsortingng(zeroResId); } else { return resources.getQuantitySsortingng(resId, quantity, quantity); } } public static Ssortingng getQuantitySsortingngZero(Resources resources, int resId, int zeroResId, int quantity, Object... formatArgs) { if (quantity == 0) { return resources.getSsortingng(zeroResId); } else { return resources.getQuantitySsortingng(resId, quantity, formatArgs); } } 

Maintenant, chaque fois que je veux utiliser une chaîne spécifique pour la quantité zéro, j’appelle:

 Ssortingng pluralSsortingng = ResourcesUtil.getQuantitySsortingngZero( getContext().getResources(), R.plural.x_items, R.ssortingng.x_items_zero, quantity ); 

Je souhaite qu’il y ait quelque chose de mieux, mais cela permet au moins de faire le travail tout en gardant la ressource XML lisible.

Si vous utilisez la liaison de données, vous pouvez y remédier avec quelque chose comme: