Blazor Server .NET8:如何基于域名/TLD设置区域文化?
.NET 8 Blazor Server 基于域名实现自动本地化语言选择
在Blazor Server环境中,program.cs是应用启动阶段的配置代码,此时没有请求上下文,无法直接获取当前请求的域名。要实现基于域名的自动语言选择,需要在每个请求的上下文动态判断域名并设置本地化配置,而非在启动时硬编码。
实现步骤
定义域名与文化的映射关系
先在program.cs中定义域名对应的默认文化和支持的文化集合:var domainCultureMap = new Dictionary<string, (string DefaultCulture, string[] SupportedCultures)> { { "mysite.com", ("en-US", new[] { "en-US", "ko-KR" }) }, { "mysite.kr", ("ko-KR", new[] { "ko-KR", "en-US" }) } };自定义请求本地化提供器
创建一个自定义的IRequestCultureProvider,用于在每个请求中根据域名获取对应的文化设置:public class CustomDomainRequestCultureProvider : IRequestCultureProvider { private readonly Dictionary<string, (string DefaultCulture, string[] SupportedCultures)> _domainCultureMap; public CustomDomainRequestCultureProvider(Dictionary<string, (string DefaultCulture, string[] SupportedCultures)> domainCultureMap) { _domainCultureMap = domainCultureMap; } public Task<ProviderCultureResult?> DetermineProviderCultureResult(HttpContext httpContext) { var host = httpContext.Request.Host.Host; // 提取主域名(处理www.mysite.com这类带前缀的域名) var mainDomain = ExtractMainDomain(host); if (_domainCultureMap.TryGetValue(mainDomain, out var cultureSettings)) { return Task.FromResult(new ProviderCultureResult( cultureSettings.DefaultCulture, cultureSettings.DefaultCulture, cultureSettings.SupportedCultures)); } // 域名未匹配时返回默认文化 return Task.FromResult(new ProviderCultureResult("en-US", "en-US", new[] { "en-US", "ko-KR" })); } private string ExtractMainDomain(string host) { var parts = host.Split('.'); // 取最后两段作为主域名(如mysite.com、mysite.kr) return parts.Length >= 2 ? $"{parts[^2]}.{parts[^1]}" : host; } }在program.cs中配置本地化
将自定义提供器添加到RequestLocalizationOptions中,确保它优先于其他默认提供器执行:var localizationOptions = new RequestLocalizationOptions(); // 将自定义提供器插入到最前面,确保优先执行 localizationOptions.RequestCultureProviders.Insert(0, new CustomDomainRequestCultureProvider(domainCultureMap)); app.UseRequestLocalization(localizationOptions);
关键说明
- 该方案会在每个请求到达时通过
HttpContext获取域名,动态设置文化,确保服务器端首次渲染时就应用正确的语言,符合搜索引擎索引的要求。 - 自定义提供器优先于默认的Cookie、Accept-Language提供器执行,保证域名规则的优先级最高。
ExtractMainDomain方法可根据实际需求调整,比如处理多级别域名或特定子域名场景。
内容的提问来源于stack exchange,提问作者Busta Di Canni
相关产品推荐
相关产品推荐

