Change English numbers to Persian and vice versa in MVC (httpmodule)?
Posted
by
Mohammad
on Stack Overflow
See other posts from Stack Overflow
or by Mohammad
Published on 2012-12-04T18:41:43Z
Indexed on
2012/12/09
5:05 UTC
Read the original article
Hit count: 202
I wanna change all English numbers to Persian for showing to users. and change them to English numbers again for giving all requests (Postbacks)
e.g:
we have something like this in view IRQ170
, I wanna show IRQ???
to users and give IRQ170
from users.
I know, I have to use Httpmodule
, But I don't know how ?
Could you please guide me?
Edit :
Let me describe more :
I've written the following http module :
using System;
using System.Collections.Specialized;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.UI;
using Smartiz.Common;
namespace Smartiz.UI.Classes
{
public class PersianNumberModule : IHttpModule
{
private StreamWatcher _watcher;
#region Implementation of IHttpModule
/// <summary>
/// Initializes a module and prepares it to handle requests.
/// </summary>
/// <param name="context">An <see cref="T:System.Web.HttpApplication"/> that provides access to the methods, properties, and events common to all application objects within an ASP.NET application </param>
public void Init(HttpApplication context)
{
context.BeginRequest += ContextBeginRequest;
context.EndRequest += ContextEndRequest;
}
/// <summary>
/// Disposes of the resources (other than memory) used by the module that implements <see cref="T:System.Web.IHttpModule"/>.
/// </summary>
public void Dispose()
{
}
#endregion
private void ContextBeginRequest(object sender, EventArgs e)
{
HttpApplication context = sender as HttpApplication;
if (context == null) return;
_watcher = new StreamWatcher(context.Response.Filter);
context.Response.Filter = _watcher;
}
private void ContextEndRequest(object sender, EventArgs e)
{
HttpApplication context = sender as HttpApplication;
if (context == null) return;
_watcher = new StreamWatcher(context.Response.Filter);
context.Response.Filter = _watcher;
}
}
public class StreamWatcher : Stream
{
private readonly Stream _stream;
private readonly MemoryStream _memoryStream = new MemoryStream();
public StreamWatcher(Stream stream)
{
_stream = stream;
}
public override void Flush()
{
_stream.Flush();
}
public override int Read(byte[] buffer, int offset, int count)
{
int bytesRead = _stream.Read(buffer, offset, count);
string orgContent = Encoding.UTF8.GetString(buffer, offset, bytesRead);
string newContent = orgContent.ToEnglishNumber();
int newByteCountLength = Encoding.UTF8.GetByteCount(newContent);
Encoding.UTF8.GetBytes(newContent, 0, Encoding.UTF8.GetByteCount(newContent), buffer, 0);
return newByteCountLength;
}
public override void Write(byte[] buffer, int offset, int count)
{
string strBuffer = Encoding.UTF8.GetString(buffer, offset, count);
MatchCollection htmlAttributes = Regex.Matches(strBuffer, @"(\S+)=[""']?((?:.(?![""']?\s+(?:\S+)=|[>""']))+.)[""']?", RegexOptions.IgnoreCase | RegexOptions.Multiline);
foreach (Match match in htmlAttributes)
{
strBuffer = strBuffer.Replace(match.Value, match.Value.ToEnglishNumber());
}
MatchCollection scripts = Regex.Matches(strBuffer, "<script[^>]*>(.*?)</script>", RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace);
foreach (Match match in scripts)
{
MatchCollection values = Regex.Matches(match.Value, @"([""'])(?:(?=(\\?))\2.)*?\1", RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace);
foreach (Match stringValue in values)
{
strBuffer = strBuffer.Replace(stringValue.Value, stringValue.Value.ToEnglishNumber());
}
}
MatchCollection styles = Regex.Matches(strBuffer, "<style[^>]*>(.*?)</style>", RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace);
foreach (Match match in styles)
{
strBuffer = strBuffer.Replace(match.Value, match.Value.ToEnglishNumber());
}
byte[] data = Encoding.UTF8.GetBytes(strBuffer);
_memoryStream.Write(data, offset, count);
_stream.Write(data, offset, count);
}
public override string ToString()
{
return Encoding.UTF8.GetString(_memoryStream.ToArray());
}
#region Rest of the overrides
public override bool CanRead
{
get { throw new NotImplementedException(); }
}
public override bool CanSeek
{
get { throw new NotImplementedException(); }
}
public override bool CanWrite
{
get { throw new NotImplementedException(); }
}
public override long Seek(long offset, SeekOrigin origin)
{
throw new NotImplementedException();
}
public override void SetLength(long value)
{
throw new NotImplementedException();
}
public override long Length
{
get { throw new NotImplementedException(); }
}
public override long Position
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
#endregion
}
}
It works well, but It converts all numbers in css and scripts files to Persian and it causes error.
© Stack Overflow or respective owner