У меня есть сайт, закодированный в 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');
который переведет мой сайт.
Это больше PSEUDO CODE, который иллюстрирует мою идею:
<?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) Поэтому, когда вам нужно перевести sth, вам просто нужен ключ и язык var:
$translate[$keyword][$lang];