2009-07-23 63 views
0

ASP.NET MVC應用程序,接近完成,然後決定它需要一個語言切換器。它只是兩種語言:英語和日語。他們應該能夠在兩者之間切換,但是如果沒有選擇它,它應該選擇瀏覽器的默認語言。構建一個語言切換器 - 僅限2種語言 - ASP.NET MVC

我想知道在這種情況下最好的解決方案是什麼。

首先想到,路線!所以我改變路線在每條路線的末尾都有一個/{l},並且默認l = ""。然後,在我的BaseController中(每個控制器都基於它),我檢查路由中的l變量。每個操作都會根據語言返回一個視圖。

我想僅僅是能夠破解的URL的末尾/ JA-JP,它會顯示出在日本的看法。它似乎不正確的路線。然後,我真的認爲我的觀點很糟糕,並且手工編碼了這些鏈接......我無法讓助手首先輸出正確的鏈接......並陷入了手動編碼它們的壞習慣。所以,我不得不重新編碼每一個鏈接 - 最終破解語言變量。

第二個想法 ...好的,使用jQuery將語言變量附加到所有錨點的href。這似乎過於笨拙,難以在某些情況下的HREF被隱藏,直到需要,等等

所以......在這一點上我已經決定只是不惜一切代價。什麼是在兩種語言之間切換的最優雅的方式 - 不使用資源文件?我只想根據語言在2個視圖中進行選擇。

我是否會重寫每一個必須使用Html幫助程序的鏈接,然後讓路由工作?那麼在BaseController中,如果語言沒有任何價值,只需將語言設置爲英語?

任何意見非常感謝,謝謝。

+0

看到了這一點?:http://oddiandeveloper.blogspot.com/2008/11/localization-with-aspnet-英文內容mvc.html – grenade 2009-07-23 08:31:10

回答

2

我認爲最簡單的和用戶友好的方法之一是使用域(子域實際上),以確定它說什麼語言。它不需要在Html幫助程序(那些HTML.ActionLink)中幾乎改變任何東西,因爲它只對域有效。而且,用戶看起來很整潔,看到該域名時,他們確切知道它應該是什麼語言,並且不會使URL過長。你所需要做的就是在語言切換器上做一些工作。

不管用什麼辦法,我強烈反對使用第二個想法,因爲你不能否認(甚至0.1%)的人沒有JavaScript來的工作訪問您的日本網站,對不對?

+0

正確...甚至不是一個真正的想法,只是一個想法。我也喜歡子域名......嗯。如果我做子域名,我想要像en.domain.com || jp.domain.com。我如何從域名中獲取語言變量? – Chaddeus 2009-07-23 07:40:49

+1

這裏是一篇關於MVC中子域路由的文章:http://blogs.securancy.com/post/ASPNET-MVC-Subdomain-Routing.aspx 基本上,子域轉換爲文化,你可以簡單地把這些規則放在web.config文件。因此,例如,您可以將en.domain.com映射到en-us等等。 – xandy 2009-07-23 15:38:22

+0

哦,還有一件事要補充。我只記得維基百科使用語言的子域...雖然它不是簡單的語言之間的翻譯。 – xandy 2009-07-23 15:40:46

1

我們使我們的網站,它不只是一個需要不同需要改變,但對於我們的國際客戶的意見,自己的語言時發現。 I.E.我們的香港辦事處需要不同數量的空間和數據來查看數據,然後我們的英國辦事處。只是稍微改變了視圖佈局的語言,並給我帶來了一些麻煩。

What we ended up doing was this

隨着編碼可以覆蓋路由到您的意見,並根據你喜歡的任何情況發送英語一組的看法和日本的另一個非常小的量。無需更改URL或做它的客戶端,甚至改變你的行動。

編輯:重新閱讀後,我認爲這將是非常適合您的網站,因爲您使用兩套視圖,每種語言。

2

不要把語言放在路線的盡頭。把它放在開頭。 這使得使用可能具有可選參數的不同路由很容易。

語言設置應該只改變tranlation。

如果你的日本用戶有特定的規則(價格,交貨選項等),那麼你應該實現語言和國家的具體情況。一個國家是你在「多租戶應用程序」下找到的東西,它不會被瀏覽器語言檢測到。

日本用戶可以瀏覽英文網站,並看到一個JAPANES翻譯

routes.MapRoute(
     // Route name 
     "LocalizedRoute", 
     // URL with parameters        
     ("{language}/{controller}/{action}"), 
     // Parameter defaults 
    new 
    { 

      action = "Index", 
      language = "de" 

     }, 
        //Parameter constraints 
     new { language = @"en-us|ja-jp" }