kmp*_*kmp 5 .net c# localization
我有一种情况,我想为我的应用程序提供一个"可用语言"列表(顺便提一下,如果有任何可能性,它是一个ASP .NET MVC 3应用程序).我认为我可以自动获取此列表,因为它应该只是构建中包含的resx文件(我不需要支持英国英语,德国奥地利或任何东西,只有英语或德语)我想出了我将在下面介绍的一个方案(作为单例实现,因为它是一种强化方法).
问题是,在某些机器上,它返回"阿拉伯语",即使我没有这样的资源和我的(因为我安装了VS 2012)它返回所有这些(这对我来说比回归两个真正的文化加上阿拉伯语更有意义但似乎ResourceManager只是为了让我得到这些信息,所以我可能不应该抱怨).这是计划......
(我有一个Strings.resx和一个Strings.de.resx文件)
IEnumerable<CultureInfo> cultures =
CultureInfo.GetCultures(CultureTypes.NeutralCultures)
.Where(c =>
{
// Exclude the invariant culture and then load up
// an arbitrary string so the resource manager
// loads a resource set, then get the set for the
// current culture specifically and it is, sometimes
// (I thought always but I was wrong) null if no
// set exists
if (c.LCID == CultureInfo.InvariantCulture.LCID)
return false;
var rm = Strings.ResourceManager;
rm.GetString("HELLO", c);
return rm.GetResourceSet(c, false, false) != null;
});
Run Code Online (Sandbox Code Playgroud)
那么我想,嗯,我可以根据特定于语言的目录是否存在这样做:
var neutralCulture = new[]
{
CultureInfo
.CreateSpecificCulture(((NeutralResourcesLanguageAttribute)
Assembly
.GetExecutingAssembly()
.GetCustomAttributes(
typeof (NeutralResourcesLanguageAttribute),
false)[0])
.CultureName)
};
IEnumerable<CultureInfo> cultures =
CultureInfo.GetCultures(CultureTypes.NeutralCultures)
.Where(c => Directory.Exists(c.TwoLetterISOLanguageName))
.Union(neutralCulture);
Run Code Online (Sandbox Code Playgroud)
这"工作"(在它返回英语和德语的同时),但我认为它不是一个非常稳定的方法,因为它容易出现随机问题,如有人创建一个文件夹并把它全部扔掉.我可以通过一些更明智的检查来缓解这些问题(where子句迫切需要更加复杂)但是这里的问题(最终)......
现在我正在考虑使用配置文件并保持完全简单,因为我不喜欢我所处的位置,但是有更好的方法来做到这一点(或者:它可以以安全的方式自动完成) ?
我喜欢你的第二种自动检测方法。我想补充一点,您应该只执行一次(在应用程序启动时或作为静态构造函数的一部分)并将其设为静态,而不是在每次请求支持的区域性信息时计算它。
我认为配置方法也可以工作,尽管它并不是真正自动的。对于这种情况,我唯一的想法是,如果您要本地化一种语言,那么它就不会在雷达下潜入您的应用程序。话虽如此,此时添加配置值似乎是一件容易做的事情(或忘记做)。
我不知道 .NET Framework 中内置了任何内容来通过方法调用为您提供此信息。
| 归档时间: |
|
| 查看次数: |
4819 次 |
| 最近记录: |