在C#中对字符串进行多元化和本地化

我有一个C#WPF应用程序,我正在尝试使用resx文件进行全球化。 它的作品非常精彩。 然而,我遇到了麻烦。 我有一个相对简单的多元化解决方案,我有一个单数和复数forms的字符串我正在显示,我根据我正在谈论的任何事情的数量选择一个。

但是,我最近接受了一些文化有多种复数forms的事实。 有没有人在C#中遇到过这个问题的好方法,更不用说WPF?

我在这个问题上看到的典型例子来自波兰语。 波兰语有单数,paucal和复数forms。 此示例用于翻译单词“file”:

  • 1 plik
  • 2,3,4 pliki
  • 5-21 pliko’w
  • 22-24 pliki
  • 25-31 pliko’w

Mozilla已经在Firefox 3中实现了这一点,他们有一个指南,描述如何在这里使用他们的实现。 最值得注意的是,在使用PluralForm开发部分,他们有一个链接

资源://gre/modules/PluralForm.jsm

到他们的实施来源。 必须在Firefox 3及更高版本中打开。

我还没有读过整篇文章,但这似乎是一个至少可以获得一些想法的好地方。

HTH。

考虑试图完全避免这个问题。 不要构建句子,而是尝试构建UI以避免问题。 而不是说“5页”试着说:“页数:5”。

像这样的本地化会考虑您要翻译的语言。 多个复数是相当罕见的,我想在大多数情况下是可互换的或上下文敏感的。 除非在您的应用程序中的多个位置使用它,否则您无需担心。 如果您这样做并且特定用法确实在多次使用中产生语法错误,那么您需要为该一个实例添加一个新的密钥(所有语言)。 或者,既然您正在检测文化,请为受影响的语言添加附加条件,并使用单个复数复数forms。

我不建议避免它,因为你可以很快失去自然语言的流量“Mins回答:6”。

也许你首先意味着这一点,但更常见的情况是不同文化中语法位置的变化。 例如,想要本地化的字符串“此页面被查看X次”。 您可能希望为此创建3个可本地化的字符串:

PageViewStart =“此页面被查看”PageViewEnd =“time”PageViewEndPlural =“times”

然后是一个简单的伪实现

PageViewStart + pageCount.ToString()+ pageCount == 1? PageViewEnd:PageViewEndPlural;

然而在荷兰语中“Deze pagina is {0} keer bekeken”和韩语“조회수{0}”。 因此,您会发现immediatley会遇到多种方式的实现问题,这些方法可以跨语言格式化多个句子结构。

我故意在示例中留下{0},因为它暗示了我的解决方案。 使用复数和非复数的整个句子的本地化。

PageView =“此页面查看了一次。” PageViewPlural =“此页面查看了{0}次。”

这样你可以写条件(伪再次取决于你的实现):

pageCount> 1? PageView:String.Format(PageViewPlural,pageCount.ToString());

唯一的问题是,您需要向翻译人员说明resx文件中{0}标记的含义和位置。

我想你应该知道gettext的复数forms处理。 但一般来说,我会尽量避免它(正如Yuliy所说)。

这不仅仅是名词 – 短语可以改变(例如德语“1 Datei konntenichtgelöschtwerden” / “2 Dateien konntennichtgelöschtwerden” )。

它比问题回避“Dateien,dienichtgelöschtwerdenkonnten:2”更加友好和优雅,但是对于本地化有多少资源有一个权衡。