5

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

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

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

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

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

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

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

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

非常感谢您提出建议或当前有效的解决方案。感谢您的帮助。

4

1 回答 1

10

只是一些快速的想法:

一种解决方案是使用前缀“/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');
    });
}

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

页面:id,名称,控制器

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

PageLocal : id, page_id, 语言, slug

示例:1、1、en、联系人

示例:1、1、de、kontakte

循环遍历所有页面,延迟加载 PageLocal 并注册路由。如果你愿意,你可以去掉语言栏,但要注意重复的 slug。这就是为什么语言前缀是个好主意。(也许它会帮助一些搜索引擎优化......)

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

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

于 2013-09-10T08:31:16.057 回答