2013-03-11 61 views
2

假设我们有一个Windows窗体Form1,我们为其设置了一个图标。 Visual Studio将图标存储在Form1.resx($ this.Icon)中。.resx表单图标级联更新

现在我们决定将应用程序本地化为N种语言,因此我们将Localizable设置为True,我们从语言选项中选择第一种语言,翻译文本,然后继续下一个重复该过程的语言(选择另一种语言翻译)到N.结果将是包含具有原始图标的$ this.Icon条目的N个.resx文件。

然后,我们意识到我们要更新的形式图标,因此我们将语言设置为“(默认)”和我们设定的新图标。令我们惊讶的是,我们发现N .resx文件没有更新。

我们是否需要手动更新N .resx文件?有没有像级联更新?在这种情况下你会做什么来避免更新N个图标?

回答

-1

老实说,没有理由在每个resx中都有相同的图标。

ResX文件级联基于语言,从最具体的语言资源到最少。

如果您从您的所有文件RESX除外默认的图标,将始终使用的图标。

如果你想要一个不同的图标为特定的语言,只需将不同的图标添加到RESX文件。

你可以很容易地看到这一点。为表单添加一个标签,并根据名为'test'的键的值填充它(可以在代码中调用'GetLocalResourceObject(“test”)'来完成此操作)。

添加键值对'测试' - '你好'到你的resx文件。假设你的resx被称为'foo.resx'。在特定于语言的文件(如'foo.fr.resx')中添加'测试' - 'Bonjour'。如果您以非法语言运行程序,您会看到'Hello',但如果切换到法语,您会看到'Bonjour'。

它将工作与你的图标以同样的方式 - 你可以将其设置在底座RESX,它会显示每种语言。然后您可以在不同的资源文件中覆盖它。

0

我只是将代码添加到我的Program.Main来修改所有解决方案.resx文件以删除Form.Icon。

try 
    { 
     string solutionDirPath = @"path\to\solution"; 
     string[] resxFilePaths = Directory.GetFiles(solutionDirPath, "*.resx", SearchOption.AllDirectories); 
     foreach (string resxFilePath in resxFilePaths) 
     { 
      XDocument xdoc = XDocument.Load(resxFilePath); 
      var iconElement = xdoc.Root.Elements("data").SingleOrDefault(el => (string)el.Attribute("name") == "$this.Icon"); 
      if (iconElement != null) 
      { 
       iconElement.Remove(); 
       xdoc.Save(resxFilePath); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 

    } 
    finally 
    { 

    } 

而且我的垃圾箱尺寸几乎减少了两倍!

也为各种形式的我只是将使用图标从我的应用程序的可执行

Icon.ExtractAssociatedIcon(Application.ExecutablePath)