单数和复数的ASP.NET本地化如何实现?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

我可以用ASP.NET资源/本地化翻译字符串以简单的方式依赖于一个或其他(英语语法),就像我在翻译中传递数字1一样,它会返回“有一辆车”或0,2和更高,“你有%n辆车”?

或者我被迫在我看来有逻辑来看它是单数还是复数?

提问于
用户回答回答于

我一直在库工作,以协助应用程序的国际化。它被称为SmartFormat,并且在GitHub上是开源的。

它包含许多语言的“语法数字”规则,可根据语言环境确定正确的单数/复数形式。在翻译含有依赖数量的单词的短语时,需要指定多个表单,格式化程序根据这些规则选择正确的表单。

例如:

var message = "There {0:is:are} {0} {0:item:items} remaining.";
var output = Smart.Format(culture, message, items.Count);

它有一个非常类似的语法String.Format(...),但有很多很棒的功能,可以很容易地创建自然和语法正确的消息。

它还处理可能的性别特定格式,列表等等。

用户回答回答于

JasonTrue写道:

To the best of my knowledge, there isn't a language 
that requires something more complicated than singular/plural

这样的语言确实存在。例如,在我的母语波兰语中,有三种形式:1,2-4,零和数字大于4.然后,在达到20后,21,22-24和25+的表格又不同(与数字0-9相同的语法形式)。是的,“你有0件事”听起来很尴尬,因为你不太可能在现实生活中看到它。

作为本地化专家,我会推荐以下内容:

如果可能的话,使用将数字放在最后的形式:

a: Number of cars: %d

这意味着名词“汽车”的形式不取决于数字,0与其他数字一样自然。

如果上述内容不可接受,至少要将完整的句子作为可翻译的资源。那就是使用

b: You have 1 car.    
c: You have %d cars.

绝对不要将这些单位分割成更小的片段,如

d: You have
e: car(s)

(然后在其他地方你有一个非本地化资源sch为“%s%d%s”)

不同之处在于虽然我不能直接翻译(c),但因为名词的形式会发生变化,所以我可以看到问题,并且我可以将这个句子变成(a)在翻译中。

另一方面,当我面对(d)和(e)片段时,无法确定所得到的句子是否是语法的。再说一遍:使用片段保证了在某些语言中,翻译将从语法尴尬到完全破碎。

这适用于所有情况,而不仅仅是数字。例如,诸如“%s被删除”之类的片段也是不可翻译的,因为动词的形式将取决于名词的性别,这在此不可用。我能为波兰做的最好的事情就是“删除:%s”,但只有%s占位符包含在可翻译资源中,我才能做到这一点。如果我所拥有的是“被删除”而不知道指涉名词,我只能通过大声咒骂来吓我的狗,最后我还是必须制作垃圾语法。

扫码关注云+社区