2016-04-09 7 views
3

Ich habe meine Anwendung so eingerichtet, dass die Inhalte aus verschiedenen RESX-Dateien gelesen werden, entsprechend dem Muster, das der Router erkennt. Auf jede Seite kann in einer bestimmten Sprache zugegriffen werden, abhängig vom ersten Teil der URL.Wie behandelt man mehrere Sprachen in MVC-Anwendungen?

routes.MapRoute(
    name: "Localization", 
    url: "{lang}/{controller}/{action}/{id}", ... 
); 

Wenn ich ohne Spezifikation testen bin, bekomme ich auf die englische Version meiner Lingo.REXS und wenn ich in se setzen, bekomme ich auf die schwedische Version, das heißt Lingo.se.RESX. Bis hier ist alles in Ordnung.

Allerdings bin ich nicht sicher, wie der Benutzer die Einstellung der Sprache steuern kann. Ich möchte nicht, dass es automatisch ist, noch basierend auf den Einstellungen des Browsers, Geodaten usw. Ich möchte im Grunde drei Flags (IMG-Steuerelemente), die irgendwie magisch setzen diesen Benutzer (oder zumindest diese Browsersitzung) routingfähig sein mit dem Präfix, das der Sprache des angeklickten Flags entspricht.

Also, wir haben/se/Home/Über und/ge/Home/Über. Der Benutzer klickt auf die deutsche Flagge - wie leiten wir sie zu letzterem? Und wenn sie auf die schwedische Flagge klicken - wie leiten wir sie zu den ehemaligen?

Ich habe mit this blog verifiziert, aber es befasst sich nicht mit dem tatsächlichen Problem, wie in eine bestimmte Sprache je nach dem angeklickt Flag-Bild zu routen. Ich habe auch this blog gefunden, aber ich verstehe einfach nicht, wie sie es tun. Ich sehe eine Reihe von Aufrufen an eine DB, also vermute ich, dass es nicht auf RESX-Dateien basiert (und mein Verständnis ist, dass es der richtige Weg ist), obwohl es auch einen Verweis auf @TestResource gibt.

Im Moment bin ich verwirrt und unsicher. Irgendwelche Vorschläge oder Erklärungen?

Antwort

3

Es gibt eine etwas nicht intuitive Funktion von MVC, die dies wirklich einfach macht. MVC automatically reuses any route values aus der Anfrage. Daher "erben" alle Ihre URLs automatisch die Kultur - Sie müssen sie nicht explizit in ActionLink angeben.

Die einzige Ausnahme ist während der Sprachauswahl. Aber Sie können das gleiche Routing-Verhalten nutzen, um eine gemeinsame Kopf- oder Fußzeile in Ihrem _Layout.cshtml zu erstellen. Welche Routenwerte die aktuelle Seite hat, wird vererbt - Sie müssen nur Controller, Aktion und Kultur angeben.

@{ 
    var routeValues = this.ViewContext.RouteData.Values; 
    var controller = routeValues["controller"] as string; 
    var action = routeValues["action"] as string; 
} 
<ul> 
    <li>@Html.ActionLink("Swedish", @action, @controller, new { lang = "se" }, new { rel = "alternate", hreflang = "se" })</li> 
    <li>@Html.ActionLink("English", @action, @controller, new { lang = "en" }, new { rel = "alternate", hreflang = "en" })</li> 
</ul> 

Wie bereits erwähnt, werden alle anderen Links auf der Seite wird automatisch eine Kultur aus dem aktuellen Kontext übergeben werden, so werden sie automatisch in der gleichen Kultur bleiben. Es gibt keinen Grund, die Kultur in diesen Fällen explizit zu übergeben.

@ActionLink("About", "About", "Home") 

Mit dem obigen Link, wenn die aktuelle URL /Home/Contact ist, die Verbindung, die erzeugt wird, wird /Home/About sein. Wenn die aktuelle URL /en/Home/Contact ist, wird die Verknüpfung als /en/Home/About generiert.

Referenz: ASP.NET MVC 5 culture in route and url

+0

Hmm ... Ich erkenne die insightfulness Ihrer Antworten, so (jetzt, dass das Saugen-up geliefert wird) Ich frage mich, ob Sie meinen, dass ich die Art und Weise zu viel getan haben durch die Umsetzung Spezielles Route- und Lokalisierungsattribut Willst du sagen, dass ich nur einen Link mit Kultur für die drei Sprachen irgendwo in * _Layout.cshtml * einfügen muss und sobald der Benutzer dort klickt (also die Kultur auswählt), wird es weiterleben? Es kann nicht so einfach sein ... Kann es? –

+0

Ja, das ist richtig. So einfach ist es.Aber es kommt darauf an, dass es eine Route gibt, die dem Routenwert entspricht (den Sie in Ihrer Frage gezeigt haben). Siehe meine verknüpfte Antwort für die Handhabung der "Standard" -Sprache. – NightOwl888

+0

Es ist verdammt großartig. Es fühlt sich an wie ein Fehler (der in diesem Fall jedoch sehr hilfreich ist), aber das dumme Umleiten behandelt nur das Suffix ** nach dem zweiten Schrägstrich. Das ist großartig! Vielen Dank. –