代码之家  ›  专栏  ›  技术社区  ›  dustyburwell

C中字符串的复数化和本地化#

  •  3
  • dustyburwell  · 技术社区  · 17 年前

    我有一个c wpf应用程序,我正试图用resx文件实现全球化。它工作得很好。不过,我遇到了麻烦。我有一个相对简单的复数形式的解决方案,我有一个单数和复数形式的字符串,我会根据我所说的任何东西的数量来选择一个。

    然而,我最近已经认识到一些文化有多种复数形式。有没有人在C中找到一个很好的解决方案,更不用说WPF了?

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

    • 1 PLIK
    • 2,3,4倍
    • 5-21 Piok'w
    • 22-24普利基
    • 25-31普利科夫
    4 回复  |  直到 15 年前
        1
  •  8
  •   AASoft    17 年前

    Mozilla已经在firefox 3中实现了这一点,并且他们有一个说明如何使用其实现的指南。 here . 最值得注意的是, Developing with PluralForm 第节,它们有一个链接

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

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

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

    Hth.

        2
  •  4
  •   Yuliy    17 年前

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

        3
  •  2
  •   user146122    17 年前

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

    “我不建议避免它,因为你很快就会失去自然语言的流动,”明斯回答说: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次。”

    这样,您就可以编写条件(根据您的实现再次编写伪条件):

    页面计数>1?pageview:string.format(pageviewPlural,pageCount.toString());

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

        4
  •  1
  •   peterchen    17 年前

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

    不仅名词-短语可以改变(例如德语) “1大帝康涅特” / “2” )

    它比回避问题更友好优雅。 “Dateien,死了,2岁” 但是在本地化方面有多少资源需要权衡。