Foros del Web » Programando para Internet » PHP »

Aporte: Traductor para pagina web multilenguaje sin BD

Estas en el tema de Aporte: Traductor para pagina web multilenguaje sin BD en el foro de PHP en Foros del Web. Hola! espero que este aporte le sirva a más de uno, es una pequeña clase que hice para traducir un sitio web, permite crear varios ...
  #1 (permalink)  
Antiguo 29/12/2011, 13:04
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 8 meses
Puntos: 336
Información Aporte: Traductor para pagina web multilenguaje sin BD

Hola! espero que este aporte le sirva a más de uno, es una pequeña clase que hice para traducir un sitio web, permite crear varios lenguajes fácilmente, aunque no es tan fácil de implementar como se imaginarán, sin embargo a mi me ha servido mucho!

Bueno comienzo explicando que este sistema no usa base de datos, por lo que es fácil para el usuario-cliente modificar, eliminar y agregar idiomas, el primer paso es crear una carpeta llamada "lang" donde creamos los archivos con nombres en un idioma por defecto por ejemplo ingles con extensión ".php" debería quedar así:

english.php
spanish.php
italian.php

después de crear cada archivo de idioma debemos agregar una única declaración de un arreglo llamado $words con las expresiones en el idioma por defecto y traducidas, por ejemplo:

spanish.php
Código PHP:
<?php
$words
=array(
"Hello"=>"Hola",
"Name"=>"Nombre",
"E-mail"=>"Correo",
"Cell phone"=>"Celular",
"Password"=>"Contraseña",
"Confirm"=>"Confirmar",
"Access"=>"Acceso",
"Area"=>"Área",
"Minor"=>"Menor",
"Emergency"=>"Emergencia",
"Alarm"=>"Alarma",
"Login"=>"Iniciar sesión",
"Actions"=>"Acciones",
"Logout"=>"Salir"
);
?>
Cada vez que quieran crear un idioma nuevo, bastaría con copiar uno existente y modificarlo.

No es necesario traducir las palabras en ingles, por lo tanto el archivo de ingles podría quedar así:

default.php
Código PHP:
<?php
$words
=array(
"Hello"=>"Hello"
);
?>
Cada expresión puede tener más de una palabra, deberían empezar siempre con mayúscula, (de todos modos se traducirán en MAYUSCULAS o minusculas, pero el arreglo debe ser Capitalizado), esto permite traducir correctamente expresiones largas con mayusculas como por ejemplo:

Código PHP:
"Create a new IP"=>"Crear nueva IP"
Ahora fuera de la carpeta creamos un archivo php llamado "lang.php", que es donde incluiremos la clase necesaria para traducir todas las páginas:

lang.php
Código PHP:
<?php 
if(!isset($declared)){
    class 
lngx{
        var 
$words;
        var 
$ret;
        function 
lngx(){
            if(
$lan=$_SESSION['language']) include("lang/$lan.php");else include("lang/default.php");
            
$this->words=$words;
        }
        function 
tran($word){
            
$ret=$word;
            if(isset(
$this->words[$word])) $ret=$this->words[$word];
            elseif(isset(
$this->words[strtoupper(substr($word,0,1)).substr($word,1)])) $ret=mb_strtolower($this->words[strtoupper(substr($word,0,1)).substr($word,1)],"UTF8");
            elseif(isset(
$this->words[substr($word,0,1).strtolower(substr($word,1))])) $ret=strtoupper($this->words[substr($word,0,1).strtolower(substr($word,1))]);
            return 
$ret;
        }
    }
    
$lang=new lngx;
    
$declared=1;
}
?>
Si observan, verán que el idioma lo defino en una sesión llamada "language", esto es útil para mantener siempre el idioma del usuario a medida que navega.

Para imprimir una palabra traducida debería usarse este formato:

Código PHP:
include("lang.php"); //incluir el archivo con la clase
//esto lee el arreglo del archivo solo una vez y se podrá usar varias veces

echo $lang->tran("Hello");
echo 
"<p>".$lang->tran("Login")."</p>"
si la palabra no se encuentra se devuelve el valor tal cual fue ingresado:

Código PHP:
echo $lang->tran("Whisky"); //Imprime "Whisky" 
La clase acepta mayusculas y minusculas, siempre y cuando sea la palabra completa en minusculas o mayusculas, por ejemplo:

Código PHP:
echo $lang->tran("Create a new IP"); //Imprime "Crear nueva IP"
echo $lang->tran("CREATE A NEW IP"); //Imprime "CREAR NUEVA IP"
echo $lang->tran("create a new ip"); //Imprime "crear nueva ip" 
Ahora si se quiere traducir un parrafo muy largo, pueden usar una referencia por ejemplo:

