好的,我想出了一個解決方案,基於我所知道的是我能找到的最好的解決方案。如果有人有更好的解決方案,請發佈!
1)在strings.xml中,定義所需的所有文本位(對於我來說,這些位等同於枚舉成員的本地化名稱和用於構建自然語言字符串的字符串(更多內容在這一點上))
實施例:
:
<resources>
...
<string name="verb_ate">ate</string>
<string name="verb_threw">threw</string>
...
<string name="modelobject_naturallanguagedescription">I {0} {1} {2}</string>
...
</resources>
2)在任何枚舉,與所述串的資源ID它們用於顯示
實施例裝飾他們
public enum VerbType
Ate(R.string.verb_ate),
Threw(R.string.verb_threw);
private final int _stringID;
private VerbType(int stringID) {
_stringID = stringID;
}
public int getStringID() {
return _stringID;
}
}
3)製作的輔助功能,其將採取模型對象和上下文並將拼湊所需的自然語言串(使用java.text.MessageFormat中),加一個輔助函數爲每個枚舉:
實施例(假設ModelObject有_verb,_quantity,_object和相關干將):
public static String getVerb(VerbType v, Context c) {
return c.getResources().getString(v.getStringID());
}
public static String getNaturalLanguageString(ModelObject o, Context c) {
MessageFormat mf = new MessageFormat(c.getResources().getString(R.string.modelobject_naturallanguagedescription);
return mf.format(new Object[] {getVerb(o.getVerb(),c), o.getQuantity(), o.getObject()});
}
於是,成就了這一切,它很容易定義另一個字符串文件不同語言(德語爲例(我不不懂德語,所以語言不正確)):
<resources>
...
<string name="verb_ate">gegessen</string>
<string name="verb_threw">gethrown</string>
...
<string name="modelobject_naturallanguagedescription">Ich haben {1} {2} {0}</string>
...
</resources>
因此,在英語語言環境getNaturalLanguageString可能返回:
I ate 6 eggs
而在德語語言環境中它可能返回:
Ich haben 6 eggs gegessen
來源
2015-05-25 15:22:21
GHC
我想沒有。我練習不使用將在運行時創建的語句。當你有完整的靜態句子時,可以使用本地化。例如:「吃六個雞蛋」應該是靜態的。 FYI「靜態」不是我所指的Java靜態。靜態意味着預定義:) – Shrikant
爲什麼downvotes?我應該重述這個問題嗎? – GHC
@Shrikant請檢查我發佈的解決方案並讓我知道您的想法? – GHC