如何在ResourceManager中找到可用的资源文化?

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子句迫切需要更加复杂)但是这里的问题(最终)......

现在我正在考虑使用配置文件并保持完全简单,因为我不喜欢我所处的位置,但是有更好的方法来做到这一点(或者:它可以以安全的方式自动完成) ?

Bri*_*haw 2

我喜欢你的第二种自动检测方法。我想补充一点,您应该只执行一次(在应用程序启动时或作为静态构造函数的一部分)并将其设为静态,而不是在每次请求支持的区域性信息时计算它。

我认为配置方法也可以工作,尽管它并不是真正自动的。对于这种情况,我唯一的想法是,如果您要本地化一种语言,那么它就不会在雷达下潜入您的应用程序。话虽如此,此时添加配置值似乎是一件容易做的事情(或忘记做)。

我不知道 .NET Framework 中内置了任何内容来通过方法调用为您提供此信息。