|
|
|
@ -1,5 +1,7 @@ |
|
|
|
using Microsoft.Extensions.DependencyInjection; |
|
|
|
using System; |
|
|
|
using Microsoft.Extensions.DependencyInjection; |
|
|
|
using Microsoft.Extensions.FileProviders; |
|
|
|
using Microsoft.Extensions.Primitives; |
|
|
|
using Volo.Abp.Internal; |
|
|
|
using Volo.Abp.VirtualFileSystem; |
|
|
|
|
|
|
|
@ -9,6 +11,8 @@ namespace Volo.Abp.Localization.VirtualFiles |
|
|
|
{ |
|
|
|
private readonly string _virtualPath; |
|
|
|
|
|
|
|
private bool _subscribedForChanges; |
|
|
|
|
|
|
|
protected VirtualFileLocalizationDictionaryProviderBase(string virtualPath) |
|
|
|
{ |
|
|
|
_virtualPath = virtualPath; |
|
|
|
@ -17,32 +21,52 @@ namespace Volo.Abp.Localization.VirtualFiles |
|
|
|
public override void Initialize(LocalizationResourceInitializationContext context) //TODO: Extract initialization to a factory..?
|
|
|
|
{ |
|
|
|
var virtualFileProvider = context.ServiceProvider.GetRequiredService<IVirtualFileProvider>(); |
|
|
|
var directoryContents = virtualFileProvider.GetDirectoryContents(_virtualPath); |
|
|
|
|
|
|
|
foreach (var file in directoryContents) |
|
|
|
CreateDictionaries(virtualFileProvider); |
|
|
|
|
|
|
|
if (!_subscribedForChanges) |
|
|
|
{ |
|
|
|
ChangeToken.OnChange(() => virtualFileProvider.Watch(_virtualPath.EnsureEndsWith('/') + "**/*.*"), () => |
|
|
|
{ |
|
|
|
CreateDictionaries(virtualFileProvider); |
|
|
|
OnUpdated(); |
|
|
|
}); |
|
|
|
|
|
|
|
_subscribedForChanges = true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void CreateDictionaries(IFileProvider fileProvider) |
|
|
|
{ |
|
|
|
Dictionaries.Clear(); |
|
|
|
|
|
|
|
foreach (var file in fileProvider.GetDirectoryContents(_virtualPath)) |
|
|
|
{ |
|
|
|
if (file.IsDirectory || !CanParseFile(file)) |
|
|
|
{ |
|
|
|
continue; |
|
|
|
} |
|
|
|
|
|
|
|
using (var stream = file.CreateReadStream()) |
|
|
|
var dictionary = CreateDictionaryFromFile(file); |
|
|
|
if (Dictionaries.ContainsKey(dictionary.CultureName)) |
|
|
|
{ |
|
|
|
var fileContent = Utf8Helper.ReadStringFromStream(stream); |
|
|
|
|
|
|
|
var dictionary = CreateDictionary(fileContent); |
|
|
|
if (Dictionaries.ContainsKey(dictionary.CultureName)) |
|
|
|
{ |
|
|
|
throw new AbpException($"{file.PhysicalPath} dictionary has a culture name '{dictionary.CultureName}' which is already defined!"); |
|
|
|
} |
|
|
|
|
|
|
|
Dictionaries[dictionary.CultureName] = dictionary; |
|
|
|
throw new AbpException($"{file.PhysicalPath} dictionary has a culture name '{dictionary.CultureName}' which is already defined!"); |
|
|
|
} |
|
|
|
|
|
|
|
Dictionaries[dictionary.CultureName] = dictionary; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
protected abstract bool CanParseFile(IFileInfo file); |
|
|
|
|
|
|
|
protected abstract ILocalizationDictionary CreateDictionary(string fileContent); |
|
|
|
protected virtual ILocalizationDictionary CreateDictionaryFromFile(IFileInfo file) |
|
|
|
{ |
|
|
|
using (var stream = file.CreateReadStream()) |
|
|
|
{ |
|
|
|
return CreateDictionaryFromFileContent(Utf8Helper.ReadStringFromStream(stream)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
protected abstract ILocalizationDictionary CreateDictionaryFromFileContent(string fileContent); |
|
|
|
} |
|
|
|
} |