diff --git a/framework/src/Volo.Abp.Emailing/Volo.Abp.Emailing.csproj b/framework/src/Volo.Abp.Emailing/Volo.Abp.Emailing.csproj
index ab1b4ed370..71955ca500 100644
--- a/framework/src/Volo.Abp.Emailing/Volo.Abp.Emailing.csproj
+++ b/framework/src/Volo.Abp.Emailing/Volo.Abp.Emailing.csproj
@@ -14,8 +14,8 @@
-
-
+
+
diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/AbpEmailingModule.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/AbpEmailingModule.cs
index 035d6de30a..d3a9598da1 100644
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/AbpEmailingModule.cs
+++ b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/AbpEmailingModule.cs
@@ -55,5 +55,21 @@ namespace Volo.Abp.Emailing
});
}
+ public override void OnApplicationInitialization(ApplicationInitializationContext context)
+ {
+ using (var scope = context.ServiceProvider.CreateScope())
+ {
+ var emailTemplateDefinitionManager =
+ scope.ServiceProvider.GetRequiredService();
+
+ foreach (var templateDefinition in emailTemplateDefinitionManager.GetAll())
+ {
+ foreach (var contributor in templateDefinition.Contributors)
+ {
+ contributor.Initialize(new EmailTemplateInitializationContext(templateDefinition, scope.ServiceProvider));
+ }
+ }
+ }
+ }
}
}
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 cc7f1ff4ed..b7f4bb207b 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
@@ -1,4 +1,4 @@
-using Volo.Abp.Emailing.Templates.Virtual;
+using Volo.Abp.Emailing.Templates.VirtualFiles;
namespace Volo.Abp.Emailing.Templates
{
@@ -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)
- .SetVirtualFilePath("/Volo/Abp/Emailing/Templates/DefaultLayout.html"));
+ .AddTemplateVirtualFile("/Volo/Abp/Emailing/Templates/DefaultEmailTemplates/Layout"));
context.Add(new EmailTemplateDefinition(StandardEmailTemplates.SimpleMessage)
- .SetVirtualFilePath("/Volo/Abp/Emailing/Templates/SimpleMessageTemplate.html"));
+ .AddTemplateVirtualFile("/Volo/Abp/Emailing/Templates/DefaultEmailTemplates/Message"));
}
}
}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/DefaultLayout.html b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/DefaultEmailTemplates/Layout/en.tpl
similarity index 100%
rename from framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/DefaultLayout.html
rename to framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/DefaultEmailTemplates/Layout/en.tpl
diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/SimpleMessageTemplate.html b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/DefaultEmailTemplates/Message/en.tpl
similarity index 100%
rename from framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/SimpleMessageTemplate.html
rename to framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/DefaultEmailTemplates/Message/en.tpl
diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateContributorList.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateContributorList.cs
new file mode 100644
index 0000000000..44a91212ea
--- /dev/null
+++ b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateContributorList.cs
@@ -0,0 +1,22 @@
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Volo.Abp.Emailing.Templates
+{
+ public class EmailTemplateContributorList : List
+ {
+ public string GetOrNull(string cultureName)
+ {
+ foreach (var contributor in this.AsQueryable().Reverse())
+ {
+ var templateString = contributor.GetOrNull(cultureName);
+ if (templateString != null)
+ {
+ return templateString;
+ }
+ }
+
+ return null;
+ }
+ }
+}
\ 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 9ef2ae3b1b..813e831995 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
@@ -16,29 +16,18 @@ namespace Volo.Abp.Emailing.Templates
public Type LocalizationResource { get; set; }
- public Dictionary Properties { get; }
-
- ///
- /// Gets/sets a key-value on the .
- ///
- /// Name of the property
- ///
- /// Returns the value in the dictionary by given .
- /// Returns null if given is not present in the dictionary.
- ///
- public object this[string name]
- {
- get => Properties.GetOrDefault(name);
- set => Properties[name] = value;
- }
+ public EmailTemplateContributorList Contributors { get; }
+
+ public string DefaultCultureName { get; set; }
- public EmailTemplateDefinition([NotNull]string name, Type localizationResource = null, bool isLayout = false, string layout = DefaultLayoutPlaceHolder)
+ public EmailTemplateDefinition([NotNull]string name, Type localizationResource = null, bool isLayout = false, string layout = DefaultLayoutPlaceHolder, string defaultCultureName = null)
{
Name = Check.NotNullOrWhiteSpace(name, nameof(name));
- Properties = new Dictionary();
LocalizationResource = localizationResource;
+ Contributors = new EmailTemplateContributorList();
IsLayout = isLayout;
Layout = layout;
+ DefaultCultureName = defaultCultureName;
}
}
}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateInitializationContext.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateInitializationContext.cs
new file mode 100644
index 0000000000..8cd4b95bbd
--- /dev/null
+++ b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateInitializationContext.cs
@@ -0,0 +1,18 @@
+using System;
+
+namespace Volo.Abp.Emailing.Templates
+{
+ public class EmailTemplateInitializationContext
+ {
+ public EmailTemplateDefinition EmailTemplateDefinition { get; }
+
+ public IServiceProvider ServiceProvider { get; }
+
+ public EmailTemplateInitializationContext(EmailTemplateDefinition emailTemplateDefinition,
+ IServiceProvider serviceProvider)
+ {
+ EmailTemplateDefinition = emailTemplateDefinition;
+ ServiceProvider = serviceProvider;
+ }
+ }
+}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateOptions.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateOptions.cs
index 06ab12e8a2..57533b1aff 100644
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateOptions.cs
+++ b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateOptions.cs
@@ -1,24 +1,15 @@
-using System.Collections.Generic;
-using Volo.Abp.Collections;
-using Volo.Abp.Emailing.Templates.Virtual;
+using Volo.Abp.Collections;
namespace Volo.Abp.Emailing.Templates
{
public class EmailTemplateOptions
{
- public List Providers { get; }
-
public string DefaultLayout { get; set; }
public ITypeList DefinitionProviders { get; }
public EmailTemplateOptions()
{
- Providers = new List
- {
- new VirtualFileEmailTemplateProviderContributor()
- };
-
DefaultLayout = StandardEmailTemplates.DefaultLayout;
DefinitionProviders = new TypeList();
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 c5fb44e0ed..abd5339f49 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
@@ -1,6 +1,6 @@
using System;
+using System.Globalization;
using System.Threading.Tasks;
-using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
@@ -10,79 +10,91 @@ namespace Volo.Abp.Emailing.Templates
{
public class EmailTemplateProvider : IEmailTemplateProvider, ITransientDependency
{
- protected IServiceProvider ServiceProvider { get; }
+ protected IEmailTemplateDefinitionManager EmailTemplateDefinitionManager;
protected ITemplateLocalizer TemplateLocalizer { get; }
protected EmailTemplateOptions Options { get; }
+ protected IStringLocalizerFactory StringLocalizerFactory;
- public EmailTemplateProvider(
- IOptions options,
- IServiceProvider serviceProvider,
- ITemplateLocalizer templateLocalizer)
+ public EmailTemplateProvider(IEmailTemplateDefinitionManager emailTemplateDefinitionManager,
+ ITemplateLocalizer templateLocalizer, IStringLocalizerFactory stringLocalizerFactory,
+ IOptions options)
{
- ServiceProvider = serviceProvider;
+ EmailTemplateDefinitionManager = emailTemplateDefinitionManager;
TemplateLocalizer = templateLocalizer;
+ StringLocalizerFactory = stringLocalizerFactory;
Options = options.Value;
}
- public async Task GetAsync(string name)
+ public async Task GetAsync(string name, string cultureName)
{
- using (var scope = ServiceProvider.CreateScope())
- {
- return await GetInternalAsync(scope.ServiceProvider, name);
- }
+ return await GetInternalAsync(name, cultureName);
}
- protected virtual async Task GetInternalAsync(IServiceProvider serviceProvider, string name)
+ protected virtual async Task GetInternalAsync(string name, string cultureName)
{
- var context = new EmailTemplateProviderContributorContext(name, serviceProvider);
+ var emailTemplateDefinition = EmailTemplateDefinitionManager.GetOrNull(name);
+ if (emailTemplateDefinition == null)
+ {
+ // TODO: Localized message
+ throw new AbpException("email template name not definition");
+ }
- foreach (var provider in Options.Providers)
+ var emailTemplateString = emailTemplateDefinition.Contributors.GetOrNull(cultureName);
+ if (emailTemplateString == null && emailTemplateDefinition.DefaultCultureName != null)
{
- await provider.ProvideAsync(context);
+ emailTemplateString =
+ emailTemplateDefinition.Contributors.GetOrNull(emailTemplateDefinition.DefaultCultureName);
+ if (emailTemplateString != null)
+ {
+ cultureName = emailTemplateDefinition.DefaultCultureName;
+ }
}
- if (context.Template == null)
+ if (emailTemplateString != null)
{
- throw new AbpException($"Could not found the template: {name}");
+ var emailTemplate = new EmailTemplate(emailTemplateString, emailTemplateDefinition);
+
+ await SetLayoutAsync(emailTemplateDefinition, emailTemplate, cultureName);
+ await LocalizeAsync(emailTemplateDefinition, emailTemplate, cultureName);
+
+ return emailTemplate;
}
- await SetLayoutAsync(serviceProvider, context);
- await LocalizeAsync(serviceProvider, context);
-
- return context.Template;
+ // TODO: Localized message
+ throw new AbpException($"{cultureName} template not exist!");
}
- protected virtual async Task SetLayoutAsync(IServiceProvider serviceProvider, EmailTemplateProviderContributorContext context)
+ protected virtual async Task SetLayoutAsync(EmailTemplateDefinition emailTemplateDefinition,
+ EmailTemplate emailTemplate, string cultureName)
{
- var layout = context.Template.Definition.Layout;
-
- if (layout.IsNullOrEmpty())
+ var layout = emailTemplateDefinition.Layout;
+ if (layout.IsNullOrWhiteSpace())
{
return;
}
-
+
if (layout == EmailTemplateDefinition.DefaultLayoutPlaceHolder)
{
layout = Options.DefaultLayout;
}
- var layoutTemplate = await GetInternalAsync(serviceProvider, layout);
- context.Template.SetLayout(layoutTemplate);
+ var layoutTemplate = await GetInternalAsync(layout, cultureName);
+
+ emailTemplate.SetLayout(layoutTemplate);
}
- protected virtual Task LocalizeAsync(IServiceProvider serviceProvider, EmailTemplateProviderContributorContext context)
+ protected virtual Task LocalizeAsync(EmailTemplateDefinition emailTemplateDefinition,
+ EmailTemplate emailTemplate, string cultureName)
{
- if (context.Template.Definition.LocalizationResource == null)
+ if (emailTemplateDefinition.LocalizationResource == null)
{
return Task.CompletedTask;
}
- var localizer = serviceProvider
- .GetRequiredService()
- .Create(context.Template.Definition.LocalizationResource);
+ var localizer = StringLocalizerFactory.Create(emailTemplateDefinition.LocalizationResource);
- context.Template.SetContent(
- TemplateLocalizer.Localize(localizer, context.Template.Content)
+ emailTemplate.SetContent(
+ TemplateLocalizer.Localize(localizer.WithCulture(new CultureInfo(cultureName)), emailTemplate.Content)
);
return Task.CompletedTask;
diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateProviderContributorContext.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateProviderContributorContext.cs
deleted file mode 100644
index 9893ddc789..0000000000
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateProviderContributorContext.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-using System;
-using Volo.Abp.DependencyInjection;
-
-namespace Volo.Abp.Emailing.Templates
-{
- public class EmailTemplateProviderContributorContext : IServiceProviderAccessor
- {
- public string Name { get; }
-
- public IServiceProvider ServiceProvider { get; }
-
- public EmailTemplate Template { get; set; }
-
- public EmailTemplateProviderContributorContext(string name, IServiceProvider serviceProvider)
- {
- Name = name;
- ServiceProvider = serviceProvider;
- }
- }
-}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/IEmailTemplateContributor.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/IEmailTemplateContributor.cs
new file mode 100644
index 0000000000..d2c2775845
--- /dev/null
+++ b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/IEmailTemplateContributor.cs
@@ -0,0 +1,9 @@
+namespace Volo.Abp.Emailing.Templates
+{
+ public interface IEmailTemplateContributor
+ {
+ void Initialize(EmailTemplateInitializationContext context);
+
+ string GetOrNull(string cultureName);
+ }
+}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/IEmailTemplateProvider.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/IEmailTemplateProvider.cs
index aad1fe4f05..4fc8381833 100644
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/IEmailTemplateProvider.cs
+++ b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/IEmailTemplateProvider.cs
@@ -4,6 +4,6 @@ namespace Volo.Abp.Emailing.Templates
{
public interface IEmailTemplateProvider
{
- Task GetAsync(string name);
+ Task GetAsync(string name, string cultureName);
}
-}
+}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/IEmailTemplateProviderContributor.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/IEmailTemplateProviderContributor.cs
deleted file mode 100644
index 6bc63f9661..0000000000
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/IEmailTemplateProviderContributor.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-using System.Threading.Tasks;
-
-namespace Volo.Abp.Emailing.Templates
-{
- public interface IEmailTemplateProviderContributor
- {
- Task ProvideAsync(EmailTemplateProviderContributorContext contributorContext);
- }
-}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/Virtual/EmailTemplateDefinitionExtensions.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/Virtual/EmailTemplateDefinitionExtensions.cs
deleted file mode 100644
index cb49491b0f..0000000000
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/Virtual/EmailTemplateDefinitionExtensions.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-namespace Volo.Abp.Emailing.Templates.Virtual
-{
- public static class EmailTemplateDefinitionExtensions
- {
- public static EmailTemplateDefinition SetVirtualFilePath(this EmailTemplateDefinition emailTemplateDefinition, string path)
- {
- emailTemplateDefinition[VirtualFileEmailTemplateProviderContributor.VirtualFilePathKey] = path;
- return emailTemplateDefinition;
- }
-
- public static string GetVirtualFilePathOrNull(this EmailTemplateDefinition emailTemplateDefinition)
- {
- return emailTemplateDefinition[VirtualFileEmailTemplateProviderContributor.VirtualFilePathKey] as string;
- }
- }
-}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/Virtual/VirtualFileEmailTemplateOptions.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/Virtual/VirtualFileEmailTemplateOptions.cs
deleted file mode 100644
index 0103ac27dc..0000000000
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/Virtual/VirtualFileEmailTemplateOptions.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-using System.Collections.Generic;
-
-namespace Volo.Abp.Emailing.Templates.Virtual
-{
- public class VirtualFileEmailTemplateOptions
- {
- public IDictionary Templates { get; }
-
- public VirtualFileEmailTemplateOptions()
- {
- Templates = new Dictionary();
- }
- }
-}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/Virtual/VirtualFileEmailTemplateProviderContributor.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/Virtual/VirtualFileEmailTemplateProviderContributor.cs
deleted file mode 100644
index 3fb7e8d952..0000000000
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/Virtual/VirtualFileEmailTemplateProviderContributor.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-using System.Collections.Generic;
-using System.Threading.Tasks;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.FileProviders;
-using Microsoft.Extensions.Options;
-using Volo.Abp.VirtualFileSystem;
-
-namespace Volo.Abp.Emailing.Templates.Virtual
-{
- public class VirtualFileEmailTemplateProviderContributor : IEmailTemplateProviderContributor
- {
- public const string VirtualFilePathKey = "VirtualFilePath";
-
- public Task ProvideAsync(EmailTemplateProviderContributorContext contributorContext)
- {
- var templateDefinition = FindTemplateDefinition(contributorContext);
- if (templateDefinition == null)
- {
- return Task.CompletedTask;
- }
-
- var fileInfo = FindVirtualFileInfo(contributorContext, templateDefinition);
- if (fileInfo == null)
- {
- return Task.CompletedTask;
- }
-
- contributorContext.Template = new EmailTemplate(fileInfo.ReadAsString(), templateDefinition);
- return Task.CompletedTask;
- }
-
- protected virtual EmailTemplateDefinition FindTemplateDefinition(EmailTemplateProviderContributorContext contributorContext)
- {
- return contributorContext
- .ServiceProvider
- .GetRequiredService()
- .GetOrNull(contributorContext.Name);
- }
-
- protected virtual IFileInfo FindVirtualFileInfo(EmailTemplateProviderContributorContext contributorContext, EmailTemplateDefinition templateDefinition)
- {
- var virtualFilePath = templateDefinition?.GetVirtualFilePathOrNull();
- if (virtualFilePath == null)
- {
- return null;
- }
-
- var virtualFileProvider = contributorContext.ServiceProvider.GetRequiredService();
-
- var fileInfo = virtualFileProvider.GetFileInfo(virtualFilePath);
- if (fileInfo?.Exists != true)
- {
- return null;
- }
-
- return fileInfo;
- }
- }
-}
\ No newline at end of file
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
new file mode 100644
index 0000000000..38f1f1e5d7
--- /dev/null
+++ b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/VirtualFiles/EmailTemplateDefinitionExtensions.cs
@@ -0,0 +1,12 @@
+namespace Volo.Abp.Emailing.Templates.VirtualFiles
+{
+ public static class EmailTemplateDefinitionExtensions
+ {
+ public static EmailTemplateDefinition AddTemplateVirtualFile(
+ this EmailTemplateDefinition emailTemplateDefinition, string path)
+ {
+ emailTemplateDefinition.Contributors.Add(new VirtualFileEmailTemplateContributor(path));
+ return emailTemplateDefinition;
+ }
+ }
+}
\ No newline at end of file
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/VirtualFileEmailTemplateContributor.cs
new file mode 100644
index 0000000000..6efee62f71
--- /dev/null
+++ b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/VirtualFiles/VirtualFileEmailTemplateContributor.cs
@@ -0,0 +1,68 @@
+using System;
+using System.Collections.Generic;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.FileProviders;
+using Volo.Abp.VirtualFileSystem;
+
+namespace Volo.Abp.Emailing.Templates.VirtualFiles
+{
+ public class VirtualFileEmailTemplateContributor : IEmailTemplateContributor
+ {
+ private readonly string _virtualPath;
+
+ private IVirtualFileProvider _virtualFileProvider;
+
+ private Dictionary _templateDictionary;
+
+ private readonly object _syncObj = new object();
+
+ public VirtualFileEmailTemplateContributor(string virtualPath)
+ {
+ _virtualPath = virtualPath;
+ }
+
+ public void Initialize(EmailTemplateInitializationContext context)
+ {
+ _virtualFileProvider = context.ServiceProvider.GetRequiredService();
+ }
+
+ public string GetOrNull(string cultureName)
+ {
+ return GetTemplateDictionary().GetOrDefault(cultureName);
+ }
+
+ private Dictionary GetTemplateDictionary()
+ {
+ var dictionaries = _templateDictionary;
+ if (dictionaries != null)
+ {
+ return dictionaries;
+ }
+
+ lock (_syncObj)
+ {
+ dictionaries = _templateDictionary;
+ if (dictionaries != null)
+ {
+ return dictionaries;
+ }
+
+ _templateDictionary = new Dictionary();
+ foreach (var file in _virtualFileProvider.GetDirectoryContents(_virtualPath))
+ {
+ if (file.IsDirectory)
+ {
+ continue;
+ }
+
+ // TODO: How to normalize file names?
+ _templateDictionary.Add(file.Name.RemovePostFix(".tpl"), file.ReadAsString());
+ }
+
+ dictionaries = _templateDictionary;
+ }
+
+ return dictionaries;
+ }
+ }
+}
\ 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 fc77dac001..49132f0a7d 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
@@ -1,4 +1,4 @@
-
+
netcoreapp2.2
@@ -11,8 +11,8 @@
-
-
+
+
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 b2fec29371..0b6a76be7d 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
@@ -1,4 +1,4 @@
-using System.Threading.Tasks;
+using System.Threading.Tasks;
using Shouldly;
using Volo.Abp.Emailing.Templates;
using Xunit;
@@ -22,8 +22,23 @@ namespace Volo.Abp.Emailing
[Fact]
public async Task Should_Get_Registered_Template()
{
- var template = await _emailTemplateProvider.GetAsync("template1");
- template.Content.ShouldContain("This is a test template!");
+ var template = await _emailTemplateProvider.GetAsync("template1", "tr");
+ template.Content.ShouldContain("Lütfen aşağıdaki bağlantıya tıklayarak e-posta adresinizi onaylayın.");
+ }
+
+ [Fact]
+ public async Task Should_Get_Default_Culture_Template()
+ {
+ var template = await _emailTemplateProvider.GetAsync("template1", "zh-Hans");
+ template.Content.ShouldContain("Please confirm your email address by clicking the link below.");
+ }
+
+ [Fact]
+ public async Task Should_Get_Registered_Template_With_Layout()
+ {
+ var template = await _emailTemplateProvider.GetAsync("template2", "en");
+
+ template.Content.ShouldContain("\r\n " + "Please confirm your email address by clicking the link below.");
}
}
}
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 379371c727..576de09221 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,5 +1,5 @@
using Volo.Abp.Emailing.Templates;
-using Volo.Abp.Emailing.Templates.Virtual;
+using Volo.Abp.Emailing.Templates.VirtualFiles;
namespace Volo.Abp.Emailing
{
@@ -7,8 +7,13 @@ namespace Volo.Abp.Emailing
{
public override void Define(IEmailTemplateDefinitionContext context)
{
- context.Add(new EmailTemplateDefinition("template1")
- .SetVirtualFilePath("/Volo/Abp/Emailing/TestTemplates/template1.html"));
+ var template1 = new EmailTemplateDefinition("template1", defaultCultureName: "en", layout: null)
+ .AddTemplateVirtualFile("/Volo/Abp/Emailing/TestTemplates/Template1");
+ context.Add(template1);
+
+ var template2 = new EmailTemplateDefinition("template2", layout: StandardEmailTemplates.DefaultLayout)
+ .AddTemplateVirtualFile("/Volo/Abp/Emailing/TestTemplates/Template2");
+ context.Add(template2);
}
}
}
\ No newline at end of file
diff --git a/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/TestTemplates/Template1/en.tpl b/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/TestTemplates/Template1/en.tpl
new file mode 100644
index 0000000000..49a951e8c0
--- /dev/null
+++ b/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/TestTemplates/Template1/en.tpl
@@ -0,0 +1,4 @@
+Please confirm your email address by clicking the link below.
+We may need to send you critical information about our service and it is important that we have an accurate email address.
+
+Confirm email address
\ No newline at end of file
diff --git a/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/TestTemplates/Template1/tr.tpl b/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/TestTemplates/Template1/tr.tpl
new file mode 100644
index 0000000000..3e572aedbb
--- /dev/null
+++ b/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/TestTemplates/Template1/tr.tpl
@@ -0,0 +1,4 @@
+Lütfen aşağıdaki bağlantıya tıklayarak e-posta adresinizi onaylayın.
+Size hizmetimizle ilgili kritik bilgileri göndermemiz gerekebilir ve doğru bir e-posta adresimizin olması önemlidir.
+
+E-posta adresini onayla
\ No newline at end of file
diff --git a/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/TestTemplates/Template2/en.tpl b/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/TestTemplates/Template2/en.tpl
new file mode 100644
index 0000000000..49a951e8c0
--- /dev/null
+++ b/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/TestTemplates/Template2/en.tpl
@@ -0,0 +1,4 @@
+Please confirm your email address by clicking the link below.
+We may need to send you critical information about our service and it is important that we have an accurate email address.
+
+Confirm email address
\ No newline at end of file
diff --git a/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/TestTemplates/template1.html b/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/TestTemplates/template1.html
deleted file mode 100644
index 5c98393c69..0000000000
--- a/framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/TestTemplates/template1.html
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
- This is a test template!
-
-
\ No newline at end of file