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( Task<string> GetContentOrNullAsync(
[NotNull] string templateName, [NotNull] string templateName,
[CanBeNull] string cultureName = null [CanBeNull] string cultureName = null,
bool tryDefaults = true
); );
Task<string> GetContentOrNullAsync( Task<string> GetContentOrNullAsync(
[NotNull] TemplateDefinition templateDefinition, [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] [NotNull]
public IServiceProvider ServiceProvider { get; } public IServiceProvider ServiceProvider { get; }
[CanBeNull] [NotNull]
public string Culture { get; } public string Culture { get; }
public TemplateContentContributorContext( public TemplateContentContributorContext(
[NotNull] TemplateDefinition templateDefinition, [NotNull] TemplateDefinition templateDefinition,
[NotNull] IServiceProvider serviceProvider, [NotNull] IServiceProvider serviceProvider,
[CanBeNull] string culture) [NotNull] string culture)
{ {
TemplateDefinition = Check.NotNull(templateDefinition, nameof(templateDefinition)); TemplateDefinition = Check.NotNull(templateDefinition, nameof(templateDefinition));
ServiceProvider = Check.NotNull(serviceProvider, nameof(serviceProvider)); 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 System.Threading.Tasks;
using JetBrains.Annotations; using JetBrains.Annotations;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.Localization;
namespace Volo.Abp.TextTemplating namespace Volo.Abp.TextTemplating
{ {
@ -23,17 +25,19 @@ namespace Volo.Abp.TextTemplating
_templateDefinitionManager = templateDefinitionManager; _templateDefinitionManager = templateDefinitionManager;
} }
public Task<string> GetContentOrNullAsync( public virtual Task<string> GetContentOrNullAsync(
[NotNull] string templateName, [NotNull] string templateName,
[CanBeNull] string cultureName = null) [CanBeNull] string cultureName = null,
bool tryDefaults = true)
{ {
var template = _templateDefinitionManager.Get(templateName); var template = _templateDefinitionManager.Get(templateName);
return GetContentOrNullAsync(template, cultureName); return GetContentOrNullAsync(template, cultureName);
} }
public async Task<string> GetContentOrNullAsync( public virtual async Task<string> GetContentOrNullAsync(
[NotNull] TemplateDefinition templateDefinition, [NotNull] TemplateDefinition templateDefinition,
[CanBeNull] string cultureName = null) [CanBeNull] string cultureName = null,
bool tryDefaults = true)
{ {
Check.NotNull(templateDefinition, nameof(templateDefinition)); 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()) using (var scope = ServiceScopeFactory.CreateScope())
{ {
var context = new TemplateContentContributorContext( var contributors = Options.ContentContributors
templateDefinition, .Select(type => (ITemplateContentContributor) scope.ServiceProvider.GetRequiredService(type))
scope.ServiceProvider, .Reverse()
cultureName .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 return null;
.GetRequiredService(contentContributorType); }
//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) if (templateString != null)
{ {
return templateString; return templateString;
} }
} }
} }
throw new AbpException( //Not found
$"None of the template content contributors could get the content for the template '{templateDefinition.Name}'" 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(); _content = await fileInfo.ReadAsStringAsync();
} }
public string GetContent(string culture, string defaultCultureName) public string GetContentOrNull(string culture)
{ {
return _content; return _content;
} }

2
framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/ILocalizedTemplateContentReader.cs

@ -2,6 +2,6 @@
{ {
public interface ILocalizedTemplateContentReader 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( public string GetContentOrNull(string culture)
string culture,
string defaultCultureName = null)
{ {
return null; 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 var localizedReader = await _localizedTemplateContentReaderFactory
.CreateAsync(context.TemplateDefinition); .CreateAsync(context.TemplateDefinition);
return localizedReader.GetContent( return localizedReader.GetContentOrNull(
context.Culture ?? CultureInfo.CurrentUICulture.Name, context.Culture
context.TemplateDefinition.DefaultCultureName
); );
} }
} }

30
framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/VirtualFolderLocalizedTemplateContentReader.cs

@ -2,7 +2,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.FileProviders;
using Volo.Abp.Localization;
using Volo.Abp.VirtualFileSystem; using Volo.Abp.VirtualFileSystem;
namespace Volo.Abp.TextTemplating.VirtualFiles 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); return _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;
} }
} }
} }
Loading…
Cancel
Save