Domanda

Sto usando la localizzazione laravel per fornire due lingue diverse.Ho impostato tutto il percorso impostato e mydomain.com/en/bla consegna l'inglese e memorizza la variabile di sessione "en" e mydomain.com/he/bla offre ebraici e memorizza la variabile di sessione "he".Tuttavia, non riesco a capire un modo decente di fornire un collegamento di commutazione della lingua.Come funzionerebbe questo?

È stato utile?

Soluzione

Ho risolto il mio problema aggiungendo questo al filtro prima del filtro in routhes.php:

// Default language ($lang) & current uri language ($lang_uri)
$lang = 'he';
$lang_uri = URI::segment(1);

// Set default session language if none is set
if(!Session::has('language'))
{
    Session::put('language', $lang);
}

// Route language path if needed
if($lang_uri !== 'en' && $lang_uri !== 'he')
{
    return Redirect::to($lang.'/'.($lang_uri ? URI::current() : ''));
}
// Set session language to uri
elseif($lang_uri !== Session::get('language'))
{
    Session::put('language', $lang_uri);
}

// Store the language switch links to the session
$he2en = preg_replace('/he\//', 'en/', URI::full(), 1);
$en2he = preg_replace('/en\//', 'he/', URI::full(), 1);
Session::put('he2en', $he2en);
Session::put('en2he', $en2he);
.

Altri suggerimenti

Questo è un post che ho pubblicato originariamente sui forum di Laravel, ma forse aiuterà qualcun altro, quindi lo posterò anche qui.

Ho avuto qualche problema con la costruzione di un commutatore di lingue facile per la mia app, e le informazioni sui forum dove un po 'vecchio (alcuni post), quindi ho fatto questo semplice pezzo di codice che lo rende superpale per cambiare il linguaggio sul tuo app al volo.

Ho le stringhe della lingua nelle mie opinioni come segue:

{{ __('languagefile.the_language_string'); }}
.

E ottengo le lingue con un URL, penso che questo sia il modo migliore, anche il suo bene per SEO e per i collegamenti che le persone condividono. Esempio:

www.myapp.com/fi/support (Finnish)
www.myapp.com/en/support (English)
www.myapp.com/sv/support (Swedish)
.

OK, quindi il problema era che volevo un modo semplice per cambiare la lingua al volo, senza dover scherzare con sessioni e biscotti. Ecco come ho fatto:

Crea una libreria nella cartella Librerie chiamata Chooselanang.php

Inserire questo codice all'interno:

.

class Chooselang extends HTML {
    /**
     * Generate a Language changer link.
     *
     * <code>
     *      // Generate a link to the current location,
     *      // but still change the site langauge on the fly
     *      // Change $langcode to desired language, also change the Config::set('application.language', 'YOUR-LANG-HERE')); to desired language
     *      // Example
     *      echo Chooselang::langslug(URI::current() , $langcode = 'Finnish' . Config::set('application.language', 'fi'));
     * </code>
     *
     * @param  string  $url
     * @param  string  $langcode
     * @param  array   $attributes
     * @param  bool    $https
     * @return string
     */

    public static function langslug($url, $langcode = null, $attributes = array(), $https = null)
    {
        $url = URL::to($url, $https);

        if (is_null($langcode)) $langcode = $url;

        return '<a href="'.$url.'"'.static::attributes($attributes).'>'.static::entities($langcode).'</a>';
    }

}

Dopo questo è pronto per ottenere il tuo URL Switcher URL: S Generato. Semplicemente aggiungerli mentre tu sappia altri collegamenti a lama.

Esempio come generare collegamenti per finlandese, svedese e inglese (con lama)

  {{ Chooselang::langslug(URI::current() , $langcode = 'Fin' . Config::set('application.language', 'fi')); }}
  {{ Chooselang::langslug(URI::current() , $langcode = 'Swe' . Config::set('application.language', 'sv')); }}
  {{ Chooselang::langslug(URI::current() , $langcode = 'Eng' . Config::set('application.language', 'en')); }}
.

Quanto sopra genererà URL: S che sono sempre nella pagina corrente e modificano la slug Lang a quella che desideri. In questo modo la lingua cambia a quella che desideri, e l'utente rimane naturalmente sulla stessa pagina. La language slug predefinita non viene mai aggiunta all'URL.

URL generati Guardano come:

<a href="http://localhost/laravel/public/support">Fin</a>
<a href="http://localhost/laravel/public/sv/support">Swe</a>
<a href="http://localhost/laravel/public/en/support">Eng</a>
.

PS. I collegamenti sono particolarmente utili se li aggiungi al file modello master.

È possibile avere un percorso per cambiare la lingua, ad esempio:

Route::get('translate/(:any)', 'translator@set');

Quindi nell'azione set nel controller translator potrebbe modificare la sessione, a seconda del codice della lingua superato tramite l'URL.

