Lokalizácia stránky v závislosti od jazyka, ktorý je súčasťou cesty v URL (www.domena.sk/en)
Možno chcete dosianuť správanie, kedy sa nastaví localizácia v závislosti od URL, teda napr. www.domena.sk/en alebo www.domena.sk/sk bude determinovať mutáciu. Postup je jednoduchý. Napíšem presný postup pre Visual Web Developera.
Postup:
- Vytvoríme nový projekt. Potrebujeme ho rozchodiť pod IIS, čo je predpokladom na to, aby sme niečo potestovali aj u seba.
- Spustíme MMC snap-in Internet Information Services. (Control Panel / Administrative Tools / Internet Information Services alebo rýchlejšie Run / naťapkáme mmc, potom ctrl-m, alt-d a vyberieme Internet Information Services)
- Vytvoríme virtuálny folder pre našu aplikáciu. Rozbalíme až po Default Web Site. Right click na ňom a Add / Virtual directory. Alias je meno nášho webíku (napr. localization). Directory je fyzická cesta na ktorú bude mapované dané virtual directory, čiže root folder nášho projektu (napr. d:\projects\lokalizacia). Ak ho chceme rýchlo nájsť, stačí kliknúť na root projektu vo VWD a zobraziť si Properties panel. Next a Finish.
- Postup zopakujeme a vytovríme en a sk virtualne directories, ale pod nami práve vytvoreným virtuálnym rootom aplikácie. Namapujeme oba však rovnako na fyzický root našej aplikácie (napr. d:\projects\lokalizacia). Done.

- Na projekte right click a zvolíme Property Pages. Následne v strome Start Options. V Start options nastavíme Use custom server, so zamýšlaným url nášej aplikácie (napr. http://localhost/Localization).
- Pridáme App_Code a App_LocalResources folder(right click nad projektom a Add ASP .NET Folder)
- Do App_LocalResources foldera pridáme dva resource files (right click / Add New Item ... / Resource file), ktoré nazveme Default.aspx.resx a Default.aspx.sk.resx.
- Otvoríme ich. Pridáme nami zamýšľané reťazce na lokalizáciu. Do Default.aspx.resx, čo bude resx pre defaultný jazyk a pridáme napr. Name: lblWelcome a Value: Welcome!
Do slovenskej verzie zase Name: lblWelcome a Value: Vitajte!. Done, situácia by mala vyzerať takto.

- Otvoríme Default.aspx stránku. Pridáme asp:Label control s lokalizovanou Text property
<%@ Page
Language="C#"
AutoEventWireup="true"
CodeFile="Default.aspx.cs"
Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label runat="server" Text="<%$Resources:,lblWelcome%>"/>
</div>
</form>
</body>
</html>
V designery by sa nám mal zobraziť zlokalizovaný text.
-
Do App_Code foldra pridáme kód našej bázovej stránky, v ktorom nastavíme culture v závislosti od Url. Na výber potom máme, ako sa to zaspráva v prípade, že žiadnu konkrétnu nenájdeme. Odporúčam volať base.InitializeCulture(). Defaultne sa použije culture na základe hlavičky, ktorú môže posielať prehliadač, prípadne môžeme zmeniť toto správanie cez web.config nastavením na globalization elemente - z defaultného automatického detekovania ako sme si povedali, culture a uiculture atribút nastaviť na konkrétnu culture.
Tento kód sa dá napísať aj lepšie. Možeme si index segmentu s jazykom uložiť do web.configu, alebo ifnúť cez #if DEBUG podmienkovú compilačnú direktívu. Zoznam povolených culture možeme tak isto uložiť do webConfigu a validovať voči nim, alebo to urobiť nepekne, pokúsiť sa vytvoriť kultúru a ignorovať exception. Ak náhodou skúsi niekto validnú culture, ale mimo rozsahu nami podporovaných, pri vyhľadávaní resources to prepadne až na ten defaulný, ktorý je v našom prípade anglický, takže pohoda.
using System;
using System.Web;
using System.Web.UI;
using System.Globalization;
using System.Threading;
public class PageBase : Page
{
protected override void InitializeCulture()
{
int langSegment= 2;
if(Request.Url.Segments.Length > langSegment)
{
string lang= Request.Url.Segments[langSegment].Replace("/", "");
if (lang == "sk" || lang == "en")
{
SetCulture(lang);
return;
}
}
base.InitializeCulture();
}
protected void SetCulture(string name)
{
Thread.CurrentThread.CurrentCulture =
Thread.CurrentThread.CurrentUICulture =
CultureInfo.CreateSpecificCulture(name);
}
}
- Posledná drobnosť na záver, musíme nechať našu Default stránku(a každú, ktorá sa má takto správať) dediť z našej PageBase a nie z Page triedy. Editneme code behind.
public partial class _Default : PageBase
{
}
- Done. Možeme testovať.