Net Core 3 IStringLocalizer.WithCulture (CultureInfo) kullanılmıyor.


9

Bir projeyi .Net Core 2.2'den .Net Core 3.0'a yükselttim.

Tüm uyarıları ve hataları düzeltmeye çalıştıktan sonra şimdi bu uyarıya bir çözüm sağlamaya çalışıyorum:

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

Oturum açmış kullanıcı başına web sitesi dilini değiştirmek için bunu kullanıyorum. Kullanıcı başına web sitesi kültürünü değiştirmek için bu uygulama var:

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];
    }
}

Ve bu sadece .resxçeviriler için dosyayı tutan kukla sınıftır :

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

Web'de, henüz çözüm bulunmayan github üzerine tartışma dışında bu uyarının nasıl çözüleceğine dair hiçbir şey bulamadım .

Başka kimse bu uyarıyı tökezledi ve buna bir çözüm buldu mu?

Yanıtlar:


4

Burada kaynak kodda zaten bahsediliyor

    /// <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);

.Net Core 3.0'da nasıl kullanıldıkları aşağıda açıklanmıştır

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);
   }

Güncelleme: Bu yaklaşım Microsoft'tan resmi bir duyuru alana kadar

Bunun gibi bir hizmet oluşturabilirsiniz

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];
        }
    }

Sonra startup.cs dosyasında

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?}");
            });
        }
    }

Tam kodumu burada görüntüleyebilirsiniz


Sorumu kullandığım kodla güncelledim. Lütfen bir göz atar mısın? Çünkü çözümünüzle uyumlu görünmüyor.
Liran Friedman

@LiranFriedman ICultureLocalizer'ı nereden edinebilirsiniz? Bu arayüzü aramaya çalışıyorum ama bulamıyorum
Tony Ngo

Kültürün kullanıcı başına nasıl değiştiğini açıklar mısınız? Her kullanıcı profilinde tercih ettiği dili seçer. Ayrıca, çalışıp çalışmadığını nasıl kontrol edebilirim?
Liran Friedman

Bunu bir konsol uygulamasında kullananlar için - kullanımı önemlidir CurrentUICultureçünkü CurrentCultureüzerinde hiçbir etkisi yoktur StringLocalizer. Bir web uygulamasında kullanıyorsanız, services.Configure<RequestLocalizationOptions>geçerli kullanıcının istek dilini tespit etme davranışını ayarlamak için kullanabilirsiniz , ancak otomatik dil algılama için Microsoft varsayılanlarının (üstbilgiler, çerezler, her neyse) farkında olun. Bu nedenle, RequestCultureProviderskullanıcının dilini tespit etmek için bilinen kendi mekanizmamı ayarlamayı tercih ediyorum .
JustAMartin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.