2010-08-21 9 views
21

Ho alcune stringhe che devo tradurre e visualizzare. Quelle stringhe sono in variabili. Ho la traduzione nel file strings.xml.Accesso al contenuto di R.string utilizzando una variabile per rappresentare il nome della risorsa

Desidero visualizzare la "versione tradotta" della stringa. Ad esempio, all'interno di un'attività:

String name = "Water"; 
TextView nameDisplay = new TextView(this). 
nameDisplay.setText(name); 

Nelle stringhe di file ho la definizione

<string name="Water">French word for Water</string> 

Se ho usato qualcosa di simile:

nameDisplay.setText(R.string.KnownName); 

che avrebbe funzionato. Ma nel mio caso, il nome è memorizzato in una variabile, quindi non so cosa fare in modo che il metodo setText funzioni correttamente.

mia soluzione attuale è

String translation = "" 

if(name == "Water") { 
    translation = getString(R.string.Water); 
} 
else { 
    ... 
} 

nameDisplay.setText(translation); 

... ma questo non scala molto bene.

Qualche suggerimento?

Devo memorizzare la versione tradotta nella variabile?

risposta

40

È possibile utilizzare il metodo per convertire stringa in int identificatore:

public static int getStringIdentifier(Context context, String name) { 
    return context.getResources().getIdentifier(name, "string", context.getPackageName()); 
} 

Passo in un'attività come parametro di contesto (o qualsiasi altra istanza di contesto). Quindi puoi usare l'identificatore come al solito con il metodo getString().

Si noti che la conversione da stringa a identificatore utilizza la riflessione e quindi non può essere così veloce, quindi utilizzare con attenzione.

+0

Ciao. Grazie per il tuo commento. Funziona. Inoltre, grazie per l'avvertimento sulla possibile perdita di prestazioni. – MyNameIsZero

5
private String getStringResourceByName(String aString) 
    { 
     String packageName = context.getPackageName(); 
     int resId = getResources().getIdentifier(aString, "string", packageName); 
     return getString(resId); 
    } 
+1

Si consiglia di utilizzare context.getPackageName() per il parametro del pacchetto – estoke

0

Un'altra cosa che puoi fare è mappare la stringa alla risorsa. In questo modo puoi avere la stringa in una variabile (o crearla a livello di codice) e quindi usare la mappa per cercare l'ID della risorsa.

Esempio

strings.xml

<string name="water_english">water</string> 
<string name="water_spanish">agua</string> 
<string name="water_chinese">水</string> 
<string name="water_mongolian">ᠤᠰᠥ</string> 

Codice

public class MainActivity extends AppCompatActivity { 

    private Map<String, Integer> stringForResourceIdMap = createMap(); 

    private Map<String, Integer> createMap() { 
     Map<String, Integer> result = new HashMap<>(); 

     result.put("water_english", R.string.water_english); 
     result.put("water_spanish", R.string.water_spanish); 
     result.put("water_chinese", R.string.water_chinese); 
     result.put("water_mongolian", R.string.water_mongolian); 

     return result; 
    } 

    private String getMyStringResource(String lookupString) { 
     int resourceId = stringForResourceIdMap.get(lookupString); // R.string.xxx 
     return getString(resourceId); 
    } 

    // ... 
} 

Nota

Se si dispone di localizing your app con traduzioni diverse, è necessario utilizzare cartelle di risorse diverse.

Problemi correlati