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

¿Alguien ha hecho alguna vez una web con urls multilenguaje?

Estas en el tema de ¿Alguien ha hecho alguna vez una web con urls multilenguaje? en el foro de CodeIgniter en Foros del Web. Hola a todos y gracias por leer este mensaje. Vereis, estoy desarrollando una web y hasta ahora venía usando CodeIgniter, pero me encuentro con un ...
  #1 (permalink)  
Antiguo 08/04/2012, 09:56
 
Fecha de Ingreso: febrero-2002
Mensajes: 351
Antigüedad: 22 años, 2 meses
Puntos: 19
¿Alguien ha hecho alguna vez una web con urls multilenguaje?

Hola a todos y gracias por leer este mensaje.

Vereis, estoy desarrollando una web y hasta ahora venía usando CodeIgniter, pero me encuentro con un problema al que de momento no encuentro solución después de todas las soluciones que me han dado y que no han funcionado.

Necesitaría saber si alguno de vosotros ha creado una web con urls multilenguaje. Y no me refiero solamente a que tenga un /en o un /es después del nombre del dominio, sino algo más complejo tipo:
www.sitio.com/es/acerca_de (español)
www.sitio.com/en/about_us (inglés)

Todos los frameworks que he ido probando, están realizados para que a continuación del idioma, vaya el nombre del controlador, por lo que al final las urls terminan siendo así:
www.sitio.com/es/about
www.sitio.com/en/about

Ya he probado a realizar cambios en los archivos de configuración: routes/routing, y también con la típica documentación de las librerías i8n, pero no me ha servido de nada.

¿Alguno ha tenido que realizar alguna web con el tipo de URL's que yo necesito?. Al final me veo programando con PHP a pelo, y perdería un montón de tiempo que me ahorran los frameworks.

Muchas gracias por anticipado y un cordial saludo.
  #2 (permalink)  
Antiguo 08/04/2012, 10:14
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: ¿Alguien ha hecho alguna vez una web con urls multilenguaje?

Que tal KLAYMAN,

No se que fw's has probado, pero tanto Zend como Symfony tienen soporte para lo que comentas, te dejo las referencias Zend, Symfony 1x, Symfony 2.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #3 (permalink)  
Antiguo 08/04/2012, 10:42
Avatar de gjx2  
Fecha de Ingreso: agosto-2008
Ubicación: R.D
Mensajes: 1.153
Antigüedad: 15 años, 8 meses
Puntos: 139
Respuesta: ¿Alguien ha hecho alguna vez una web con urls multilenguaje?

Hermano , codeigniter contiene una carpeta donde puedes almacenar los lenguajes que quieras
> system > application > language

Luego en tus controladores puedes crear una funcion de remap y cargar el lenguaje que estas solicitando.

Te dejo dos puntos que debes de leer bien.
multiples Lenguajes
remapping

tambien puediera modificar el .htaccess para que te simule que primero va el lenguaje.
  #4 (permalink)  
Antiguo 08/04/2012, 11:34
Avatar de gjx2  
Fecha de Ingreso: agosto-2008
Ubicación: R.D
Mensajes: 1.153
Antigüedad: 15 años, 8 meses
Puntos: 139
Respuesta: ¿Alguien ha hecho alguna vez una web con urls multilenguaje?

Tambien se me ha ocurrido algo fortalenciendo mi primer post
creas un controlador para cada lenguaje ej. es,en .. y lo creas con un metodo de _remap y otro que te devuelva la pagina solicitada.

ej.

Controller es.

Código PHP:
Ver original
  1. class Es extends Controller
  2.  {
  3.        
  4. function _remap()
  5. {
  6.    
  7. # Primer argumento le pasas el idioma, Segundo: pasas la pagina solicitada
  8. $this->getPage( $this->uri->segment(1),  $this->uri->segment(2) );
  9.                        
  10. }  
  11.  
  12. function getPage( $lang = 'es',  $page = 'home' )
  13. {
  14.                
  15. # esto llamara el archivo del lenguaje
  16. $this->lang->load('filename', $lang);
  17.                                  
  18. # Finalmente llamo el archivo html 
  19. $this->load->view( $page );
  20. }
  21.    
  22.  
  23.  
  24. }

