2013-06-18 19 views
10

Sto sviluppando un'applicazione Android e voglio sapere se posso impostare multilingua Enum.toString().Rendi Enum.toString() localizzato

Ho intenzione di utilizzare questo Enum su un Spinner e voglio usare testi multilingue.

public class Types 
{ 
    public enum Stature 
    { 
     tall (0, "tall"), 
     average(1, "average"), 
     small(2, "small"); 

     private final int stature; 
     private final String statureString; 

     Stature(int anStature, String anStatureString) { stature = anStature; statureString = anStatureString; } 

     public int getValue() { return stature; } 

     @Override 
     public String toString() { return statureString; } 
    } 
} 

Non so come utilizzare Context.getString() all'interno di un Enum, e ho hardcoded "alto", "medio" e "piccolo" per testarlo. Ho definito che enum all'interno di una classe helper.

questo come io uso il enum su un Spinner:

mSpinStature.setAdapter(new ArrayAdapter<Stature>(mActivity, android.R.layout.simple_dropdown_item_1line, Stature.values())); 

Sapete come posso farlo?

+0

Questo potrebbe aiutare: http://stackoverflow.com/a/6350364/1025599 – Nachi

risposta

1

assuma questo percorso risorsa

String resourceBundlePath = "my.package.bundles.messages" 

Nel pacchetto my.package.bundles si può avere messages.properties , messages_en_US.properties ecc.

Quindi, utilizzando

ResourceBundle resourceBundle = ResourceBundle.getBundle(resourceBundlePath); 
String messageKey = "myFirstMessage"; 
String message = resourceBundle.getMessage(messageKey); 

message conterrà il valore della proprietà messageKey definita su messages.properties. Se l'attuale Locale è in realtà en_US, otterrai il valore da messages_en_US.properties. Se il locale corrente è qualcosa che non si dispone di un file di proprietà per il valore sarà dal default messages.properties

Si può anche chiamare

ResourceBundle.getBundle(resourceBundlePath, myLocale); 

ma è generalmente migliore di utilizzare il locale piattaforma (avere un guardare argomenti JVM -Duser.language, -Duser.country)

si può avere un ResourceBundle per ogni enum si desidera tradurre con chiavi i nomi degli elementi enum e utilizzarlo nella realizzazione toString() della vostra enum:

@Override 
public String toString() { 
return resourceBudle.getString(super.toString()); 
} 
1

Lascerei enum come è e utilizzare l'approccio standard di ResourceBundle http://docs.oracle.com/javase/tutorial/i18n/resbundle/concept.html utilizzando Enum.toString come chiave

+0

Grazie per la risposta. Ho aggiunto più dettagli alla mia domanda. Quella stringa è definita in strings.xml. E non so come posso farlo usando ResourceBundle. – VansFannel

+0

Not toString()! Usa .name() –

-1
@Override 
public String toString() 
{ 
    //java 
    return ResourceBundle.getBundle().getString(id); 
    //android? 
    App.getContext().getString(id); 

} 
+0

Benvenuto in StackOverflow. Ti mancano alcune cose nella tua risposta: un testo descrittivo per il lettore, inoltre il tuo codice non funzionerà perché l'ID non è dichiarato. – RvdK

+0

oh grazie. Cercherà di fare attenzione d'ora in poi – Optional

6

ho creato una semplice libreria, che è una parte del mio grande progetto (Xdroid):

compile 'com.shamanland:xdroid-enum-format:0.2.4' 

Ora si può evitare la stessa scimmia-lavoro (dichiarando campo, costruttore, ecc) per tutti i enumetations utilizzando annotazioni:

public enum State { 
    @EnumString(R.string.state_idle) 
    IDLE, 

    @EnumString(R.string.state_pending) 
    PENDING, 

    @EnumString(R.string.state_in_progress) 
    IN_PROGRESS, 

    @EnumString(R.string.state_cancelled) 
    CANCELLED, 

    @EnumString(R.string.state_done) 
    DONE; 
} 

e quindi utilizzare il comune approccio Java - uso estensioni della classe java.text.Format:

public void onStateChanged(State state) { 
    EnumFormat enumFormat = EnumFormat.getInstance(); 
    toast(enumFormat.format(state)); 
} 

stringhe.xml

<string name="state_idle">Idle</string> 
<string name="state_pending">Pending</string> 
<string name="state_in_progress">In progress</string> 
<string name="state_cancelled">Cancelled</string> 
<string name="state_done">Done</string> 

Guardate here come mostrare Toast semplicemente.

È anche possibile compilare un'applicazione demo da github.