2009-05-28 53 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