diff --git a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/ITemplateContentProvider.cs b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/ITemplateContentProvider.cs index 12c8f8f8d8..b352fc0503 100644 --- a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/ITemplateContentProvider.cs +++ b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/ITemplateContentProvider.cs @@ -7,12 +7,14 @@ namespace Volo.Abp.TextTemplating { Task GetContentOrNullAsync( [NotNull] string templateName, - [CanBeNull] string cultureName = null + [CanBeNull] string cultureName = null, + bool tryDefaults = true ); Task GetContentOrNullAsync( [NotNull] TemplateDefinition templateDefinition, - [CanBeNull] string cultureName = null + [CanBeNull] string cultureName = null, + bool tryDefaults = true ); } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TemplateContentContributorContext.cs b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TemplateContentContributorContext.cs index 773bf1a0a4..bb304a3344 100644 --- a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TemplateContentContributorContext.cs +++ b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TemplateContentContributorContext.cs @@ -11,17 +11,17 @@ namespace Volo.Abp.TextTemplating [NotNull] public IServiceProvider ServiceProvider { get; } - [CanBeNull] + [NotNull] public string Culture { get; } public TemplateContentContributorContext( [NotNull] TemplateDefinition templateDefinition, [NotNull] IServiceProvider serviceProvider, - [CanBeNull] string culture) + [NotNull] string culture) { TemplateDefinition = Check.NotNull(templateDefinition, nameof(templateDefinition)); ServiceProvider = Check.NotNull(serviceProvider, nameof(serviceProvider)); - Culture = culture; + Culture = Check.NotNull(culture, nameof(culture)); } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TemplateContentProvider.cs b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TemplateContentProvider.cs index fdb6a3c9dd..dcb5d88850 100644 --- a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TemplateContentProvider.cs +++ b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TemplateContentProvider.cs @@ -1,9 +1,11 @@ -using System.Linq; +using System.Globalization; +using System.Linq; using System.Threading.Tasks; using JetBrains.Annotations; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; +using Volo.Abp.Localization; namespace Volo.Abp.TextTemplating { @@ -23,17 +25,19 @@ namespace Volo.Abp.TextTemplating _templateDefinitionManager = templateDefinitionManager; } - public Task GetContentOrNullAsync( + public virtual Task GetContentOrNullAsync( [NotNull] string templateName, - [CanBeNull] string cultureName = null) + [CanBeNull] string cultureName = null, + bool tryDefaults = true) { var template = _templateDefinitionManager.Get(templateName); return GetContentOrNullAsync(template, cultureName); } - public async Task GetContentOrNullAsync( + public virtual async Task GetContentOrNullAsync( [NotNull] TemplateDefinition templateDefinition, - [CanBeNull] string cultureName = null) + [CanBeNull] string cultureName = null, + bool tryDefaults = true) { Check.NotNull(templateDefinition, nameof(templateDefinition)); @@ -44,30 +48,93 @@ namespace Volo.Abp.TextTemplating ); } + if (cultureName == null) + { + cultureName = CultureInfo.CurrentUICulture.Name; + } + using (var scope = ServiceScopeFactory.CreateScope()) { - var context = new TemplateContentContributorContext( - templateDefinition, - scope.ServiceProvider, - cultureName + var contributors = Options.ContentContributors + .Select(type => (ITemplateContentContributor) scope.ServiceProvider.GetRequiredService(type)) + .Reverse() + .ToArray(); + + //Try to get from the requested culture + var templateString = await GetContentOrNullAsync( + contributors, + new TemplateContentContributorContext( + templateDefinition, + scope.ServiceProvider, + cultureName + ) ); - foreach (var contentContributorType in Options.ContentContributors.Reverse()) + if (templateString != null) + { + return templateString; + } + + if (!tryDefaults) { - var contributor = (ITemplateContentContributor) scope.ServiceProvider - .GetRequiredService(contentContributorType); + return null; + } + + //Try to get from same culture without country code + if (cultureName.Contains("-")) //Example: "tr-TR" + { + templateString = await GetContentOrNullAsync( + contributors, + new TemplateContentContributorContext( + templateDefinition, + scope.ServiceProvider, + CultureHelper.GetBaseCultureName(cultureName) + ) + ); + + if (templateString != null) + { + return templateString; + } + } + + //Try to get from default culture + if (templateDefinition.DefaultCultureName != null) + { + templateString = await GetContentOrNullAsync( + contributors, + new TemplateContentContributorContext( + templateDefinition, + scope.ServiceProvider, + templateDefinition.DefaultCultureName + ) + ); - var templateString = await contributor.GetOrNullAsync(context); if (templateString != null) { return templateString; } } } - - throw new AbpException( - $"None of the template content contributors could get the content for the template '{templateDefinition.Name}'" - ); + + //Not found + return null; + } + + protected virtual async Task GetContentOrNullAsync( + ITemplateContentContributor[] contributors, + TemplateContentContributorContext context) + { + foreach (var contributor in contributors) + { + var templateString = await contributor.GetOrNullAsync(context); + if (templateString != null) + { + return templateString; + } + } + + return null; } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/FileInfoLocalizedTemplateContentReader.cs b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/FileInfoLocalizedTemplateContentReader.cs index 4ff941fb84..3ddfb973f3 100644 --- a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/FileInfoLocalizedTemplateContentReader.cs +++ b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/FileInfoLocalizedTemplateContentReader.cs @@ -12,7 +12,7 @@ namespace Volo.Abp.TextTemplating.VirtualFiles _content = await fileInfo.ReadAsStringAsync(); } - public string GetContent(string culture, string defaultCultureName) + public string GetContentOrNull(string culture) { return _content; } diff --git a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/ILocalizedTemplateContentReader.cs b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/ILocalizedTemplateContentReader.cs index 0b028138cd..611e50b005 100644 --- a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/ILocalizedTemplateContentReader.cs +++ b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/ILocalizedTemplateContentReader.cs @@ -2,6 +2,6 @@ { public interface ILocalizedTemplateContentReader { - public string GetContent(string culture, string defaultCultureName = null); + public string GetContentOrNull(string culture); } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/NullLocalizedTemplateContentReader.cs b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/NullLocalizedTemplateContentReader.cs index 0578a716ae..475559c634 100644 --- a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/NullLocalizedTemplateContentReader.cs +++ b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/NullLocalizedTemplateContentReader.cs @@ -9,9 +9,7 @@ } - public string GetContent( - string culture, - string defaultCultureName = null) + public string GetContentOrNull(string culture) { return null; } diff --git a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContentContributor.cs b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContentContributor.cs index e06336c658..668d1dc3ec 100644 --- a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContentContributor.cs +++ b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContentContributor.cs @@ -21,9 +21,8 @@ namespace Volo.Abp.TextTemplating.VirtualFiles var localizedReader = await _localizedTemplateContentReaderFactory .CreateAsync(context.TemplateDefinition); - return localizedReader.GetContent( - context.Culture ?? CultureInfo.CurrentUICulture.Name, - context.TemplateDefinition.DefaultCultureName + return localizedReader.GetContentOrNull( + context.Culture ); } } diff --git a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/VirtualFolderLocalizedTemplateContentReader.cs b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/VirtualFolderLocalizedTemplateContentReader.cs index 0f2a23a2fa..b43ab722b7 100644 --- a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/VirtualFolderLocalizedTemplateContentReader.cs +++ b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/VirtualFolderLocalizedTemplateContentReader.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Extensions.FileProviders; -using Volo.Abp.Localization; using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.TextTemplating.VirtualFiles @@ -34,34 +33,9 @@ namespace Volo.Abp.TextTemplating.VirtualFiles } } - public string GetContent(string cultureName, string defaultCultureName) + public string GetContentOrNull(string cultureName) { - var content = _dictionary.GetOrDefault(cultureName); - if (content != null) - { - return content; - } - - if (cultureName.Contains("-")) - { - var baseCultureName = CultureHelper.GetBaseCultureName(cultureName); - content = _dictionary.GetOrDefault(baseCultureName); - if (content != null) - { - return content; - } - } - - if (defaultCultureName != null) - { - content = _dictionary.GetOrDefault(defaultCultureName); - if (content != null) - { - return content; - } - } - - return null; + return _dictionary.GetOrDefault(cultureName); } } } \ No newline at end of file