Параметры перевода для пунктов меню с использованием KnpMenuBundle и Symfony3

Вступление

В моем личном проекте я использую:

Настройка

Для настройки я использовал документацию в [2], [3] и примеры кода [4]. Мое меню работает, интеграция между Bootstrap а также KnpMenuBundle тоже работает.

В данный момент

Пакет меню работает нормально, просто переводные работы и интеграционные работы тоже.

мой ProfileMenu Пример кода:

public function profileMenu(array $options)
{
$menu = $this->factory->createItem('root');
$menu->setChildrenAttribute('class', 'nav navbar-nav navbar-right');

$menu->addChild('Profile', array('label' => 'menu.profile'))
->setExtras(array('dropdown' => true, 'icon' => 'fa fa-user'))
->setLinkAttribute('class', "dropdown-toggle")
->setLinkAttribute('data-toggle', "dropdown")
->setExtra('translation_domain', 'menu');

$menu['Profile']->setChildrenAttribute("class", "dropdown-menu")
->addChild('Logged in as', array('label' => 'layout.logged_in_as'))
->setExtra('divider_append', true)
->setExtra('translation_domain', 'FOSUserBundle');

$menu['Profile']->setChildrenAttribute("class", "dropdown-menu")
->addChild('My data', array('label' => 'menu.profile.myData', 'route' => 'fos_user_profile_show'))
->setExtra('translation_domain', 'menu');
$menu['Profile']->setChildrenAttribute("class", "dropdown-menu")
->addChild('Edit data', array('label' => 'menu.profile.editMyData', 'route' => 'fos_user_profile_edit'))
->setExtra('translation_domain', 'menu');
$menu['Profile']->setChildrenAttribute("class", "dropdown-menu")
->addChild('Change password', array('label' => 'menu.profile.changePassword', 'route' => 'fos_user_change_password'))
->setExtra('translation_domain', 'menu');

$menu['Profile']->setChildrenAttribute("class", "dropdown-menu")
->addChild('Exit', array('label' => 'menu.profile.logout', 'route' => 'fos_user_security_logout'))
->setExtra('divider_prepend', true)
->setExtra('translation_domain', 'menu');

return $menu;
}

рендеринг меню показан на следующем изображении

отображение меню

Вопрос

Как я могу передать параметры перевода (а именно %username%) в меню (питание от KnpMenuBundle) и заставить его отображать как задумано?

Как можно привести аргументы:

|trans({'%username%': app.user.username}

в MenuBuilder?

МОЙ КОД

Блок кода в вопросе

$menu['Profile']->setChildrenAttribute("class", "dropdown-menu")
->addChild('Logged in as', array('label' => 'layout.logged_in_as'))
->setExtra('divider_append', true)
->setExtra('translation_domain', 'FOSUserBundle');

а именно label строка

Переводя строки с параметрами обычно, можно привести аргументы, например, так:

<li><a href="#">{{ 'layout.logged_in_as'|trans({'%username%': app.user.username}, 'FOSUserBundle') }}</a></li>

Тем не менее, я не могу понять, как пройти их в случае использования KnpMenuBundle а также Bootstrap интеграция.

Заключение

Пожалуйста, порекомендуйте.

Спасибо за ваше время и знания.

0

Решение

Вы можете объявить свой MenuBuilder как сервис как этот

#services.yml
app.menu_builder:
class: AppBundle\Menu\MenuBuilder
arguments:
- @knp_menu.factory
- @security.token_storage
- @translator.default

Обновить MenuBuilderконструктор по зависимостям от приведенного выше определения

Благодаря этому у вас есть доступ ко всем вещам, которые вам необходимы для выполнения традукции

$user = $this->tokenStorage->getToken()->getUser(); // If you are under a path protect by security.yml access_constrol
$yourLoggedInTraduction = $this->translator->trans(
'layout.logged_in_as', [
'%username%' => $user->getUsername()
],
'FOSUserBundle',
'yourlocale'
);
dump($yourLoggedInTraduction);

Вы должны иметь свою тягу, а затем сопоставить ее с вашим profileMenu(...) функциональная логика

Я не использую ту же версию symfony / knpMenu, чем вы, поэтому, возможно, этот код не будет работать напрямую, но вам просто нужно адаптироваться к вашим потребностям

Задайте вопрос, если хотите, если неясно

Я надеюсь, что помог вам, если да, пожалуйста, отметьте этот пост как решенный! 🙂

2

Другие решения

Просто переведите метку, переданную addChild:

$label = $this->translator->trans('layout.logged_in_as', ['%user%' => $username ]);
$menu->addChild('Logged in as', array('label' => $label);

$this->translator это \Symfony\Component\Translation\TranslatorInterface который вводится в сервис, создающий меню. Я получил это мимоходом "@translator" в качестве аргумента для конструктора в services.yml,

Для полноты картины я также отмечу, что у каждого дочернего меню должно быть свое имя. Поэтому, если вы хотите создать несколько меню с разными параметрами, убедитесь, что вы не копируете / вставляете первую строку, не изменяя также имя меню.

Или используйте что-то вроде этого:

$idx = 0;
$menu->addChild("Language_".$idx++, array('label' => $label_lang1);
$menu->addChild("Language_".$idx++, array('label' => $label_lang2);

Или, если все дочерние меню создаются в одном файле:

$menu->addChild("Language_".__LINE__, array('label' => $label_lang1);
$menu->addChild("Language_".__LINE__, array('label' => $label_lang2);

Если вы не используете разные имена, отображается только последнее меню.

При использовании вышеуказанного решения панель инструментов Symfony и журнал сообщают о предупреждениях о пропущенных сообщениях. Это связано с тем, что указанная метка не может быть найдена в домене перевода (в messages.yml или что вы используете для своих переводов).

Чтобы избежать ложных срабатываний, добавьте следующую строку после addChild вызов:

$menu->addChild('Logged in as', array('label' => $label)
->setExtra('translation_domain', false);
0

По вопросам рекламы [email protected]