@@ -21,11 +21,23 @@ private record StringResourceItems(string Language, IEnumerable<StringResourceIt
2121
2222 private readonly Localizer.Options options = new();
2323
24- public static string StringResourcesFileXPath { get; set; } = "//root/data";
24+ private string defaultStringResourcesFileName = "Resources.resw";
25+
26+ private string stringResourcesFileXPath = "//root/data";
2527
2628 public static bool IsLocalizerAlreadyBuilt => Localizer.Get() is Localizer;
2729
28- private ILogger? Logger { get; set; }
30+ public LocalizerBuilder SetDefaultStringResourcesFileName(string fileName)
31+ {
32+ this.defaultStringResourcesFileName = fileName;
33+ return this;
34+ }
35+
36+ public LocalizerBuilder SetStringResourcesFileXPath(string xPath)
37+ {
38+ this.stringResourcesFileXPath = xPath;
39+ return this;
40+ }
2941
3042 public LocalizerBuilder SetLogger(ILogger<Localizer> logger)
3143 {
@@ -44,15 +56,22 @@ public LocalizerBuilder AddStringResourcesFolderForLanguageDictionaries(
4456 {
4557 try
4658 {
47- string languageFilePath = Path.Combine(languageFolderPath, resourcesFileName);
59+ foreach (string stringResourcesFileFullPath in Directory.GetFiles(languageFolderPath, "*.resw"))
60+ {
61+ string fileName = Path.GetFileName(stringResourcesFileFullPath);
62+ string sourceName = fileName == this.defaultStringResourcesFileName
63+ ? string.Empty
64+ : Path.GetFileNameWithoutExtension(fileName);
4865
4966 if (CreateLanguageDictionaryFromStringResourcesFile(
50- languageFilePath,
51- StringResourcesFileXPath) is LanguageDictionary dictionary)
67+ sourceName,
68+ stringResourcesFileFullPath,
69+ this.stringResourcesFileXPath) is LanguageDictionary dictionary)
5270 {
5371 this.languageDictionaries.Add(dictionary);
5472 }
5573 }
74+ }
5675 catch
5776 {
5877 if (ignoreExceptions is false)
@@ -121,9 +140,10 @@ public async Task<ILocalizer> Build()
121140 return localizer;
122141 }
123142
124- private static LanguageDictionary? CreateLanguageDictionaryFromStringResourcesFile(string filePath, string fileXPath)
143+ private static LanguageDictionary? CreateLanguageDictionaryFromStringResourcesFile(string sourceName, string filePath, string fileXPath)
125144 {
126145 if (CreateStringResourceItemsFromResourcesFile(
146+ sourceName,
127147 filePath,
128148 fileXPath) is StringResourceItems stringResourceItems)
129149 {
@@ -159,7 +179,7 @@ private static LanguageDictionary.Item CreateLanguageDictionaryItem(StringResour
159179 stringResourceItem.Name);
160180 }
161181
162- private static StringResourceItems? CreateStringResourceItemsFromResourcesFile(string filePath, string xPath = "//root/data")
182+ private static StringResourceItems? CreateStringResourceItemsFromResourcesFile(string sourceName, string filePath, string xPath = "//root/data")
163183 {
164184 DirectoryInfo directoryInfo = new(filePath);
165185
@@ -171,29 +191,34 @@ private static LanguageDictionary.Item CreateLanguageDictionaryItem(StringResour
171191 if (document.SelectNodes(xPath) is XmlNodeList nodeList)
172192 {
173193 List<StringResourceItem> items = new();
174- items.AddRange(CreateStringResourceItems(nodeList));
194+ IEnumerable<StringResourceItem> stringResourceItems = CreateStringResourceItems(sourceName, nodeList);
195+ items.AddRange(stringResourceItems);
175196 return new StringResourceItems(language, items);
176197 }
177198 }
178199
179200 return null;
180201 }
181202
182- private static IEnumerable<StringResourceItem> CreateStringResourceItems(XmlNodeList nodeList)
203+ private static IEnumerable<StringResourceItem> CreateStringResourceItems(string sourceName, XmlNodeList nodeList)
183204 {
184205 foreach (XmlNode node in nodeList)
185206 {
186- if (CreateStringResourceItem(node) is StringResourceItem item)
207+ if (CreateStringResourceItem(sourceName, node) is StringResourceItem item)
187208 {
188209 yield return item;
189210 }
190211 }
191212 }
192213
193- private static StringResourceItem? CreateStringResourceItem(XmlNode node)
214+ private static StringResourceItem? CreateStringResourceItem(string sourceName, XmlNode node)
194215 {
216+ string prefix = string.IsNullOrEmpty(sourceName) is false
217+ ? $"/{sourceName}/"
218+ : string.Empty;
219+
195220 return new StringResourceItem(
196- Name: node.Attributes?["name"]?.Value ?? string.Empty,
221+ Name: $"{prefix}{ node.Attributes?["name"]?.Value ?? string.Empty}" ,
197222 Value: node["value"]?.InnerText ?? string.Empty,
198223 Comment: string.Empty);
199224 }
0 commit comments