@matperez

Как прикрутить Gettext к шаблонам Twig в YII2?

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

Подскажите как прикрутить локализацию через Gettext к шаблонам Twig в Yii2?

Установил через composer yiisoft/yii2-app-basic, добавил yiisoft/yii2-twig. Добавил в конфиг:
'view' => [
		    'renderers' => [
			    'twig' => [
				    'class' => 'yii\twig\ViewRenderer',
				    'extensions' => [
					    'Twig_Extensions_Extension_I18n'
				    ],
			    ],
		    ],
	    ],


Шаблонизатор работает, можно рендерить через $this->render('someaction.twig');

Так же поправил MessageSource в конфиге, что бы Yii::t использовал PO файлы для хранения переводов.

'i18n' => [
		    'translations' => [
			    'app*' => [
				    'class' => 'yii\i18n\GettextMessageSource',
				    'basePath' => '@app/messages',
				    'sourceLanguage' => 'en-US',
			    ],
		    ],
	    ],


Как теперь прикрутить Gettext именно к Twig, что бы можно было пользоваться {{'some text'| trans}} в шаблонах? Доку по твигу читал twig.sensiolabs.org/doc/extensions/i18n.html, но не смог реализовать.

В silex это как-то так было:
$app->register(new Silex\Provider\TranslationServiceProvider(), array(
	'locale_fallbacks' => array('ru'),
));
$app['translator'] = $app->share($app->extend('translator', function($translator, $app) {
	$translator->addLoader('po', new PoFileLoader());
	$translator->addResource('po', __DIR__.'/../po/messages.en.po', 'en');
	return $translator;
}));
$app['twig']->addExtension(new Symfony\Bridge\Twig\Extension\TranslationExtension($app['translator']));
$app->before(function () use ($app) {
	$app['locale'] = 'ru';
});


//upd

Добавил в зависимости "twig/extensions": "~1.1" и поправил конфиг для загрузки расширения Twig_Extensions_Extension_I18n. {{'translate me' | trans}} выводит пустоту теперь, но функция известна.

Еще вопрос, как заставить его грузить переводы из заданного *.po файла?
  • Вопрос задан
  • 3528 просмотров
Решения вопроса 1
@matperez Автор вопроса
По аналогии с 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'
				    ],
			    ],
		    ],
	    ],
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы