Трансляция даты

Я использую расширение Twig Date для получения рабочего времени_дифф.

{{ photo.getCreationDate|time_diff }}

Я хочу сделать это многоязычным. Я прочитал документы, он говорит

Чтобы получить переводный вывод, дайте Symfony\Component\Translation\TranslatorInterface как конструктор аргумент. Возвращаемая строка форматируется как diff.ago.XXX или diff.in.XXX, где XXX может быть любой действующей единицей: секундой, минутой, часом, день, месяц, год.

Я не уверен, как это сделать, но похоже, что это не работает для меня.

То, как я пытался в своем контроллере.

$twig = new Twig_Environment (новый TranslatorInterface()); $ twig- > addExtension (новый Twig_Extensions_Extension_Date());

Я получаю следующую ошибку

Ошибка: невозможно создать интерфейс Symfony\Component\Translation\TranslatorInterface

Конструктор Twig_Environment ожидает объект Twig_LoaderInterface, а не TranslatorInterface.

Как это сделать, чтобы позволить мне переводить вывод time_diff?

Спасибо

Ответ 1

Что вы читаете, это документация Twig, а не Symfony2, даже если оба сделаны SensioLabs.

Если вы используете полнофункциональную инфраструктуру Symfony, Symfony\Component\Translation\TranslatorInterface уже определен как аргумент конструктора вашего расширения Twig.

Чтобы убедиться, посмотрите файл, расположенный по адресу \vendor\twig\extensions\lib\Twig\Extensions\Extension\date.php

Вы должны увидеть что-то вроде этого:

*\vendor\twig\extensions\lib\Twig\Extensions\Extension\date.php*

<?php

/**
 * This file is part of Twig.
 *
 * (c) 2014 Fabien Potencier
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
use Symfony\Component\Translation\TranslatorInterface;

/**
 * @author Robin van der Vleuten <[email protected]>
 */
class Twig_Extensions_Extension_Date extends Twig_Extension
{
    public static $units = array(
        'y' => 'year',
        'm' => 'month',
        'd' => 'day',
        'h' => 'hour',
        'i' => 'minute',
        's' => 'second',
    );

    /**
     * @var TranslatorInterface
     */
    private $translator;

    /**
     * Constructor.
     *
     * @param TranslatorInterface $translator A TranslatorInterface instance.
     */
    public function __construct(TranslatorInterface $translator = null)
    {
        $this->translator = $translator;
    }

// etc.

Если это то, что у вас есть на вашей стороне, тогда вам нужно сделать сам перевод.

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

Сначала добавьте этот аргумент в расширение Twig в ваших services.yml:

*services.yml*

twig.extension.date:
    class: Twig_Extensions_Extension_Date
    arguments: ["@translator"] // careful of quotes
    tags:
        - { name: twig.extension }

Затем создайте "date.fr.xliff" в папке \app\Resources\translations. Адаптируйте местоположение, если вы работаете в своем собственном комплекте, то есть другом AppBundle. Конечно, в зависимости от языка, который вы ищете, адаптируйте "fr" (например, "de", "es"...). Почему расширение ".xliff"? Конечно, вы можете создать файл ".yml", например. Но использование ".xliff" позволяет вам воспользоваться тем, что я вам предлагаю.

Затем, если я продолжу пример с французским переводом, откройте файл "date.fr.wliff" и скопируйте/вставьте перевод, предоставляемый KnpTimeBundle.

Не забудьте очистить кэш-память dev, если вам нужно.

Если вы хотите, чтобы перевод проходил в шаблоне Twig, просто используйте фильтр, не меняя ничего (не пытайтесь добавить второй фильтр "| trans" ):

{{ user.createdAt|time_diff }}

Конечно, замените "user.createdAt" тем, что вам там нужно.

Если вы хотите, просто реализуйте KnpTimeBundle в своем приложении, чтобы сделать все это для вас. В противном случае, я полагаю, что вам нужно скопировать/вставить файлы перевода, предоставленные KnpTimeBundle, на огромное количество разных языков, просто позаботьтесь о замене имени файла "time.fr.xliff" на "date.fr.xliff", который необходим для расширения Twig, доступного в пакете Symfony2.

Ответ 2

Для тех, кто использует Symfony4, вам нужно раскомментировать строку в файле config/packages/twig_extensions.yaml:

services:
    _defaults:
        public: false
        autowire: true
        autoconfigure: true

    #Twig\Extensions\ArrayExtension: ~
    Twig\Extensions\DateExtension: ~
    #Twig\Extensions\IntlExtension: ~
    #Twig\Extensions\TextExtension: ~

Тогда вам нужно будет добавить переводы, как @Mexcanoon, упомянутый в его ответе. Или просто используйте KnpTimeBundle. Убедитесь, что вы очистили кэш для загрузки новых переводов.