abp icon indicating copy to clipboard operation
abp copied to clipboard

About Inline localization in template engines

Open colinin opened this issue 1 year ago • 2 comments

Is there an existing issue for this?

  • [X] I have searched the existing issues

Is your feature request related to a problem? Please describe the problem.

I noticed that the template engine rendering is already asynchronous, but when I use an asynchronous inline localization resource, it will cause rendering failure because it usesStringLocalizerFactory.CreateByResourceName

Affected Code: https://github.com/abpframework/abp/blob/b46dfa722a36b3bd9cd903def1793b114ca639b4/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateRenderingEngineBase.cs#L32-L40

Describe the solution you'd like

Replacing synchronous functions with asynchronous localized resources

example:

public abstract class TemplateRenderingEngineBase : ITemplateRenderingEngine
{
    public abstract string Name { get; }

    protected readonly ITemplateDefinitionManager TemplateDefinitionManager;
    protected readonly ITemplateContentProvider TemplateContentProvider;
    protected readonly IStringLocalizerFactory StringLocalizerFactory;

    public TemplateRenderingEngineBase(
        ITemplateDefinitionManager templateDefinitionManager,
        ITemplateContentProvider templateContentProvider,
        IStringLocalizerFactory stringLocalizerFactory)
    {
        TemplateDefinitionManager = templateDefinitionManager;
        TemplateContentProvider = templateContentProvider;
        StringLocalizerFactory = stringLocalizerFactory;
    }

    public abstract Task<string> RenderAsync(string templateName, object? model = null, string? cultureName = null, Dictionary<string, object>? globalContext = null);

    protected virtual async Task<string?> GetContentOrNullAsync(TemplateDefinition templateDefinition)
    {
        return await TemplateContentProvider.GetContentOrNullAsync(templateDefinition);
    }

    protected async virtual Task<IStringLocalizer?> GetLocalizerOrNullAsync(TemplateDefinition templateDefinition)
    {
        if (templateDefinition.LocalizationResourceName != null)
        {
            return await StringLocalizerFactory.CreateByResourceNameOrNullAsync(templateDefinition.LocalizationResourceName);
        }
    
        return StringLocalizerFactory.CreateDefaultOrNull();
    }
}

Additional context

No response

colinin avatar May 27 '24 09:05 colinin

but when I use an asynchronous inline localization resource,

Can you share your code?

maliming avatar May 28 '24 02:05 maliming

but when I use an asynchronous inline localization resource,

Can you share your code?

After several tests, I believe it is due to the unreasonable design of my IExternalLocalizationStore interface implementation. The problem is that the template engine runs before the initialization of IExternalLocalizationStore

colinin avatar Jun 12 '24 06:06 colinin