• 这节课我们讲的是printf,以php为例。

    <?php
    printf('how %s? $%.2f', 'much', 2.0);
    ?>

    将会输出

    how much, 2.00

    但童鞋们注意了:

    <?php
    printf('how %2$.2f? %1$s', 'much', 2.0);
    ?>

    会得到什么呢?是不是没有看过%1$s这种东西?
    上面那个PHP会得到

    how 2.00? much

    后面的参数倒过来了。%1$s的意思是,当前位置用字符串(s)输出后面的第一个参数。%2$.2f表示在当前位置以两位浮点数输出第二个参数。大家可以多试试。

    为什么要这样捏?不是多此一举吗。
    嗯。这个在i18n里就经常用到了。

    比如输出一个sprintf(_('the %s with %s hat'), _('girl'), _('red'));
    在i18n里面,the %s with %s,应该翻译成“戴着红色帽子的女孩”,可以看到英文和中文对修饰词顺序是不一样的。如果我们这里在po文件里这样写

    msgid "the %s with %s hat"
    msgstr "戴着%s帽子的%s"

    那会得到“戴着女孩帽子的红色”,那就闹笑话了,或是你可以这样写po文件:

    msgid "the %s with %s hat"
    msgstr "%s, 帽子是%s的那个"

    这样得到“女孩, 帽子是红色的那个”,意思是正确了,但“信达雅”中的“雅”就达不到要求了。

    这时候如果我们写成

    in PHP:
    sprintf(_('the %1$s with %2$s hat'), _('girl'), _('red'));

    in PO:
    msgid "the %1$s with %2$s hat"
    msgstr "戴着%2$s帽子的%1$s"

    那一切都变得如此美妙起来。