Foros del Web » Programando para Internet » PHP » CodeIgniter »

[SOLUCIONADO] Mi web ultilenguaje no funciona como debería

Estas en el tema de Mi web ultilenguaje no funciona como debería en el foro de CodeIgniter en Foros del Web. Hola, recientemente he estado construyendo un sitio que pretendo sea de dos lenguajes (por el momento) mi página de inicio muy bien, le puse dos ...
  #1 (permalink)  
Antiguo 06/03/2014, 16:11
 
Fecha de Ingreso: enero-2013
Mensajes: 14
Antigüedad: 11 años, 3 meses
Puntos: 0
Mi web ultilenguaje no funciona como debería

Hola, recientemente he estado construyendo un sitio que pretendo sea de dos lenguajes (por el momento) mi página de inicio muy bien, le puse dos banderitas para los lenguajes y los textos provenientes del "languaje > carpeta_lenguaje >archivo_lang.php" funcionan perfectamente.

El problema viene cuando elijo el segundo lenguaje, en este caso inglés, la página de inicio carga perfecto, y cuando me voy aa un enlace cualquiera, todo regresa a español, si en la URL manualmente cambio "es" por "en" sí se ve bien, pero sé que tengo un problema con el ruteo solo que no consigo encontrarlo, llevo ya dos días con este detalle y nada que lo soluciono, por eso me animé a pedir ayuda.

Mi portal funciona de la siguiente forma:

En el archivo ROUTES, agregué estas dos reglas (que si bien no las entiendo perfectamente, son tal y como las leí en un manual que seguí para hacer lo de multilenguaje)

Código PHP:
$route['(\w{2})/(.*)'] = '$2';
$route['(\w{2})'] = $route['default_controller']; 
Después en el CONFIG agregué esto:

Código PHP:
$config['languages'] = array("es" => "espanol""en" => "english");
$config['redirect_urls']=false
Extendí la clase del core LANG dejando en mi archivo "MY_Lang.php" esto:

Código PHP:
<?php (defined('BASEPATH')) OR exit('No direct script access allowed');
 
class 
MY_Lang extends CI_Lang
{
 function 
__construct()
 {
  
parent::__construct();  
  
$config =& get_config();
  if(isset(
$config['languages']) && isset($config['redirect_urls']))
  {
   global 
$URI$CFG$IN;
   
//var_dump($URI);
   
$lang = (isset($URI->segments['1']))?$URI->segments['1']:'';
   
$uri=$URI->segments;
   if(
strlen($lang) == && array_key_exists($lang,$config['languages']) == true)
   {
    
$config['language']=$config['languages'][$lang];
   }
   elseif(
$config['redirect_urls'] == true || strlen($lang) == && array_key_exists($lang,$config['languages']) == false)
   {
    
$url=$config['base_url'];
    
$url.=(empty($config['index_page']))?'':$config['index_page'].'/';
    
$url.=array_search($config['language'],$config['languages']).'/';
    if(
strlen($lang)==2)
    {
     
array_shift($uri);
     
$url.=implode('/',$uri);
    }else
    {
     
$url.=implode('/',$uri);
    }
    
header("location: $url");
   }
  }
 }
}
Con esto y mis dos carpetas de lenguaje con sus correspondientes archivos de cadenas todo funciona perfecto, pero si hago un enlace a otra parte del portal, independiente mente de usar "base_url()" o al directorio directo "Directorio/funcion" arma las urls de forma que el lenguaje "se le olvida" y me deja todo en el lenguaje por defecto, alguién me podría ayudar a ver mi error? tal vez es la forma en la que declaro las urls o a donde pongo los hrefs, pero ya estoy desesperado, ayuda por favor.

Saludos y de ante mano, mil gracias!!
  #2 (permalink)  
Antiguo 06/03/2014, 17:12
Avatar de patriciomase  
Fecha de Ingreso: abril-2012
Ubicación: Mar del Plata
Mensajes: 323
Antigüedad: 12 años
Puntos: 34
Respuesta: Mi web ultilenguaje no funciona como debería

