我们计划为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);
}
然后,这将允许文本正确地改变任何语言。但是,如果某个语言需要不同的文本,如果有零帖子怎么办?等
答案 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。