关于对文化不敏感和对文化不敏感,我已经花了很多时间,我不知道它们到底有什么区别。
在某些书中,他们将说明符分为两类:
对文化不敏感的日期/时间格式字符串和
文化敏感的日期/时间格式字符串
我知道说明符,但是除了敏感和不敏感之外,我什么都不知道。
有人可以指导我吗?
答案 0 :(得分:3)
首先,我将引导您访问.NET Globalization & Localization以获取更多信息。
在某些国家和地区,某些价值观/实体的处理方式有所不同。这些实体包括货币符号,数字分隔符,日期等。在向用户显示此数据时,必须以一种对他们有意义的方式对其进行格式化。例如,如果您在贷款摊销应用程序中按如下方式显示钱:
Console.WritLine("$" + amount.ToString());
这仅在使用美元的国家/地区有效。而且没有其他格式。要使这种文化敏感,您将必须采用这种方式...
Console.WriteLine(amount.ToString("C"));
通过这种方式,.NET将为运行应用程序的区域性使用正确的货币符号,数字分隔符和小数点。
在某些情况下,您需要在特定区域性中显示此类数据。这样做会改变其显示方式,但是您可以按以下方式提供要使用的区域性...
static void Main(string[] args)
{
decimal foo = 23434534.53M;
Dump(foo);
var culture = CultureInfo.CreateSpecificCulture("en");
CultureInfo.CurrentCulture = culture;
Dump(foo);
culture = CultureInfo.CreateSpecificCulture("es");
CultureInfo.CurrentCulture = culture;
Dump(foo);
culture = CultureInfo.CreateSpecificCulture("en-ZA"); // South Africa
CultureInfo.CurrentCulture = culture;
Dump(foo);
}
static void Dump(decimal value)
{
Console.WriteLine(value.ToString("C"));
Console.WriteLine(DateTime.Now.ToLongDateString());
}
在运行时更改区域性时,后续调用以货币显示值将更改货币符号,在某些情况下该货币符号的位置,数字分隔符和小数点。
这也会影响数据的显示方式,如您所见。
您还可以使用它来更改UI中显示的文本。如果您的应用程序支持多种语言,例如美国英语,英式英语,西班牙语和法语,则无需事先知道这些语言。此外,您不能再硬编码字符串文字,例如“ First name:”。一些简单的事情可能会有所不同,例如颜色的拼写(英国英文颜色)。对于那些不会说英语但在相应国家受到重视的人来说,这样的事情可能无关紧要。例如,如果您的应用向儿童显示正确的拼写,那么您希望它正确地显示在所处的位置。
在这种情况下,您可以设置UI文化并使用资源(resx)文件放置字符串。在运行时,您从资源文件中加载字符串,.NET运行时可以根据文化来加载正确的resx文件它检测到PC设置为。如果没有匹配项,它将恢复为您的默认区域性。
在测试应用程序中,我创建了2个资源文件,一个名为Strings.resx,另一个名为Strings.es.resx。第一种是默认语言,另一种是西班牙语。在向用户打招呼时,我不必对打招呼进行硬编码,但可以按以下方式使用它
static void Main(string[] args)
{
Console.WriteLine(ConsoleApp1.Strings.HelloString);
CultureInfo.CurrentUICulture = CultureInfo.CreateSpecificCulture("es");
Console.WriteLine(ConsoleApp1.Strings.HelloString);
}
导致以下结果
这些技术可以共同帮助您创建对用户的语言和文化敏感的应用程序。如果您需要覆盖它,还可以通过指定在显示数据时使用哪种区域性来有意识地做到这一点。对变化的实体进行硬编码对区域性不敏感,并且无论运行该计算机的语言环境如何,它们都将显示相同的内容。
答案 1 :(得分:2)
与用户直接交互时,应使用对文化敏感的操作。与后端流程和交换系统(包括持久数据)进行交互时,应始终使用对文化不敏感的操作。支持文化特定操作的数据可能会由于多种原因而发生变化。支持不区分文化的操作的数据永远不会更改,因此可以安全地保存和交换。