Traducción automática de etiquetas con BING

El pasado viernes Arijit Basu publicó en su blog un experimento, mediante el cual explicaba brevemente como utilizar el servicio web publicado por Microsoft de su producto BING para traducir cadenas de texto desde AX.

Este artículo me llevo a una idea propia de como sacarle utilidad a esa funcionalidad. Cuando uno trabaja en un entorno con varios idiomas, puede ser útil que al generar una etiqueta en nuestro idioma, se generen automáticamente el resto de idiomas ya traducidos.

Yo no he llegado tan lejos (todavía) pero he hecho una pequeña aproximación que paso a compartir, este es el resultado:

InfoLog Result

despues de ejecutar el Job:

/*
   JAEE - www.jaestevan.com

   @created 10/10/2009 tested in AX2009 SP1
*/

static void MicrosoftTranslatorTest(Args _args)
{
   MicrosoftTranslator msTrans = new MicrosoftTranslator();
   ;
   msTrans.createLabel("Ahora axapta puede traducir etiquetas! (jaestevan.com)", "es");
}

Desde aquí (AX class is documented in english too) se puede descargar un fichero XPO con la clase que paso a comentar. En la construcción de la clase indicamos nuestro código de BING (el cual se solicita en su web de forma gratuíta e instantanea) así como una lista de los idiomas que queremos traducir, indicando el código de idioma de AX así como el código del idioma en BING (usualmente el mismo). Por ultimo y de manera opcional podemos indicar el fichero de etiquetas donde se generarán, aunque por defecto utilizaremos el módulo por defecto por lo que este parámetro es opcional. Este es el método en cuestión:

void new(LabelModuleId _modulo = SysLabel::defaultModuleId())
{
   // Axapta Label Module Id
   moduleId = _modulo;

   // Microsoft BING AppID - http://www.bing.com/developers
   appId = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

   // List of languages to translate (AX lang, BING lang) (Idiomas a traducir)
   transLang = new Map(Types::String, Types::String);
   transLang.insert('de','de');
   transLang.insert('ru','ru');
   transLang.insert('en-us','en-us');
   transLang.insert('fr','fr');
}

Esta es la manera de configurar la clase para su uso (si bien está construida para ser un ejemplo, no para servir de cualquier utilidad real).

El kit de la cuestión lo encontramos en el siguiente método, el cual genera la etiqueta (si no existe) en el idioma predeterminado y luego busca la traducción en BING para todos los idiomas configurados en la clase:

public void createLabel(str _txt, str _txtLang)
{
   MapEnumerator       langEnum;
   Label               l;
   str                 res;

   LabelId             labelId;
   SysLabelEdit        labelEd     = new SysLabelEdit();
   SysLabel            sysLabel    = new SysLabel('es');
   ;

   // Find or create the label (busca la etiqueta y si no existe la crea)
   labelId = labelEd.findLabel(_txtLang, _txt);
   if (!labelId)
   {
       sysLabel.insert(_txt, _txt, this.parmModuleId());
       labelId = labelEd.findLabel(_txtLang, _txt);
   }

   //Log
   InfoLog.add(Exception::Info, strfmt("Traduciendo: (%1) %2", _txtLang, _txt));

   // Update the label for each language (actualiza la etiqueta para cada idioma)
   langEnum = new MapEnumerator(this.parmLangs());
   while (langEnum.moveNext())
   {
       // Call to translate (función de traducir)
       res = this.strTranslate(_txt, _txtLang, langEnum.currentValue());

       // Modify label with new translated text (modifica la etiqueta con el texto traducido)
       labelEd.labelModify(langEnum.currentValue(), labelId, res, _txt, SysLabelApplModule::None, true);

       // Log
       InfoLog.add(Exception::Info, strfmt("(%1) %2", langEnum.currentKey(), res));
   }

}

El trabajo de integrar esta funcionalidad con el editor de etiquetas estándar queda pendiente para otra entrega.

Enlaces

Descarga

X++ y MSIL

Publicaba en este blog el mes pasado que en la próxima versión de AX, el desarrollo de Enterprise Portal pasa a realizarse exclusivamente sobre Visual Studio. En la actual versión de AX, la 2009, ya podemos usar Visual Studio para desarrollar reports integrados en SQL Server Reporting Services, y desde varias versiones atrás AX publica cubos OLAP sobre servidores SQL Server Analysis Services. Lo que viene a confirmar la intención de integrar AX en el resto de sus productos de area empresarial, así como consolidar tecnologías concretas para trabajos concretos. Es inevitable mirar atrás y acordarse del “Proyect Green

En otro paso mas en el acercamiento de la tecnología AX hacia .NET, hace unas semanas se publicó un video en Channel 9  mostrando el trabajo del equipo de desarrollo de AX orientado a la generación de código intermedio MSIL (Microsoft Intermediate Language). Si bien anuncian que este trabajo no se verá implementado en la próxima versión de AX, de llegar a completarse sería un avance importante en cuanto al rendimiento y a las posibilidades de integración de futuras versiones del producto.