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.
*This post is locked for comments