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);
        }