神奇的printf与i18n

这节课我们讲的是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"

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

Copyright © 2008. All Rights Reserved.

发表评论

电子邮件地址不会被公开。 必填项已用*标注