De ruso a español en pocas horas
¿Qué sucede cuando hay una aplicación que necesitas pero lamentablemente está en otro idioma con excepción del inglés? En este artículo mostraré cómo se puede adaptar una aplicación a nuestro idioma y adicionalmente cambiar comportamientos que parecen imposibles de modificar. Exactamente este artículo se basa en modificar una aplicación rusa de administración de un SAI (UPS)
La problemática
Hace unos meses compré una pequeña UPS (SAI) para mi computador. Una UPS es un dispositivo que permite que tu equipo siga encendido luego de un corte de la energía, mantenido por baterías durante unos minutos para alcanzar a cerrar tus documentos y apagar el equipo. Todo bien hasta el momento de instalar la aplicación que venía con el aparato. El programa se llama Winpower y es compatible con una gran variedad de sistemas operativos, compatible gracias a que está programado en Java: Aunque personalmente no me gustan las aplicaciones en Java en general para cosas como servicios del sistema, acepté instalar el programa por el hecho que lo necesitaba (el programa se necesita para programar eventos como el apagado del equipo frente a un corte de la energía). El dichoso programa instala cuatro servicios de Windows y muestra por unos instantes dos ventanas de la consola de Windows al iniciar el equipo. Luego de algunos retoques a Winpower, logré ocultar esas ventanas de la consola y cambiar algunos íconos del programa (por ejemplo el del área de notificaciones) para aceptar su existencia. Winpower tiene varias cualidades, como por ejemplo poder controlar una red y funciones bastante interesantes, pero uno generalmente lo único que desea lograr con la UPS (que es sólo para un equipo) es apagar el computador cuando se corte la luz, aunque esté en una red hogareña. Un día dejó de funcionar (no iniciaba uno de los paquetes), averigué un poco y al parecer el programa presentaba esos problemas de forma natural. En vez de reinstalarlo me puse a buscar una alternativa.
Una posible solución
[quote style="boxed"]Hay que considerar que mi UPS no es detectada por el panel de energía de Windows, lo que hubiera sido lo ideal para mí.[/quote] Luego de mucho rato de buscar, encontré una excelente alternativa. Era un pequeño programa escrito en Delphi, simplemente hacía lo que debía, la ventana principal del programa es la siguiente: En la siguiente imagen se puede apreciar con más detalle todas las cualidades del programa y claramente el pequeño problema estético y práctico de que esté en ruso:
Comenzando a traducir
Como ayuda adicional encontré una imagen en donde alguien había traducido en un editor gráfico la ventana principal del programa al inglés para ayudar al uso del mismo: Gracias a la ayuda de Restorator (eXescope o Resource Hacker), del paquete de idiomas complejos de Windows y del siguiente traductor, traducir partes del programa es bastante sencillo, por ejemplo el siguiente menú: Corresponde al siguiente código en Restorator: De esa forma podemos obtener un menú (y muchas de las otras ventanas del programa) traducidas elegantemente: Y con su código equivalente en Restorator, esta vez en español: De una forma similar este proceso se puede repetir para muchos de los textos en ruso. Ahora hay un problema, hay cadenas de texto que no pueden ser editadas de esta forma (simplemente porque no son recursos de la aplicación, sino cadenas de texto internas) y se necesita utilizar otra técnica.
El siempre útil editor Hexagesimal
Para ciertos mensajes y textos de advertencia que no se pueden modificar con un editor de recursos como en el punto anterior, se debe utilizar un editor como Hex Workshop. Un ejemplo de un mensaje que se debe modificar con el editor Hexagesimal es el siguiente: El problema es encontrando esas palabras. Para hacerlo, simplemente se quita el soporte para idiomas complejos de Windows y ahora tenemos el siguiente mensaje a traducir: Como nota aparte, toda la aplicación adopta ese aspecto al quitar el soporte para idiomas complejos de Windows: Ahora simplemente buscamos esos carácteres en el archivo con el editor: Un gran problema de este método es que es imposible modificar el largo de las frases, es decir debemos buscar palabras que utilicen correctamente los espacios por letra o simplemente rellenar las sobrantes con espacios en blanco (a veces se puede llenar los espacios con ceros, así el resultado es óptimo, pero en ciertas ocasiones esta acción provoca una corrupción en la aplicación). El cambio más adecuado sería de la siguiente forma: Y finalmente obtenemos un mensaje así:
Ajustando un poco más las cosas
Hubo un mensaje que me dió más problemas que los demás. El mensaje de estado original de la UPS es el siguiente: La complicación era para ajustar los textos, pues internamente se tiene algo así: Dentro del área resaltada con rojo hay otra sección pequeña resaltada, la que corresponde a la que indica el "Voltaje de salida" en la notificación. El problema es que para cambiar las palabras originales sin corromper el programa es imposible y colocar palabras más cortas es antiestético (pues deberíamos rellenar con espacios y los valores, en este caso el voltaje, aparecerían separados). Es decir en las alternativas posibles tendríamos resultados como por ejemplo (ajustándonos a los largos originales): ¿Cúal fue la solución? Colocar tabuladores (09 en ASCII) para separar los valores y mantener la estética. El resultado: Bastante bien, ¿o no?
Basta de traducciones
Listo con las traducciones ahora pasemos a una fase algo más entretenida: modificar comportamientos. El programa en general está bastante bien, tiene un simple visor de estadísticas: y otras funciones interesantes más. Pero hay algo que me pareció totalmente ilógico, cuando se corta la energía el programa permite establecer un tiempo antes de apagar el equipo. [quote style="boxed"]¿Qué sucede si no estamos en casa y dejamos un trabajo sin guardar o simplemente dejamos el computador por un rato?[/quote] Se corta la energía eléctrica, se apaga el equipo (sin dañarlo) pero y el estado de nuestro equipo... ¿se pierde? Bueno, una forma fácil de solucionar este problema es modificando la instrucción de apagado para reemplazarla por una instrucción de hibernar el equipo. Con el simple pero poderoso OllyDbg y gracias a la documentación de las APIs de Windows sabemos que la instrucción de apagado es la siguiente: Entonces, sin mucha dificultad buscamos las llamadas a la librería correspondiente: Y luego de encontrarla la analizamos: Si se fijan bien, OllyDbg nos da una pista sobre los parámetros de apagado. Según los parámetros se le ordena a la rutina a apagar el computador (forzando el apagado). Investigando nuevamente la documentación de las librerías del sistema encontramos la instrucción requerida para hibernar el equipo: Como detalle adicional la instrucción requerida se encuentra en otra librería del sistema. Como es una librería cargada por defecto en el ejecutable procedemos a realizar el cambio, debemos establecer la nueva función con ambos parámetros para hibernar. El primer parámetro establece si el equipo se debe suspender o hibernar (con un cero o uno respectivamente) y la segunda establece si el sistema debe forzar el hibernado o no. Como queremos hibernar y forzar la hibernación establecemos los siguiente parámetros (están en orden inverso pues en ensamblador se hace un PUSH de los parámetros a una pila o STACK, en donde el último elemento que entra es el primero que sale, es decir LIFO): OllyDbg convierte el nombre de la librería y de la rutina en la dirección de memoria correspondiente para realizar la llamada (CALL).
Capturas finales
Ahora la aplicación, el instalador y todos los mensajes están en español. Convenientemente ahora el programa hiberna el computador en vez de apagarlo.
Descarga y enlaces
· Página del distribuidor de la aplicación · Descarga del programa original en ruso (versión 0.99.6) [quote style="boxed"]Actualización del programa modificado (28/10/2006) Pequeñas correcciones menores y traducción de algunos mensajes específicos en ruso que hasta el momento no habían aparecido[/quote] · Descarga del programa en español (versión 0.99.6 / WinNT) [quote style="boxed"]Actualización (16/03/2007) A petición de un lector, adjunto otra versión del archivo, en este caso es idéntica a la modificación del documento exceptuando que esta apaga el equipo en vez de hibernarlo, particularmente útil para Windows 9x[/quote] · Descarga del programa en español (versión 0.99.6 / Win9x)








