我正在尝试实现多语言路由。
我面临的问题在于指出一种转换为多种语言的路由,指向自己的控制器。让我举一个简单的例子:
假设我有一条简单的路线如下
Route::get('/contacts', 'PageController@contacts');
我希望将同一个控制器用于另一条路线,但这次用另一种语言翻译,例如德语。
Route::get('/kontakte', 'PageController@contacts');
对于一个简单的网站,不超过5-6页,写下所有语言的路线不会那么痛苦,但对于更复杂的网站,页面数量庞大,语言超过2种,像这样的解决方案会很难看。
我在这里找到了一个较旧的主题,作者建议根据当前选择的语言加载 route.php 文件。但是,这仍然需要编辑多个文件以供进一步使用。
建议点或当前正在使用的解决方案将非常感谢。谢谢你的帮助。
答案 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,获取和发布路由等等,但这会有所启动。