diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateProvider.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateProvider.cs index c67af27757..804cf2176e 100644 --- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateProvider.cs +++ b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Templates/EmailTemplateProvider.cs @@ -103,10 +103,10 @@ namespace Volo.Abp.Emailing.Templates var localizer = StringLocalizerFactory.Create(emailTemplateDefinition.LocalizationResource); if (cultureName != null) { - emailTemplate.SetContent( - TemplateLocalizer.Localize(localizer.WithCulture(new CultureInfo(cultureName)), - emailTemplate.Content) - ); + using (localizer.Change(new CultureInfo(cultureName))) + { + emailTemplate.SetContent(TemplateLocalizer.Localize(localizer, emailTemplate.Content)); + } } else { diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpDictionaryBasedStringLocalizer.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpDictionaryBasedStringLocalizer.cs index d6b7073ee5..620cbd30f5 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpDictionaryBasedStringLocalizer.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpDictionaryBasedStringLocalizer.cs @@ -41,6 +41,7 @@ namespace Volo.Abp.Localization ); } + [Obsolete("This method is obsolete. Use `CurrentCulture` and `CurrentUICulture` instead.")] public IStringLocalizer WithCulture(CultureInfo culture) { return new CultureWrapperStringLocalizer(culture.Name, this); @@ -70,10 +71,13 @@ namespace Volo.Abp.Localization { foreach (var baseLocalizer in BaseLocalizers) { - var baseLocalizedString = baseLocalizer.WithCulture(CultureInfo.GetCultureInfo(cultureName))[name]; - if (baseLocalizedString != null && !baseLocalizedString.ResourceNotFound) + using (baseLocalizer.Change(CultureInfo.GetCultureInfo(cultureName))) { - return baseLocalizedString; + var baseLocalizedString = baseLocalizer[name]; + if (baseLocalizedString != null && !baseLocalizedString.ResourceNotFound) + { + return baseLocalizedString; + } } } @@ -132,20 +136,23 @@ namespace Volo.Abp.Localization if (includeBaseLocalizers) { - foreach (var baseLocalizer in BaseLocalizers.Select(l => l.WithCulture(CultureInfo.GetCultureInfo(cultureName)))) + foreach (var baseLocalizer in BaseLocalizers.Select(l => l)) { - //TODO: Try/catch is a workaround here! - try + using (baseLocalizer.Change(CultureInfo.GetCultureInfo(cultureName))) { - var baseLocalizedString = baseLocalizer.GetAllStrings(includeParentCultures); - foreach (var localizedString in baseLocalizedString) + //TODO: Try/catch is a workaround here! + try { - allStrings[localizedString.Name] = localizedString; + var baseLocalizedString = baseLocalizer.GetAllStrings(includeParentCultures); + foreach (var localizedString in baseLocalizedString) + { + allStrings[localizedString.Name] = localizedString; + } } - } - catch (MissingManifestResourceException) - { + catch (MissingManifestResourceException) + { + } } } } @@ -198,6 +205,7 @@ namespace Volo.Abp.Localization return _innerLocalizer.GetAllStrings(_cultureName, includeParentCultures); } + [Obsolete("This method is obsolete. Use `CurrentCulture` and `CurrentUICulture` instead.")] public IStringLocalizer WithCulture(CultureInfo culture) { return new CultureWrapperStringLocalizer(culture.Name, _innerLocalizer); diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/StringLocalizerExtensions.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/StringLocalizerExtensions.cs new file mode 100644 index 0000000000..079b35e762 --- /dev/null +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/StringLocalizerExtensions.cs @@ -0,0 +1,29 @@ +using System; +using System.Globalization; +using JetBrains.Annotations; +using Microsoft.Extensions.Localization; + +namespace Volo.Abp.Localization +{ + public static class StringLocalizerExtensions + { + /// + /// Change the CurrentCulture and CurrentUICulture of CultureInfo. + /// If uiCulture is null, CultureInfo.CurrentUICulture will use culture. + /// + public static IDisposable Change(this IStringLocalizer localizer, CultureInfo culture, [CanBeNull]CultureInfo uiCulture = null) + { + var originalCulture = CultureInfo.CurrentCulture; + var originalUICulture = CultureInfo.CurrentUICulture; + + CultureInfo.CurrentCulture = culture; + CultureInfo.CurrentUICulture = uiCulture ?? culture; + + return new DisposeAction(() => + { + CultureInfo.CurrentCulture = originalCulture; + CultureInfo.CurrentUICulture = originalUICulture; + }); + } + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalization_Tests.cs b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalization_Tests.cs index 46f34e054d..d0971795a4 100644 --- a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalization_Tests.cs +++ b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/AbpLocalization_Tests.cs @@ -144,15 +144,32 @@ namespace Volo.Abp.Localization [Fact] public void Should_Get_Localized_Text_If_Defined_In_Requested_Culture() { - _localizer.WithCulture(CultureInfo.GetCultureInfo("en"))["Car"].Value.ShouldBe("Car"); - _localizer.WithCulture(CultureInfo.GetCultureInfo("en"))["CarPlural"].Value.ShouldBe("Cars"); - - _localizer.WithCulture(CultureInfo.GetCultureInfo("tr"))["Car"].Value.ShouldBe("Araba"); - _localizer.WithCulture(CultureInfo.GetCultureInfo("tr"))["CarPlural"].Value.ShouldBe("Araba"); + using (_localizer.Change(CultureInfo.GetCultureInfo("en"))) + { + _localizer["Car"].Value.ShouldBe("Car"); + } + using (_localizer.Change(CultureInfo.GetCultureInfo("en"))) + { + _localizer["CarPlural"].Value.ShouldBe("Cars"); + } - _localizer.WithCulture(CultureInfo.GetCultureInfo("es"))["Car"].Value.ShouldBe("Auto"); - _localizer.WithCulture(CultureInfo.GetCultureInfo("es"))["CarPlural"].Value.ShouldBe("Autos"); + using (_localizer.Change(CultureInfo.GetCultureInfo("tr"))) + { + _localizer["Car"].Value.ShouldBe("Araba"); + } + using (_localizer.Change(CultureInfo.GetCultureInfo("tr"))) + { + _localizer["CarPlural"].Value.ShouldBe("Araba"); + } + using (_localizer.Change(CultureInfo.GetCultureInfo("es"))) + { + _localizer["Car"].Value.ShouldBe("Auto"); + } + using (_localizer.Change(CultureInfo.GetCultureInfo("es"))) + { + _localizer["CarPlural"].Value.ShouldBe("Autos"); + } } [Fact]