Como ya adelanté en un comentario de la anterior entrada del blog, me he decidido a explicar cómo es posible aprovechar la potencia de las macros de Office —y, más específicamente, de Word— para proteger texto que no queremos que sea editable cuando traducimos con Trados. Primero expondré el problema para, a continuación, pasar a la lógica de la posible solución y explicar la implementación. Y todo ello sin necesidad de saber apenas programación.
El problema
Supongamos que el cliente nos envía varios archivos de Excel cuya primera columna tiene el texto original en inglés y cuya segunda columna tiene el texto Insert translation here. Lo más cómodo para traducir será copiar el contenido de la primera columna a un archivo de Word para traducirlo con Trados y, una vez hayamos acabado, peguemos la tabla en la segunda columna del archivo de Excel pertinente. El archivo de Word con el que tenemos que trabajar tendría el siguiente aspecto:
Ahora bien, cada celda cuenta con una particularidad que dificulta el proceso traductor, y es que la primera y última palabra de la celda es un código entre comillas angulares (<>) que siempre varía y que es importantísimo respetar. Por tanto, si traducimos el archivo de Word que hemos creado sin un mínimo de preparación, correremos el riesgo de escribir incorrectamente dichos códigos, sobre todo si nos encontramos con coincidencias parciales (fuzzies).
Dado que sabemos que hay un estilo de Trados para Word que permite pasar por alto todo lo que esté marcado con dicho estilo, la solución es seleccionar estos códigos de inicio y fin y aplicar el mencionado estilo. Sin embargo, como el proyecto con el que tratamos es bastante grande, la tarea, aparte de repetitiva, llevaría mucho tiempo. ¿Cómo podríamos, pues, hacerlo todo de una vez?
La posible solución
Lo primero que debemos tener claro es nuestro objetivo: hallar la manera de seleccionar automáticamente los códigos de inicio y fin de cada celda (puede haber más de una frase entre ellos) y aplicar el estilo de Trados. Para ello, debemos pensar cuáles son las constantes que se repiten para poder hallar una “fórmula” con la que automatizar el proceso.
- Los códigos siempre van entre comillas angulares. Pero no solo eso, sino que siempre acaban con “m>”. Esto nos da una idea de lo que debemos buscar de forma que el proceso que queremos automatizar sea seguro, pues si solo trabajamos con el carácter ‘>’ es posible que metamos la pata en algún lado.
- Siempre hay un código al principio y otro al final. O sea, que tenemos dos códigos en cada celda independientemente de las frases que contenga. Por tanto, debemos hacer el proceso de seleccionar un código y marcarlo con el estilo de Trados dos veces por celda.
- Si el cursor está en medio de un código, el ‘<‘ va a ser la posición de inicio del código y el ‘>’ el final. Parece obvio, pero es una pista importante que debemos tener en cuenta.
Así pues, tras un rato devanándonos los sesos podemos llegar a la conclusión de que podemos buscar los caracteres ‘m>’ con la función de buscar de Word para situarnos en la posición final del código e ir ampliando la selección carácter a carácter hacia la izquierda hasta que el primer carácter de la selección sea ‘<‘. Si se da esta condición, debemos aplicar el estilo de Trados a la selección y repetir la operación hasta el final del documento. Si no tenéis Trados, podéis descargar este documento de Word con el estilo necesario.
La implementación de la solución
Vamos a ver cómo podemos traducir esta solución a código de una macro de Word. La solución más sencilla es repetir los mismos pasos que he descrito (con una vez basta, claro) teniendo activada la función de grabar macro (en Herramientas > Macro o en la pestaña Programador en Office 2007). Cuando hayamos detenido la operación, deberíamos tener un código como el siguiente en el editor de Visual Basic:
Selection.Find.ClearFormatting
With Selection.Find
.Text = “m>”
.Replacement.Text = “”
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = False
.MatchFuzzy = False
End WithSelection.Find.Execute
Selection.MoveRight Unit:=wdCharacter, Count:=1 ‘Para estar justo a la izquierda del >
Selection.MoveRight Unit:=wdCharacter, Count:=6, Extend:=wdExtend ‘Este número variará en función de los caracteres del código
Selection.Style = ActiveDocument.Styles(“tw4winExternal”)
Selection.MoveRight Unit:=wdCharacter, Count:=1 ‘Para dejar atrás el código procesado
Ahora bien, necesitamos algunas variables y un bucle para que tengamos lista nuestra macro. Debemos saber las celdas que hay en la tabla para ejecutar el código el número de veces pertinente hasta el final del documento y escribir código para detectar el primer carácter de la selección para saber si aplicar el estilo de Trados o no. El código final que utilizaremos es el siguiente (creo que es bastante legible aunque no se tengan conocimientos de programación):
Sub HiddenTextForTrados()
‘Declaramos las variables
Dim TotalRows As Integer
Dim i As Integer‘Obtenemos el número total de filas de la tabla
TotalRows = ActiveDocument.Tables(1).Rows.CountFor i = 1 To (TotalRows * 2)
Selection.Find.ClearFormatting
With Selection.Find
.Text = “m>”
.Replacement.Text = “”
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = False
.MatchFuzzy = False
End With
Selection.Find.Execute
Selection.MoveRight Unit:=wdCharacter, Count:=1‘Bucle para saber cuál es el primer código de la selección
Do Until Left(Selection.Text, 1) = “<”Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
Loop
‘Aplicamos el estilo
Selection.Style = ActiveDocument.Styles(“tw4winExternal”)
Selection.MoveRight Unit:=wdCharacter, Count:=1Next
End Sub
Ejecutad la macro y… ¡voilà, mirad el resultado!
Comprendo que alguien sin conocimientos de programación vea solución como algo complejo y difícil de implementar, pero de verdad, creedme: con unas nociones básicas de Visual Basic que se pueden aprender leyendo en Internet y a base de buscar mucho en la ayuda del editor del Visual Basic de Office y el clásico prueba y error, se pueden hacer auténticas maravillas.
A continuación os dejo con un vídeo que he preparado que vale más que mil palabras (lástima que no se vea demasiado bien):
¿De verdad no os entran ganas de aprender algo de programación? 😉
Actualización: viendo el vídeo me he dado cuenta de que para que la macro llegue hasta el final del documento hay que multiplicar la variable TotalRows por dos, ya que hay dos códigos por celda. Basta con cambiar For i = 1 To TotalRows por For i = 1 To (TotalRows * 2).
Pues la verdad es que hace tiempo que intento lograr crear una macro para proteger texto para que no se pueda editar con Trados.
Mi necesidad no es exactamente la del ejemplo (¡lástima!), pero creo que a partir de él podré acercarme bastante a lo que necesito.
¡Gracias!
Bueno, si te puedo echar una mano no tienes más que decírmelo 🙂
yo por un tiempo use Trados para mis traducciones, pero lo encontré muy complicado y poco amigable para el usuario asé que lo dejé de usar
No llaméis los símbolos «comillas angulares», por favor. Son los signos «menor que» y «mayor que», respectivamente.
En realidad, si nos ponemos puristas, sería “antilambdas”: http://hispanoteca.eu/Foro-preguntas/ARCHIVO-Foro/Antilambda%20o%20diple.htm 😛
Gracias por comentar,
Pablo
Ja, solo usaba un nombre común. La verdad es que prefiero duplé, se oye mucho mejor 🙂 ¡Saludos!
Today, you can protect the tags in the Excel filetype in Trados Studio – http://wp.me/p2xDjK-sO
Thanks again, Paul! 🙂
Otra opcion seria reemplazar todo lo que este entre (una regex como , o tal vez sin el punto en Word) por el mismo valor con formato twinexternal. Pero es verdad que el uso de macros de Word ya es un poco cosa del pasado (sin desmerecer esta publicacion, ojo), ya que con Trados Studio o Memoq, es muy sencillo proteger etiquetas.
Totalmente de acuerdo: la entrada es algo antigua, pero sea como sea, me alegro de que la tecnología haya avanzado (para bien) en el mundo de la traducción y la localización. 🙂