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