如何为Windows中的其他语言环境设置格式?
例如,在托管的C#代码中,我会尝试使用DateTime
区域设置呈现en-US
:
String s = DateTime.Now.ToString(CultureInfo.CreateSpecificCulture("en-US"));
TextRenderer.DrawText(
e.Graphics, s, SystemFonts.IconTitleFont,
new Point(16, 16), SystemColors.ControlText);
当我的计算机的区域设置为en-US
时,它可以正常工作:
当计算机的区域设置为de-DE
时,它甚至可以正常工作:
但是当我的计算机的区域设置为ps-AF
时,它完全崩溃了:
注意:我的示例代码在.NET中,但也可以是原生的。
更新:在致电System.Threading.Thread.CurrentThread.CurrentCulture
之前尝试将en-US
设为DrawText
:
var oldCulture = System.Threading.Thread.CurrentThread.CurrentCulture;
System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
try
{
// String s = DateTime.Now.ToString(CultureInfo.CreateSpecificCulture("en-US"));
String s = DateTime.Now.ToString();
TextRenderer.DrawText(e.Graphics, s, SystemFonts.IconTitleFont, new Point(16, 16), SystemColors.ControlText);
}
finally
{
System.Threading.Thread.CurrentThread.CurrentCulture = oldCulture;
}
没有帮助。
Ace赌注。
更新二:
来自Michael Kaplan的博客文章:
Sometimes, GDI respects users (even if no one else does!)
GDI并没有提供关于格式化的错误或与区域设置相关的任何事情,只有一个例外:
数字替换
每次去渲染文本时,它都会抓取用户区域设置中的数字替换设置(包括用户覆盖信息),并使用该信息来决定如何显示数字。
并且无法在GDI使用它们的级别覆盖这些设置。
我想知道 Chrome 如何管理它。当我在这里写数字时,在stackoverflow问题中,Chrome使用拉丁数字呈现它们:
0123456789
请参阅:
答案 0 :(得分:1)
您所看到的是由于系统的区域设置为ps-AF
时出现的digit substitution。
我相信没问题 - 这种语言环境的用户习惯于以这种方式看到数字。
通常这样做的方式略有不同,例如参见here,但我实际上并不认为这应该有所不同:
String s = DateTime.Now.ToString(new CultureInfo("en-US"));
答案 1 :(得分:0)
另一种方法是将Thread.CurrentCulture
设置为您想要的区域设置。
即。这样做:
Thread.CurrentCulture = new CultureInfo("en-US");
然后您可以用以下代码替换代码的第一行:
String s = DateTime.Now.ToString();
我不太确定,但我相信这会解决数字替换问题,因为DrawText现在将基于en-US
文化,而不是ps-AF