Перевод Phalcon внутри контроллера

Я успешно добавил мультиязычные способности в WEB в Phalcon, используя шаблон вольт.

Но как я могу использовать этот перевод в контроллере, чтобы я мог переводить флэш-сообщения.

Мой базовый контроллер:

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

Решение

Вот более подходящий подход, если вам интересно;

Сначала зарегистрируйте ваш переводчик как услугу в вашем 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не только потому, что Соглашения Фалкона но также можно получить доступ к вашему пути «/ base».

4

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

Вы можете попытаться получить доступ к родительской функции, как это

$this->flashSession->error($this->_t()->_('whatever'));

или если вы хотите получить к нему доступ как в шаблоне, вы можете добавить новую переменную в метод _construct вашего дочернего класса

public function _construct() {
$this->t = $this->_t();
}

тогда вы можете сделать это как в шаблоне

$this->flashSession->error($this->t->_('whatever'));
0

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