Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中字符串的多元化和本地化#_C#_Wpf_Internationalization - Fatal编程技术网

C# C语言中字符串的多元化和本地化#

C# C语言中字符串的多元化和本地化#,c#,wpf,internationalization,C#,Wpf,Internationalization,我有一个C#WPF应用程序,我正试图用resx文件进行全球化。它工作得非常出色。然而,我遇到了麻烦。我有一个相对简单的多元化解决方案,其中我展示的字符串有单数和复数形式,我根据我谈论的任何事情的数量选择一个 然而,我最近接受了一个事实,一些文化有多种复数形式。有没有人在C#中找到了解决这个问题的好方法,更不用说WPF了 我看到的这个问题的典型例子来自波兰语。波兰语有单数、paul和复数形式。本例用于翻译“文件”一词: 1 plik 2,3,4普利基 普利科西5-21号 22-24普利基 普利科

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

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

我看到的这个问题的典型例子来自波兰语。波兰语有单数、paul和复数形式。本例用于翻译“文件”一词:

  • 1 plik
  • 2,3,4普利基
  • 普利科西5-21号
  • 22-24普利基
  • 普利科沃25-31号

Mozilla已经在Firefox 3中实现了这一点,他们有一个指南介绍如何使用他们的实现。 最值得注意的是,在这一节中,他们有一个链接

resource://gre/modules/PluralForm.jsm

它们的执行来源。必须从Firefox 3及更高版本中打开

我还没有通读整件事,但这似乎是一个好地方,至少可以获得一些想法


HTH.

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

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

我不建议避免它,因为你会很快失去自然语言的流动性

也许你一开始就是这个意思,但更常见的情况是不同文化的句法位置不同。例如,要本地化的字符串“此页面已查看X次”。您可能需要为此创建3个可本地化字符串:

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

然后,可以使用一个简单的伪实现

PageViewStart+pageCount.ToString()+pageCount==1?PageViewEnd:PageViewEnd复数

然而在荷兰语中“Deze pagina是{0}keer bekeken”和韩语中“Deze pagina是{0}keer bekeken”조회수 {0}". 因此,您会发现,在跨语言格式化复数句子结构的多种方法的实现中,您将立即遇到问题

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

PageView=“此页面已查看1次。” PageViewPlural=“此页面已查看{0}次。”

通过这种方式,您可以编写条件(根据您的实现再次使用伪):

页面计数>1?PageView:String.Format(PageViewPlural,pageCount.ToString())

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

我想您已经了解了的复数形式处理。但一般来说,我会尽量避免(正如尤利所说)

不仅仅是名词-短语可以改变(例如德语中的“1 Datei konnte nicht gelöscht werden”/“2 Dateien konnten nicht gelöscht werden”)


它比回避问题的“Dateien,die nicht gelöscht werden konnten:2”更友好、更优雅,但在本地化的资源数量上有一个折衷。

在第一段中,我想到了匈牙利语等语言。“多重复数是相当罕见的,我想在大多数情况下是可互换的或上下文敏感的。" ... 是的,相当罕见。至少和所有斯拉夫语一样,波兰语中也有单数、paucal和复数,比如house,单数可以是dom,paucal可以是domy,复数可以是domów。单数是1,paucal的范围是2-4,22-24,32-34。。。复数就是一切。比英语更复杂…@Sam-谢谢你为我添加了一个例子,当我问这个问题时,我正在用ipodtouch,所以我需要保持简短。绝对!避免的问题是不需要维护的解决方案。即使有一个好的代码解决方案,译者也需要以各种形式输入相应的短语。由于复数形式的多样性和不规则性,这需要大量的工作,而且很容易出错。不想冒犯他人,但这似乎是一个懒惰的解决办法。这似乎会使产品失去人性,并肯定会降低可用性。有些语言不可能这样重新表述,或者看起来很难看。感谢您向我指出这一点!尽管这不是一个C#解决方案,但至少他们有一个复数形式规则列表,肯定会有帮助!