Php-使站点多语言,代码更改最少

Php-使站点多语言,代码更改最少,php,multilingual,translate,Php,Multilingual,Translate,我有一个用php编写的网站。它使用如下结构 print "$x $y at {$SERVER['HTTP_HOST']}"; 现在我想让我的网站多语言,但我想在代码中使用最小的更改,以便能够编写类似 //my translation array - I select all such lines in one place //IMPORTANT: $x, $y and $SERVER['HTTP_HOST'] are not defined yet. //This templates sho

我有一个用php编写的网站。它使用如下结构

print "$x $y at {$SERVER['HTTP_HOST']}";
现在我想让我的网站多语言,但我想在代码中使用最小的更改,以便能够编写类似

//my translation array - I select all such lines in one place
//IMPORTANT: $x, $y and $SERVER['HTTP_HOST'] are not defined yet. 
//This templates should be defined before the code.
$lang = array(
    'message'=>'$x $y at {$SERVER['HTTP_HOST']}';
);
translate('message');
这将翻译我的网站

这是更多说明我想法的伪代码:

<?php
error_reporting(E_ALL);

///////////////////////translation
//my translation array. 
//IMPORTANT: $x, $y and $SERVER['HTTP_HOST'] are not defined yet.
//This templates should be defined before the code.

$_SERVER['HTTP_HOST']=='localhost';

$lang = array(
    'message'=>"$x $y at {$_SERVER['HTTP_HOST']}",
);

function translate($v){
    //hmmm. All magic is doing here - but I do not know how :)
    global $lang;
    $tpl = $lang[$v];
    print $tpl;
    eval("\$tpl = \"$tpl\";");
    print $tpl;
}


////////////////////////start main work
$x = 'hello';
$y = 'world';

print $lang['message'];
translate("message");
//I want to print "hello world at localhost";

$y = 'world2';

translate("message");
//I want to print "hello world2 at localhost";

$lang['message'] = 'only $x';
translate("message");
//I want to print "only hello";

?>

不是很好,但只需最少的初始努力即可实现您的目标:

$lang = array(
    'en'=>"$x $y at {$_SERVER['HTTP_HOST']}",
    'it'=>"$x $y italiano {$_SERVER['HTTP_HOST']}",
    // whatever other language
);

function translate($v, array $lang){
    if (array_key_exists($v, $lang)) {
        return $lang[$v];
    } else {
        throw new Exception('Invalid language');
    }
}

echo translate('it', $lang);

我想说的是,如果您想扩展翻译功能,那么使用内联php数组进行翻译(如您所建议的)将导致一个大混乱

我使用的基本方法如下:

1) 保留一个“翻译”表,该表将类似于:

Keyword | English | German | ...
hello   | hello   | hallo  | ...
2) 然后在页面加载时,从数据库中获取它们并创建一个翻译数组,如下所示:

$translate = array(
    'hello'=> array ("English"=>"hello", "German"=>"hallo"),
    'next_translation'=> array ("English"=>"...", "German"=>"..."),
    ....
);
3) 使用当前语言(即“英语”)维护$lang变量

4) 因此,每当你需要翻译某物时,你只需要钥匙和语言变量:

$translate[$keyword][$lang];

关于
gettext
?关于“想在代码中使用最小的更改,以便能够编写类似的东西”如何?使用google translate for Website顺便说一下:你真的不需要$lang作为全局语言,但它不起作用-请清楚地解释什么不起作用..我知道如何生成$translate[$keyword][$lang]。但问题是,使用它不是为了逐字翻译,而是为了更困难的事情,比如
$translate[$keyword][$lang]=“{$\u服务器['HTTP\u HOST']}”
上的$x$y,我想在描述变量$x和$y之前使用这样的模板。问题是,我想在{$\u服务器上使用类似于
“$x$y”的语言翻译['HTTP_HOST']}',
在描述变量$x和$y之前。