.Net Core 3 IStringLocalizer.WithCARM (CultureInfo) đã lỗi thời


9

Tôi đã nâng cấp một dự án từ .Net Core 2.2 lên .Net Core 3.0.

Sau khi cố gắng sửa tất cả các cảnh báo và lỗi, giờ tôi đang cố gắng tài trợ cho một giải pháp cho cảnh báo này:

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

Tôi đang sử dụng điều này để thay đổi ngôn ngữ trang web cho mỗi người dùng đã đăng nhập. Tôi có triển khai này để thay đổi văn hóa trang web trên mỗi người dùng:

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

Và đây là lớp giả chỉ giữ .resxtệp cho các bản dịch:

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

Tôi không thể tìm thấy bất cứ điều gì trên web đề cập đến cách giải quyết cảnh báo này ngoại trừ cuộc thảo luận này trên github dường như chưa có giải pháp nào.

Có ai khác vấp phải cảnh báo này và tìm ra giải pháp cho nó?

Câu trả lời:


4

Đã được đề cập trong đó có mã nguồn ở đây

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

Đây là cách họ sử dụng trong .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);
   }

Cập nhật: Cách tiếp cận này được thực hiện cho đến khi chúng tôi có thể có thông báo chính thức từ Microsoft

Bạn có thể tạo một dịch vụ như thế này

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

Sau đó, trong startup.cs của bạn

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

Bạn có thể xem mã đầy đủ của tôi ở đây


Tôi đã cập nhật câu hỏi của mình với mã mà tôi đang sử dụng. Bạn có thể vui lòng xem nó không? Bởi vì nó không tương thích với giải pháp của bạn.
Liran Friedman

@LiranFriedman bạn lấy ICULTLocalizer ở đâu? Tôi đang cố gắng tìm kiếm giao diện đó nhưng tôi không thể tìm thấy nó
Tony Ngo

Bạn có thể giải thích văn hóa thay đổi như thế nào trên mỗi người dùng? Mỗi người dùng chọn ngôn ngữ ưa thích của mình trong hồ sơ của mình. Ngoài ra, làm thế nào tôi có thể kiểm tra để xem nó hoạt động?
Liran Friedman

Đối với những người sử dụng điều này trong một ứng dụng giao diện điều khiển - điều quan trọng là sử dụng CurrentUICultureCurrentCulturedường như không có tác dụng StringLocalizer. Nếu sử dụng trong ứng dụng web, bạn có thể sử dụng services.Configure<RequestLocalizationOptions>để điều chỉnh hành vi phát hiện ngôn ngữ yêu cầu của người dùng hiện tại, nhưng lưu ý về mặc định của Microsoft - tiêu đề, cookie, bất cứ điều gì - để phát hiện ngôn ngữ tự động. Vì lý do này, tôi thích điều chỉnh RequestCultureProviderstheo cơ chế đã biết của mình để phát hiện ngôn ngữ của người dùng.
JustAMartin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.