RSSAsp.net

Code nhiều ngôn ngữ trong Javascript kết hợp sử dụng Resources

Hôm nay mình sẽ hướng dẫn các bạn cách tạo đa ngôn ngữ trong file *.js như thế nào ?


Ví dụ : ta có file hoclaptrinhweb.js với nội dung sau
 

Code (Javascript):
var strHtml = 'Xin chào';
 
alert(strHtml);

Nếu trường hợp thêm ngôn ngữ tiếng Anh và tiếng Pháp thì chúng ta làm cách nào nhĩ. Sau đây mình trình bày một cách cho các bạn tham khảo.

Bước 1 :Ta viết lại code javascript lại như sau :
 

Code (Javascript):
var strHtml = Lang['hello'];
 
alert(strHtml);

Bước 2 : Tạo 2 file Resources như sau
 

resources
 
resources_en
 
Bước 3 : Sử dụng httpHandlers để chuyển file hoclaptrinhweb.js thành hoclaptrinhweb.js.axd?lang=vi (ngôn ngữ tiếng việt) và hoclaptrinhweb.js.axd?lang=en (ngôn ngữ tiếng anh) với nội dung tương ứng như sau :
 
Code (Javascript):
var strHtml = 'Xin chào';
 
alert(strHtml);
Code (Javascript):
var strHtml = 'Hello';
 
alert(strHtml);
 
 
Bước 4 : Khai báo sử dụng httpHandlers trong web.config như sau
 
Code (text):
        <httpHandlers>
            <add verb="*" path="*.js.axd" type="ScriptTranslator"/>
        </httpHandlers>
 

Với nội dung file ScriptTranslator như sau :
 

Code (C#):
#region Using
 
using System;
using System.Web;
using System.Web.UI;
using System.IO;
using System.Text.RegularExpressions;
using System.Resources;
using System.IO.Compression;
 
#endregion
 
public class ScriptTranslator : IHttpHandler
{
    #region IHttpHandler Members
 
    /// <summary>
    /// Gets a value indicating whether another request can use the <see cref="T:System.Web.IHttpHandler"></see> instance.
    /// </summary>
    /// <returns>true if the <see cref="T:System.Web.IHttpHandler"></see> instance is reusable; otherwise, false.</returns>
    public bool IsReusable
    {
        get { return false; }
    }
 
    /// <summary>
    /// Enables processing of HTTP Web requests by a custom HttpHandler that implements
    /// the <see cref="T:System.Web.IHttpHandler"></see> interface.
    /// </summary>
    /// <param name="context">An <see cref="T:System.Web.HttpContext"></see> object that
    /// provides references to the intrinsic server objects
    /// (for example, Request, Response, Session, and Server) used to service HTTP requests.
    /// </param>
    public void ProcessRequest(HttpContext context)
    {
        string language = (context.Request.QueryString["lang"] != null)?context.Request.QueryString["lang"].ToString():"";
 
        System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(language);
 
        string relativePath = context.Request.AppRelativeCurrentExecutionFilePath.Replace(".axd", string.Empty);
        string absolutePath = context.Server.MapPath(relativePath);
        string script = ReadFile(absolutePath);
        string translated = TranslateScript(script);
 
        context.Response.Write(translated);
 
        Compress(context);
        //SetHeadersAndCache(absolutePath, context);
    }
 
    #endregion
 
    /// <summary>
    /// This will make the browser and server keep the output
    /// in its cache and thereby improve performance.
    /// </summary>
    private void SetHeadersAndCache(string file, HttpContext context)
    {
        context.Response.ContentType = "text/javascript";
        context.Response.AddFileDependency(file);
        context.Response.Cache.VaryByHeaders["Accept-Language"] = true;
        context.Response.Cache.VaryByHeaders["Accept-Encoding"] = true;
        context.Response.Cache.SetLastModifiedFromFileDependencies();
        context.Response.Cache.SetExpires(DateTime.Now.AddDays(7));
        context.Response.Cache.SetValidUntilExpires(true);
        context.Response.Cache.SetCacheability(HttpCacheability.Public);
    }
 
    #region Localization
 
    private static Regex REGEX = new Regex(@"Langs\['([^\]]*)'\]", RegexOptions.Singleline | RegexOptions.Compiled);
 
    /// <summary>
    /// Translates the text keys in the script file. The format is Translate(key).
    /// </summary>
    /// <param name="text">The text in the script file.</param>
    /// <returns>A localized version of the script</returns>
    private string TranslateScript(string text)
    {
        MatchCollection matches = REGEX.Matches(text);
        ResourceManager manager = new ResourceManager(typeof(Resources.SiteLang));
 
        foreach (Match match in matches)
        {
            object obj = manager.GetObject(match.Groups[1].Value);
            if (obj != null)
            {
                text = text.Replace(match.Value, "'" + CleanText(obj.ToString()) + "'");
            }
        }
 
        return text;
    }
 
    /// <summary>
    /// Cleans the localized script text from making invalid javascript.
    /// </summary>
    private static string CleanText(string text)
    {
        text = text.Replace("'", "\\'");
        text = text.Replace("\\", "\\\\");
 
        return text;
    }
 
    /// <summary>
    /// Reads the content of the specified file.
    /// </summary>
    private static string ReadFile(string absolutePath)
    {
        if (File.Exists(absolutePath))
        {
            using (StreamReader reader = new StreamReader(absolutePath))
            {
                return reader.ReadToEnd();
            }
        }
 
        return null;
    }
 
    #endregion
 
    #region Compression
 
    private const string GZIP = "gzip";
    private const string DEFLATE = "deflate";
 
    /// <summary>
    /// Compresses the HTTP response.
    /// </summary>
    private static void Compress(HttpContext context)
    {
        if (IsEncodingAccepted(DEFLATE, context))
        {
            context.Response.Filter = new DeflateStream(context.Response.Filter, CompressionMode.Compress);
            SetEncoding(DEFLATE, context);
        }
        else if (IsEncodingAccepted(GZIP, context))
        {
            context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
            SetEncoding(GZIP, context);
        }
    }
 
    /// <summary>
    /// Checks the request headers to see if the specified
    /// encoding is accepted by the client.
    /// </summary>
    private static bool IsEncodingAccepted(string encoding, HttpContext context)
    {
        return context.Request.Headers["Accept-encoding"] != null && context.Request.Headers["Accept-encoding"].Contains(encoding);
    }
 
    /// <summary>
    /// Adds the specified encoding to the response headers.
    /// </summary>
    private static void SetEncoding(string encoding, HttpContext context)
    {
        context.Response.AppendHeader("Content-encoding", encoding);
    }
 
    #endregion
}
 
 
demo_dangongu

 

Download LangUseJavaScript.rar

Tags:

Nếu bạn thấy bài viết hữu ích, hãy nhấn +1 và các liên kết chia sẻ để website ngày càng phát triển hơn. Xin cám ơn bạn!

Nếu là khách, bạn phải đăng ký tài khoản và kích hoạt tài khoản để bình luận được hiển thị ở đây.
Thông tin kích hoạt gửi đến mail của bạn.

Tin mới hơn

Tin cũ hơn

Lên trên đầu