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 = "")
{
//ar,bg,zh-CHS,zh-CHT,cs,da,nl,en,et,fi,fr,de,el,ht,he,hu,id,it,ja,ko,lv,lt,no,pl,pt,ro,ru,sk,sl,es,sv,th,tr,uk,vi
//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 appId = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; //Replace with your API ID
    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;

    try
    {
        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) ;

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

        CodeAccessPermission::revertAssert();
    }
    catch(Exception::CLRError)
    {
        throw error(AifUtil::getClrErrorMessage());
    }

    info(ret);
}

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)
{
    #task
    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())
                {
                    SysSetupFormRun::ecl_translate(fsc.valueStr());
                }
            }
        }
    }
    // << Translate string

    if (_p1 == #taskFilter)
    {
        formDataSource = this.objectSet();
        if (formDataSource &&
            formDataSource.queryRun() &&
            formDataSource.queryRun().args() &&
            !formDataSource.queryRun().args().caller())
        {
            formDataSource.queryRun().args().caller(this);
        }
    }

    //info(strfmt("%1=%2",_p1,#taskFilter));
    //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: