1、模块的定义,使用AbpStringLocalizerFactory替换了IStringLocalizerFactory,增加单例ResourceManagerStringLocalizerFactory,虚拟文件定义,本地化配置文件
[DependsOn( typeof(AbpVirtualFileSystemModule), typeof(AbpSettingsModule), typeof(AbpLocalizationAbstractionsModule) )] public class AbpLocalizationModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { AbpStringLocalizerFactory.Replace(context.Services); Configure<VirtualFileSystemOptions>(options => { options.FileSets.AddEmbedded<AbpLocalizationModule>("Volo.Abp", "Volo/Abp"); }); Configure<AbpLocalizationOptions>(options => { options .Resources .Add<DefaultResource>("en"); options .Resources .Add<AbpValidationResource>("en") .AddVirtualJson("/Localization/Resources/AbpValidation"); }); } }
配置有三个集合,本地化资源LocalizationResource,资源贡献者ILocalizationResourceContributor,语言种类LanguageInfo
public class AbpLocalizationOptions { public LocalizationResourceDictionary Resources { get; } public ITypeList<ILocalizationResourceContributor> GlobalContributors { get; } public List<LanguageInfo> Languages { get; } public AbpLocalizationOptions() { Resources = new LocalizationResourceDictionary(); GlobalContributors = new TypeList<ILocalizationResourceContributor>(); Languages = new List<LanguageInfo>(); } }
AbpCultureHelper.Use,设置当前的语言,同设置租户功能差不多
public static IDisposable Use([NotNull] CultureInfo culture, CultureInfo uiCulture = null) { Check.NotNull(culture, nameof(culture)); var currentCulture = CultureInfo.CurrentCulture; var currentUiCulture = CultureInfo.CurrentUICulture; CultureInfo.CurrentCulture = culture; CultureInfo.CurrentUICulture = uiCulture ?? culture; return new DisposeAction(() => { CultureInfo.CurrentCulture = currentCulture; CultureInfo.CurrentUICulture = currentUiCulture; }); }
2、本地化字符串访问器IStringLocalizer<T>,IStringLocalizer
是一个实现了 IEnumerable
的简单接口并且拥有索引器来来返回本地化的字符串。
重点关注AbpDictionaryBasedStringLocalizer。
_localizer["About Title"] 没有发现 “About Title” 的本地化值,则索引的键值被返回
public static IApplicationBuilder UseAbpRequestLocalization(this IApplicationBuilder app) { IReadOnlyList<LanguageInfo> languages; string defaultLanguage; using (var scope = app.ApplicationServices.CreateScope()) { var languageProvider = scope.ServiceProvider.GetRequiredService<ILanguageProvider>(); languages = languageProvider.GetLanguages(); var settingProvider = scope.ServiceProvider.GetRequiredService<ISettingProvider>(); defaultLanguage = settingProvider.GetOrNull(LocalizationSettingNames.DefaultLanguage); } if (!languages.Any()) { return app.UseRequestLocalization(); } var options = new RequestLocalizationOptions { DefaultRequestCulture = DefaultGetRequestCulture(defaultLanguage, languages), SupportedCultures = languages .Select(l => l.CultureName) .Distinct() .Select(c => new CultureInfo(c)) .ToArray(), SupportedUICultures = languages .Select(l => l.UiCultureName) .Distinct() .Select(c => new CultureInfo(c)) .ToArray() }; return app.UseRequestLocalization(options); }
原文:https://www.cnblogs.com/cloudsu/p/11171998.html