el ejemplo esta basado en la versión 1.7
  #5 (permalink)  
Antiguo 08/04/2012, 11:46
 
Fecha de Ingreso: febrero-2002
Mensajes: 351
Antigüedad: 22 años, 2 meses
Puntos: 19
Respuesta: ¿Alguien ha hecho alguna vez una web con urls multilenguaje?

Muchas gracias por vuestras respuestas tan rápidas masterpuppet y gjx2.

gjx2 esos enlaces que me has dado ya los he leido varias veces, pero no explica la traducción de las urls a otros idiomas, usando un único controlador.

De hecho, he probado tanto con:
http://codeigniter.com/wiki/CodeIgni...alization_i18n, como con:
http://codeigniter.com/wiki/URI_Language_Identifier y el resultado es que sí puedo realizar urls tipo:
www.misitio.com/en/about
www.misitio.com/es/about

pero no:
www.misitio.com/en/about_us
www.misitio.com/es/acerca_de
utilizando un sólo controlador, que es lo lógico.

Como te digo he preguntado en los foros oficiales y las respuestas que me han dado no me han funcionado, por eso preguntaba alguien que personalmente haya desarrollado una web de este tipo y le haya funcionado.


masterpuppet, estamos en el mismo caso que le comento al usuario que he respondido anteriormente.

Todos los frameworks tienen soporte para crear webs multilenguajes, pero hasta ahora no he encontrado ninguno que permita utilizando un mismo controlador, utilizar dos urls distintas (una para cada idioma) y que por supuesto no aparezca su nombre en la url, sino lo que yo especifique en el archivo configuración de las rutas.

Te pongo un claro ejemplo de que lo que digo es una realidad, al menos hasta donde he llegado (ya llevo varios días buscando y preguntando sin éxito).
En el libro de Desarrollo Web Agil con Symfony2, de Javier Eguiluz, se indica lo siguiente:

"Lamentablemente, Symfony2 no permite traducir los patrones de las rutas. Así que aunque traduzcas el sitio web al inglés, la ruta de una oferta por ejemplo será /en/{ciudad-en-español}/oferta/
{slug-en-español}
y no /en/{ciudad-en-inglés}/offer/{slug-en-inglés}.

Como este requerimiento es tan habitual en las aplicaciones internacionalizadas, existen varios bundles desarrollados por terceros que añaden esta funcionalidad. El más popular es BeSimpleI18nRoutingBundle".

Bien, esto es perfecto, pero resulta que BeSimpleI18nRoutingBundle, según veo en Github sigue en desarrollo, por lo que quizás no sea 100% funcional.

Por todas estas razones, buscaba alguien que haya tenido la experiencia de desarrollar algo parecido a lo que busco con algún framework.

Muchas gracias por vuestras respuestas y un cordial saludo.
  #6 (permalink)  
Antiguo 08/04/2012, 11:51
 
Fecha de Ingreso: febrero-2002
Mensajes: 351
Antigüedad: 22 años, 2 meses
Puntos: 19
Respuesta: ¿Alguien ha hecho alguna vez una web con urls multilenguaje?

Cita:
Iniciado por gjx2 Ver Mensaje
Tambien se me ha ocurrido algo fortalenciendo mi primer post
creas un controlador para cada lenguaje ej. es,en .. y lo creas con un metodo de _remap y otro que te devuelva la pagina solicitada.

ej.

Controller es.

Código PHP:
Ver original
  1. class Es extends Controller
  2.  {
  3.        
  4. function _remap()
  5. {
  6.    
  7. # Primer argumento le pasas el idioma, Segundo: pasas la pagina solicitada
  8. $this->getPage( $this->uri->segment(1),  $this->uri->segment(2) );
  9.                        
  10. }  
  11.  
  12. function getPage( $lang = 'es',  $page = 'home' )
  13. {
  14.                
  15. # esto llamara el archivo del lenguaje
  16. $this->lang->load('filename', $lang);
  17.                                  
  18. # Finalmente llamo el archivo html 
  19. $this->load->view( $page );
  20. }
  21.    
  22.  
  23.  
  24. }

el ejemplo esta basado en la versión 1.7
Probaré eso que me indicas, aunque es algo más lioso en un principio, que lo que pueda hacer bajo un archivo de configuración.

