Die*_*eco 55 .net globalization internationalization
是什么区别CurrentCulture,InvariantCulture,CurrentUICulture和InstalledUICulture从System.Globalization.CultureInfo?
Paw*_*yda 108
我会尝试给出一个比这个更有见地的答案.
CurrentCulture应该用于格式化.也就是说,数字,货币,百分比,日期和时间应始终使用此文化格式化,然后再向用户显示.这里几个例子:
const string CURRENCY_FORMAT = "c";
const string PERCENTAGE_FORMAT = "p";
DateTime now = DateTime.UtcNow; // all dates should be kept in UTC internally
// convert time to local and format appropriately for end user
dateLabel.Text = now.ToLocalTime().ToString(CultureInfo.CurrentCulture);
float someFloat = 12.3456f;
// yields 12,3456 for pl-PL Culture
floatLabel.Text = someFloat.ToString(CultureInfo.CurrentCulture);
// yields 12,35 z? for pl-PL Culture - rounding takes place!
currencyLabel.Text = someFloat.ToString(CURRENCY_FORMAT, CultureInfo.CurrentCulture);
// yields 1234,56% for pl-PL Culture - 1.0f is 100%
percentageLabel.Text = someFloat.ToString(PERCENTAGE_FORMAT, CultureInfo.CurrentCulture);
Run Code Online (Sandbox Code Playgroud)
需要注意的一件重要事情是,您不应该首先使用float或double存储与货币相关的信息(decimal是正确的选择).
另一个常见用例CurrentCulture是Locale-aware parsing.您的应用程序应始终允许用户以其区域格式提供输入:
float parsedFloat;
if (float.TryParse(inputBox.Text, NumberStyles.Float, CultureInfo.CurrentCulture, out parsedFloat))
{
MessageBox.Show(parsedFloat.ToString(CultureInfo.CurrentCulture), "Success at last!");
}
Run Code Online (Sandbox Code Playgroud)
请注意,我总是提供IFormatProvider参数,尽管它是暗示和假设的CultureInfo.CurrentCulture.原因是,我想与其他开发人员沟通:这是将向最终用户显示的内容.这是FxCop将此参数省略为错误的原因之一.
另一方面,InvariantCulture应该用于可靠地将上述类之一转换为其文本表示.所以,如果你想例如传输DateTime,float,double或通过网络相似的对象,将其存储到数据库或某种形式的文本文件(包括XML)的,你应该始终使用InvariantCulture:
float someFloat = 1234.56f;
// yields 1234.56
string internalFloat = someFloat.ToString(CultureInfo.InvariantCulture);
DateTime now = DateTime.UtcNow;
// yields something like 04/16/2011 19:02:46
string internalDateAndTime = now.ToString(CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)
这里需要注意的是,提供的日期/时间格式InvariantCulture实际上与en-US完全相同.虽然它是可靠的,但它并不完全正确.真正应该使用的是ISO8601可互换日期和时间格式.由于某种原因,微软甚至没有提供这样的模式(最接近的是可排序模式 - "s"和通用模式 - "u",它只类似于ISO8601格式),你需要创建自己的模式:
const string iso8601Pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'";
string iso8601Formatted = now.ToString(iso8601Pattern);
Run Code Online (Sandbox Code Playgroud)
非常重要的注意事项:这里IFormatProvider实际需要,因为省略此参数可能会导致严重错误.我曾经不得不修复法语操作系统的缺陷.代码是这样的:
float dbVersion = // some kind of logic that took float from database string versionString = dbVersion.ToString(); // culture-aware formatting used Version ver = new Version(versionString); // exception thrown here
原因很简单:在法语操作系统上格式化的浮点数(带有法语区域格式)格式化为类似10,5,Version类需要文化不变输入.
CurrentUICulture负责为您的应用程序加载适当的可翻译资源.也就是说,它应该用于显示正确的文本消息,颜色和图像.
在Asp.Net应用程序中,如果由于某种原因需要实现CSS本地化机制(能够覆盖每种语言的CSS定义),那么这CurrentUICulture是一种很好的方法(前提是您实际从Web浏览器中读取此属性).
同样,如果要实现语言切换机制,CurrentUICulture则应该重写该机制.
InstalledUICulture连接到默认OS UI区域设置.正如MSDN所说:
此属性相当于Windows API中的GetSystemDefaultUILanguage.
要真正理解这个属性是什么,我们需要深入研究一些理论.有不同的Windows产品系列:
对于单语言产品系列,InstalledUICulture将始终返回操作系统语言,而对于MUI,它应始终返回英语(美国),即en-US.它有用吗?我不知道,我从来不需要这样的信息.我个人没有看到利用这个属性的程序.
| 归档时间: |
|
| 查看次数: |
29158 次 |
| 最近记录: |