Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Manejar multiples idiomas Code Igniter

Estas en el tema de Manejar multiples idiomas Code Igniter en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola Actualmente estoy desarrollando una app con Code Igniter que tiene muchos niveles de jerarquia y por ende tengo muchos controllers y modelos, sin embargo ...
  #1 (permalink)  
Antiguo 05/05/2008, 16:31
Avatar de _ssx  
Fecha de Ingreso: mayo-2003
Ubicación: mX
Mensajes: 683
Antigüedad: 20 años, 11 meses
Puntos: 60
Manejar multiples idiomas Code Igniter

Hola

Actualmente estoy desarrollando una app con Code Igniter que tiene muchos niveles de jerarquia y por ende tengo muchos controllers y modelos, sin embargo mi duda es con respecto al manejo de los datos multi-idioma, en la base de datos yo tengo dos tablas.. por ejemplo

Tabla es_seccion y tabla en_seccion

Las dos tablas con esta estructura

id_seccion
id_parent
nomSeccion

Cuando se hace un nuevo registro envío los datos a las dos tablas para en una tener la misma información en dos idiomas.

Se me habia ocurrido crear un router que dependiendo de la url cambie de idioma.. ejemplo

http://app.com/es

http://app.com/en

Sin embargo no se como podria ser que todos los links apuntasen a el idioma pasado por la ulr, o si hay alguna manera mas decente de hacerlo, ademas de que en cada controlador no se si deba de hacer alguna comparación.. para saber que tabla cargar.. ¿alguna idea de como abordar mejor esto?
__________________
Escribe tu código de forma que refleje, y saque a relucir,lo mejor de tu carácter personal
www.oscararzola.com/blog
Principios de un programador
  #2 (permalink)  
Antiguo 06/05/2008, 08:40
Avatar de Barinas  
Fecha de Ingreso: agosto-2004
Ubicación: Caracas, Venezuela
Mensajes: 14
Antigüedad: 19 años, 8 meses
Puntos: 0
Re: Manejar multiples idiomas Code Igniter

Hola,

La verdad no se si esta sea la mejor manera pero se me ocurre que...

Seguramente la informacion por idiomas a nivel de db las separas a nivel de tablas.. por lo tanto yo me idearia alguna clase de regla para mis tablas, asi como tu mencionas

tablas en ingles

tabla1_en
tabla2_en

tablas en español

tabla1_es
tabla2_es

A nivel de vista seguro tendras cosas en ambos idiomas que no estaran en la base de datos entonces los nombres de las vistas igual

vistas en ingles

vista1_en.php
vista2_en.php

vistas en español

vista1_es.php

Usando el sistema de sessiones de codeigniter puedo cambiar el idioma sin tener que modificar las url

Modificaria la clase controller que esta en la carpeta libraries que es la que se inicializa con cada request.. añadiendo un atributo que defina el lenguaje y una condicion if a la funcion constructora que lo cambie en caso de existir un lenguaje definido en una variable de session.

Código PHP:

class Controller extends CI_Base {

