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

printf还有别的选择吗?

  •  21
  • ereOn  · 技术社区  · 15 年前

    我需要处理国际化问题,我的翻译字符串格式如下:

    "Hi %1, you are %2." // English
    "Vous êtes %2, bonjour %1 !" // French
    

    在这里 %1 %2 换言之。我可以改变格式,这不是问题。

    我试着用 printf() 但是不能指定参数的顺序,只能指定它们的类型。

    "Hi %s, you are %s"
    "Vous êtes %s, bonjour %s !"
    

    现在无法知道要使用哪个参数来替换 %s : 打印() 先用第一个,然后用下一个。

    有没有别的选择 打印()

    gettext() 不是一个选择。

    4 回复  |  直到 15 年前
        1
  •  25
  •   Ignacio Vazquez-Abrams    15 年前

    波塞克斯 printf() 支持位置参数。

    printf("Hi %1$s, you are %2$s.", name, status);
    printf("Vous êtes %2$s, bonjour %1$s !", name, status);
    
        2
  •  26
  •   paxdiablo    15 年前

    我们所做的只是将错误文本与变量位完全断开,以避免这些问题。例如,我们将生成一个错误:

    XYZ-E-1002 Frobozz not configured for multiple zorkmids (F22, 7).
    

    这使得i18n翻译成为一项极其简单的任务,因为在翻译的时候, 全部的 你不必担心可变位是单数还是复数,是阳性还是阴性,是第一、第二还是第三变位(不管这到底是什么意思)。

    翻译团队只需转换 "Frobozz not configured for multiple zorkmids" 那就容易多了。


    对于那些想看到一个具体例子的人,我从我们的翻译博德那里得到了一些东西(有足够的东西被修改以保护罪犯)。

    在某个时候,有人提交了以下内容:

    The {name} {object} is invalid
    

    哪里 {name} {object} 是对象类型本身(表、文件、文档、存储过程等)。

    对于开发人员的主要语言(可能是唯一的)英语来说,这已经足够简单了,但是当他们翻译成德语/瑞士德语时遇到了一个问题。

    Kundendokument ,格式字符串在两个单词之间有空格是个问题。这主要是因为开发人员试图让这个句子听起来更自然,但不幸的是,基于他们有限的经验,这只是更自然。

    一个更大的问题是“客户存储过程”变成了 gespeichertes Verfahren der Kunden Kunden dokument ,没有办法强加 到上面 {name} {object}

    现在您可以说,一个更聪明的格式字符串可以解决这个问题,但有几个原因会导致错误:

    • 这是一个非常简单的例子,可能还有其他更复杂的例子(我试着举一些例子,但我们的翻译部已经明确表示,他们有更紧迫的工作,而不是屈服于我的每一个突发奇想)。
    • 格式字符串的整个要点是将转换外部化。如果格式字符串本身是特定于翻译目标的,则通过外部化文本几乎没有什么收获。
    • 开发商 不必担心格式字符串 {possible-pre-adjectives} {possible-pre-owner} {object} {possible-post-adjectives} {possible-post-owner} {possible-postowner-adjectives} . 这就是 翻译团队 因为他们了解细微差别。

    The object specified by <parameter 1>, of type <parameter 2>, is invalid.
        Parameter 1 = {name}.
        Parameter 2 = {object}.
    Der sache nannte <parameter 1>, dessen art <parameter 2> ist, ist falsch. 
        Parameter 1 = {name}.
        Parameter 2 = {object}.
    

    上一个翻译是我的,请不要用它来指责我们的翻译质量。毫无疑问,说一口流利的德语会让人开怀大笑。

        3
  •  11
  •   Vinzenz    15 年前

    boost.format 在Python中支持这种方式,但是这是C++的

        4
  •  9
  •   David Allan Finch    15 年前

    "Hi %1$s, you are %2$s."
    

    见下面的德国例子 printf

    达夫