Google Translator PHP

Google Translator PHP es un wrapper (adaptador) de la API de Google Translator. Esta API, además de ser gratuita, permite la traducción entre más de 40 idiomas, incluidos vasco, gallego y catalán.

Algunas de las funcionalidades aportada por esta librería son:

  • Traducción entre más de 40 idiomas disponibles.
  • Soporte para HTML.
  • Soporte mejorado para textos largos.
  • Detección de idioma.
  • Trabaja en entornos con y sin curl.
  • Soporte para las credenciales de la API.

Ejemplos de uso

Traducción

require 'GoogleTranslator.php';
$gt = new GoogleTranslator();
echo $gt->Translate('¡Hola!', 'es', 'en');

Detección de idioma

require 'GoogleTranslator.php';
$gt = new GoogleTranslator();
echo $gt->Detect('Si tratta di un piccolo testo in italiano');

Traducción sin conocer el idioma origen

require 'GoogleTranslator.php';
$gt = new GoogleTranslator();
echo $gt->Translate('¡Hola!', '', 'en');
echo 'Idioma detectado: ' . $gt->GetDetectedLanguage();

Listar los idiomas disponibles

require 'GoogleTranslator.php';
$gt = new GoogleTranslator();
echo '<select> ';
foreach(GoogleTranslator::AvailableLanguages() as $code =&gt; $name) {
       echo "<option value="$code">$name</option>";
}
echo '</select>';

Observaciones

Traducción de textos largos

Una de las mayores diferencias de esta implementación de la API respecto a otras librerías se basa en el soporte para textos largos. Google impone un límite máximo de 5.000 caracteres para sus consultas POST, por lo que para traducir textos de mayor tamaño es necesario dividirlos y traducirlos a trozos. Sin embargo, si esto no se hace de manera adecuada puede darse el caso de que se corten oraciones o etiquetas HTML. La mayoría de implementaciones no tienen en cuenta este detalle, y es por ello que pueden dar lugar a traducciones erróneas y poco precisas. Google Translator PHP sí tiene en cuenta este problema y se encarga de dividir automáticamente el texto de manera adecuada para intentar mantener la coherencia y el formato en la medida de los posible. Además, intenta realizar esta división utilizando la mínima memoria posible, para evitar que el script agote toda la memoria asignada al traducir un texto de tamaño considerable.

Uso en entornos sin curl

Google Translator PHP es compatible en entornos que no dispongan de las funciones curl, situación que se da típicamente en sistemas Windows. Para ello, realiza todas las llamadas a la API mediante GET y usando file_get_contents, por lo que puede dar lugar a que se ralentice la traducción de textos largos, debido a que éstos deberán dividirse en trozos aún más pequeños.

Descarga

