Just a life programming…

La idea inicial es conseguir integrar Google Translator en Joomla de tal manera que se de la posibilidad de traducir textos que no han sido traducidos con el componente Joomfish en el idioma actualmente seleccionado. Además, para no penalizar la carga de la página, cargaremos el javascript de google solo cuando sea necesario.

NOTA: Estas modifiones han sido realizadas y probadas en Joom!Fish Version V2.0.3. En otras versiones no puedo asegurar que funcionen correctamente.

Paso1: Añadir la opción en la configuración de Joomfish.
– Para ello editamos el fichero /administrator/components/com_joomfish/config.xml
– Añadimos la siguiente opción en el parámetro «noTranslation»:

<option value="4">Google Translator</option>

– Ahora ya podremos seleccionar la opción en las preferencias de configuración del componente. Opción «There are no translations available».

Paso2: Modificamos el plugin joomfish en /plugins/joomfish/missing_translation.php
– Sustituir esta línea:

if ($noTranslationBehaviour==3 && isset($row_to_translate->id)){

Por esta

if (($noTranslationBehaviour==4)||(($noTranslationBehaviour==3) && isset($row_to_translate->id))){

Paso3: Modificamos el plugin joomfish para texto alternativo sin traducción en /plugins/content/jfalternative.php
– Sustituir estas líneas:

global $_JOOMFISH_MANAGER;
$alttext = "<div class='jf_altlanguages'>";
$alttext .= JText::_('NO TRANSLATION AVAILABLE');
$alttext .= "</div>";
$row->text = preg_replace( $regex, $alttext, $row->text );

Por estas

global $_JOOMFISH_MANAGER;
$noTranslationBehaviour = $_JOOMFISH_MANAGER->getCfg( 'noTranslation' );
if( ($noTranslationBehaviour  >= 1) && ($noTranslationBehaviour  <= 3)) {
$alttext = "<div class='jf_altlanguages'>";
$alttext .= JText::_('NO TRANSLATION AVAILABLE');
$alttext .= "</div>";
} else if( $noTranslationBehaviour  == 4 ) {
$alttext = "<!-- [[GOOGLE_TRANSLATOR]] -->";
}
$row->text = preg_replace( $regex, $alttext, $row->text );

Paso4: Modificamos el plugin joomfish de system/jfdatabase.php para añadir los scripts necesarios.
Podríamos incluso crear un pugin nuevo pero por comodidad he modificado este mismo.
Se trata de que solo incluya los scripts de google translator cuando sea necesario, o sea, cuando haya textos no traducidos en el idioma seleccionado.
Sustituimos la funcion onAfterRender() por esta otra:

function onAfterRender()
{
$buffer = JResponse::getBody();
$info = "";
$db =& JFactory::getDBO();
$info .=  "<div style='font-size:11px'>";
uasort($db->profileData,array($this,"sortprofile"));
foreach ($db->profileData as $func=>$data) {
$info .=  "$func = ".round($data["total"],4)." (".$data["count"].")<br />";
}
$info .=  "</div>";
$buffer = str_replace("JFTimings",$info,$buffer);global $_JOOMFISH_MANAGER;
$noTranslationBehaviour = $_JOOMFISH_MANAGER->getCfg( 'noTranslation' );
if( ($noTranslationBehaviour  == 4) && (strpos($buffer,'goog-trans-section')!==false)) {
$document	= JFactory::getDocument();
$langact = $document->getLanguage();
$google_translator_javascript = "
<script>
function googleSectionalElementInit() {
new google.translate.SectionalElement({
sectionalNodeClassName: 'goog-trans-section',
controlNodeClassName: 'goog-trans-control',
background: '#dddddd'
}, 'google_sectional_element');
}
</script>
<script src='http://translate.google.com/translate_a/element.js?cb=googleSectionalElementInit&ug=section&hl={$langact}'></script>
";
$pos = strrpos($buffer, "</body>");
if($pos > 0)
{
$buffer = substr($buffer, 0, $pos).$google_translator_javascript.substr($buffer, $pos);
}
}
JResponse::setBody($buffer);
}function sortprofile($a,$b){
return $a["total"]>=$b["total"]?-1:1;
}

Paso5: Modificar las vistas de los contenidos necesarios. De esta manera podemos añadir el traductor de Google en aquellas partes que nos interese con tan solo añadir unas líneas al código. Como ejemplo, modificaremos las vistas del componente com_content para la vista de artículo. Si quisieramos cambiar el frontend o category se procedería de la misma manera.
– Creamos en nuestra plantilla la ruta «MyTemplate/html/com_content/article» y hacemos una copia del fichero «\components\com_content\views\article\tmpl\default.php».
– Para finalizar, bastará con añadir el siguiente código en el comienzo y final del contenido de la vista que queramos que sea traducido con google.
Código para el inicio: Abrimos una capa que contendrá el texto a traducir.

<?php
$try_gTranslator = ( strpos( $this->article->text, '<!-- [[GOOGLE_TRANSLATOR]] -->' ) !== false );$conf=& JFactory::getConfig();$default_lang= $conf->getValue('config.defaultlang');$document=JFactory::getDocument();$langact = $document->getLanguage();
if ($try_gTranslator) {
$this->article->text = str_replace("<!-- [[GOOGLE_TRANSLATOR]] -->","",$this->article->text);
?>

Código para el final: Cerramos la capa

if ($try_gTranslator)
{ ?>
</div>
<?php } ?>

Tan solo faltaría darle un aspecto más amigable al enlace de traducción añadiendo por ejemplo por css una bandera del idioma al que vamos a traducir.

Eso es todo.

Espero que a alguien pueda venirle bien este truquillo para Joomla.

Comentarios en: "Integración de Google Translator con Joomfish en Joomla" (9)

  1. Por fin te has animadoooooooooo!!! Esto prometeeeeeee..

  2. Lo voy ha intentar, como funcione es la solución «casi» perfecta… Muy buen comentario y super util.
    ¿se podría hacer el tema de la traducción con ajax al estilo de ivory pluging?

    • ¿Lo intentaste?
      Espero que te funcionara.
      Si no es así me comentas y lo vemos.
      No conozco ese plugin IVORY que comentas.
      Lo más parecido que he encontrado es este «Iyosis Google Translate». Funciona con ajax, pero al igual que los que existen en http://extensions.joomla.org, traduce la página entera con google translator ajax api.
      La gracia del código que he posteado es que en conjunción con JoomFish (Joomla 1.5.x) solo traduce via Google Translator con Ajax aquellos contenidos que no han sido traducidos con JoomFish. Se entiende que si ya han sido traducidos con JoomFish estarán mejor traducidos que lo que pueda traducir Google Translator automáticamente, por eso en este caso no se muestra la opción de traducir. Pero si no se ha traducido, mejor Google Translator que nada.
      Gracias, un saludo.

  3. por q hay q modificar tanto .

    • Hola miguelgr,
      Creo que cada modificación esta comentada respondiendo en cada caso a tu pregunta.
      Inevitablemente para añadir funcionalidades nuevas a un componente ya existente hay que tocar código. Pero por suerte muchísimo menos que si se hiciera desde cero.
      Se podría cambiar menos y funcionaría pero no de manera optimizada para que, por ejemplo, no cargue gtranslator si no es necesario.
      A veces he puesto por facilidad para comprender el cambio, varias líneas de código cuando solo cambio unas pocas.
      Si no entiendes el código modificado te recomiendo hacer backups antes de cambiar los ficheros.
      Un saludo

  4. Es mucho codigo que hay que tocar , quisas se vuelva inestable. hay un plugin JoomFish Google Translator perono hay mucha documentacion al respecto para hacerlo funcionar

    • En ocasiones he puesto código que hay que añadir junto a código ya existente por facilidad. Solo puedo decirte que yo lo tengo en producción y no se ha vuelto inestable. Eso sí, estas modificaciones están hechas sobre Joom!Fish Version V2.0.3, en otras no sé si funcionará correctamente. Sugerencia, antes de modificar nada, por supuesto, hazlo en un entorno de pruebas y usa herramientas de comparación tipo WinMerge. Un saludo.

  5. Hola puedes explicarme , me he quedado en el paso 5 no entiendo bien hay que modificar la plantilla no entiendo estos puntos
    – Creamos en nuestra plantilla la ruta “MyTemplate/html/com_content/article” y hacemos una copia del fichero “\components\com_content\views\article\tmpl\default.php”.

    en fin lo que quiero saber en que archivo se inserta tal codigo

    miguelgr3@gmail.com

    • Hola miguel,
      El paso 5 lo único que hace es usar la posibilidad que ofrece Joomla de cambiar el aspecto de ciertos contenidos tan solo incluyendo los php de visualización en una carpeta html dentro de la carpeta de tu template.
      O sea, si tu template esta en /templates/mitemplate, tendras que crear una carpeta dentro «/templates/mitemplate/html» donde incluir las vistas a modificar.
      En este caso modifico la vista de artículo para lo cual hago una copia en ese directorio html del fichero «/components/com_content/views/article/tmpl/default.php» quedando en mi plantilla «/templates/mitemplate/html/com_content/views/article/tmpl/default.php» y este es el que modificaré. Joomla si encuentra una vista en este directorio la sustituye por la correspondiente de cualquier extensión pudiendo personalizar lo que se muestra a nuestro antojo arrastrando la visualización con nuestro template y sin tocar (en lo que se refiere a visualización) el código del componente.
      Para más información puedes empezar por aquí:
      http://docs.joomla.org/Understanding_Output_Overrides
      http://docs.joomla.org/How_to_override_the_output_from_the_Joomla!_core

Deja un comentario