[ASP.net] Localization (culture) adhv url extensie

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 00:59

Twazerty

AVCHDCoder developer

Topicstarter
Ik ben bezig een asp.net (.NET 4.0) website te bouwen. Deze moet meerdere talen ondersteunen en voor verschillende talen zijn ook verschillende domeinnamen vastgelegd. Ter illustratie zijn dat bijvoorbeeld de volgende domeinen:

voorbeeld.nl
voorbeeld.de
voorbeeld.fr
voorbeeld.com

middels deze string in web.config kan ik nu aan de hand van de browser instellingen de juiste taal voorschotelen: <globalization enableClientBasedCulture="true" uiCulture="auto" culture="auto"/>

Nu wil ik dus dat automatisch de duitse culture wordt ingesteld als je browsed naar voorbeeld.de ongeacht de browser taal. Ga je dan naar voorbeeld.fr moet de franse culture worden ingesteld. Ik wil dus de domeinextentie mappen aan een culture. Het probleem is dat ik hier niets over kan vinden. (Ook niet op de microsoft pagina's) Hoe moet ik dit nu aanpakken?

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • mrFoce
  • Registratie: Augustus 2004
  • Laatst online: 09-09 17:18
Een manier zou zijn om in je page_load op je master page de URL te checken en dan de speficieke Culture in te stellen?

Acties:
  • 0 Henk 'm!

  • HeSitated
  • Registratie: April 2009
  • Laatst online: 03-12-2024
[b][message=35511854,noline]<globalization enableClientBasedCulture="true" uiCulture="auto" culture="auto"/>
Als je enableClientBasedCulture op false zet en in de masterpage Globalization.Cultureinfo.CurrentCulture en Globalization.Cultureinfo.CurrentUICulture instellen op de juiste taal.

(Ik weet niet of ik de namespace goed heb....) :o

Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 00:59

Twazerty

AVCHDCoder developer

Topicstarter
Wat ik ook doe ik krijg telkens de gepersonaliseerde pagina van de browser en niet van de url.

In de Page_Load weet ik 200% zeker dat het nu nog simpele if statement werkt:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
        Response.Write("Url " + HttpContext.Current.Request.Url.AbsoluteUri + "<br>");
        Response.Write("Changing Culture to " + Thread.CurrentThread.CurrentCulture.EnglishName + "<br>");
        if (HttpContext.Current.Request.Url.AbsoluteUri.Contains("com"))
        {
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
            Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
        }
        else
        {
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("nl-NL");
            Thread.CurrentThread.CurrentUICulture = new CultureInfo("nl-NL");
        }
        Response.Write("Changing Culture to " + Thread.CurrentThread.CurrentCulture.EnglishName + "<br>");


In de response wisselt hij mooi tussen de cultures maar de text op de webpagina wordt niet vertaald. Dat ziet er gewoon zo uit en werkt in principe gewoon:

C#:
1
<asp:Label ID="Label1" runat="server" Text="<%$ Resources:LocalizedText, Ms1 %>"></asp:Label>


Edit:
Globalization.Cultureinfo.CurrentCulture is read only

Edit 2:
De Resources staan in App_GlobalResources:
LocalizedText.resx
LocalizedText.nl.resx
LocalizedText.de.resx
enz

[ Voor 6% gewijzigd door Twazerty op 09-02-2011 22:54 ]

Ruisende versterker: schakel je subwoofer in.


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:44

gorgi_19

Kruimeltjes zijn weer op :9

mrFoce schreef op woensdag 09 februari 2011 @ 21:59:
Een manier zou zijn om in je page_load op je master page de URL te checken en dan de speficieke Culture in te stellen?
Dan kan je hem beter in je global.asax definieren, hoef je hem niet in alle page_loads te zetten. Als je een plugin-achtig iets wilt hebben, kan je een eigen httpmodule bouwen.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • defcon84
  • Registratie: September 2009
  • Laatst online: 19-09 07:46

defcon84

Multipass?

Ten eerste: Je culture setten op basis van domein is gewoon verkeerd!

een land representeert geen taal, wat doe je met .be?
ga je daar standaard nederlands, of frans laten zien?
of bvb Finland? fins of zweeds?
en zo zijn er nog veel meer multilanguage landen :)

