向我的语言系统添加变量?
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!
我怎样才能同时输出变量?
您没有将这些值发送到 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];
}
您的语言文件数组中的分配在它们包含在您的脚本中时进行评估。例如,当你写
<?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
数组传递给它,现在 returns 新评估的字符串。
但是,附带说明一下,我还想指出通常翻译不是这样完成的。相反,它们是由一些简单的字符串替换方案完成的,例如:
$trans['en']['greet'] = 'Hello %%1%%, welcome %%2%%!';
然后在您的应用程序中,您有一个翻译模块或 class 获取名称和值并进行字符串替换。
我有这个语言系统:
$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!
我怎样才能同时输出变量?
您没有将这些值发送到 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];
}
您的语言文件数组中的分配在它们包含在您的脚本中时进行评估。例如,当你写
<?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
数组传递给它,现在 returns 新评估的字符串。
但是,附带说明一下,我还想指出通常翻译不是这样完成的。相反,它们是由一些简单的字符串替换方案完成的,例如:
$trans['en']['greet'] = 'Hello %%1%%, welcome %%2%%!';
然后在您的应用程序中,您有一个翻译模块或 class 获取名称和值并进行字符串替换。