我的路由和使用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)
有了这个,人们可以访问您的网站而无需输入特定的区域设置.
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)
希望有所帮助!
这是我用于自动区域设置检测和重定向的方法,它运行良好,不需要冗长的路由注释:
使用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)
我不知道是否有更好的方法来做到这一点。
| 归档时间: |
|
| 查看次数: |
27437 次 |
| 最近记录: |