Introduction
There are a lot of articles talking about ASP.NET localization. This article is not going to give you an in-depth look of ASP.NET localization. Instead, it will give you a quick reference about localization of commonly used contents on an ASP.NET page including ASP.NET server controls, HTML content, SiteMap, and other resources.
Contents
Using the code
ASP.NET server control localization is the easiest of all. Once you add a server control to your page, you can simply switch your page to “Design” mode and then go to the menu “Tools”->“Generate Local Resource”.
It will generate a resource string for each ASP.NET server control on the page. In this example, a file with the name Default.aspx.resx is created. It contains all the resource name/value pairs for our Default.aspx page.
Switch back to the source pane, and you will see it has added some code like the following in your HTML:
<asp:Button ID="Button1" runat="server" Text="Hello"
meta:resourcekey="Button1Resource1" />
You can then copy/paste that to create a resource file for another culture. For example, you may create a Default.aspx.fr.resx for French users.
The following screenshot is when the language is set to English in Internet Explorer.
Change the language to French by going to Internet Explorer->Tools->Internet Options->Languages.
Here is the French version page:
To localize regular HTML content, you can use the <asp:Localize>
control. Let’s use an example to explain it.
You have a header and a paragraph in your page.
<h1>Localization Page Header</h1>
<p>This is a demo page to show you how to do localization in ASP.NET</p>
To localize it, you need to add <asp:Localize>
to them.
<h1><asp:Localize ID="Header" runat="server">Localization Page Header</asp:Localize></h1>
<p><asp:Localize ID="Localize1" runat="server">This is a demo
page to show you how to do localization in ASP.NET</asp:Localize></p>
Then, you may manually create a resource file and add meta:resourcekey="HeaderResource1”
to your page. Or, you can take advantage of Visual Studio to automatically generate it. Switch your page to “Design” mode. Go to the menu “Tools”->“Generate Local Resource”.
It will generate the following code and the resource file (i.e., yourfile.aspx.resx) for you.
Here is the code it changed:
<h1><asp:Localize ID="Header" runat="server"
meta:resourcekey="HeaderResource1"
Text="Localization Page Header"></asp:Localize></h1>
<p><asp:Localize ID="Localize1" runat="server"
meta:resourcekey="Localize1Resource1" Text="This is a demo page to show you
how to do localization in ASP.NET"></asp:Localize></p>
The rest of the steps are the same as how you would localize an ASP.NET server control.
This article will give you more details on SiteMap localization.
- Enable site map localization by adding
enableLocalization="true"
to the site map file, for example: the Web.sitemap file.
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0"
enableLocalization="true">
- Change the value of the property that you want to localize to a resource string in
siteMapNode
using this format: “$resources:ClassName,KeyName,DefaultValue”.
<siteMapNode url="Default.aspx"
title="$resources:SiteMapLocalizations,HomePageTitle"
description="$resources:SiteMapLocalizations,HomePageDescription">
- Add a global resource folder and files. Right click the web site in Solution Explorer. Click on “Add ASP.NET folder”. Click on “Add App_GlobalResources” from the sub-menu. It will add an “App_GlobalResources” folder to your root directory.
Then, add a resource file, for example, SiteMapLocalizations.resx. In the file, you will have a name/value pair for each of the resource strings. For example:
Name Value
HomePageTitle Home
- Create a resource file for each culture you may have. For example, you may have a file called SiteMapLocalizations.fr.resx for French.
Below are the screenshots of the menus in English and French:
Sometimes you may need to display a string, for example, an error message at runtime. You will need to localize it programmatically. Here is how to do it:
- Add a resource file under the App_GlobalResources folder. In this example, we add a file called “CommonResource.resx” and a French version “CommonResource.fr.resx”.
- Thanks Alexander Nesterenko for his comments. There are a lot of other and better ways to get the resource string.
"You should get resources from ~\App_GlobalResources\MyMessages.resx by:
- Generated code wrapper -
string message = Resources.MyMessages.Hello;
- Resource expression -
<asp:Label Text="<%$ Resources: MyMessages, Hello %>" />
- Method
GetGlobalResourceObject
-
string message = GetGlobalResourceObject("MyMessages", "Hello");
You should get resources from ~\App_LocalResources\default.aspx.resx by:
- Resource expression -
<asp:Label Text="<%$ Resources: Hello %>" />
- meta:resourceKey -
<asp:Label meta:resourceKey="labelResourceKey" />
- Method GetLocalResourceObject -
string message = GetLocalResourceObject("Hello"); "
Here are the screenshots:
In the sample code, we added two LinkButton
s. When you click on “English”, the page will switch to English culture; click on “Français”, it will switch to French. To detect which link button is clicked, we use Request.Form[“__EventTarget”]
. It works, but probably not in the best way.
We override the “InitializeCulture
” method of the page so it will display the correct culture based on the selection we made.
HTML code:
<asp:LinkButton ID="LanguageEnglish" Text="English" runat="server"></asp:LinkButton>
<asp:LinkButton ID="LanguageFrench" Text="Français" runat="server"></asp:LinkButton>
ASP.NET code:
protected override void InitializeCulture()
{
string language = Request.Form["__EventTarget"];
string languageId = "";
if (!string.IsNullOrEmpty(language))
{
if (language.EndsWith("French"))
languageId = "fr-FR";
else languageId = "en-US";
Thread.CurrentThread.CurrentCulture =
CultureInfo.CreateSpecificCulture(languageId);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(languageId);
}
base.InitializeCulture();
}
This works for everything except the menu. If you have a menu using a SiteMap in your page, you may need to call menu.DataBind()
in the Page_Load
event or set EnableViewState
to false
. Otherwise, your menu will still show the previous culture string while other contents change to the new culture.
When we dynamically change the culture, most likely, we need to store it somewhere so it won’t get lost when we jump from page to page. In the sample application, we use Session to do that.
Happy programming!