По аналогии с Silex проксировал запрос на перевод к системному \Yii::t, который умеет корректно подгружать файлы с перводами. В итоге получилось такое расширение
namespace app\components;
use Twig_Extension;
use Twig_Extensions_TokenParser_Trans;
use Twig_SimpleFilter;
class Twig_I18n_Extension extends Twig_Extension {
/**
* Translation message context
* @var string
*/
public $category = 'app';
/**
* Returns the token parser instances to add to the existing list.
*
* @return array An array of Twig_TokenParserInterface or Twig_TokenParserBrokerInterface instances
*/
public function getTokenParsers()
{
return array(new Twig_Extensions_TokenParser_Trans());
}
/**
* {@inheritdoc}
*/
public function getFilters()
{
return array(
new \Twig_SimpleFilter('trans', array($this, 'trans')),
);
}
/**
* @param string $category the message category.
* @param string $message the message to be translated.
* @param array $arguments
* @param string $language the language code (e.g. `en-US`, `en`). If this is null, the current
* [[\yii\base\Application::language|application language]] will be used.
* @return string
*/
public function trans($message, array $arguments = [], $category = null, $language = null)
{
if (!$category) {
$category = $this->category;
}
return \Yii::t($category, $message, $arguments, $language);
}
/**
* Returns the name of the extension.
*
* @return string The extension name
*/
public function getName()
{
return 'i18n';
}
}
Настройка рендера стала вот такой:
'view' => [
'renderers' => [
'twig' => [
'class' => 'yii\twig\ViewRenderer',
'extensions' => [
'app\components\Twig_I18n_Extension'
],
],
],
],