【问题标题】:Laravel 4 multilanguage routingLaravel 4 多语言路由
【发布时间】:2013-09-13 20:15:29
【问题描述】:

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

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

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

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

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

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

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

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

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

【问题讨论】:

标签: laravel laravel-4


【解决方案1】:

只是一些简单的想法:

一种解决方案是使用前缀“/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。这就是为什么语言前缀是个好主意。 (也许它会对一些 SEO 有所帮助......)

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

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

【讨论】:

  • 我想到了您提供的第一个示例,并且得出了相同的结论-无法为特定语言提供不同的路线。我喜欢第二个例子。我心里有一些想法,但仍然不确定是否有更好的方法。不管怎样,谢谢你的帮助,我很感激。
  • 已经超过了我们,这是唯一的回应。无论如何,我已经开始按照您建议的方式编写所有内容,所以我接受它作为正确答案。感谢您的宝贵时间。
猜你喜欢
  • 2015-04-12
  • 2013-12-19
  • 1970-01-01
  • 2017-10-09
  • 1970-01-01
  • 1970-01-01
  • 2020-11-26
  • 2022-11-11
  • 2013-08-10
相关资源
最近更新 更多