控制器内的Phalcon翻译

时间:2014-11-21 15:21:01

标签: php localization phalcon

我使用伏特模板成功地在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');
   ...
}

2 个答案:

答案 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'));