viernes, 23 de marzo de 2018

Uso de múltiples idiomas en Laravel

      Estuve usando el cambio de idioma en mi página personal con Javascript. La desventaja que tiene esto es qué los buscadores no indexan los idiomas que no están por defecto en la web. El segundo, tercero, etc... idiomas que se muestras con un script de Javascript no son indexados. Cómo hace dos o tres meses actualicé mi web de PHP puro y duro, al framework Laravel 5.5, me dispuse a usar la opción de múltiples idiomas de la que dispone. Usando los archivos resources/lang/idioma/global.php

     El contenido típico de uno de estos archivos podría ser:

es/global.php
   return array(
      "home" => "Inicio",
      "monday" => "lunes"
   );


en/global.php
    return array(
      "home" => "home",
      "monday" => "Monday"
   );


     Para usarlo sería tan fácil cómo escribir en el HTML:

    @lang(‘global.home’) {{ trans(‘global.monday’) }} ó <?php trans(‘global.monday’); ?>


    Dentro del controlador su uso sería de la forma:

     trans(‘global.monday’);

    Debes indicarle al framework que idiomas vas a utilizar. En el fichero config/app.php los indicas:

    'locales' => [
       'en' => 'English',
       'es' => 'Español',
       'de' => 'Deutsch'
    ],


    Ahora para hacer uso de un idioma u otro lo puedes hacer en el propio archivo de las rutas routes/web.php de la forma:

    Route::any('{locale}', function ($locale) {
       App::setLocale($locale);
       return view('welcome');
    });


    O puedes cambiar el idioma en el controlador específico que vaya a mostrar tu página. El uso es conjunto con la ruta:

web.php
    Route::any('{locale}', 'HomeController@index');


app/Http/Controllers/HomeController.php


    public function index($locale = null)
    {
       \App::setLocale($locale);
       return view('welcome');
    }


    Y ahora el remate (o por lo menos el mio). Cuando tengo varías páginas y quiero cambiar de una a otra y mantener el idioma. O recordar el idioma de un usuario durante un tiempo de sesión, lo que hago es guardar el idioma que está usando el usuario en una variable de session(
'locale') p.ej. y dependiendo del uso anterior de la web por el usuario o de la selección hecha por el mismo seleccionamos un idioma u otro:
app/Http/Controllers/HomeController.php
     class HomeController extends base
    {
        public function index($locale = null)
        {
           $language = $this->GetLocaleLanguage($locale);
           \App::setLocale($language);
           return view('welcome');
        }
        …
    }
 
app/Http/Controllers/base.php
    public function GetLocaleLanguage($locale) {
       $lang = null;
       if ($locale == null) {
           if (session()->has('locale')) {
               $lang = session('locale');
           } else {
               session([ 'locale' => 'en' ]);
               $lang = 'en';
           }
       } else {
           if (preg_match($this->languages, $locale) == 1) {
               session([ 'locale' => $locale ]);
               $lang = $locale;
           } else {
               session([ 'locale' => 'en' ]);
               $lang = "en";
           }
       }
       return $lang;
    }


    Este método lo estoy utilizando en https://pacovalverde.com y en el actual desarrollo de https://envirosound.org


    Para este último debes escribir https://envirosound.org/es, https://envirosound.org/en o https://envirosound.org/de para ver los idiomas disponibles. Pues en estos momentos el proyecto está pos'eso, en desarrollo.

    La documentación para el uso la encontró un amigo con el que estoy haciendo el proyecto de la web https://quickadminpanel.com/blog/10-best-laravel-packages-for-multi-language-projects/ pero como me lié con el paquete barryvdh/laravel-translation-manager creo que ha sido interesante mostrar, para mí, la mejor forma.

    Espero que haya sido útil.

        @pacovalverdecom


Listado de artículos: http://pacovalverde.es/indice/

No hay comentarios:

Publicar un comentario