Ejemplo n.º 1
0
            private string GetTranslation(string key, CultureInfo language)
            {
                var cacheKey             = CacheKeyHelper.BuildKey(key);
                var localizationResource = ConfigurationContext.Current.CacheManager.Get(cacheKey) as LocalizationResource;

                if (localizationResource != null)
                {
                    // if value for the cache key is null - this is non-existing resource (no hit)
                    return(localizationResource.Translations?.FirstOrDefault(t => t.Language == language.Name)?.Value);
                }

                var resource = GetResourceFromDb(key);
                LocalizationResourceTranslation localization = null;

                if (resource == null)
                {
                    // create empty null resource - to indicate non-existing one
                    resource = LocalizationResource.CreateNonExisting(key);
                }
                else
                {
                    localization = resource.Translations.FirstOrDefault(t => t.Language == language.Name);
                }

                ConfigurationContext.Current.CacheManager.Insert(cacheKey, resource);
                return(localization?.Value);
            }
Ejemplo n.º 2
0
        public string Execute(GetTranslation.Query query)
        {
            if (!ConfigurationContext.Current.EnableLocalization())
            {
                return(query.Key);
            }

            var key                  = query.Key;
            var language             = query.Language;
            var cacheKey             = CacheKeyHelper.BuildKey(key);
            var localizationResource = ConfigurationContext.Current.CacheManager.Get(cacheKey) as LocalizationResource;

            if (localizationResource != null)
            {
                return(GetTranslationFromAvailableList(localizationResource.Translations, language, query.UseFallback)?.Value);
            }

            var resource = GetResourceFromDb(key);
            LocalizationResourceTranslation localization = null;

            if (resource == null)
            {
                resource = LocalizationResource.CreateNonExisting(key);
            }
            else
            {
                localization = GetTranslationFromAvailableList(resource.Translations, language, query.UseFallback);
            }

            ConfigurationContext.Current.CacheManager.Insert(cacheKey, resource);
            return(localization?.Value);
        }
Ejemplo n.º 3
0
        private LocalizationResource FromEntity(LocalizationResourceEntity firstOrDefault)
        {
            if (firstOrDefault == null)
            {
                return(null);
            }

            var result = new LocalizationResource(firstOrDefault.RowKey, _enableInvariantCultureFallback)
            {
                Author           = firstOrDefault.Author,
                ModificationDate = firstOrDefault.ModificationDate,
                FromCode         = firstOrDefault.FromCode,
                IsModified       = firstOrDefault.IsModified,
                IsHidden         = firstOrDefault.IsHidden
            };

            var translationEntities = JsonConvert.DeserializeObject <LocalizationResourceTranslationEntity[]>(firstOrDefault.Translations);

            if (translationEntities.Any())
            {
                result.Translations.AddRange(translationEntities.Select(te => FromTranslationEntity(te, result)));
            }

            return(result);
        }
Ejemplo n.º 4
0
        public void CompareInvariantCultures_UsingExcept_NoChanges()
        {
            var incomingResource = new LocalizationResource("key")
            {
                Translations = new List <LocalizationResourceTranslation>
                {
                    new LocalizationResourceTranslation
                    {
                        Language = "",
                        Value    = "incoming value"
                    }
                }
            };

            var existingResource = new LocalizationResource("key")
            {
                Translations = new List <LocalizationResourceTranslation>
                {
                    new LocalizationResourceTranslation
                    {
                        Language = "",
                        Value    = "existing value"
                    }
                }
            };

            var sut = new TranslationComparer(true);

            var differences = incomingResource.Translations.Except(existingResource.Translations, sut).ToList();

            Assert.Empty(differences);
        }
