Hi,
I am trying to use razor an IViewLocalizer to send localized emails. How do I correctly set the Culture and UiCulture for the current rendering (Core Mvc 1.1.3)?
Thanks a lot!
Code snippet follows:
public class CoreRazorEngineRenderer : IRenderer
{
private readonly IRazorViewEngine _razorViewEngine;
private readonly ITempDataProvider _tempDataProvider;
private readonly IServiceProvider _serviceProvider;
public CoreRazorEngineRenderer(IRazorViewEngine razorViewEngine, ITempDataProvider tempDataProvider, IServiceProvider serviceProvider)
{
_razorViewEngine = razorViewEngine;
_tempDataProvider = tempDataProvider;
_serviceProvider = serviceProvider;
}
private ActionContext BuildActionContext(string controllerName, string partName)
{
var httpContext = new DefaultHttpContext { RequestServices = _serviceProvider };
var routeData = new RouteData();
routeData.Values.Add("controller", controllerName);
routeData.Values.Add("action", partName);
return new ActionContext(httpContext, routeData, new ActionDescriptor());
}
private ViewEngineResult GetView(ActionContext actionContext, string viewName)
{
return _razorViewEngine.FindView(actionContext, viewName, true);
}
public bool CanRender(string controllerName, string partName, string cultureName)
{
return GetView(BuildActionContext(controllerName, partName), partName)?.Success ?? false;
}
public async Task<string> Render(string controllerName, string partName, ExpandoObject model, CultureInfo culture, TimeZoneInfo timezone, IWebJobLogger logger)
{
var actionContext = BuildActionContext(controllerName, partName);
var viewResult = GetView(actionContext, partName);
if (viewResult.View == null || !viewResult.Success)
{
throw new ArgumentNullException($"{controllerName}, {partName} does not match any available view");
}
using (var sw = new StringWriter())
{
var viewDictionary = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary())
{
Model = model
};
var viewContext = new ViewContext(
actionContext,
viewResult.View,
viewDictionary,
new TempDataDictionary(actionContext.HttpContext, _tempDataProvider),
sw,
new HtmlHelperOptions()
);
await viewResult.View.RenderAsync(viewContext);
var result = sw.ToString();
return result;
}
}
}
You could set CultureInfo.CurrentCulture \ CultureInfo.CurrentUICulture before the RenderAsync call:
```C#
var currentCulture = CultureInfo.CurrentCulture;
var currentUICulture = CultureInfo.CurrentUICulture;
try
{
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
await viewResult.View.RenderAsync(viewContext);
}
finally
{
CultureInfo.CurrentCulture = currentCulture ;
CultureInfo.CurrentUICulture = currentUICulture ;
}
```
Yup, exactly what @pranavkm said.
Most helpful comment
You could set
CultureInfo.CurrentCulture\CultureInfo.CurrentUICulturebefore theRenderAsynccall:```C#
var currentCulture = CultureInfo.CurrentCulture;
var currentUICulture = CultureInfo.CurrentUICulture;
try
{
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
await viewResult.View.RenderAsync(viewContext);
}
finally
{
CultureInfo.CurrentCulture = currentCulture ;
CultureInfo.CurrentUICulture = currentUICulture ;
}
```