Change English numbers to Persian and vice versa in MVC (httpmodule)?

别来无恙 提交于 2019-12-08 09:48:46

问题


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.


回答1:


I believe that its not useful to employ HttpModules here. General usage of HttpModules can be found at MSDN. Instead, Suggest you to use Globalization, Internationalization and Localization methods. it will be more simpler and efficient to solve the problem. Note that you must use Persian encoded fonts to show expected result.



来源:https://stackoverflow.com/questions/13709718/change-english-numbers-to-persian-and-vice-versa-in-mvc-httpmodule

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!