将变量添加到我的语言系统中


Add variables to my language system?

我有这个语言系统:

$lang = include('lang/en.php'); // default language
$lg = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); // detect language
if ($lg == "de") $lang = array_merge($lang, include('lang/de.php')); // load german file and merge
function __($name,$values) 
{
    global $lang;
    return $lang[$name];
}

lang/en.php看起来像这样,例如:

<?php 
return array(  
    'GREET' => 'Hello '.$values[0].', welcome '.$values[1].'!',
?>

现在我正试图使用数组中的变量来输出这个:

$values = array("Max","Home");
echo __('GREET',$values);

这将只输出Hello , welcome !而不是Hello Max, welcome home!

我怎样才能同时输出变量?

语言文件数组中的赋值在包含在脚本中时进行评估。例如,当您编写时

<?php 
return array(  
    'GREET' => 'Hello '.$values[0].', welcome '.$values[1].'!',
?>

如果在PHP解释器看到这一点时,您没有定义$values[0]$values[1],那么在没有这些值的情况下进行计算。即使你已经定义了这些值,你也无法用不同的值再次评估它们。这可能不是你想要的。

我想你是在想象这样的事情:

<?php 
return array(  
    'GREET' => function(array $values) { return 'Hello '.$values[0].', welcome '.$values[1].'!'; },
?>

然后在你的脚本中,你会称之为

$lang[$name]($values);

请注意,通过将函数分配给'GREET'元素(而不是字符串值),我们将延迟求值,直到实际调用为止。此外,当我们现在检索$lang[$name]时——它现在是一个匿名函数——然后我们可以向它传递$values数组,它现在返回新计算的字符串。

然而,顺便说一句,我也想指出的是,通常情况下,翻译并不是这样做的。相反,它们是通过一些简单的字符串替换方案来完成的,例如:

$trans['en']['greet'] = 'Hello %%1%%, welcome %%2%%!';

然后在您的应用程序中有一个转换模块或类,它接受名称和值并进行字符串替换。

您没有将值发送到lang文件,因此它不知道该如何处理这些值。你会得到一个警告,甚至可能是一个例外。

$lang = include('lang/en.php'); // default language
$lg = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); // detect language
if ($lg == "de") $lang = array_merge($lang, include('lang/de.php')); // load german file and merge
function __($name,$values) 
{
    global $lang;
    return $lang[$name, $values];
}