ASP.NET Core 本地化文件不全时如何获取最终生效的解析语言
ASP.NET Core 无对应本地化资源时获取实际生效语言的方案
核心原因
ASP.NET Core 本地化中间件仅会根据请求头、路由、Cookie等规则设置线程的CurrentUICulture为请求匹配的受支持文化,不会因为不存在对应本地化资源文件就自动切换回默认文化,资源回退逻辑是IStringLocalizer内部处理的,因此直接读取线程文化无法匹配实际渲染用的语言。
可行实现方案
方案1:通过IStringLocalizer判断(推荐,轻量适配局部场景)
利用IStringLocalizer返回的LocalizedString的ResourceNotFound属性判断当前文化是否存在对应资源:
- 先在Razor页面或
_ViewImports.cshtml中注入本地化器:
@* 针对单页的本地化器 *@ @inject IStringLocalizer<IndexModel> PageLocalizer @* 如果用全局共享资源,替换为对应共享资源类即可 *@
- 在页头判断资源存在性,确定实际生效的文化:
@{ var defaultCulture = new System.Globalization.CultureInfo("en"); // 替换为你的默认语言 var actualCulture = System.Threading.Thread.CurrentThread.CurrentUICulture; // 传入当前页面必然存在的默认语言资源键做判断 if (PageLocalizer["Page_Exist_Key"].ResourceNotFound) { actualCulture = defaultCulture; } } <html lang="@actualCulture.TwoLetterISOLanguageName">
方案2:全局统一处理(适配全站规则)
如果需要全站统一逻辑,可以自定义一个扩展方法或者中间件,提前判断当前请求的文化是否存在对应资源文件,将实际生效文化存入HttpContext.Items,后续Razor页面直接读取即可:
- 编写辅助判断方法示例:
public static bool HasCultureResource(string cultureName, string resourceName) { var resxPath = Path.Combine(AppContext.BaseDirectory, $"{resourceName}.{cultureName}.resx"); return File.Exists(resxPath); }
- 在中间件或者PageFilter中写入实际文化到上下文:
// 这里以PageFilter为例 public class ActualCultureFilter : IPageFilter { private readonly IOptions<RequestLocalizationOptions> _locOptions; public ActualCultureFilter(IOptions<RequestLocalizationOptions> locOptions) { _locOptions = locOptions; } public void OnPageHandlerExecuting(PageHandlerExecutingContext context) { var currentCulture = Thread.CurrentThread.CurrentUICulture.Name; var defaultCulture = _locOptions.Value.DefaultRequestCulture.UICulture; // 替换为你的资源命名规则判断逻辑 if (!HasCultureResource(currentCulture, context.ActionDescriptor.PageName)) { context.HttpContext.Items["ActualUICulture"] = defaultCulture; return; } context.HttpContext.Items["ActualUICulture"] = Thread.CurrentThread.CurrentUICulture; } // 其余接口方法留空即可 }
- Razor中直接读取:
<html lang="@(((CultureInfo)Context.Items["ActualUICulture"]).TwoLetterISOLanguageName)">
内容的提问来源于stack exchange,提问作者Jorge Frias
相关产品推荐
相关产品推荐

