多语言ASP.NET网站的动态生成句子

时间:2009-02-09 13:41:41

标签: .net asp.net

我们计划为ASP.NET网站添加多语言支持。我理解根据当前文化从资源文件中提取字符串的一般过程,但处理以下情况的最佳方法是什么?

假设我们想向用户显示他们今天制作了多少Stack Overflow帖子。可以说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 个答案:

答案 0 :(得分:3)

我们正在处理大量动态生成的句子(3种语言) 我们总是尽量使句子保持中立,以避免尽可能多的条件陈述:

“您今天的帖子数量:{0}”

答案 1 :(得分:1)

你绝对应该将单数形式的复数句子视为不同的字符串,并且不要用碎片构建它们(我会投票给Sachin发帖,但我还没有“权力”: - )

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

答案 2 :(得分: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