资源文件转换问题

本文关键字:问题 转换 源文件 资源 | 更新日期: 2023-09-27 18:37:10

这是要求:

使用资源文件

转换器实用程序将项目资源文件从一个版本迁移到另一个版本。(转换雷斯克斯)

我创建了一个简单的Windows应用程序项目。在设计时设置本地化属性。在.resx文件中,可本地化的属性条目已设置为"元数据"属性。在资源文件转换期间,它会转换 .resx 文件中的所有条目,但可本地化的属性属性设置为"数据"属性而不是"元数据"属性。

UseResxDataNodes的类将数据和元数据属性条目放在同一个集合中。

ResXResourceReader

reader = new ResXResourceReader(path0);

        reader.UseResXDataNodes = true;

为了检索元数据收集条目,我使用了以下代码

iDictionaryEnumerator7 = reader。GetMetadataEnumerator();

但无法使用"元数据"属性标记读取元数据属性(可本地化)。 资源文件转换后,已在 resx 文件中设置了"数据"标签。

您能否在这个问题上帮助我,如何读取元数据属性(.resx 文件中的设计时属性属性并将引用的程序集迁移到最新版本并将其写入 .resx 文件)如何迁移 .resx 文件中的元数据属性条目。

问候西瓦古鲁·

资源文件转换问题

我在尝试将资源文件写出与原始文件相同的格式时遇到了同样的问题。经过一些搜索和反复试验,我想出了以下解决方案来正确写出元数据节点。

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;
}