Traducir OpenCart con Google Translate API
Lo de Google es incomprensible, sobre todo si se observa desde la óptica de viejas empresas como Microsoft. Sé que tiene no pocos detractores y puedo decir que yo no soy de los que se hacen seguidor de una gran marca o empresa así como así.
Lo cierto es que tengo una tendencia natural a desconfiar de lo grande y lo que tiene poder. Pero Google... me puede. No sé, uso tantas herramientas en Internet que llevan su nombre detrás y sin pagar un euro.
Admito que a costa de cederles que conozcan mis hábitos de navegación y me coloquen publicidad basada en esos hábitos. Nada es gratis realmente. Pero para mi día a día, me parece un pago justo.
Una de esas cositas que me apasionan y aún me asombran es la Google Translate API, la que, por otro lado, se ha anunciado va a desaparecer a final de este año debido a los abusos que se cometen. Yo no sé si soy uno de esos abusadores, pero reconozco que la he usado para traducir aplicaciones completas de manera recursiva y, no creo que fuera contra la naturaleza del gigante americano cuando en ninguna ocasión se me ha bloqueado tal posibilidad.
Sea como fuere, este es el último caso. Evaluando tecnologías open source encontramos OpenCart, un software libre desarrollado en PHP (como es habitual) para e-commerce (para crear tiendas virtuales). Como no encontraba ningún plugin actualizado con la traducción al castellano para su última versión, decidí hacer (y de paso experimentar un poco más) un pequeño apaño.
OpenCart tiene todos sus mensajes en una carpeta llamada language en el front-end (directorio catalog) y otro en el back-end (directorio admin). Dentro hay un subdirectorio english que a su vez contiene un fichero english.php y tantos subdirectorios como módulos y componentes. Cada fichero PHP contiene una declaración de array tipo:
$_['english_text_key'] = 'english_text_value';
Para crear una versión en otro idioma, hay que crear una estructura igual pero, por ejemplo, para spanish, con su spanish.php y todos sus subdirectorios. En el administrador de la tienda, en el apartado de configuración de lenguajes, hay que añadir el nuevo, indicando el nombre del directorio correspondiente que se ha creado.
El script, ejecutado desde el raíz de language, replica english y crea un spanish, llamando recursivamente a cada subdirectorio, leyendo cada PHP, cargando el array de mensajes, llamando a la API de Google, para obtener la expresión en castellano (por cierto, conserva las etiquetas HTML), y creando en el nuevo destino una réplica con las traducciones.
No me enrollo más. Si por una remota casualidad vas a usar este apaño y necesitas alguna aclaración, en lo que buenamente pueda ayudar, aquí me tienes. Usa los comentarios. (Ten en cuenta que al pegar aquí el código, perderá la identación.)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>OpenCart: Traduciendo vía Google Translator</title>
</head>
<body>
<?
function UnError($ch, $donde) {
echo "<blockquote>$donde:<blockquote>";
echo "<div>Error:<blockquote>[" . curl_errno($ch) . "] [" . curl_error($ch) . "]<blockquote></div>";
echo "<div>GetInfo:<blockquote>[";
print_r(curl_getinfo($ch));
echo "]</blockquote></div>";
echo "</blockquote></blockquote>";
}
function LeerIncluir($directorio, $anterior) {
$losinclude = scandir($anterior . "/" . $directorio);
foreach($losinclude as $fichero) {
if (($fichero != ".") && ($fichero != "..")) {
if (is_dir($anterior . "/" . $directorio . "/" . $fichero)) {
LeerIncluir($fichero, $anterior . "/" . $directorio);
}
else {
if (strpos($fichero, ".php") !== false) {
// echo "<div>Incluyendo $anterior/$directorio/$fichero</div>";
include_once($anterior . "/" . $directorio . "/" . $fichero);
Traducir($_, $anterior . "/" . $directorio . "/" . $fichero);
$_ = array();
}
}
}
}
}
function Traducir($_, $donde) {
$_MY_KEY = "-AQUI-TU-API-KEY-PARA-GOOGLE-TRANSLATE-";
$_MY_IP = "-AQUI-LA-IP-DEL-EQUIPO-DESDE-DONDE-SE-EJECUTA-SI-ES-LOCAL-ES-VALIDA-"; // p.e. 192.168.1.78
$_MY_REF = "http://localhost/opencart/catalog/language/traducir.php";
$url_header = "https://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=";
$url_footer = "&langpair=en%7Ces&key=" . $_MY_KEY . "&userip=" . $_MY_IP;
foreach ($_ as $k => $v) {
$url = ($url_header . urlencode($v) . $url_footer);
if (($ch = curl_init()) !== false) {
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, $_MY_REF);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
if (($body = curl_exec($ch)) === false) UnError($ch, "curl_exec");
else {
$json = json_decode($body, true);
$c = str_replace("'", "`", $json['responseData']['translatedText']);
echo "<div style='border:1px solid gray;'>" . $_[$k] . " » " . $c . "</div>";
$_[$k] = $c;
ob_flush();
flush();
}
curl_close($ch);
}
else UnError($ch, "curl_init");
sleep(1);
}
$donde = str_replace("english", "spanish", $donde);
$fh = fopen($donde, "w");
fwrite($fh, "<?\n");
foreach ($_ as $k => $v) {
fwrite($fh, "\$_['" . $k . "'] = '" . $v . "';\n");
}
fwrite($fh, "?>\n");
fclose($fh);
}
LeerIncluir("english", ".");
?>
</body>
</html>
Lo cierto es que tengo una tendencia natural a desconfiar de lo grande y lo que tiene poder. Pero Google... me puede. No sé, uso tantas herramientas en Internet que llevan su nombre detrás y sin pagar un euro.
Admito que a costa de cederles que conozcan mis hábitos de navegación y me coloquen publicidad basada en esos hábitos. Nada es gratis realmente. Pero para mi día a día, me parece un pago justo.
Una de esas cositas que me apasionan y aún me asombran es la Google Translate API, la que, por otro lado, se ha anunciado va a desaparecer a final de este año debido a los abusos que se cometen. Yo no sé si soy uno de esos abusadores, pero reconozco que la he usado para traducir aplicaciones completas de manera recursiva y, no creo que fuera contra la naturaleza del gigante americano cuando en ninguna ocasión se me ha bloqueado tal posibilidad.
Sea como fuere, este es el último caso. Evaluando tecnologías open source encontramos OpenCart, un software libre desarrollado en PHP (como es habitual) para e-commerce (para crear tiendas virtuales). Como no encontraba ningún plugin actualizado con la traducción al castellano para su última versión, decidí hacer (y de paso experimentar un poco más) un pequeño apaño.
OpenCart tiene todos sus mensajes en una carpeta llamada language en el front-end (directorio catalog) y otro en el back-end (directorio admin). Dentro hay un subdirectorio english que a su vez contiene un fichero english.php y tantos subdirectorios como módulos y componentes. Cada fichero PHP contiene una declaración de array tipo:
$_['english_text_key'] = 'english_text_value';
Para crear una versión en otro idioma, hay que crear una estructura igual pero, por ejemplo, para spanish, con su spanish.php y todos sus subdirectorios. En el administrador de la tienda, en el apartado de configuración de lenguajes, hay que añadir el nuevo, indicando el nombre del directorio correspondiente que se ha creado.
El script, ejecutado desde el raíz de language, replica english y crea un spanish, llamando recursivamente a cada subdirectorio, leyendo cada PHP, cargando el array de mensajes, llamando a la API de Google, para obtener la expresión en castellano (por cierto, conserva las etiquetas HTML), y creando en el nuevo destino una réplica con las traducciones.
No me enrollo más. Si por una remota casualidad vas a usar este apaño y necesitas alguna aclaración, en lo que buenamente pueda ayudar, aquí me tienes. Usa los comentarios. (Ten en cuenta que al pegar aquí el código, perderá la identación.)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>OpenCart: Traduciendo vía Google Translator</title>
</head>
<body>
<?
function UnError($ch, $donde) {
echo "<blockquote>$donde:<blockquote>";
echo "<div>Error:<blockquote>[" . curl_errno($ch) . "] [" . curl_error($ch) . "]<blockquote></div>";
echo "<div>GetInfo:<blockquote>[";
print_r(curl_getinfo($ch));
echo "]</blockquote></div>";
echo "</blockquote></blockquote>";
}
function LeerIncluir($directorio, $anterior) {
$losinclude = scandir($anterior . "/" . $directorio);
foreach($losinclude as $fichero) {
if (($fichero != ".") && ($fichero != "..")) {
if (is_dir($anterior . "/" . $directorio . "/" . $fichero)) {
LeerIncluir($fichero, $anterior . "/" . $directorio);
}
else {
if (strpos($fichero, ".php") !== false) {
// echo "<div>Incluyendo $anterior/$directorio/$fichero</div>";
include_once($anterior . "/" . $directorio . "/" . $fichero);
Traducir($_, $anterior . "/" . $directorio . "/" . $fichero);
$_ = array();
}
}
}
}
}
function Traducir($_, $donde) {
$_MY_KEY = "-AQUI-TU-API-KEY-PARA-GOOGLE-TRANSLATE-";
$_MY_IP = "-AQUI-LA-IP-DEL-EQUIPO-DESDE-DONDE-SE-EJECUTA-SI-ES-LOCAL-ES-VALIDA-"; // p.e. 192.168.1.78
$_MY_REF = "http://localhost/opencart/catalog/language/traducir.php";
$url_header = "https://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=";
$url_footer = "&langpair=en%7Ces&key=" . $_MY_KEY . "&userip=" . $_MY_IP;
foreach ($_ as $k => $v) {
$url = ($url_header . urlencode($v) . $url_footer);
if (($ch = curl_init()) !== false) {
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, $_MY_REF);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
if (($body = curl_exec($ch)) === false) UnError($ch, "curl_exec");
else {
$json = json_decode($body, true);
$c = str_replace("'", "`", $json['responseData']['translatedText']);
echo "<div style='border:1px solid gray;'>" . $_[$k] . " » " . $c . "</div>";
$_[$k] = $c;
ob_flush();
flush();
}
curl_close($ch);
}
else UnError($ch, "curl_init");
sleep(1);
}
$donde = str_replace("english", "spanish", $donde);
$fh = fopen($donde, "w");
fwrite($fh, "<?\n");
foreach ($_ as $k => $v) {
fwrite($fh, "\$_['" . $k . "'] = '" . $v . "';\n");
}
fwrite($fh, "?>\n");
fclose($fh);
}
LeerIncluir("english", ".");
?>
</body>
</html>

Comentarios
Publicar un comentario