.Net Core 3 IStringLocalizer.WithCulture (CultureInfo) ist veraltet

9

Ich habe ein Projekt von .Net Core 2.2 auf .Net Core 3.0 aktualisiert.

Nachdem ich versucht habe, alle Warnungen und Fehler zu beheben, versuche ich nun, eine Lösung für diese Warnung zu finden:

'IStringLocalizer.WithCulture(CultureInfo)' is obsolete: 'This method is obsolete.
 Use `CurrentCulture` and `CurrentUICulture` instead.'

Ich verwende dies, um die Sprache der Website für den angemeldeten Benutzer zu ändern. Ich habe diese Implementierung, um die Website-Kultur pro Benutzer zu ändern:

public class CultureLocalizer : ICultureLocalizer
{
    private readonly IStringLocalizer localizer;
    public CultureLocalizer(IStringLocalizerFactory factory)
    {
        var type = typeof(Resources.PageResources);
        var assemblyName = new AssemblyName(type.GetTypeInfo().Assembly.FullName);
        localizer = factory.Create("PageResources", assemblyName.Name);
    }

    // if we have formatted string we can provide arguments         
    // e.g.: @Localizer.Text("Hello {0}", User.Name)
    public LocalizedString Get(string key, params string[] arguments)
    {
        return arguments == null ? localizer[key] : localizer[key, arguments];
    }

    public LocalizedString Get(Enum key, params string[] arguments)
    {
        return arguments == null ? localizer[key.ToString()] : localizer[key.ToString(), arguments];
    }

    public LocalizedString Get(CultureInfo culture, string key, params string[] arguments)
    {
        // This is obsolete
        return arguments == null ? localizer.WithCulture(culture)[key] : localizer.WithCulture(culture)[key, arguments];
    }

    public LocalizedString Get(CultureInfo culture, Enum key, params string[] arguments)
    {
        // This is obsolete
        return arguments == null ? localizer.WithCulture(culture)[key.ToString()] : localizer.WithCulture(culture)[key.ToString(), arguments];
    }
}

Und dies ist die Dummy-Klasse, die nur die .resxDatei für die Übersetzungen enthält:

// dummy class for grouping localization resources
public class PageResources
{
}

Ich konnte im Web nichts finden, was darauf hinweist, wie diese Warnung gelöst werden kann, außer dieser Diskussion über Github , die anscheinend noch keine Lösung hat.

War noch jemand auf diese Warnung gestoßen und hatte eine Lösung dafür gefunden?

Liran Friedman
quelle

Antworten:

4

Ist eigentlich schon erwähnt , da Quellcode hier

    /// <summary>
    /// Creates a new <see cref="IStringLocalizer"/> for a specific <see cref="CultureInfo"/>.
    /// </summary>
    /// <param name="culture">The <see cref="CultureInfo"/> to use.</param>
    /// <returns>A culture-specific <see cref="IStringLocalizer"/>.</returns>
    [Obsolete("This method is obsolete. Use `CurrentCulture` and `CurrentUICulture` instead.")]
    IStringLocalizer WithCulture(CultureInfo culture);

Hier erfahren Sie, wie sie in .Net Core 3.0 verwendet werden

public static void Main()  
   {
      // Display the name of the current thread culture.
      Console.WriteLine("CurrentCulture is {0}.", CultureInfo.CurrentCulture.Name);

      // Change the current culture to th-TH.
      CultureInfo.CurrentCulture = new CultureInfo("th-TH", false);
      Console.WriteLine("CurrentCulture is now {0}.", CultureInfo.CurrentCulture.Name);

      // Display the name of the current UI culture.
      Console.WriteLine("CurrentUICulture is {0}.", CultureInfo.CurrentUICulture.Name);

      // Change the current UI culture to ja-JP.
      CultureInfo.CurrentUICulture = new CultureInfo( "ja-JP", false );
      Console.WriteLine("CurrentUICulture is now {0}.", CultureInfo.CurrentUICulture.Name);
   }

Update: Dieser Ansatz wird so lange umgangen, bis wir eine offizielle Ankündigung von Microsoft erhalten

Sie können einen solchen Dienst erstellen

public class LocalizationService
    {
        private readonly IStringLocalizer _localizer;

        public LocalizationService(IStringLocalizerFactory factory)
        {
            var type = typeof(SharedResource);
            var assemblyName = new AssemblyName(type.GetTypeInfo().Assembly.FullName);
            _localizer = factory.Create("SharedResource", assemblyName.Name);
        }

        public LocalizedString GetLocalizedHtmlString(string key)
        {
            return _localizer[key];
        }
    }

Dann in Ihrer Startup.cs

public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddScoped<LocalizationService>();
            services.AddLocalization(options => options.ResourcesPath = "Resources");

            services.Configure<RequestLocalizationOptions>(options =>
            {
                var supportedCultures = new[]
                {
                    new CultureInfo("en"),
                    new CultureInfo("nl")
                };

                options.DefaultRequestCulture = new RequestCulture(culture: "en", uiCulture: "en");
                options.SupportedCultures = supportedCultures;
                options.SupportedUICultures = supportedCultures;
            });

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
                .AddDataAnnotationsLocalization(options =>
                {
                    options.DataAnnotationLocalizerProvider = (type, factory) =>
                    {
                        var assemblyName = new AssemblyName(typeof(SharedResource).GetTypeInfo().Assembly.FullName);
                        return factory.Create("SharedResource", assemblyName.Name);
                    };
                });
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

            var localizationOption = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
            app.UseRequestLocalization(localizationOption.Value);

            app.UseStaticFiles();
            app.UseCookiePolicy();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }

Sie können meinen vollständigen Code anzeigen hier

Tony Ngo
quelle
Ich habe meine Frage mit dem von mir verwendeten Code aktualisiert. Könnten Sie es sich bitte ansehen? Weil es nicht mit Ihrer Lösung kompatibel aussieht.
Liran Friedman
@LiranFriedman Woher bekommst du ICultureLocalizer? Ich versuche nach dieser Schnittstelle zu suchen, aber ich kann sie nicht finden
Tony Ngo
Könnten Sie bitte erklären, wie sich die Kultur pro Benutzer ändert? Jeder Benutzer wählt seine bevorzugte Sprache in seinem Profil aus. Wie kann ich auch überprüfen, ob es funktioniert?
Liran Friedman
Für diejenigen, die dies in einer Konsolen-App verwenden, ist es wichtig, es zu verwenden, CurrentUICultureda CurrentCulturees keine Auswirkungen auf zu haben scheint StringLocalizer. Bei Verwendung in einer Web-App können Sie das services.Configure<RequestLocalizationOptions>Verhalten zum Erkennen der Anforderungssprache des aktuellen Benutzers anpassen. Beachten Sie jedoch die Microsoft-Standardeinstellungen - Header, Cookies usw. - für die automatische Spracherkennung. Aus diesem Grund ziehe ich es vor RequestCultureProviders, mich an meinen bekannten Mechanismus zur Erkennung der Benutzersprache anzupassen .
JustAMartin