C#中如何将zh-CN映射为zh-Hans-CN以兼容多客户端本地化请求
实现文化代码映射的本地化解决方案
你可以通过包装内置请求文化提供器的方式,实现文化代码的映射,既不用复制本地化资源文件,也无需重复实现已有解析逻辑,完全符合你的需求。
实现步骤:
定义文化映射规则
先创建一个字典来管理需要映射的文化代码,方便后续扩展:private static readonly Dictionary<string, string> CultureMapping = new(StringComparer.OrdinalIgnoreCase) { ["zh-CN"] = "zh-Hans-CN", ["zh-TW"] = "zh-Hant-TW" };创建包装类处理文化映射
编写一个方法,将内置的RequestCultureProvider包装成带有映射逻辑的版本,复用原有解析逻辑的同时添加映射处理:private static RequestCultureProvider CreateMappedCultureProvider(RequestCultureProvider innerProvider) { return new RequestCultureProvider { ProviderCultureResultSelector = async context => { // 先调用内置提供器获取原始文化解析结果 var originalResult = await innerProvider.DetermineProviderCultureResult(context); if (originalResult == null) return null; // 映射Culture var mappedCultures = originalResult.Cultures.Select(culture => CultureMapping.TryGetValue(culture.Name, out var mappedCode) ? new CultureInfo(mappedCode) : culture).ToList(); // 映射UICulture var mappedUiCultures = originalResult.UICultures.Select(culture => CultureMapping.TryGetValue(culture.Name, out var mappedCode) ? new CultureInfo(mappedCode) : culture).ToList(); return new ProviderCultureResult(mappedCultures, mappedUiCultures); } }; }替换内置提供器
在Startup的本地化配置中,将默认的请求文化提供器替换为我们包装后的版本:var supportedCultures = new[] { "en-US", "zh-Hans-CN", "zh-Hant-TW" }; var localizationOptions = new RequestLocalizationOptions() .AddSupportedCultures(supportedCultures) .AddSupportedUICultures(supportedCultures) .SetDefaultCulture("en-US"); // 替换所有内置提供器,添加文化映射逻辑 localizationOptions.RequestCultureProviders = localizationOptions.RequestCultureProviders .Select(CreateMappedCultureProvider) .ToList(); app.UseRequestLocalization(localizationOptions);
方案优势:
- 完全复用内置的查询字符串、Cookie、Accept-Language头解析逻辑,无需重复编码
- 映射规则集中管理,后续新增映射仅需修改
CultureMapping字典 - 不需要复制任何
.resx文件,保持本地化资源的唯一性和可维护性
内容的提问来源于stack exchange,提问作者JALLRED
相关产品推荐
相关产品推荐