Ejemplo n.º 5
0
            protected virtual string GetTranslation(Query query)
            {
                var key                  = query.Key;
                var language             = query.Language;
                var cacheKey             = CacheKeyHelper.BuildKey(key);
                var localizationResource = ConfigurationContext.Current.CacheManager.Get(cacheKey) as LocalizationResource;

                if (localizationResource != null)
                {
                    return(GetTranslationFromAvailableList(localizationResource.Translations, language, query.UseFallback)?.Value);
                }

                var resource = GetResourceFromDb(key);
                LocalizationResourceTranslation localization = null;

                // create empty null resource - to indicate non-existing one
                if (resource == null)
                {
                    resource = LocalizationResource.CreateNonExisting(key);
                }
                else
                {
                    localization = GetTranslationFromAvailableList(resource.Translations, language, query.UseFallback);
                }

                ConfigurationContext.Current.CacheManager.Insert(cacheKey, resource);
                return(localization?.Value);
            }
Ejemplo n.º 6
0
        /// <summary>
        ///     Parses the specified file content.
        /// </summary>
        /// <param name="fileContent">Content of the file.</param>
        /// <returns>
        ///     Returns list of resources from the file
        /// </returns>
        public ParseResult Parse(string fileContent)
        {
            var resources = new List <LocalizationResource>();
            var csvConfig = new CsvConfiguration(CultureInfo.InvariantCulture);

            using (var stream = AsStream(fileContent))
                using (var reader = new StreamReader(stream, Encoding.UTF8))
                    using (var csv = new CsvReader(reader, csvConfig))
                    {
                        var records   = csv.GetRecords <dynamic>().ToList();
                        var languages = GetLanguages(records);

                        foreach (var record in records)
                        {
                            var dict        = (IDictionary <string, object>)record;
                            var resourceKey = dict["ResourceKey"] as string;
                            var resource    = new LocalizationResource(resourceKey, false);
                            resource.Translations.AddRange(CreateTranslations(record, languages));

                            resources.Add(resource);
                        }

                        return(new ParseResult(resources, languages));
                    }
        }
Ejemplo n.º 7
0
 public void Initialize(LocalizationResourceInitializationContext context)
 {
     _resource = context.Resource;
     _applicationConfigurationClient = context.ServiceProvider.GetRequiredService <ICachedApplicationConfigurationClient>();
     _logger = context.ServiceProvider.GetService <ILogger <RemoteLocalizationContributor> >()
               ?? NullLogger <RemoteLocalizationContributor> .Instance;
 }
Ejemplo n.º 8
0
        /// <summary>
        /// Adds the translation for the resource.
        /// </summary>
        /// <param name="resource">The resource.</param>
        /// <param name="translation">The translation.</param>
        /// <exception cref="ArgumentNullException">
        /// resource
        /// or
        /// translation
        /// </exception>
        public void AddTranslation(LocalizationResource resource, LocalizationResourceTranslation translation)
        {
            if (resource == null)
            {
                throw new ArgumentNullException(nameof(resource));
            }

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

            using (var conn = new SqlConnection(Settings.DbContextConnectionString))
            {
                conn.Open();

                var cmd = new SqlCommand(
                    "INSERT INTO [dbo].[LocalizationResourceTranslations] ([Language], [ResourceId], [Value], [ModificationDate]) VALUES (@language, @resourceId, @translation, @modificationDate)",
                    conn);
                cmd.Parameters.AddWithValue("language", translation.Language);
                cmd.Parameters.AddWithValue("resourceId", translation.ResourceId);
                cmd.Parameters.AddWithValue("translation", translation.Value);
                cmd.Parameters.AddWithValue("modificationDate", translation.ModificationDate);

                cmd.ExecuteNonQuery();
            }
        }
