/// <summary>
        /// Add a new language into the system (does NOT set current language)
        /// </summary>
        /// <param name="language"></param>
        public void Add(Localization.Model.General.i18n.Language language)
        {
            // Does the language already exist by name or language-locale?
            var existingLanguage = GetLanguageByLanguageCulture(language.LanguageCulture);

            if (existingLanguage != null)
            {
                throw new LanguageOrCultureAlreadyExistsException(
                          $"There is already a language defined for language-culture '{existingLanguage.LanguageCulture}'");
            }

            // Make sure that the new language has a set of empty resources
            language.LocaleStringResources = new List <LocaleStringResource>();
            foreach (var localeResourceKey in GetAllResourceKeys())
            {
                var localeStringResource = new LocaleStringResource
                {
                    Language          = language,
                    LocaleResourceKey = localeResourceKey,
                    ResourceValue     = string.Empty
                };
                language.LocaleStringResources.Add(localeStringResource);
            }

            language = SanitizeLanguage(language);
            _cacheService.ClearStartsWith(AppConstants.LocalisationCacheName);
            _context.Language.Add(language);
        }
        /// <summary>
        /// Delete a language
        /// </summary>
        /// <param name="language"></param>
        public void Delete(Localization.Model.General.i18n.Language language)
        {
            // Cannot delete default language
            if (language.Id == DefaultLanguage.Id)
            {
                throw new ApplicationException("Deleting the default language is not allowed.");
            }

            try
            {
                var strResToDelete = new List <LocaleStringResource>();
                foreach (var localeStringRes in language.LocaleStringResources)
                {
                    strResToDelete.Add(localeStringRes);
                }
                foreach (var strToDelete in strResToDelete)
                {
                    _context.LocaleStringResource.Remove(strToDelete);
                }

                language.LocaleStringResources.Clear();
                _context.Language.Remove(language);
                _cacheService.ClearStartsWith(AppConstants.LocalisationCacheName);
            }
            catch (Exception ex)
            {
                throw new ApplicationException($"Unable to delete language: {ex.Message}", ex);
            }
        }
        /// <summary>
        /// Convert a language into CSV format (e.g. for export)
        /// </summary>
        /// <param name="language"></param>
        /// <returns></returns>
        public string ToCsv(Localization.Model.General.i18n.Language language)
        {
            var csv = new StringBuilder();

            foreach (var resource in AllLanguageResources(language.Id))
            {
                csv.AppendFormat("{0},{1}", resource.LocaleResourceKey.Name, resource.ResourceValue);
                csv.AppendLine();
            }

            return(csv.ToString());
        }
        /// <summary>
        /// Get all resource strings for a language
        /// </summary>
        /// <param name="language"></param>
        /// <returns></returns>
        public Dictionary <string, string> ResourceKeysByLanguage(Localization.Model.General.i18n.Language language)
        {
            var cacheKey           = string.Concat(AppConstants.LanguageStrings, language.Id);
            var cachedResourceKeys = _cacheService.Get <Dictionary <string, string> >(cacheKey);

            if (cachedResourceKeys == null)
            {
                cachedResourceKeys = GetAllLanguageStringsByLangauge(language.Id);
                _cacheService.Set(cacheKey, cachedResourceKeys, CacheTimes.OneDay);
            }
            return(cachedResourceKeys);
        }
        /// <summary>
        /// Get a resource key by id
        /// </summary>
        /// <returns></returns>
        public string GetResourceString(Localization.Model.General.i18n.Language language, string key)
        {
            var resFormat = GetResource(language.Id, key);

            var resValue = resFormat?.ResourceValue;

            if (!string.IsNullOrEmpty(resValue))
            {
                return(new LocalizedString(resValue).Text);
            }
            return(new LocalizedString(key).Text);
        }
        /// <summary>
        /// Add a new language
        /// </summary>
        /// <param name="cultureInfo"></param>
        public Language Add(CultureInfo cultureInfo)
        {
            // Create a domain language object
            var language = new Localization.Model.General.i18n.Language
            {
                Name            = cultureInfo.EnglishName,
                LanguageCulture = cultureInfo.Name,
            };

            Add(language);
            _cacheService.ClearStartsWith(AppConstants.LocalisationCacheName);
            return(language);
        }
        public CsvReport FromCsv(Localization.Model.General.i18n.Language language, List <string> allLines)
        {
            var commaSeparator = new[] { ',' };
            var report         = new CsvReport();

            if (allLines == null || allLines.Count == 0)
            {
                report.Errors.Add(new CsvErrorWarning
                {
                    ErrorWarningType = CsvErrorWarningType.BadDataFormat,
                    Message          = "No language keys or values found."
                });
                return(report);
            }

            try
            {
                //var allResourceKeys = GetAllResourceKeys();
                var lineCounter = 0;
                foreach (var line in allLines)
                {
                    lineCounter++;

                    //var keyValuePair = line.Split(commaSeparator);
                    var keyValuePair = line.Split(commaSeparator, 2, StringSplitOptions.None);

                    if (keyValuePair.Length < 2)
                    {
                        report.Errors.Add(new CsvErrorWarning
                        {
                            ErrorWarningType = CsvErrorWarningType.MissingKeyOrValue,
                            Message          = $"Line {lineCounter}: a key and a value are required."
                        });

                        continue;
                    }

                    var key = keyValuePair[0];

                    if (string.IsNullOrEmpty(key))
                    {
                        // Ignore empty keys
                        continue;
                    }
                    key = key.Trim();

                    var value = keyValuePair[1];

                    var resourceKey = GetResourceKey(key);

                    if (language == null)
                    {
                        throw new ApplicationException("Unable to create language");
                    }

                    // If key does not exist, it is a new one to be created
                    if (resourceKey == null)
                    {
                        resourceKey = new LocaleResourceKey
                        {
                            Name      = key,
                            DateAdded = DateTime.UtcNow,
                        };

                        Add(resourceKey);
                        report.Warnings.Add(new CsvErrorWarning
                        {
                            ErrorWarningType = CsvErrorWarningType.NewKeyCreated,
                            Message          =
                                $"A new key named '{key}' has been created, and will require a value in all languages."
                        });
                    }

                    // In the new language (only) set the value for the resource
                    var stringResource = language.LocaleStringResources.FirstOrDefault(res => res.LocaleResourceKey.Name == resourceKey.Name);
                    if (stringResource != null)
                    {
                        if (!stringResource.ResourceValue.Equals(value))
                        {
                            stringResource.ResourceValue = value;
                        }
                    }
                    else
                    {
                        // No string resources have been created, so most probably
                        // this is the installer creating the keys so we need to create the
                        // string resource to go with it and add it
                        stringResource = new LocaleStringResource
                        {
                            Language          = language,
                            LocaleResourceKey = resourceKey,
                            ResourceValue     = value
                        };
                        Add(stringResource);
                    }
                }
            }
            catch (Exception ex)
            {
                report.Errors.Add(new CsvErrorWarning {
                    ErrorWarningType = CsvErrorWarningType.GeneralError, Message = ex.Message
                });
            }

            _cacheService.ClearStartsWith(AppConstants.LocalisationCacheName);
            return(report);
        }
 public Language SanitizeLanguage(Localization.Model.General.i18n.Language language)
 {
     language.Name            = StringUtils.SafePlainText(language.Name);
     language.LanguageCulture = StringUtils.SafePlainText(language.LanguageCulture);
     return(language);
 }
 /// <summary>
 /// Get a resource key by id
 /// </summary>
 /// <returns></returns>
 public LocaleStringResource GetResource(Localization.Model.General.i18n.Language language, string key)
 {
     return(GetResource(language.Id, key));
 }