È possibile modificare anche l'impostazione di configurazione utilizzando

Config::set('application.language', $url_variable');

Esempio di controller - Translate.php

public function action_set($url_variable)
{
     /* Your code Here */
}
.

Nel caso in cui gli utenti futuri se si desidera utilizzare il pacco per la localizzazione c'è un grande pacchetto a https://github.com/mcamara/laravel-localizzazione .che è facile da installare e ha molti aiutanti.

Questa domanda è ancora disponibile in Google Search, quindi ecco la risposta se stai usando Laravel 4 o 5 e McAMARA / LARAVELLocalizzazione.

<ul>
    <li class="h5"><strong><span class="ee-text-dark">{{ trans('common.chooselanguage') }}:</span></strong> </li>
        @foreach(LaravelLocalization::getSupportedLocales() as $localeCode => $properties)
            <li>
               <a rel="alternate" hreflang="{{$localeCode}}" href="{{LaravelLocalization::getLocalizedURL($localeCode) }}">
                   <img src="/img/flags/{{$localeCode}}.gif" /> {{{ $properties['native'] }}}
               </a>
           </li>
        @endforeach
</ul>
.

Si noti che questo esempio mostra i flags (in pubblico / img / flags / {{locale}}. GIF), e per usarlo avrai bisogno di un po 'di .CSS, ma puoi modificarlo per visualizzare il testo se tuVuoi ...

fyi.La documentazione Mcamara / Laravelocalization ha esempi e molti aiutanti, quindi guarda attraverso la documentazione su GitHub.( https://github.com/mcamara/laravel-localization )

Prova a usare la sessione.Qualcosa come questo:

Controller:

 class Language_Controller extends Base_Controller {

        function __construct(){
            $this->action_set();
            parent::__construct();
        }

       private function checkLang($lang = null){
         if(isset($lang)){
           foreach($this->_Langs as $k => $v){
             if(strcmp($lang, $k) == 0) $Check = true;
           }
       }
        return isset($Check) ? $Check : false;
       }

       public function action_set($lang = null){
        if(isset($lang) && $this->checkLang($lang)){
            Session::put('lang', $lang);
            $this->_Langs['current'] = $lang;
            Config::set('application.language', $lang);
        } else {
            if(Session::has('lang')){
                Config::set('application.language', Session::get('lang'));
                $this->_Langs['current'] = Session::get('lang');
            } else {
                $this->_Langs['current'] = $this->_Default;
            }
        }
        return Redirect::to('/');
    }
}
.

in route.php:

Route::get('lang/(:any)', 'language@set');
.

I've been doing it like this:

$languages = Config::get('lang.languages'); //returns array('hrv', 'eng')

$locale = Request::segment(1); //fetches first URI segment

//for default language ('hrv') set $locale prefix to "", otherwise set it to lang prefix
if (in_array($locale, $languages) && $locale != 'hrv') {
    App::setLocale($locale);
} else {
    App::setLocale('hrv');
    $locale = null;
}

// "/" routes will be default language routes, and "/$prefix" routes will be routes for all other languages
Route::group(array('prefix' => $locale), function() {

    //my routes here

});

Source: http://forumsarchive.laravel.io/viewtopic.php?pid=35185#p35185

What I'm doing consists of two steps: I'm creating a languages table which consists of these fields:

id | name | slug

which hold the data im gonna need for the languages for example

1 | greek | gr

2 | english | en

3 | deutch | de

The Language model I use in the code below refers to that table.

So, in my routes.php I have something like:

//get the first segment of the url
$slug = Request::segment(1);   
$requested_slug = "";

//I retrieve the recordset from the languages table that has as a slug the first url segment of request
$lang = Language::where('slug', '=', $slug)->first();

//if it's null, the language I will retrieve a new recordset with my default language
$lang ? $requested_slug = $slug :  $lang = Language::where('slug', '=', **mydefaultlanguage**')->first();

//I'm preparing the $routePrefix variable, which will help me with my forms
$requested_slug == ""? $routePrefix = "" : $routePrefix = $requested_slug.".";

//and I'm putting the data in the in the session
Session::put('lang_id', $lang->id);
Session::put('slug', $requested_slug);
Session::put('routePrefix', $routePrefix );
Session::put('lang', $lang->name);

And then I can write me routes using the requested slug as a prefix...

Route::group(array('prefix' =>  $requested_slug), function()
{
    Route::get('/', function () {
        return "the language here is gonna be: ".Session::get('lang');
    });

    Route::resource('posts', 'PostsController');
    Route::resource('albums', 'AlbumsController');
});

This works but this code will ask the database for the languages everytime the route changes in my app. I don't know how I could, and if I should, figure out a mechanism that detects if the route changes to another language.

Hope that helped.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top