По умолчанию пустая строка в шаблоне Twig, если перевод не найден

Есть ли способ по умолчанию использовать пустую строку, а не ключ перевода, если перевод не был найден в шаблоне Twig?

Я пытаюсь сделать что-то подобное, используя фильтр default Twig вместе с фильтром trans, но это не работает:

{{ 'crmpicco.general.course.opening_hours_weekend'|default('')|trans }}

person crmpicco    schedule 30.09.2015    source источник
comment
Вы пробовали ставить значение по умолчанию после трансфильтра?   -  person Seer    schedule 30.09.2015
comment
@Seer Да, я пробовал. К сожалению, это не сработает, если поставить default('') в конце после фильтра trans.   -  person crmpicco    schedule 30.09.2015
comment
Если для этого нет решения, которое вы можете найти с помощью встроенных фильтров, вы всегда можете создать свое собственное. Это действительно просто: symfony.com/doc/current/cookbook/templating/ twig_extension.html   -  person Seer    schedule 30.09.2015
comment
@Seer Спасибо за предложение. Я знаком с пользовательскими расширениями Twig, однако я просто писал, чтобы узнать, можно ли это сделать с помощью стандартных функций Twig.   -  person crmpicco    schedule 30.09.2015
comment
Достаточно честно :), я думаю, в таком случае тебе может не повезти!   -  person Seer    schedule 30.09.2015
comment
Не с самим трансфильтром. Переводчик не предназначен для этого.   -  person Emii Khaos    schedule 01.10.2015
comment
@Pazi ツ Я надеялся, что с комбинацией фильтров это станет возможным.   -  person crmpicco    schedule 01.10.2015
comment
К сожалению нет. В каталоге сообщений жестко запрограммирован возврат идентификатора, если перевод не найден. Но вы можете перезаписать фильтр веточки   -  person Emii Khaos    schedule 01.10.2015


Ответы (4)


Вы можете заменить расширение перевода своим собственным, чтобы фильтры trans и transchoice вели себя так, как вы хотите:

<?php
// src/AppBundle/Twig/EmptyTranslationExtension.php

namespace AppBundle\Twig;

use Symfony\Bridge\Twig\Extension\TranslationExtension;

class EmptyTranslationExtension extends TranslationExtension
{
    public function trans($message, array $arguments = [], $domain = null, $locale = null)
    {
        $value = parent::trans($message, $arguments, $domain, $locale);

        return ($message === $value) ? '' : $value;
    }

    public function transchoice($message, $count, array $arguments = [], $domain = null, $locale = null)
    {
        $value = parent::transchoice($message, $count, array_merge(['%count%' => $count], $arguments), $domain, $locale);

        return ($message === $value) ? '' : $value;
    }
}

И зарегистрируйте свое расширение как замену расширению по умолчанию:

# app/config/services.yml

services:
    twig.extension.trans:
        class: AppBundle\Twig\EmptyTranslationExtension
        public: false
        arguments:
            - @translator
        tags:
            - { name: twig.extension }
person Emii Khaos    schedule 01.10.2015

Этот способ работает, но это не оптимальное решение:

{% set trans_key = 'crmpicco.general.course.opening_hours_weekend' %}
{% set trans_value = trans_key | trans %}

{{ trans_key == trans_value ? '' : trans_value }}
person pabgaran    schedule 30.09.2015
comment
Спасибо за ответ, скорее всего, это будет не очень удобно для шаблона, где есть несколько переводов. - person crmpicco; 30.09.2015

Эта часть работает для меня:

{{ crmpicco.general.course.opening_hours_weekend == '' ? '' : crmpicco.general.course.opening_hours_weekend|trans() }}
person busy    schedule 04.01.2019

это даже проще, чем это. вы можете просто преобразовать тип в строку, объединив ее со строкой.

{{ null ~ ''|trans }}

но при наличии выбора было бы лучше использовать чистые данные. или исправление в расширении перевода

person scones    schedule 17.06.2020