如何避免 Symfony 和 locale 路由的重复内容?

Posted

技术标签:

【中文标题】如何避免 Symfony 和 locale 路由的重复内容?【英文标题】:How to avoid duplicate content with Symfony and locale routes? 【发布时间】:2014-08-07 06:28:52 【问题描述】:

我在 symfony 2.5 中遇到了语言环境路由问题。 假设我的默认语言是英语。我的示例路由是 /user/register/。如果我在没有任何语言环境的情况下请求它,它应该出现英文翻译。如果我使用语言环境(例如 /fr/user/register/)请求它,它应该与它一起出现。这可以通过以下方式完成:

/**
 * @Route("/_locale/user/register/")
 * @Route("/user/register/")
 * @Template()
 */
public function registerAction(Request $request)

    $locale = $request->getLocale();
    $translated = $this->get('translator')->trans('test.output');

    echo $locale."<br>".$translated;
    exit();

现在我要对此提出疑问:

如何才能避免用户使用默认语言作为区域设置来调用路由?在我的示例中,英语是默认语言,因此 /en/user/register/ 将具有与 /user/register/ 相同的输出。我不想在每个控制器动作中进行 301 重定向! 有没有简单的方法可以用一个路由注释来注释有和没有语言环境的路由?

【问题讨论】:

【参考方案1】:

您可以为路线添加要求,例如:

 * @Route("/_locale/user/register/", requirements="_locale" = "fr|it")

有了这个,只有那些选项,那里列出的内容可以放入 _locale 占位符

编辑:

我现在明白你的问题了。那么这里是你的解决方案: JsmI18n

【讨论】:

谢谢,如果我有另一个用例,那将很有帮助。但我想以默认语言使用该操作,而路径中没有任何语言环境。因此,如果 /fr/user/register/ 是默认语言,它将是无效的。相反,这必须重定向到 /user/register/。但正如我所说,在每个操作中进行此 301 重定向是多余的。那么实现它的更好选择是什么?【参考方案2】:

我知道这可以通过JMSI18nRoutingBundle 实现。不仅如此,您还可以使用以下用例:

/contact       # For English language
/de/kontakt    # For German  

【讨论】:

您能否为我的用例发布一个使用示例?我没有在文档中找到这个。 抱歉,我发布了错误的库链接(来自同一个开发者):) 现在已修复 :) 尽管如此,我必须声明一个显而易见的事实:Johannes Schmitt 在记录他的捆绑包方面确实做得很差...... :( 好吧,我不让它运行:Invalid configuration at path "jms_i18n_routing.default_locale": The default locale must be one of the configured locales。发生这种情况是因为我没有定义语言环境。我不想限制语言,因为这是我的控制器的一部分。所以这个包不幸的是这个包对我没有帮助。它应该只检查它是否是默认语言,如果是,则在路由中没有本地语言的情况下重定向到它。 嗯,在某些时候,我认为您将不得不“限制语言”,对吧?

以上是关于如何避免 Symfony 和 locale 路由的重复内容?的主要内容,如果未能解决你的问题,请参考以下文章

允许没有参数的 Symfony2 路由的尾部斜杠?

Symfony2:列出虚拟文件夹(Netbeans)中的所有视图/路由文件

Symfony 3 将所有路由重定向到当前语言环境版本

如何使用 Symfony2 路由组件将路由与控制器绑定

如何在 Symfony 布局中获取 _locale 变量?

如何在 Symfony 路由中使用锚点?