diff --git a/common.DotSettings b/common.DotSettings
index 0eb4875d49..6f40d029a7 100644
--- a/common.DotSettings
+++ b/common.DotSettings
@@ -20,5 +20,11 @@
False
False
SQL
+ False
+ False
+ False
+ False
+ False
+ False
True
\ No newline at end of file
diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln
index 3db0998855..5159f0a86e 100644
--- a/framework/Volo.Abp.sln
+++ b/framework/Volo.Abp.sln
@@ -277,7 +277,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Http.Client.Identi
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.ObjectExtending", "src\Volo.Abp.ObjectExtending\Volo.Abp.ObjectExtending.csproj", "{D1815C77-16D6-4F99-8814-69065CD89FB3}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.ObjectExtending.Tests", "test\Volo.Abp.ObjectExtending.Tests\Volo.Abp.ObjectExtending.Tests.csproj", "{17F8CA89-D9A2-4863-A5BD-B8E4D2901FD5}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.ObjectExtending.Tests", "test\Volo.Abp.ObjectExtending.Tests\Volo.Abp.ObjectExtending.Tests.csproj", "{17F8CA89-D9A2-4863-A5BD-B8E4D2901FD5}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.TextTemplating", "src\Volo.Abp.TextTemplating\Volo.Abp.TextTemplating.csproj", "{9E53F91F-EACD-4191-A487-E727741F1311}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.TextTemplating.Tests", "test\Volo.Abp.TextTemplating.Tests\Volo.Abp.TextTemplating.Tests.csproj", "{251C7FD3-D313-4BCE-8068-352EC7EEA275}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -829,6 +833,14 @@ Global
{17F8CA89-D9A2-4863-A5BD-B8E4D2901FD5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{17F8CA89-D9A2-4863-A5BD-B8E4D2901FD5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{17F8CA89-D9A2-4863-A5BD-B8E4D2901FD5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9E53F91F-EACD-4191-A487-E727741F1311}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9E53F91F-EACD-4191-A487-E727741F1311}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9E53F91F-EACD-4191-A487-E727741F1311}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9E53F91F-EACD-4191-A487-E727741F1311}.Release|Any CPU.Build.0 = Release|Any CPU
+ {251C7FD3-D313-4BCE-8068-352EC7EEA275}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {251C7FD3-D313-4BCE-8068-352EC7EEA275}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {251C7FD3-D313-4BCE-8068-352EC7EEA275}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {251C7FD3-D313-4BCE-8068-352EC7EEA275}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -970,6 +982,8 @@ Global
{E1963439-2BE5-4DB5-8438-2A9A792A1ADA} = {447C8A77-E5F0-4538-8687-7383196D04EA}
{D1815C77-16D6-4F99-8814-69065CD89FB3} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
{17F8CA89-D9A2-4863-A5BD-B8E4D2901FD5} = {447C8A77-E5F0-4538-8687-7383196D04EA}
+ {9E53F91F-EACD-4191-A487-E727741F1311} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
+ {251C7FD3-D313-4BCE-8068-352EC7EEA275} = {447C8A77-E5F0-4538-8687-7383196D04EA}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5}
diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Localization/CultureHelper.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Localization/CultureHelper.cs
index 92320f737c..d4d9cfb1c0 100644
--- a/framework/src/Volo.Abp.Core/Volo/Abp/Localization/CultureHelper.cs
+++ b/framework/src/Volo.Abp.Core/Volo/Abp/Localization/CultureHelper.cs
@@ -10,7 +10,12 @@ namespace Volo.Abp.Localization
{
Check.NotNull(culture, nameof(culture));
- return Use(new CultureInfo(culture), uiCulture == null ? null : new CultureInfo(uiCulture));
+ return Use(
+ new CultureInfo(culture),
+ uiCulture == null
+ ? null
+ : new CultureInfo(uiCulture)
+ );
}
public static IDisposable Use([NotNull] CultureInfo culture, CultureInfo uiCulture = null)
@@ -29,5 +34,12 @@ namespace Volo.Abp.Localization
CultureInfo.CurrentUICulture = currentUiCulture;
});
}
+
+ public static string GetBaseCultureName(string cultureName)
+ {
+ return cultureName.Contains("-")
+ ? cultureName.Left(cultureName.IndexOf("-", StringComparison.Ordinal))
+ : cultureName;
+ }
}
}
diff --git a/framework/src/Volo.Abp.Emailing/Volo.Abp.Emailing.csproj b/framework/src/Volo.Abp.Emailing/Volo.Abp.Emailing.csproj
index be953a1f26..a2f83399a0 100644
--- a/framework/src/Volo.Abp.Emailing/Volo.Abp.Emailing.csproj
+++ b/framework/src/Volo.Abp.Emailing/Volo.Abp.Emailing.csproj
@@ -14,24 +14,21 @@
-
-
-
-
-
-
+
+
+
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 c2e29a7ff7..afcbaf6aef 100644
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/AbpEmailingModule.cs
+++ b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/AbpEmailingModule.cs
@@ -1,12 +1,9 @@
-using System;
-using System.Collections.Generic;
-using Microsoft.Extensions.DependencyInjection;
-using Volo.Abp.BackgroundJobs;
+using Volo.Abp.BackgroundJobs;
using Volo.Abp.Emailing.Localization;
-using Volo.Abp.Emailing.Templates;
using Volo.Abp.Localization;
using Volo.Abp.Modularity;
using Volo.Abp.Settings;
+using Volo.Abp.TextTemplating;
using Volo.Abp.VirtualFileSystem;
namespace Volo.Abp.Emailing
@@ -15,15 +12,11 @@ namespace Volo.Abp.Emailing
typeof(AbpSettingsModule),
typeof(AbpVirtualFileSystemModule),
typeof(AbpBackgroundJobsAbstractionsModule),
- typeof(AbpLocalizationModule)
+ typeof(AbpLocalizationModule),
+ typeof(AbpTextTemplatingModule)
)]
public class AbpEmailingModule : AbpModule
{
- public override void PreConfigureServices(ServiceConfigurationContext context)
- {
- AutoAddDefinitionProviders(context.Services);
- }
-
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure(options =>
@@ -43,41 +36,5 @@ namespace Volo.Abp.Emailing
options.AddJob();
});
}
-
- private static void AutoAddDefinitionProviders(IServiceCollection services)
- {
- var definitionProviders = new List();
-
- services.OnRegistred(context =>
- {
-
- if (typeof(IEmailTemplateDefinitionProvider).IsAssignableFrom(context.ImplementationType))
- {
- definitionProviders.Add(context.ImplementationType);
- }
- });
-
- services.Configure(options =>
- {
- options.DefinitionProviders.AddIfNotContains(definitionProviders);
- });
- }
-
- 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/AbpEmailTemplateOptions.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/AbpEmailTemplateOptions.cs
deleted file mode 100644
index cb5a9d370b..0000000000
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/AbpEmailTemplateOptions.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using Volo.Abp.Collections;
-
-namespace Volo.Abp.Emailing.Templates
-{
- public class AbpEmailTemplateOptions
- {
- public string DefaultLayout { get; set; }
-
- public ITypeList DefinitionProviders { get; }
-
- public AbpEmailTemplateOptions()
- {
- DefaultLayout = StandardEmailTemplates.DefaultLayout;
-
- DefinitionProviders = new TypeList();
- }
- }
-}
\ No newline at end of file
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 c15012f0bf..385e0ef178 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,16 +1,26 @@
-using Volo.Abp.Emailing.Templates.VirtualFiles;
+using Volo.Abp.TextTemplating;
namespace Volo.Abp.Emailing.Templates
{
- public class DefaultEmailTemplateProvider : EmailTemplateDefinitionProvider
+ public class DefaultEmailTemplateProvider : TemplateDefinitionProvider
{
- public override void Define(IEmailTemplateDefinitionContext context)
+ public override void Define(ITemplateDefinitionContext context)
{
- context.Add(new EmailTemplateDefinition(StandardEmailTemplates.DefaultLayout, defaultCultureName: "en", isLayout: true, layout: null)
- .AddTemplateVirtualFiles("/Volo/Abp/Emailing/Templates/DefaultEmailTemplates/Layout"));
+ context.Add(
+ new TemplateDefinition(
+ StandardEmailTemplates.Layout,
+ defaultCultureName: "en",
+ isLayout: true
+ ).WithVirtualFilePath("/Volo/Abp/Emailing/Templates/Layout")
+ );
- context.Add(new EmailTemplateDefinition(StandardEmailTemplates.SimpleMessage, defaultCultureName: "en")
- .AddTemplateVirtualFiles("/Volo/Abp/Emailing/Templates/DefaultEmailTemplates/Message"));
+ context.Add(
+ new TemplateDefinition(
+ StandardEmailTemplates.Message,
+ defaultCultureName: "en",
+ layout: StandardEmailTemplates.Layout
+ ).WithVirtualFilePath("/Volo/Abp/Emailing/Templates/Message")
+ );
}
}
}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/DefaultEmailTemplates/Message/en.tpl b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/DefaultEmailTemplates/Message/en.tpl
deleted file mode 100644
index 6454b0b93a..0000000000
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/DefaultEmailTemplates/Message/en.tpl
+++ /dev/null
@@ -1 +0,0 @@
-{{message}}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplate.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplate.cs
deleted file mode 100644
index ad6f8c4839..0000000000
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplate.cs
+++ /dev/null
@@ -1,42 +0,0 @@
-using System.Text;
-
-namespace Volo.Abp.Emailing.Templates
-{
- public class EmailTemplate
- {
- public EmailTemplateDefinition Definition { get; }
-
- public string Content => ContentBuilder.ToString();
-
- protected StringBuilder ContentBuilder { get; set; }
-
- public EmailTemplate(string content, EmailTemplateDefinition definition)
- {
- ContentBuilder = new StringBuilder(content);
- Definition = definition;
- }
-
- public virtual void SetLayout(EmailTemplate layoutTemplate)
- {
- if (!layoutTemplate.Definition.IsLayout)
- {
- throw new AbpException($"Given template is not a layout template: {layoutTemplate.Definition.Name}");
- }
-
- var newStrBuilder = new StringBuilder(layoutTemplate.Content);
- newStrBuilder.Replace("{{#content}}", ContentBuilder.ToString());
-
- ContentBuilder = newStrBuilder;
- }
-
- public virtual void SetContent(string content)
- {
- ContentBuilder = new StringBuilder(content);
- }
-
- public virtual void Replace(string name, string value)
- {
- ContentBuilder.Replace("{{" + name + "}}", value);
- }
- }
-}
\ No newline at end of file
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
deleted file mode 100644
index 44a91212ea..0000000000
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateContributorList.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-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
deleted file mode 100644
index 19f0eb2fa7..0000000000
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateDefinition.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System;
-using JetBrains.Annotations;
-
-namespace Volo.Abp.Emailing.Templates
-{
- public class EmailTemplateDefinition
- {
- public const string DefaultLayoutPlaceHolder = "_";
-
- public string Name { get; }
-
- public bool IsLayout { get; }
-
- public string Layout { get; set; }
-
- public Type LocalizationResource { get; set; }
-
- public EmailTemplateContributorList Contributors { get; }
-
- public string DefaultCultureName { get; }
-
- 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;
- Contributors = new EmailTemplateContributorList();
- 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/EmailTemplateDefinitionContext.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateDefinitionContext.cs
deleted file mode 100644
index 03a6c95d8b..0000000000
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateDefinitionContext.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-using System.Collections.Generic;
-using System.Collections.Immutable;
-
-namespace Volo.Abp.Emailing.Templates
-{
- public class EmailTemplateDefinitionContext : IEmailTemplateDefinitionContext
- {
- protected Dictionary EmailTemplates { get; }
-
- public EmailTemplateDefinitionContext(Dictionary emailTemplates)
- {
- EmailTemplates = emailTemplates;
- }
-
- public virtual EmailTemplateDefinition GetOrNull(string name)
- {
- return EmailTemplates.GetOrDefault(name);
- }
-
- public virtual IReadOnlyList GetAll()
- {
- return EmailTemplates.Values.ToImmutableList();
- }
-
- public virtual void Add(params EmailTemplateDefinition[] definitions)
- {
- if (definitions.IsNullOrEmpty())
- {
- return;
- }
-
- foreach (var definition in definitions)
- {
- EmailTemplates[definition.Name] = definition;
- }
- }
- }
-}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateDefinitionDictionary.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateDefinitionDictionary.cs
deleted file mode 100644
index aa36232156..0000000000
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateDefinitionDictionary.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-using System.Collections.Generic;
-
-namespace Volo.Abp.Emailing.Templates
-{
- public class EmailTemplateDefinitionDictionary : Dictionary
- {
- public EmailTemplateDefinitionDictionary Add(EmailTemplateDefinition emailTemplateDefinition)
- {
- if (ContainsKey(emailTemplateDefinition.Name))
- {
- throw new AbpException(
- "There is already an email template definition with given name: " +
- emailTemplateDefinition.Name
- );
- }
-
- this[emailTemplateDefinition.Name] = emailTemplateDefinition;
-
- return this;
- }
- }
-}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateDefinitionManager.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateDefinitionManager.cs
deleted file mode 100644
index 0491dc867e..0000000000
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateDefinitionManager.cs
+++ /dev/null
@@ -1,74 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Collections.Immutable;
-using System.Linq;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Options;
-using Volo.Abp.DependencyInjection;
-
-namespace Volo.Abp.Emailing.Templates
-{
- public class EmailTemplateDefinitionManager : IEmailTemplateDefinitionManager, ISingletonDependency
- {
- protected Lazy> EmailTemplateDefinitions { get; }
-
- protected AbpEmailTemplateOptions Options { get; }
-
- protected IServiceProvider ServiceProvider { get; }
-
- public EmailTemplateDefinitionManager(
- IOptions options,
- IServiceProvider serviceProvider)
- {
- ServiceProvider = serviceProvider;
- Options = options.Value;
-
- EmailTemplateDefinitions =
- new Lazy>(CreateEmailTemplateDefinitions, true);
- }
-
- public virtual EmailTemplateDefinition Get(string name)
- {
- Check.NotNull(name, nameof(name));
-
- var template = GetOrNull(name);
-
- if (template == null)
- {
- throw new AbpException("Undefined template: " + name);
- }
-
- return template;
- }
-
- public virtual IReadOnlyList GetAll()
- {
- return EmailTemplateDefinitions.Value.Values.ToImmutableList();
- }
-
- public virtual EmailTemplateDefinition GetOrNull(string name)
- {
- return EmailTemplateDefinitions.Value.GetOrDefault(name);
- }
-
- protected virtual IDictionary CreateEmailTemplateDefinitions()
- {
- var templates = new Dictionary();
-
- using (var scope = ServiceProvider.CreateScope())
- {
- var providers = Options
- .DefinitionProviders
- .Select(p => scope.ServiceProvider.GetRequiredService(p) as IEmailTemplateDefinitionProvider)
- .ToList();
-
- foreach (var provider in providers)
- {
- provider.Define(new EmailTemplateDefinitionContext(templates));
- }
- }
-
- return templates;
- }
- }
-}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateDefinitionProvider.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateDefinitionProvider.cs
deleted file mode 100644
index e53505fafc..0000000000
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateDefinitionProvider.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-using Volo.Abp.DependencyInjection;
-
-namespace Volo.Abp.Emailing.Templates
-{
- public abstract class EmailTemplateDefinitionProvider : IEmailTemplateDefinitionProvider, ITransientDependency
- {
- public abstract void Define(IEmailTemplateDefinitionContext context);
- }
-}
\ 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
deleted file mode 100644
index 8cd4b95bbd..0000000000
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateInitializationContext.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-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/EmailTemplateProvider.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateProvider.cs
deleted file mode 100644
index 29fcf08664..0000000000
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateProvider.cs
+++ /dev/null
@@ -1,121 +0,0 @@
-using System;
-using System.Globalization;
-using System.Threading.Tasks;
-using Microsoft.Extensions.Localization;
-using Microsoft.Extensions.Options;
-using Volo.Abp.DependencyInjection;
-using Volo.Abp.Localization;
-
-namespace Volo.Abp.Emailing.Templates
-{
- public class EmailTemplateProvider : IEmailTemplateProvider, ITransientDependency
- {
- protected IEmailTemplateDefinitionManager EmailTemplateDefinitionManager;
- protected ITemplateLocalizer TemplateLocalizer { get; }
- protected AbpEmailTemplateOptions Options { get; }
- protected IStringLocalizerFactory StringLocalizerFactory;
-
- public EmailTemplateProvider(IEmailTemplateDefinitionManager emailTemplateDefinitionManager,
- ITemplateLocalizer templateLocalizer, IStringLocalizerFactory stringLocalizerFactory,
- IOptions options)
- {
- EmailTemplateDefinitionManager = emailTemplateDefinitionManager;
- TemplateLocalizer = templateLocalizer;
- StringLocalizerFactory = stringLocalizerFactory;
- Options = options.Value;
- }
-
- public async Task GetAsync(string name)
- {
- return await GetAsync(name, CultureInfo.CurrentUICulture.Name);
- }
-
- public async Task GetAsync(string name, string cultureName)
- {
- return await GetInternalAsync(name, cultureName);
- }
-
- protected virtual async Task GetInternalAsync(string name, string cultureName)
- {
- var emailTemplateDefinition = EmailTemplateDefinitionManager.GetOrNull(name);
- if (emailTemplateDefinition == null)
- {
- // TODO: Localized message
- throw new AbpException($"email template {name} not definition");
- }
-
- var emailTemplateString = emailTemplateDefinition.Contributors.GetOrNull(cultureName);
- if (emailTemplateString == null && emailTemplateDefinition.DefaultCultureName != null)
- {
- emailTemplateString =
- emailTemplateDefinition.Contributors.GetOrNull(emailTemplateDefinition.DefaultCultureName);
- if (emailTemplateString != null)
- {
- cultureName = emailTemplateDefinition.DefaultCultureName;
- }
- }
-
- if (emailTemplateString != null)
- {
- var emailTemplate = new EmailTemplate(emailTemplateString, emailTemplateDefinition);
-
- await SetLayoutAsync(emailTemplateDefinition, emailTemplate, cultureName);
-
- if (emailTemplateDefinition.SingleTemplateFile)
- {
- await LocalizeAsync(emailTemplateDefinition, emailTemplate, cultureName);
- }
-
- return emailTemplate;
- }
-
- // TODO: Localized message
- throw new AbpException($"{cultureName} template not exist!");
- }
-
- protected virtual async Task SetLayoutAsync(EmailTemplateDefinition emailTemplateDefinition,
- EmailTemplate emailTemplate, string cultureName)
- {
- var layout = emailTemplateDefinition.Layout;
- if (layout.IsNullOrWhiteSpace())
- {
- return;
- }
-
- if (layout == EmailTemplateDefinition.DefaultLayoutPlaceHolder)
- {
- layout = Options.DefaultLayout;
- }
-
- var layoutTemplate = await GetInternalAsync(layout, cultureName);
-
- emailTemplate.SetLayout(layoutTemplate);
- }
-
- protected virtual Task LocalizeAsync(EmailTemplateDefinition emailTemplateDefinition,
- EmailTemplate emailTemplate, string cultureName)
- {
- if (emailTemplateDefinition.LocalizationResource == null)
- {
- return Task.CompletedTask;
- }
-
- var localizer = StringLocalizerFactory.Create(emailTemplateDefinition.LocalizationResource);
- if (cultureName != null)
- {
- using (CultureHelper.Use(new CultureInfo(cultureName)))
- {
- emailTemplate.SetContent(TemplateLocalizer.Localize(localizer, emailTemplate.Content));
- }
- }
- else
- {
- emailTemplate.SetContent(
- TemplateLocalizer.Localize(localizer, emailTemplate.Content)
- );
- }
-
- return Task.CompletedTask;
- }
- }
-}
\ 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
deleted file mode 100644
index d2c2775845..0000000000
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/IEmailTemplateContributor.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-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/IEmailTemplateDefinitionContext.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/IEmailTemplateDefinitionContext.cs
deleted file mode 100644
index 1641562ccf..0000000000
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/IEmailTemplateDefinitionContext.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-namespace Volo.Abp.Emailing.Templates
-{
- public interface IEmailTemplateDefinitionContext
- {
- EmailTemplateDefinition GetOrNull(string name);
-
- void Add(params EmailTemplateDefinition[] definitions);
- }
-}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/IEmailTemplateDefinitionManager.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/IEmailTemplateDefinitionManager.cs
deleted file mode 100644
index 0936a2fe93..0000000000
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/IEmailTemplateDefinitionManager.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using System.Collections.Generic;
-using JetBrains.Annotations;
-
-namespace Volo.Abp.Emailing.Templates
-{
- public interface IEmailTemplateDefinitionManager
- {
- [NotNull]
- EmailTemplateDefinition Get([NotNull] string name);
-
- IReadOnlyList GetAll();
-
- EmailTemplateDefinition GetOrNull(string name);
- }
-}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/IEmailTemplateDefinitionProvider.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/IEmailTemplateDefinitionProvider.cs
deleted file mode 100644
index 691d3874d6..0000000000
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/IEmailTemplateDefinitionProvider.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace Volo.Abp.Emailing.Templates
-{
- public interface IEmailTemplateDefinitionProvider
- {
- void Define(IEmailTemplateDefinitionContext context);
- }
-}
\ 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
deleted file mode 100644
index ab68dbe2ca..0000000000
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/IEmailTemplateProvider.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-using System.Threading.Tasks;
-
-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/ITemplateRender.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/ITemplateRender.cs
deleted file mode 100644
index 35ac14c8fd..0000000000
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/ITemplateRender.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-using System.Threading.Tasks;
-
-namespace Volo.Abp.Emailing.Templates
-{
- public interface ITemplateRender
- {
- Task RenderAsync(string template, object model = null);
- }
-}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/DefaultEmailTemplates/Layout/en.tpl b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/Layout/en.tpl
similarity index 84%
rename from framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/DefaultEmailTemplates/Layout/en.tpl
rename to framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/Layout/en.tpl
index 107fbb5230..57453a027f 100644
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/DefaultEmailTemplates/Layout/en.tpl
+++ b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/Layout/en.tpl
@@ -4,6 +4,6 @@
- {{#content}}
+ {{content}}