Si logro conseguirlo tendré que hacer un tutorial o algo, porque no hay información 100% comprobada en ningún sitio
  #7 (permalink)  
Antiguo 08/04/2012, 12:04
Avatar de gjx2  
Fecha de Ingreso: agosto-2008
Ubicación: R.D
Mensajes: 1.153
Antigüedad: 15 años, 8 meses
Puntos: 139
Respuesta: ¿Alguien ha hecho alguna vez una web con urls multilenguaje?

Te lo pongo mas facil.

creas un controlador que se llame Pages


Código PHP:
Ver original
  1. class Pages extends Controller
  2. {
  3.                
  4. function _remap()
  5. {
  6.    
  7.     $this->getPage( $this->uri->segment(1),$this->uri->segment(2) );                       
  8. }  
  9.    
  10.    
  11.    
  12. function getPage( $lang = "es", $page = "home" )
  13. {
  14. if(empty($page)){
  15.  $page = "home";
  16. }
  17. # Cargas el lenguaje y el archivo
  18. $this->lang->load('filename', $lang);
  19.  
  20. # Llamas el archivo html
  21. $this->load->view( $page );
  22. }
  23.    
  24.    
  25.  
  26. }

Creas las reglas de ruteo

Código PHP:
Ver original
  1. $route['es/(:any)']    = "pages/es/$1";
  2. $route['es']         = "pages";

Cuando el usuario haga esto

http://tusitio.com/es/about

lo que esta haciendo internamente es una llamada al controlador Pages pero para la vista de usuario es a un controlador llamado es que no existe.
  #8 (permalink)  
Antiguo 08/04/2012, 12:08
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: ¿Alguien ha hecho alguna vez una web con urls multilenguaje?

Los 3 ejemplos que te comente te permiten traducir urls y mapearlas a un mismo controlador, de hecho yo los utilizo tanto en Zend como en Symfony 2, y con respecto a que esta en desarrollo el plugin de Sf2, en donde en el github del plugin comentan que no es estable ?, el build status es passing y lo recomienda stof que no es poco.
__________________
http://es.phptherightway.com/
thats us riders :)
  #9 (permalink)  
Antiguo 08/04/2012, 13:53
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 19 años, 5 meses
Puntos: 43
Respuesta: ¿Alguien ha hecho alguna vez una web con urls multilenguaje?

no has probado con el route de CI como dice gjx2, en mi framework que hice (algo parecido al CI pero mas ordenado jeje hasta que salio HMVC para CI :P ) yo ruteo de la siguiente manera:
$router[':(any)/:(any)'] = 'controller/accion/$1/$2';

y después en tu controller pasas los parametros $1 y $2 hacia algún método que lo que haga es buscar en tu base de datos el idioma y el titulo, o si no quieres usar el idioma solo el título.
Entonces en tu db en la tabla donde guardas ese contenido deberías tener dos campos leng y titulo cosa que guarde algo como:
titulo -> sobre nosotros
leng -> es
titulo -> about us
leng -> en

salu2
  #10 (permalink)  
Antiguo 08/04/2012, 16:11
 
Fecha de Ingreso: febrero-2002
Mensajes: 351
Antigüedad: 22 años, 2 meses
Puntos: 19
Respuesta: ¿Alguien ha hecho alguna vez una web con urls multilenguaje?

Miles de gracias por todas vuestras respuestas, sois muy amables ;)

Iré probando lo que me habéis comentado, tanto crear funciones como rutear directamente desde el archivo de configuración.

Si vosotros tenéis creado algo así parecido a lo que quiero, me quedo más tranquilo. Será cuestión de ir probando y ver en donde está el fallo.

Con vuestro permiso iré posteando las dudas o problemas que me vayan surgiendo.

Si al final lo consigo, escribiré en algún sitio un tutorial o videotutorial, para que ayude a otros usuarios que lo necesiten.

Un saludo y de nuevo miles de gracias.
  #11 (permalink)  
Antiguo 08/04/2012, 17:22
 
Fecha de Ingreso: febrero-2002
Mensajes: 351
Antigüedad: 22 años, 2 meses
Puntos: 19
Respuesta: ¿Alguien ha hecho alguna vez una web con urls multilenguaje?

