Ну, я не использую этот плагин, но должен был сделать то же самое. Я выяснил, что для моих нужд лучшим решением было следующее:
В файле XML я определяю мои строки (этот пример xml/en/content.xml
):
<translations>
<translation id="hello_world"><![CDATA[Hello ##username##!]]></translation>
<translation id="how_are_you"><![CDATA[How are you?]]></translation>
</translations>
В моем классе Localizer
я инициализирую эти переводы и сохраняю их в массиве. Функция translate
получает строку идентификатора от smarty, ищет идентификатор в своих переводах и любой текст ##string##
. Эти ##...##
будут заменены переменными, уже присвоенными smarty.
class Localizer {
private static $translations = array();
public static function init($language) {
$temp_content = simplexml_load_file('xml/' . $language . '/content.xml');
foreach ($temp_content as $key => $value){
self::$translations[(string)$value['id']] = (string)$value;
}
}
public static function translate($params, $name, $smarty) {
$translation = '';
if( ! is_null($name) && array_key_exists($name, self::$translations)) {
// get variables in translation text
$translation = self::$translations[$name];
preg_match_all('/##([^#]+)##/i', $translation, $vars, PREG_SET_ORDER);
// replace with assigned smarty values
foreach($vars as $var) {
$translation = str_replace($var[0], $smarty->getTemplateVars($var[1]), $translation);
}
}
return $translation;
}
}
Теперь вы должны указать smarty, какую функцию он должен использовать. Это может быть ваш index.php
:
include('Localizer.class.php');
Localizer::init('en');
$smarty->registerPlugin('block', 'translate', array('Localizer', 'translate'), true);
Чтобы использовать переводы, сначала я назначаю имя пользователя:
$smarty->assign('username', $username);
В файле шаблона:
{translate}hello_world{/translate}
Надеюсь, это поможет, привет из Австрии:)