.Net Core 3 IStringLocalizer.WithCulture (CultureInfo) est obsolète


9

J'ai mis à niveau un projet de .Net Core 2.2 vers .Net Core 3.0.

Après avoir essayé de corriger tous les avertissements et erreurs, j'essaie maintenant de financer une solution à cet avertissement:

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

J'utilise ceci pour changer la langue du site Web par l'utilisateur connecté. J'ai cette implémentation pour changer la culture du site Web par utilisateur:

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

Et ceci est la classe factice qui ne contient que le .resxfichier pour les traductions:

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

Je n'ai rien trouvé sur le Web qui se réfère à la façon de résoudre cet avertissement, à l'exception de cette discussion sur github qui ne semble pas encore avoir de solution.

Quelqu'un d'autre est-il tombé sur cet avertissement et y a-t-il trouvé une solution?

Réponses:


4

Est déjà mentionné dans le code source ici

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

Voici comment ils utilisent dans .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);
   }

Mise à jour: cette approche fonctionne jusqu'à ce que nous puissions avoir une annonce officielle de Microsoft

Vous pouvez créer un service comme celui-ci

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

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

Vous pouvez voir mon code complet ici


J'ai mis à jour ma question avec le code que j'utilise. Pourriez-vous, s'il vous plaît, y jeter un œil? Parce qu'il ne semble pas compatible avec votre solution.
Liran Friedman

@LiranFriedman où obtenez-vous ICultureLocalizer? J'essaie de rechercher cette interface mais je ne peux pas la trouver
Tony Ngo

Pourriez-vous expliquer comment la culture change par utilisateur? Chaque utilisateur sélectionne sa langue préférée dans son profil. Aussi, comment pourrais-je vérifier que cela fonctionne?
Liran Friedman

Pour ceux qui l'utilisent dans une application console - il est important de l'utiliser CurrentUICulturecar il CurrentCulturesemble n'avoir aucun effet StringLocalizer. Si vous utilisez dans une application Web, vous pouvez utiliser services.Configure<RequestLocalizationOptions>pour ajuster le comportement pour détecter la langue de la demande de l'utilisateur actuel, mais soyez conscient des valeurs par défaut de Microsoft - en-têtes, cookies, peu importe - pour la détection automatique de la langue. Pour cette raison, je préfère m'adapter RequestCultureProvidersà mon propre mécanisme connu pour détecter la langue de l'utilisateur.
JustAMartin
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.