Ya me acorde de una
solucion "general"......... la hice en el 2008
Me hizo acordar esto: Cita:
Iniciado por Durgeoble separa el contenido de la vista y traduce el contenido, es lo único que se me ocurre
Cita: <i>vamos a probar</i> una vieja idea de <b><i>@Italico76</i></b> a ver si logro <b>traducir</b> esto sin perder tags <b>en el camino</b> !!!
lo deja como:
Cita: <i>we will try</i>an old idea<b><i> @Italico76</i></b> to see if I <b>translate</b> this without losing tags <b> on the road</b>!
Código PHP:
Ver original<?php
<?php
include 'html_editor.class.php';
/*
Ejemplo de uso de la clase html_editor para traducir un texto sin perder los tags usando
la API de Google Translate
*/
$html = '<i>vamos a probar</i> una vieja idea de <b><i>@Italico76</i></b> a ver si logro <b>traducir</b> esto sin perder tags <b>en el camino</b> !!! ';
$texto = new htmlEditor($html);
function fill_right($str)
{
return $str;
return $str[strlen($str)-1]==' ' ?
$str : $str.' '; }
///Procesa Google Translate
function traductor($url)
{
//Procesamos la URL
return $contenido[0];
}
// aca iria TU funcion traduce
function traduce($descripcion,$sl = 'es',$tl= 'en',$hl= 'it')
{
//Codificamos la descripción para que Google la entienda
//Traducimos
$url = "https://translate.google.es/translate_a/single?client=t&sl=$sl&tl=$tl&hl=$hl&dt=bd&dt=ex&dt=ld&dt=md&dt=qc&dt=rw&dt=rm&dt=ss&dt=t&dt=at&dt=sw&ie=UTF-8&oe=UTF-8&oc=1&otf=1&trs=1&inputm=1&srcrom=1&ssel=0&tsel=0&q=".$descripcion;
$traduccion = traductor($url);
return $traduccion;
}
foreach ($texto as $fragemento)
{
$translated = traduce($fragemento);
$texto->setChunk(fill_right($translated));
}
// HTML traducido
echo $texto;
y mi libreria de 2008 actualizada
Código PHP:
Ver original<?php
/*
HTML EDITOR
@author: Pablo Bozzolo (2008)
minor update 2013
Recibe un HTML y permite modificar el texto sin preocuparse de alterar los tags
__construct(html) recibe el html
count() devuelve el numero de trozos de texto desnudos
setChunk(fragmento,n) cambia esa frase (elemento del array en la clase)
getChunk(n) devuelve el fragmento (bit) que se pide
getHTML() reconstruye el HTML uniendo las "frases" (texto puro) con los tags y lo devuelve.
Implementa Iterator asi que getChunk() y setChunk() no requieren de un (n)
*/
class htmlEditor implements Countable, Iterator
{
private $_html;
private $_tag; // tags
private $_notag; // texto puro
private $_notagCant;
private $_quitarEspacio;
function __construct($html = NULL)
{
$this->setHtml($html);
}
{
return $this->_notagCant;
}
function setHtml($html)
{
$this->_html = $html;
if ((strlen($this->_html
)>0) and
($this->_html
[0]=='<')){ $this->_html = ' '.$this->_html;
$this->_quitarEspacio=TRUE;
}
$this->no_tags();
$this->_notagCant
= count ($this->_notag
); }
function getHtml()
{
$html = null;
for ($i=0;$i<$this->count()-1;$i++) {
$a = $this->_notag[$i];
$b = $this->_tag[$i];
$html = $html.$a.$b;
}
$html .= $this->_notag[$i];
//if ($this->_quitarEspacio)
// $html =substr ($html,0,strlen($html)-1);
return $html;
}
function setChunk($element,$n=NULL)
{
$this->_notag[$n]=$element;
}
function getChunk($n)
{
return $this->_notag[$n];
}
/*
pre-condicion para $this->_tag : la cadena debe empezar con algo distinto a un tag (<)
*/
private function no_tags()
{
preg_match_all('@(<[/]?[a-z]{1,}[^>]{0,}[/]?[\w]{0,}?>)@is', $this->_html
, $matches); $full_tags = $matches[0];
$full_tags = array_reverse($full_tags); // tengo que sacar del principio $cant = count($full_tags);
$ini = 0;
for ($i=1;$i<=$cant+1;$i++)
{
$fin= strpos($this->_html
, $ti,$ini);
if ($fin==NULL)
$dif = ($fin-$ini);
$inserto= substr ($this->_html
,$ini,$dif); $this->_notag[] = $inserto;
}
$this->_tag = $matches[0];
}
/* Iterator */
}
{
}
{
return key($this->_notag
); }
{
}
public function valid()
{
return isset($this->_notag
[$this->key()]); }
public function __toString()
{
return $this-> getHtml();
}
}
Mi clase fue posteada en 2008 y profundamente olvidada... de hecho el post de aporte.. SE PERDIO!!!
Pero
proponia un uso similar a este en 2009
HOY... lo haria MUCHO MAS SIMPLE con
replace_callback() y la expresion correcta que recoja el texto fuera de los tags... esa clase es innecesaria si lo puedes hacer asi en 1 o 2 lineas de codigo