Skip to content

Commit

Permalink
Add validation to locale setting, remove hard-coded resource options. C…
Browse files Browse the repository at this point in the history
…loses #4818
  • Loading branch information
comintern committed Feb 26, 2019
1 parent ac13483 commit 4d588f6
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 11 deletions.
16 changes: 15 additions & 1 deletion Rubberduck.Core/Settings/GeneralSettings.cs
Expand Up @@ -4,6 +4,7 @@
using System.Linq;
using System.Xml.Serialization;
using Rubberduck.Common;
using Rubberduck.Resources;

namespace Rubberduck.Settings
{
Expand All @@ -26,7 +27,20 @@ public interface IGeneralSettings
[XmlType(AnonymousType = true)]
public class GeneralSettings : IGeneralSettings, IEquatable<GeneralSettings>
{
public DisplayLanguageSetting Language { get; set; }
private DisplayLanguageSetting _language = new DisplayLanguageSetting(Locales.DefaultCulture.Name);

public DisplayLanguageSetting Language
{
get => _language;
set
{
if (Locales.AvailableCultures.Exists(culture => culture.Name.Equals(value.Code, StringComparison.OrdinalIgnoreCase)))
{
_language = value;
}
}
}

public bool CanShowSplash { get; set; }
public bool CanCheckVersion { get; set; }
public bool CompileBeforeParse { get; set; }
Expand Down
16 changes: 6 additions & 10 deletions Rubberduck.Core/UI/Settings/GeneralSettingsViewModel.cs
Expand Up @@ -44,15 +44,10 @@ public sealed class GeneralSettingsViewModel : SettingsViewModelBase<Rubberduck.
_messageBox = messageBox;
_vbeSettings = vbeSettings;
_experimentalFeatureTypes = experimentalTypesProvider.ExperimentalTypes;
Languages = new ObservableCollection<DisplayLanguageSetting>(
new[]
{
new DisplayLanguageSetting("en-US"),
new DisplayLanguageSetting("fr-CA"),
new DisplayLanguageSetting("de-DE"),
new DisplayLanguageSetting("es-ES"),
new DisplayLanguageSetting("cs-CZ")
});

Languages = new ObservableCollection<DisplayLanguageSetting>(Locales.AvailableCultures
.OrderBy(locale => locale.NativeName)
.Select(locale => new DisplayLanguageSetting(locale.Name)));

LogLevels = new ObservableCollection<MinimumLogLevel>(
LogLevelHelper.LogLevels.Select(l => new MinimumLogLevel(l.Ordinal, l.Name)));
Expand Down Expand Up @@ -296,7 +291,8 @@ protected override void TransferSettingsToView(Rubberduck.Settings.GeneralSettin

private void TransferSettingsToView(IGeneralSettings general, IHotkeySettings hottkey)
{
SelectedLanguage = Languages.First(l => l.Code == general.Language.Code);
SelectedLanguage = Languages.FirstOrDefault(culture => culture.Code == general.Language.Code);

Hotkeys = hottkey == null
? new ObservableCollection<HotkeySetting>()
: new ObservableCollection<HotkeySetting>(hottkey.Settings);
Expand Down
46 changes: 46 additions & 0 deletions Rubberduck.Resources/Locales.cs
@@ -0,0 +1,46 @@
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Resources;

namespace Rubberduck.Resources
{
public static class Locales
{
private static List<CultureInfo> _cultures;

public static CultureInfo DefaultCulture => CultureInfo.GetCultureInfo("en-US");

//Adapted from https://stackoverflow.com/a/32161480/4088852
public static List<CultureInfo> AvailableCultures
{
get
{
if (!(_cultures is null))
{
return _cultures;
}

_cultures = new List<CultureInfo> { DefaultCulture };
var resources = new ResourceManager("Rubberduck.Resources.RubberduckUI", Assembly.GetAssembly(typeof(Locales)));
foreach (var culture in CultureInfo.GetCultures(CultureTypes.AllCultures).Where(locale => !locale.Equals(CultureInfo.InvariantCulture)))
{
try
{
if (!(resources.GetResourceSet(culture, true, false) is null))
{
_cultures.Add(culture);
}
}
catch (CultureNotFoundException)
{
// Ignored.
}
}

return _cultures;
}
}
}
}

0 comments on commit 4d588f6

Please sign in to comment.