Laravel 4多语言路由

时间:2013-09-10 08:00:13

标签: laravel laravel-4

我正在尝试实现多语言路由。

我面临的问题在于指出一种转换为多种语言的路由,指向自己的控制器。让我举一个简单的例子:

假设我有一条简单的路线如下

Route::get('/contacts', 'PageController@contacts');

我希望将同一个控制器用于另一条路线,但这次用另一种语言翻译,例如德语。

Route::get('/kontakte', 'PageController@contacts');

对于一个简单的网站,不超过5-6页,写下所有语言的路线不会那么痛苦,但对于更复杂的网站,页面数量庞大,语言超过2种,像这样的解决方案会很难看。

我在这里找到了一个较旧的主题,作者建议根据当前选择的语言加载 route.php 文件。但是,这仍然需要编辑多个文件以供进一步使用。

建议点或当前正在使用的解决方案将非常感谢。谢谢你的帮助。

1 个答案:

答案 0 :(得分:10)

只是一些快速的想法:

解决方案可以是使用'/ en /'和'/ de /'这样的前缀对路线进行分组。 所以你将有/ en / contact和/ de / contact。

docs for this:http://laravel.com/docs/routing#route-prefixing 这样您就可以通过可用语言创建循环,并注册路线。

这里的骗局是你不能拥有/ de / kontake或/ kontakte网址,因为有1个路由循环,而且它们可能是英文的。

<?php
$languages = array('en', 'de');
foreach($langauges as $language)
{
    Route::group(array('prefix' => $language), function()
    {
        Route::get('/', 'HomeController@index');
        Route::get('contact', 'HomeController@contact');
    });
}

第二个解决方案是将所有路由存储在数据库中(或者只是一个数组,以便在开始时对其进行测试) 你需要一些Page和PageLocal模型。

页面:id,name,controller

示例:1,联系人,PageController @ contact

PageLocal :id,page_id,language,slug

示例:1,1,en,联系

例如:1,1,de,kontakte

遍历所有页面,懒惰地加载PageLocal,并注册路线。 如果您愿意,可以抛弃语言列,但要注意重复的slu ..这就是为什么语言前缀是个好主意。 (也许它会对一些SEO有所帮助......)

<?php
$Pages::with('Locals')->all();
foreach($Pages as $Page)
{
    foreach($Page->Locals as $PageLocal)
    {
        Route::get($PageLocal->language.'/'.$PageLocal->slug, $Page->controller);
    }
}

之后你仍然需要考虑没有语言前缀的url,获取和发布路由等等,但这会有所启动。