.Net कोर 3 IStringLocalizer.Oulture (CultureInfo) अप्रचलित है


9

मैंने .Net Core 2.2 से .Net Core 3.0 के लिए एक प्रोजेक्ट अपग्रेड किया है।

सभी चेतावनियों और त्रुटियों को ठीक करने की कोशिश करने के बाद, मैं अब इस चेतावनी के समाधान के लिए प्रयास कर रहा हूं:

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

मैं लॉग-इन उपयोगकर्ता के प्रति वेबसाइट की भाषा को बदलने के लिए इसका उपयोग कर रहा हूं। मेरे पास प्रति उपयोगकर्ता वेबसाइट संस्कृति को बदलने के लिए यह कार्यान्वयन है:

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

और यह डमी क्लास है जो केवल .resxअनुवाद के लिए फाइल रखती है :

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

मुझे वेब पर कुछ भी नहीं मिला जो संदर्भित करता है कि इस चेतावनी को कैसे हल किया जाए सिवाय गितुब पर इस चर्चा को छोड़कर जो अभी तक कोई समाधान नहीं है।

क्या किसी और ने इस चेतावनी पर ठोकर खाई थी और इसका कोई हल निकाला था?

जवाबों:


4

यहाँ स्रोत कोड में पहले ही उल्लेख किया गया है

    /// <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 का उपयोग कैसे करते हैं

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

अद्यतन: यह दृष्टिकोण तब तक काम करता है जब तक कि हम Microsoft से आधिकारिक घोषणा नहीं कर सकते

आप इस तरह की सेवा बना सकते हैं

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

फिर अपने स्टार्टअप में

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

आप यहाँ मेरा पूरा कोड देख सकते हैं


मैंने अपने प्रश्न को उस कोड से अपडेट किया है जिसका मैं उपयोग कर रहा हूं। क्या आप कृपया इसे देख सकते हैं? क्योंकि यह आपके समाधान के अनुकूल नहीं दिखता है।
लिरन फ्रीडमैन

@LiranFriedman आपको ICultureLocalizer कहाँ मिलता है? मैं उस इंटरफ़ेस को खोजने की कोशिश कर रहा हूं, लेकिन मुझे यह नहीं मिल रहा है
टोनी नोगो

क्या आप बता सकते हैं कि संस्कृति प्रति उपयोगकर्ता कैसे बदलती है? प्रत्येक उपयोगकर्ता अपनी प्रोफ़ाइल में अपनी पसंदीदा भाषा का चयन करता है। इसके अलावा, मैं यह कैसे देख सकता हूं कि यह काम करता है?
लिरन फ्रीडमैन

कंसोल ऐप में इसका उपयोग करने वालों के लिए - इसका उपयोग करना महत्वपूर्ण है CurrentUICultureक्योंकि CurrentCultureऐसा लगता है कि इसका कोई प्रभाव नहीं है StringLocalizer। यदि किसी वेब ऐप में उपयोग किया जाता है, तो आप services.Configure<RequestLocalizationOptions>वर्तमान उपयोगकर्ता की अनुरोध भाषा का पता लगाने के लिए व्यवहार को समायोजित करने के लिए उपयोग कर सकते हैं, लेकिन स्वचालित भाषा पहचान के लिए Microsoft डिफॉल्ट्स - हेडर, कुकीज़, जो भी हो - के बारे में पता होना चाहिए। इस कारण से मैं RequestCultureProvidersउपयोगकर्ता की भाषा का पता लगाने के लिए अपने स्वयं के ज्ञात तंत्र में समायोजित करना पसंद करता हूं।
जस्टामार्टिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.