2010-09-15 4 views
9

J'ai essayé d'utiliser la ressource plurals avec Android, mais je n'ai pas eu de chance.Android Pluralisation ne fonctionne pas, besoin d'aide

Voici mon fichier de ressources pour mes pluriels:

<?xml version="1.0" encoding="utf-8"?> 
    <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> 
     <plurals name="meters"> 
      <item quantity="one">1 meter</item> 
      <item quantity="other"> 
       <xliff:g id="count">%d</xliff:g> 
       meters 
      </item> 
     </plurals> 
     <plurals name="degrees"> 
      <item quantity="one">1 degree</item> 
      <item quantity="other"> 
       <xliff:g id="count">%d</xliff:g> 
       degrees 
      </item> 
     </plurals> 
    </resources> 

... et voici le code que je me sers lorsque je tente d'extraire la chaîne de quantité de mes ressources:

Resources res = this.getResources(); 
tTemp.setText(res.getQuantityString(R.plurals.degrees, this.mObject.temp_c.intValue())); 

... mais le texte dans TextView reste %d degrees et %d meters.

Est-ce que quelqu'un sait ce qui se passe? J'ai débogué le code et l'appel res.getQuantityString (...) renvoie une chaîne dont la valeur est %d degrees ou %d meters. Bien que lorsque la quantité arrive à 1, il évalue correctement à ou 1 meter.

Merci d'avance pour toute aide!

Cordialement, célestialorb.

Répondre

31

Il semble que vous deviez spécifier deux fois le nombre, le premier est utilisé pour déterminer la chaîne à utiliser et le second est celui qui est remplacé dans la chaîne. par exemple.

Resources res = this.getResources(); 
int tv = this.mObject.temp_c.intValue(); 
tTemp.setText(res.getQuantityString(R.plurals.degrees, tv, tv)); 

Et au moins dans mes tests jusqu'à présent, les xliff:g éléments de la ressource ne sont pas nécessaires.

+0

OMG, cela m'a embêté pendant un moment, merci! –

4

Android "prend en charge" l'utilisation de pluriels en utilisant R.plurals qui est pratiquement non documenté. Plonger dans le code source révèle que vous devriez être en mesure d'avoir les versions possibles suivantes d'une chaîne:

  • « zéro »
  • « un »
  • « peu » (exactement 2)
  • "autre" (pour 3 et plus)

Cependant, j'ai trouvé que seulement "un" et "autre" fonctionnent réellement (malgré les autres étant utilisés dans la source android!).

Pour utiliser pluriels vous voulez vous déclarer les chaînes pluralizable d'une manière similaire aux ressources normales de chaînes:

<resources> 
    <plurals name="match"> 
    <!-- Case of one match --> 
    <item quantity="one">1 match</item> 
    <!-- Case of several matches --> 
    <item quantity="other">%d matches</item> 
    </plurals> 
</resources> 

ensuite de les utiliser effectivement dans le code, utilisez un code similaire à ce que superfell suggéré ci-dessus:

String text = getResources().getQuantityString(R.plurals.match, myIntValue, myIntValue); 
myTextView.setText(text); 
+6

Je peux ajouter que "zéro" ne fonctionne pas pour l'anglais, comme il est clairement indiqué dans docs "Une chaîne pour zéro en anglais sera ignorée même si la quantité est 0, car 0 n'est pas grammaticalement différent de 2, ou tout autre numéro sauf 1 »(http://developer.android.com/guide/topics/resources/string-resource.html#Plurals) – Fixpoint

+2

@Shooshpanchick, merci - je ne le savais pas. Un peu ennuyeux, car ce serait bien de pouvoir utiliser 'no matches' au lieu de '0 matches' – pheelicks

3

Même problème ici! Je suppose que c'est juste un défaut dans la documentation. La méthode "pure" getQuantitiyString(int, int) obtient juste une ressource de texte, sans aucune mise en forme. Comme indiqué superfell: il suffit d'utiliser la méthode getQuantityString(int, int, Object...) et remettre deux fois votre valeur entière.

J'aurais espéré que cela fonctionne comme vous l'avez fait, mais ce n'est pas le cas !! PS: peut-être vérifier une réponse comme la bonne réponse?;-)

Questions connexes