public async Task SyncLanguagesAsync() { var siteCultures = _l10nOptions .Value .SupportedCultures; var databaseCultures = await _languageRepository.GetAllAsync(); foreach (var dbCulture in databaseCultures) { var siteCulture = siteCultures.SingleOrDefault(_ => _.Name == dbCulture.Name); if (siteCulture == null && dbCulture.IsActive) { // no longer active _logger.LogInformation("Marking language {Name} inactive in the database.", dbCulture.Name); dbCulture.IsActive = false; dbCulture.IsDefault = dbCulture.Name == Culture.DefaultName; await _languageRepository.UpdateSaveNoAuditAsync(dbCulture); } else if (siteCulture != null && !dbCulture.IsActive) { // valid but marked invalid in the database _logger.LogInformation("Marking language {Name} as active in the database.", dbCulture.Name); dbCulture.IsActive = true; dbCulture.IsDefault = dbCulture.Name == Culture.DefaultName; await _languageRepository.UpdateSaveNoAuditAsync(dbCulture); } else { bool doSave = false; // ensure default is set properly if ((dbCulture.IsDefault && dbCulture.Name != Culture.DefaultName) || (!dbCulture.IsDefault && dbCulture.Name == Culture.DefaultName)) { dbCulture.IsDefault = dbCulture.Name == Culture.DefaultName; doSave = true; } if (dbCulture.IsDefault && dbCulture.Description != Culture.DefaultCulture.DisplayName) { dbCulture.Description = Culture.DefaultCulture.DisplayName; doSave = true; } if (doSave) { await _languageRepository.UpdateSaveNoAuditAsync(dbCulture); } } if (_cache.Get(string.Format(CacheKey.LanguageId, dbCulture.Name)) != null) { _cache.Remove(string.Format(CacheKey.LanguageId, dbCulture.Name)); } } var namesMissingFromDb = siteCultures .Select(_ => _.Name) .Except(databaseCultures.Select(_ => _.Name)); int?systemUser = null; foreach (var missingCultureName in namesMissingFromDb) { if (systemUser == null) { systemUser = await _siteLookupService.GetSystemUserId(); } var culture = siteCultures.Single(_ => _.Name == missingCultureName); await _languageRepository.AddSaveNoAuditAsync(new Language { CreatedAt = _dateTimeProvider.Now, CreatedBy = (int)systemUser, Description = culture.DisplayName, IsActive = true, IsDefault = culture.Name == Culture.DefaultName, Name = culture.Name }); if (_cache.Get(string.Format(CacheKey.LanguageId, missingCultureName)) != null) { _cache.Remove(string.Format(CacheKey.LanguageId, missingCultureName)); } } _cache.Remove(CacheKey.DefaultLanguageId); }