    var 
$_ci_scaffolding    FALSE;
    var 
$_ci_scaff_table    FALSE;
        
/* El Atributo que define el lenguaje */
    
var $lenguaje "es";
    
/**
     * Constructor
     *
     * Calls the initialize() function
     */
    
function Controller()
    {    
        
parent::CI_Base();
        
$this->_ci_initialize();
        
log_message('debug'"Controller Class Initialized");
        
                
/* Aqui pregunto si hay un lenguaje definido por sesion
                    de haber sido definido, lo cambio */
        
if ($this->session->userdata('lenguaje') ){
            
$this->lenguaje $this->session->userdata('lenguaje');
        }
    }
.......
...... 
Entonces dicha variable $this->lenguaje estaria disponible en todos los controladores por herencia, permitiendote cargar las vistas de esta manera

Código PHP:
$this->load->view('folder_name/file_name_'.$this->lenguaje); 
Tambien podrias tener una estructura de vistas asi:

es/vista1.php

en/vista1.php

y llamarlas asi

Código PHP:
$this->load->view($this->lenguaje.'/file_name'); 
Lo mismo haria con la constructora de model y asi al hacer las consultas, si usas active record queria la estructura asi

Código PHP:
$query $this->db->get('mitabla_'.$this->languaje); 
Sino tus selects asi

Código PHP:
$sql "SELECT * FROM mitabla_$this->lenguaje ..... " 
Para cambiar el idioma solo tienes que manipular la variable de sesion a traves de un controlador. y redireccionar para que el cambio sea efectivo

Puedes crear un metodo al controlador principal que haga esto, o en el controlador que consideres y hacer que el usuario cambie el idioma con la url o con botones dentro del mismo site

Las posibilidades son muchas, hay que jugar y probar, lo mejor seria adaptar la idea sin tocar mucho la estructura del framework...

Saludos

Última edición por Barinas; 06/05/2008 a las 08:50
  #3 (permalink)  
Antiguo 06/05/2008, 11:52
Avatar de _ssx  
Fecha de Ingreso: mayo-2003
Ubicación: mX
Mensajes: 683
Antigüedad: 20 años, 11 meses
Puntos: 60
Re: Manejar multiples idiomas Code Igniter

Me parece muy buena idea.. gracias, sin embargo tengo una duda..

¿Como cambio el valor del objeto Controller?

intente hacer un método pero no me funciona.. no hay algo como super.variable.. como en java.. se que seria mas profesional hacer un get y set para la variable, pero no quiero meterle mucho mano al Controller.php

hice esto.. en mi controller principal

Código PHP:
function changeLang(){
        
parent::$lng = (parent::$lng=='es')? 'en''es';
        
redirect('app','location');
    } 
Me da error de sintaxis.. alguna idea..
__________________
Escribe tu código de forma que refleje, y saque a relucir,lo mejor de tu carácter personal
www.oscararzola.com/blog
Principios de un programador
  #4 (permalink)  
Antiguo 06/05/2008, 14:34
Avatar de Barinas  
Fecha de Ingreso: agosto-2004
Ubicación: Caracas, Venezuela
Mensajes: 14
Antigüedad: 19 años, 8 meses
Puntos: 0
Re: Manejar multiples idiomas Code Igniter

Cita:
Iniciado por _ssx Ver Mensaje
Me parece muy buena idea.. gracias, sin embargo tengo una duda..

hice esto.. en mi controller principal

Código PHP:
function changeLang(){
        
parent::$lng = (parent::$lng=='es')? 'en''es';
        
redirect('app','location');
    } 
Me da error de sintaxis.. alguna idea..
Te da error porque estas tratando de acceder a la variable del objeto padre Controller directamente, para hacer esto debes declarar la variable lng como static para permitir el acceso externo... yo no la declare static ya que uso las reglas de herencia para acceder a la variable y sessiones para modificarla

Tu idea o lo que tratas de hacer me parece mejor ya que no se usarian sesiones para modificar el valor, pero no podras acceder a la variable de esta forma $this->lng sino tendras que siempre llamarla asi parent::$lng tanto para modificarla como para leer su valor, espero que se entienda lo que digo

Saludos
  #5 (permalink)  
Antiguo 06/05/2008, 15:14
Avatar de _ssx  
Fecha de Ingreso: mayo-2003
Ubicación: mX
Mensajes: 683
Antigüedad: 20 años, 11 meses
Puntos: 60
Re: Manejar multiples idiomas Code Igniter

Hola, gracias por tu tiempo, sabes sin embargo me gusta la idea de las sessiones para no romper con los esquemas de herencia y oop, sin embargo ya hace el cambio pero si actualizo la pagina.. regresa al idioma anterior.. hice esto..

Código PHP:
<?php
class ChangeLang extends Controller{
    function 
index(){
        
$lnc = ($this->lng == 'es') ? 'en' 'es';
        
$this->session->set_userdata(array('lng'=>$lnc));
        
redirect('app''location');
    }
}
?>
Creo que el problema es que cada que invoco de nuevo a la pagina es como si el Controller iniciara de cero y no le importaran las sessiones y vuelve a setear el valor de

Código PHP:
var $lng "es"
Gracias, alguna idea de como usar correctamente las sessiones

En Controller.php tengo esto..

Código PHP:
class Controller extends CI_Base {

