diff --git a/src/modules/imageresizer/tests/Models/ResizeBatchTests.cs b/src/modules/imageresizer/tests/Models/ResizeBatchTests.cs index 4e2c026cd7..e79f98c43a 100644 --- a/src/modules/imageresizer/tests/Models/ResizeBatchTests.cs +++ b/src/modules/imageresizer/tests/Models/ResizeBatchTests.cs @@ -62,7 +62,7 @@ namespace ImageResizer.Models batch.Files.Add("Image1.jpg"); batch.Files.Add("Image2.jpg"); - var errors = batch.Process(CancellationToken.None, (_, __) => { }).ToList(); + var errors = batch.Process((_, __) => { }, CancellationToken.None).ToList(); Assert.Equal(2, errors.Count); @@ -89,8 +89,8 @@ namespace ImageResizer.Models var calls = new ConcurrentBag<(int i, double count)>(); batch.Process( - CancellationToken.None, - (i, count) => calls.Add((i, count))); + (i, count) => calls.Add((i, count)), + CancellationToken.None); Assert.Equal(2, calls.Count); Assert.Contains(calls, c => c.i == 1 && c.count == 2); diff --git a/src/modules/imageresizer/tests/Models/ResizeOperationTests.cs b/src/modules/imageresizer/tests/Models/ResizeOperationTests.cs index 9519c8c3ec..837a7596e3 100644 --- a/src/modules/imageresizer/tests/Models/ResizeOperationTests.cs +++ b/src/modules/imageresizer/tests/Models/ResizeOperationTests.cs @@ -430,19 +430,19 @@ namespace ImageResizer.Models private static Settings Settings(Action action = null) { - var settings = new Settings + var settings = new Settings() { - Sizes = new ObservableCollection - { - new ResizeSize - { - Name = "Test", - Width = 96, - Height = 96, - }, - }, SelectedSizeIndex = 0, }; + settings.Sizes.Clear(); + + settings.Sizes.Add(new ResizeSize + { + Name = "Test", + Width = 96, + Height = 96, + }); + action?.Invoke(settings); return settings; diff --git a/src/modules/imageresizer/tests/Properties/SettingsTests.cs b/src/modules/imageresizer/tests/Properties/SettingsTests.cs index c76334d438..4856ce0146 100644 --- a/src/modules/imageresizer/tests/Properties/SettingsTests.cs +++ b/src/modules/imageresizer/tests/Properties/SettingsTests.cs @@ -30,9 +30,10 @@ namespace ImageResizer.Properties { var settings = new Settings { - Sizes = new ObservableCollection(), CustomSize = new CustomSize(), }; + + settings.Sizes.Clear(); var ncc = (INotifyCollectionChanged)settings.AllSizes; var result = AssertEx.Raises( @@ -48,10 +49,10 @@ namespace ImageResizer.Properties { var settings = new Settings { - Sizes = new ObservableCollection(), CustomSize = new CustomSize(), }; + settings.Sizes.Clear(); Assert.PropertyChanged( (INotifyPropertyChanged)settings.AllSizes, "Item[]", @@ -63,10 +64,10 @@ namespace ImageResizer.Properties { var settings = new Settings { - Sizes = new ObservableCollection { new ResizeSize() }, CustomSize = new CustomSize(), }; + settings.Sizes.Add(new ResizeSize()); Assert.Contains(settings.Sizes[0], settings.AllSizes); } @@ -75,9 +76,9 @@ namespace ImageResizer.Properties { var settings = new Settings { - Sizes = new ObservableCollection(), CustomSize = new CustomSize(), }; + settings.Sizes.Clear(); Assert.Contains(settings.CustomSize, settings.AllSizes); } @@ -88,9 +89,10 @@ namespace ImageResizer.Properties var originalCustomSize = new CustomSize(); var settings = new Settings { - Sizes = new ObservableCollection(), CustomSize = originalCustomSize, }; + + settings.Sizes.Clear(); var ncc = (INotifyCollectionChanged)settings.AllSizes; var result = AssertEx.Raises( @@ -126,9 +128,9 @@ namespace ImageResizer.Properties var settings = new Settings { SelectedSizeIndex = index, - Sizes = new ObservableCollection(), CustomSize = new CustomSize(), }; + settings.Sizes.Clear(); var result = settings.SelectedSize; @@ -141,12 +143,9 @@ namespace ImageResizer.Properties var settings = new Settings { SelectedSizeIndex = 0, - Sizes = new ObservableCollection - { - new ResizeSize(), - }, }; + settings.Sizes.Add(new ResizeSize()); var result = settings.SelectedSize; Assert.Same(settings.Sizes[0], result); @@ -265,7 +264,6 @@ namespace ImageResizer.Properties Assert.PropertyChanged(settings, "PngInterlaceOption", action); Assert.PropertyChanged(settings, "TiffCompressOption", action); Assert.PropertyChanged(settings, "FileName", action); - Assert.PropertyChanged(settings, "Sizes", action); Assert.PropertyChanged(settings, "KeepDateModified", action); Assert.PropertyChanged(settings, "FallbackEncoder", action); Assert.PropertyChanged(settings, "CustomSize", action); diff --git a/src/modules/imageresizer/ui/App.xaml.cs b/src/modules/imageresizer/ui/App.xaml.cs index c2493148b1..02b7ecc3cb 100644 --- a/src/modules/imageresizer/ui/App.xaml.cs +++ b/src/modules/imageresizer/ui/App.xaml.cs @@ -24,7 +24,7 @@ namespace ImageResizer protected override void OnStartup(StartupEventArgs e) { - var batch = ResizeBatch.FromCommandLine(Console.In, e.Args); + var batch = ResizeBatch.FromCommandLine(Console.In, e?.Args); // TODO: Add command-line parameters that can be used in lieu of the input page (issue #14) var mainWindow = new MainWindow(new MainViewModel(batch, Settings.Default)); @@ -34,12 +34,12 @@ namespace ImageResizer BecomeForegroundWindow(new System.Windows.Interop.WindowInteropHelper(mainWindow).Handle); } - private void BecomeForegroundWindow(IntPtr hWnd) + private static void BecomeForegroundWindow(IntPtr hWnd) { - Win32Helpers.INPUT input = new Win32Helpers.INPUT { type = Win32Helpers.INPUTTYPE.INPUT_MOUSE, data = { } }; - Win32Helpers.INPUT[] inputs = new Win32Helpers.INPUT[] { input }; - Win32Helpers.SendInput(1, inputs, Win32Helpers.INPUT.Size); - Win32Helpers.SetForegroundWindow(hWnd); + NativeMethods.INPUT input = new NativeMethods.INPUT { type = NativeMethods.INPUTTYPE.INPUT_MOUSE, data = { } }; + NativeMethods.INPUT[] inputs = new NativeMethods.INPUT[] { input }; + _ = NativeMethods.SendInput(1, inputs, NativeMethods.INPUT.Size); + NativeMethods.SetForegroundWindow(hWnd); } } } diff --git a/src/modules/imageresizer/ui/ImageResizerUI.csproj b/src/modules/imageresizer/ui/ImageResizerUI.csproj index 81edbe66c1..6263723506 100644 --- a/src/modules/imageresizer/ui/ImageResizerUI.csproj +++ b/src/modules/imageresizer/ui/ImageResizerUI.csproj @@ -109,7 +109,7 @@ - + @@ -213,6 +213,11 @@ + + 3.3.0 + runtime; build; native; contentfiles; analyzers; buildtransitive + all + 5.4.1.1 diff --git a/src/modules/imageresizer/ui/Models/AdvancedSettings.cs b/src/modules/imageresizer/ui/Models/AdvancedSettings.cs index 4ef266f2f4..3ae4eaa0cc 100644 --- a/src/modules/imageresizer/ui/Models/AdvancedSettings.cs +++ b/src/modules/imageresizer/ui/Models/AdvancedSettings.cs @@ -1,11 +1,8 @@ // This class sets the visibility property of Advanced settings based on the OS Version -using System; -using System.Runtime.InteropServices; - namespace ImageResizer.Models { - public class AdvancedSettings + public static class AdvancedSettings { public static bool UseNewSettings() { diff --git a/src/modules/imageresizer/ui/Models/ResizeBatch.cs b/src/modules/imageresizer/ui/Models/ResizeBatch.cs index f9e5e3e3b3..3a6e859f89 100644 --- a/src/modules/imageresizer/ui/Models/ResizeBatch.cs +++ b/src/modules/imageresizer/ui/Models/ResizeBatch.cs @@ -24,12 +24,15 @@ namespace ImageResizer.Models // NB: We read these from stdin since there are limits on the number of args you can have string file; - while ((file = standardInput.ReadLine()) != null) + if (standardInput != null) { - batch.Files.Add(file); + while ((file = standardInput.ReadLine()) != null) + { + batch.Files.Add(file); + } } - for (var i = 0; i < args.Length; i++) + for (var i = 0; i < args?.Length; i++) { if (args[i] == "/d") { @@ -43,9 +46,7 @@ namespace ImageResizer.Models return batch; } - public IEnumerable Process( - CancellationToken cancellationToken, - Action reportProgress) + public IEnumerable Process(Action reportProgress, CancellationToken cancellationToken) { double total = Files.Count; var completed = 0; @@ -66,7 +67,9 @@ namespace ImageResizer.Models { Execute(file); } +#pragma warning disable CA1031 // Do not catch general exception types catch (Exception ex) +#pragma warning restore CA1031 // Do not catch general exception types { errors.Add(new ResizeError { File = Path.GetFileName(file), Error = ex.Message }); } diff --git a/src/modules/imageresizer/ui/Models/ResizeOperation.cs b/src/modules/imageresizer/ui/Models/ResizeOperation.cs index 16a1981193..0733e41a55 100644 --- a/src/modules/imageresizer/ui/Models/ResizeOperation.cs +++ b/src/modules/imageresizer/ui/Models/ResizeOperation.cs @@ -3,6 +3,7 @@ // See the LICENSE file in the project root for more information. Code forked from Brice Lambson's https://github.com/bricelam/ImageResizer/ using System; +using System.Globalization; using System.IO; using System.Linq; using System.Windows; @@ -175,6 +176,7 @@ namespace ImageResizer.Models } var fileName = string.Format( + CultureInfo.CurrentCulture, _settings.FileNameFormat, originalFileName, _settings.SelectedSize.Name, diff --git a/src/modules/imageresizer/ui/Models/ResizeSize.cs b/src/modules/imageresizer/ui/Models/ResizeSize.cs index 72bcb218ba..f9d1145b65 100644 --- a/src/modules/imageresizer/ui/Models/ResizeSize.cs +++ b/src/modules/imageresizer/ui/Models/ResizeSize.cs @@ -13,7 +13,13 @@ namespace ImageResizer.Models [JsonObject(MemberSerialization.OptIn)] public class ResizeSize : ObservableObject { - private static readonly IDictionary _tokens; + private static readonly IDictionary _tokens = new Dictionary + { + ["$small$"] = Resources.Small, + ["$medium$"] = Resources.Medium, + ["$large$"] = Resources.Large, + ["$phone$"] = Resources.Phone, + }; private string _name; private ResizeFit _fit = ResizeFit.Fit; @@ -22,15 +28,6 @@ namespace ImageResizer.Models private bool _showHeight = true; private ResizeUnit _unit = ResizeUnit.Pixel; - static ResizeSize() - => _tokens = new Dictionary - { - ["$small$"] = Resources.Small, - ["$medium$"] = Resources.Medium, - ["$large$"] = Resources.Large, - ["$phone$"] = Resources.Phone, - }; - public ResizeSize(string name, ResizeFit fit, double width, double height, ResizeUnit unit) { Name = name; diff --git a/src/modules/imageresizer/ui/Properties/Settings.cs b/src/modules/imageresizer/ui/Properties/Settings.cs index 6ea44c8c5d..ffb0f44146 100644 --- a/src/modules/imageresizer/ui/Properties/Settings.cs +++ b/src/modules/imageresizer/ui/Properties/Settings.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; using System.ComponentModel; +using System.Globalization; using System.IO; using System.Threading; using System.Windows.Media.Imaging; @@ -18,7 +19,7 @@ using Newtonsoft.Json.Serialization; namespace ImageResizer.Properties { [JsonObject(MemberSerialization.OptIn)] - public partial class Settings : IDataErrorInfo, INotifyPropertyChanged + public sealed partial class Settings : IDataErrorInfo, INotifyPropertyChanged { // Used to synchronize access to the settings.json file private static Mutex _jsonMutex = new Mutex(); @@ -32,7 +33,6 @@ namespace ImageResizer.Properties private PngInterlaceOption _pngInterlaceOption; private TiffCompressOption _tiffCompressOption; private string _fileName; - private ObservableCollection _sizes; private bool _keepDateModified; private System.Guid _fallbackEncoder; private CustomSize _customSize; @@ -92,7 +92,12 @@ namespace ImageResizer.Properties } string IDataErrorInfo.Error - => string.Empty; + { + get + { + return string.Empty; + } + } string IDataErrorInfo.this[string columnName] { @@ -105,7 +110,7 @@ namespace ImageResizer.Properties if (JpegQualityLevel < 1 || JpegQualityLevel > 100) { - return string.Format(Resources.ValueMustBeBetween, 1, 100); + return string.Format(CultureInfo.CurrentCulture, Resources.ValueMustBeBetween, 1, 100); } return string.Empty; @@ -306,7 +311,7 @@ namespace ImageResizer.Properties { if (string.IsNullOrWhiteSpace(value)) { - throw new System.ArgumentNullException(); + throw new System.ArgumentNullException(nameof(FileName)); } _fileName = value; @@ -315,15 +320,7 @@ namespace ImageResizer.Properties } [JsonProperty(PropertyName = "imageresizer_sizes")] - public ObservableCollection Sizes - { - get => _sizes; - set - { - _sizes = value; - NotifyPropertyChanged(); - } - } + public ObservableCollection Sizes { get; private set; } [JsonProperty(PropertyName = "imageresizer_keepDateModified")] public bool KeepDateModified @@ -423,12 +420,18 @@ namespace ImageResizer.Properties PngInterlaceOption = jsonSettings.PngInterlaceOption; TiffCompressOption = jsonSettings.TiffCompressOption; FileName = jsonSettings.FileName; - Sizes = jsonSettings.Sizes; KeepDateModified = jsonSettings.KeepDateModified; FallbackEncoder = jsonSettings.FallbackEncoder; CustomSize = jsonSettings.CustomSize; SelectedSizeIndex = jsonSettings.SelectedSizeIndex; + + if (jsonSettings.Sizes.Count > 0) + { + Sizes.Clear(); + Sizes.AddRange(jsonSettings.Sizes); + } }); + _jsonMutex.ReleaseMutex(); } } diff --git a/src/modules/imageresizer/ui/Utilities/Win32Helpers.cs b/src/modules/imageresizer/ui/Utilities/NativeMethods.cs similarity index 98% rename from src/modules/imageresizer/ui/Utilities/Win32Helpers.cs rename to src/modules/imageresizer/ui/Utilities/NativeMethods.cs index 58e9c81273..a773ca2921 100644 --- a/src/modules/imageresizer/ui/Utilities/Win32Helpers.cs +++ b/src/modules/imageresizer/ui/Utilities/NativeMethods.cs @@ -11,7 +11,7 @@ namespace ImageResizer.Utilities { // Win32 functions required for temporary workaround for issue #1273 [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.NamingRules", "SA1307:Accessible fields should begin with upper-case letter", Justification = "Naming used in Win32 dll")] - internal class Win32Helpers + internal class NativeMethods { [DllImport("user32.dll")] internal static extern bool SetForegroundWindow(IntPtr hWnd); diff --git a/src/modules/imageresizer/ui/ViewModels/AdvancedViewModel.cs b/src/modules/imageresizer/ui/ViewModels/AdvancedViewModel.cs index 6f88d84151..8348a667c6 100644 --- a/src/modules/imageresizer/ui/ViewModels/AdvancedViewModel.cs +++ b/src/modules/imageresizer/ui/ViewModels/AdvancedViewModel.cs @@ -16,9 +16,7 @@ namespace ImageResizer.ViewModels { public class AdvancedViewModel : ViewModelBase { - private static readonly IDictionary _encoderMap; - - static AdvancedViewModel() + private static Dictionary InitEncoderMap() { var bmpCodec = new BmpBitmapEncoder().CodecInfo; var gifCodec = new GifBitmapEncoder().CodecInfo; @@ -27,7 +25,7 @@ namespace ImageResizer.ViewModels var tiffCodec = new TiffBitmapEncoder().CodecInfo; var wmpCodec = new WmpBitmapEncoder().CodecInfo; - _encoderMap = new Dictionary + return new Dictionary { [bmpCodec.ContainerFormat] = bmpCodec.FriendlyName, [gifCodec.ContainerFormat] = gifCodec.FriendlyName, @@ -45,17 +43,15 @@ namespace ImageResizer.ViewModels Settings = settings; } - public static IDictionary EncoderMap - => _encoderMap; + public static IDictionary EncoderMap { get; } = InitEncoderMap(); public Settings Settings { get; } - public string Version + public static string Version => typeof(AdvancedViewModel).Assembly.GetCustomAttribute() ?.InformationalVersion; - public IEnumerable Encoders - => _encoderMap.Keys; + public static IEnumerable Encoders => EncoderMap.Keys; public ICommand RemoveSizeCommand { get; } diff --git a/src/modules/imageresizer/ui/ViewModels/InputViewModel.cs b/src/modules/imageresizer/ui/ViewModels/InputViewModel.cs index 88ac0b66bf..e863b5e8c4 100644 --- a/src/modules/imageresizer/ui/ViewModels/InputViewModel.cs +++ b/src/modules/imageresizer/ui/ViewModels/InputViewModel.cs @@ -29,7 +29,10 @@ namespace ImageResizer.ViewModels _mainView = mainView; Settings = settings; - settings.CustomSize.PropertyChanged += (sender, e) => settings.SelectedSize = (CustomSize)sender; + if (settings != null) + { + settings.CustomSize.PropertyChanged += (sender, e) => settings.SelectedSize = (CustomSize)sender; + } ResizeCommand = new RelayCommand(Resize); CancelCommand = new RelayCommand(Cancel); diff --git a/src/modules/imageresizer/ui/ViewModels/MainViewModel.cs b/src/modules/imageresizer/ui/ViewModels/MainViewModel.cs index 75c2224d5f..a11f047161 100644 --- a/src/modules/imageresizer/ui/ViewModels/MainViewModel.cs +++ b/src/modules/imageresizer/ui/ViewModels/MainViewModel.cs @@ -45,7 +45,7 @@ namespace ImageResizer.ViewModels { if (_batch.Files.Count == 0) { - _batch.Files.AddRange(view.OpenPictureFiles()); + _batch.Files.AddRange(view?.OpenPictureFiles()); } CurrentPage = new InputViewModel(_settings, this, view, _batch); diff --git a/src/modules/imageresizer/ui/ViewModels/ProgressViewModel.cs b/src/modules/imageresizer/ui/ViewModels/ProgressViewModel.cs index d55ef4a683..7763eb961e 100644 --- a/src/modules/imageresizer/ui/ViewModels/ProgressViewModel.cs +++ b/src/modules/imageresizer/ui/ViewModels/ProgressViewModel.cs @@ -15,7 +15,7 @@ using ImageResizer.Views; namespace ImageResizer.ViewModels { - public class ProgressViewModel : ViewModelBase + public class ProgressViewModel : ViewModelBase, IDisposable { private readonly MainViewModel _mainViewModel; private readonly ResizeBatch _batch; @@ -25,6 +25,7 @@ namespace ImageResizer.ViewModels private double _progress; private TimeSpan _timeRemaining; + private bool disposedValue; public ProgressViewModel( ResizeBatch batch, @@ -56,37 +57,61 @@ namespace ImageResizer.ViewModels public ICommand StopCommand { get; } public void Start() - => Task.Factory.StartNew( - () => + { + _ = Task.Factory.StartNew(StartExecutingWork, _cancellationTokenSource.Token, TaskCreationOptions.None, TaskScheduler.Current); + } + + private void StartExecutingWork() + { + _stopwatch.Restart(); + var errors = _batch.Process( + (completed, total) => { - _stopwatch.Restart(); - var errors = _batch.Process( - _cancellationTokenSource.Token, - (completed, total) => - { - var progress = completed / total; - Progress = progress; - _mainViewModel.Progress = progress; + var progress = completed / total; + Progress = progress; + _mainViewModel.Progress = progress; - TimeRemaining = _stopwatch.Elapsed.Multiply((total - completed) / completed); - }); - - if (errors.Any()) - { - _mainViewModel.Progress = 0; - _mainViewModel.CurrentPage = new ResultsViewModel(_mainView, errors); - } - else - { - _mainView.Close(); - } + TimeRemaining = _stopwatch.Elapsed.Multiply((total - completed) / completed); }, _cancellationTokenSource.Token); + if (errors.Any()) + { + _mainViewModel.Progress = 0; + _mainViewModel.CurrentPage = new ResultsViewModel(_mainView, errors); + } + else + { + _mainView.Close(); + } + } + public void Stop() { _cancellationTokenSource.Cancel(); _mainView.Close(); } + + protected virtual void Dispose(bool disposing) + { + if (!disposedValue) + { + if (disposing) + { + _cancellationTokenSource.Dispose(); + } + + // TODO: free unmanaged resources (unmanaged objects) and override finalizer + // TODO: set large fields to null + disposedValue = true; + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } } } diff --git a/src/modules/imageresizer/ui/Views/ContainerFormatConverter.cs b/src/modules/imageresizer/ui/Views/ContainerFormatConverter.cs index 6b90b4edb1..64ee4bb697 100644 --- a/src/modules/imageresizer/ui/Views/ContainerFormatConverter.cs +++ b/src/modules/imageresizer/ui/Views/ContainerFormatConverter.cs @@ -15,7 +15,7 @@ namespace ImageResizer.Views public object Convert(object value, Type targetType, object parameter, CultureInfo culture) => AdvancedViewModel.EncoderMap.TryGetValue((Guid)value, out var result) ? result - : value.ToString(); + : value?.ToString(); public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => throw new NotImplementedException(); diff --git a/src/modules/imageresizer/ui/Views/EnumValueConverter.cs b/src/modules/imageresizer/ui/Views/EnumValueConverter.cs index 4160f66eca..46f1a11111 100644 --- a/src/modules/imageresizer/ui/Views/EnumValueConverter.cs +++ b/src/modules/imageresizer/ui/Views/EnumValueConverter.cs @@ -15,12 +15,12 @@ namespace ImageResizer.Views { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - var type = value.GetType(); + var type = value?.GetType(); var builder = new StringBuilder(); builder .Append(type.Name) - .Append("_") + .Append('_') .Append(Enum.GetName(type, value)); var toLower = false; @@ -31,15 +31,15 @@ namespace ImageResizer.Views else if (parameter != null) { builder - .Append("_") + .Append('_') .Append(parameter); } - var targetValue = Resources.ResourceManager.GetString(builder.ToString()); + var targetValue = Resources.ResourceManager.GetString(builder.ToString(), culture); if (toLower) { - targetValue = targetValue.ToLower(); + targetValue = targetValue.ToLower(culture); } return targetValue; diff --git a/src/modules/imageresizer/ui/Views/MainWindow.xaml.cs b/src/modules/imageresizer/ui/Views/MainWindow.xaml.cs index 62d7c77214..d38fb9968c 100644 --- a/src/modules/imageresizer/ui/Views/MainWindow.xaml.cs +++ b/src/modules/imageresizer/ui/Views/MainWindow.xaml.cs @@ -39,8 +39,7 @@ namespace ImageResizer.Views return openFileDialog.FileNames; } - public void ShowAdvanced(AdvancedViewModel viewModel) - => viewModel.Close(new AdvancedWindow(viewModel).ShowDialog() == true); + public void ShowAdvanced(AdvancedViewModel viewModel) => viewModel?.Close(new AdvancedWindow(viewModel).ShowDialog() == true); void IMainView.Close() => Dispatcher.Invoke((Action)Close); diff --git a/src/modules/imageresizer/ui/Views/ResizeUnitConverter.cs b/src/modules/imageresizer/ui/Views/ResizeUnitConverter.cs index 7fb73e1dd0..5484c3c468 100644 --- a/src/modules/imageresizer/ui/Views/ResizeUnitConverter.cs +++ b/src/modules/imageresizer/ui/Views/ResizeUnitConverter.cs @@ -15,7 +15,7 @@ namespace ImageResizer.Views { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - var output = Resources.ResourceManager.GetString(Enum.GetName(typeof(ResizeUnit), value)); + var output = Resources.ResourceManager.GetString(Enum.GetName(typeof(ResizeUnit), value), culture); if ((string)parameter == "ToLower") { diff --git a/src/modules/imageresizer/ui/Views/TiffCompressOptionConverter.cs b/src/modules/imageresizer/ui/Views/TiffCompressOptionConverter.cs index 1e5e63e055..793e444bac 100644 --- a/src/modules/imageresizer/ui/Views/TiffCompressOptionConverter.cs +++ b/src/modules/imageresizer/ui/Views/TiffCompressOptionConverter.cs @@ -15,7 +15,8 @@ namespace ImageResizer.Views { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) => Resources.ResourceManager.GetString( - "TiffCompressOption_" + Enum.GetName(typeof(TiffCompressOption), value)); + "TiffCompressOption_" + Enum.GetName(typeof(TiffCompressOption), value), + culture); public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => throw new NotImplementedException(); diff --git a/src/modules/imageresizer/ui/Views/TimeRemainingConverter.cs b/src/modules/imageresizer/ui/Views/TimeRemainingConverter.cs index 4ff525e5f5..ca16a0af2d 100644 --- a/src/modules/imageresizer/ui/Views/TimeRemainingConverter.cs +++ b/src/modules/imageresizer/ui/Views/TimeRemainingConverter.cs @@ -36,7 +36,7 @@ namespace ImageResizer.Views return string.Format( culture, - Resources.ResourceManager.GetString(builder.ToString()), + Resources.ResourceManager.GetString(builder.ToString(), culture), timeRemaining.Hours, timeRemaining.Minutes, timeRemaining.Seconds);