2009-02-09 58 views
3

我們正計劃爲我們的ASP.NET網站添加多語言支持。我瞭解從基於當前文化的資源文件中抽取字符串的一般過程,但處理以下情況的最佳方法是什麼?多語言ASP.NET網站的動態生成語句

比方說,我們想向用戶展示他們今天製作了多少堆棧溢出帖子。可以說,i是職位數。如果你只是用英文工作,你會得到下面的代碼。

if(i == 1) 
{ 
    postCountText = "You have made " + i + " post today"; 
} else { 
    postCountText = "You have made " + i + " posts today"; 
} 

因此,正在創建的文本是基於我們是在處理單數還是複數的帖子。

如果我們想用其他語言創建帖子數文本呢?顯然,我們不能像上面那樣有很多條件語句,所以資源文件中的字符串需要自動工作來創建所需的輸出文本。在另一種語言中,當您在單數和複數之間移動時,它可能不僅僅是post(s)單詞發生變化,也可能是單詞today

我到目前爲止唯一的想法是在外部資源文件中存儲兩個字符串,一個用於單數,另一個用於複數,然後將String.Format應用於這些以將帖子數插入正確的位置。

即英語的資源文件將包含以下兩個字符串:

singlePostCount : "You have made {0} post today" 

pluralPostCount : "You have made {0} posts today" 

然後我會在下面的代碼來創建輸出文本:

if(i == 1) 
{ 
    postCountText = String.Format(GetResourceString("singlePostCount"), i); 
} else { 
    postCountText = String.Format(GetResourceString("pluralPostCount"), i); 
} 

這則允許文本正確地更改任何語言。但是,如果某個語言的帖子數爲零,那麼需要不同的文本呢?等等。

回答

3

我們也在處理大量動態生成的句子(3種語言)。
我們總是試圖使句子儘可能中性,以避免儘可能多的條件語句儘可能:

「你今天的職位數:{0}」

0

使用StringTemplate,因爲它是最好的方法與這種情況一起工作。

這是因爲以下簡單:

假設你有一個模板文件sample.st

Dear $user$ you have exceeded the usage. Your current balance is $amount$ 

只需添加以下代碼:

StringTemplateGroup group = new StringTemplateGroup("myGroup", "C:\\Templates", DefaultTemplateLexer.class); 
StringTemplate Message = group.getInstanceOf("sample"); 
Message.setAttribute("user", "Sam"); 
Message.setAttribute("amount", "100"); 
Message.toString(); 

編輯: 你可以使用複數函數如下:

Dear $user$ you have $posts$ post$plural$ 

StringTemplate Message = group.getInstanceOf("sample"); 
Message.setAttribute("user", "Sam"); 
Message.setAttribute("post", post); 

Message.setAttribute("plural", Getplural(post)); 
Message.toString(); 

String getplural(int i) 
{ 

If i >1 
Return 「s「; 
} 

更多信息here

+0

這基本上是像「你讓{0}今天的帖子」從這個問題,我認爲這是不一樣的,他是什麼想知道。實際的問題是:如果句子根據$ amount $?的值而變化,該怎麼辦? – 2009-02-09 14:48:00

1

你一定要治療單數複數句子爲不同的字符串,而沒有從片建立他們(我會投薩欽張貼了,但我沒有「權力」,但:-)

haarrrgh對「今日的帖子數量:{0}」形式是正確的。雖然聽起來太「像電腦一樣」,但它是最具可擴展性的解決方案。

有複雜的複數規則的語言(阿拉伯語有0,1,2,許多不同的形式;如果模10是1,俄語使用單數形式(1,51,4231都使用單數形式);羅馬尼亞語使用不同的形式如果模數100在20和99之間則爲複數)。 有關更多示例(和確切規則),請參閱CLDR數據中的補充\ plurals.xml文件。 (內從ftp://ftp.unicode.org/Public/cldr/1.6.1/ core.zip)

這裏看看其他方面的考慮:http://www.mihai-nita.net/article.php?artID=20060430a