你如何处理本地化/ CultureInfo

时间:2009-05-28 10:49:48

标签: c# localization

某些方法(如string.Format()或.Parse())需要IFormatProvider。你是如何提供的?

  • 在封闭环境应用程序中(您知道永远不需要本地化),您是否只是跳过它并在没有IFormatProvider的情况下调用方法?

  • 在可能已本地化的应用程序中,您是否考虑了每个方法调用的正确值,并将其设置在那里?这可能是'CultureInfo.CurrentCulture'或'CultureInfo.CurrentUiCulture'。

  • 或者您是否使用“MyUiCultureInfo”和“MyCultureInfo”等全局变量来通过更改其值来切换本地化?你如何以及在哪里存储这些变量?

  • 开发库或框架时有什么需要考虑的 - 在这种情况下如何处理本地化?

4 个答案:

答案 0 :(得分:6)

我总是将CurrentThread.Current(Ui)Culture设置为我们(ASP.NET)应用程序中的正确值。这通常在每个请求开始时根据用户的首选项或存储在配置文件中的默认值(如果用户尚未定义首选项)完成。

设置当前线程的这些属性后,您可以停止考虑它 - 数字,日期等将被正确格式化/解析,即使没有为这些方法提供IFormatProvider也是如此。否则,您必须确保在任何地方传递正确的IFormatProvider。

我是一个库的情况,我认为它应该只依赖于这些东西的应用程序,而不应该担心这些事情。

答案 1 :(得分:1)

我将当前的文化设置为美国英语,因为在我的国家,很少有“聪明”的人认为小数点分隔符是逗号。有时十进制数用',',有时用'。'。并非所有计算机都配置了正确的区域设置,您不应该依赖

设置应用程序范围的设置:

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

答案 2 :(得分: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

5/28/2009 1:12:43 PM

CultureInfo.CurrentCulture处理日期等的格式化,并且是从您当前机器上的设置提供的。

CurrentCulture.CurrentUiCulture与翻译本地化有关。这意味着窗口中菜单等显示的内容。

我的猜测是,如果没有提供,则方法的默认行为是使用CurrentCulture。

答案 3 :(得分:0)

我总是将Culture属性放在ASPX或Master页面的开头,它会为我完成所有转换。我永远不需要做任何硬编码或将日期/时间转换为我自己所需的文化......

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

Simplez