public virtual T GetProperty <T>(PerLanguageOption <T> setting, bool cacheDefault)

        {
            if (setting == null)
            {
                throw new ArgumentNullException(nameof(setting));
            }

            PropertiesDictionary properties = GetSettingsContainer(setting, cacheDefault);

            T value;

            if (!properties.TryGetProperty(setting.Name, out value) && setting.DefaultValue != null)
            {
                value = setting.DefaultValue();

                if (cacheDefault)
                {
                    properties[setting.Name] = value;
                }
            }
            return(value);
        }