2009-02-09 60 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