Ejemplo n.º 9
0
        /// <summary>
        /// Updates the translation for the resource.
        /// </summary>
        /// <param name="resource">The resource.</param>
        /// <param name="translation">The translation.</param>
        /// <exception cref="ArgumentNullException">
        /// resource
        /// or
        /// translation
        /// </exception>
        public void UpdateTranslation(LocalizationResource resource, LocalizationResourceTranslation translation)
        {
            if (resource == null)
            {
                throw new ArgumentNullException(nameof(resource));
            }

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

            using (var conn = new SqlConnection(Settings.DbContextConnectionString))
            {
                conn.Open();

                var cmd = new SqlCommand(
                    "UPDATE [dbo].[LocalizationResourceTranslations] SET [Value] = @translation, [ModificationDate] = @modificationDate WHERE [Id] = @id",
                    conn);
                cmd.Parameters.AddWithValue("translation", translation.Value);
                cmd.Parameters.AddWithValue("id", translation.Id);
                cmd.Parameters.AddWithValue("modificationDate", DateTime.UtcNow);

                cmd.ExecuteNonQuery();
            }
        }
        public void CompareUsingInvariant_UsingExcept_NewLanguageDetected()
        {
            var incomingResource = new LocalizationResource("key", false);

            incomingResource.Translations.AddRange(
                new List <LocalizationResourceTranslation>
            {
                new LocalizationResourceTranslation {
                    Language = "", Value = "incoming value"
                },
                new LocalizationResourceTranslation {
                    Language = "en", Value = "incoming EN value"
                }
            });

            var existingResource = new LocalizationResource("key", false);

            existingResource.Translations.Add(new LocalizationResourceTranslation {
                Language = "", Value = "existing value"
            });
            var sut = new TranslationComparer(true);

            var differences = incomingResource.Translations.Except(existingResource.Translations, sut).ToList();

            Assert.NotEmpty(differences);
        }
Ejemplo n.º 11
0
 /// <summary>
 /// Initializes a new instance of the <see cref="DetectedImportChange"/> class.
 /// </summary>
 /// <param name="changeType">Type of the change.</param>
 /// <param name="importing">The importing.</param>
 /// <param name="existing">The existing.</param>
 public DetectedImportChange(ChangeType changeType, LocalizationResource importing, LocalizationResource existing)
 {
     ChangeType        = changeType;
     ImportingResource = importing;
     ExistingResource  = existing;
     ChangedLanguages  = new List <string>();
 }
        public void BothListsFilledWithTranslations_SameKeys_Duplicate_Translation_Throws()
        {
            var merger = new ResourceListMerger();

            var resource1English = new LocalizationResource("key1");

            resource1English.Translations.Add(new LocalizationResourceTranslation
            {
                Language = "en",
                Value    = "hello"
            });

            var resource1Norsk = new LocalizationResource("key1");

            resource1Norsk.Translations.Add(new LocalizationResourceTranslation
            {
                Language = "no",
                Value    = "hei"
            });

            var list1 = new List <LocalizationResource>
            {
                resource1English
            };

            var list2 = new List <LocalizationResource>
            {
                resource1Norsk,
                //Duplicate translation that makes the merger throw
                resource1Norsk
            };

            Assert.Throws(typeof(NotSupportedException), () => merger.Merge(list1, list2));
        }
Ejemplo n.º 13
0
        private void RegisterIfNotExist(LanguageEntities db, string resourceKey, string resourceValue, string defaultCulture, string author = "type-scanner")
        {
            var existingResource = db.LocalizationResources.Include(r => r.Translations).FirstOrDefault(r => r.ResourceKey == resourceKey);

            if (existingResource != null)
            {
                existingResource.FromCode = true;

                // if resource is not modified - we can sync default value from code
                if (existingResource.IsModified.HasValue && !existingResource.IsModified.Value)
                {
                    existingResource.ModificationDate = DateTime.UtcNow;
                    var defaultTranslation = existingResource.Translations.FirstOrDefault(t => t.Language == defaultCulture);
                    if (defaultTranslation != null)
                    {
                        defaultTranslation.Value = resourceValue;
                    }
                }

                var fromCodeTranslation = existingResource.Translations.FirstOrDefault(t => t.Language == ConfigurationContext.CultureForTranslationsFromCode);
                if (fromCodeTranslation != null)
                {
                    fromCodeTranslation.Value = resourceValue;
                }
                else
                {
                    fromCodeTranslation = new LocalizationResourceTranslation
                    {
                        Language = ConfigurationContext.CultureForTranslationsFromCode,
                        Value    = resourceValue
                    };

                    existingResource.Translations.Add(fromCodeTranslation);
                }
            }
            else
            {
                // create new resource
                var resource = new LocalizationResource(resourceKey)
                {
                    ModificationDate = DateTime.UtcNow,
                    Author           = author,
                    FromCode         = true,
                    IsModified       = false
                };

                resource.Translations.Add(new LocalizationResourceTranslation
                {
                    Language = defaultCulture,
                    Value    = resourceValue
                });

                resource.Translations.Add(new LocalizationResourceTranslation
                {
                    Language = ConfigurationContext.CultureForTranslationsFromCode,
                    Value    = resourceValue
                });
                db.LocalizationResources.Add(resource);
            }
        }
