Sitios multiidioma en PHP

by manelgarcia on December 10, 2008

in PHP

Estoy programando el nuevo sitio web para un famoso grupo de música y me han pedido hacerlo en 4 idiomas: catalán, castellano, inglés e francés.

Podría hacerlo de muchas maneras pero he escojido la siguiente: Mediante carpetas /en, /es, /fr, /ca voy a ir poniendo archivos con los textos del sitio traducidos (excepto el contenido dinámico, por supuesto). Usaré la función define() para a una misma variable darle diferentes valores.

También habrá una variable de session expandida por todo el sitio llamada $_SESSION['lang']. Así pues dependiendo de esa variable con 4 posibles valores (es, ca, en, fr) la usaremos para incluir un archivo u otro. Por ejemplo:

$l = $_SESSION['lang'] = 'es';

include 'es/traduccion_'. $l .'.php';

Otro problema que he tenido ha sido, cómo cambiar de idioma mediante sesiones y que hacer la primera vez que alguien entra en el sitio.

El script consta de un sólo archivo que lo he llamado lang.inc.php

  session_start();

  function initLang(){

      if(!$_SESSION['lang'] || $_SESSION['lang'] == ""){
        $_SESSION['lang'] = "es";

      }

  }

  function setLang($lang){

    if($lang == "" || empty($lang)){    initLang();
    }else{  

      switch($lang){

        case "en":  case "fr": case "ca": case "es": $_SESSION['lang'] = $lang; break;
        default: $lang = "es";

      }$_SESSION['lang'] = $lang;

    }
  }

Y para su uso es tan fácil cómo llamar a la siguiente función al inicio de cada pàgina:

require 'inc/lang.inc.php';
setLang($lang); // donde $lang puede venir mediante $_GET ej: ?lang=fr

Así de fácil :) Espero que os sirva.

{ 6 comments… read them below or add one }

aprendiz June 26, 2009 at 5:19 pm

Un saludo, ecelente ejemplo, muchas gracias por el aporte ya que precisamente necesitava esto mismo y todo lo que había probado me había funcionado a media.

Marc September 30, 2009 at 11:26 am

El problema mas grande con el que me encuentro siempre es en componer una función como dios manda para gestionar el cambio de idioma durante la navegación, para que se mantenga en la misma página.

Y con el paso de parámetros por GET, también me encuentro con un soberano problema a la hora de tener que gestionar procesos, peticiones de inserción de formularios, paginaciones de listado.. etc… que siempre tienes que ir recogiendo lo que te viene por $_GET y luego devolverlo para mostrar el listado….

Un tema rudo y peliagudo… a ver, eso siempre se puede solucionar con una $_SESSION, pero personalmente no me gustan…

Si alguien tiene una forma lógica de proceder y evitar esto, sería algo fabuloso :P

Gracias

Manel García September 30, 2009 at 12:33 pm

Hola Marc!,

Em permeto el luxe de respondre en català. :P

Amb la sessió enmegatzaada i la funció $_SERVER['REQUEST_URI'] pots fer alguna cosa del tipus:

$url = $_SERVER['REQUEST_URI'].$_SESSION['lang'];

A veure si et pot ser d’ajuda.

Salutacions!

pedro November 30, 2009 at 7:33 pm

Buenas, no me funciona.. no llega ni a hacer una selección e codigo todos los codigos que muestra y he seguido las instruccines y no consigo hacerlo :/&

Jaume January 19, 2010 at 1:13 pm

Hola Manel i Marc. Jo el que faig, per mantenir tota la cadena de les variables, i per tal que no em dupliqui el paràmetre de l’idioma, és el següent:

$value)
// Si el paràmetre no és l’idioma
if($key != lang){
$gets.=”&”.$key.”=”.$value;
}
?>

I llavors, a l’enllaç a cada idioma, el “href” apunta a:
?lang=nomdelidioma

Pot ser una mica liós, però a mi em funciona. Si teniu cap dubte, el meu correu és jaume@espaipixel.com

Salut!

Jaume January 19, 2010 at 1:16 pm

Collons! Veig que se m’ha menjat part del codi… :(

Miro de tornar-lo a enganxar:
// Recullo els paràmetres _GET (si n’hi ha)
$gets=”";
foreach ($_GET as $key => $value)
// Si el paràmetre no és l’idioma
if($key != lang){
$gets.=”&”.$key.”=”.$value;
}

Faig el link:
echo $_SERVER["PHP_SELF"].”?lang=nomdelidioma”.$gets

A veure si ara es veu bé…

Salut!

Leave a Comment

Previous post:

Next post: