如何在应用程序运行时更新 RequestLocalizationOptions 并添加新文化以避免重新启动应用程序?
您好!我有一个支持本地化的应用程序。所有资源和价值都存储在数据库中。我将向您展示我是如何配置 RequestLocalizationOptions 的。
public static IServiceCollection AddRequestLocalizationOptions(this IServiceCollection services)
{
services.Configure<RequestLocalizationOptions>(async options =>
{
using var scope = services?.BuildServiceProvider().CreateScope();
var cultureService = scope!.ServiceProvider!.GetService<ICultureService>();
if (cultureService is not null)
{
var cultures = await cultureService.GetFromDatabase(x => x.Available == true);
IList<CultureInfo> supportedCultures = new List<CultureInfo>();
foreach (var culture in cultures)
{
supportedCultures.Add(new CultureInfo($"{culture.language}-{culture.CountryCodeIso2}")); // en-US, it-IT and so on
}
options.DefaultRequestCulture = new RequestCulture("en-US");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
options.RequestCultureProviders = new List<IRequestCultureProvider>
{
new CookieRequestCultureProvider()
};
var cookieRequestCultureProvider = options.RequestCultureProviders.OfType<CookieRequestCultureProvider>().FirstOrDefault();
if (cookieRequestCultureProvider is not null)
cookieRequestCultureProvider.CookieName = CookieDefaults.CultureKey;
}
});
return services;
}
最后的配置步骤是使用 UseRequestLocalization 方法启用本地化中间件。
app.UseRequestLocalization();
UseRequestLocalization方法初始化我们上面配置的RequestLocalizationOptions对象。 UseRequestLocalization 通过根据用户的语言偏好设置每个用户请求的文化和 UI 文化,实现本地化和国际化。
除一种情况外,一切正常。假设我在数据库中有 3 种文化可用,这意味着 options.SupportedCultures 它将包含所有 3 种文化。但是,如果我将更新数据库并在应用程序运行时添加另外 3 种可用的文化,我如何更新 RequestLocalizationOptions 以指定现在我支持 6 种文化而无需重新启动应用程序?因为 AddRequestLocalizationOptions 扩展只会在启动时执行一次,但我需要以某种方式在应用程序运行时刷新选项。如果我重新启动应用程序,它会按预期工作,但我不想在每次添加新文化时都在生产时重新启动应用程序..