使用 KnpMenuBundle 和 Symfony3 的菜单项的翻译参数
Translation parameters for menu items using KnpMenuBundle and Symfony3
简介
在我的个人项目中我使用:
- XAMPP 与 PHP
v7.1.6
- Symfony
v3.3.6
- KnpMnenuBundle
dev-master / 2.2.x-dev
[link 1], [link 2], [link 3] 以便管理菜单。
- Bootstrap
v3.3.7
- Bootstrap 和 KnpMenuBundle 集成 [link 4]
正在设置
为了设置,我使用了 [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
集成的情况下传递它们。
结论
请指教
感谢您的时间和知识。
您可以像这样将 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 版本与你不同,所以也许这段代码不能直接工作,但你只需要适应你的需要
有不清楚的可以提问
希望对您有所帮助,如果是,请将 post 标记为已解决! :)
简单回答你的问题
简单翻译传给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
.
中的构造函数来获得它
添加多个子菜单
为了完整起见,我还要注意每个子菜单必须有不同的名称。因此,如果您想创建多个具有不同参数的菜单,请确保不要 copy/paste 第一行不更改菜单名称。
或者使用这样的东西:
$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);
一个特定选项 extras.translation_params
可用但未记录:
https://github.com/KnpLabs/KnpMenuBundle/blob/master/src/Resources/views/menu.html.twig#L7
您可以像使用 translation_domain
选项一样使用它:
$menu['Profile']->setChildrenAttribute("class", "dropdown-menu")
->addChild('Logged in as', array('label' => 'layout.logged_in_as'))
->setExtra('divider_append', true)
->setExtra('translation_domain', 'FOSUserBundle')
->setExtra('translation_params', ['%username%' => $user->getUsername()]);
简介
在我的个人项目中我使用:
- XAMPP 与 PHP
v7.1.6
- Symfony
v3.3.6
- KnpMnenuBundle
dev-master / 2.2.x-dev
[link 1], [link 2], [link 3] 以便管理菜单。 - Bootstrap
v3.3.7
- Bootstrap 和 KnpMenuBundle 集成 [link 4]
正在设置
为了设置,我使用了 [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
集成的情况下传递它们。
结论
请指教
感谢您的时间和知识。
您可以像这样将 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 版本与你不同,所以也许这段代码不能直接工作,但你只需要适应你的需要
有不清楚的可以提问
希望对您有所帮助,如果是,请将 post 标记为已解决! :)
简单回答你的问题
简单翻译传给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
.
添加多个子菜单
为了完整起见,我还要注意每个子菜单必须有不同的名称。因此,如果您想创建多个具有不同参数的菜单,请确保不要 copy/paste 第一行不更改菜单名称。
或者使用这样的东西:
$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);
一个特定选项 extras.translation_params
可用但未记录:
https://github.com/KnpLabs/KnpMenuBundle/blob/master/src/Resources/views/menu.html.twig#L7
您可以像使用 translation_domain
选项一样使用它:
$menu['Profile']->setChildrenAttribute("class", "dropdown-menu")
->addChild('Logged in as', array('label' => 'layout.logged_in_as'))
->setExtra('divider_append', true)
->setExtra('translation_domain', 'FOSUserBundle')
->setExtra('translation_params', ['%username%' => $user->getUsername()]);