Google Translator PHP 1.0

  • silvia
    #1 escrito por silvia  hace 1 año

    Hola,
    Me he mirado tu código y funciona bastante bien, sólo que el resultado obtenido lo tengo que pasar por la función php utf8_decode()
    Mi problema real es al traducir un texto chino. El valor devuelto no soy capaz de visualizarlo con los carácteres chinos, me salen símbolos extraños.

  • Camilo Zambrano Lagos
    #2 escrito por Camilo Zambrano Lagos  hace 10 meses

    Estimado, tuve la suerte de acceder a tu adaptación de la API de google translate para PHP. Debo decirte que me pareció excelente la idea ya que era justo lo que andaba buscando para implementarlo en un framework PHP que estamos haciendo junto a un grupo de compañeros. No me he presentado aún, mi nombre es Camilo Zambrano Lagos, soy estudiante de 4to año de Ingeniería Informática en Valparaíso, Chile. Como te mencionaba, con un grupo de amigos comenzamos la construcción de un framework, llamado Silverfang que de a poco comienza a ser más potente, y en esta ocasión andabamos buscando la posibilidad de incorporar un motor de traducción fácil. Me gustaría saber si tengo tu permiso (a pesar de que la librería que ofreces es gratis) para incorporarlo al framework y hacerle los ajustes necesarios para que forme parte de la API de éste. Tus créditos irán de igual manera en el archivo, tal como lo descargué. Me gustaría me respondieras a la brevedad.

    Cuidate, y siempre estamos interesados en tener comunicación con gente de fuera y generar contactos.

    Saludos,

    Camilo Zambrano Lagos
    Líder Proyecto Silverfang.

  • fabricio
    #3 escrito por fabricio  hace 8 meses

    hola, tengo entendido que ya salio la version 2 del API de google, podrias actualizarlo? gracias

  • Javier
    #4 escrito por Javier  hace 8 meses

    Hola, la versión 2 de la API está en fase beta todavía, y además, Google va a dejar de dar soporte a esta librería a partir del 31 de Diciembre de 2011, como se puede leer en http://code.google.com/intl/es/apis/language/translate/overview.html

  • fabricio
    #5 escrito por fabricio  hace 8 meses

    ok, comprendo, una ultima pregunta, al traducir me da caracteres raros ya probe con htmlentities , meta en utf8 pero no logo solucionarlo. me das una mano? gracias y felicitaciones x tu excelente blog

  • Javier
    #6 escrito por Javier  hace 8 meses

    La librería trabaja en UTF8, prueba a usar utf8_encode en las cadenas de texto que pasas a la librería antes de la traducción. un saludo

  • Tonimito
    #7 escrito por Tonimito  hace 7 meses

    Hola!
    Desde hace mucho tiempo que uso ésta increíble clase…pero hoy no funciona, ¿Google la ha quitado? ¿Sabes algo?

    http://code.google.com/intl/es/apis/language/

  • Tonimito
    #8 escrito por Tonimito  hace 6 meses

    Hola de nuevo Javier,
    Gracias por tan rápida respuesta de la semana pasada. Efectivamente, con las restricciones que ha puesto Google, he comprobado que a las X peticiones por día, te banean y no traduce más.

    He estado mirando la versión nueva del API, la de pago, y no sale tan cara. Si entiendo bien:

    https://code.google.com/intl/es-ES/apis/language/translate/v2/pricing.html

    Sale a 20$ = 1 Millón de caracteres.

    Por tanto, he estado mirando de adaptar tu clase a Google Translate API v2, y creo que tan sólo hay que substituir:

    http://ajax.googleapis.com/ajax/services/language/translate
    por
    https://ajax.googleapis.com/ajax/language/translate/v2

    Y demás urls de tu clase.

    Tal y como indica en:
    https://code.google.com/intl/es-ES/apis/language/translate/v2/getting_started.html

    Y como he visto que ya incluíste _apiKey y _userIP, en teoría debería funcionar. No?

    Nada más, tan sólo que, como es tuya la clase, quizá podrás orientarnos en cómo rectificarla.

    Un saludo.

  • Javier
    #9 escrito por Javier  hace 6 meses

    Hola de nuevo,
    Al parecer los únicos cambios en la v2 de la API es el nuevo método languages, que permite descargar una lista de los idiomas soportados por el traductor. Por lo demás todo parece igual, por lo que cambiando las URLs por las nuevas de la v2 debería funcionar.

    Si conseguías hacerla funciona con esta nueva API, no dudes en enviármela y la publicaré aquí.
    Un saludo

  • Tonimito
    #10 escrito por Tonimito  hace 6 meses

    Cuenta con ello! ;)

  • Tonimito
    #11 escrito por Tonimito  hace 6 meses

    Hola Javier,
    Como hablamos, he estado haciendo pruebas para aplicarla a la Google Translate API V2. Como hablamos, he cambiado los url:

    http://ajax.googleapis.com/ajax/services/language/translate
    por
    https://www.googleapis.com/language/translate/v2

    http://ajax.googleapis.com/ajax/services/language/detect
    por
    https://www.googleapis.com/language/translate/v2/detect/v2

    Y lo llamo así:

    
    include('google-translator-v2.php');
    $gt = new GoogleTranslator();
    $gt->SetCredentials('MI-API-ID',NULL);
    $Traducido = $gt->Translate('Hola, como me gusta este coche', 'es', 'en', $html = false);
    echo $Traducido;
    

    Y no funciona :__(
    He realizado otras pruebas, pero no hay forma, ¿tienes alguna idea?

  • Javier
    #12 escrito por Javier  hace 6 meses

    ¿Pero has pagado para poder usar la API no?
    Yo no he podido hacer pruebas aún, intenta depurar la clase a través de la respuesta que te da el servidor de Google, para eso incluye después de la línea $response = curl_exec($curlHandler);, el siguiente código:
    var_dump($response);

    Suerte!

  • Tonimito
    #13 escrito por Tonimito  hace 6 meses

    Si, ya estamos pagando por usar la API.

    Como me corría prisa solucionarlo y no tengo mucha idea de PHP, he realizado esta clase para salir del paso, no es tan completa como la tuya, ni mucho menos, pero me funciona para lo que quiero. Eso sí, hasta que consigamos resolver pk no funciona la tuya con los nuevos URL, ya que la tuya era bestial.

    
    //TRADUCCION GOOGLE V2 DE PAGO
    //Restaurar Tags
    function restoreTags($input) {
      $opened = array();
      if(preg_match_all("/<(\/?[a-z]+)>?/i", $input, $matches)) {
        foreach($matches[1] as $tag) {
          if(preg_match("/^[a-z]+$/i", $tag, $regs)) { // a tag has been opened
          if(strtolower($regs[0]) != 'br') $opened[] = $regs[0];
          }elseif(preg_match("/^\/([a-z]+)$/i", $tag, $regs)) { // a tag has been closed
          unset($opened[array_pop(array_keys($opened, $regs[1]))]);
          }
        }
      }
    if($opened) { $tagstoclose = array_reverse($opened); foreach($tagstoclose as $tag) $input .= "</$tag>"; } return $input; }
      
    class Translate_V2{
      function Translate($Texto, $Idioma1, $Idioma2, $html = boolean){
        $Text = $Texto;
        $Key = "Mi-API-KEY";
        $apiUrl = "https://www.googleapis.com/language/translate/v2";
        $From = $Idioma1;
        $To = $Idioma2;
        if($html == true){
          $Format = 'html';
        }else{
          $Format = 'text';
        }
        if(strlen($Text)>450){ //Si tiene más de 450 caracteres, que lo parta en partes iguales de 450 crcteres.
          $TXT_Parts = str_split($Text, 450);
          $get1 = array();
          $get2 = array();
          $url = array();
          $TXT_Part = array();
          for($i=0; $i<count($TXT_Parts); $i++){
            $url[$i] = $apiUrl."?format=".$Format."&key=".$Key."&q=".urlencode($TXT_Parts[$i])."&source=".$From."&target=".$To;
            $get1[$i] = file_get_contents($url[$i]);
            $get2[$i] = json_decode($get1[$i]);
            foreach ($get2[$i]->data->translations as $text) {
               $TXT_Part[$i] = $text->translatedText;
            }
          }
          return restoreTags(implode('',$TXT_Part)); //Juntamos las partes resultantes y si se ha quedado algún tag roto, lo arregla
        }else{
          $url = $apiUrl."?format=".$Format."&key=".$Key."&q=".urlencode($Text)."&source=".$From."&target=".$To;
          $get1 = file_get_contents($url);
          $get2 = json_decode($get1);
          foreach ($get2->data->translations as $text) {
              return $text->translatedText;
          }
        }
      }
    }
    

  • Javier
    #14 escrito por Javier hace 6 meses

    Gracias por el código! Por el momento no tengo planes de utilizar la API de pago, porque creo que no me sale rentable para el volumen de datos con el que yo trabajo, pero si al final necesito usarla y consigo arreglar el error lo colgaré aquí ;)

    Un saludo!

  • Tonimito
    #15 escrito por Tonimito  hace 5 meses

    Ok, a ratos miraré de hacer experimentos con tu clase. Si consigo que funcione, te la paso!

  • Construccion
    #16 escrito por Construccion  hace 2 meses

    Bueno pero esto es pura programacion, por que no hacen un traductor y lo distribuyen con algun costo.

  • Puedes usar las siguientes etiquetas HTML: <a> <abbr> <acronym> <b> <blockquote> <cite> <code> <del> <em> <i> <q> <strike> <strong>

  • Feed de comentarios de esta entrada
Ir arriba