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.

Día 1

Aquí comienza todo.

Al fín me he animado a ir posteando poco a poco cositas que puedan ser útiles para todos.

Espero tener el tiempo y la voluntad para que este reto no caiga en saco roto.

Gracias por vuestro tiempo.