我正在从干净的php视图迁移到smarty,我在将以下模板转换为smarty时遇到了问题:
<?php
use \framework\core;
?>
<h1><?= Core::translate('some string to translate'); ?></h1>
所以我想使用一些通过自动加载器加载的类,然后使用它的translate方法。我怎么能聪明地做到这一点?
答案 0 :(得分:1)
这就是我在一个使用Smarty API扩展的旧项目中执行相同任务的方式:
// register additional smarty modifiers for I18N
$this->smarty->register_block("translate", array($this, "smarty_i18n_translate"));
// better alias
$this->smarty->register_block("_", array($this, "smarty_i18n_translate"));
// translation function
public function smarty_i18n_translate($params, $content, &$smarty, &$repeat)
{
if (isset($content))
{
if (isset($params['resourceID']))
{
$resourceID = $params['resourceID'];
unset($params['resourceID']);
}
else
$resourceID = NULL;
// setting context vars if specified
foreach ($params as $key => $val)
{
$this->setContextVar($key, $val);
}
// Core::translate($content); ?
return $this->translate($content, $resourceID);
}
return '';
}
这允许在视图中写入(我使用{?
作为智能标记分隔符):
<span class="label">{?_?}Operation type{?/_?}:</span>
一个注意事项:这是针对一些非常古老的Smarty版本,他们可能已经更改了API的细节,但似乎register
方法仍然存在。
在文档中,有同样的问题,例如:http://www.smarty.net/docsv2/en/api.register.block.tpl
答案 1 :(得分:0)
尝试这种逻辑/方式,希望你可能会有所了解......
<?php
$my_obj = new MyClass();
$smarty->left_delimeter('{{');
$smarty->right_delimeter('}}');
$smarty->assign('my_obj', $my_obj);
$smarty->display('your.html');
?>
然后在你的HTML上
<h1>{{ $my_obj->translate('some string to translate'); }}</h1>