-----------------------------------------------------------

New Message on MumbaiUserGroup

-----------------------------------------------------------
From: soniashish
Message 1 in Discussion

  
This is a pretty simple job, and can be broken down into the following subtasks:       
 Get text for translation and encode it into a HTTP POST request         Send the data 
to the web server, acting in effect as a .NET web browser         Read the response 
back into a big string        Remove all the HTML and formatting and send the raw 
translated string back to the client. [WebMethod] public string BabelFish(string 
translationmode, string sourcedata)  { }readonly string[] VALIDTRANSLATIONMODES = new 
string[]   {"en_zh", "en_fr", "en_de", "en_it", "en_ja", "en_ko", "en_pt", "en_es",   
"zh_en", "fr_en", "fr_de", "de_en", "de_fr", "it_en", "ja_en", "ko_en",   "pt_en", 
"ru_en", "es_en"}; 
The code performs validation to check for a valid mode before passing it on to 
Babelfish. After that, we create a POST request. The syntax for a HTTP POST request 
looks something like this:POST /babelfish/tr/ HTTP/1.0 Content-Type: 
application/x-www-form-urlencoded Content-Length: 51  
lp=en_fr&tt=urltext&intl=1&doit=done&urltext=cheese 
It's pretty simple, and if you want, you could use low-level sockets to write the data 
to the server. Microsoft provides some better ways to do this however, and so we use 
the HttpWebRequest class, which has lots of built-in features to make it easy to work 
with HTTP connections.Uri uri = new Uri(BABELFISHURL); HttpWebRequest request = 
(HttpWebRequest) WebRequest.Create(uri); request.Referer = BABELFISHREFERER; // Encode 
all the sourcedata  string postsourcedata; postsourcedata = "lp=" + translationmode +  
    "&tt=urltext&intl=1&doit=done&urltext=" +  HttpUtility.UrlEncode(sourcedata); 
request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; 
request.ContentLength = postsourcedata.Length; request.UserAgent = "Mozilla/4.0 
(compatible; MSIE 6.0; Windows NT 5.1)"; Stream writeStream = 
request.GetRequestStream(); UTF8Encoding encoding = new UTF8Encoding(); byte[] bytes = 
encoding.GetBytes(postsourcedata); writeStream.Write(bytes, 0, bytes.Length); 
writeStream.Close(); HttpWebResponse response = (HttpWebResponse) 
request.GetResponse(); Stream responseStream = response.GetResponseStream(); 
StreamReader readStream = new StreamReader (responseStream, Encoding.UTF8); string 
page = readStream.ReadToEnd(); 
We end up with a string containing the entire Babelfish page. As it stands, this is 
about 99% noise (HTML tags, Altavista information, etc.), and 1% the translation we 
were looking for. So we need a regular expression to find the translated text. By 
looking at the HTML page, you will find the translation is contained between:<Div 
style=padding:10px; lang=fr>translation here</div> 
So the required regular expression looks like this (note: while testing my regular 
expressions, I got lots of help from Regulator):<Div style=padding:10px; 
lang=..>((?:.|\n)*?)</div> 
This will match the whole <div>...</div> string. This is a fairly complex regular 
expression, but basically, the . character matches everything, except for newlines, 
hence the (.|\n) pattern, which means any character (except newlines) or new lines. 
The brackets create a matching group, meaning that the text within the brackets 
(namely the translation) will be put in its own group at index 1 (index 0 contains the 
whole match). 
The ?: pattern suppresses grouping: () normally creates a matching group: in this 
case, we are only using the pattern to allow for line breaks in long translations. 
Finally *? is a lazy regular expression, matching every character up to the first 
instance of <div>. (If I had used plain *, the expression would be greedy, and would 
chomp right up to the LAST </div>.) 
Here's the code:Regex reg = new Regex(@"<Div style=padding:10px; 
lang=..>(.*?)</div>"); MatchCollection matches = reg.Matches(page); if (matches.Count 
!= 1 || matches[0].Groups.Count != 2)  {     return ERRORSTRINGSTART + "The HTML 
returned from Babelfish " +          "appears to have changed. Please check for" +     
     " an updated regular expression" +          ERRORSTRINGEND; } return 
matches[0].Groups[1].Value; 
And subject to error checking, that's it! Using it 
Download the code, and unzip it somewhere. Add a virtual directory called Translation 
in IIS. Go to /translate.asmx and click Test, and enter some test data (say 'en_fr', 
and 'cheese'). If it works, you are ready to use it in your web and Windows Forms 
applications. 
To use it in your app, add a Web Reference to the asmx, to the program you want to use 
it in; Visual Studio will create a proxy reference for you, which you can then use to 
perform translation. 
Here's some sample code-behind:namespace test {     using System;     using 
System.Data;     using System.Drawing;     using System.Web;     using 
System.Web.UI.WebControls;     using localhost1; // assuming that's the reference 
generated     using System.Web.UI.HtmlControls;      /// <summary>     ///     Summary 
description for WebUserControl1.     /// </summary>     public class WebUserControl1 : 
System.Web.UI.UserControl     {         protected 
System.Web.UI.WebControls.DropDownList ddTranslationMode;         protected 
System.Web.UI.WebControls.TextBox txtText;         protected 
System.Web.UI.WebControls.Label lblTranslation;         protected 
System.Web.UI.WebControls.Button submitButton;          private void Page_Load(object 
sender, System.EventArgs e)         {             // Put user code to initialize the 
page here         }          protected void submitButton_Click(object sender, 
System.EventArgs e)          {             string translationMode =                  
this.ddTranslationMode.SelectedItem.Value;             string translationText = 
this.txtText.Text.Trim();             string translation = "";             try         
     {                 Translate tr = new Translate();                 translation = 
tr.BabelFish(translationMode,translationText);             }             catch 
(Exception exp)              {                 translation = "There was an error 
accessing the server: "                                                               
+ exp.Message;             }             this.lblTranslation.Text = translation;       
  }     } }

-----------------------------------------------------------

To stop getting this e-mail, or change how often it arrives, go to your E-mail 
Settings.
http://groups.msn.com/MumbaiUserGroup/_emailsettings.msnw

Need help? If you've forgotten your password, please go to Passport Member Services.
http://groups.msn.com/_passportredir.msnw?ppmprop=help

For other questions or feedback, go to our Contact Us page.
http://groups.msn.com/contact

If you do not want to receive future e-mail from this MSN group, or if you received 
this message by mistake, please click the "Remove" link below. On the pre-addressed 
e-mail message that opens, simply click "Send". Your e-mail address will be deleted 
from this group's mailing list.
mailto:[EMAIL PROTECTED]

Reply via email to