2015-05-25 43 views
-2

我正在編寫一個應用程序,我想在該模型中向用戶顯示一個描述對象的字符串。我已經開始考慮本地化問題,並且對於處理語言之間語法差異的最佳方法我有點難以理解。本地化代碼生成的自然語言字符串

試想一下,如果在我的模型我有一個動詞的對象和數量(僞):

int _quantity = 6; 
String _object = "@string/object"; 
String _verb = "@string/verb"; 

這應該在英文呈現爲_verb + _quantity + _object(即「吃6個雞蛋」,而在德語它應該呈現爲_quantity + _object + _verb(即「6個雞蛋吃」(但顯然,使用德語單詞標記而不是英語:)))

Android是否存在這種類型的問題的標準方法?

謝謝。

+0

我想沒有。我練習不使用將在運行時創建的語句。當你有完整的靜態句子時,可以使用本地化。例如:「吃六個雞蛋」應該是靜態的。 FYI「靜態」不是我所指的Java靜態。靜態意味着預定義:) – Shrikant

+0

爲什麼downvotes?我應該重述這個問題嗎? – GHC

+0

@Shrikant請檢查我發佈的解決方案並讓我知道您的想法? – GHC

回答

0

好的,我想出了一個解決方案,基於我所知道的是我能找到的最好的解決方案。如果有人有更好的解決方案,請發佈!

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