.Net Core 3 IStringLocalizer.WithCulture (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
{
}

아직 해결책이없는 것으로 보이는 github에 대한 토론을 제외 하고는이 경고를 해결하는 방법을 나타내는 웹에서 아무것도 찾을 수 없습니다 .

다른 사람 이이 경고를 우연히 발견하고 해결책을 찾았습니까?

답변:


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

그런 다음 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?}");
            });
        }
    }

여기 내 전체 코드를 볼 수 있습니다


사용중인 코드로 질문을 업데이트했습니다. 좀 봐 주시겠습니까? 솔루션과 호환되지 않는 것 같습니다.
Liran Friedman

@LiranFriedman ICultureLocalizer는 어디서 구할 수 있습니까? 해당 인터페이스를 검색하려고하는데 찾을 수 없습니다
Tony Ngo

사용자마다 문화가 어떻게 변하는 지 설명해 주시겠습니까? 각 사용자는 자신의 프로필에서 선호하는 언어를 선택합니다. 또한 어떻게 작동하는지 확인할 수 있습니까?
Liran Friedman 08

콘솔 응용 프로그램에서 이것을 사용하는 사람들을 위해 - 그것을 사용하는 것이 중요 CurrentUICulture하기 때문에 CurrentCulture아무런 영향이없는 것으로 보인다 StringLocalizer. 웹 앱에서 사용 services.Configure<RequestLocalizationOptions>하는 경우 현재 사용자의 요청 언어를 감지하기위한 동작을 조정할 수 있지만 자동 언어 감지를위한 Microsoft 기본값 (헤더, 쿠키 등)을 알고 있어야합니다. 이러한 이유로 RequestCultureProviders사용자의 언어를 감지하는 알려진 메커니즘을 선호합니다 .
JustAMartin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.