我正在使用集中式语言系统开发多语言应用程序。它基于每种语言的语言文件和一个简单的辅助函数:
en.php
$lang['access_denied'] = "Access denied.";
$lang['action-required'] = "You need to choose an action.";
...
return $lang;
language_helper.php
...
function __($line) {
return $lang[$line];
}
到目前为止,所有字符串都是发送给当前用户的系统消息,因此我总是可以这样做。现在,我需要创建其他消息,其中字符串应取决于动态值。例如,在模板文件中,我想回显操作点的数量。如果用户只有 1 分,它应该回显“你有 1 分。”;但是对于零分或超过 1 分,它应该是“你有 12 分”。
出于替换目的(字符串和数字),我创建了一个新函数
function __s($line, $subs = array()) {
$text = $lang[$line];
while (count($subs) > 0) {
$text = preg_replace('/%s/', array_shift($subs), $text, 1);
}
return $text;
}
调用函数看起来像__s('current_points', array($points))
.
$lang['current_points']
在这种情况下是"You have %s point(s)."
,效果很好。
更进一步,我想摆脱“(s)”部分。所以我创建了另一个函数
function __c($line, $subs = array()) {
$text = $lang[$line];
$text = (isset($sub[0] && $sub[0] == 1) ? $text[0] : $text[1];
while (count($subs) > 0) {
$text = preg_replace('/%d/', array_shift($subs), $text, 1);
}
return $text;
}
调用函数看起来仍然像__s('current_points', array($points))
.
$lang['current_points']
现在是array("You have %d point.","You have %d points.")
。
我现在如何结合这两个功能。例如,如果我想打印用户名和分数(比如排名)。函数调用类似于being __x('current_points', array($username,$points))
。$lang['current_points']
array("$s has %d point.","%s has %d points.")
我尝试使用preg_replace_callback()
,但无法将替代值传递给该回调函数。
$text = preg_replace_callback('/%([sd])/',
create_function(
'$type',
'switch($type) {
case "s": return array_shift($subs); break;
case "d": return array_shift($subs); break;
}'),
$text);
显然,$subs 没有定义,因为我收到“内存不足”错误,就好像函数没有离开 while 循环一样。
谁能指出我正确的方向?可能有一种完全不同(更好)的方法来解决这个问题。另外,我仍然想像这样扩展它:
$lang['invite_party'] = "%u invited you to $g party.";
应该成为Adam invited you to his party."
男性和"Betty invited you to her party."
女性。两者的传递$subs
值$u
和$g
将是一个用户对象。