|
|||||||||||||||||||||||
|
|||||||||||||||||||||||
|
Announcements
Chapters
Services
Feature Zones
|
Note: This is an unedited contribution. If this article is inappropriate,
needs attention or copies someone else's work without reference then please
Report This Article
IntroductionThis 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 KnowledgeI assume that the readers are familiar with: How it worksThe 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 codeAll the important code is located into the
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);
}
ConfigurationYou 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). 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 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 developmentThere 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.
|
||||||||||||||||||||||