Browse Source

Move culture fallback logic to the TemplateContentProvider

pull/3792/head
Halil İbrahim Kalkan 7 years ago
parent
commit
5aec15a123
  1. 6
      framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/ITemplateContentProvider.cs
  2. 6
      framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TemplateContentContributorContext.cs
  3. 101
      framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TemplateContentProvider.cs
  4. 2
      framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/FileInfoLocalizedTemplateContentReader.cs
  5. 2
      framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/ILocalizedTemplateContentReader.cs
  6. 4
      framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/NullLocalizedTemplateContentReader.cs
  7. 5
      framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContentContributor.cs
  8. 30
      framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/VirtualFolderLocalizedTemplateContentReader.cs

6
framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/ITemplateContentProvider.cs

@ -7,12 +7,14 @@ namespace Volo.Abp.TextTemplating
{
Task<string> GetContentOrNullAsync(
[NotNull] string templateName,
[CanBeNull] string cultureName = null
[CanBeNull] string cultureName = null,
bool tryDefaults = true
);
Task<string> GetContentOrNullAsync(
[NotNull] TemplateDefinition templateDefinition,
[CanBeNull] string cultureName = null
[CanBeNull] string cultureName = null,
bool tryDefaults = true
);
}
}

6
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));
}
}
}

101
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<string> GetContentOrNullAsync(
public virtual Task<string> 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<string> GetContentOrNullAsync(
public virtual async Task<string> 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<string> GetContentOrNullAsync(
ITemplateContentContributor[] contributors,
TemplateContentContributorContext context)
{
foreach (var contributor in contributors)
{
var templateString = await contributor.GetOrNullAsync(context);
if (templateString != null)
{
return templateString;
}
}
return null;
}
}
}

2
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;
}

2
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);
}
}

4
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;
}

5
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
);
}
}

30
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);
}
}
}
Loading…
Cancel
Save