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