Pregunta

Estoy usando LOALIZACIÓN DE LARIVAS para proporcionar dos idiomas diferentes.Tengo todas las cosas del camino configuradas, y MyDomain.com/en/BLA ofrece inglés y almacena la variable de sesión 'en', y myDomain.com/HE/BLA ofrece hebreo y almacena la variable de sesión 'él'.Sin embargo, no puedo entender una forma decente de proporcionar un enlace de conmutación de idioma.¿Cómo funcionaría esto?

¿Fue útil?

Solución

He resuelto mi problema agregando esto al filtro antes de Rutas.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);

Otros consejos

Este es un post que publiqué originalmente en los foros de Laravel, pero tal vez ayude a alguien más, así que también lo publico aquí.

Tuve algunos problemas con la construcción de un conmutador de lenguaje fácil para mi aplicación, y la información en los foros donde un poco viejo (algunas publicaciones), así que hice este simple código de código que lo convierte en una superavonía para cambiar el idioma en su aplicación sobre la marcha.

Tengo las cadenas de idioma en mis puntos de vista de la siguiente manera:

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

Y recibo los idiomas con una URL, creo que esta es la mejor manera, también es buena para SEO y para los enlaces que las personas comparten. Ejemplo:

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

OK, por lo que el problema era que quería una manera fácil de cambiar el idioma sobre la marcha, sin tener que meterme con sesiones y cookies. Heres cómo lo hice:

Hacer una biblioteca en la carpeta de su bibliotecas llamada chooselang.php

Inserte este código dentro:

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

}

Después de esto, está listo para obtener la URL de su conmutador URL: s generada. Simplemente agreguelos a medida que oculte cualquier otro enlaces de la cuchilla.

Ejemplo Cómo generar enlaces para finlandés, sueco e inglés (con cuchilla)

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

Lo anterior generará URL: S que siempre están en la página actual, y cambie la babosa Lang a la que desee. De esta manera, el idioma cambia a la que desee, y el usuario se queda naturalmente en la misma página. La Slug Idioma predeterminada nunca se agrega a la URL.

Las URL generadas se ven como:

<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. Los enlaces son especialmente útiles si los agrega a su archivo de plantilla maestra.

Podría tener una ruta al cambio de idioma a mano, por ejemplo:

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

Luego, en la acción GeneracDicEtGode, en el controlador de set, podría alterar la sesión, dependiendo del código de idioma pasado a través de la URL.

También podría alterar la configuración de configuración usando

translator

Ejemplo del controlador - traducir.php

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

En caso de que los usuarios futuros, si desea usar el paquete para la localización, hay un gran paquete en https://github.com/mcamara/laravel-localization .Lo que es fácil de instalar y tiene muchos ayudantes.

Esta pregunta aún viene en la búsqueda de Google, por lo que aquí está la respuesta si está usando Laravel 4 o 5, y McAmara / Laravellocalization.

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

Tenga en cuenta que este ejemplo muestra banderas (en público / img / banderas / {{locale}}. gif), y para usarlo, necesitará un poco de .css, pero puede modificarlo para mostrar el texto si ustedquiere ...

fyi.La documentación de McAmara / Laravellocalization tiene ejemplos y muchos ayudantes, así que revise la documentación en GitHub.( https://github.com/mcamara/laravel-localization )

Intenta usar la sesión.Algo así:

controlador:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top