dat gezegd zijnde, je kan beter 1 domeinnaam nemen en dan de user zijn taal overnemen van de browser. en die voor seo redenen als eerste parameter in de url zetten
bvb:
voorbeeld.com/nl
voorbeeld.com/fr
voorbeeld.com/en
of eventueel zelfs: voorbeeld.com/nl-NL

op deze manier kan je makkelijk switchen van taal als de user dat wil, en hoef je niet verschillende domeinen te gaan beheren..

Ten tweede:
ja je set je language best in global.asax
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
protected void Application_AcquireRequestState(object sender, System.EventArgs e)
{
    var p = HttpContext.Current.Handler as Page;
    if (p == null) return;

    var lang = "";
    try {
        lang = HttpContext.Current.Request.Url.AbsolutePath.Substring(1, 2);
    }
    catch {
    }

    if (lang.Length == 0) return;

    // controleer hier of je de taal ondersteunt

    Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);
    Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
}


Dit is een versimpeld voorbeeld.. je zou ook nog ergens je default taal moete instellen (op basis van de browser settings)

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 00:59

Twazerty

AVCHDCoder developer

Topicstarter
Als een gebruiker naar .com gaat dan is het idee dat deze aan de hand van de browser instellingen automatisch de taal selecteerd. Dit kunnen we dan voor eventuele overige talen gebruiken waar we geen domein van hebben. Echter merk ik dat ik met Chrome bijvoorbeeld niet automatisch op de nederlandse pagina kom (maar op de engelse) en met FF wel. Om een wat meer locatiegebonden gevoel voor gebruikers te krijgen hebben we voor enkele landen een domein geregistreerd waarin direct de taal wordt gekozen. Ik wil op ieder domein wel de optie houden om van taal te wisselen.

Dit lijkt mij dit idd ook wel mooi:
voorbeeld.com/fr
maar dan net zoals microsoft ook doet. Als je voorbeeld.fr intikt dat ie dan naar voorbeeld.com/fr gaat.

of ik dit ga doen? Denk het niet. Het aantal landen blijft waarschijnlijk beperkt tot 3. Voor belgie nemen we dan gewoon de nederlandse taal, de walen richten we ons denk ik niet op.

Ruisende versterker: schakel je subwoofer in.


  • creator1988
  • Registratie: Januari 2007
  • Laatst online: 21-09 08:50
Wij gebruiken voor dit soort dingen Helicon ISAPI_Rewrite. Deze kan je urls herschrijven naar http://voorbeeld.com/nl, en je kan in je MVC routes dan iets bouwen als:

{language}/{controller}/{action}

Klaar. Gebruiker ziet er niets van.

  • defcon84
  • Registratie: September 2009
  • Laatst online: 19-09 07:46

defcon84

Multipass?

als je MVC gebruikt is het nog fijner om mee te werken :)
gewoon een filtertje schrijven en aan een BaseController class hangen :)
en dan: var language = (string)filterContext.RouteData.Values["language"];

aah MVC <3

Acties:
  • 0 Henk 'm!

Verwijderd

Cultures moet je niet in de load, maar in de InitializeCulture function aanpassen.

code:
1
2
3
4
5
6
7
protected override void InitializeCulture()
{
    Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("nl-NL");
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("nl-NL");

    base.InitializeCulture();
}

Acties:
  • 0 Henk 'm!

  • defcon84
  • Registratie: September 2009
  • Laatst online: 19-09 07:46

defcon84

Multipass?

als je het per page wil setten wel ja, maar dat is tegen het DRY principe :)

Acties:
  • 0 Henk 'm!

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
Vandaar een abstract base class die je laat inheriten van Page waarin je zulke dingen regelt. Al je eigen pagina's inheriten dan weer van je eigen base class. :)

C#:
1
2
3
4
5
6
7
8
9
10
public abstract class MyPageBase : Page
{
    protected override void InitializeCulture()
    {
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("nl-NL");
        Thread.CurrentThread.CurrentUICulture = new CultureInfo("nl-NL");
    
        base.InitializeCulture();
    }
}

