From d1657d555526bf23675562474da1727a3d6ea4fe Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 21 May 2019 17:23:12 +0800 Subject: [PATCH] Support single file template --- .../Templates/DefaultEmailTemplateProvider.cs | 4 +-- .../Templates/EmailTemplateDefinition.cs | 9 +++-- .../Templates/EmailTemplateProvider.cs | 25 ++++++++++---- .../EmailTemplateDefinitionExtensions.cs | 9 ++++- ...leVirtualFilesEmailTemplateContributor.cs} | 4 +-- ...ngleVirtualFileEmailTemplateContributor.cs | 34 +++++++++++++++++++ .../Volo.Abp.Emailing.Tests.csproj | 2 ++ .../Abp/Emailing/AbpEmailingTestModule.cs | 12 ++++++- .../Abp/Emailing/EmailTemplateStore_Tests.cs | 8 +++++ .../Localization/AbpEmailingTestResource.cs | 10 ++++++ .../Volo/Abp/Emailing/Localization/en.json | 6 ++++ .../Volo/Abp/Emailing/Localization/tr.json | 6 ++++ .../Abp/Emailing/TestEmailTemplateProvider.cs | 11 ++++-- .../TestTemplates/Template3/Template.tpl | 1 + 14 files changed, 123 insertions(+), 18 deletions(-) rename framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/VirtualFiles/{VirtualFileEmailTemplateContributor.cs => MultipleVirtualFilesEmailTemplateContributor.cs} (91%) create mode 100644 framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/VirtualFiles/SingleVirtualFileEmailTemplateContributor.cs create mode 100644 framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/Localization/AbpEmailingTestResource.cs create mode 100644 framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/Localization/en.json create mode 100644 framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/Localization/tr.json create mode 100644 framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/TestTemplates/Template3/Template.tpl diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/DefaultEmailTemplateProvider.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/DefaultEmailTemplateProvider.cs index b7f4bb207b..fdc7fa5375 100644 --- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/DefaultEmailTemplateProvider.cs +++ b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/DefaultEmailTemplateProvider.cs @@ -7,10 +7,10 @@ namespace Volo.Abp.Emailing.Templates public override void Define(IEmailTemplateDefinitionContext context) { context.Add(new EmailTemplateDefinition(StandardEmailTemplates.DefaultLayout, isLayout: true, layout: null) - .AddTemplateVirtualFile("/Volo/Abp/Emailing/Templates/DefaultEmailTemplates/Layout")); + .AddTemplateVirtualFiles("/Volo/Abp/Emailing/Templates/DefaultEmailTemplates/Layout")); context.Add(new EmailTemplateDefinition(StandardEmailTemplates.SimpleMessage) - .AddTemplateVirtualFile("/Volo/Abp/Emailing/Templates/DefaultEmailTemplates/Message")); + .AddTemplateVirtualFiles("/Volo/Abp/Emailing/Templates/DefaultEmailTemplates/Message")); } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateDefinition.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateDefinition.cs index 813e831995..19f0eb2fa7 100644 --- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateDefinition.cs +++ b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateDefinition.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using JetBrains.Annotations; namespace Volo.Abp.Emailing.Templates @@ -18,9 +17,12 @@ namespace Volo.Abp.Emailing.Templates public EmailTemplateContributorList Contributors { get; } - public string DefaultCultureName { get; set; } + public string DefaultCultureName { get; } - public EmailTemplateDefinition([NotNull]string name, Type localizationResource = null, bool isLayout = false, string layout = DefaultLayoutPlaceHolder, string defaultCultureName = null) + public bool SingleTemplateFile { get; } + + public EmailTemplateDefinition([NotNull] string name, Type localizationResource = null, bool isLayout = false, + string layout = DefaultLayoutPlaceHolder, string defaultCultureName = null, bool singleTemplateFile = false) { Name = Check.NotNullOrWhiteSpace(name, nameof(name)); LocalizationResource = localizationResource; @@ -28,6 +30,7 @@ namespace Volo.Abp.Emailing.Templates IsLayout = isLayout; Layout = layout; DefaultCultureName = defaultCultureName; + SingleTemplateFile = singleTemplateFile; } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateProvider.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateProvider.cs index abd5339f49..28abdfc213 100644 --- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateProvider.cs +++ b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateProvider.cs @@ -36,7 +36,7 @@ namespace Volo.Abp.Emailing.Templates if (emailTemplateDefinition == null) { // TODO: Localized message - throw new AbpException("email template name not definition"); + throw new AbpException($"email template {name} not definition"); } var emailTemplateString = emailTemplateDefinition.Contributors.GetOrNull(cultureName); @@ -55,7 +55,11 @@ namespace Volo.Abp.Emailing.Templates var emailTemplate = new EmailTemplate(emailTemplateString, emailTemplateDefinition); await SetLayoutAsync(emailTemplateDefinition, emailTemplate, cultureName); - await LocalizeAsync(emailTemplateDefinition, emailTemplate, cultureName); + + if (emailTemplateDefinition.SingleTemplateFile) + { + await LocalizeAsync(emailTemplateDefinition, emailTemplate, cultureName); + } return emailTemplate; } @@ -92,10 +96,19 @@ namespace Volo.Abp.Emailing.Templates } var localizer = StringLocalizerFactory.Create(emailTemplateDefinition.LocalizationResource); - - emailTemplate.SetContent( - TemplateLocalizer.Localize(localizer.WithCulture(new CultureInfo(cultureName)), emailTemplate.Content) - ); + if (cultureName != null) + { + emailTemplate.SetContent( + TemplateLocalizer.Localize(localizer.WithCulture(new CultureInfo(cultureName)), + emailTemplate.Content) + ); + } + else + { + emailTemplate.SetContent( + TemplateLocalizer.Localize(localizer, emailTemplate.Content) + ); + } return Task.CompletedTask; } diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/VirtualFiles/EmailTemplateDefinitionExtensions.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/VirtualFiles/EmailTemplateDefinitionExtensions.cs index 38f1f1e5d7..7bee611d28 100644 --- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/VirtualFiles/EmailTemplateDefinitionExtensions.cs +++ b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/VirtualFiles/EmailTemplateDefinitionExtensions.cs @@ -5,7 +5,14 @@ public static EmailTemplateDefinition AddTemplateVirtualFile( this EmailTemplateDefinition emailTemplateDefinition, string path) { - emailTemplateDefinition.Contributors.Add(new VirtualFileEmailTemplateContributor(path)); + emailTemplateDefinition.Contributors.Add(new SingleVirtualFileEmailTemplateContributor(path)); + return emailTemplateDefinition; + } + + public static EmailTemplateDefinition AddTemplateVirtualFiles( + this EmailTemplateDefinition emailTemplateDefinition, string path) + { + emailTemplateDefinition.Contributors.Add(new MultipleVirtualFilesEmailTemplateContributor(path)); return emailTemplateDefinition; } } diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/VirtualFiles/VirtualFileEmailTemplateContributor.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/VirtualFiles/MultipleVirtualFilesEmailTemplateContributor.cs similarity index 91% rename from framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/VirtualFiles/VirtualFileEmailTemplateContributor.cs rename to framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/VirtualFiles/MultipleVirtualFilesEmailTemplateContributor.cs index 6efee62f71..2ae5f88cc5 100644 --- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/VirtualFiles/VirtualFileEmailTemplateContributor.cs +++ b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/VirtualFiles/MultipleVirtualFilesEmailTemplateContributor.cs @@ -6,7 +6,7 @@ using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.Emailing.Templates.VirtualFiles { - public class VirtualFileEmailTemplateContributor : IEmailTemplateContributor + public class MultipleVirtualFilesEmailTemplateContributor : IEmailTemplateContributor { private readonly string _virtualPath; @@ -16,7 +16,7 @@ namespace Volo.Abp.Emailing.Templates.VirtualFiles private readonly object _syncObj = new object(); - public VirtualFileEmailTemplateContributor(string virtualPath) + public MultipleVirtualFilesEmailTemplateContributor(string virtualPath) { _virtualPath = virtualPath; } diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/VirtualFiles/SingleVirtualFileEmailTemplateContributor.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/VirtualFiles/SingleVirtualFileEmailTemplateContributor.cs new file mode 100644 index 0000000000..d72d18e99a --- /dev/null +++ b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/VirtualFiles/SingleVirtualFileEmailTemplateContributor.cs @@ -0,0 +1,34 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.FileProviders; +using Volo.Abp.VirtualFileSystem; + +namespace Volo.Abp.Emailing.Templates.VirtualFiles +{ + public class SingleVirtualFileEmailTemplateContributor : IEmailTemplateContributor + { + private readonly string _virtualPath; + + private IVirtualFileProvider _virtualFileProvider; + + public SingleVirtualFileEmailTemplateContributor(string virtualPath) + { + _virtualPath = virtualPath; + } + + public void Initialize(EmailTemplateInitializationContext context) + { + _virtualFileProvider = context.ServiceProvider.GetRequiredService(); + } + + public string GetOrNull(string cultureName) + { + var file = _virtualFileProvider.GetFileInfo(_virtualPath); + if (file == null || !file.Exists || file.IsDirectory) + { + return null; + } + + return file.ReadAsString(); + } + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.Emailing.Tests/Volo.Abp.Emailing.Tests.csproj b/framework/test/Volo.Abp.Emailing.Tests/Volo.Abp.Emailing.Tests.csproj index 49132f0a7d..ca155ab951 100644 --- a/framework/test/Volo.Abp.Emailing.Tests/Volo.Abp.Emailing.Tests.csproj +++ b/framework/test/Volo.Abp.Emailing.Tests/Volo.Abp.Emailing.Tests.csproj @@ -13,6 +13,8 @@ + + diff --git a/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/AbpEmailingTestModule.cs b/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/AbpEmailingTestModule.cs index 9b290acd74..831258c5d5 100644 --- a/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/AbpEmailingTestModule.cs +++ b/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/AbpEmailingTestModule.cs @@ -1,4 +1,6 @@ -using Volo.Abp.Modularity; +using Volo.Abp.Emailing.Localization; +using Volo.Abp.Localization; +using Volo.Abp.Modularity; using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.Emailing @@ -14,6 +16,14 @@ namespace Volo.Abp.Emailing { options.FileSets.AddEmbedded(); }); + + Configure(options => + { + options.Resources + .Add() + .AddVirtualJson("/Volo/Abp/Emailing/Localization"); + }); + } } } \ No newline at end of file diff --git a/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/EmailTemplateStore_Tests.cs b/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/EmailTemplateStore_Tests.cs index 0b6a76be7d..62a2cb3eb6 100644 --- a/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/EmailTemplateStore_Tests.cs +++ b/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/EmailTemplateStore_Tests.cs @@ -40,5 +40,13 @@ namespace Volo.Abp.Emailing template.Content.ShouldContain("\r\n " + "Please confirm your email address by clicking the link below."); } + + + [Fact] + public async Task Should_Get_Registered_Template_With_Localize() + { + var template = await _emailTemplateProvider.GetAsync("template3", "tr"); + template.Content.ShouldContain("Merhaba Abp"); + } } } diff --git a/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/Localization/AbpEmailingTestResource.cs b/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/Localization/AbpEmailingTestResource.cs new file mode 100644 index 0000000000..bdc75f9f2f --- /dev/null +++ b/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/Localization/AbpEmailingTestResource.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Volo.Abp.Emailing.Localization +{ + public class AbpEmailingTestResource + { + } +} diff --git a/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/Localization/en.json b/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/Localization/en.json new file mode 100644 index 0000000000..38f7cf7e5b --- /dev/null +++ b/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/Localization/en.json @@ -0,0 +1,6 @@ +{ + "culture": "en", + "texts": { + "hello": "hello" + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/Localization/tr.json b/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/Localization/tr.json new file mode 100644 index 0000000000..6c3c94cfdf --- /dev/null +++ b/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/Localization/tr.json @@ -0,0 +1,6 @@ +{ + "culture": "tr", + "texts": { + "hello": "Merhaba" + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/TestEmailTemplateProvider.cs b/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/TestEmailTemplateProvider.cs index 576de09221..60c9a2ccf3 100644 --- a/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/TestEmailTemplateProvider.cs +++ b/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/TestEmailTemplateProvider.cs @@ -1,4 +1,5 @@ -using Volo.Abp.Emailing.Templates; +using Volo.Abp.Emailing.Localization; +using Volo.Abp.Emailing.Templates; using Volo.Abp.Emailing.Templates.VirtualFiles; namespace Volo.Abp.Emailing @@ -8,12 +9,16 @@ namespace Volo.Abp.Emailing public override void Define(IEmailTemplateDefinitionContext context) { var template1 = new EmailTemplateDefinition("template1", defaultCultureName: "en", layout: null) - .AddTemplateVirtualFile("/Volo/Abp/Emailing/TestTemplates/Template1"); + .AddTemplateVirtualFiles("/Volo/Abp/Emailing/TestTemplates/Template1"); context.Add(template1); var template2 = new EmailTemplateDefinition("template2", layout: StandardEmailTemplates.DefaultLayout) - .AddTemplateVirtualFile("/Volo/Abp/Emailing/TestTemplates/Template2"); + .AddTemplateVirtualFiles("/Volo/Abp/Emailing/TestTemplates/Template2"); context.Add(template2); + + var template3 = new EmailTemplateDefinition("template3", layout: null, singleTemplateFile: true, localizationResource: typeof(AbpEmailingTestResource)) + .AddTemplateVirtualFile("/Volo/Abp/Emailing/TestTemplates/Template3/Template.tpl"); + context.Add(template3); } } } \ No newline at end of file diff --git a/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/TestTemplates/Template3/Template.tpl b/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/TestTemplates/Template3/Template.tpl new file mode 100644 index 0000000000..f30f512848 --- /dev/null +++ b/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/TestTemplates/Template3/Template.tpl @@ -0,0 +1 @@ +{{#L:hello}} Abp \ No newline at end of file