multilanguage — сделать сайт многоязычным с минимальными изменениями кода

У меня есть сайт, закодированный в 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";

?>

Но это не работает 🙂

Как можно реализовать такой подход?

-1

Решение

Не очень приятно, но делает то, что вы хотите с минимальными начальными усилиями:

$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);
0

Другие решения

Я бы сказал, что использование встроенного 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];
0

По вопросам рекламы [email protected]