public ProviderPair CreateProviderPair(String providerConfigName)
        {
            var providerConfig = ProviderConfig.ProviderPairs.Single(vp => vp.Name == providerConfigName);

            var valueProviderType = Type.GetType(providerConfig.ValueProvider.Type);
            if (valueProviderType == null)
                throw new Exception("Cannot find type \"" + providerConfig.ValueProvider.Type + "\"");
            if (!typeof(ILocalizedValueManager).IsAssignableFrom(valueProviderType))
                throw new Exception("Type \"" + valueProviderType + "\" does not implement " + typeof(ILocalizedValueManager).Name + "!");

            var valueProvider = ConstructProvider(valueProviderType, providerConfig.ValueProvider.ConstructorArguments.Cast<ConstructorArgumentElement>().ToArray());
            if (valueProvider == null)
                throw new Exception("Could not initialize value provider, incorrect constructor arguments!");

            if (providerConfig.LogProvider.IsValueProvider)
                return new ProviderPair(providerConfigName, valueProvider as ILocalizedValueManager, valueProvider as ILocalizationLogger);

            var logProviderType = Type.GetType(providerConfig.LogProvider.Type);
            if (logProviderType == null)
                throw new Exception("Cannot find type \"" + providerConfig.LogProvider.Type + "\"");
            if (!typeof(ILocalizationLogger).IsAssignableFrom(logProviderType))
                throw new Exception("Type \"" + logProviderType + "\" does not implement " + typeof(ILocalizationLogger).Name + "!");

            var logProvider = ConstructProvider(logProviderType, providerConfig.LogProvider.ConstructorArguments.Cast<ConstructorArgumentElement>().ToArray());
            if (logProvider == null)
                throw new Exception("Could not initialize log provider, incorrect constructor arguments!");

            var pair = new ProviderPair(providerConfigName, valueProvider as ILocalizedValueManager, logProvider as ILocalizationLogger);
            pair.ValueManager.Reload();
            return pair;
        }
        private void UpdateCreate(bool execute, ProviderPair targetPair, Dictionary<Qualifier.Unique, LocalizationAudit> sourceAudits, Dictionary<Qualifier.Unique, LocalizationAudit> targetAudits, QualifiedValue sourceQualifiedValue, String targetOldValue, SynchronizationResult result)
        {
            if (execute)
            {
                if (sourceAudits.ContainsKey(sourceQualifiedValue.Qualifier))
                    targetAudits[sourceQualifiedValue.Qualifier] = sourceAudits[sourceQualifiedValue.Qualifier];

                targetPair.ValueManager.UpdateCreateValue(new QualifiedValue(sourceQualifiedValue.Qualifier, sourceQualifiedValue.Value));
            }
            result.Updated.Add(new Update(targetPair.Name, sourceQualifiedValue.Qualifier.ToString(), targetOldValue, sourceQualifiedValue.Value));
        }
        private void Delete(bool execute, ProviderPair targetPair, Dictionary<Qualifier.Unique, LocalizationAudit> sourceAudits, Dictionary<Qualifier.Unique, LocalizationAudit> targetAudits, QualifiedValue targetQualifiedValue, SynchronizationResult result)
        {
            if (execute)
            {
                if (sourceAudits.ContainsKey(targetQualifiedValue.Qualifier))
                    targetAudits[targetQualifiedValue.Qualifier] = sourceAudits[targetQualifiedValue.Qualifier];

                targetPair.ValueManager.DeleteValue(targetQualifiedValue.Qualifier);
            }
            result.Removed.Add(new Removal(targetPair.Name, targetQualifiedValue.Qualifier.ToString(), targetQualifiedValue.Value));
        }