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:

  1. Vytvoríme nový projekt. Potrebujeme ho rozchodiť pod IIS, čo je predpokladom na to, aby sme niečo potestovali aj u seba.

  2. 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)

  3. 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.

  4. 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.Nastavenie virtual directories v IIS

  5. 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).


  6. Pridáme App_Code a App_LocalResources folder(right click nad projektom a Add ASP .NET Folder)

  7. 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.


  8. 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.
    Resource files vo visual web developer
  9. 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.

  10. 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);
        }
    }
    
  11. 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 
    {
    }
  12. Done. Možeme testovať.

Komentáre

# skippo said:

Tomas, skvely clanocek, ako sme si uz zvykli :-) Len tak dalej.

Thursday, October 18, 2007 1:13 PM
# T said:

Vdaka Skippo...

Friday, October 19, 2007 9:21 PM
Prihlásiť | Registrovať | Pomoc