Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel 4 multilanguage routing

I'm trying to implement a multilanguage routing.

The problem I'm facing lies in pointing out a route translated to more than one language, to a controller of its own. Let me give a simple example:

Let's say I have a simple route as follows

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

And I want the same controller to be used for another route, but this time translated in another language, german for example.

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

For a simple webiste, with no more than 5-6 pages, writing down the routes for all languages would not be such a pain, but for more complex website, with huge amount of pages and having more than 2 available languages, a solution like this would be ugly.

I found an older topic here, where the author suggested loading a route.php file depending on the currently selected language. But still, this would require more than one file to be edited for further need.

A point of suggestion or currently working solution would be really appreciated.Thanks for your help.

like image 427
Artamiel Avatar asked Sep 10 '13 08:09

Artamiel


People also ask

What is {{ __ }} In laravel?

Laravel 5 Translation Using the Double Underscore (__) Helper Function. The __ helper function can be used to retrieve lines of text from language files.

What is @lang in laravel?

Laravel-lang is a collection of over 68 language translations for Laravel by developer Fred Delrieu (caouecs), including authentication, pagination, passwords, and validation rules. This package also includes JSON files for many languages.


1 Answers

Just some quick thoughts:

A solution can be to do grouping routes with a prefix like '/en/' and '/de/'. So you will have /en/contact and /de/contact.

docs for this: http://laravel.com/docs/routing#route-prefixing This way you can just create a loop through your available languages, and register the route.

The con here that you can't have a /de/kontake or /kontakte url, because there is 1 loop with routes, and they probably will be in English.

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

A second solution will be to store all your routes in a database (or just an array to test it in the beginning) You will need some Page and PageLocal models for it.

Page: id, name, controller

example: 1, contact, PageController@contact

PageLocal: id, page_id, language, slug

example: 1, 1, en, contact

example: 1, 1, de, kontakte

Loop through all Pages, lazy load the PageLocal with it, and register the routes. You can throw out the language column if you like, but lookout for duplicate slugs. Thats why a language prefix is a good idea. (And perhaps it will help with some SEO...)

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

And after that you still have to think about url's without a language prefix, get and post routes, etc, etc, but this will get something started.

like image 103
Rob Gordijn Avatar answered Nov 15 '22 08:11

Rob Gordijn