Question

J'utilise la localisation Laravel pour fournir deux langues différentes.J'ai configuré tous les éléments de chemin, et mydomain.com/en/bla fournit l'anglais et stocke la variable de session « en », et mydomain.com/he/bla fournit l'hébreu et stocke la variable de session « he ».Cependant, je n'arrive pas à trouver un moyen décent de fournir un lien de changement de langue.Comment cela fonctionnerait-il ?

Était-ce utile?

La solution

J'ai résolu mon problème en ajoutant ceci au filtre avant les routres.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);

Autres conseils

Ceci est un poste que j'ai posté à l'origine sur les forums Laravel, mais peut-être que cela aidera quelqu'un d'autre, alors je le pose ici aussi.

J'ai eu des problèmes avec la construction d'un sommaire de langue facile pour mon application et l'information sur les forums où un peu vieux (certains postes), donc j'ai fait ce simple code de code qui en fait de la supersey pour changer de langue sur votre application à la volée.

J'ai les chaînes de langue dans mes vues comme suit:

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

Et je reçois les langues avec une URL, je pense que c'est le meilleur moyen, c'est aussi son bien pour le référencement et les liens que les gens partagent. Exemple:

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

OK, le problème était donc que je voulais un moyen facile de changer la langue à la volée, sans avoir à gaver des sessions et des cookies. Heres comment je l'ai fait:

Faire une bibliothèque dans votre dossier de bibliothèques appelé chooselang.php

Insérer ce code à l'intérieur:

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>';
    }

}

Après cela, vous êtes prêt à obtenir votre URL de commutation URL: S généré. Ajoutez-les simplement lorsque vous pluriez des autres liens de lame.

Exemple Comment générer des liens pour finnois, suédois et anglais (avec lame)

  {{ 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')); }}

Ce qui précède générera URL: S qui sont toujours sur la page en cours et changez la limace Lang sur celle que vous souhaitez. De cette façon, la langue change à celui que vous souhaitez et que l'utilisateur reste naturellement sur la même page. La limite de langue par défaut n'est jamais ajoutée à l'URL.

Les URL générées ressemblent à quelque chose comme:

<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. Les liens sont particulièrement utiles si vous les ajoutez à votre fichier de modèle principal.

Vous pourriez avoir un changement de langue pour une Route à portée de main, par exemple :

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

Puis dans le set action dans le translator Le contrôleur pourrait modifier la session, en fonction du code de langue transmis via l'URL.

Vous pouvez également modifier le paramètre de configuration en utilisant

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

Exemple de contrôleur - traduire.php

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

Juste au cas où les utilisateurs futurs Si vous souhaitez utiliser un package pour la localisation, il existe un excellent colis à https://github.com/mcamara/laravel-localisation .qui est facile à installer et possède de nombreux aides.

Cette question est toujours disponible dans Google Search. Voici donc la réponse si vous utilisez Laravel 4 ou 5, et McAMara / Laravellocalisation.

<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>

Notez que cet exemple affiche des drapeaux (en public / img / drapeaux / {{locale}}. gif), et pour l'utiliser, vous aurez besoin d'un peu de .CSS, mais vous pouvez le modifier pour afficher le texte si vousveux ...

fyi.La documentation Mcamara / Laravellocalization présente des exemples et beaucoup d'assistants, alors examinez la documentation sur GitHub.( https://github.com/mcamara/laravel-localisation )

Essayez d'utiliser des sessions.Quelque chose comme ceci:

Contrôleur:

 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('/');
    }
}

en 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top