2014-01-22 79 views
1

我阅读了更多与本地化最佳实践相关的文章。从他们身上我们可以看出,始终UTC时间最适合处理日期时间。就像那样,我们有一些指导,比如认识字符串,用户界面等。本地化变量的最佳方法

但我还发现一篇文章说我们需要处理字符串/整数转换。我没有把它弄好。以下是解释

“确保在调用ToString()时总是通过CultureInfo,除非它不被支持。这样你就可以评论你的意图了,例如:如果你在内部使用某个数字,将其转换为字符串使用:

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

对于将要显示给用户的使用号码:

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

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

但是,为什么这是必要的。因此,在所有datatatypes我们需要转换/做到这样吗?什么是advatages这个,因为我得到了相同的结果与出增加的文化信息。

回答

1

如果你这样做这样

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

English PC上的运行它(美国或英国的语言环境),然后s

42.42 

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

42,42 

此不同的小数点可能会导致在很多地方存在无数的错误(当你保存/加载数据,当你表现出的价值观和读取用户输入等)。

一个可能的最终解决方案,如果你的软件将在不同的语言环境中运行,始终是当你operate数据,只有当需要用户interruction CultureInfo.CurrentCulture使用ColtureInfo.InvariantCulture

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是一个本地化的消息类。

+0

很好。同样,本地化需要特别考虑的是什么? – Akhil

+0

[This](http://stackoverflow.com/a/20259470/1997232)可能是最基本的本地化。但我自己更喜欢反思,以实时翻译UI。为了简化消息传递(显示本地化消息或控件的动态文本),反射也是最好的,只需创建一个类,以* default *(通常是英语)语言持有静态字符串消息条目(在子类中传播以便于引用) 。当语言改变时,用* translation *填充该类(从我讨厌的卫星程序集加载,或包含编辑友好本地化的特殊语言文件)。 – Sinatr

+0

是我使用了单独的类库项目并使用反射调用卫星程序集。基于文件的resurce管理器。在这里,我们讨论了文化特定的过程,如数据时间处理,变量等。同样,任何其他过程要考虑? – Akhil