Click here to Skip to main content
6,595,854 members and growing! (17,385 online)
Email Password   helpLost your password?
Web Development » ASP.NET » General     Intermediate License: The GNU General Public License (GPL)

Localization of static web files

By Anton Bar

Use HttpHandler for localization of static HTML, XML, Java Script, CSS files
Windows, .NET, ASP.NET, Visual Studio, Dev
Posted:11 Nov 2006
Views:14,777
Bookmarked:16 times
Unedited contribution
Announcements
Loading...
 
Search    
Advanced Search
Add to IE Search
printPrint   add Share
      Discuss Discuss   Broken Article?Report  
6 votes for this article.
Popularity: 3.35 Rating: 4.31 out of 5

1
1 vote, 16.7%
2
1 vote, 16.7%
3
1 vote, 16.7%
4
3 votes, 50.0%
5

LocalizationHandler

Introduction

This article shows a simple solution for localization of static files such as HTML, XML Java Script, or CSS, using the standard ASP.NET global resources. I was looking for a technique that will allow me using <%$ Resources:Resfile, KeyName %> syntax in all kinds of files. I also wanted all the resources to be concentrated into a single file in order to avoid duplicate entries and to simplify the translation process.

Required Knowledge 

I assume that the readers are familiar with:

  1. ASP.NET global resources
  2. ASP.NET caching
  3. .NET HTTP handlers
  4. Regular Expressions

How it works

The idea is simple - static files that need to be localized will be served by a special HTTP Handler. The handler will read the static files and replace all resource keys by their values as specified in your .resource file. The parsed files will be stored in ASP.NET cache and updated every time you change them.

Consider the following HTML code:

<html dir="<%$ Resources:Resource, direction %>">
<body>
<h1><%$ Resources:Resource, title %></h1>
</body>
</html> 

In this example, the HTTP handler will replace direction and title resources by their values from Resource.resources file.

At this point I suggest to download the enclosed sources and examine the code in LocalizationManager\LocalizationHandler.cs.

The code

All the important code is located into the ProcessRequest method, and the workflow is very simple:

  1. Check whether the requested file already exists in the cache.
  2. If not, read the file (HTML, JS, CSS, XML etc.)
  3. Create ResourceManager for the required resource file if it wasn't created yet
  4. Replace all resource keys by their values.
  5. Store the result in the cache depending on the input file
  6. Return the result.
public void ProcessRequest(HttpContext context)
{
	if (m_appPath == null)
		m_appPath = context.Server.MapPath(".");

	// Check whether the requested file was already parsed

	string filePath = context.Request.Url.LocalPath;
	string fileId = filePath + "." + Thread.CurrentThread.CurrentCulture.Name;
	string buffer = (string)context.Cache.Get(fileId);

	// Set the correct Content Type

	HttpResponse response = context.Response;
	response.ContentType = GetContentType(filePath);

	if (buffer == null)
	{
		// If not, read the required file into a string buffer

		string fullPath = context.Server.MapPath(filePath);
		buffer = ReadFile(fullPath);

		// Replace resource place holders by their values

		buffer = ParseBuffer(buffer, context);

		// Store the result in cache for future requests, the cache will 

		// expire when the processed Java Script file will be changed

		CacheDependency dependency = new CacheDependency(fullPath);
		context.Cache.Insert(fileId, buffer, dependency);
	}

	response.Write(buffer);
}

Configuration

You will need to configure your web application as following:

Step 1 - Configure IIS

In IIS console, open properties of your web application and click on the Configure button. Under Mappings, add a new one that maps your static files (e.g. ".html", ".js", ".css" etc.) to the ASP.NET ISAPI engine (usually c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll).  

Sample screenshot

Note: On Windows XP you will probably notice this very annoying bug - in order to enable the OK button, you will need to enter the file extension with preceding dot (like this: ".js") and click on the Executable edit box to expand the path (eliminating the ellipsis).

Step 2 - Configure HTTP Handler

In your web.config file add our HTTP handler:

<system.web>
  <httpHandlers>
    <add verb="*" path="*.js" type="LocalizationManager.LocalizationHandler, LocalizationManager"/>
    <add verb="*" path="*.htm" type="LocalizationManager.LocalizationHandler, LocalizationManager"/>
    <add verb="*" path="*.css" type="LocalizationManager.LocalizationHandler, LocalizationManager"/>
  </httpHandlers>
...

Step 3 - Configure Globalization

Add <globalization culture="auto" /> tag to your web.config file. This will ensure a correct value of Thread.CurrentThread.CurrentCulture in all requests, including requests to static files. Otherwise it always will be default (e.g. en-US).

Step 4 - Copy the Handler

Make sure that LocalizationHandler.dll is located under the Bin directory of your application.

That's it, now everything should work.

Further development

There are several improvements I planned to do in the near future including automatic invalidation of all cached files when the Resource file is changed. I will be more than happy to know if there are any other improvements that you would like to see in this tiny project.

 

License

This article, along with any associated source code and files, is licensed under The GNU General Public License (GPL)

About the Author

Anton Bar


Member
Anton Bar has over 15 years of experience in software development, and over 10 years experience in building high-performance distributed software systems.

Anton is a long time contributor to MOSIX, a free distributed operating system based on Linux.

During the early 90’s, Anton founded start-up developing software for the optimization of networking over satellite lines, later acquired by ViaSat, Inc. Anton also served as CTO for CDIS, an enterprise content management company.

In the past years, Anton spoke and was well received at several conferences in US, Russia and Kazakhstan.

Anton holds a Masters degree in computer science from the Hebrew University of Jerusalem, Israel.
Occupation: Chief Technology Officer
Location: Israel Israel

Other popular ASP.NET articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 3 of 3 (Total in Forum: 3) (Refresh)FirstPrevNext
GeneralPerformance hit Pinmemberkiran.dhamane0:52 5 Jan '09  
GeneralRe: Performance hit Pinmembermbaocha18:37 6 May '09  
GeneralBest Localization Plug-in for Visual Studio. PinmemberAlexander Nesterenko22:36 17 Dec '08  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 11 Nov 2006
Editor:
Copyright 2006 by Anton Bar
Everything else Copyright © CodeProject, 1999-2009
Web17 | Advertise on the Code Project