通过在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;
}
}