2012-06-13 123 views
2

這裏是要求:問題的資源文件轉換

從一個版本遷移項目資源文件使用的resourcefile轉換工具的另一個版本(ConvertResx)

我創建了一個簡單的Windows應用程序項目。在設計時設置本地化屬性。在.resx文件中,本地化的屬性條目已經用'MetaData'屬性設置。在資源文件轉換過程中,它將轉換.resx文件中的所有條目,但使用「數據」屬性而不是「元數據」屬性設置的本地化屬性屬性。

UseResxDataNodes'類將數據和元數據屬性條目放在同一個集合中。

ResXResourceReader reader = new ResXResourceReader(path0);

 reader.UseResXDataNodes = true; 

爲了檢索元數據收集條目,我已用下面的代碼

iDictionaryEnumerator7 = reader.GetMetadataEnumerator();

但無法使用「元數據」屬性標記讀取元數據屬性(可本地化)。在資源文件轉換後,它已經在resx文件中設置了'Data'標籤。

請問在這個問題上如何讀取元數據屬性(從.resx文件設計時屬性屬性,並將引用的程序集遷移到最新版本並將其寫入.resx文件)如何遷移.resx文件中的元數據屬性條目。

問候, Sivaguru小號

回答

5

我遇到了同樣的問題,努力寫出一個資源文件相同的格式原來的。經過一些搜索和試用/錯誤之後,我想出了以下解決方案來正確寫出元數據節點。

ResXResourceReader readerData = new ResXResourceReader(new StringReader(sw.ToString())); 
ResXResourceReader readerMetaData = new ResXResourceReader(new StringReader(sw.ToString())); 

//Flag to read nodes as ResXDataNode, instead of key/value pairs, to preserve Comments. 
readerData.UseResXDataNodes = true; 

ResXResourceWriter writer = new ResXResourceWriter(this.FilePath); 

foreach (DictionaryEntry resEntry in readerData) 
{ 
    ResXDataNode node = resEntry.Value as ResXDataNode; 

    if (node != null) 
    { 
     DictionaryEntry metaDataEntry; 

     //Check if node is metadata. The reader does not distinguish between 
     //data and metadata when UseResXDataNodes flags is set to true. 
     //http://connect.microsoft.com/VisualStudio/feedback/details/524508/resxresourcereader-does-not-split-data-and-metadata-entries-when-useresxdatanodes-is-true 
     if (IsMetaData(readerMetaData, resEntry, out metaDataEntry)) 
     { 
      writer.AddMetadata(metaDataEntry.Key.ToString(), metaDataEntry.Value); 
     } 
     else 
     { 
      writer.AddResource(node); 
     } 
    } 
} 

writer.Generate(); //write to the file 
writer.Close(); 

readerData.Close(); 
readerMetaData.Close(); 

/// <summary> 
/// Check if resource data is metadata. If so, return the metadata node. 
/// </summary> 
/// <param name="metaDataReader"></param> 
/// <param name="resEntry"></param> 
/// <param name="metaData"></param> 
/// <returns></returns> 
private static bool IsMetaData(ResXResourceReader metaDataReader, DictionaryEntry resEntry, out DictionaryEntry metaData) 
{ 
    IDictionaryEnumerator metadataEnumerator = metaDataReader.GetMetadataEnumerator(); 

    while (metadataEnumerator.MoveNext()) 
    { 
     if (metadataEnumerator.Entry.Key.Equals(resEntry.Key)) 
     { 
      metaData = metadataEnumerator.Entry; 
      return true; 
     } 
    } 

    return false; 
} 
+0

1爲完整的代碼的解決方案。 – Tim