Tuesday, 21 June 2011

Online (Bing) translator for AX using a shortcut key

Keeping in theme with the last post, I will talk about another simple use for web services in AX.
I will use Microsoft (Bing) Translator to automatically translate fields with just a shortcut key (in this example I will take over the Ctrl+Z shortcut).

In \Classes\SysSetupFormRun add a new method. Copy and paste below. Make sure to replace the API ID with your own. Sign up to Microsoft API.
Public static server void translate(str _text = "")
//Arabic Bulgarian Chinese Simplified Chinese Traditional Czech Danish Dutch English Estonian Finnish French
//German Greek Haitian Creole Hebrew Hungarian Indonesian Italian Japanese Korean Latvian Lithuanian
//Norwegian Polish Portuguese Romanian Russian Slovak Slovenian Spanish Swedish Thai Turkish Ukrainian Vietnamese

    str uri;
    str fromLanguage="en", ToLanguage="fr"; //Change the language you want to change from/to
    str ret = "";

    System.Net.HttpWebRequest   httpRequest  = null;
    System.Net.HttpWebResponse  httpResponse = null;
    CLRObject                   clro         = null;
    System.IO.Stream            stream       = null;
    System.IO.StreamReader      streamReader = null;
    XmlTextReader               xmlTextReader ;

    uri = "http://api.microsofttranslator.com/v2/Http.svc/Translate?appId=" + appId +
        "&text=" + _text + "&from=" + fromLanguage + "&to=" + toLanguage;

        new InteropPermission(InteropKind::ClrInterop).assert();
        clro         = System.Net.WebRequest::Create(uri);
        httpRequest  = clro;
        httpResponse = httpRequest.GetResponse();
        stream = httpResponse.GetResponseStream();
        streamReader = new System.IO.StreamReader(stream);
        ret = streamReader.ReadToEnd();

        xmlTextReader = XmlTextReader::newXml(ret, true) ;

            switch (xmlTextReader.NodeType())
                case XmlNodeType::Text: //Display the text in each element.
                    ret = xmlTextReader.Value();

        throw error(AifUtil::getClrErrorMessage());


Now the second part is to trap shortcut keys. This is done in the same class \Classes\SysSetupFormRun.
Modify the task() method by adding the following code:
public int task(int _p1)
    FormDataSource formDataSource;

    int ret;

    // >> Translate string
    // Munib - 2010-12-28
    FormControl fc;
    formStringControl fsc;

    if (_p1 == 769) //Ctrl + Z
        fc = this.selectedControl();
        formDataSource =  this.objectSet();

        if(fc && formDataSource)
            fsc    = fc;

            if(fsc.dataField() && formDataSource.table())
                if (fsc.valueStr())
    // << Translate string

    if (_p1 == #taskFilter)
        formDataSource = this.objectSet();
        if (formDataSource &&
            formDataSource.queryRun() &&
            formDataSource.queryRun().args() &&

    //shift + F3   - 4443
    //Shift + Down - 1296
    ret = super(_p1);

    return ret;

Final result looks like this:

We could be smart and make it parameter driven with the API ID, from/to language. This example is just to illustrate how simple it is to use web services in your project.

No comments: