Hooks en CodeIgniter para llamar al lenguaje instalado en el navegador

No Comments

CodeIgniter, tiene la posibilidad de habilitar hooks. En otras palabras: podemos indicarle al framework el lugar donde queremos interrumpir la secuencia flujo de la aplicación, insertar nuestro código, y continuar.

Según el manual de Codeigniter, podemos insertar una interrupción en los siguientes puntos.

  • Pre_system: que es llamado muy pronto durante la ejecución del sistema. En este punto sólo se han cargado la clase de referencia y la clase de hooks. Sin enrutamientos ni otros procesos.
  • Pre-Controller: es llamado inmediatamente antes de que cualquiera de sus controladores sea invocado. En este punto, se han cargado todas las clases de base, enrutamiento y comprobaciones de seguridad.
  • Post_controller_constructor: llamado tras instanciar su controlador, pero antes de cualquier llamada de método.
  •  Post_controller: se activa inmediatamente después de que el controlador se haya cargado completamente.
  • Display_override: anula el método _display(), que es el que se utiliza para enviar la página finalizada al navegador al final de la ejecución del sistema. Esto permite usar tus propios métodos de visualización. Para ello tienes que crear tu propio objeto CI con $this->CI = get_instance(). Para más información ver el manual de CI.
  • Cache_override: permite llamar a tu propio método en lugar del método _display_cache() en la biblioteca de resultados. Lo que permite que creemos nuestro propio sistema de cacheado.
  • Post_system: que es llamado tras enviar la última página procesada al navegador, al final de la ejecución del sistema y después de enviar los datos finalizados al navegador.

Implementando mi mecanismo de traducción

Con estas herramientas, y estos mimbres tenemos que tejer nuestro cesto. El caso es que vamos a llamar a la traducción dependiendo del idioma instalado en el navegador, para ello nos apoyaremos en las librerías de Language, y User_agent, que asumo que conoces y manejas.

Antes que ninguna otra indicación al framework, tenemos que situar en application/hooks/Hook_lang.php, como sigue:

  1. <?php
  2.  
  3. /**
  4. * Name:  Hook lang
  5. *
  6. * Author:  Pedro Ruiz Hidalgo
  7. *          ruizhidalgopedro@gmail.com
  8. *          @pedroruizhidalg
  9. *
  10. * Created:  2017.05.10
  11. *
  12. * Description:  Get lang even when no login jet.
  13. *
  14. * Requirements: PHP5 or above
  15. *
  16. **/
  17.  
  18. if (!defined( 'BASEPATH')) exit('No direct script access allowed');
  19. class Select_lang
  20. {
  21.     private $ci;
  22.     public function __construct()
  23.     {
  24.         $this->ci =& get_instance();
  25.         !$this->ci->load->library('session') ? $this->ci->load->library('session') : false;
  26.         !$this->ci->load->library(array('user_agent'=>'ua')) ? $this->ci->load->library('user_agent') : false;
  27.     }    
  28.  
  29.     public function choose()
  30.     {
  31.         if ( ! is_cli() ){
  32.             $user_agent_lang    =   (
  33.                                         $this->ci->ua->languages()[1]='en'
  34.                                         OR $this->ci->ua->languages()[1]='es'
  35.                                     )
  36.                                     ? $this->ci->ua->languages()[1]
  37.                                     : 'en';
  38.             //$user_agent_lang  =   'en';
  39.             //die($user_agent_lang);
  40.            
  41.             switch ($user_agent_lang)
  42.             {
  43.                 case 'en':
  44.                     $lang='english';
  45.                     $this->ci->config->set_item('language', 'english');
  46.                     break;
  47.                 case 'es':
  48.                     $lang='spanish';
  49.                     $this->ci->config->set_item('language', 'spanish');
  50.                     break;
  51.                 default:
  52.                     $lang='english';
  53.                     $this->ci->config->set_item('language', 'english');
  54.                     break;
  55.             }
  56.  
  57.             $this->ci->session->set_userdata('language',$lang);
  58.            
  59.             $this->ci->lang->load('gestion',$lang);
  60.             $this->ci->lang->load('ion_auth',$lang);
  61.             $this->ci->lang->load('auth',$lang);
  62.             $this->ci->config->set_item('language', $lang);
  63.         }
  64.     }
  65. }
  66. /*
  67. /this ends hooks/Hook_lang.php
  68. */

Tras esto tenemos que informar a CodeIgniter del punto de interrupción. Si no existe creamos application/config/hooks.php y colocamos el siguiente código.
Como puedes comprobar, mediante la librería user_agent leo el lenguaje del navegador cliente y dependiendo del idioma cargo inglés y español. En caso de no sér ninguno de ellos, inglés por defecto.

Ahora creamos el hook,así:

  1. <?php
  2. defined('BASEPATH') OR exit('No direct script access allowed');
  3.  
  4. /*
  5. | -------------------------------------------------------------------------
  6. | Hooks
  7. | -------------------------------------------------------------------------
  8. | This file lets you define "hooks" to extend CI without hacking the core
  9. | files.  Please see the user guide for info:
  10. |
  11. |   https://codeigniter.com/user_guide/general/hooks.html
  12. |
  13. */
  14. $hook&#91;'post_controller_constructor']    = array(
  15.         'class'     =>  'select_lang',
  16.         'function'  =>  'choose',
  17.         'filename'  =>  'Hook_lang.php',
  18.         'filepath'  =>  'hooks'
  19.     );

Todo eso me surge por la necesidad de cambiar de idioma antes enviar la pantalla de login. De forma que el usuario pueda ver en el idioma de su navegador la traducción de la aplicación antes de loguearse.

Categories: codeigniter, Uncategorized

Deja un comentario