diff --git a/framework/src/Volo.Abp.TextTemplating/Volo.Abp.TextTemplating.csproj b/framework/src/Volo.Abp.TextTemplating/Volo.Abp.TextTemplating.csproj index cbc6ba05ec..ba12b60ca7 100644 --- a/framework/src/Volo.Abp.TextTemplating/Volo.Abp.TextTemplating.csproj +++ b/framework/src/Volo.Abp.TextTemplating/Volo.Abp.TextTemplating.csproj @@ -1,4 +1,4 @@ - + @@ -15,7 +15,7 @@ - + diff --git a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/AbpTextTemplatingModule.cs b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/AbpTextTemplatingModule.cs index 28b71da4aa..3ef30f5fc2 100644 --- a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/AbpTextTemplatingModule.cs +++ b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/AbpTextTemplatingModule.cs @@ -2,9 +2,13 @@ using System.Collections.Generic; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Modularity; +using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.TextTemplating { + [DependsOn( + typeof(AbpVirtualFileSystemModule) + )] public class AbpTextTemplatingModule : AbpModule { public override void PreConfigureServices(ServiceConfigurationContext context) diff --git a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TemplateContributorInitializationContext.cs b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TemplateContributorInitializationContext.cs index e8a7332e83..ffe97a3484 100644 --- a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TemplateContributorInitializationContext.cs +++ b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TemplateContributorInitializationContext.cs @@ -12,8 +12,8 @@ namespace Volo.Abp.TextTemplating public IServiceProvider ServiceProvider { get; } public TemplateContributorInitializationContext( - TemplateDefinition templateDefinition, - IServiceProvider serviceProvider) + [NotNull] TemplateDefinition templateDefinition, + [NotNull] IServiceProvider serviceProvider) { TemplateDefinition = Check.NotNull(templateDefinition, nameof(templateDefinition)); ServiceProvider = Check.NotNull(serviceProvider, nameof(serviceProvider)); diff --git a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TemplateDefinition.cs b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TemplateDefinition.cs index b9b7762405..548ac87c15 100644 --- a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TemplateDefinition.cs +++ b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TemplateDefinition.cs @@ -22,15 +22,12 @@ namespace Volo.Abp.TextTemplating [CanBeNull] public string DefaultCultureName { get; } - public bool SingleTemplateFile { get; } //TODO: ??? - public TemplateDefinition( [NotNull] string name, Type localizationResource = null, bool isLayout = false, string layout = DefaultLayoutPlaceHolder, - string defaultCultureName = null, - bool singleTemplateFile = false) + string defaultCultureName = null) { Name = Check.NotNullOrWhiteSpace(name, nameof(name)); LocalizationResource = localizationResource; @@ -38,7 +35,12 @@ namespace Volo.Abp.TextTemplating IsLayout = isLayout; Layout = layout; DefaultCultureName = defaultCultureName; - SingleTemplateFile = singleTemplateFile; + } + + public virtual TemplateDefinition AddContributor(ITemplateContributor contributor) + { + Contributors.Add(contributor); + return this; } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContributor.cs b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContributor.cs new file mode 100644 index 0000000000..f7a320ab16 --- /dev/null +++ b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContributor.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using JetBrains.Annotations; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.FileProviders; +using Volo.Abp.VirtualFileSystem; + +namespace Volo.Abp.TextTemplating.VirtualFiles +{ + public class VirtualFileTemplateContributor : ITemplateContributor + { + private readonly string _virtualPath; + private IVirtualFileProvider _virtualFileProvider; + private volatile Dictionary _templateDictionary; + private readonly object _syncObj = new object(); + + public VirtualFileTemplateContributor(string virtualPath) + { + _virtualPath = virtualPath; + } + + public void Initialize(TemplateContributorInitializationContext context) + { + _virtualFileProvider = context.ServiceProvider.GetRequiredService(); + } + + public string GetOrNull([CanBeNull] string cultureName = null) + { + var dictionary = GetTemplateDictionary(); + + if (cultureName == null) + { + return dictionary.GetOrDefault("__default"); + } + else + { + return dictionary.GetOrDefault(cultureName) ?? + dictionary.GetOrDefault("__default"); + } + } + + private Dictionary GetTemplateDictionary() + { + if (_templateDictionary != null) + { + return _templateDictionary; + } + + lock (_syncObj) + { + if (_templateDictionary != null) + { + return _templateDictionary; + } + + var dictionary = new Dictionary(); + + var fileInfo = _virtualFileProvider.GetFileInfo(_virtualPath); + if (!fileInfo.IsDirectory) + { + //TODO: __default to consts + dictionary.Add("__default", fileInfo.ReadAsString()); + } + else + { + foreach (var file in _virtualFileProvider.GetDirectoryContents(_virtualPath)) + { + if (file.IsDirectory) + { + continue; + } + + // TODO: How to normalize file names? + dictionary.Add(file.Name.RemovePostFix(".tpl"), file.ReadAsString()); + } + } + + _templateDictionary = dictionary; + return dictionary; + } + } + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.csproj b/framework/test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.csproj index bc5a0fc679..916495b116 100644 --- a/framework/test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.csproj +++ b/framework/test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.csproj @@ -7,6 +7,11 @@ + + + + + diff --git a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/AbpTextTemplatingTestModule.cs b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/AbpTextTemplatingTestModule.cs index 057accfc23..0457e0136d 100644 --- a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/AbpTextTemplatingTestModule.cs +++ b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/AbpTextTemplatingTestModule.cs @@ -1,5 +1,6 @@ using Volo.Abp.Autofac; using Volo.Abp.Modularity; +using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.TextTemplating { @@ -10,6 +11,12 @@ namespace Volo.Abp.TextTemplating )] public class AbpTextTemplatingTestModule : AbpModule { - + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.FileSets.AddEmbedded("Volo.Abp.TextTemplating"); + }); + } } } diff --git a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/ForgotPasswordEmail.tpl b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/ForgotPasswordEmail.tpl new file mode 100644 index 0000000000..674b734c8a --- /dev/null +++ b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/ForgotPasswordEmail.tpl @@ -0,0 +1 @@ +Please click to the following link to get an email to reset your password! \ No newline at end of file diff --git a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/WelcomeEmail/en.tpl b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/WelcomeEmail/en.tpl new file mode 100644 index 0000000000..7dbe5e8cb0 --- /dev/null +++ b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/WelcomeEmail/en.tpl @@ -0,0 +1 @@ +Welcome to the abp.io! \ No newline at end of file diff --git a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/WelcomeEmail/tr.tpl b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/WelcomeEmail/tr.tpl new file mode 100644 index 0000000000..6c70e0afb1 --- /dev/null +++ b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/WelcomeEmail/tr.tpl @@ -0,0 +1 @@ +abp.io'ya hoşgeldiniz! \ No newline at end of file diff --git a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/TestTemplateDefinitionProvider.cs b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/TestTemplateDefinitionProvider.cs index 134ebdc74a..57244c61c6 100644 --- a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/TestTemplateDefinitionProvider.cs +++ b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/TestTemplateDefinitionProvider.cs @@ -1,17 +1,22 @@ -namespace Volo.Abp.TextTemplating +using Volo.Abp.TextTemplating.VirtualFiles; + +namespace Volo.Abp.TextTemplating { public class TestTemplateDefinitionProvider : TemplateDefinitionProvider { public override void Define(ITemplateDefinitionContext context) { - context - .Add( - new TemplateDefinition( - TestTemplates.TestTemplate1 - ), new TemplateDefinition( - TestTemplates.TestTemplateLayout1 - ) - ); + context.Add( + new TemplateDefinition( + TestTemplates.TestTemplate1 + ).AddContributor( + new VirtualFileTemplateContributor("/SampleTemplates/WelcomeEmail") + ) + ); + + context.Add(new TemplateDefinition( + TestTemplates.TestTemplateLayout1 + )); } } } diff --git a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContributor_Tests.cs b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContributor_Tests.cs new file mode 100644 index 0000000000..d884a5e73b --- /dev/null +++ b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContributor_Tests.cs @@ -0,0 +1,50 @@ +using Shouldly; +using Xunit; + +namespace Volo.Abp.TextTemplating.VirtualFiles +{ + public class VirtualFileTemplateContributor_Tests : AbpTextTemplatingTestBase + { + [Fact] + public void Should_Get_Localized_Content_By_Culture() + { + var contributor = new VirtualFileTemplateContributor( + "/SampleTemplates/WelcomeEmail" + ); + + contributor.Initialize( + new TemplateContributorInitializationContext( + new TemplateDefinition("Test"), + ServiceProvider + ) + ); + + contributor + .GetOrNull("en") + .ShouldBe("Welcome to the abp.io!"); + + contributor + .GetOrNull("tr") + .ShouldBe("abp.io'ya hoşgeldiniz!"); + } + + [Fact] + public void Should_Get_Non_Localized_Template_Content() + { + var contributor = new VirtualFileTemplateContributor( + "/SampleTemplates/ForgotPasswordEmail.tpl" + ); + + contributor.Initialize( + new TemplateContributorInitializationContext( + new TemplateDefinition("Test"), + ServiceProvider + ) + ); + + contributor + .GetOrNull() + .ShouldBe("Please click to the following link to get an email to reset your password!"); + } + } +}