【问题标题】:Pluralising and Localizing strings in C#在 C# 中对字符串进行复数和本地化
【发布时间】:2009-09-16 04:35:29
【问题描述】:

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

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

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

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

【问题讨论】:

  • 例如:在波兰语中,有单数、paucal 和复数之分,例如 house 可以是单数的 dom、paucal 的 domy 和复数的 domów。单数是 1,paucal 是范围 2-4, 22-24, 32-34, ... 其他都是复数。比英语更复杂...
  • @Sam - 感谢您为我添加示例,当我问这个问题时,我正在使用 iPod Touch,所以我需要保持简短。

标签: c# wpf internationalization


【解决方案1】:

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

resource://gre/modules/PluralForm.jsm

到它们的实现源。必须在 Firefox 3 及更高版本中打开。

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

HTH。

【讨论】:

  • 感谢您向我指出这一点!尽管它不是 C# 解决方案,但至少他们有一个复数形式规则列表,肯定会有所帮助!
【解决方案2】:

考虑完全避免这个问题。与其构建句子,不如尝试构建你的 UI 来避免这个问题。与其说“5 页”,不如说:“Pages: 5”。

【讨论】:

  • 绝对!避免的问题是较少维护的解决方案。即使有一个好的代码解决方案,翻译人员也需要以各种形式输入相应的短语。由于复数形式的多样性和不规则性,工作量很大,而且很容易出错。
  • 不想冒犯,但这似乎是一个懒惰的出路。这似乎会使产品失去人性,并且肯定会降低可用性。
  • 有些语言不能像这样改写或者看起来很丑。
【解决方案3】:

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

我不建议避免使用它,因为您很快就会失去自然语言“分钟前回答:6”的流程。

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

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

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

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

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

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

PageView = "该页面浏览了 1 次。" PageViewPlural = "此页面查看了 {0} 次。"

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

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

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

【讨论】:

  • 对于第一段,我想到了像匈牙利语这样的语言en.wiktionary.org/wiki/…
  • “复数复数相当罕见,我想在大多数情况下可以互换或上下文相关。” ...是的,相当罕见。至少像所有斯拉夫语言一样罕见。
【解决方案4】:

我猜你知道gettext 的复数形式处理。但总的来说,我会尽量避免(正如 Yuliy 所说)。

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

它比回避问题的方式更加友好和优雅“Dateien, die nicht gelöscht werden konnten: 2”,但在本地化所需的资源数量上需要权衡。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-13
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 2011-02-27
    相关资源
    最近更新 更多