我有一个函数language($tag)
,它需要一个文件lang.php
,其中包含一个名为$lang
的数组,其中包含一些参数。特别是字符串$lang['message']
。在一些执行行之后,它返回$lang['message']
。
$lang数组的定义如下:
$lang[$tag] = array(
'message' => 'This is a message',
...
);
现在假设我想在$lang['message']
中设置我应该能够在language($tag, $parameters)
中定义的参数。这些参数应该在$lang['message']
中设置一个变量,例如:
$lang[$tag] = array(
'message' => 'This is a '. $1,
...
);
如何组织language($tag, $parameters)
,使$parameters
中的内容在$lang['message']
中设置$1
?
如果你不明白,我希望能够调用language($tag, 'post')
并使其返回'This is a post'
。
如何将字符串保存为printf
模板,例如
$lang[$tag] = array(
'message' => 'This is a %s'
);
您可以使用vsprintf
传递一个值替换数组,例如
function language($tag, array $values)
{
// get $lang from somewhere
return vsprintf($lang[$tag]['message'], $values);
}
一个解决方案是使用sprintf()
。
'message' => 'This is a %s',
你就像这样使用它:
sprintf($lang['message'], 'post');
请阅读sprintf()
的手册页,以了解其众多功能。
我可能会用sprintf()作为我的语言函数。
解决方案可能是这样的:
$lang = array(
'stop' => 'Stop right there!',
'message' => 'This is a %s',
'double_message' => 'This is a %s with %s comments',
...
);
:
function language()
{
$lang = get_lang_from_file(); // You probably have the idea
$params = func_get_args();
if(count($params) == 1)
return $lang[$params[0]];
$params[0] = $lang[$params[0]];
return call_user_func_array("sprintf", $params);
}
你可以这样使用:
echo language('stop'); // outputs 'Stop right there!'
echo language('message', 'message for you'); // outputs 'This is a message for you'
echo language('double_message', 'message for you', '6'); // outputs 'This is a message for you with 6 comments