ZF2 - 语言路由

时间:2015-02-13 11:17:26

标签: php zend-framework zend-framework2

我需要在Zend Framework 2中创建路由器配置,如:

http://www.example.com/en
http://www.example.com/fr
http://www.example.com/es

然后模块的路线就像我的" cms"模块必须匹配:

http://www.example.com/en/cms/test.html (english version)
http://www.example.com/fr/cms/test.html (french version)
http://www.example.com/es/cms/test.html (spanish version)

当然这个链接必须与英语默认语言匹配:

http://www.example.com/cms/test.html (english version)

我已经使用过SimLocale但没有成功,因为它也没有处理资产链接。因此,我更喜欢通过所有自定义模块的简单参数手动处理语言选择。

2 个答案:

答案 0 :(得分:1)

今天#zftalk IRC已经解决了这个问题(感谢Michelangelo根据我们向您解释的内容做出贡献......)。

要解决这个问题,我们必须查看已定义的路线:

'router' => array(
    'routes' => array(
        'language' => array(
            'type' => 'Segment',
            'options' => array(
                'route' => '[/:lang]',
                'defaults' => array(
                    '__NAMESPACE__' => 'Cms\Controller',
                    'controller' => 'Index',
                    'action' => 'page',
                    'lang' => 'en',
                    'slug' => 'homepage'
                ),
                'constraints' => array(
                    'lang' => '[a-z]{2}'
                )
            ),
            'may_terminate' => true,
            'child_routes' => array(
                'list' => array(
                    'type' => 'Segment',
                    'options' => array(
                        'route' => '/cms',
                        'defaults' => array(
                            '__NAMESPACE__' => 'Cms\Controller',
                            'controller' => 'Index',
                            'action' => 'index',
                            'page' => 1
                        ),
                    ),
                ),
                'page' => array(
                    'type' => 'Segment',
                    'options' => array(
                        'route' => '[/:slug].html',
                        'constraints' => array(
                            'slug' => '[a-zA-Z][a-zA-Z0-9_-]*',
                        ),
                        'defaults' => array(
                            'action' => 'page',
                        ),
                    ),
                ),
                'search' => array(
                    'type' => 'Segment',
                    'options' => array(
                        'route' => '/search/[query/:query]',
                        'constraints' => array(
                            'query' => '[a-zA-Z][a-zA-Z0-9_-]*',
                        ),
                        'defaults' => array(
                            'action' => 'search',
                            'query' => null,
                        ),
                    ),
                ),
                'paginator' => array(
                    'type' => 'Segment',
                    'options' => array(
                        'route' => '/list/[page/:page]',
                        'constraints' => array(
                            'page' => '[0-9]*',
                        ),
                        'defaults' => array(
                            'page' => 1,
                        ),
                    ),
                ),
            ),
        ),

然后,问题的更新描述如下:

  

mikunos:http://www.example.com/en(主页)这没关系

     

mikunos:http://www.example.com/en/cms(cms list)这没关系

     

mikunos:http://www.example.com/en/cms/about.html(页)这不是

这促使我们改变了这个页面'路线作为儿童路线的列表' (/厘米)。

然后讨论结束,并指出如果没有选择默认语言,如何设置默认语言:

  

mikunos:你看到我需要两条主要路线

     

mikunos:第一个是/ lang / module,第二个是/ module

     

mikunos:所以我必须创建两个分支

     

mikunos:对吗?

     

tdutrion:您可能想要使用网址重写或此处的内容

     

tdutrion:我会从/ module重定向到/ en / module,因此你没有重复的内容

     

tdutrion:然后没有语言就无法访问路径

     

mikunos:好的

     

tdutrion:你可以采用不同的方式,但我认为最好的方法是创建一个事件监听器并在路由之前做到这一点

     

tdutrion:你也可以在.htaccess中使用apache,但是如果你迁移到IIS或Ngnix或者其他...

     

mikunos:有趣

     

tdutrion:我再次相信Jurian Sluiman的代码那样做

答案 1 :(得分:0)

您可以使用您需要的每种语言的子域名,我想您不想要或者您真的不需要(例如./ en)来更改您的应用程序和/或网站的语言。是否必须使用/ en,/ fr等?