2010-09-15 12 views
9

Ho provato a utilizzare la risorsa plurale con Android ma non ho avuto fortuna.La pluralizzazione Android non funziona, serve aiuto

Ecco il mio file di risorse per i miei plurali:

<?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> 

... e poi ecco il codice che sto usando quando tento di estrarre la stringa quantità dalle mie risorse:

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

... ma il testo nel TextView resta %d degrees e %d meters.

Qualcuno sa cosa sta succedendo? Ho eseguito il debug del codice e la chiamata res.getQuantityString (...) restituisce una stringa il cui valore è %d degrees o %d meters. Anche se quando la quantità risulta essere 1, viene valutata correttamente a 1 degree o 1 meter.

Grazie in anticipo per qualsiasi aiuto!

Saluti, celestialorb.

risposta

31

Sembra che sia necessario specificare il conteggio due volte, il primo è utilizzato per determinare la stringa da utilizzare e il secondo è quello che viene sostituito nella stringa. per esempio.

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

E almeno nel mio test finora, gli xliff:g elementi della risorsa non sono necessari.

+0

OMG, questo mi ha infastidito per un po ', grazie! –

4

Android "supporta" l'uso di plurali mediante l'uso di R.plurals che è praticamente non documentato. Tuffarsi nel codice sorgente rivela che si dovrebbe essere in grado di avere le seguenti versioni possibili di una stringa:

  • "zero"
  • "uno"
  • "pochi" (esattamente 2)
  • "altro" (per 3 e sopra)

Tuttavia, ho trovato che solo "uno" e "altro" funzionano effettivamente (nonostante gli altri siano utilizzati nella fonte Android!).

Per utilizzare plurali volete dichiarare si stringhe pluralizable in modo simile alle normali risorse di tipo stringa:

<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> 

Poi li utilizzare effettivamente nel codice, utilizzare il codice simile a quello che superfell suggerito sopra:

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

Posso aggiungere che "zero" non funziona per l'inglese, come è chiaramente indicato in docs 'Una stringa per zero in inglese verrà ignorata anche se la quantità è 0, perché 0 non è grammaticalmente diverso da 2, o qualsiasi altro numero tranne 1' (http://developer.android.com/guide/topics/resources/string-resource.html#Plurals) – Fixpoint

+2

@Shooshpanchick, grazie - non lo sapeva. Un po 'fastidioso, dato che sarebbe bello poter usare' no match 'invece di' 0 match ' – pheelicks

3

Lo stesso problema qui! Immagino che sia solo un difetto nella documentazione. Il metodo "puro" getQuantitiyString(int, int) ottiene solo una risorsa di testo, senza alcuna formattazione. Come dichiarato superfell: basta usare il metodo getQuantityString(int, int, Object...) e consegnare il valore intero due volte.

Speravo che funzionasse allo stesso modo, ma semplicemente non funziona !!

PS: forse controllare una risposta come quella corretta?;-)

Problemi correlati