Symfony2路由中的默认语言环境

Ka.*_*Ka. 27 symfony

我的路由和使用Symfony2构建的网站的国际化存在问题.
如果我在routing.yml文件中定义路由,如下所示:

example: 
    pattern:  /{_locale}/example 
    defaults: { _controller: ExampleBundle:Example:index, _locale: fr } 
Run Code Online (Sandbox Code Playgroud)

它适用于以下URL:

mysite.com/en/example 
mysite.com/fr/example 
Run Code Online (Sandbox Code Playgroud)

但不起作用

mysite.com/example 
Run Code Online (Sandbox Code Playgroud)

是否只允许在URL末尾使用可选占位符?
如果是,那么显示网址的可能解决方案如下:

mysite.com/example  
Run Code Online (Sandbox Code Playgroud)

使用默认语言或将用户重定向到:

mysite.com/defaultlanguage/example 
Run Code Online (Sandbox Code Playgroud)

当他访问时:

mysite.com/example. ? 
Run Code Online (Sandbox Code Playgroud)

我想弄清楚但到目前为止没有成功.

谢谢.

小智 20

如果有人感兴趣,我成功地在我的前缀上添加了一个前缀routing.yml而不使用其他捆绑包.

所以现在,这些URL工作:

www.example.com/
www.example.com//home/
www.example.com/fr/home/
www.example.com/en/home/
Run Code Online (Sandbox Code Playgroud)

编辑你的app/config/routing.yml:

ex_example:
    resource: "@ExExampleBundle/Resources/config/routing.yml"
    prefix:   /{_locale}
    requirements:
        _locale: |fr|en # put a pipe "|" first
Run Code Online (Sandbox Code Playgroud)

然后,在您app/config/parameters.yml,您必须设置一个区域设置

parameters:
    locale: en
Run Code Online (Sandbox Code Playgroud)

有了这个,人们可以访问您的网站而无需输入特定的区域设置.

  • 不幸的是,这不起作用:www.example.com//home/ url应该是www.example.com/home/并且它不会以这种方式工作. (7认同)

mat*_*exx 12

您可以定义多个这样的模式:

example_default:
  pattern:   /example
  defaults:  { _controller: ExampleBundle:Example:index, _locale: fr }

example:
  pattern:   /{_locale}/example
  defaults:  { _controller: ExampleBundle:Example:index}
  requirements:
      _locale:  fr|en
Run Code Online (Sandbox Code Playgroud)

你应该能够用注释实现同样的东西:

/**
 * @Route("/example", defaults={"_locale"="fr"})
 * @Route("/{_locale}/example", requirements={"_locale" = "fr|en"})
 */
Run Code Online (Sandbox Code Playgroud)

希望有所帮助!


Pie*_*eau 7

这是我用于自动区域设置检测和重定向的方法,它运行良好,不需要冗长的路由注释:

使用routing.yml

locale路由处理网站的根目录,然后每个其他控制器操作都以区域设置为前缀.

locale:
  path: /
  defaults:  { _controller: AppCoreBundle:Core:locale }

main:
  resource: "@AppCoreBundle/Controller"
  prefix: /{_locale}
  type: annotation
  requirements:
    _locale: en|fr
Run Code Online (Sandbox Code Playgroud)

CoreController.php

这会检测用户的语言并重定向到您选择的路线.我使用home作为默认值,因为它是最常见的情况.

public function localeAction($route = 'home', $parameters = array())
{
    $this->getRequest()->setLocale($this->getRequest()->getPreferredLanguage(array('en', 'fr')));

    return $this->redirect($this->generateUrl($route, $parameters));
}
Run Code Online (Sandbox Code Playgroud)

然后,路径注释可以简单地是:

/**
 * @Route("/", name="home")
 */
public function indexAction(Request $request)
{
    // Do stuff
}
Run Code Online (Sandbox Code Playgroud)

枝条

localeAction可用于允许用户更改语言环境而无需导航离开当前页面:

<a href="{{ path(app.request.get('_route'), app.request.get('_route_params')|merge({'_locale': targetLocale })) }}">{{ targetLanguage }}</a>
Run Code Online (Sandbox Code Playgroud)

干净简单!


alg*_*imo -3

我认为你可以简单地添加这样的路线:

example: 
pattern:  /example 
defaults: { _controller: ExampleBundle:Example:index } 
Run Code Online (Sandbox Code Playgroud)

这样,区域设置将是用户最后选择的区域设置,或者如果尚未设置用户区域设置,则为默认区域设置。如果您想为 /example 设置特定的区域设置,您还可以将“_locale”参数添加到路由配置中的“默认值”中:

example: 
pattern:  /example 
defaults: { _controller: ExampleBundle:Example:index, _locale: fr }
Run Code Online (Sandbox Code Playgroud)

我不知道是否有更好的方法来做到这一点。