我不认为有这样的工具,但它很容易写。
这是一个简单的例子:
static XDocument MergeResxFiles(string[] files)
{
var allResources =
from f in files
let doc = XDocument.Load(f)
from e in doc.Root.Elements("data")
select Resource.Parse(e, f);
var elements = new List<XElement>();
foreach (var g in allResources.GroupBy(r => r.Name))
{
elements.AddRange(MergeResources(g.Key, g));
}
var output = new XDocument(new XElement("root", elements));
return output;
}
private static IEnumerable<XElement> MergeResources(string name, IEnumerable<Resource> resources)
{
var grouped = resources.GroupBy(r => r.Value).ToList();
if (grouped.Count == 1)
{
yield return grouped[0].First().Xml;
}
else
{
Console.WriteLine($"Duplicate entries for {name}");
foreach (var g in grouped)
{
var comments = g.Select(r => new XComment($"Source: {r.FileName}"));
yield return new XElement(
"data",
comments,
new XAttribute("name", name),
new XElement("value", g.Key));
}
}
}
class Resource
{
public string Name { get; }
public string Value { get; }
public string FileName { get; }
public XElement Xml { get; }
public Resource(string name, string value, string fileName, XElement xml)
{
Name = name;
Value = value;
FileName = fileName;
Xml = xml;
}
public static Resource Parse(XElement element, string fileName)
{
string name = element.Attribute("name").Value;
string value = element.Element("value").Value;
return new Resource(name, value, fileName, element);
}
}
这将使用来自指定文件的资源生成一个新的 resx 文档,具有以下行为:
- 如果资源存在于多个 resx 文件中:
- 如果所有文件的值都相同,则输出单个资源
- 否则,使用此名称输出所有不同的资源,并使用 cmets 指示它们来自哪些文件以帮助解决冲突。
- 否则,输出单个资源
代码将重复资源的名称打印到控制台以轻松识别它们。
例如,如果您有 2 个具有以下资源的 resx 文件:
-
Test,两个文件中的值相同
-
Foo,存在于具有不同值的两个文件中
-
Bar,仅出现在第一个文件中
-
Baz,仅存在于第二个文件中
那么输出是这样的:
<root>
<data name="Test" xml:space="preserve">
<value>The value for Test</value>
</data>
<data name="Foo">
<!--Source: D:\tmp\resx\resources1.resx-->
<value>The value for Foo</value>
</data>
<data name="Foo">
<!--Source: D:\tmp\resx\resources2.resx-->
<value>Other value for Foo</value>
</data>
<data name="Bar" xml:space="preserve">
<value>The value for Bar</value>
</data>
<data name="Baz" xml:space="preserve">
<value>The value for Baz</value>
</data>
</root>
(注意:此代码未经彻底测试,可能需要一些修复和调整)