更改 IStringLocalizer 的语言

Nat*_*ini 2 c# internationalization .net-core

我试图IStringLocalizer在运行时动态设置语言。似乎可以做到这一点的唯一可用方法是IStringLocalizer.WithCulture. 但是,尝试使用它会导致弃用警告。

public IStringLocalizer GetLocalizer(string locale) {
    this.localizerFactory.Create(typeof(CommonResources)).WithCulture(new CultureInfo(locale));
}
Run Code Online (Sandbox Code Playgroud)

没有使用 ASP,而是在IHostedService处理来自另一个来源(各种网络聊天 API)的用户交互中执行此操作。此服务需要符合管理员为聊天服务器或频道设置的语言(存储在数据库中)。

设置 . 语言的正确的当前方法是IStringLocalizer什么?我应该完全使用另一个类吗?

小智 10

这应该这样做。CultureInfo.CurrentUICulture在获取字符串值之前,您需要设置为您想要的文化。

    private string GetStringValue(string stringName, string culture)
    {
        var specifiedCulture = new CultureInfo(culture);
        CultureInfo.CurrentCulture = specifiedCulture;
        CultureInfo.CurrentUICulture = specifiedCulture;
        var options = Options.Create(new LocalizationOptions { ResourcesPath = "Resources" });
        var factory = new ResourceManagerStringLocalizerFactory(options, new LoggerFactory());
        var localizer = new StringLocalizer<RecipeController>(factory);
        return localizer[stringName];
    }
Run Code Online (Sandbox Code Playgroud)

如果您有一个实例,则IStringLocalizer可以使用它而不是创建一个新实例。


Bos*_*eek -4

您可以编写自己的文化中间件,它可以根据用户设置文化,或者可以使用 Http 标头Accept-Language

app.UseRequestLocalization(roptions =>
        {
            IList<CultureInfo> supportedCultures = new List<CultureInfo>
            {
                new CultureInfo("en-US"),
                new CultureInfo("fr"),
            };
            roptions.DefaultRequestCulture = new RequestCulture("en-US");
            roptions.SupportedCultures = supportedCultures;
            roptions.SupportedUICultures = supportedCultures;
            roptions.RequestCultureProviders.Add(new YourCustomCultureProvider());
        });
Run Code Online (Sandbox Code Playgroud)

示例中间件

public class YourCustomCultureProvider : RequestCultureProvider
{
    public override Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
    {
        if (httpContext == null)
            throw new ArgumentNullException(nameof(httpContext));


        var culture = //Some Logic

        if (string.IsNullOrEmpty(culture))
        {
            // No values specified for either so no match
            return Task.FromResult((ProviderCultureResult)null);
        }

        var requestCulture = new ProviderCultureResult(culture);

        return Task.FromResult(requestCulture);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果可以帮助您,请参阅此链接 - https://joonasw.net/view/aspnet-core-localization-deep-dive