2013-04-04 36 views
1

我們正在構建支持多種語言的網站。我們已創建資源來支持fr,de和en-US,默認情況下是en-US。我已添加:ASP.NET中的自動語言文化選擇和回退算法

<system.web> 
    <globalization 
     uiCulture="auto" culture="auto" 
     requestEncoding="utf-8" 
     responseEncoding="utf-8" 
     enableClientBasedCulture="true" /> 
    ... 
</system.web> 

到我的web.config文件。如果我在IE或Chrome中將語言設置爲fr,de或en-US,我會得到預期的語言。如果我將語言設置爲ar-EG,我也會按照預期獲得en-US。

如果我將我的語言設置爲fr-FR,但不將fr包含在接受的語言列表中,即使我告訴瀏覽器我更願意接受de以泛化fr(即相反FR-FR)。這看起來與RFC相反,但並不令人意外,因爲IE在法國默認爲fr-FR,在德國爲de-DE,並且不適用於不自動概括文化的網站。

但是,如果我告訴瀏覽器我接受ar-EG和fr,站點默認爲en-US - 即使Accept-Language頭指定我將接受fr具有更高優先級。我在瀏覽器中捕獲了請求標題,以確保我要求的所有語言都以正確的優先級發送。

看來ASP.NET只是在查看Accept-Language頭文件中指定的第一種語言。是否在任何地方指定了ASP.NET語言匹配算法?有沒有辦法指定ASP.NET/MVC應該檢查Accept-Language列表中的所有語言以確定最佳的語言?還是我必須編寫自己的語言匹配代碼?

+0

- 是的,在MSDN它指出「有ASP.NET設置UI文化和文化的在當前瀏覽器設置中指定的第一種語言,將UICulture和Culture設置爲自動「,正是您所看到的 - 請參閱http://msdn.microsoft.com/en-us/library/bz9tc508(v=VS.100 ).aspx – Joe 2013-04-05 15:04:12

回答

1

好吧,現在還沒有人回答,我提出了我的建議。有一個更好的或至少更美麗的解決方案,但爲了我的需要,這已經足夠了。剛剛成立的文化你Application_AcquireRequestState()事件中:「在任何地方都是指定的ASP.NET語言匹配算法」

protected void Application_AcquireRequestState() 
{ 
    var language = "whatever"; // default fall back 
    if (request.UserLanguages.Length > 0) 
    { 
     var acceptedLangs = new List<string> {"de", "en"}; 
     var langs = request.UserLanguages.Where(l => acceptedLangs.Any(al => al.Equals(l.Substring(0, 2)))); 
     language = langs.FirstOrDefault(); 
    } 

    // TODO: may be better inside a try..catch block 
    var culture = new CultureInfo(language); 
    Thread.CurrentThread.CurrentUICulture = culture; 
    Thread.CurrentThread.CurrentCulture = culture; 
} 
+0

我想我將不得不按照你的建議寫我自己的,但你的例子基本上是ASP.NET正在做的。我需要做的是查看'request.UserLanguages'中的語言,解析出每個語言的質量值,並使用RFC指定的規則找到與我們支持的語言最匹配的語言。這不是火箭科學,只是令人失望的是該框架不支持標準行爲。 – wrdieter 2013-04-05 13:06:35

+0

@wrdieter,我更新了我的答案,只是搜索接受的語言。 – 2013-04-05 13:16:21

+0

感謝您的幫助,但它比這更復雜。語言可以(也常常是)具有「質量」規格,用戶可以指定通配符子標籤,語言標籤可以請求特定的腳本樣式等。RFC2616列出了Accept-Language標頭的規則,BCP 47(RFC5646和RFC4647)描述了更多關於語言標籤以及如何匹配它們的內容。寫很多時候很有用的東西是很容易的,而且總是很難做到。我希望框架能夠爲我處理,但喬指出的文檔並沒有。 – wrdieter 2013-04-08 12:42:36