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
Written by Mario Basic
Related protips
1 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