2010-07-21 28 views
9

我想知道什麼是處理與添加到它運行時數據報表國際化的正確途徑。例如 1)您的輸入「xyz」非常棒! 2)當您從「巴尼和Freinds」到「海綿寶寶」顯示切換你是「4年」了。你如何處理國際化「你的意見」xyz'非常棒!「

雙引號值獲得或在運行時計算出的用戶數據。我的平臺主要是Java/Android。西方語言的正確解決方案比較弱的通用解決方案更受歡迎。

回答

12

的Java

若要檢索本地化的文本(消息),使用java.util.ResourceBundle API。要格式化消息,請使用java.text.MessageFormat API。

基本上,首先創建一個properties file像這樣:

key1 = Your input {0} is excellent! 
key2 = You were {0} old when you switched from {1} to {2} shows.

{n}事情是參數佔位符,你可以通過MessageFormat#format()傳遞英寸

然後加載它,像這樣:

ResourceBundle bundle = ResourceBundle.getBundle("filename", Locale.ENGLISH); 

然後獲得通過的關鍵消息,這樣做:

String key1 = bundle.getString("key1"); 
String key2 = bundle.getString("key2"); 

然後進行格式化,這樣做:

String formattedKey1 = MessageFormat.format(key1, "xyz"); 
String formattedKey2 = MessageFormat.format(key2, "4 years", "Barney and Friends", "Spongebob"); 

參見:


的Android

至於Android,這個過程更容易。您只需將所有String消息放在res/values/strings.xml文件中。然後,您可以使用不同的語言創建該文件的一個版本,並將該文件放入包含語言代碼的values文件夾中。舉例來說,如果你想增加西班牙語支持,你只需要創建一個名爲res/values-es/文件夾,把你strings.xml西班牙語版本的出現。 Android會根據手機的配置自動決定使用哪個文件。

參見:

+0

要清楚:您需要向翻譯人員提供字符串'您的輸入'{0}'非常好'',並將翻譯(存儲在'ResourceBundle'中存儲到'MessageFormat'中,然後將{ 0}'提供您提供的內容 – 2010-07-21 15:11:16

+2

在android上執行此操作的建議方法是執行BalusC建議的操作,並將字符串放入res/values-xx/strings.xml文件中,但不要使用{0},您可以使用帶格式字符串的Context.getString()版本(請參閱http://d.android.com/reference/android/content/Context.html) 它採用標準的Java格式化字符串。您的價值看起來像「您的輸入'%1 $ s'非常好」 – joeo 2010-07-21 16:55:15

3

一個非技術考慮。在英語短語中嵌入免費數據在許多文化(包括西方文化)中看起來不會很順暢,在這種文化中需要例如語法上的協議。數量,性別或案例。更多的電報風格通常會有所幫助(例如,極好的輸入:「xyz」) - 那麼至少每個人都會得到相同程度的笨拙!

+0

如果您使用參數化佔位符,則這不是問題。您可以在任何地方以語法方式將其定位。 – BalusC 2010-07-21 15:39:01

+0

我不認爲你會看到我所得到的。與大多數西方(和其他)語言相比,英語語法很簡單。當用英文書寫字符串模板時,你可能會記得提供單數和複數的替代(「{0}是...」和「{0}是...」),但你仍然不會能夠滿足對用於名詞中不同性別或情況的單詞形式的限制,**對於初學者**。在撰寫英文原文時,應該注意以下幾點:儘可能以電報方式,以避免譯文聽起來太錯亂。 – 2010-07-21 15:47:40

+0

順便說一句,@BalusC,你的回答是非常正確的,我們現實的最好的做法。我只是建議通過**也**工作在英語語句上,應用程序可以在其本地化變體中做出稍微更專業的印象。 – 2010-07-21 15:49:56

0

我認爲一個可能要定義一個的格式字符串爲包括「1-的-N」特徵,優選地定義,以使共同案件容易(例如複數)。例如,如果參數0爲零或更少,則定義{0#string1/string2/string3}來輸出string1;如果它恰好爲1,則定義爲string2;如果它大於1,則定義爲string3。然後可以說「你在抽屜裏有{0} {0#刀/刀/刀」。「

+0

至少,對於西歐語言,我不認爲dualis是必需的......(出現在單數和複數之間,對於兩個物體!)。 – 2010-07-21 19:07:31