2013-08-30 69 views
7

例如,如果用戶將其瀏覽器設置爲fr-CA,但我的網站可以選擇使用其他語言(如英語)查看網頁。我如何重寫accept-language頭文件,以便使用指定的語言重新加載?如何更改瀏覽器接受語言

我試圖簡單地改變Accept-Language頭,然後重新加載頁面,但我不知道如何做到這一點。有什麼想法嗎?

更新: 好吧,所以我讓人們向我解釋本地化是什麼,所以我一定不會問這個問題。

我的網站目前在web.config中已將全球化設置爲auto,因此它會自動將線索文化設置爲應用程序啓動時協商的任何語言。默認情況下,用戶的瀏覽器將根據瀏覽器的語言設置發送接受語言頭文件,就像下面指出的那樣,普通用戶不知道這些頭是什麼,在哪裏或如何改變它們。無論如何,讓我們調用瀏覽器首先處理語言標題的默認行爲。但是,作爲一項功能,我希望允許用戶從頁面更改此接受語言標題。例如,在應用程序中,語言設置通常由cookie或用戶首選項(通過配置文件設置)確定,但在登錄/登錄頁面(特別是如果這是您第一次登錄某臺計算機),我有不知道你是誰,所以我只有你的瀏覽器設置。但假設您正在商務旅行,並從美國計算機訪問此網站,頁面以英文加載,您無法閱讀,而且您也不知道如何更改瀏覽器語言。選擇從下拉菜單或圖標或其他選項選擇語言會不太好?我認爲這將是。

因此,爲了做到這一點,我需要能夠改變該接受語言頭並重新加載頁面。這是我不知道如何繼續。

我試過navigator.language = <selected language>xhr.setRequestHeader但這些似乎並不奏效。

+0

不知道它是否有幫助,但我使用Accept-Language傳遞相關內容並提供回退,如果服務器上沒有可用的Accepted-Language區域設置 – Bernhard

回答

4

我可能是錯的,但區域設置不是你在代碼中改變的東西。 這由瀏覽器的用戶配置決定。 如果您使用的是HttpClient,那麼您肯定會將所需的Accept-Language頭的值發送給服務器,但不要期望從您的代碼中更改此值,並使其在所有源自瀏覽器的請求中生效。

通常的做法是根據用戶的語言偏好設置自定義Cookie。默認情況下,您應該使用Accept-Language標頭中的值填充此Cookie。 在ASP.NET MVC有一個設置,以便雙方Thread.CurrentThread.CurrentCulture和Thread.CurrentThread.CurrentUICulture獲得的根據用戶的瀏覽器配置設置:

<system.web> 
    <globalization enableClientBasedCulture="true" uiCulture="auto" culture="auto" /> 
</system.web> 

然後,您可以創建一個將檢查一個ActionFilter自定義語言cookie,並相應地設置Thread.CurrentThread.CurrentUICulture

Thread.CurrentThread.CurrentUICulture用於確定代碼應該使用哪些資源。雖然Thread.CurrentThread.CurrentCulture用於所有數字和日期處理。

這是一個動作過濾器可能會看起來怎麼樣:

public class LanguageActionFilter : IActionFilter 
{ 
    public void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
    } 

    public void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var langCookie = GetOrSetLanguageCookie(filterContext.HttpContext); 
     var culture = new CultureInfo(langCookie.Value); 

     Thread.CurrentThread.CurrentUICulture = culture; 
    } 

    private HttpCookie GetOrSetLanguageCookie(HttpContextBase context) 
    { 
     var cookie = context.Request.Cookies[Constants.LanguageCookieName]; 
     if (cookie == null) 
     { 
      //set the cookie for first time 
      cookie = new HttpCookie(Constants.LanguageCookieName, Thread.CurrentThread.CurrentUICulture.Name) 
      { 
       Expires = DateTime.Now.AddYears(1), 
       Path = "/" 
      }; 
      context.Response.Cookies.Add(cookie); 
     } 
     return cookie; 
    } 
} 

Pleae注:

  • 甚至當你的用戶選擇,讓我們說 「ES-Ar」 是在你的界面,並您爲該用戶設置相應的UICulture,如果用戶的瀏覽器配置了爲該用戶發佈的en-US日期,則將使用英語慣例進行解析,因此浮點數將會是。

IE:如果在美國的用戶設置爲en_US瀏覽器選擇使用你的應用程序的接口西班牙,當該用戶發佈信息到服務器的日期,如:

2015年1月5日將在1月5日解析服務器,而不是5月1日。

像1900這樣的數字將在服務器中被解析爲1900而不是1.900。

我學會了這個難題。 我有一個問題here這是從來沒有回答。

如果您有任何問題,請讓我知道。

+0

好的,所以這實際上是我的網站設置的方式在web.config中使用自動語言環境。我使用這個,因爲它會照顧語言優先列表。但我的問題是如何覆蓋它。默認情況下,瀏覽器發送這些語言標題,我的網站會盡其所能。我想覆蓋瀏覽器發送的內容,這樣我就可以讓用戶選擇手動,因此請將它作爲功能。 – Sinaesthetic

+0

在附註上,我知道如何在jQuery中對ajax調用進行更改,但我真的需要通過回發來做到這一點。即「更改標題並重新加載此頁面」。 – Sinaesthetic

+0

我在第一行回答了你的問題;對不起,如果我對細節過分了解,我認爲在沒有完整圖像的情況下會有幫助。 你不能在你的代碼中改變它。你可以肯定的可以改變這個頭部的請求你的代碼啓動,但你不能全局做到這一點,所以在瀏覽器中啓動的每個後續請求現在都有用戶語言選擇的專用頭。 –

3

Accept-Language頭是一個請求頭,所以它是由瀏覽器(或其他客戶端軟件)發送的。在你的服務器上,你可以不做任何事情而忽略它。也就是說,它本身沒有影響;全部取決於你的服務器端代碼是否能識別它並採取一些行動。所以你不能也不需要改變瀏覽器發送的頭文件。

用戶可以使用瀏覽器的首選項設置更改瀏覽器發送的Accept-Language標頭。例如,在Chrome中,進入「設置」,點擊「顯示高級設置...」,向下滾動到「語言」,點擊「語言和輸入設置...」,然後添加語言並拖動以訂購。

這不是人們經常做的事情,大多數人都不知道這些設置的存在。所以瀏覽器發送的通常是一些工廠默認值。它們可能很奇怪,例如根據協議,Accept-Language: fr-CA意味着「如果你,親愛的服務器,有我要求的資源的不同語言版本,請給我加拿大法語;如果你沒有,我不關心你給的版本「。這意味着如果資源以普通法語(法語法語)或英語存在,這些資源就不會比Swahili或Volapük版本更受歡迎。所以一個更明智的標題通常是Accept-Language: fr-CA, fr, en,這在實踐中應該如何處理Accept-Language: fr-CA