系统自动翻译实现

来源:互联网 发布:windows10修改mac地址 编辑:程序博客网 时间:2024/04/27 15:22

通过在Global.asax 全局配置里 实现 PreRequestHandlerExecute ,然后通过不同的URL和 CONCENT配置来判断是否需要翻译。

 

注:长的语句优先放在前台处理。

 

 

 

 

在Global.asax里添加以下代码

 

void Application_PreRequestHandlerExecute(object sender, EventArgs e)
  {
   if (Language.ToLower() == "english")
   {
    if(Session["LoginUserAccount"]!=null)
    {
     if(Session["LoginUserAccount"].ToString() == "cqad")
     {
      HttpContext _context = HttpContext.Current;
      string _rawUrl = _context.Request.RawUrl;
      bool _isTranslate = false;
      ArrayList _urlList = MultiLangStream.GetTranslateURL();
      foreach(string _url in _urlList)
      {
       if(_rawUrl.ToLower().IndexOf(_url) >= 0)
       {
        _isTranslate = true;
        break;
       }
      }
      if(_isTranslate)
       Response.Filter = new MultiLangStream(Response.Filter);
     }
    }
   }
  }

 

 

 

public class MultiLangStream : Stream
 {
  private static string  TransConfigPath = AppDomain.CurrentDomain.BaseDirectory.Replace("/",@"/") + @"LangConfig/TransContent.xml";
  private static string  TransUrlPath =  AppDomain.CurrentDomain.BaseDirectory.Replace("/",@"/") + @"LangConfig/TransUrl.xml";
  private string _rawUrl = "";
  private Stream _multiStream;
  private long lngPosition;
  public MultiLangStream(Stream _stream)
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
   this._multiStream = _stream;
  }

#region 重载方法
  public override bool CanRead
  {
   get { return true; }
  }

  public override bool CanSeek
  {
   get { return true; }
  }

  public override bool CanWrite
  {
   get { return true; }
  }

  public override long Length
  {
   get { return 0; }
  }

  public override long Position
  {
   get { return lngPosition; }
   set { lngPosition = value; }
  }

  public override long Seek(long offset, System.IO.SeekOrigin direction)
  {
   return _multiStream.Seek(offset, direction);
  }

  public override void SetLength(long length)
  {
   _multiStream.SetLength(length);
  }

  public override void Close()
  {
   _multiStream.Close();
  }

  public override void Flush()
  {
   _multiStream.Flush();
  }

  public override int Read(byte[] buffer, int offset, int count)
  {
   return _multiStream.Read(buffer, offset, count);
  }

#endregion
  
  public override void Write(byte[] buffer, int offset, int count)
  {
   byte[] data = new byte[count];
//   ArrayList _urlList = this.GetTranslateURL();
//   bool _isTranslate = false;
//   foreach(string _url in _urlList)
//   {
//    if(_rawUrl.IndexOf(_url) >= 0)
//    {
//     _isTranslate = true;
//     break;
//    }
//   }
//   if(!_isTranslate)
//   {
//    _multiStream.Write(data,0,data.Length);
//    return;
//   }
   Buffer.BlockCopy(buffer, offset, data, 0, count);
   string inputstring = Encoding.UTF8.GetString(data);
   string patten = "([/u3000-/u9fff])([/u3000-/u9fff]|//s| |[a-zA-Z0-9]|!|,|。|?|;|“|”|(|))*";
   inputstring = Regex.Replace(inputstring,patten, new MatchEvaluator(CaptureText));
   byte [] newData = Encoding.GetEncoding("utf-8").GetBytes(inputstring);
   _multiStream.Write(newData,0,newData.Length);
  }

  private string CaptureText(Match m)
  {
   string _value = m.Value.Trim().Replace(" ","");
   Hashtable _table = GetTranslateTable();
   foreach(string key in _table.Keys)
   {
    if (key == _value)
    {
     _value = _table[key].ToString();
     return _value;
    }
   }
   return _value;
  }

  /// <summary>
  /// 获取翻译列表
  /// </summary>
  /// <returns></returns>
  private Hashtable GetTranslateTable()
  {
   HttpContext _context = HttpContext.Current;
   Hashtable _translateTable = new Hashtable();
   string _key = "TRANSLATECONTENT";
   if(_context.Cache["TRANSLATECONTENT"] == null)
   {
    XmlDocument _xmlDoc = new XmlDocument();
    _xmlDoc.Load(TransConfigPath);
    XmlNode _rootNode = _xmlDoc.SelectSingleNode("Pairs");
    foreach(XmlNode _childNode in _rootNode.ChildNodes)
    {
     if (_childNode.ChildNodes.Count < 2)
      continue;
     string _source = _childNode.ChildNodes[0].InnerText.Trim();
     string _dest = _childNode.ChildNodes[1].InnerText.Trim();
     if (!_translateTable.ContainsKey(_source))
     {
      _translateTable.Add(_source, _dest);
     }
    }
    _context.Cache.Add(_key,_translateTable,new CacheDependency(TransConfigPath),DateTime.MaxValue,TimeSpan.Zero,CacheItemPriority.Normal,null);
   }
   else
   {
    _translateTable = (Hashtable)_context.Cache[_key];
   }
   return _translateTable;
  }
  
  /// <summary>
  /// 获取需要翻译的URL
  /// </summary>
  /// <returns></returns>
  public static ArrayList GetTranslateURL()
  {
   HttpContext _context = HttpContext.Current;
   ArrayList _urlList = new ArrayList();
   string _key = "TRANSLATEURL";
   if(_context.Cache["TRANSLATEURL"] == null)
   {
    XmlDocument _xmlDoc = new XmlDocument();
    _xmlDoc.Load(TransUrlPath);
    XmlNode _rootNode = _xmlDoc.SelectSingleNode("Urls");
    foreach(XmlNode _childNode in _rootNode.ChildNodes)
    {
     string _url = _childNode.InnerText.Trim().ToLower();
     if (!_urlList.Contains(_url))
     {
      _urlList.Add(_url);
     }
    }
    _context.Cache.Add(_key,_urlList,new CacheDependency(TransUrlPath),DateTime.MaxValue,TimeSpan.Zero,CacheItemPriority.Normal,null);
   }
   else
   {
    _urlList = (ArrayList)_context.Cache[_key];
   }
   return _urlList;
  }
 }

 

 

 

原创粉丝点击