Доступ к содержимому R.string с использованием переменной для представления имени ресурса
У меня есть несколько строк, которые мне нужно перевести и отобразить. Эти строки находятся в переменных. У меня есть перевод в файле 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 функционировал правильно.
Мое текущее обходное решение
String translation = ""
if(name == "Water") {
translation = getString(R.string.Water);
}
else {
...
}
nameDisplay.setText(translation);
... но это не очень хорошо масштабируется.
Любые предложения?
Должен ли я хранить переведенную версию в переменной?
Ответы
Ответ 1
Вы можете использовать метод для преобразования строки в идентификатор int:
public static int getStringIdentifier(Context context, String name) {
return context.getResources().getIdentifier(name, "string", context.getPackageName());
}
Передача в качестве параметра контекста (или любого другого экземпляра контекста). Затем вы можете использовать идентификатор, как обычно, с методом getString().
Обратите внимание, что преобразование из строки в идентификатор использует отражение и, следовательно, может быть не так быстро, поэтому используйте осторожно.
Ответ 2
private String getStringResourceByName(String aString)
{
String packageName = context.getPackageName();
int resId = getResources().getIdentifier(aString, "string", packageName);
return getString(resId);
}
Ответ 3
Еще одна вещь, которую вы можете сделать, - сопоставить строку с ресурсом. Таким образом, вы можете иметь строку в переменной (или создавать ее программно), а затем использовать карту для поиска идентификатора ресурса.
Пример
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);
}
// ...
}
Примечание
Если вы локализуете свое приложение с разными переводами, то вам следует использовать разные папки ресурсов.