2011-12-09 36 views
2

我有一個字符串,其中包含如下所示的名稱列表: 「John問Kim,Kelly,Lee和Bob關於新年計劃」。列表中的名字數量可以非常多。 我怎樣才能在Java中本地化? 我在考慮ResourceBundle和MessageFormat。我將如何在MessageFormat中爲此編寫模式? 有沒有更好的方法?本地化一個包含名稱列表的字符串

+0

你能舉一個例子,說明字符串對於不同的本地化來說會是什麼樣子? –

+0

我的問題更多的是與格式(將名稱動態插入本地化的字符串模式)。類似於「{1}詢問{2}和{3}關於新年計劃' –

回答

2

你可以這樣做:

"{0} asked {1} about the new year plans" 

其中0是第一個名字,1是一個逗號分隔的其他名稱的列表。

希望這會有所幫助。

+0

{1}不能是逗號分隔列表,它應該在姓氏前包含'和'。還有'和'需要進行本地化。 –

+1

然後,如果只有一個人,或者「{0}和{1}」,則需要基於人數由另一格式化程序構建「1」:「{0}」(或無格式)當多於一個時--0成爲除最後一個人以外的所有人的逗號分隔列表,1是最後一個人。 – cjstehno

1

對於本地化,常規方法是使用外部語言包,它是一個文件,其中包含要顯示的文本,爲每個文本分配一個名稱/鍵,然後通過鍵在程序中加載文本。

0

你可以在你的資源包(用於國際化)用的MessageFormat(以取代名稱佔位符)結合起來:「{0}要求{1}對新的一年的計劃」

這將是由你來但是,事先準備好名字。

2

我看到一個答案已被接受,我只是在這裏添加這個作爲替代。的代碼已經硬編碼值的數據,而是僅意味着呈現可以細化一個想法:

MessageFormat people = new MessageFormat("{0} asked {1,choice,0#no one|1#{2}|2#{2} and {3}|2<{2}, and {3}} about the new year plans"); 
String john = "John"; 
Object[][] parties = new Object[][] { {john, 0}, {john, 1, "Kim"}, {john, 2, "Kim", "Kelly}, {john, 4, "Kim, Kelly, Lee", "Bob"}}; 
for (final Object[] strings : parties) { 
    System.out.println(people.format(strings)); 
} 

此輸出以下:

John asked no one about the new year plans 
John asked Kim about the new year plans 
John asked Kim and Kelly about the new year plans 
John asked Kim, Kelly, Lee, and Bob about the new year plans 

確定所使用的名稱數對於第二個參數併爲第三個參數創建逗號分隔的字符串不會顯示在該示例中,但可以輕鬆完成而不是使用我使用的硬編碼值。

11

本地化(內聯)列表不僅僅是翻譯單詞「和」。CLDR處理格式化列表的問題,請查看他們的page on lists。恐怕ICU還沒有支持,所以你可能需要單獨編碼。

另一個問題是,你不能指望能夠像這樣的句子中使用名稱。例如,許多語言都要求對象處於傾斜的形式。在芬蘭語中,你的例句應該是「John kysyiKimiltä,Kellyltä,Leeltäja Bobilta uudenvuoden suunnitelmista」。因此,你可能需要找出幷包含名稱的不同傾斜形式。此外,如果使用的語言沒有拉丁字母,您可能需要音譯形式的名稱(例如,阿拉伯語,約翰是جون)。還有其他問題。在俄語中,與「問」相對應的動詞取決於受試者的性別(例如,спросила與спросил)。

我知道這聽起來很複雜,但本地化通常很複雜。如果只針對一組有限的語言,事情會變得更容易,所以定義目標很重要 - 可能會接受一些可能導致語法錯誤表達式的簡化。但是對於涵蓋各種語言的本地化,您可能需要將生成函數進行本地化。也就是說,對於每種語言,您都可以使用一個函數,該函數接受一個名稱列表作爲參數,並返回一個表示該語句的字符串,可能使用包含關於專有名稱的信息(音譯形式,不同傾向形式,性別)的資源文件出現。

在某些情況下,您甚至可能會考慮用英語生成該句子,然後將其發送給在線翻譯人員。例如,谷歌翻譯可以處理我提到的一些問題。它肯定會產生很多錯誤的翻譯,但對於語法結構非常簡單的句子,如果您可以接受一些錯誤,它可能是一個實用的解決方案。如果您考慮嘗試此操作,請確保您充分測試自動翻譯器如何處理您將使用的特定句子。通常你可以通過重新構造句子來改善結果。將一個句子分成幾個句子通常是有幫助的。但即使你的簡單句子在自動翻譯中也會出現問題。

如果您可以重新構造句子結構,例如:這樣所有的名詞都會出現在主題位置,並且避免了像「新年計劃」這樣的「包裝」表達。例如,「約翰問金,凱利,李和鮑勃對新年有什麼計劃」會更簡單,既用於自動翻譯,也用於基於模式的本地化。

+2

ICU版本50和更高版本爲此(ListFormatter)提供了一個API。請參閱http://site.icu-project.org/download/50:「將Java util.ListFormat更改爲text.ListFormatter和其他更新,使用CLDR數據(#9369,#9420),將端口轉換爲C++(#7168)」 – Fredrik

+0

@Fredrik,ListFormatter旨在處理列表中的標點符號(例如「A,B和C」與「A,B和C」)以及「和」的單詞。在問句中定位句子時還有許多其他問題。 –

+0

我知道它做了什麼;我的評論是澄清了「我恐怕ICU在這方面還沒有支持」這一點。 ListFormatter是您提到的CLDR數據的API。 – Fredrik

相關問題