Traduciendo en bruto con Google API Language
Hoy me he visto ante un reto cansino y agotador. Después de instalar ZenCart, la evolución natural de osCommerce (aunque hay que decir que, mejorada, aún le falta mucha depuración), me encontré con una agradable sorpresa.
La traducción que un buen usuario de esta plataforma de comercio electrónico B2C había hecho no incluía la tabla de datos de configuración, denominada habitualmente zc_configuration (o nuestro prefijo usado más configuration). Y la tabla contiene la nada desdeñable cantidad de 537 registros que contienen dos campos claves desde el punto de vista de visualización en el interface administrativo, configuration_title y configuration_description.
Cuando había traducido el registro número 10 ya estaba hasta las narices, así que improvisé un script chapucero que mezcla PHP y JavaScript que lanza una llamada a la versión 2 del API de Google llamado Language y que aglutina una serie de herramientas, entre ellas la de traducción.
Hay que decir que el resultado final tiene que ser revisado a pelo, pero al menos no ya traducido línea a línea. Por contra tenemos la ventaja que se respeta el etiquetado HTML, si lo hubiera, en el texto a enviar (si, por ejemplo, como es el caso, se toman datos de un contenido dinámico). También hay que decir que muy probablemente este truco viole un poquitín los términos de uso del API ya que Google dice que sólo puede ser usado contra una acción directa de un usuario final. Es decir, que «su» tinglado puede ser usado en un traductor propio que podemos montar en nuestro sitio, pero que no se admiten llamadas automatizadas (como es el caso que te cuento aquí, pero lo dejamos como un secreto entre nosotros).
Esta es la chapucilla improvisada, quizás pueda servirte para, retoque aquí y retoque allá, sacarte de algún apuro si tienes que traducir una tabla de datos. Ahí va:
<html>
<head>
<title>Traducir zc_configuration</title>
</head>
<body>
<?
$db = mysql_connect("127.0.0.1", "root", "root") OR die();
mysql_select_db("zencart", $db) OR die();
if (isset($_REQUEST['ID']) && isset($_REQUEST['TRADUCCION'])) {
echo "<p>Almacenar: <blockquote>" . $_REQUEST['TRADUCCION'] . "</blockquote></p>";
$sql = "UPDATE zc_configuration ";
$sql .= "SET configuration_title = '" . $_REQUEST['TRADUCCION'] . "', translate_title = 1 ";
$sql .= "WHERE configuration_id = " . $_REQUEST['ID'] . ";";
mysql_query($sql, $db);
if (mysql_error() != "") {
echo "<blockquote>" . mysql_error() . "</blockquote>";
$sql = "UPDATE zc_configuration SET translate_title = 9 WHERE configuration_id = '" . $_REQUEST['ID'] . "';";
mysql_query($sql, $db);
}
}
$sql = "SELECT configuration_id, configuration_title FROM zc_configuration WHERE translate_title = 9 LIMIT 0, 1";
$res = mysql_query($sql, $db);
if ($row = mysql_fetch_assoc($res))
{
?>
<script>
function handleResponse(response) {
var traduccion = response.data.translations[0].translatedText;
window.location = "traduciendo.php?ID=" + <?=$row['configuration_id']?> + "&TRADUCCION=" + traduccion
}
</script>
<script>
var newScript = document.createElement('script');
newScript.type = 'text/javascript';
var sourceText = escape("<?=$row['configuration_title']?>");
var source = 'https://www.googleapis.com/language/translate/v2?key=_MI_CLAVE_API_&source=en&target=es&callback=handleResponse&q=' + sourceText;
newScript.src = source;
// When we add this script to the head, the request is sent off.
document.getElementsByTagName('body')[0].appendChild(newScript);
</script>
<?
}
else
{
echo "<h1>¡Se acabó!</h1>";
}
?>
</body>
</html>
Añadí a la tabla zc_configuration el campo translate_title, cuyo valor será 0 ó 1 si ya se ha traducido el registro. Esto me servía para poder parar en cualquier momento su ejecución y iniciarla más tarde.
Para evitar tener que programar un segundo módulo utilizando AJAX para enviar el UPDATE a la base de datos lo que hago es una rellamada al mismo script y en cada llamada leo sólo un registro que no haya sido actualizado aún.
En la llamada al API hay que sustituir _MI_CLAVE_API_ por tu propia clave que podrás obtener, previo registro de una cuenta en Google, en su APIs Console.
Lo dicho, ya lo menté arriba, una chapucilla para salir del paso. Pero resultó útil. :)
La traducción que un buen usuario de esta plataforma de comercio electrónico B2C había hecho no incluía la tabla de datos de configuración, denominada habitualmente zc_configuration (o nuestro prefijo usado más configuration). Y la tabla contiene la nada desdeñable cantidad de 537 registros que contienen dos campos claves desde el punto de vista de visualización en el interface administrativo, configuration_title y configuration_description.
Cuando había traducido el registro número 10 ya estaba hasta las narices, así que improvisé un script chapucero que mezcla PHP y JavaScript que lanza una llamada a la versión 2 del API de Google llamado Language y que aglutina una serie de herramientas, entre ellas la de traducción.
Hay que decir que el resultado final tiene que ser revisado a pelo, pero al menos no ya traducido línea a línea. Por contra tenemos la ventaja que se respeta el etiquetado HTML, si lo hubiera, en el texto a enviar (si, por ejemplo, como es el caso, se toman datos de un contenido dinámico). También hay que decir que muy probablemente este truco viole un poquitín los términos de uso del API ya que Google dice que sólo puede ser usado contra una acción directa de un usuario final. Es decir, que «su» tinglado puede ser usado en un traductor propio que podemos montar en nuestro sitio, pero que no se admiten llamadas automatizadas (como es el caso que te cuento aquí, pero lo dejamos como un secreto entre nosotros).
Esta es la chapucilla improvisada, quizás pueda servirte para, retoque aquí y retoque allá, sacarte de algún apuro si tienes que traducir una tabla de datos. Ahí va:
<html>
<head>
<title>Traducir zc_configuration</title>
</head>
<body>
<?
$db = mysql_connect("127.0.0.1", "root", "root") OR die();
mysql_select_db("zencart", $db) OR die();
if (isset($_REQUEST['ID']) && isset($_REQUEST['TRADUCCION'])) {
echo "<p>Almacenar: <blockquote>" . $_REQUEST['TRADUCCION'] . "</blockquote></p>";
$sql = "UPDATE zc_configuration ";
$sql .= "SET configuration_title = '" . $_REQUEST['TRADUCCION'] . "', translate_title = 1 ";
$sql .= "WHERE configuration_id = " . $_REQUEST['ID'] . ";";
mysql_query($sql, $db);
if (mysql_error() != "") {
echo "<blockquote>" . mysql_error() . "</blockquote>";
$sql = "UPDATE zc_configuration SET translate_title = 9 WHERE configuration_id = '" . $_REQUEST['ID'] . "';";
mysql_query($sql, $db);
}
}
$sql = "SELECT configuration_id, configuration_title FROM zc_configuration WHERE translate_title = 9 LIMIT 0, 1";
$res = mysql_query($sql, $db);
if ($row = mysql_fetch_assoc($res))
{
?>
<script>
function handleResponse(response) {
var traduccion = response.data.translations[0].translatedText;
window.location = "traduciendo.php?ID=" + <?=$row['configuration_id']?> + "&TRADUCCION=" + traduccion
}
</script>
<script>
var newScript = document.createElement('script');
newScript.type = 'text/javascript';
var sourceText = escape("<?=$row['configuration_title']?>");
var source = 'https://www.googleapis.com/language/translate/v2?key=_MI_CLAVE_API_&source=en&target=es&callback=handleResponse&q=' + sourceText;
newScript.src = source;
// When we add this script to the head, the request is sent off.
document.getElementsByTagName('body')[0].appendChild(newScript);
</script>
<?
}
else
{
echo "<h1>¡Se acabó!</h1>";
}
?>
</body>
</html>
Algunas observaciones
Añadí a la tabla zc_configuration el campo translate_title, cuyo valor será 0 ó 1 si ya se ha traducido el registro. Esto me servía para poder parar en cualquier momento su ejecución y iniciarla más tarde.
Para evitar tener que programar un segundo módulo utilizando AJAX para enviar el UPDATE a la base de datos lo que hago es una rellamada al mismo script y en cada llamada leo sólo un registro que no haya sido actualizado aún.
En la llamada al API hay que sustituir _MI_CLAVE_API_ por tu propia clave que podrás obtener, previo registro de una cuenta en Google, en su APIs Console.
Lo dicho, ya lo menté arriba, una chapucilla para salir del paso. Pero resultó útil. :)

Comentarios
Publicar un comentario