2010-08-21 13 views
21

का प्रतिनिधित्व करने के लिए एक चर का उपयोग करके आर। स्ट्रिंग की सामग्री तक पहुंचने में मेरे पास कुछ स्ट्रिंग हैं जिन्हें मुझे अनुवाद और प्रदर्शित करने की आवश्यकता है। वे तार चर में हैं। मेरे पास strings.xml फ़ाइल में अनुवाद है।संसाधन नाम

मैं स्ट्रिंग के "अनुवादित संस्करण" को प्रदर्शित करना चाहता हूं। उदाहरण के लिए, एक गतिविधि के अंदर:

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

तार में दाखिल मैं परिभाषा

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

है, तो मैं कुछ इस तरह इस्तेमाल किया:

nameDisplay.setText(R.string.KnownName); 

यह काम करेगा। लेकिन मेरे मामले में, नाम एक चर में संग्रहीत है, इसलिए मुझे नहीं पता कि setText विधि को ठीक से कार्य करने के लिए क्या करना है।

मेरे वर्तमान workaround

String translation = "" 

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

nameDisplay.setText(translation); 

है ... लेकिन यह बहुत अच्छी तरह से बड़े पैमाने नहीं है।

कोई सुझाव?

क्या मुझे चर में अनुवादित संस्करण संग्रहीत करना चाहिए? संदर्भ पैरामीटर (या किसी अन्य संदर्भ उदाहरण) के रूप में एक गतिविधि में

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

पास:

उत्तर

40

आप पूर्णांक पहचानकर्ता में स्ट्रिंग परिवर्तित करने के लिए विधि का उपयोग कर सकते हैं। फिर आप getString() विधि के साथ सामान्य रूप से पहचानकर्ता का उपयोग कर सकते हैं।

ध्यान दें कि स्ट्रिंग से पहचानकर्ता का रूपांतरण प्रतिबिंब का उपयोग करता है और इस प्रकार तेज़ नहीं हो सकता है, इसलिए ध्यान से उपयोग करें।

+0

हैलो। आपके कमेंट के लिए धन्यवाद। यह काम करता हैं। प्रदर्शन के संभावित नुकसान के बारे में चेतावनी के लिए भी धन्यवाद। – MyNameIsZero

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

पैकेज पैरामीटर के लिए context.getPackageName() का उपयोग करने की सलाह दी जाती है – estoke

0

एक और चीज जो आप कर सकते हैं संसाधन के लिए स्ट्रिंग को मानचित्र बनाते हैं। इस तरह आप एक चर में स्ट्रिंग (या इसे प्रोग्रामेटिक रूप से निर्मित कर सकते हैं) और फिर संसाधन आईडी देखने के लिए मानचित्र का उपयोग कर सकते हैं।

उदाहरण

strings.xml

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

कोड

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); 
    } 

    // ... 
} 

नोट

यदि आप अलग-अलग अनुवादों के साथ localizing your app हैं, तो आपको विभिन्न संसाधन फ़ोल्डर का उपयोग करना चाहिए।

संबंधित मुद्दे