    var 
$_ci_scaffolding    FALSE;
    var 
$_ci_scaff_table    FALSE;
    var 
$lng "es";
    
    
/**
     * Constructor
     *
     * Calls the initialize() function
     */
    
function Controller()
    {    
        
parent::CI_Base();
        
$this->_ci_initialize();
        
log_message('debug'"Controller Class Initialized");
        
$this->load->library('session');
        
        if (
$this->session->userdata('lng')){
            
$this->lng $this->session->userdata('lng');
        }
    } 
En mi controlador App.php tengo esto en el constructor

Código PHP:
function App() {
        
parent :: Controller();
        
$this->load->language('main'$this->lng);
    } 
__________________
Escribe tu código de forma que refleje, y saque a relucir,lo mejor de tu carácter personal
www.oscararzola.com/blog
Principios de un programador
  #6 (permalink)  
Antiguo 07/05/2008, 12:31
Avatar de Barinas  
Fecha de Ingreso: agosto-2004
Ubicación: Caracas, Venezuela
Mensajes: 14
Antigüedad: 19 años, 8 meses
Puntos: 0
Re: Manejar multiples idiomas Code Igniter

Cita:
Iniciado por _ssx Ver Mensaje

En mi controlador App.php tengo esto en el constructor

Código PHP:
function App() {
        
parent :: Controller();
        
$this->load->language('main'$this->lng);
    } 
Hay algo que no entiendo, De donde estas sacando ese metodo y con que proposito ?? $this->load->language???
  #7 (permalink)  
Antiguo 07/05/2008, 12:56
Avatar de _ssx  
Fecha de Ingreso: mayo-2003
Ubicación: mX
Mensajes: 683
Antigüedad: 20 años, 11 meses
Puntos: 60
Re: Manejar multiples idiomas Code Igniter

Ah, ese es la clase que trae CI, para cargar archivos de idioma, yo tengo dos archivos de idioma y es para tener arrays asociativos que corresponden a la configuración y textos constantes.. que quiero tambien internacionalizar..
__________________
Escribe tu código de forma que refleje, y saque a relucir,lo mejor de tu carácter personal
www.oscararzola.com/blog
Principios de un programador
  #8 (permalink)  
Antiguo 09/05/2008, 08:47
Avatar de Barinas  
Fecha de Ingreso: agosto-2004
Ubicación: Caracas, Venezuela
Mensajes: 14
Antigüedad: 19 años, 8 meses
Puntos: 0
Re: Manejar multiples idiomas Code Igniter

Hola _xss

Disculp por no responder rapido, he estado ocupado..

No veo nada raro en el codigo y te digo que la sesion no se pierde con el refresh ya que controlador no reinicia las sesiones, de ser asi las sesiones no serian sesiones como tal ya que se perderian en cada request.. Cuando tenga mas tiempo me pongo a hacer pruebas

Saludos
  #9 (permalink)  
Antiguo 08/09/2008, 09:02
 
Fecha de Ingreso: septiembre-2008
Mensajes: 3
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Manejar multiples idiomas Code Igniter

Hmmm. esto me interesa muuucho!

entonces ¿funciona todo bien?

Soy novato en CI y para mi primera aplicación tengo que hacerla en 4 idiomas y necesito simplicidad, no complicarme la vida si algo no funciona.

Gracias

^_^
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 05:09.