C# - Többnyelvű web site készítése

forráskód letöltése
Ha olyan web site-ot kell létrehoznunk, mely nem csak egy nyelven jelenik meg, akkor célszerű megismerkednünk az ASP.NET nyelvi támogatást biztosító eszközeivel, hogy gyorsan, hatékonyan elkészíthessük feladatunkat.
Mellékelt példában egy olyan web oldalt készítünk, melynél egy listából választható ki, hogy milyen nyelvű feliratok jelenjenek meg az oldalon.
A megoldáshoz speciális erőforrás állományokat hozunk létre, melyek tartalmazzák a megjelenítendő szövegeinket minden olyan nyelven, melyre szükségünk van az adott munkához. Mellékelt példában angol és német nyelvű felirat jeleníthető meg. Ezek közül kijelölhető az egyik alapértelmezettnek, így ha egy olyan nyelv kerülne választásra, melyet rendszerünk nem támogat (mint a példánkban a japán), akkor ez az alapértelmezett nyelv kerül felhasználásra.
Nézzük, miként készül az erőforrás állomány (mellékelt példában ez a RES nevű mappában található). Hozzunk létre egy szöveges állományt, melynek formátuma egyezik a régi INI állományok formátumával:
[strings]
data1=The Malomvolgy recreational area...
Fontos, hogy a strings szekció alatt helyezzük el adatainkat. Az egyes szövegek megnevezése és tartalma tetszőleges lehet. Mellékelt példánkban data1-nek nevezzük el azt az egyetlen sztringet, melyet felhasználunk két nyelven a web oldalunkon.
Miután készen vagyunk a szöveggel, mentsük el az állományt a Data.en.txt néven. Az „en” utal arra, hogy ebben az állományban az angol nyelvű szöveg található.
Ehhez hasonlóan készítsünk egy német verziót is:
[strings]
data1=Einige Kilometern weit...
Ezt Data.de.txt nevű állományba mentsük.
Indítsuk most el a Visual Studio.NET-hez adott Command Prompt-ot (Start menü - ...). Szükségünk lesz a ResGen.exe nevű segédprogramra, mely a szöveges erőforrás állományokból bináris állományokat készít.
A ResGen.exe-nek elegendő egyetlen paramétert megadnunk: annak az állománynak a nevét, amelyiket le szeretnénk fordítani:
  resgen Data.en.txt
Ebből létrejön egy Data.en.resources nevű állomány, melyre a webes alkalmazásunknak szüksége lesz. Ugyanígy elkészítjük a Data.de.resources állományt is.
Nem foglalkoztunk még az alapértelmezett nyelv erőforrásával. Ehhez szükségünk lesz egy Data.resouces állományra. Mivel ennek nevében nem szerepel nyelvi azonosító, így minden olyan esetben ez kerül majd felhasználásra, amikor egy olyan nyelv igénye merülne fel, amelyhez nincs megfelelő erőforrás állomány.
Ha nem rendelkezünk ilyen alapértelmezett állománnyal, de a rendszerünknek szüksége lenne rá, akkor az alábbi hibaüzenet fogad majd bennünket:
Could not find any resources appropriate for the specified culture (or the neutral culture) on disk. baseName: Data locationInfo: <null> fileName: Data.resources
A Data.resouces állomány elkészítését is rábízhatnánk a ResGen programra, de általában az alapértelmezett nyelv egy olyan nyelv lesz, amelyhez már amúgy is van erőforrás állományunk, így van egy egyszerűbb megoldás is. Mellékelt példában az angol nyelvet választottuk alapértelmezettnek. Mivel ehhez adott egy data.en.resources állomány, így ezt másoljuk le és nevezzük át data.resources-re és már készen is vagyunk.
Ha már futtattuk webes alkalmazásunkat és módosítjuk az erőforrásokat, akkor nem tudjuk azokat újra fordítani, mivel alkalmazásunk leállása után is használatban maradnak. Ezt a problémát megoldhatjuk, ha a WWW Publishing Service-t újraindítjuk.
Az erőforrás állományok most már adottak, nézzük miként használhatjuk fel azokat.
Létrehozunk egy webes alkalmazást a szokásos módon. A web lapon elhelyezünk egy Label-t, melyen a ComboBox-ban választott nyelven szeretnénk majd megjeleníteni a feliratot, mely az erőforrás állományból származik.
Ehhez szükségünk lesz egy erőforrás kezelőre. Ehhez a ResourceManager osztály CreateFileBasedResourceManager függvényét hívjuk, melynek paraméterként átadjuk annak a könyvtárnak az elérési útvonalát, melyben a *.resource erőforrásaink vannak.
    private void Page_Load(object sender, System.EventArgs e)
    { 
      rm = ResourceManager.CreateFileBasedResourceManager("Data", Server.MapPath("res") + "\\", null);
A ComboBox elemeit úgy vettük fel, hogy mindegyikhez hozzárendeltük a számunkra szüksége nyelvi azonosító kódot, mint például az en-US, de-DE, ja-JP. Így amikor kiválasztásra kerül valamely elem, az alkalmazásunkban rögtön át tudunk váltani a megfelelő nyelvre, felhasználva a kiválasztott elemet.
      Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(DropDownList1.SelectedItem.Value);
      Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
Ezek után az erőforrás kezelőnk már tudni fogja, hogy milyen nyelvű erőforrást kell használnia. A GetString függvény képes rá, hogy a bináris erőforrás állományból kiolvasson egy szöveget. Hogy melyik szövegről van szó, azt paraméterként kell megadnunk a függvénynek. Az itt megadott név a TXT állományban használt név lesz, mellyel azonosíthatjuk az eltárolt szövegeinket.
      Label1.Text = rm.GetString("data1");
    }