Last Updated: February 25, 2016
·
5.08K
· mabasic

Helper for creating language anchors in Laravel

This little helper gets the current URL and then applies the desired language to it.

Let's say you are located on http://domain.com/news/europe and that website is on English and you want to enable your users to click on a link, let's call it "translate to croatian" and then they would get the same page, but on Croatian language http://domain.com/hr/news/europe.

I hope that you understood what I meant to say :)

Put this helper in: app/helpers. Include that folder in composer.json. Run composer dump-autoload. In your view (layout) just create a simple <a href="{{ L18n::currentUrl('en') }}">translate to english</a> or <a href="{{ L18n::currentUrl() }}">translate to default website language</a>.

Filename: L18n.php

<?php

Class L18n{

    /*
    |
    | Gets the URL of the current page and applies the desired language to it.
    | If `lang` is set to "en" then the URL for the route `trips` should look
    | like `http://domain.com/en/trips`. If the `lang` is set to "" then the URL
    | should look like `http://domain.com/trips`.
    |
    */
    static function currentUrl($lang = "")
    {
        // if the desired language is found in the supported_locales variable
        if( in_array($lang, Config::get('locales.supported_locales')) )
        {
            // if the first part of the URL is found in the supported_locales
            if( in_array(Request::segment(1), Config::get('locales.supported_locales')) )
            {
                // remove the first two characters from the `path`; DELETE (en)
                $cleanPath = substr(Request::path(), 2);
                // replace current `path` with the modified `lang` + `cleanPath`; MERGE (de/path)
                $translated = str_replace(Request::path(), $lang.$cleanPath, Request::url());
            }
            // else if the first part of the URL is null; DOES NOT EXIST (there is no language set)
            elseif (Request::segment(1)==null)
            {
                // append `lang` to the end of the  current URL
                $translated = Request::url().'/'.$lang;
            }
            // else if the first part of the URL is something, but not a language then
            else{
                // save current path
                $path = Request::path();
                // append `lang` and `path` to `domain`
                $translated = Config::get('app.url').'/'.$lang.'/'.$path;
            }

            return $translated;
        }
        // if the desired language is not found in the supported_locales variable; (default to app.locale)
        else{
            // if the first part  of the URL is found in the supported_locales (the user is currently viewing the translated page)
            if( in_array(Request::segment(1), Config::get('locales.supported_locales')) )
            {
                // remove the first three characters from `path`; DELETE (en/)
                $cleanPath = substr(Request::path(), 3);
                // replace current `path` with `cleanPath`
                $default = str_replace(Request::path(), $cleanPath, Request::url());
            }
            // the URL has no language set
            else{
                // just return the current URL
                $default = Request::url();
            }

            return $default;
        }
    }

}

Here is the Pro tip that helped me to configure my routes for multi-lingual website: https://coderwall.com/p/czumyq

1 Response
Add your response

To works with /public/ or whatever subdirectory, change

$path = Request::path();
$translated = Config::get('app.url').'/'.$lang.'/'.$path;

With:

$path = Request::path();
$translated = str_replace($path, $lang.'/'.$path, Request::url());

Alek

over 1 year ago ·