Ejemplo n.º 14
0
        /// <summary>
        /// Checks if item already present in database.
        /// </summary>

        public bool IsPresent(LocalizationResource resource)
        {
            var isPresent = _unitOfWork.Get <LocalizationResource>().Any(entry => ((entry.ResourceKey == resource.ResourceKey)
                                                                                   &&
                                                                                   (entry.ResourceCultureCode == resource.ResourceCultureCode)));

            return(isPresent);
        }
        public static LocalizationResource AddVirtualJson(
            [NotNull] this LocalizationResource localizationResource,
            [NotNull] string virtualPath)
        {
            Check.NotNull(localizationResource, nameof(localizationResource));
            Check.NotNull(virtualPath, nameof(virtualPath));

            localizationResource.Contributors.Add(new JsonVirtualFileLocalizationResourceContributor(virtualPath.EnsureStartsWith('/')));
            return(localizationResource);
        }
Ejemplo n.º 16
0
 private Lazy <Dictionary <string, string> > GetResourceDictionary(LocalizationResource resource, LocalizationLocale?locale)
 {
     return(resource switch
     {
         LocalizationResource.OrdbokConcepts => locale switch
         {
             LocalizationLocale.NoNb => _ordbokConceptsDictionaryNb,
             LocalizationLocale.NoNn => _ordbokConceptsDictionaryNn,
             _ => _ordbokConceptsDictionaryNb
         },
Ejemplo n.º 17
0
        /// <summary>
        /// 添加Json本地磁盘文件支持
        /// </summary>
        /// <param name="localizationResource"></param>
        /// <param name="jsonFilePath"></param>
        /// <returns></returns>
        public static LocalizationResource AddPhysicalJson(
            [NotNull] this LocalizationResource localizationResource,
            [NotNull] string jsonFilePath)
        {
            Check.NotNull(localizationResource, nameof(localizationResource));
            Check.NotNull(jsonFilePath, nameof(jsonFilePath));

            localizationResource.Contributors.Add(new JsonPhysicalFileLocalizationResourceContributor(jsonFilePath));

            return(localizationResource);
        }
Ejemplo n.º 18
0
        /// <summary>
        /// Inserts the resource in database.
        /// </summary>
        /// <param name="resource">The resource.</param>
        /// <exception cref="ArgumentNullException">resource</exception>
        public void InsertResource(LocalizationResource resource)
        {
            if (resource == null)
            {
                throw new ArgumentNullException(nameof(resource));
            }

            var table = GetTable();

            table.Execute(TableOperation.Insert(ToEntity(resource)));
        }
Ejemplo n.º 19
0
        public string GetString(string key, LocalizationResource resource, string?locale)
        {
            var localizationLocale = locale?.ToLower() switch
            {
                "bob" => LocalizationLocale.NoNb,
                "nob" => LocalizationLocale.NoNn,
                _ => LocalizationLocale.NoNb
            };

            return(GetString(key, resource, localizationLocale));
        }
Ejemplo n.º 20
0
        /// <summary>
        /// 添加Xml本地磁盘文件支持
        /// </summary>
        /// <param name="localizationResource"></param>
        /// <param name="xmlFilePath"></param>
        /// <returns></returns>
        public static LocalizationResource AddPhysicalXml(
            [NotNull] this LocalizationResource localizationResource,
            [NotNull] string xmlFilePath)
        {
            Check.NotNull(localizationResource, nameof(localizationResource));
            Check.NotNull(xmlFilePath, nameof(xmlFilePath));

            localizationResource.Contributors.Add(new XmlPhysicalFileLocalizationResourceContributor(xmlFilePath));

            return(localizationResource);
        }
Ejemplo n.º 21
0
 private LocalizationResourceTranslation FromTranslationEntity(
     LocalizationResourceTranslationEntity translationEntity,
     LocalizationResource localizationResource)
 {
     return(new LocalizationResourceTranslation
     {
         Language = translationEntity.Language,
         Value = translationEntity.Translation,
         ModificationDate = translationEntity.ModificationDate,
         LocalizationResource = localizationResource
     });
 }
Ejemplo n.º 22
0
 private ITableEntity ToEntity(LocalizationResource resource)
 {
     return(new LocalizationResourceEntity(resource.ResourceKey)
     {
         Author = resource.Author,
         ModificationDate = DateTime.UtcNow,
         FromCode = resource.FromCode,
         IsModified = resource.IsModified ?? true,
         IsHidden = resource.IsHidden ?? false,
         Translations = JsonConvert.SerializeObject(resource.Translations.Select(ToTranslationEntity).ToList()),
         ETag = "*"
     });
 }
 private LocalizationResourceTranslation CreateTranslationFromSqlReader(
     NpgsqlDataReader reader,
     LocalizationResource result)
 {
     return(new LocalizationResourceTranslation
     {
         Id = reader.GetInt32(reader.GetOrdinal("TranslationId")),
         ResourceId = result.Id,
         Value = reader.GetStringSafe("Translation"),
         Language = reader.GetStringSafe("Language") ?? string.Empty,
         ModificationDate = reader.GetDateTime(reader.GetOrdinal("TranslationModificationDate")),
         LocalizationResource = result
     });
 }
Ejemplo n.º 24
0
    public static LocalizationResource AddBaseTypes(
        [NotNull] this LocalizationResource localizationResource,
        [NotNull] params Type[] types)
    {
        Check.NotNull(localizationResource, nameof(localizationResource));
        Check.NotNull(types, nameof(types));

        foreach (var type in types)
        {
            localizationResource.BaseResourceTypes.AddIfNotContains(type);
        }

        return(localizationResource);
    }
Ejemplo n.º 25
0
        /// <summary>
        /// Deletes the resource.
        /// </summary>
        /// <param name="resource">The resource.</param>
        /// <exception cref="ArgumentNullException">resource</exception>
        public void DeleteResource(LocalizationResource resource)
        {
            if (resource == null)
            {
                throw new ArgumentNullException(nameof(resource));
            }

            var table  = GetTable();
            var entity = new DynamicTableEntity(LocalizationResourceEntity.PartitionKey, resource.ResourceKey)
            {
                ETag = "*"
            };

            table.Execute(TableOperation.Delete(entity));
        }
Ejemplo n.º 26
0
        /// <summary>
        /// Updates the translation for the resource.
        /// </summary>
        /// <param name="resource">The resource.</param>
        /// <param name="translation">The translation.</param>
        /// <exception cref="ArgumentNullException">
        /// resource
        /// or
        /// translation
        /// </exception>
        public void UpdateTranslation(LocalizationResource resource, LocalizationResourceTranslation translation)
        {
            if (resource == null)
            {
                throw new ArgumentNullException(nameof(resource));
            }

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

            var table = GetTable();

            table.Execute(TableOperation.Replace(ToEntity(resource)));
        }
        public string Execute(GetTranslation.Query query)
        {
            if (!ConfigurationContext.Current.EnableLocalization())
            {
                return(query.Key);
            }

            var key                  = query.Key;
            var language             = query.Language;
            var cacheKey             = CacheKeyHelper.BuildKey(key);
            var localizationResource = ConfigurationContext.Current.CacheManager.Get(cacheKey) as LocalizationResource;

            if (localizationResource != null)
            {
                return(GetTranslationFromAvailableList(localizationResource.Translations, language, query.UseFallback)?.Value);
            }

            LocalizationResourceTranslation localization = null;
            LocalizationResource            resource;

            try
            {
                resource = new GetResource.Query(key).Execute();
            }
            catch (KeyNotFoundException)
            {
                // this can be a case when Episerver initialization infrastructure calls localization provider way too early
                // and there is no registration for the GetResourceHandler - so we can fallback to default implementation
                // TODO: maybe we should just have default mapping (even if init has not been called)
                // (before any of the setup code in the provider is executed). this happens if you have DisplayChannels in codebase

                resource = new GetResourceHandler().Execute(new GetResource.Query(query.Key));
            }

            if (resource == null)
            {
                resource = LocalizationResource.CreateNonExisting(key);
            }
            else
            {
                localization = GetTranslationFromAvailableList(resource.Translations, language, query.UseFallback);
            }

            ConfigurationContext.Current.CacheManager.Insert(cacheKey, resource);
            return(localization?.Value);
        }
Ejemplo n.º 28
0
        public string GetString(string key, LocalizationResource resource, LocalizationLocale?locale)
        {
            var dictionary = GetResourceDictionary(resource, locale);

            if (dictionary.Value == null)
            {
                return(key);
            }

            if (dictionary.Value.ContainsKey(key))
            {
                return(dictionary.Value[key]);
            }

            // Temporarily mark elements that are missing from localization file
            return($"?{key}?");
        }
Ejemplo n.º 29
0
        private static void AddTranslationScript(LocalizationResource existingResource, string language, StringBuilder buffer, DiscoveredResource resource)
        {
            var existingTranslation = existingResource.Translations.FirstOrDefault(t => t.Language == language);

            if (existingTranslation == null)
            {
                buffer.Append($@"
insert into localizationresourcetranslations (resourceid, [language], [value]) values ({existingResource.Id}, '{language}', N'{resource.Translation.Replace("'", "''")}')
");
            }
            else if (!existingTranslation.Value.Equals(resource.Translation))
            {
                buffer.Append($@"
update localizationresourcetranslations set [value] = N'{resource.Translation.Replace("'", "''")}' where resourceid={existingResource.Id} and [language]='{language}'
");
            }
        }
Ejemplo n.º 30
0
        /// <summary>
        /// Deletes the resource.
        /// </summary>
        /// <param name="resource">The resource.</param>
        /// <exception cref="ArgumentNullException">resource</exception>
        public void DeleteResource(LocalizationResource resource)
        {
            if (resource == null)
            {
                throw new ArgumentNullException(nameof(resource));
            }

            using (var conn = new SqlConnection(Settings.DbContextConnectionString))
            {
                conn.Open();

                var cmd = new SqlCommand("DELETE FROM [dbo].[LocalizationResources] WHERE [Id] = @id", conn);
                cmd.Parameters.AddWithValue("id", resource.Id);

                cmd.ExecuteNonQuery();
            }
        }
        public void BothListsFilledWithTranslations_SameKeys_JoinedList()
        {
            var merger = new ResourceListMerger();

            var resource1English = new LocalizationResource("key1");
            resource1English.Translations.Add(new LocalizationResourceTranslation
                                              {
                                                  Language = "en",
                                                  Value = "hello"
                                              });

            var resource1Norsk = new LocalizationResource("key1");
            resource1English.Translations.Add(new LocalizationResourceTranslation
                                              {
                                                  Language = "no",
                                                  Value = "hei"
                                              });

            var list1 = new List<LocalizationResource>
                        {
                            resource1English
                        };

            var list2 = new List<LocalizationResource>
                        {
                            resource1Norsk
                        };

            var result = merger.Merge(list1, list2);

            Assert.NotEmpty(result);
            Assert.Single(result);

            var finalResource = result.First();

            Assert.Equal(2, finalResource.Translations.Count);
        }
        private void RegisterIfNotExist(LanguageEntities db, string resourceKey, string resourceValue, string author = "type-scanner")
        {
            var existingResource = db.LocalizationResources.Include(r => r.Translations).FirstOrDefault(r => r.ResourceKey == resourceKey);
            var defaultTranslationCulture = DetermineDefaultCulture();

            if(existingResource != null)
            {
                existingResource.FromCode = true;

                // if resource is not modified - we can sync default value from code
                if(existingResource.IsModified.HasValue && !existingResource.IsModified.Value)
                {
                    var defaultTranslation = existingResource.Translations.FirstOrDefault(t => t.Language == defaultTranslationCulture);
                    if(defaultTranslation != null)
                    {
                        defaultTranslation.Value = resourceValue;
                    }
                }

                var fromCodeTranslation = existingResource.Translations.FirstOrDefault(t => t.Language == ConfigurationContext.CultureForTranslationsFromCode);
                if(fromCodeTranslation != null)
                {
                    fromCodeTranslation.Value = resourceValue;
                }
                else
                {
                    fromCodeTranslation = new LocalizationResourceTranslation
                    {
                        Language = ConfigurationContext.CultureForTranslationsFromCode,
                        Value = resourceValue
                    };

                    existingResource.Translations.Add(fromCodeTranslation);
                }

                existingResource.ModificationDate = DateTime.UtcNow;
            }
            else
            {
                // create new resource
                var resource = new LocalizationResource(resourceKey)
                {
                    ModificationDate = DateTime.UtcNow,
                    Author = author,
                    FromCode = true,
                    IsModified = false
                };

                resource.Translations.Add(new LocalizationResourceTranslation
                                          {
                                              Language = defaultTranslationCulture,
                                              Value = resourceValue
                                          });

                resource.Translations.Add(new LocalizationResourceTranslation
                                          {
                                              Language = ConfigurationContext.CultureForTranslationsFromCode,
                                              Value = resourceValue
                                          });
                db.LocalizationResources.Add(resource);
            }
        }
 private static void AddNewResource(LanguageEntities db, LocalizationResource localizationResource)
 {
     db.LocalizationResources.Add(localizationResource);
     db.LocalizationResourceTranslations.AddRange(localizationResource.Translations);
 }
        private static void ParseResource(IEnumerable<XElement> resourceElements,
                                          string cultureId,
                                          string cultureName,
                                          ICollection<LocalizationResource> result,
                                          string keyPrefix)
        {
            foreach (var element in resourceElements)
            {
                var resourceKey = keyPrefix + "/" + element.Name.LocalName;
                if (element.Attributes().Any(a => a.Name.LocalName != "comment"
                                                  && a.Name.LocalName != "file"
                                                  && a.Name.LocalName != "notapproved"
                                                  && a.Name.LocalName != "changed"))
                {
                    var attribute = element.FirstAttribute;
                    resourceKey += $"[@{attribute.Name.LocalName}='{attribute.Value}']";
                }

                if (element.HasElements)
                {
                    ParseResource(element.Elements(), cultureId, cultureName, result, resourceKey);
                }
                else
                {
                    var resourceTranslation = element.Value.Trim();

                    if (string.IsNullOrEmpty(resourceTranslation))
                    {
                        continue;
                    }

                    var existingResource = result.FirstOrDefault(r => r.ResourceKey == resourceKey);

                    if (existingResource != null)
                    {
                        var existingTranslation = existingResource.Translations.FirstOrDefault(t => t.Language == cultureId);

                        if (existingTranslation != null)
                        {
                            throw new NotSupportedException($"Found duplicate translations for resource with key: {resourceKey} for culture: {cultureId}");
                        }

                        existingResource.Translations.Add(new LocalizationResourceTranslation
                                                          {
                                                              Language = cultureId,
                                                              Value = resourceTranslation
                                                          });
                    }
                    else
                    {
                        var resourceEntry = new LocalizationResource
                                            {
                                                ResourceKey = resourceKey,
                                                ModificationDate = DateTime.Now,
                                                Author = "migration-tool"
                                            };

                        resourceEntry.Translations.Add(new LocalizationResourceTranslation
                                                       {
                                                           Language = cultureId,
                                                           Value = resourceTranslation
                                                       });

                        result.Add(resourceEntry);
                    }
                }
            }
        }