Bueno, creo que al final lo he solucionado sin tener que utilizar ningún controlador Pages, ni nada parecido, tan sólo tocando el archivo routes.php.

Lo que no se es la razón por la cual antes no funcionaba y ahora sí.
Os pongo el routes.php, tal y como lo tenía antes:

Cita:
$route['default_controller'] = "index";
$route['404_override'] = '';

$route['en/index'] = "index";
$route['es/index'] = "index";

$route['en/prueba_en'] = "about";
$route['es/prueba'] = "about";

// example: '/en/about' -> use controller 'about'
$route['^en/(.+)$'] = "$1";
$route['^es/(.+)$'] = "$1";

// '/en' and '/es' -> use default controller
$route['^en$'] = $route['default_controller'];
$route['^es$'] = $route['default_controller'];

Lo he dejado finalmente así y parece que funciona:
Cita:
$route['default_controller'] = "index";
$route['404_override'] = '';

$route['en/index'] = "index";
$route['es/index'] = "index";

$route['en/prueba_en'] = "about";
$route['es/prueba'] = "about";

// '/en' and '/es' -> use default controller
$route['^en$'] = $route['default_controller'];
$route['^es$'] = $route['default_controller'];

O sea que borrando las dos líneas:
Cita:
//$route['^en/(.+)$'] = "$1";
//$route['^es/(.+)$'] = "$1";
se ha solucionado.


Debo suponer que a pesar de que
Cita:
$route['en/index'] = "index";
$route['es/index'] = "index";

$route['en/prueba_en'] = "about";
$route['es/prueba'] = "about";
aparecían por delante, finalmente CodeIgniter tenía en cuenta las líneas posteriores.


En fin, de momento todo OK creo, aunque tendrá que seguir comprobando que no hay algún otro fallo.

Saludos y gracias por todo, os debo una.
Por cierto, os dejo karma.
  #12 (permalink)  
Antiguo 08/04/2012, 21:18
Avatar de gjx2  
Fecha de Ingreso: agosto-2008
Ubicación: R.D
Mensajes: 1.153
Antigüedad: 15 años, 8 meses
Puntos: 139
Respuesta: ¿Alguien ha hecho alguna vez una web con urls multilenguaje?

O sea quiere decir que vas a crear un router para cada pagina :S lo veo redundante si esa es la intencion.
y que pasaria si yo quiero hacer

http://misitio.com/es/historia

Tendria que agregar esto al router segun tu codigo ?
  #13 (permalink)  
Antiguo 09/04/2012, 01:05
 
Fecha de Ingreso: febrero-2002
Mensajes: 351
Antigüedad: 22 años, 2 meses
Puntos: 19
Respuesta: ¿Alguien ha hecho alguna vez una web con urls multilenguaje?

gjx2, eso ya lo pensé ayer, aunque en realidad sólo tengo 4 o 5 páginas, así que en este caso tampoco es mucho problema. Otra cosa será para otro tipo de páginas más complejas, que sí que sería un engorro.

De todas formas, tu código lo probé, agregué al proyecto de CodeIgniter el controlador Pages y luego las dos líneas en el archivo routes.php que me comentaste. Pero curiosamente me da el mismo error que me daba con otros códigos que ya había probado en días anteriores "Error 404: Página no encontrada".

Luego miraré a ver que puede pasar, y si veo que no lo consigo solucionar pondré el código de los dos archivos controladores que tengo.

Un saludo crack ;)
  #14 (permalink)  
Antiguo 09/04/2012, 03:10
 
Fecha de Ingreso: febrero-2002
Mensajes: 351
Antigüedad: 22 años, 2 meses
Puntos: 19
Respuesta: ¿Alguien ha hecho alguna vez una web con urls multilenguaje?

gjx2, tengo una pregunta que hacerte, que no me queda del todo claro.

Supongo que en los archivos vista debo llamar a la función privada _remap() del controlador pages.php.
No me queda claro como hacerlo, ni como pasarle los parámetros, si esto hay que hacerlo así me parece que es aquí donde tengo el problema.

Por ejemplo, hasta ahora utilizo en una vista un anchor, tal como este:
Código:
 <?php echo anchor('about','About us'); ?>
Y esto llama al controlador 'about'.

