本地化日期格式描述符的最佳方法是什么?
任何来自不使用mm/dd/yyyy格式的文化的人都知道,必须以这种格式输入日期是很烦人的..NET框架提供了一些非常好的本地化支持,因此根据用户文化解析日期是微不足道的,但是您通常还希望显示有关所需格式的有用提示(尤其是区分yy和yyyy,它们可以互换)大多数文化).
以对大多数用户有意义的方式执行此操作的最佳方式是什么(例如,由于案例的变化以及一到两个字母之间的切换,dd/M/yyy会让人感到困惑).
我不知道为什么这不起作用:
string s = "12,00 €";
var germanCulture = CultureInfo.CreateSpecificCulture("de-DE");
decimal d;
if (decimal.TryParse(s, NumberStyles.AllowCurrencySymbol, germanCulture, out d))
{
// i want to get to this point
Console.WriteLine("Decimal value: {0}", d);
}
Run Code Online (Sandbox Code Playgroud) 好的,这是一个奇怪的.
我正在尝试使用以下方法创建自定义文化:
using System.Globalization;
...
var x = new CultureAndRegionInfoBuilder();
Run Code Online (Sandbox Code Playgroud)
但我得到了令人讨厌的红色Resharper错误没有选项.
命名空间"System.Globalization"中不存在类型或命名空间名称"CultureAndRegionInfoBuilder"
发生了什么事,我错过了什么吗?在谷歌上找不到任何帮助...
我有这个代码,当我试图不存在的文化时,我得到例外.
是否存在TryGetCultureInfo返回bool值的方法?我不想使用try-catch声明
CultureInfo culture = CultureInfo.GetCultureInfo(cultureCode);
if (culture == null)
{
culture = CultureInfo.GetCultureInfo(DefaultCultureCode);
}
Run Code Online (Sandbox Code Playgroud) 我有一种情况需要将我的进程'语言环境设置为en-US.
我知道如何为当前线程执行此操作:
System.Threading.Thread.CurrentThread.CurrentCulture =
System.Globalization.CultureInfo.CreateSpecificCulture("en-US");
Run Code Online (Sandbox Code Playgroud)
但我的应用程序用于BackgroundWorkers进行一些处理,并且这些工作线程的区域设置似乎不受上述对其产生主线程的更改的影响.
那么如何在我的应用程序中为所有线程设置区域设置而不在每个线程中手动设置?
我选择将其视为一个问题,因为它在原帖的评论中产生了如此多的争论.
很有趣的是,很多SO(开发人员)的人都没有获得本地化.以下是我应该如何运作的看法:
在我查看用户的文化偏好时,我所看到的所有浏览器(以及那里的.NET开发人员)都采用以下格式:language-Culture.
所以我们有:
有关.NET框架支持的完整列表,请参阅MSDN.
当我访问一个网站时,它知道我需要来自英语的英语,它知道我对它倾向于英国感兴趣(数字格式化,日期格式化).因此,当我去google.com并且它带我去google.de(因为我的IP地址),如果google.de用英语向我显示所有内容但完全错误,因为google.de是德语的.我几乎无法控制我的IP地址,但可以完全控制我的语言和文化设置.如果你有兴趣,微软的新搜索引擎(bing.com)会妥善处理事情.让我们希望微软可以学习如何进行搜索以及谷歌或谷歌可以学习本地化以及微软;)
MSDN在这里有另一篇好文章以获取更多信息
那么您对网站应如何处理本地化的建议是什么?
language-agnostic globalization localization user-experience
web.config允许全球化标记:此设置将为整个ASP.NET应用程序设置全球化.
此标记是否也适用于标准表单应用程序中的app.config?如果是的话......它应放在哪里?
或..是否有另一种方法来为整个表单应用程序设置全球化.包括dll和所有线程?
我想确保我的应用程序中的某些数字打印时没有任何分隔符,分组等,无论当前环境如何.似乎以下两种方法产生相同的结果(可能更多):
123456789.ToString("0");
123456789.ToString(CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)
你知道任何边缘情况或怪癖吗?哪一个更"正确"?你会用哪一个?
我曾经使用过第二个,但最近我发现了第一个,并开始使用它,因为它不需要额外的using System.Globalization.
目前,我有一个全局过滤器GlobalizationFilter,用于检查路由值,cookie和浏览器语言标头,以确定请求的正确文化设置:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// determine cultureInfo
Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
}
Run Code Online (Sandbox Code Playgroud)
这一切都有效,但模型绑定过程似乎发生在全局过滤器之前,因此模型绑定器不会考虑文化设置.
这导致解释双值,DateTime值等的问题.
我可以将文化检测代码移到其他位置,但我不喜欢我的任何选择:
应用程序的BeginRequest事件.此时路由尚未发生,因此我将不得不/en-US/从URL 手动取出文化令牌.这是不可接受的.
控制器的Initialize()方法.这将迫使我为所有控制器编写基类,并从中继承现有的控制器.我不喜欢这个,但如果没有更好的结果,我会选择这个解决方案.
理想情况下,我想找到一些方法在"路由完成"和"模型绑定开始"事件之间注入我的代码,但我在MSDN/Google上没有发现任何内容.
或者也许还有其他方法可以处理我不知道的MVC3全球化?
在此先感谢任何贡献.
我在Visual Studio 2015上为葡萄牙语配置了一个ASP.NET MVC应用程序.在调试此应用程序时,我已设置<customErrors mode="Off" />,但所有错误都以葡萄牙语显示,我想用英语查看它们.
我试图在Web.config中设置它:
<globalization uiCulture="en-US" culture="en-US" enableClientBasedCulture="true" />
Run Code Online (Sandbox Code Playgroud)
在Global.asax我试过:
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");
Run Code Online (Sandbox Code Playgroud)
和
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
Run Code Online (Sandbox Code Playgroud)
我也卸载了Nuget包Microsoft.AspNet.Mvc.pt-br,没有成功.
这个问题很相似,但我需要一个不涉及更改机器配置或安装组件的解决方案,因为我的工作场所不允许这样做.
如何使用特定语言(在本例中为英语)显示所有错误消息?
globalization ×10
.net ×7
c# ×5
asp.net-mvc ×2
localization ×2
cultureinfo ×1
date ×1
string ×1