2016-04-09 52 views
3

Uygulamamı, içeriğin yönelticinin tanıdığı desene göre farklı RESX dosyalarından okunması için kurdum. Her sayfaya, URL’nin ilk bölümüne bağlı olarak belirli bir dilde erişilebilir. Hiçbir şartnameye test ediyorum zamanMVC uygulamasında çoklu dil nasıl kullanılır?

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

, benim Lingo.REXS İngilizce sürümü almak ve ben se koymak, ben, İsveç sürüme yani Lingo.se.RESX olsun. Her şey yolunda. Ancak, kullanıcının dilin ayarını nasıl kontrol etmesine izin verdiğinden emin değilim. Ben tarayıcı ayarları, coğrafi veri vb otomatik dayalı veya varsayılan olmasını istemiyorum. Ben temelde bir şekilde sihirli kullanıcı (veya en azından bu tarayıcı oturumu) yönlendirilebilir ayarlamak üç bayrak (img denetimleri) istiyorum bayrağın diline karşılık gelen önek ile tıklandı.

Yani,/se/Ana Sayfa/Hakkında ve/ge/Ana Sayfa/Hakkında. Kullanıcı Alman bayrağına tıkladığında - bunları ikincisine nasıl yönlendireceğiz? Ve eğer İsveç bayrağına tıklarlarsa - onları eski ile nasıl yönlendiririz?

this blog ile doğruladım, ancak tıklatılan bayrak görüntüsüne bağlı olarak belirli bir dile nasıl yönlendirileceğiyle ilgili asıl sorunu ele almıyor. Ayrıca this blog'u da buldum ama nasıl yaptıklarını anlamıyorum. Bir DB'ye bir grup çağrı görüyorum, bu yüzden RESX dosyalarına dayandığından şüpheliyim (ve benim anlamak benim için doğru yoldur), ancak @TestResource.

Şu an kafam karıştı ve belirsiz. Herhangi bir öneri veya açıklama mı?

cevap

3

MVC'nin biraz sezgisel olmayan bir özelliği vardır, bu da bunu gerçekten kolaylaştırır. MVC automatically reuses any route values istek üzerine. Dolayısıyla, tüm URL'leriniz otomatik olarak kültürü "devralır" - ActionLink içinde açıkça belirtmeye gerek yoktur.

Tek istisna, dil seçimi sırasında yapılır. Ancak, _Layout.cshtml ürününüzde ortak bir üstbilgi veya altbilgi oluşturmak için aynı yönlendirme davranışından yararlanabilirsiniz. Geçerli sayfadaki rota değerleri ne olursa olsun, devralınacak - yapmanız gereken tek şey denetleyici, eylem ve kültürü belirtmektir. Daha önce belirtildiği gibi

@{ 
    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> 

, sayfadaki tüm diğer bağlantılar otomatik olarak geçerli bağlamdan kültürünü geçilecek, yani otomatik olarak aynı kültürü içinde kalacak. Bu durumlarda kültürü açıkça geçmek için bir sebep yoktur. geçerli URL /Home/Contact ise yukarıdaki bağlantıya sahip

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

, oluşturulan bağlantı /Home/About olacaktır. Geçerli URL /en/Home/Contact ise, bağlantı /en/Home/About olarak oluşturulacaktır.

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

+0

Hmm ... Sana uygulayarak çok fazla yaptık anlamına acaba (emme-up teslim edilmesini, şimdi) bu yüzden cevapların insightfulness, tanımak özel rota ve yerelleştirme özelliği. * _Layout.cshtml * 'deki bir yerde üç dil için bir kültürle bağlantı kurmam gerektiğini ve kullanıcının orayı tıkladığında (bu nedenle kültürü seçerek) sadece yaşamayı sürdüreceğimi mi söylüyorsun? Bu ** o kadar kolay olamaz ... Yapabilir miyim? –

+0

Evet, bu doğru. Bu kadar kolay.Ancak, rota değerine (sorunuzda göstermiş olduğunuz) uymak için bir rota olmak zorundadır. "Varsayılan" dilini nasıl kullanacağım için bağlantılı cevabımı görün. – NightOwl888

+0

Bu harika bir şey. Bir hata gibi hissettirir (bu durumda bu son derece yararlı olsa da), ancak aptal yeniden yönlendirme sadece ikinci eğik çizgi ** sonrasında son eki ele alır. Bu harika! Teşekkürler. –