pues con lo que tienes, tienes que anteponer el idioma a la ruta al armar los links. ejemplo, al pasar al ingles todos los links deberían cambiar por en.misitio.com/lalala

Sobre esa clase Lang que utilizas, francamente realiza funciones que una clase para traducir el sitio NO DEBERÍA realizar.

A mi modo de ver una elección de lenguaje deberías guardarla en una cookie. Así se vuelve persistente, sin necesidad de andar cambiando las urls, y además cuando el usuario retorna al sitio, tu lenguaje sigue ahi.

Lo que yo hago es tener un MY_Controller (controlador padre, para todos los controladores del sitio) y en el constructor de este controlador padre, pedir la cookie y si existe seteo el idioma, de esa forma todo anda "solo" y te desentiendes de cambiar código en cualquier otro lugar.
  #3 (permalink)  
Antiguo 06/03/2014, 17:25
 
Fecha de Ingreso: enero-2013
Mensajes: 14
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Mi web ultilenguaje no funciona como debería

Hola patriciomase antes que nada, muchas gracias por tu ayuda, he visto que al momento de cambiar el idioma de la página se "pierde" una diagonal y eso es lo que provoca el "mal funcionamiento" aunque por lo que veo es una mala implementación, me podrías poner un ejemplo de cómo lo haces?

Yo todavía no manejo cookies y a decir verdad no sé cómo hacerlo, pero con cualquier código de ejemplo yo me las arreglo, aunque eso implique cambiar toda la implementación, de nuevo mil gracias!!

Saludos!
  #4 (permalink)  
Antiguo 06/03/2014, 17:36
Avatar de patriciomase  
Fecha de Ingreso: abril-2012
Ubicación: Mar del Plata
Mensajes: 323
Antigüedad: 12 años
Puntos: 34
Respuesta: Mi web ultilenguaje no funciona como debería

nunca habia visto algo asi:
Código PHP:
Ver original
  1. $route['(\w{2})/(.*)'] = '$2';
pero por lo visto lo que hace es ignorar las 2 letras de idioma seguidas del punto, luego la clase de lenguaje, "lee" las 2 primeras letras y usa el lenguaje de acuerdo a eso.

crear y leer una cookie es muy fácil.

http://ellislab.com/codeigniter/user...ie_helper.html

los links de cambio de idioma puedes hacerlos en un controller especial para cambiar de idioma, de manera que llames a www.misitio.com/language/es, en ese controller seteas la cookie. Luego en el MY_COntroller (investiga acerca de MY_Controller es muy fácil) en el constructor lees si la cookie existe cambias el idioma. Y si todos los controllers heredan de MY_Controller eso es todo ya anda para todo el sitio
  #5 (permalink)  
Antiguo 06/03/2014, 17:57
 
Fecha de Ingreso: enero-2013
Mensajes: 14
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Mi web ultilenguaje no funciona como debería

Ok, enseguida empiezo a ver si puedo implementar esa solución, la verdad es que estoy muy verde en estos temas, CI me resultó muy fácil de usar y por eso me animé, esa forma de cambiar el idioma la encontré en un tutorial, pero ya me está dando más problemas que soluciones, al menos sé que no se va a perder todo el tiempo que he invertido en la página, muchas gracias por tu ayuda, en cuanto tenga algo te posteo los avances.

Saludos!!

EDITO:::::::::::::::::::

Según el manual que leí, esa línea lo que hace es:

Cita:
En el primer array se establece que cualquier ruta que tenga dos caracteres y una barra inclidada y algo mas, sera rederigida a ese algo más, y al segunda estable que cualquier ruta con dos caracteres llamara al controlador por defecto.
No sé si sirva de algo, yo tampoco lo entiendo del todo.
  #6 (permalink)  
Antiguo 07/03/2014, 07:08
Avatar de patriciomase  
Fecha de Ingreso: abril-2012
Ubicación: Mar del Plata
Mensajes: 323
Antigüedad: 12 años
Puntos: 34
Respuesta: Mi web ultilenguaje no funciona como debería

