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