2009-05-28 21 views
4

某些方法(如string.Format()或.Parse()需要IFormatProvider。你如何提供它?如何處理本地化/ CultureInfo

  • 在封閉的環境中的應用程序(你知道,本地化將永遠不會被要求),你只是跳過它,並呼籲沒有的IFormatProvider的方法呢?

  • 在可能獲得本地化的應用程序中,您是否認爲每個方法調用的正確值並將其設置在那裏?那可能是'CultureInfo.CurrentCulture'或'CultureInfo.CurrentUiCulture'。

  • 或者你是否使用像'MyUiCultureInfo'和'MyCultureInfo'這樣的全局變量能夠通過改變它們的值來切換本地化?你如何以及在哪裏存儲這些變量?

  • 當我開發庫或框架時有什麼需要考慮的 - 在這種情況下如何處理本地化?

回答

6

我總是將CurrentThread.Current(Ui)Culture設置爲我們(ASP.NET)應用程序中的正確值。通常根據用戶的偏好或配置文件中存儲的默認值(如果用戶未定義首選項)在每個請求開始時完成。

在設置當前線程的這些屬性之後,即使沒有爲這些方法提供IFormatProvider,也可以停止考慮它 - 數字,日期等將被正確格式化或解析。否則,你必須確保正確的IFormatProvider被傳遞到任何地方。

我是一個圖書館的案例,我認爲它應該只是依靠這些東西的應用程序,而不應該擔心這些東西。

+1

你關掉相應的FxCop規則?他們似乎無法識別您的解決方案。 – tanascius 2009-05-28 11:42:22

+0

我沒有使用FxCop! – M4N 2009-05-28 12:34:34

1

我將當前的文化設置爲美國英語,因爲在我國很少有'聰明'的人認定小數點分隔符是逗號。有時十進制數與','和有時與'。'。並非所有計算機的區域設置配置都正確,並且不應該依賴於該

要設置應用程序範圍的設置:

Application.CurrentCulture = new CultureInfo("en-US"); 
Application.CurrentCulture.NumberFormat.NumberDecimalSeparator = "."; 
1

正如你說的,你可以在一個封閉的環境中調用,而不提供任何的IFormatProvider方法。

正如你也寫,你可以提供一個CultureInfo對象是這樣的:

 Console.WriteLine(String.Format(CultureInfo.CurrentCulture, "{0}", DateTime.Now)); 
     Console.WriteLine(String.Format(new CultureInfo("en-US"), "{0}", DateTime.Now)); 

這會爲我展示兩種不同的方式日期,因爲我的CurrentCulture是瑞典這樣的:

2009-05 -28 13點12分43秒

2009年5月28日下午1點12分43秒

CultureInfo.CurrentCulture處理日期等的格式化,並從setti供應當前機器上。

CurrentCulture.CurrentUiCulture與翻譯的本地化有關。意思是在窗口中的菜單等顯示。

我的猜測是方法的默認行爲是使用CurrentCulture,如果沒有提供。

0

我總是將Culture屬性放在ASPX或Master頁面的開始位置,它爲我完成所有轉換。我從來不需要做任何硬編碼或日期/時間轉換爲自己需要的文化......

. 
<%@ Page Language="C#" ..etc... Culture="en-AU" %> 
. 

Simplez