También tengo en la vista una línea que cambia el idioma, que hasta ahora me funciona bien:
Código:
 <?php echo anchor($this->lang->switch_uri('es'),'Cambiar a español'); ?>
Supongo que esta línea quedará igual y no hay que tocarla.


Pego por aquí el código de algunos de los archivos:

routes.php
Código:
$route['default_controller'] = "index";
$route['404_override'] = '';

$route['es/(:any)'] = "pages/es/$1";
$route['es'] = "pages";
 
// '/en' and '/es' -> use default controller
$route['^en$'] = $route['default_controller']; 
$route['^es$'] = $route['default_controller'];

controllers/pages.php
Código:
<?php

class Pages extends CI_Controller {

    function _remap() {
        # Primer argumento le pasas el idioma, Segundo: pasas la pagina solicitada
        $this->getPage($this->uri->segment(1), $this->uri->segment(2));
    }

    function getPage($lang = "es", $page = "home") {
        if (empty($page)) {
            $page = "home";
        }
        # Cargas el lenguaje y el archivo
        $this->lang->load('filename', $lang);

        # Llamas el archivo html
        $this->load->view($page);
    }

}
?>

controllers/about.php
Código:
         public function __construct() {
            parent::__construct();
        }


        public function index()
        {
            $this->lang->load('about');
            if ($this->lang->lang() == "es")
            {
            $data['title'] = 'Acerca de Nosotros';
            $data['main_content'] = '/es/about';
            $this->load->view('template/template',$data);
            }
            else
            {
            $data['title'] = 'About us';
            $data['main_content'] = '/en/about_us';
            $this->load->view('template/template',$data);  
            }
        }
}

views/en/index.php -> Aquí hago llamada a las distintas páginas
Código:
       <?php echo $this->lang->line('message_welcome'); ?>
       <?php echo anchor($this->lang->switch_uri('es'),'Cambiar a español'); ?>
       <?php echo anchor('about','About us'); ?>

Creo que con estos códigos es suficiente. Sigo mientras probando, si lo soluciono actualizo.

Gracias por todo.
  #15 (permalink)  
Antiguo 09/04/2012, 07:20
Avatar de gjx2  
Fecha de Ingreso: agosto-2008
Ubicación: R.D
Mensajes: 1.153
Antigüedad: 15 años, 8 meses
Puntos: 139
Respuesta: ¿Alguien ha hecho alguna vez una web con urls multilenguaje?

Cita:
Iniciado por KLAYMAN Ver Mensaje
Supongo que en los archivos vista debo llamar a la función privada _remap() del controlador pages.php.
No me queda claro como hacerlo, ni como pasarle los parámetros, si esto hay que hacerlo así me parece que es aquí donde tengo el problema.
Estas confundido aqui por que realmente en la vista no se hace nada mas que presentar el html,css y js como son paginas que no son dinámicas, contienen el mismo formato del template y son pocas es muy fácil en global todo el código en el mismo controlador Pages y no tener la necesidad de crear un controlador para cada de ellas.

lo que tienes que crear en tu controlador Pages un metodo que te retorne las variables de


Código PHP:
Ver original
  1. $data['title'] = 'Acerca de Nosotros';
  2.             $data['main_content'] = '/es/about';
  3.             $this->load->view('template/template',$data);

Segun sea el caso.
  #16 (permalink)  
Antiguo 09/04/2012, 07:49
 
Fecha de Ingreso: febrero-2002
Mensajes: 351
Antigüedad: 22 años, 2 meses
Puntos: 19
Respuesta: ¿Alguien ha hecho alguna vez una web con urls multilenguaje?

Correcto, tienes toda la razón del mundo, en las vistas no se hace ninguna llamada. Creo que me he explicado mal, pero en realidad tu respuesta me ha servido igualmente, o sea que las líneas:
Código:
 <?php echo anchor('about','About us'); ?>
y
Código:
 <?php echo anchor($this->lang->switch_uri('es'),'Cambiar a español'); ?>
quedan exactamente igual.

Bueno, con la información que me has dado ya no voy a molestar más. Trataré de poner todo en orden, aunque veo que voy a tener que hacer un repaso a la documentación.

Saludos y miles de gracias.

Etiquetas: alguna, framework, hecho, vez, url
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 20:29.