2010-08-21 36 views
21

Tôi có một vài chuỗi mà tôi cần dịch và hiển thị. Các chuỗi đó là các biến. Tôi có bản dịch trong tệp strings.xml.Truy cập nội dung của R.string sử dụng biến để đại diện cho tên tài nguyên

Tôi muốn hiển thị "phiên bản đã dịch" của chuỗi. Ví dụ, bên trong một Hoạt động:

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

Trong chuỗi nộp Tôi có nghĩa

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

Nếu tôi sử dụng một cái gì đó như thế này:

nameDisplay.setText(R.string.KnownName); 

nó sẽ làm việc. Nhưng trong trường hợp của tôi, tên được lưu trữ trong một biến vì vậy tôi không biết phải làm gì để cho phương thức setText hoạt động đúng.

workaround hiện tại của tôi là

String translation = "" 

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

nameDisplay.setText(translation); 

... nhưng điều này không quy mô rất tốt.

Mọi đề xuất?

Tôi có nên lưu trữ phiên bản đã dịch trong biến không?

Trả lời

40

Bạn có thể sử dụng phương pháp này để chuyển đổi chuỗi thành dạng int:

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

đèo trong một hoạt động như tham số ngữ cảnh (hoặc bất kỳ trường hợp bối cảnh khác). Sau đó, bạn có thể sử dụng mã định danh như bình thường với phương thức getString().

Lưu ý rằng chuyển đổi từ chuỗi thành số nhận dạng sử dụng phản chiếu và do đó có thể không nhanh như vậy, vì vậy hãy sử dụng cẩn thận.

+0

Xin chào. Cám ơn bạn đã góp ý. Nó hoạt động. Cũng nhờ cảnh báo về khả năng mất hiệu suất. – MyNameIsZero

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

Nó được khuyến khích sử dụng context.getPackageName() cho tham số gói – estoke

0

Một điều khác bạn có thể làm là ánh xạ chuỗi đó tới tài nguyên. Bằng cách đó bạn có thể có chuỗi trong một biến (hoặc xây dựng nó theo chương trình) và sau đó sử dụng bản đồ để tra cứu id tài nguyên.

Ví dụ

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

    // ... 
} 

Note

Nếu bạn là localizing your app với các bản dịch khác nhau, thì bạn nên sử dụng các thư mục tài nguyên khác nhau.

Các vấn đề liên quan