[ Voor 51% gewijzigd door Alex) op 12-02-2011 04:24 ]

We are shaping the future


Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 00:59

Twazerty

AVCHDCoder developer

Topicstarter
Alex) schreef op zaterdag 12 februari 2011 @ 04:23:
Vandaar een abstract base class die je laat inheriten van Page waarin je zulke dingen regelt. Al je eigen pagina's inheriten dan weer van je eigen base class. :)

C#:
1
2
3
4
5
6
7
8
9
10
public abstract class MyPageBase : Page
{
    protected override void InitializeCulture()
    {
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("nl-NL");
        Thread.CurrentThread.CurrentUICulture = new CultureInfo("nl-NL");
    
        base.InitializeCulture();
    }
}
Welke aanpak is dan "beter". Zoals jij het doet in een eigen page classe of in de Application_AcquireRequestState zoals Defcon24 voorstelt? In beide gevallen heb je geen code duplicatie maar bij een custom page moet je bij iedere pagen eerst even de Page veranderen in je eigen custom page.

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
Mijn persoonlijke voorkeur is om het in een eigen Page-class te zetten. Global.asax.cs vind ik in de eerste plaats een beetje een lelijke plek om dingen te doen en het is iets wat je redelijk snel over het hoofd kunt zien als je het project een tijdje laat liggen of iemand anders het overneemt.

Door al je pagina's te laten inheriten valt het eerder op dat er iets afwijkt dan wanneer je die settings vanuit een Global.asax.cs laat zetten, vind ik dan.

We are shaping the future


Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 00:59

Twazerty

AVCHDCoder developer

Topicstarter
Ik heb nu toch gekozen voor deze structuur:
voorbeeld.com - Engels
voorbeeld.com/nl - Nederlands
voorbeeld.com/de - Duits
enz

voorbeeld.nl wordt nu geredirect naar voorbeeld.com/nl
zo ook voor de andere domeinen. Werkt prima.

Middels routing zorg ik er nu voor dat de language ingesteld wordt. So far so good. Als ik nu naar voorbeeld.com/nl ga dan krijg ik een 404. Ga ik naar voorbeeld.com/nl/Default.aspx dan werkt de nederlandse pagina wel. voorbeeld.com geeft geen 404 maar voorbeeld.com/nl wel. Ik heb de volgende pagina gebruikt om het routen werkend te krijgen: http://weblogs.asp.net/paulomorgado/archive/2010/01/31/web-site-globalization-with-asp-net-routing.aspx
Dit is de relevante code in mijn custom RouteHandler:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        Thread.CurrentThread.CurrentCulture = this.culture;
        Thread.CurrentThread.CurrentUICulture = this.uiCulture;

        string path = "~/" + (requestContext.RouteData.Values["path"] as string);

        var physicalPath = requestContext.HttpContext.Server.MapPath(path);
        if (System.IO.Directory.Exists(physicalPath))
        {
            path = VirtualPathUtility.Combine(path, "Default.aspx");
        }

        var httpHandler = BuildManager.CreateInstanceFromVirtualPath(path, typeof(IHttpHandler)) as IHttpHandler;

        return httpHandler;
    }


Dit is mijn Global.asax met alleen de relevante code:
C#:
1
2
3
4
5
6
    void RegisterRoutes(RouteCollection routes)
    {
        routes.Add("nl", new Route("nl/{*path}", new GlobalizationRouteHandler(CultureInfo.GetCultureInfo("nl-NL"))));
        routes.Add("en", new Route("en/{*path}", new GlobalizationRouteHandler(CultureInfo.GetCultureInfo("en-US"))));
        routes.Add("de", new Route("de/{*path}", new GlobalizationRouteHandler(CultureInfo.GetCultureInfo("de-DE"))));
    }


Offline werkt dit routen wel, online niet. Wat doe ik verkeerd? Voor zover ik de code goed lees zou voorbeeld.com/nl gewoon de Default.aspx in mijn root folder moeten voorschotelen. Of moet ik nog een route toevoegen? (Voorgevoel zegt van wel) maar de volgende code doet het ook niet:
routes.MapPageRoute("", "", "~/Default.aspx");

