从资源文件动态生成可用的本地化

时间:2015-08-05 04:26:40

标签: c# asp.net-mvc localization embedded-resource resx

我有一个使用.resx files for localization的MVC网站。但是,确定支持哪些本地化的当前行为需要迭代物理.resx文件,并且一旦网站被编译用于发布,它们就不存在。

目前的文件夹结构是:

  
      
  • 语言资源      
        
    • Resource.en-US.resx
    •   
    • Resource.fr-CA.resx
    •   
    • Resource.hi.resx
    •   
    • Resource.resx
    •   
  •   

根据this answer,尝试通过GetManifestResourceNames()获取所有资源文件的列表,只生成代表主,非本地化列表的单个LanguageResources.Resource.resources文件。它可能会也可能没有嵌入本地化,但我无法看到它。

如何在运行时告诉我支持三种语言?

<子> 最终目标是基于这三个值构建下拉列表。如果还有另一种方法我应该接近这个问题,那些解决问题的答案也是可以接受的。

1 个答案:

答案 0 :(得分:0)

根据我的问题的侧边栏链接,我最终找到this question和Hans Holzbart的excellent answer,我将在下面复制。问题本身是从不同的方向接近它,但答案同样适用于我的情况。

// Pass the class name of your resources as a parameter e.g. MyResources for MyResources.resx
ResourceManager rm = new ResourceManager(typeof(MyResources));

CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures);
foreach (CultureInfo culture in cultures)
{
    try
    {
        ResourceSet rs = rm.GetResourceSet(culture, true, false);
        // or ResourceSet rs = rm.GetResourceSet(new CultureInfo(culture.TwoLetterISOLanguageName), true, false);
        string isSupported = (rs == null) ? " is not supported" : " is supported";
        Console.WriteLine(culture + isSupported);
    }
    catch (CultureNotFoundException exc)
    {
        Console.WriteLine(culture + " is not available on the machine or is an invalid culture identifier.");
    }
}

出于我的目的,我不得不用.Where(x => x.Name != "")过滤掉不变文化,但除此之外,这很有效。