Объединение Yii2 Twig Gettext

Здравствуйте!

Подскажите, как объединить Yii2 Twig с хранением переводов в Gettext?

Использую шаблон basic: yiisoft/yii2-app-basic, и расширение для Twig: yiisoft/yii2-twig. После этого шаблоны рендерятся через $this->render(‘about.twig’).

Как к этому прикрутить локализацию через Gettext, что бы иметь возможность использовать {{‘some text’ | trans}} в шаблонах?

Сам себе отвечу, вдруг кому еще понадобится…

  1. Нужно настроить Yii для работы через gettext. Для этого в раздел компонентов нужно добавить



	    'i18n' => [

		    'translations' => [

			    'app*' => [

				    'class' => 'yii\i18n\GettextMessageSource',

				    'basePath' => '@app/messages',

			    ],

		    ],

	    ],




  1. Нужно создать расширение для Twig, проксирующие запросы на первод к системному 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';

	}

}



  1. Подгрузить его в настроки Twig. Для этого в настройках рендера в конфиге прописать созданное расширение:



	    'view' => [

		    'renderers' => [

			    'twig' => [

				    'class' => 'yii\twig\ViewRenderer',

				    'extensions' => [

					    'app\components\Twig_I18n_Extension'

				    ],

			    ],

		    ],

	    ],




  1. Создать каталог messages в корне и создать в нем конфиг для выдирания строк для перевода из кода:



<?php

// messages/config.php

return [

    'sourcePath' => __DIR__ . '/..',

    'messagePath' => __DIR__,

    'languages' => ['ru'],

    'translator' => 'Yii::t',

    'sort' => false,

    'overwrite' => true,

    'removeUnused' => false,

    'except' => [

        '.svn',

        '.git',

        '.gitignore',

        '.gitkeep',

        '.hgignore',

        '.hgkeep',

        '/messages',

	    '/vendor',

	    '/tests',

    ],

    'only' => ['*.php'],

    'format' => 'po',

];



  1. Дальше строки можно выдергивать командой

./yii message/extract messages/config.php

Ну и все дальнейшее по руководству (poedit и т.д.)