Note: Ik maak gebruik van Asp.net en niet van Asp.net MVC

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • mrFoce
  • Registratie: Augustus 2004
  • Laatst online: 09-09 17:18
Ik kan me vergissen, maar is Routes niet een MVC extensie? Misschien is de MVC extensie niet geinstalleerd op je webserver?

Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 00:59

Twazerty

AVCHDCoder developer

Topicstarter
mrFoce schreef op zaterdag 12 februari 2011 @ 20:01:
Ik kan me vergissen, maar is Routes niet een MVC extensie? Misschien is de MVC extensie niet geinstalleerd op je webserver?
Ik heb geen idee of het een MVC extensie is. Zoals het er nu ligt wordt de taal ingesteld aan de hand van de url. /de geeft mij de duitse taal en /nl geeft mij de nederlandse taal.

Edit: Volgens mij kun je routes in elke ASP.net applicatie gebruiken: http://msdn.microsoft.com/en-us/library/cc668201.aspx#adding_routes_to_a_web_forms_application

[ Voor 24% gewijzigd door Twazerty op 12-02-2011 21:33 ]

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • defcon84
  • Registratie: September 2009
  • Laatst online: 19-09 07:46

defcon84

Multipass?

draai je IIS6 of 7 op je production server?

Routes is gewoon een asp.net ding, werkt dus op webforms & mvc..

Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 00:59

Twazerty

AVCHDCoder developer

Topicstarter
defcon84 schreef op maandag 14 februari 2011 @ 09:55:
draai je IIS6 of 7 op je production server?

Routes is gewoon een asp.net ding, werkt dus op webforms & mvc..
II7.

Ik merkte dat ik met asp.net aan het vechten was tegen het platform. Url's correct maken zodat de taal er ook bij stond vond ik allemaal veel te omslachtig. Ik was verder toch nog niet met de applicatie begonnen dus ben maar eens dat ASP.net MVC gaan bekijken. Ik vond het er zo goed uitzien dat ik dat daarmee aan de slag ben gegaan. Talen instellen, links maken ging allemaal perfect en zonder problemen. Heb nu wel een ander raar probleem maar daar kan ik beter een ander topic voor openen.

Edit: In .asax controleer ik nu op het inkomende domein en schakel ze direct door naar het .com/<taal> adres.

[ Voor 7% gewijzigd door Twazerty op 14-02-2011 10:23 ]

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • defcon84
  • Registratie: September 2009
  • Laatst online: 19-09 07:46

defcon84

Multipass?

aah mooi! :-)
MVC werkt idd heerlijk :9~

Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 00:59

Twazerty

AVCHDCoder developer

Topicstarter
Nu kom ik het volgende probleem tegen:

In het default ASP.net MVC project zit een inlogsysteem. Als het authentication meganisme ziet dat je ingelogd moet zijn en je bent dat niet wordt je naar de inlogpagina gestuurd. In web.config ziet dat er zo uit:

[code=C#]
<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn" timeout="2880"/>
</authentication>[/code=C#]

Nu wordt dus de verkeerde url geopend als je door bovenstaande code doorgestuurd wordt naar ~/Account/LogOn. De language code ontbreekt nu in de url:
http://localhost:61270/Account/LogOn?ReturnUrl=%2fnl%2fBrand%2fEdit%2f6
en resulteert dus in een 404. Hoe zorg ik er nu voor dat /nl of /de in de return url als url verschijnt. Dus dit is de bedoeling:
http://localhost:61270/nl/Account/LogOn?ReturnUrl=%2fnl%2fBrand%2fEdit%2f6
http://localhost:61270/de/Account/LogOn?ReturnUrl=%2fde%2fBrand%2fEdit%2f6

Ik vermoed dat ik iets met routes in moet stellen? Alleen kom ik daar niet uit. Moet dat met MapPageRoute? of met mapRoute? Zo ja, hoe dan. Want het volgende werkt niet:
routes.MapPageRoute("LogOn", "{language}/Account/LogOn", "~/Account/LogOn");

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • defcon84
  • Registratie: September 2009
  • Laatst online: 19-09 07:46

defcon84

Multipass?

Pagina: 1