Я успешно добавил мультиязычные способности в 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');
...
}
Вот более подходящий подход, если вам интересно;
Сначала зарегистрируйте ваш переводчик как услугу в вашем 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».
Вы можете попытаться получить доступ к родительской функции, как это
$this->flashSession->error($this->_t()->_('whatever'));
или если вы хотите получить к нему доступ как в шаблоне, вы можете добавить новую переменную в метод _construct вашего дочернего класса
public function _construct() {
$this->t = $this->_t();
}
тогда вы можете сделать это как в шаблоне
$this->flashSession->error($this->t->_('whatever'));