tienes 2 opciones:

1_ o haces que todos los links cambien y pones un "en." delante de todos los links cuando el usuario clickea en idioma ingles o

2_ (La opción buena) desechas lo que tienes, en el MY_Controller que ya hiciste andar, en el constructor:
- Lees la cookie
- Luego eliges el idioma según el que traiga la cookie con $this->lang->load(). Si no hay cookie le pones el por defecto.
- Deberás hacerte una controladora (podría llamarse language) para cambiar la cookie, de modo que el link de cambio de idioma lo apuntas a ese controller www.misitio.com/language/en en ese controller seteas la cookie. Para setear la cookie le pasas un array con un valor ej: array('idioma' => 'en')

Eso es todo, no hay más misterio, pero tienes que empezar a codear, no tiene sentido que te haga yo el trabajo, ya tienes el manual, ahora hay que meterle coco
  #7 (permalink)  
Antiguo 07/03/2014, 23:41
 
Fecha de Ingreso: enero-2013
Mensajes: 14
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Mi web ultilenguaje no funciona como debería

Ok, lo intentaré, pero en serio que a veces siento que aprendo chino ajajajajaa muchas gracias amigo! voy a intentar lo de la cookie como si fuera una sesión (me refiero a como meter los datos).

Saludos!!
  #8 (permalink)  
Antiguo 10/03/2014, 20:56
 
Fecha de Ingreso: enero-2013
Mensajes: 14
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Mi web ultilenguaje no funciona como debería

Hola amigo Patricio y a todos en el foro.

Sigo con el problema y ahora intentando implementar la solución de la cookie con el lenguaje, siguiendo las instrucciones que me dejaste, pero no aparece la cookie por ningún lado, el CI tampoco me arroja errores, así que me está siendo imposible llevar a cabo esta tarea, lo que llevo hasta el momento es:
  • He creado un "MY_Controller.php" en la carpeta "core" entro de "application" este controlador hereda de "CI_Controller"
  • Mi controlador de bienvenida (el "welcome" que trae CI por defecto, empecé de cero) hereda de "MY_Controller.php"

hasta aquí todo bien, el problema viene cuando en el constructor de MY_Controller "valida" si existe la cookie, si no existe, setea el valor "language" a "es", lo traté de hacer de esta forma:

Código dentro de MY_Controller.php
Código PHP:
class MY_Controller extends CI_Controller{

    public 
$data = array();

    function 
__construct()
    {

        
parent::__construct();

        
$getCookie $this->input->cookie('cookie_prueba');

        if (
$getCookie) {
            
$this->lang->load('app'$getCookie['language']);
        }else{
            
$this->setCookiePrueba();
        }

    }

    function 
setCookiePrueba(){
        
$cookie = array(
            
'name'   => 'cookie_prueba',
            
'value'  => 'valor_de_la_cookie_prueba',
            
'expire' => '99999',
            
'domain' => '.prueba.com',
            
'path' => '/',
            
'language' => 'es',
            
'secure' => TRUE
            
);

        
$this->input->set_cookie($cookie);

    }

Veo con las herramientas del navegador que es Chrome y nada, no existe mi cookie, alguna sugerencia? todas las funciones usadas provienen de la documentación de CI veersión 2.1.4, estoy seguro de que es algo básico pero nada, no consigo hacer que funcione, agradecería mucho su ayuda.

Saludos y gracias!
  #9 (permalink)  
Antiguo 12/03/2014, 21:05
 
Fecha de Ingreso: enero-2013
Mensajes: 14
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Mi web ultilenguaje no funciona como debería

Hola, solo vine a solucionar el tema, ya nadie me comentó nada, probando código y preguntado en otro lado, di con la solución, que ya viendola implementada, es la mejor, muchas gracias Patricio!!

Saludos!

Etiquetas: Ninguno
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.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:25.