Symfony 2.8:如何本地化页面名称在变量中的 URL?
Symfony 2.8: how to localize URLs where the page name is in a variable?
我正在维护一个用 Symfony 2.8 开发的项目。其中,除了业务逻辑部分,还有几个静态页面,原开发者在控制器中创建一个方法来处理它们:
/**
* @Route("/{page}/", name="pagina")
*/
public function pagesAction(Request $request, $page)
{
if (!$this->get('templating')->exists('default/'. $page . '.html.twig')) {
throw new NotFoundHttpException();
}
return $this->render('default/' . $page . '.html.twig');
}
然后在 routing.yml
中添加:
pages:
path: /{page}/
defaults: { _controller: AppBundle:Default:pages }
现在我需要对这些静态页面 URL 进行本地化,我想知道该怎么做。我可以在 HTML 模板中手动生成 URL:
<a href="/{{ app.request.locale }}/{{ 'static_page'|trans }}">
但是我需要几个不同的静态 HTML 模板,其中包含每个本地化页面的名称:
pagina_estatica.html.twig
static_page.html.twig
等我宁愿每个静态页面都有一个 HTML 模板,即使其中的内容已本地化。
该应用程序使用 JMSTranslationBundle 来翻译 Twig 模板中的字符串。我可以从控制器内部访问 JMS 翻译文件,以便从其翻译中获取规范的 $page
名称吗?还有其他方法可以解决这个问题吗?
有多种方法可以解决这个问题,但我认为最简单的解决方案是在您的控制器中实现某种映射。
您可以轻松地将 switch case 导出到服务或静态方法,以便在不同的地方使用它。
在示例中我引入了一个新变量$templateFile
以使其更清晰。
/**
* @Route("/{page}/", name="pagina")
*/
public function pagesAction(Request $request, $page)
{
// translated page name to template mapping
switch($page){
case 'pagina_estatica':
$templateFile = 'static_page';
break;
default:
$templateFile = $page;
}
if (!$this->get('templating')->exists('default/'. $templateFile . '.html.twig')){
throw new NotFoundHttpException();
}
return $this->render('default/' . $templateFile . '.html.twig');
}
我正在维护一个用 Symfony 2.8 开发的项目。其中,除了业务逻辑部分,还有几个静态页面,原开发者在控制器中创建一个方法来处理它们:
/**
* @Route("/{page}/", name="pagina")
*/
public function pagesAction(Request $request, $page)
{
if (!$this->get('templating')->exists('default/'. $page . '.html.twig')) {
throw new NotFoundHttpException();
}
return $this->render('default/' . $page . '.html.twig');
}
然后在 routing.yml
中添加:
pages:
path: /{page}/
defaults: { _controller: AppBundle:Default:pages }
现在我需要对这些静态页面 URL 进行本地化,我想知道该怎么做。我可以在 HTML 模板中手动生成 URL:
<a href="/{{ app.request.locale }}/{{ 'static_page'|trans }}">
但是我需要几个不同的静态 HTML 模板,其中包含每个本地化页面的名称:
pagina_estatica.html.twig
static_page.html.twig
等我宁愿每个静态页面都有一个 HTML 模板,即使其中的内容已本地化。
该应用程序使用 JMSTranslationBundle 来翻译 Twig 模板中的字符串。我可以从控制器内部访问 JMS 翻译文件,以便从其翻译中获取规范的 $page
名称吗?还有其他方法可以解决这个问题吗?
有多种方法可以解决这个问题,但我认为最简单的解决方案是在您的控制器中实现某种映射。
您可以轻松地将 switch case 导出到服务或静态方法,以便在不同的地方使用它。
在示例中我引入了一个新变量$templateFile
以使其更清晰。
/**
* @Route("/{page}/", name="pagina")
*/
public function pagesAction(Request $request, $page)
{
// translated page name to template mapping
switch($page){
case 'pagina_estatica':
$templateFile = 'static_page';
break;
default:
$templateFile = $page;
}
if (!$this->get('templating')->exists('default/'. $templateFile . '.html.twig')){
throw new NotFoundHttpException();
}
return $this->render('default/' . $templateFile . '.html.twig');
}