我有一个多语言的Android应用程序,我已将不同的翻译放在strings.xml中的相应目录中。
现在我还有一个自定义的xml文件,我想引用这样的文本:
<?xml version="1.0" encoding="UTF-8"?>
<rooms>
<room title="@+string/localizedtext" />
</rooms>
现在当我在我的代码中读取title属性时,我显然得到了未解析的字符串“@ + string / localizedtext”。 是否有可能以某种方式自动解析此链接到本地化文本?
谢谢!
答案 0 :(得分:6)
差不多一年后:
public static String getStringResource(Context context, String thingie) {
try {
String[] split = thingie.split("/");
String pack = split[0].replace("@", "");
String name = split[1];
int id = context.getResources().getIdentifier(name, pack, context.getPackageName());
return context.getResources().getString(id);
} catch (Exception e) {
return thingie;
}
}
那就行了。
答案 1 :(得分:5)
这似乎是一个广泛的答案,但我相信它会为花费数小时寻找它的人澄清很多事情(我是其中之一)。
简短的回答是肯定的,您可以使用自定义XML中的引用,而不仅仅是字符串,但这是我使用的示例,以便于理解。
考虑上下文:
<resources>
<string name="sample_string">This is a sample string.</string>
</resources>
<resources>
<string name="sample_string">Ceci est un exemple de chaîne</string>
</resources>
<!-- @string/sample_string identifies both
the default and french localized strings,
the system settings determine which is used at runtime.
-->
<test>
<sample name="sampleName" text="@string/sample_string"/>
</test>
//Omitted imports for clarity.
public class testXmlParser {
public static final String ns = null;
public int parse(XmlResourceParser parser) throws XmlPullParserException,
IOException{
while(parser.next() != XmlPullParser.END_DOCUMENT){
if(parser.getEventType() == XmlPullParser.START_TAG){
if(parser.getName().equalsIgnoreCase("sample")){
// This is what matters, we're getting a
// resource identifier and returning it.
return parser.getAttributeResourceValue(ns, "text", -1);
}
}
}
return -1;
}
使用String getText(int id)
获取与id
对应的字符串(本地化,如果可用)。
使用上面的例子,它将取代:
//Return the resource id
return parser.getAttributeResourceValue(ns, "text", -1);
with:
//Return the localized string corresponding to the id.
int id = parser.getAttributeResourceValue(ns, "text", -1);
return getString(id);
答案 2 :(得分:4)
你尝试的方式是不可能的。
您可能会使用<string-array>
资源获得类似的功能:
<resources>
<string-array name="room">
<item>@string/localizedText</item>
<item>@string/otherLocalizedText</item>
</string-array>
</resources>
然后你会像这样使用它:
String[] room = getResources().getStringArray(R.array.room);
String localizedText = room[0];
String otherLocalizedText = room[1];
答案 3 :(得分:1)
Android中的本地化是使用资源标识符完成的。看看这个Android教程。
http://developer.android.com/resources/tutorials/localization/index.html
见下面的讨论。
答案 4 :(得分:0)
很棒的回答kyis,惭愧我仍然没有足够的布朗尼点来评价它。要回答Nick的问题,只需将最后一段代码更改为:
int id = parser.getAttributeResourceValue(ns, "text", 0);
return (id != 0) ? getString(id) : parser.getAttributeValue(ns, "text");
请注意,我使用0作为资源的默认值,因为这保证永远不会是真正的资源值。 -1也会这样做。