本地化变量的最佳方法

时间:2014-01-22 07:07:42

标签: c# asp.net localization

我阅读了更多与本地化最佳实践相关的文章。从它们我们可以确定始终UTCtime最适合处理日期时间。就像我们有一些指导,如字符串,ui等的概念。

但我也发现有一篇文章说我们需要处理字符串/整数转换。我说得不错。以下是解释

“除非不支持,否则请务必在调用ToString()时始终传递CultureInfo。这样就可以评论您的意图。例如:如果您在内部使用某个数字,并且由于某种原因需要将其转换为字符串使用:

int i = 42;
var s = i.ToString(CultureInfo.InvariantCulture);

对于将向用户显示的数字:

var s = i.ToString(CultureInfo.CurrentCulture); // formatting culture used

这同样适用于Parse(),TryParse()甚至ParseExact() - 如果没有正确使用CultureInfo,可能会引入一些讨厌的错误。这是因为微软的一些贫穷的人,充满好意,决定将CultureInfo.CurrentCulture视为默认值(如果你没有传递任何东西就会使用它) - 毕竟当有人使用ToString时( )他/她想要将它显示给用户,对吧?事实并非总是如此 - 例如,尝试将应用程序版本号存储在数据库中,然后将其转换为Version类的实例。祝好运。 “

但为什么需要这样做呢。所以在所有数据类型中我们需要转换/这样做吗?这有什么好处,因为我得到了与添加文化信息相同的结果。

1 个答案:

答案 0 :(得分:1)

如果你喜欢这个

double i = 42.42;
var s = i.ToString();

并在您的English PC(美国或英国区域)上运行,然后s

42.42

现在在GermanRussian PC上运行,突然s成为

42,42

这个不同的小数点可能导致许多地方出现无数错误(当您保存/加载数据,显示值和读取用户输入时等)。

如果您的软件将在不同的区域设置上运行,那么一种可能的最终解决方案是,ColtureInfo.InvariantCulture始终在operate数据时使用CultureInfo.CurrentCulture,并且仅在需要用户间隔int时使用 public static string F(this string @this, params object[] args) { return string.Format(CultureInfo.InvariantCulture, @this, args); }

"{0} {1:0.#}".F(Msg.Localization.User.Prompt, i); 值的问题可能是千位分隔符(可能缺少,空格,逗号,点等)。

我自己创建扩展方法,例如:

Msg

所以我只写

{{1}}

其中{{1}}是本地化的消息类。