0

我一直在制作多语言脚本。我已经让它完美地工作了,有一个带有语言变量的数组。每种语言都有自己的带有变量的文件。脚本根据用户选择的语言决定加载哪个文件。

这是我在每个语言文件中的内容:

$lang = array();
$lang['var1'] = "Some text here";
$lang['var2'] = "Some text here";
...
$lang['var20'] = "Some text here";

现在我想让它更加动态并包含参数。我在 vBulletin 语言模板中看到了,有这样的:text text text {1} text text text {2} text text.

我想要这个文本:Hello {1}, this is the User CP。该参数应该是动态的,每个用户都不同。

这该怎么做?

4

3 回答 3

1

这取决于您想如何使用它,但是您可以做的例如是使用printfsprintf输出:

语言文件:

$lang['varxx'] = 'Hello %s, this is the User CP';

使用它的脚本:

$name = "test user";
printf($lang['varxx'], $name);
$modified_string = sprintf($lang['varxx'], $name);
于 2012-06-29T20:54:36.020 回答
0

通常使用包装函数。如果您到目前为止一直$lang直接访问数组,则必须适应。

这样做非常简单:

 function t ($textid) {

      $text = $GLOBALS["lang"][$textid];
      $args = func_get_args();

      $text = preg_replace('#\{(\d+)\}#e', '$args[$1]', $text);

      return $text;
 }

不过,您可以使用另一种模式方案来避开正则表达式。

用法很简单:

 print t("var1", "placeholder", ...);
于 2012-06-29T20:57:03.703 回答
0
$lang = array();
$lang['var1'] = "Hello %1$s, here's a %2$s";
echo vsprintf($lang['var1'], array("John", "cookie"));

输出:

Hello John, here's a cookie

更多关于sprintfvsprintf

于 2012-06-29T20:58:00.477 回答