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

时间:2009-09-16 04:35:29

标签: c# wpf internationalization

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

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

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

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

4 个答案:

答案 0 :(得分:8)

Mozilla已经在Firefox 3中实现了这一功能,他们有一个指南,介绍如何使用他们的实现here。 最值得注意的是,在Developing with PluralForm部分,他们有一个链接

  

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

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

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

HTH。

答案 1 :(得分:4)

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

答案 2 :(得分:2)

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

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

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

PageViewStart =“此页面已被查看” PageViewEnd =“时间” PageViewEndPlural =“次”

然后一个简单的伪实现将是

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

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

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

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

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

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

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

答案 3 :(得分:1)

我想你很清楚gettext的复数形式处理。但一般来说,我会尽量避免它(如Yuliy所说)。

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

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