12

我一直在开发一个 .NET 字符串格式化库来协助应用程序的本地化。它被称为SmartFormat ,在GitHub 上是开源的。

它试图解决的问题之一是语法数字。这也被称为“单数和复数形式”或“条件格式”,下面是它的英文片段:

var message = "There {0:is|are} {0} {0:item|items} remaining";

// You can use the Smart.Format method just like using String.Format:
var output = Smart.Format(CultureInfo.CurrentUICulture, message, items.Count);

我相信你知道,英语规则是有两种形式(单数和复数)可以应用于名词、动词和形容词。如果数量是1单数,则使用复数。

我现在正试图通过为其他语言实施正确的规则来“拓宽我的视野”!我已经了解到,某些语言最多可以有 4 种复数形式,并且需要一些逻辑来确定正确的形式。我想扩展我的代码以适应多种语言。例如,我听说俄语、波兰语和土耳其语的规则与英语大不相同,所以这可能是一个很好的起点。

但是,我只会说英语和西班牙语,那么如何确定许多常用语言的正确语法规则呢?

编辑:我也想在这里为我的单元测试了解一些好的非英语“测试短语”:哪些是可用于测试国际化和本地化库的具有单复数形式的好的非英语短语?

4

3 回答 3

10

当然,不同的语言有不同的复数规则。特别有趣的是阿拉伯语和波兰语,它们都包含相当多的复数形式。

如果您想了解更多关于这些规则的信息,请访问Unicode Common Locale Data Repository,即Language Plural Rules

那里有很多有趣的信息,不幸的是其中一些是错误的。我希望复数形式是正确的(至少对于波兰语来说,据我所知:))。

于 2011-08-21T09:32:34.873 回答
1

如果您在问题正文中提供了您正在使用的规则示例,那就太好了,它们采用什么格式?

无论如何,在你的例子中:

var message = "There {0:is:are} {0} {0:item:items} remaining";

您似乎是基于这样的假设,即两个选择段中的选择都基于相同的单个规则,并且两个选项之间存在直接对应关系-即相同的单个规则将选择 (is,item) 或 (are ,项目)。

这个假设对于其他语言不一定正确,例如虚构的语言 English-ez(只是为了让读者更容易理解,我发现外语的例子很烦人 - 我是从阿拉伯语借来的,但简化了很多) . 该语言的规则如下:

第一个选择段和普通英语一样:

is: count=1
are: count=0, count=2..infinity

第二个选择段的规则与普通英语不同,假设以下简单规则:

item: count=1
item-da: count=2 # this language has a special dual form.
items: count=0, count=3..infinity 

现在单一规则解决方案是不够的 - 我们可以建议一种不同的形式:

var message = "There {0:is:are@rule1} {0} {0:item:items@rule2} remaining";

此解决方案在其他情况下可能会出现问题,但我们正在讨论您提供的示例。

检查gettext(允许将完整消息选择到单个级别)和ICU(允许将完整消息选择到多个级别,即在多个变量上)。

于 2012-02-11T07:27:36.970 回答
0

您采用的方法可能适用于英语和西班牙语的大多数情况,但很可能在许多其他语言上失败。问题是您只有一种模式可以尝试解决所有语法数字。

var message = "There {0:is|are} {0} {0:item|items} remaining";

每种语法性别都需要一个模式。在这里,我将两种模式组合成一个单一的多模式字符串。

var message = PluralFormat("one;There is {0} item remaining;other;There are {0} items remaining", count);

英语使用两个语法数字:单数和复数。一个开始单数模式,另一个开始复数模式。

例如,当翻译成使用相同数量的语法数字的芬兰语时,您将使用

"one;{0} kappale jäljellä;other;{0} kappaletta jäljellä"

但是日语只使用一个语法数字,所以日语只会使用另一个。波兰语使用三个语法数字,因此它包含一、少和多。

其次,您需要适当的规则来选择正确的模式数量多个模式。Unicode 联盟的 CLDR 包含 XML 文件中的规则。

我已经实现了一个开源库,它使用 CLDR 规则(从 XML 转换为 C# 代码并包含在库中)和多模式字符串来支持语法数字和语法性别。

https://github.com/jaska45/I18N

使用这个库你的样本变成

var message = MultiPattern.Format("one;There is {0} item remaining;other;There are {0} items remaining", count);
于 2017-11-07T00:38:52.903 回答