代码改变世界

google Translator

2011-08-16 12:56  symphony2010  阅读(1207)  评论(0编辑  收藏  举报

总算找到一个小巧的google 翻译器。在google translator 中最终要的类

WebResourceProvider

codeproject有详细的描述,大家可以参考

WebResourceProvider 使用

You use WebResourceProvider by deriving your own resource provider class from it, and overriding any of these virtual methods (shown in red in the diagram on the right):

  • init
  • constructUrl
  • isPost()
  • getPostData()

  • parseContent()
  • moreAvailable()

WebResourceProvider provides an assortment of methods to help parse downloaded content. They are:

Method
Purpose

at
Checks whether current location is at a string

atExact
Case sensitive version of at()

skipTo
Advances current location to next occurence of a string

skipToExact
Case sensitive version of skipTo()

skipBackTo
Retreats current location to previous occurence of a string

skipBackToExact
Case sensitive version of skipBackTo()

extractTo
Extracts text from current location to the start of a string

extractToExact
Case sensitive version of extractTo()

extractToEnd
Extracts text from current location to end of content

getIndex
Returns current location

getLinks
Returns HREF and IMG links in content

resetIndex
Sets current location to start of content

replaceEvery
Replaces every occurence of a string in content with another

removeComments
Removes comments from content

removeScripts
Removes scripts from content

removeEnclosingAnchorTag
Removes anchor tag enclosing a string

removeEnclosingQuotes
Removes quotes enclosing a string

removeHtml
Removes HTML from a string

trim
Removes leading and trailing whitespace from a string

实现原理

wrp_controlflow

看看google translator 里面是怎么用呢

下面是WebResourceProvider类
#region Assembly WebResourceProvider.dll, v1.1.4322
// C:\Documents and Settings\Administrator\桌面\GoogleTranslator\WebResourceProvider.dll
#endregion

using System;

namespace RavSoft
{
    public abstract class WebResourceProvider
    {
        public WebResourceProvider();

        public string Agent { get; set; }
        public string Content { get; }
        public string ErrorMsg { get; }
        public DateTime FetchTime { get; }
        public int Pause { get; set; }
        public string Referer { get; set; }
        public int Timeout { get; set; }

        protected virtual bool continueFetching();
        public void fetchResource();
        protected abstract string getFetchUrl();
        protected virtual string getPostData();
        protected virtual bool init();
        protected virtual void parseContent();
        public void reset();
    }
}

Translator 实现对 WebResourceProvider的继承

// Copyright (c) 2010 Ravi Bhavnani
// License: Code Project Open License
// http://www.codeproject.com/info/cpol10.aspx
 
using System;
using System.Collections.Generic;
 
namespace RavSoft.GoogleTranslator
{
    /// <summary>
    /// Translates text using Google's online language tools.
    /// </summary>
    public class Translator : RavSoft.WebResourceProvider
    {
        #region Constructor
 
            /// <summary>
            /// Initializes a new instance of the <see cref="Translator"/> class.
            /// </summary>
            public Translator()
{
                this.SourceLanguage = "English";
                this.TargetLanguage = "French";
                this.Referer = "http://www.google.com";
            }
            {
 
        #endregion
 
        #region Properties
 
            /// <summary>
            /// Gets or sets the source "
            /// </summary>
            /// <value>The source "</value>
            public string SourceLanguage {
                get;
                set;
            }
 
            /// <summary>
            /// Gets or sets the target "
            /// </summary>
            /// <value>The target "</value>
            public string TargetLanguage {
                get;
                set;
            }
 
            /// <summary>
            /// Gets or sets the source text.
            /// </summary>
            /// <value>The source text.</value>
            public string SourceText {
                get;
                set;
            }
 
            /// <summary>
            /// Gets the translation.
            /// </summary>
            /// <value>The translated text.</value>
            public string Translation {
                get;
                private set;
            }
 
            /// <summary>
            /// Gets the reverse translation.
            /// </summary>
            /// <value>The reverse translated text.</value>
            public string ReverseTranslation {
                get;
                private set;
            }
 
        #endregion        
 
        #region Public methods
 
            /// <summary>
            /// Attempts to translate the text.
            /// </summary>
            public void Translate()
            {
                // Validate source and target languages
                if (string.IsNullOrEmpty (this.SourceLanguage) ||
                    string.IsNullOrEmpty (this.TargetLanguage) ||
                    this.SourceLanguage.Trim().Equals (this.TargetLanguage.Trim())) {
                    throw new Exception ("An invalid source or target language was specified.");
                }
 
                // Delegate to base class
                this.fetchResource();
            }
 
        #endregion
 
        #region WebResourceProvider implementation
 
            /// <summary>
            /// Returns the url to be fetched.
            /// </summary>
            /// <returns>The url to be fetched.</returns>
            protected override string getFetchUrl()
            {
              return "http://translate.google.com/translate_t";
            }
 
            /// <summary>
            /// Retrieves the POST data (if any) to be sent to the url to be fetched.
            /// The data is returned as a string of the form "arg=val[&arg=val]...".
            /// </summary>
            /// <returns>A string containing the POST data or null if none.</returns>
            protected override string getPostData()
            {
              // Set translation mode
              string strPostData = string.Format ("hl=en&ie=UTF8&oe=UTF8submit=Translate&langpair={0}|{1}",
                                                   Translator.LanguageEnumToIdentifier (this.SourceLanguage),
                                                   Translator.LanguageEnumToIdentifier (this.TargetLanguage));
 
              // Set text to be translated
              strPostData += "&text=\"" + this.SourceText + "\"";
              return strPostData;
            }
 
            /// <summary>
            /// Parses the fetched content.
            /// </summary>
            protected override void parseContent()
            {
                // Initialize the scraper
                this.Translation = string.Empty;
                string strContent = this.Content;
                RavSoft.StringParser parser = new RavSoft.StringParser (strContent);
 
                // Scrape the translation
                string strTranslation = string.Empty;
                if (parser.skipToEndOf ("<span id=result_box")) {
                    if (parser.skipToEndOf ("onmouseout=\"this.style.backgroundColor='#fff'\">")) {
                        if (parser.extractTo("</span>", ref strTranslation)) {
                            strTranslation = StringParser.removeHtml (strTranslation);
                        }
                    }
                }
 
                #region Fix up the translation
                    int startClean = 0;
                    int endClean = 0;
                    int i=0;
                    while (i < strTranslation.Length) {
                        if (Char.IsLetterOrDigit (strTranslation[i])) {
                            startClean = i;
                            break;
                        }
                        i++;
                    }
                    i = strTranslation.Length - 1;
                    while (i > 0) {
                        char ch = strTranslation[i];
                        if (Char.IsLetterOrDigit (ch) ||
                            (Char.IsPunctuation (ch) && (ch != '\"'))) {
                            endClean = i;
                            break;
                        }
                        i--;
                    }
                    this.Translation = strTranslation.Substring (startClean, endClean - startClean + 1).Replace ("\"", "");
                #endregion
            }
 
        #endregion
 
        #region Private methods
 
            /// <summary>
            /// Converts a language to its identifier.
            /// </summary>
            /// <param name="language">The language."</param>
            /// <returns>The identifier or <see cref="string.Empty"/> if none.</returns>
            private static string LanguageEnumToIdentifier
                (string language)
            {
                if (Translator._languageModeMap == null) {
                    Translator._languageModeMap = new Dictionary<string,string>();
                    Translator._languageModeMap.Add ("Afrikaans",   "af");
                    Translator._languageModeMap.Add ("Albanian",    "sq");
                    Translator._languageModeMap.Add ("Arabic",      "ar");
                    Translator._languageModeMap.Add ("Belarusian",  "be");
                    Translator._languageModeMap.Add ("Bulgarian",   "bg");
                    Translator._languageModeMap.Add ("Catalan",     "ca");
                    Translator._languageModeMap.Add ("Chinese",     "zh-CN");
                    Translator._languageModeMap.Add ("Croatian",    "hr");
                    Translator._languageModeMap.Add ("Czech",       "cs");
                    Translator._languageModeMap.Add ("Danish",      "da");
                    Translator._languageModeMap.Add ("Dutch",       "nl");
                    Translator._languageModeMap.Add ("English",     "en");
                    Translator._languageModeMap.Add ("Estonian",    "et");
                    Translator._languageModeMap.Add ("Filipino",    "tl");
                    Translator._languageModeMap.Add ("Finnish",     "fi");
                    Translator._languageModeMap.Add ("French",      "fr");
                    Translator._languageModeMap.Add ("Galician",    "gl");
                    Translator._languageModeMap.Add ("German",      "de");
                    Translator._languageModeMap.Add ("Greek",       "el");
                    Translator._languageModeMap.Add ("Haitian Creole ALPHA",    "ht");
                    Translator._languageModeMap.Add ("Hebrew",      "iw");
                    Translator._languageModeMap.Add ("Hindi",       "hi");
                    Translator._languageModeMap.Add ("Hungarian",   "hu");
                    Translator._languageModeMap.Add ("Icelandic",   "is");
                    Translator._languageModeMap.Add ("Indonesian",  "id");
                    Translator._languageModeMap.Add ("Irish",       "ga");
                    Translator._languageModeMap.Add ("Italian",     "it");
                    Translator._languageModeMap.Add ("Japanese",    "ja");
                    Translator._languageModeMap.Add ("Korean",      "ko");
                    Translator._languageModeMap.Add ("Latvian",     "lv");
                    Translator._languageModeMap.Add ("Lithuanian",  "lt");
                    Translator._languageModeMap.Add ("Macedonian",  "mk");
                    Translator._languageModeMap.Add ("Malay",       "ms");
                    Translator._languageModeMap.Add ("Maltese",     "mt");
                    Translator._languageModeMap.Add ("Norwegian",   "no");
                    Translator._languageModeMap.Add ("Persian",     "fa");
                    Translator._languageModeMap.Add ("Polish",      "pl");
                    Translator._languageModeMap.Add ("Portuguese",  "pt");
                    Translator._languageModeMap.Add ("Romanian",    "ro");
                    Translator._languageModeMap.Add ("Russian",     "ru");
                    Translator._languageModeMap.Add ("Serbian",     "sr");
                    Translator._languageModeMap.Add ("Slovak",      "sk");
                    Translator._languageModeMap.Add ("Slovenian",   "sl");
                    Translator._languageModeMap.Add ("Spanish",     "es");
                    Translator._languageModeMap.Add ("Swahili",     "sw");
                    Translator._languageModeMap.Add ("Swedish",     "sv");
                    Translator._languageModeMap.Add ("Thai",        "th");
                    Translator._languageModeMap.Add ("Turkish",     "tr");
                    Translator._languageModeMap.Add ("Ukrainian",   "uk");
                    Translator._languageModeMap.Add ("Vietnamese",  "vi");
                    Translator._languageModeMap.Add ("Welsh",       "cy");
                    Translator._languageModeMap.Add ("Yiddish",     "yi");
                }
                string mode = string.Empty;
                Translator._languageModeMap.TryGetValue (language, out mode);
                return mode;
            }
 
        #endregion
 
        #region Fields
 
            /// <summary>
            /// The language to translation mode map.
            /// </summary>
            private static Dictionary<string, string> _languageModeMap;
 
        #endregion
    }
}

 

有了上面的基础,现在想实现一个 特别简单的功能,就是简单的一个空白窗体,当enter 后显示英文的翻译

  static void Main(string[] args)
        {
            PrintAllIme();
            GT.Translator t = new GT.Translator();
            Console.WriteLine("请输入你要翻译的内容:(q键退出)");
            while ( (t.SourceText = Console.ReadLine())!="q")
            {
                t.SourceLanguage = "English";
                t.TargetLanguage = "Chinese";
                t.Translate();
                Console.WriteLine(t.Translation.Substring(0,t.Translation.Length-1)); 
            }
        }

是不是So easy?(qq1265474050)