我使用伏特模板成功地在Phalcon中为WEB添加了多语言功能。
但是如何在控制器中使用该翻译,以便我可以翻译flash消息。
我的基本控制器:
protected function _t() {
// Get language code
if($this->session->has("lg")) {
$language = $this->session->get("lg");
} else {
// Ask browser what is the best language
$language = $this->request->getBestLanguage();
}
// Check if we have a translation file for that language
if(file_exists(APP_PATH . "app/languages/".$language.".php")) {
require APP_PATH . "app/languages/".$language.".php";
} else {
// Fallback to default language
require APP_PATH . "app/languages/en.php";
}
// Return a translation object
return new \Phalcon\Translate\Adapter\NativeArray(array(
"content" => $t
));
}
然后我把它放在这样的内部:
$this->view->setVar("t", $this->_t());
在内部视图中我可以使用如下翻译:
<?php echo $t->_t('hello') ?>
但是如何在扩展BaseController
的其他控制器中使用它class IndexController extends BaseController {
...
$this->flashSession->error('HOW TO ADD TRANSLATION HERE');
...
}
答案 0 :(得分:4)
如果您感兴趣,这是一种更合适的方法;
首先在DI
中将翻译人员注册为服务// $di initialization
// ...
$di->setShared('trans', function() use($di) {
$session = $di->getShared('session');
$request = $di->getShared('request');
// Get language code
if($session->has("lg")) {
$language = $session->get("lg");
} else {
// Ask browser what is the best language
$language = $request->getBestLanguage();
}
// Check if we have a translation file for that language
if(file_exists(APP_PATH . "app/languages/".$language.".php")) {
require APP_PATH . "app/languages/".$language.".php";
} else {
// Fallback to default language
require APP_PATH . "app/languages/en.php";
}
// Return a translation object
return new \Phalcon\Translate\Adapter\NativeArray(array(
"content" => $t
));
});
// ...
现在你不需要每次调用此行:
$this->view->setVar("t", $this->_t());
在视图中,您可以使用以下翻译:
<?= $trans->_('hello') ?>
最后,您可以从任何控制器(无论是否来自控制器)使用:
class IndexController extends ControllerBase {
$this->flashSession->error($this->trans->_('MY_ERROR_NAME'));
}
此外,我建议您将“基本控制器”命名为ControllerBase
,这不仅是因为Phalcon conventions,而且还可以访问您的“/ base”路径。
答案 1 :(得分:0)
您可以尝试像这样访问父函数
$this->flashSession->error($this->_t()->_('whatever'));
或者如果你想像在模板中一样访问它,你可以在你的子类的_construct方法中添加新的变量
public function _construct() {
$this->t = $this->_t();
}
然后你可以像在模板
中那样做$this->flashSession->error($this->t->_('whatever'));