en spanish.php agregar
Código PHP:
"ReportsAndAlertsText"=>"Cada vez que el sistema identifique algún tipo de anormalidad,  generará diversos reportes y alertas preventivas a todo el personal responsable. De esa forma se tendrá un control total de las flotas." 
claro que tambien tendría que agregarse en english.php

Código PHP:
"ReportsAndAlertsText"=>"Each time the system to identify any abnormality, generate various reports and early warning to all staff responsible. That way you will have a total control of the fleets." 
luego solo imprimir $lang->tran("ReportsAndAlertsText") para obtener el texto completo

Para imprimir una lista de los idiomas disponibles y poder cambiarlos, puede usarse algo como esto:
Código PHP:
<?php
if($slang=$_GET['slang']) $_SESSION['language']=$slang;
echo 
$lang->tran("Change language").": ";
      
$dir=opendir("lang/");
      
$first=1;
      while ((
$file readdir($dir)) !== false) {
          if(
substr(strtolower($file),-4)==".php"){
              
$slang=substr($file,0,-4);
              if(
$first$first=0; else echo "| ";
                if(
$_SESSION['language']==$slang) echo ucfirst($lang->tran($slang));
                else{ 
?>
<a href="index.php?lang=<?php echo $slang; }?>" ><?php echo ucfirst($lang->tran($slang)); }?></a>
      <?php }
      } 
?>
Si alguien cree poder mejorar este sistema es bienvenido a aportar :)
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #2 (permalink)  
Antiguo 18/01/2012, 15:25
 
Fecha de Ingreso: septiembre-2009
Mensajes: 25
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Aporte: Traductor para pagina web multilenguaje sin BD

Hola muchas gracias por tu aporte!...

Te hago una consulta en el siguiente codigo para cambiar el idioma:

Código PHP:
Ver original
  1. <?php
  2. if($slang=$_GET['slang']) $_SESSION['language']=$slang;
  3. echo $lang->tran("Change language").": ";
  4.       $dir=opendir("lang/");
  5.       $first=1;
  6.       while (($file = readdir($dir)) !== false) {
  7.           if(substr(strtolower($file),-4)==".php"){
  8.               $slang=substr($file,0,-4);
  9.               if($first) $first=0; else echo "| ";
  10.                 if($_SESSION['language']==$slang) echo ucfirst($lang->tran($slang));
  11.                 else{ ?>
  12. <a href="index.php?lang=<?php echo $slang; }?>" ><?php echo ucfirst($lang->tran($slang)); }?></a>
  13.       <?php }
  14.       } ?>

al ponerlo en mi pagina queda en blanco o no carga... y me di cuenta que hay una llave ( } ), de mas, la saque y la pagina funciono pero el problema es que al hacer clic en los enlaces "http://localhost/index.php?lang=default", no funciona :(
  #3 (permalink)  
Antiguo 24/01/2012, 06:28
 
Fecha de Ingreso: abril-2010
Mensajes: 18
Antigüedad: 14 años, 7 meses
Puntos: 1
Respuesta: Aporte: Traductor para pagina web multilenguaje sin BD

Hola!

Estoy en la misma situación, no cambia el idioma.

¿Alguna sugerencia?

Gracias
  #4 (permalink)  
Antiguo 24/01/2012, 10:56
 
Fecha de Ingreso: abril-2010
Mensajes: 18
Antigüedad: 14 años, 7 meses
Puntos: 1
Respuesta: Aporte: Traductor para pagina web multilenguaje sin BD

Ya está claro. falta una "s" en el link
EL código correcto es:
Código PHP:
Ver original
  1. <?php
  2. if($slang=$_GET['slang']) $_SESSION['language']=$slang;
  3. echo $lang->tran("Change language").": ";
  4.       $dir=opendir("lang/");
  5.       $first=1;
  6.       while (($file = readdir($dir)) !== false) {
  7.           if(substr(strtolower($file),-4)==".php"){
  8.               $slang=substr($file,0,-4);
  9.               if($first) $first=0; else echo "| ";
  10.                 if($_SESSION['language']==$slang) echo ucfirst($lang->tran($slang));
  11.                 else{ ?>
  12. <a href="index.php?slang=<?php echo $slang; }?>" ><?php echo ucfirst($lang->tran($slang)); }?></a>
  13.       <?php
  14.       } ?>
  #5 (permalink)  
Antiguo 18/05/2012, 07:15
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 8 meses
Puntos: 336
Respuesta: Aporte: Traductor para pagina web multilenguaje sin BD

No había visto este tema en mucho tiempo, perdonen, y es cierto, faltó una "s" en lang, Gracias mamo por publicar el código correcto
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D

Etiquetas: bd, multilenguaje, traductor, aportes, usuarios
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

SíEste tema le ha gustado a 4 personas




La zona horaria es GMT -6. Ahora son las 08:19.