From 8600a35576f829d15e6b01e058535700adb8541e Mon Sep 17 00:00:00 2001 From: John Lewin Date: Tue, 5 Jan 2016 12:58:20 -0800 Subject: [PATCH] Revise TranslationMap, UserSettings - Move Master.txt translation file to Translations/en/Translation.txt - Threadsafe MatterControlTranslationMap initialization - Refactor UserSettings: - Threadsafe initialization - Concise initialization - UseTryGetValue for dictionary lookups - Use backing fields - Cache frequently accessed Language value as local property --- LocalizedString.cs | 29 +++--- SettingsManagement/UserSettings.cs | 93 ++++++++++--------- .../{Master.txt => en/Translation.txt} | 0 Submodules/agg-sharp | 2 +- 4 files changed, 66 insertions(+), 58 deletions(-) rename StaticData/Translations/{Master.txt => en/Translation.txt} (100%) diff --git a/LocalizedString.cs b/LocalizedString.cs index b0debdf78..45094acf9 100644 --- a/LocalizedString.cs +++ b/LocalizedString.cs @@ -38,29 +38,30 @@ namespace MatterHackers.Localizations { private static TranslationMap MatterControlTranslationMap; + private static readonly object syncRoot = new object(); + + static LocalizedString() + { + lock(syncRoot) + { + if (MatterControlTranslationMap == null) + { + MatterControlTranslationMap = new TranslationMap("Translations", UserSettings.Instance.Language); + } + } + } + public static string Get(string englishText) { - string language = UserSettings.Instance.get("Language"); - if (language == null) - { - language = "en"; - UserSettings.Instance.set("Language", "en"); - } - - if (MatterControlTranslationMap == null) - { - string pathToTranslationsFolder = "Translations"; - MatterControlTranslationMap = new TranslationMap(pathToTranslationsFolder, language); - } #if DEBUG_SHOW_TRANSLATED_STRINGS && DEBUG - return "El " + englishText + " o"; + return "El " + englishText + " o"; #endif return MatterControlTranslationMap.Translate(englishText); } public static void ResetTranslationMap() { - MatterControlTranslationMap = null; + MatterControlTranslationMap = new TranslationMap("Translations", UserSettings.Instance.Language); } public static string Localize(this string englishString) diff --git a/SettingsManagement/UserSettings.cs b/SettingsManagement/UserSettings.cs index 7d54139d4..c409c4b43 100644 --- a/SettingsManagement/UserSettings.cs +++ b/SettingsManagement/UserSettings.cs @@ -1,17 +1,31 @@ -using System.Collections.Generic; +using MatterHackers.MatterControl.DataStorage; +using System.Collections.Generic; +using System.Linq; namespace MatterHackers.MatterControl { public class UserSettings { private static UserSettings globalInstance = null; - public Dictionary settingsDictionary; - private UserSettingsFields fields = new UserSettingsFields(); + private static readonly object syncRoot = new object(); - public UserSettingsFields Fields + private Dictionary settingsDictionary; + + private UserSettings() { - get { return fields; } + // Load the UserSettings from the database + settingsDictionary = (from setting in Datastore.Instance.dbSQLite.Query("SELECT * FROM UserSetting;") + select setting).ToDictionary(s => s.Name, s => s); + + // Set English as default language if unset + if (string.IsNullOrEmpty(this.get("Language"))) + { + UserSettings.Instance.set("Language", "en"); + } + + // Propagate Language to local property + this.Language = this.get("Language"); } public static UserSettings Instance @@ -20,63 +34,56 @@ namespace MatterHackers.MatterControl { if (globalInstance == null) { - globalInstance = new UserSettings(); - globalInstance.LoadData(); + lock(syncRoot) + { + if (globalInstance == null) + { + globalInstance = new UserSettings(); + } + } } return globalInstance; } } + public string Language { get; private set; } + + public UserSettingsFields Fields { get; private set; } = new UserSettingsFields(); + public string get(string key) { - string result; - if (settingsDictionary.ContainsKey(key)) - { - result = settingsDictionary[key].Value; + UserSetting userSetting; + if (settingsDictionary.TryGetValue(key, out userSetting)) + { + return userSetting.Value; } - else - { - result = null; - } - return result; + + return null; } public void set(string key, string value) { - DataStorage.UserSetting setting; - if (settingsDictionary.ContainsKey(key)) - { - setting = settingsDictionary[key]; - } - else - { - setting = new DataStorage.UserSetting(); - setting.Name = key; + UserSetting setting; + if(!settingsDictionary.TryGetValue(key, out setting)) + { + // If the setting for the given key doesn't exist, create it + setting = new UserSetting() + { + Name = key + }; settingsDictionary[key] = setting; } + // Special case to propagate Language to local property on assignment + if(key == "Language") + { + this.Language = value; + } + setting.Value = value; setting.Commit(); } - - private void LoadData() - { - IEnumerable settingsList = GetApplicationSettings(); - settingsDictionary = new Dictionary(); - foreach (DataStorage.UserSetting s in settingsList) - { - settingsDictionary[s.Name] = s; - } - } - - private IEnumerable GetApplicationSettings() - { - //Retrieve a list of settings from the Datastore - string query = string.Format("SELECT * FROM UserSetting;"); - IEnumerable result = (IEnumerable)DataStorage.Datastore.Instance.dbSQLite.Query(query); - return result; - } } } \ No newline at end of file diff --git a/StaticData/Translations/Master.txt b/StaticData/Translations/en/Translation.txt similarity index 100% rename from StaticData/Translations/Master.txt rename to StaticData/Translations/en/Translation.txt diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 9585f7795..241e12005 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 9585f7795bba4a88274337dcdc159fd5ff4afe8e +Subproject commit 241e12005ff538a95cd6ad2cb917d8b4d04b27a3