SignalR on tehokas työkalu, joka mahdollistaa reaaliaikaisen viestinnän verkkosivustojen ja -sovellusten välillä. Sen avulla voidaan luoda dynaamisia sovelluksia, jotka voivat välittää tietoa heti, kun tapahtuma tapahtuu. Tämä tekee siitä erinomaisen valinnan esimerkiksi chattien, pelien ja muiden reaaliaikaisten palveluiden luomiseen. Tässä käsitellään, kuinka SignalR:n avulla voidaan luoda chat-toiminto verkkosivulle.
Ensimmäinen askel SignalR-asiakaskirjaston käyttöönottoon on sen lisääminen projektiin. Tämä voidaan tehdä käyttämällä Library Manager CLI -työkalua. Asenna työkalu seuraavalla komennolla:
Jos työkalu on jo asennettu, voit päivittää sen uusimpaan versioon:
Kun työkalu on asennettu, SignalR-kirjastot voidaan ladata ja asentaa projektiin seuraavalla komennolla:
Tämän jälkeen Visual Studio 2022 tarjoaa myös graafisen käyttöliittymän, jonka avulla asiakaskirjastojen lisääminen onnistuu helposti. Voit oikealla hiirenpainikkeella valita projektin ja valita vaihtoehdon "Add | Client Side Libraries", jolloin SignalR lisätään ilman komentorivikäskyjä.
Seuraavaksi voidaan lisätä chat-toiminto verkkosivustolle. Muokkaa Index.cshtml-tiedostoa seuraavasti:
Tässä on kolme pääosaa:
-
Register User -osio, jossa käyttäjä voi syöttää nimensä ja ryhmät, joihin hän haluaa liittyä. Rekisteröitymisen jälkeen hän voi lähettää viestejä.
-
Send Message -osio, jossa käyttäjä voi valita viestin lähettäjän, vastaanottajan ja viestin sisällön.
-
Messages received -osio, jossa vastaanotetut viestit näkyvät luettelona.
Seuraavaksi lisätään JavaScript-tiedosto chat.js, joka hoitaa SignalR-yhteyden ja viestien lähettämisen:
Tässä skriptissä luodaan SignalR-yhteys /chat-reittiin, ja käyttäjän syöttämä nimi ja ryhmätiedot lähetetään palvelimelle rekisteröitymistä varten. Viestien lähettämiseen käytetään SendMessage-metodia, ja vastaanotetut viestit lisätään verkkosivulle.
Kun chat-toiminto on valmis, voidaan kokeilla viestien lähettämistä useiden käyttäjien välillä. SignalR huolehtii viestien välittämisestä reaaliaikaisesti kaikille yhteyden muodostaneille asiakkaille.
Chat-sovelluksen testauksen yhteydessä on tärkeää huomioida, että SignalR mahdollistaa viestien lähettämisen useille käyttäjille samanaikaisesti ilman tarvetta ladata sivua uudelleen. Tämä tekee sovelluksesta erittäin käyttäjäystävällisen ja interaktiivisen. Viestien perillemeno ja vastaanotto tapahtuvat suoraan ilman viiveitä, mikä on ratkaisevan tärkeää reaaliaikaisissa sovelluksissa.
Jos haluat, että chat-toiminto toimii kunnolla, sinun tulee varmistaa, että SignalR:n hub-toiminnot on määritelty oikein palvelinpuolella. Hubin toteutus vastaa viestien lähettämisestä ja vastaanottamisesta sekä käyttäjien hallinnasta.
Miten Bootstrapia käytetään oikein ja Razor-syntaksin ymmärtäminen web-kehityksessä
Bootstrapin käyttö ilman huolellisuutta tuo mukanaan seuraavat haitat:
– Verkkosivustosi näyttää geneeriseltä.
– Se on raskas verrattuna itse koodattuun ratkaisuun.
Hyvä käytäntö on, että määrität omat tyylisi, mutta pohjautut myös yleiseen kirjastoon, kuten Bootstrapiin, joka tukee responsiivista suunnittelua. Jos kuitenkin rakennat verkkosivustoa, joka tarvitsee erottuvan identiteetin tai brändin, varmista, että hyödynnät sen teemojen tukea. Älä vain hyväksy oletuksia.
Tällöin Bootstrapin avulla voit luoda tehokkaita ja mukautuvia verkkosivustoja, mutta pitää samalla huolta siitä, ettei ulkoasu jää tavanomaiseksi. Hyvin määritelty teema, joka poikkeaa oletusasetuksista, voi auttaa luomaan ainutlaatuisen visuaalisen ilmeen ilman, että tarvitsee luopua Bootstrapin tarjoamista eduista.
Razor-syntaksin ja -ilmausten ymmärtäminen
Ennen kuin muokkaamme etusivun näkymää, tarkastelemme esimerkkiä Razor-tiedostosta. Tämä tiedosto sisältää alun perin Razor-koodilohkon, joka luo tilauksen, jossa on hinta ja määrä, ja tulostaa tilauksen tiedot verkkosivulle seuraavasti:
Yllä oleva Razor-tiedosto tuottaisi seuraavan virheellisen tulosteen:
Vaikka Razor-muotoilussa voidaan käyttää minkä tahansa yksittäisen ominaisuuden arvoa käyttämällä @object.property -syntaksia, on suositeltavaa laittaa laskentaa sisältävät lausekkeet sulkeisiin, kuten seuraavassa esimerkissä:
Tämä tuottaa oikean tulosteen:
Tämä korjaus on tärkeä, sillä ilman sulkeita laskentaa käsitellään väärin ja tuloste ei vastaa odotettua lopputulosta.
HTML Helper -menetelmien ymmärtäminen
ASP.NET Core MVC:ssä näkymän luomisessa voidaan käyttää Html-objektia ja sen menetelmiä HTML-muotoilun tuottamiseen. Kun Microsoft julkaisi ensimmäisen ASP.NET MVC:n vuonna 2009, nämä HTML Helper -menetelmät olivat tapa renderöidä HTML:ää ohjelmallisesti. Nykyisessä ASP.NET Core -versiossa nämä metodit ovat jääneet taaksepäin yhteensopivuuden vuoksi, mutta ne tarjoavat edelleen arvokasta apua tietyissä tilanteissa.
Useimmat tilanteet, joissa Tag Helperit eivät ole käytettävissä, liittyvät Razor-komponentteihin, ja niitä käsitellään myöhemmin tässä luvussa. HTML Helper -menetelmien käyttö on erityisen hyödyllistä, kun tarvitset erityistä ohjelmallista hallintaa HTML-koodissa.
Tässä muutama hyödyllinen metodi:
-
ActionLink: Käytetään luomaan ankkuri-elementti, joka sisältää URL-polun määriteltyyn ohjaimeen ja toimintaan. Esimerkiksi
Html.ActionLink(linkText: "Binding", actionName: "ModelBinding", controllerName: "Home")luo tekstin "Binding", joka vie "ModelBinding"-toimintoon "Home"-ohjaimessa. -
AntiForgeryToken: Käytetään lisäämään lomakkeeseen piilotettu elementti, joka sisältää CSRF-suojauksen tunnisteen. Tämä voidaan validoida lomakkeen lähetyksessä.
-
Display ja DisplayFor: Näitä käytetään luomaan HTML-muotoilua, joka vastaa nykyistä mallia ja sen näyttömallia. .NET-tyypeille on valmiita näyttömalleja, mutta voit myös luoda omia näyttömallejasi "DisplayTemplates"-kansioon.
-
DisplayForModel: Tämä metodi tuottaa HTML-muotoilua koko mallille eikä vain yksittäiselle ilmaisulle.
-
Editor ja EditorFor: Näitä käytetään luomaan HTML-muotoilua, joka vastaa nykyistä mallia ja sen editorimallia. .NET-tyypeille on valmiita editorimalleja, mutta voit luoda myös omia malleja "EditorTemplates"-kansioon.
-
EditorForModel: Tämä metodi tuottaa HTML-muotoilua koko mallille, ei vain yksittäiselle ilmaisulle.
-
Encode: Käytetään koodataksesi objektin tai merkkijonon HTML:ksi turvallisesti. Esimerkiksi, jos haluat estää mahdolliset haitalliset syötteet ja estää XSS-hyökkäykset, tämä metodi on olennainen.
Nämä menetelmät tekevät ASP.NET Core MVC:n kehityksestä tehokkaampaa ja helpompaa, mutta on tärkeää ymmärtää niiden käyttöä ja erityisesti, milloin ja miksi valita oikea lähestymistapa, erityisesti silloin, kun käytetään Razor-komponentteja tai muita erikoistilanteita, joissa Tag Helperit eivät ole käytettävissä.
Endtext
Miten luoda web-käyttöliittymiä ASP.NET Corella ja Blazor WebAssemblyllä?
ASP.NET Core ja Blazor WebAssembly tarjoavat monia työkaluja ja ominaisuuksia, jotka mahdollistavat tehokkaiden ja interaktiivisten verkkosovellusten rakentamisen. Näiden teknologioiden ymmärtäminen ja niiden käytön hallinta on avain menestyksellisten web-käyttöliittymien kehittämiseen. ASP.NET Core tarjoaa voimakkaita ominaisuuksia, kuten Razor-näkymiä ja HTML- sekä Tag Helper -menetelmiä, kun taas Blazor WebAssembly tuo .NET-tekniikat suoraan selaimeen mahdollistaen C#-koodin ajamisen ilman JavaScriptiä. Tämä luku keskittyy näiden teknologioiden hyödyntämiseen web-käyttöliittymien rakentamisessa ja niiden tarjoamien mahdollisuuksien tutkimiseen.
ASP.NET Core tarjoaa käyttäjäystävällisiä ratkaisuja web-käyttöliittymien luomiseen. Razor-näkymät ja niiden syntaksi ovat keskeisiä työkaluja, joiden avulla voidaan luoda dynaamisia HTML-sivuja. Razor-syntaksi yhdistää C#-koodin HTML:ään, jolloin luodaan tehokkaita ja ylläpidettäviä verkkosovelluksia. Tämä syntaksi on intuitiivinen ja mahdollistaa koodin yhdistämisen suoraan HTML:ään ilman suuria lisäkerroksia, mikä tekee kehityksestä nopeampaa ja virheiden löytämisestä helpompaa.
Tag Helperit ja HTML Helperit ovat kaksi erilaista lähestymistapaa, joita ASP.NET Core tarjoaa. Tag Helperit ovat moderni ja suositeltava tapa luoda HTML-elementtejä dynaamisesti. Ne mahdollistavat koodin ja HTML:n integroinnin niin, että koodi on helposti luettavissa ja ymmärrettävissä. Tag Helperit tunnistaa erityiset attribuutit, kuten asp-for tai asp-action, jotka auttavat luomaan dynaamisia HTML-elementtejä ilman liiallisia koodirivejä. HTML Helperit, vaikka ne ovat vanhempia ja vähemmän intuitiivisia, ovat edelleen käytössä tietyissä tapauksissa, mutta niiden käyttö on vähenemässä modernin Tag Helperin myötä.
Blazor WebAssembly tuo uuden ulottuvuuden web-kehitykseen. Tämä teknologia mahdollistaa .NET-ympäristön käyttöä suoraan selaimessa ilman JavaScriptiä. Blazor WebAssemblyn avulla voidaan rakentaa yksinkertaisia ja monimutkaisempia web-sovelluksia, jotka toimivat täysin selaimessa, ilman että palvelimelle tehdään jatkuvia pyyntöjä. Tämä parantaa sovelluksen nopeutta ja responsiivisuutta, ja se voi jopa toimia offline-tilassa.
Blazor WebAssemblyn etuja ovat muun muassa offline-tila ja asiakaspään prosessoinnin mahdollisuus. Tämä vähentää palvelimen kuormitusta ja parantaa skaalautuvuutta, koska suurin osa prosessoinnista tapahtuu käyttäjän laitteella. Lisäksi Blazor WebAssembly tukee monia modernin webin ominaisuuksia, kuten dynaamisia komponentteja ja tilaustekniikoita, jotka voivat parantaa käyttäjäkokemusta. Näitä voivat olla esimerkiksi vuorovaikutteiset käyttöliittymät ja reaaliaikaiset päivitykset ilman koko sivun lataamista.
Blazor tarjoaa myös muita mielenkiintoisia käyttötilanteita. Esimerkiksi Blazor Server mahdollistaa sovelluksen ajamisen palvelimella, jolloin käyttöliittymän päivitykset lähetetään käyttäjälle SignalR:n kautta. Tämä tarjoaa nopean aloitusajan ja täydellisen pääsyn palvelinpuolen resursseihin, kuten tietokantoihin, mutta sillä on omat rajoituksensa, kuten verkon viiveet ja jatkuva yhteys palvelimeen. Blazor Hybrid puolestaan mahdollistaa .NET-koodin ajamisen natiivissa sovelluksessa, mikä voi olla hyödyllistä, jos tarvitaan pääsyä laitteen natiiveihin ominaisuuksiin, kuten kameraan tai paikannukseen.
Blazor WebAssemblyn ja Blazor Serverin valinta riippuu sovelluksen tarpeista. Jos halutaan täysin selainpohjainen kokemus, Blazor WebAssembly on paras vaihtoehto, kun taas Blazor Server sopii paremmin sovelluksiin, jotka tarvitsevat täyden palvelinpuolen tuen ja nopean aloitusajan. Blazor Hybrid tarjoaa puolestaan mahdollisuuden kehittää natiivisovelluksia, jotka hyödyntävät web-komponentteja.
Blazor WebAssemblyn käyttöön liittyy kuitenkin myös haasteita, erityisesti sen rajoitukset ja yhteensopivuusongelmat erilaisten selainten kanssa. Vaikka .NET 6 ja sitä uudemmat versiot tarjoavat pääsyn laajaan API-arkistoon, Blazor WebAssembly toimii selaimen hiekka-alueella, mikä tarkoittaa, että tietyt API:t eivät ole tuettuja. Tämä voi johtaa virheisiin, jos kehittäjä yrittää käyttää selaimen rajoittamia toimintoja. Tämän estämiseksi voidaan käyttää selainyhteensopivuusanalysoijia, jotka varoittavat ei-tuetuista API-kutsuista ennen kuin koodi ajetaan selaimessa.
Blazor WebAssemblyn sovelluksia voi myös isännöidä monin tavoin. Yksi vaihtoehto on julkaista Blazor WebAssembly -asiakassovellus staattiselle web-palvelimelle, kuten Azure Static Web Apps -palveluun. Toinen vaihtoehto on isännöidä koko Blazor WebAssembly -sovellus palvelimella, jolloin palvelin voi tarjota lisäpalveluita ja resursseja asiakassovellukselle.
Lopuksi, Blazor WebAssembly tarjoaa monia etuja, mutta se ei ole täydellinen ratkaisu kaikkiin tilanteisiin. Kehittäjän on ymmärrettävä sen rajoitukset ja parhaat käytännöt, kuten selainyhteensopivuuden tarkistaminen ja API-rajapintojen käyttö. Kun nämä tekijät otetaan huomioon, Blazor WebAssembly voi olla erittäin tehokas työkalu modernien, interaktiivisten web-sovellusten kehittämisessä.
Miten käsitellä päivämääriä, aikoja ja kansainvälistämistä .NET:ssä
Kun käsitellään päivämääriä ja aikoja ohjelmoinnissa, erityisesti .NET-ympäristössä, tulee ottaa huomioon useita tekijöitä, kuten aikavyöhykkeet, kesäaika (DST) ja kulttuurisidonnaisuus. Erityisesti, jos työskentelee sovellusten kanssa, jotka on tarkoitettu globaaliin käyttöön, oikeiden aikojen ja päivämäärien käsittely voi olla haasteellista, koska samat päivämäärät voivat eri alueilla olla esitetty eri tavoin. Esimerkiksi, jos päivämäärä on kirjoitettu muodossa 7/4/2024, amerikkalainen kulttuuri tulkitsee sen huhtikuun 7. päiväksi, mutta brittiläinen kulttuuri voisi lukea sen heinäkuun 4. päiväksi. Tällaisten erojen välttämiseksi voidaan määrätä tarkka kulttuuri, joka ohjaa päivämäärien jäsennystä, kuten seuraavassa esimerkissä, jossa käytetään kolmannen osapuolen kulttuuria päivämäärän jäsentämiseen.
Kulttuuriin sidotut asetukset eivät rajoitu pelkästään päivämäärän ja ajan esittämiseen, vaan myös viikonpäivän nimien lokalisoimiseen. Esimerkiksi, jos haluamme saada viikonpäivän nimen tanskaksi, meidän on asetettava kulttuuriin tuki tälle kielelle ja käytettävä DateTimeFormatInfo-luokkaa. Vaikka DayOfWeek-enumeraattori itsessään on sidottu englanninkielisiin nimityksiin, voimme kuitenkin muuntaa sen kulttuuriin sopivaksi tekstiksi tämän luokan avulla. Esimerkiksi, jos määrittelemme kulttuuriksi "da-DK" ja tulostamme päivän nimen, saamme seuraavat tulokset:
Uudemmissa .NET-versioissa, kuten .NET 6:ssa, on otettu käyttöön myös tyypit, jotka käsittelevät pelkkää päivämäärää tai aikaa. DateOnly ja TimeOnly luokat tarjoavat tyypillisesti paremman tavan käsitellä vain päivämäärä- tai aikatietoja. Aikaisemmin oli yleistä käyttää DateTime-objekteja, jotka sisälsivät ajan, mutta DateOnly ja TimeOnly tekevät tästä huomattavasti turvallisempaa ja selkeämpää. Esimerkiksi, kun suunnittelemme Englannin kuninkaan, Charles III:n, kruunajaisia, voimme määritellä tapahtuman päivämäärän ja ajan erikseen:
Tällöin saamme tarkasti määritellyn ajan ja päivämäärän, mutta pelkkä TimeOnly ei ole riittävä, jos emme tiedä aikavyöhykettä. Aikavyöhykkeiden hallinta on erityisen tärkeää, sillä ilman aikavyöhyketietoa emme voi taata oikeita aikoja eri maissa.
Kun työskentelemme aikavyöhykkeiden kanssa, TimeZoneInfo-luokka tulee avuksi. Se tarjoaa muun muassa mahdollisuuden muuntaa aikaleiman toiselle aikavyöhykkeelle, tarkistaa, onko aikaleima kesäajassa, ja palauttaa järjestelmässä käytettävät aikavyöhykkeet. Esimerkiksi, jos haluamme muuntaa UTC-aikavyöhykkeellä olevan ajan paikalliseksi ajaksi, voimme käyttää ToLocalTime-metodia.
Tämä mahdollistaa ajankäsittelyn tarkasti ja joustavasti eri aikavyöhykkeissä. On tärkeää huomata, että vaikka .NET tarjoaa monia työkaluja aikojen ja aikavyöhykkeiden käsittelyyn, kehittäjän on aina otettava huomioon käyttäjän paikallinen aika ja mahdollinen kesäajan muutokset. Aikavyöhykkeet voivat myös muuttua lainsäädännön tai alueellisten päätösten takia, kuten Yhdysvalloissa käytävän keskustelun myötä, jossa pohditaan, pitäisikö kesäaika tehdä pysyväksi. Tämä voi johtaa lisääntyvään monimutkaisuuteen, erityisesti amerikkalaisille käyttäjille, joiden on ehkä käsiteltävä alueellisia eroja.
Eri aikavyöhykkeiden ja kesäajan käsittelyssä voi syntyä virheitä, jos kehittäjä ei ole tarkka aikavyöhykkeiden määrittelyssä ja käytössä. Lisäksi on tärkeää muistaa, että päivämäärät voivat näyttää samanlaisilta mutta olla eri aikoja, jos aikavyöhykettä ei ole määritelty tai jos käsitellään vain paikallista aikaa ilman aikavyöhyketietoa. Tällöin käyttäjälle voi tulla virheellisiä aikoja, ja tapahtumat voivat olla väärässä ajassa.
Miten käyttää ODataa Visual Studio Code -projektissa: Käytännön ohjeet
OData (Open Data Protocol) on avoin protokolla, joka mahdollistaa tietojen jakamisen ja hakemisen webin kautta. Tämän protokollan avulla voidaan luoda tehokkaita ja joustavia rajapintoja, joiden avulla asiakasohjelmat voivat kommunikoida tietokantojen kanssa. ODataa voidaan käyttää monella tavalla, mutta tässä esitetään vaiheittainen opas siitä, miten luodaan OData-asiakasprojektia Visual Studio Codessa ja miten luodaan yhteys OData-palveluun MVC-sovelluksessa.
Aloitetaan valitsemalla Visual Studio Codessa Northwind.OData.Client.Mvc projekti aktiiviseksi OmniSharp-projektiksi. Tämän jälkeen lisätään viite Northwind.Common.EntityModels.SqlServer -projektiin Chapter02-kansioon, kuten alla olevassa koodissa on esitetty.
Seuraavaksi rakennamme Northwind.OData.Client.Mvc -projektin ja avaamme launchSettings.json -tiedoston Properties-kansiossa. Tässä vaiheessa on tärkeää muokata applicationUrl-asetusta niin, että käytämme HTTPS-porttia 5102 seuraavasti:
Tämän jälkeen luomme uuden luokan ODataProducts.cs Models-kansioon. Tämä luokka määrittelee, miten tuotteet haetaan OData-palvelusta:
Seuraava vaihe on lisätä tarvittavat nimikirjastot Program.cs-tiedostoon HTTP-otsikoiden määrittämiseksi. Tässä määrittelemme MediaTypeWithQualityHeaderValue -luokan, joka varmistaa, että palvelin käsittelee JSON-vastauksia:
Sen jälkeen lisäämme HTTP-asiakkaan, joka lähettää JSON-vastauksia OData-palveluun seuraavasti:
OData-palveluiden kutsuminen MVC-sovelluksessa
Kun perusasetukset on tehty, voimme siirtyä seuraavaan vaiheeseen: OData-palveluiden kutsuminen HomeController.cs-ohjaimessa. Ensiksi lisäämme kentän, joka tallentaa rekisteröidyn HTTP-asiakastehtaan:
Seuraavaksi, HomeController-luokan konstruktorissa, siirrämme ja tallennamme HTTP-asiakasrakenteen:
Sitten muutamme Index-metodin asynkroniseksi ja lisäämme koodin, joka kutsuu OData-palvelua ja hakee tuotteet, joiden nimet alkavat "Cha"-kirjaimilla. Tulokset tallennetaan ViewData-sanakirjaan, joka välittää ne näkymään:
Näkymässä, Views/Home/Index.cshtml-tiedostossa, poistamme vanhan HTML-rakenteen ja luomme uuden, joka renderöi tuotteet ja antaa kävijälle mahdollisuuden syöttää tuotteen nimen aloitusosa:
Kun kaikki on valmiina, käynnistämme Northwind.OData.Service -projektin ilman virheenkorjausta ja sitten Northwind.OData.Client.Mvc -projektin. Avaa Chrome-selain ja siirry osoitteeseen https://localhost:5102. Tämän jälkeen voidaan tarkastella, että OData-palvelu palauttaa kolme tuotetta, joiden nimet alkavat "Cha".
Tarkastelemme myös SQL-komentoa, joka suoritetaan OData-palvelussa, sekä HTTP-pyyntöä ja -vastausta, joka lähetetään ja vastaanotetaan MVC-sovelluksen kautta.
Jos kirjoitetaan esimerkiksi "b" hakukenttään ja painetaan Enter, tuloksena näkyy vain yksi tuote, "Boston Crab Meat". Jos kirjoitetaan "d" ja painetaan Enter, saamme virheilmoituksen, koska ei ole tuotteita, joiden nimi alkaisi kirjaimella "d".
Lisättävää ja huomioitavaa
On tärkeää ymmärtää, että OData tarjoaa monenlaisia suodatus-, lajittelu- ja laajentamismahdollisuuksia, jotka voivat tehdä rajapinnasta entistä joustavamman. Esimerkiksi voit käyttää $filter-parametria monenlaisiin hakuehtoihin, kuten alla olevassa esimerkissä:
Tämä kysely hakee tuotteet, joiden nimessä on "ch" ja joiden hinta on alle 44,95. Tämän lisäksi tuotteet järjestetään toimittajan maan mukaan ja sen jälkeen yksikköhinnan mukaan. Tällaiset kyselyt antavat käyttäjille erittäin monipuolisia hakumahdollisuuksia ja voivat auttaa optimoimaan tiedonhakua suurista tietokannoista.
Mikä on rakkauden ja häpeän raja avioliitossa?
Miten prosessiturvallisuusanalyysi auttaa varmistamaan turvallisuuden kemianteollisuudessa?
Kuinka tekstinlouhinta ja syväoppiminen muuttavat kieliteknologioita?
Miten määritetään metallipitoisuudet monivaiheisen uuttamisen ja pitoisuuden esikäsittelyn jälkeen merivedestä?
Mitä tapahtuu, kun laki kääntyy väärään suuntaan?

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский