Ver Mensaje Individual
  #1 (permalink)  
Antiguo 29/12/2011, 13:04
Avatar de stramin
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