Voyage
# cat /dev/brain | grep "since 1983" | future
-
神奇的printf与i18n - [学有所知·Thinking]
2008-06-04
这节课我们讲的是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"那一切都变得如此美妙起来。
共1页
