No sé si se entiende bien el título, así que lo primero vamos a centrar el problema, ¿vale?
Empezamos con una pregunta:
¿Sabes qué tienen en común todas las palabras que hay en la imagen de arriba?
Sí, todas son palabras en inglés. ¿Algo más?
¡Bien visto! Todas tienen la terminación -tion.
Pero lo que hace interesantes a todas esas palabras es que su traducción al español implicaría solo cambiar la terminación -tion por -ción. Por ejemplo, locomotion se traduciría por locomoción, ¿verdad?
¿Te ha pasado encontrarte con estas palabras y que sea un engorro teclear solo esos pocos caracteres? Para mí sí lo es… Ir al final de palabra, borrar tión, escribir ción puede ser un infierno. Por cierto: ¡lo que fallo con la tecla de la tilde!
🙁
Al final, a menudo calculo que habría tardado menos si hubiera borrado la palabra del todo y escrito desde cero…
Por eso desarrollé una macro de AutoHotkey que me simplificó mucho la vida con estas palabras tan especiales.
¡Las españolizo automáticamente!
¿Te interesa saber cómo?
Macro de AutoHotkey para españolizar palabras
Lo vamos a ver para el caso de inglés, pero puede hacerse lo mismo para otros idiomas. Estoy pensando en el francés; en fin, es cuestión de que cada uno personalice esta macro para lo que necesite.
Ya sabes que al trabajar con AutoHotkey logras siempre estos beneficios:
- velocidad al trabajar (sobre todo si no eres hábil con el teclado);
- seguridad de que lo que haces está bien tecleado;
- flexibilidad, es decir, puedes ejecutar la macro en cualquier aplicación, ya sea Word, Studio, memoQ.
Para ejecutar el reemplazo, sigue estos pasos:
- selecciona la palabra que quieres españolizar con AutoHotkey (un doble clic con el ratón funciona de maravilla);
- pulsa la tecla CONTROL de tu teclado;
- y al mismo tiempo que haces clic con el ratón.
Es una combinación bastante rápida.
1.ª macro (básica)
Luego lo iremos complicando, pero la macro de AutoHotkey más básica que reemplaza tion por ción es:
; Macro 1 para ESPAÑOLIZAR. ; Reemplazar tion por ción !LButton:: ; Vacía el Portapapeles clipboard = ; CONTROL+ C = copia el texto seleccionado Send ^c ; Espera a que el Portapapeles tenga contenido ClipWait ; Reemplazar contenido del Portapapeles por otra cadena. ; Resultado: en el mismo Portapapeles StringReplace, clipboard, clipboard, tion, ción, All ; Escribir contenido del Portapapeles SendInput %clipboard% return
Donde se emplea envía CONTROL+C para copiar el texto seleccionado (línea 7) y la función StringReplace para cambiar la cadena tion por ción. El parámetro All hace que se reemplacen todos los tion que haya. En la línea 14 se envía la palabra españolizada.
Notas:
- puedes seleccionar una o varias palabras;
- internamente, la macro reemplaza solo texto, así que ten en cuenta que perderás cualquier otra cosa seleccionada que no sea texto, como imágenes, formato, etiquetas, campos…
2.ª macro (plurales)
Vamos a complicar la macro un poco más, para conseguir más beneficios aún.
Por ejemplo, vamos a añadir que la macro nos reemplace la cadena tions por ciones.
La macro que los hace es:
; Macro 2 para ESPAÑOLIZAR. ; Reemplazar plurales: tion/tions por ción/ciones !LButton:: ; Vacía el Portapapeles clipboard = ; CONTROL+ C = copia el texto seleccionado Send ^c ; Espera a que el Portapapeles tenga contenido ClipWait ; Reemplazar contenido del Portapapeles por otra cadena. ; Resultado: en el mismo Portapapeles StringReplace, clipboard, clipboard, tions, ciones, All StringReplace, clipboard, clipboard, tion, ción, All ; Escribir contenido del Portapapeles SendInput %clipboard% return
Se ha añadido la nueva línea 12, que reemplaza la forma plural, antes de la línea con la forma singular. Fíjate que el reemplazo del plural debe ir antes del reemplazo del singular, porque si reemplazaras primero tion en la palabra associations por ción, quedaría asociacións, que no sería correcto.
3.ª macro (terminación isation)
Vamos a incluir otro reemplazo más. ¿Adivinas cuál?
Supongo que sabes que en inglés británico hay un buen número de palabras terminadas en isation, como authorisation, amortisation, globalisation, etc. Pues bien, vamos a reemplazar esta terminación isation por la española ización. Por ejemplo, reemplazará amortisation por amortización.
Además, tendremos en cuenta los plurales (cambiaremos isations por izaciones).
Todo esto se considera en la siguiente macro:
; Macro 3 para ESPAÑOLIZAR. ; Reemplazar plurales: tion/tions por ción/ciones ; Reemplazar isation por ización (más plurales) !LButton:: ; Vacía el Portapapeles clipboard = ; CONTROL+ C = copia el texto seleccionado Send ^c ; Espera a que el Portapapeles tenga contenido ClipWait ; Reemplazar contenido del Portapapeles por otra cadena. ; Resultado: en el mismo Portapapeles StringReplace, clipboard, clipboard, isations, izaciones, All StringReplace, clipboard, clipboard, isation, ización, All StringReplace, clipboard, clipboard, tions, ciones, All StringReplace, clipboard, clipboard, tion, ción, All ; Escribir contenido del Portapapeles SendInput %clipboard% return
Esta 3.ª versión de la macro funciona y es correcta, pero la vamos a dejar niquelada y robusta para cualquier situación.
4.ª y última macro para españolizar palabras con AutoHotkey
La última macro que considera con todas las mejoras es:
; Macro 4 para ESPAÑOLIZAR. ; Reemplazar plurales: tion/tions por ción/ciones ; Reemplazar isation por ización (más plurales) ; Restablecer el contenido del Portapapeles ; ¡Solo funcionará en Microsoft Word! #IfWinActive ahk_exe WINWORD.EXE ^LButton:: ; Copiar TODO el contenido del Portapapeles portapapeles := ClipboardAll ; Vacía el Portapapeles clipboard = ; CONTROL+ C = copia el texto seleccionado SendInput ^c ; Espera a que el Portapapeles tenga contenido ClipWait ; Reemplazar contenido del Portapapeles por otra cadena. ; Resultado: en el mismo Portapapeles cambios := 0 StringReplace, clipboard, clipboard, isations, izaciones, All, ErrorLevel if ErrorLevel = 0 cambios := cambios + 1 StringReplace, clipboard, clipboard, isation, ización, All, ErrorLevel if ErrorLevel = 0 cambios := cambios + 1 StringReplace, clipboard, clipboard, tions, ciones, All, ErrorLevel if ErrorLevel = 0 cambios := cambios + 1 StringReplace, clipboard, clipboard, tion, ción, All, ErrorLevel if ErrorLevel = 0 cambios := cambios + 1 ; Comprobando que la tecla CONTROL está levantada while GetKeyState("Control", P) Sleep, 20 ; Escribir contenido del Portapapeles if cambios SendInput %clipboard% ; Devolver contenido original al Portapapeles Clipboard = %portapapeles% ; Liberar memoria de la variable temporal portapapeles = return ; Final de #IfWinActive de los programas seleccionados #IfWinActive
Te puedes descargar la macro desde este enlace.
Veamos las mejoras una a una:
1.- Mantener el contenido del Portapapeles
Como ya vimos en el artículo 4 aplicaciones de AutoHotkey y el Portapapeles de Windows, vamos a mantener el contenido del Portapapeles de Windows, así no lo pierdes por ejecutar la macro.
Básicamente, al principio de la macro se copia el contenido del Portapapeles en una variable temporal (línea 10) y se restituye al final (línea 43).
2.- Ejecutar solo en Word
Otro punto que vamos a conseguir es que la macro solo se ejecute en una determinada aplicación. De esta forma, evitaremos disparar la macro si nos equivocamos en otras aplicaciones.
En esta macro, en la línea 7 elegí Microsoft Word, es decir, como si solo tuviera sentido que estuvieras españolizando en Word. Puedes elegir otra aplicación, como SDL Trados Studio. En ese caso, debes cambiar la misma línea 7 a:
#IfWinActive ahk_exe SDLTradosStudio.exe
En realidad, en mi PC lo tengo funcionando de otra manera distinta, pero para el objetivo de este artículo, de momento dejamos la macro así de sencilla, ¿vale?
3.- Solo después de levantar la tecla CONTROL
Otro punto que vamos a corregir es evitar comportamientos no deseados en aplicaciones, como podría ser Word.
A ver si logro explicarme; sígueme, no es complicado, pero requiere un punto de atención: imagínate que estás en Word, y que ejecutas esta macro de AutoHotkey pulsando la tecla CONTROL y pulsando el ratón al mismo tiempo; hasta aquí, de acuerdo, ¿verdad? Fíjate que si levantas el botón de ratón antes de soltar la tecla CONTROL, entonces Word irá sacando cada uno de los caracteres pero con la tecla CONTROL pulsada, ya que aún no la has soltado. Por ejemplo, al momento de sacar la letra P, si se le une el efecto de mantener pulsada la tecla CONTROL, eso significaría que empezarías a imprimir el documento (CONTROL+P), ¡algo que no quieres ni de lejos!
Las líneas 35 y 36 evitan esto. En concreto, la línea 35 comprueba si la tecla CONTROL está físicamente pulsada (parámetro P de la función GetKeyState), y si es así, espera 20 milisegundos (función Sleep) y vuelve a comprobarlo en un bucle del que solo se sale al levantar la tecla CONTROL.
Es decir, la macro solo escribirá la cadena españolizada al levantar la tecla CONTROL.
4.- Solo si hay que españolizar
Además, la macro solo escribirá la cadena españolizada si ha habido algún reemplazo.
El número de reemplazos lo controla la variable cambios, que tiene en cuenta la variable interna ErrorLevel en cada reemplazo con la función StringReplace. Si no se reemplaza nada, porque no has seleccionado nada «españolizable», entonces cambios valdrá cero y no se ejecutará la línea 40 con SendInput %clipboard%.
Realmente no sería necesario este control de los cambios implementados, pero no tiene sentido reemplazar un texto por otro, cuando ya vimos que es posible que falten formatos, etiquetas, campos, etc.
Con este código tenemos una macro más robusta, que no te dará tantos problemas como la más básica.
Conclusiones
Aquí tienes una forma rápida de «españolizar» palabras especiales de un idioma.
Puedes añadir otros criterios, los que consideres que te permiten exprimir las posibilidades que más se presentan en inglés (o en el idioma que quieras).
Lo que sí me gustaría es saber los criterios que añades a la macro de AutoHotkey. Así todos nos podremos aprovechar de las ideas de todos.
Cualquier idea, ya sabes: en el formulario de comentarios.
* * * * *
Aunque durante mucho tiempo disparé la macro pulsando la tecla CONTROL y haciendo clic con el ratón sobre la palabra seleccionada, desde hace unas semanas lo disparo de otra forma.
¿Qué forma?
Para saberlo, me temo que habrá que esperar hasta la semana que viene, donde en otro artículo tocaré un tema totalmente distinto, pero que, de paso, puedo aprovechar para facilitar mucho el disparo.
🙂
¿Hay suspense?
Otra posibilidad:
#IfWinActive, ahk_exe WINWORD.EXE
^LButton::
clipboard =
Send ^c
ClipWait, 0
if ErrorLevel
return
Sleep, 50
If RegExMatch(clipboard, "[a-z]{2,}tion\b")
{
clipboard := RegExReplace(clipboard, "i[sz]ation\b", "ización")
clipboard := RegExReplace(clipboard, "i[sz]ations\b", "izaciones")
clipboard := RegExReplace(clipboard, "tion\b", "ción")
clipboard := RegExReplace(clipboard, "tions\b", "ciones")
Send ^v
}
else
{
ToolTip, No matches found
Sleep, 1000
ToolTip
}
return
#IfWinActive
Gracias, traductor, una posibilidad elegante, a base de expresiones regulares.
Una cosa importante: en la macro de AutoHotkey habría que cambiar la línea:
If RegExMatch(clipboard, "[a-z]{2,}tion\b")
a esta otra:
If RegExMatch(clipboard, "[a-z]{2,}tion")
o bien a:
If RegExMatch(clipboard, "[a-z]{2,}tions?\b")
De este modo, tu macro podrá cambiar también las palabras en plural, terminadas en «tions».
Veo que para escribir el comentario has empleado una dirección de correo desechable, así que no tengo forma de avisarte; espero que puedas ver mi comentario, para que puedas corregir tu macro de AutoHotkey, porque la idea me parece muy interesante.
Nota: al igual que con mi macro, queda pendiente que funcione tanto si son palabras minúsculas («translation») como mayúsculas («TRANSLATION»).
Un saludo.
... Jesús Prieto ...
Tienes razón, Jesús, lo correcto hubiera sido:
If RegExMatch(clipboard, "[a-z]{2,}tions?\b")
Corregido, ¡gracias!
Para que funcione también con mayúsculas:
#IfWinActive, ahk_exe WINWORD.EXE
^LButton::
clipboard =
Send ^c
ClipWait, 0
if ErrorLevel
return
Sleep, 50
If RegExMatch(clipboard, "i)[a-z]{2,}tions?\b")
{
clipboard := RegExReplace(clipboard, "i[sz]ation\b", "ización")
clipboard := RegExReplace(clipboard, "i[sz]ations\b", "izaciones")
clipboard := RegExReplace(clipboard, "tion\b", "ción")
clipboard := RegExReplace(clipboard, "tions\b", "ciones")
clipboard := RegExReplace(clipboard, "I[SZ]ATION\b", "IZACIÓN")
clipboard := RegExReplace(clipboard, "I[SZ]ATIONS\b", "IZACIONES")
clipboard := RegExReplace(clipboard, "TION\b", "CIÓN")
clipboard := RegExReplace(clipboard, "TIONS\b", "CIONES")
Send ^v
}
else
{
ToolTip, No matches found
Sleep, 1000
ToolTip
}
return
#IfWinActive
¡Fenomenal, muchas gracias por la idea!