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

3
我们计划为我们的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个回答

3

我们还需要处理许多动态生成的句子(包括三种语言)。
我们总是尽可能地使这些句子尽量中性,以避免使用过多的条件语句:

"您今天发布的帖子数为:{0}"


1

你应该将单数和复数句子视为不同的字符串,不要从片段中构建它们(我会投票反对Sachin的帖子,但我还没有“权力”:-)

haarrrgh关于“您今天的帖子数量:{0}”表单是正确的。虽然听起来太“计算机化”,但它是最可扩展的解决方案。

有些语言具有非常复杂的复数规则(阿拉伯语对0、1、2、多个使用不同的形式;俄语在模10余数为1时使用单数(1、51、4231都使用单数形式);罗马尼亚语在模100余数介于20和99之间时使用不同的复数形式)。有关更多示例(和确切规则),请参见CLDR数据中的supplemental\plurals.xml文件。(来自ftp://ftp.unicode.org/Public/cldr/1.6.1/的core.zip内)

在这里查看其他考虑因素:http://www.mihai-nita.net/article.php?artID=20060430a


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“;
}

更多信息在这里


这基本上与问题中的“您今天发布了{0}篇帖子”相同,我认为这不是他想知道的。实际问题是:如果句子根据$amount$的值而变化怎么办? - Christian Specht

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接