拉拉维尔 4 多语言路由



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

我面临的问题在于指出一条翻译成多种语言的路线,它自己的控制器。让我举一个简单的例子:

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

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

我希望将相同的控制器用于另一条路由,但这次被翻译成另一种语言,例如德语。

Route::get('/kontakte', 'PageController@contacts');
对于一个简单的网站,不超过

5-6 页,写下所有语言的路线不会那么痛苦,但对于更复杂的网站,有大量页面并且有超过 2 种可用语言,这样的解决方案将是丑陋的。

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

建议点或当前有效的解决方案将不胜感激。感谢您的帮助。

只是一些快速的想法:

解决方案可以是使用前缀"/en/"和"/de/"对路由进行分组。所以你会有/en/contact 和/de/contact。

为此提供的文档:http://laravel.com/docs/routing#route-prefixing这样,您只需通过可用语言创建一个循环,并注册路由。

这里的缺点是你不能有一个/de/kontake 或/kontakte url,因为有 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');
    });
}

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

页面:ID、名称、控制器

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

PageLocal: id, page_id, language, slug

示例:1、1、英文、联系人

示例:1, 1, de, kontakte

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

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

在那之后,你仍然需要考虑没有语言前缀的url,获取和发布路由等,但这将开始一些事情。

最新更新