diff --git a/src/Umbraco.Web.UI.Client/src/views/languages/overview.controller.js b/src/Umbraco.Web.UI.Client/src/views/languages/overview.controller.js
index c8a728d3aa..a5c446dfb5 100644
--- a/src/Umbraco.Web.UI.Client/src/views/languages/overview.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/languages/overview.controller.js
@@ -13,6 +13,16 @@
vm.editLanguage = editLanguage;
vm.deleteLanguage = deleteLanguage;
+ vm.getLanguageById = function(id) {
+ for (var i = 0; i < vm.languages.length; i++) {
+ if (vm.languages[i].id === id) {
+ return vm.languages[i];
+ }
+ }
+
+ return null;
+ };
+
function init() {
vm.loading = true;
diff --git a/src/Umbraco.Web.UI.Client/src/views/languages/overview.html b/src/Umbraco.Web.UI.Client/src/views/languages/overview.html
index f53326a491..3b75fa62bd 100644
--- a/src/Umbraco.Web.UI.Client/src/views/languages/overview.html
+++ b/src/Umbraco.Web.UI.Client/src/views/languages/overview.html
@@ -36,7 +36,7 @@
- {{vm.labels.general}}
{{vm.labels.mandatory}} |
- {{vm.labels.fallsbackTo}}: {{language.fallbackLanguage.name}} |
+ {{vm.labels.fallsbackTo}}: {{vm.getLanguageById(language.fallbackLanguageId).name}} |
x.FallbackLanguage?.Id == language.Id))
+ if (langs.Any(x => x.FallbackLanguageId.HasValue && x.FallbackLanguageId.Value == language.Id))
{
var message = $"Language '{language.CultureName}' is defined as a fall-back language for one or more other languages, and so cannot be deleted.";
throw new HttpResponseException(Request.CreateNotificationValidationErrorResponse(message));
@@ -147,20 +147,21 @@ namespace Umbraco.Web.Editors
CultureName = culture.DisplayName,
IsDefaultVariantLanguage = language.IsDefaultVariantLanguage,
Mandatory = language.Mandatory,
+ FallbackLanguageId = language.FallbackLanguageId
};
- AssociateFallbackLanguage(language, newLang);
Services.LocalizationService.Save(newLang);
return Mapper.Map(newLang);
}
found.Mandatory = language.Mandatory;
found.IsDefaultVariantLanguage = language.IsDefaultVariantLanguage;
- AssociateFallbackLanguage(language, found);
+ found.FallbackLanguageId = language.FallbackLanguageId;
- if (DoesUpdatedFallbackLanguageCreateACircularPath(found))
+ string selectedFallbackLanguageCultureName;
+ if (DoesUpdatedFallbackLanguageCreateACircularPath(found, out selectedFallbackLanguageCultureName))
{
- ModelState.AddModelError("FallbackLanguage", "The selected fall back language '" + found.FallbackLanguage.CultureName + "' would create a circular path.");
+ ModelState.AddModelError("FallbackLanguage", "The selected fall back language '" + selectedFallbackLanguageCultureName + "' would create a circular path.");
throw new HttpResponseException(Request.CreateValidationErrorResponse(ModelState));
}
@@ -168,43 +169,35 @@ namespace Umbraco.Web.Editors
return Mapper.Map(found);
}
- private static void AssociateFallbackLanguage(Language submittedLanguage, ILanguage languageToCreateOrUpdate)
+ private bool DoesUpdatedFallbackLanguageCreateACircularPath(ILanguage language, out string selectedFallbackLanguageCultureName)
{
- if (submittedLanguage.FallbackLanguage == null)
- {
- languageToCreateOrUpdate.FallbackLanguage = null;
- return;
- }
-
- var fallbackLanguageCulture = CultureInfo.GetCultureInfo(submittedLanguage.FallbackLanguage.IsoCode);
- languageToCreateOrUpdate.FallbackLanguage = new Core.Models.Language(fallbackLanguageCulture.Name)
- {
- Id = submittedLanguage.FallbackLanguage.Id,
- CultureName = fallbackLanguageCulture.DisplayName
- };
- }
-
- private bool DoesUpdatedFallbackLanguageCreateACircularPath(ILanguage language)
- {
- if (language.FallbackLanguage == null)
+ if (language.FallbackLanguageId.HasValue == false)
{
+ selectedFallbackLanguageCultureName = string.Empty;
return false;
}
var languages = Services.LocalizationService.GetAllLanguages().ToArray();
- var fallbackLanguage = language.FallbackLanguage;
- while (fallbackLanguage != null)
+ var fallbackLanguageId = language.FallbackLanguageId;
+ while (fallbackLanguageId.HasValue)
{
- if (fallbackLanguage.Id == language.Id)
+ if (fallbackLanguageId.Value == language.Id)
{
// We've found the current language in the path of fall back languages, so we have a circular path.
+ selectedFallbackLanguageCultureName = GetLanguageFromCollectionById(languages, fallbackLanguageId.Value).CultureName;
return true;
}
- fallbackLanguage = languages.Single(x => x.Id == fallbackLanguage.Id).FallbackLanguage;
+ fallbackLanguageId = GetLanguageFromCollectionById(languages, fallbackLanguageId.Value).FallbackLanguageId;
}
+ selectedFallbackLanguageCultureName = string.Empty;
return false;
}
+
+ private static ILanguage GetLanguageFromCollectionById(IEnumerable languages, int id)
+ {
+ return languages.Single(x => x.Id == id);
+ }
}
}
diff --git a/src/Umbraco.Web/Models/ContentEditing/Language.cs b/src/Umbraco.Web/Models/ContentEditing/Language.cs
index 309e111e32..7693ee836e 100644
--- a/src/Umbraco.Web/Models/ContentEditing/Language.cs
+++ b/src/Umbraco.Web/Models/ContentEditing/Language.cs
@@ -25,7 +25,7 @@ namespace Umbraco.Web.Models.ContentEditing
[DataMember(Name = "isMandatory")]
public bool Mandatory { get; set; }
- [DataMember(Name = "fallbackLanguage")]
- public Language FallbackLanguage { get; set; }
+ [DataMember(Name = "fallbackLanguageId")]
+ public int? FallbackLanguageId { get; set; }
}
}
diff --git a/src/Umbraco.Web/Models/PublishedContent/PublishedValueLanguageFallback.cs b/src/Umbraco.Web/Models/PublishedContent/PublishedValueLanguageFallback.cs
index b6dc9f4244..d6e8db83f4 100644
--- a/src/Umbraco.Web/Models/PublishedContent/PublishedValueLanguageFallback.cs
+++ b/src/Umbraco.Web/Models/PublishedContent/PublishedValueLanguageFallback.cs
@@ -107,13 +107,6 @@ namespace Umbraco.Web.Models.PublishedContent
return base.GetValue(content, alias, culture, segment, defaultValue, recurse, fallbackPriority);
}
- private static bool ValueIsNotNullEmptyOrDefault(T value, T defaultValue)
- {
- return value != null &&
- string.IsNullOrEmpty(value.ToString()) == false &&
- value.Equals(defaultValue) == false;
- }
-
private bool TryGetValueFromFallbackLanguage(IPublishedProperty property, string culture, string segment, T defaultValue, out T value)
{
if (string.IsNullOrEmpty(culture))
@@ -123,22 +116,23 @@ namespace Umbraco.Web.Models.PublishedContent
}
var language = _localizationService.GetLanguageByIsoCode(culture);
- if (language.FallbackLanguage == null)
+ if (language.FallbackLanguageId.HasValue == false)
{
value = defaultValue;
return false;
}
- var fallbackLanguage = language.FallbackLanguage;
- while (fallbackLanguage != null)
+ var fallbackLanguageId = language.FallbackLanguageId;
+ while (fallbackLanguageId.HasValue)
{
+ var fallbackLanguage = GetLanguageById(fallbackLanguageId.Value);
value = property.Value(fallbackLanguage.IsoCode, segment, defaultValue);
if (ValueIsNotNullEmptyOrDefault(value, defaultValue))
{
return true;
}
- fallbackLanguage = GetNextFallbackLanguage(fallbackLanguage);
+ fallbackLanguageId = fallbackLanguage.FallbackLanguageId;
}
value = defaultValue;
@@ -154,22 +148,23 @@ namespace Umbraco.Web.Models.PublishedContent
}
var language = _localizationService.GetLanguageByIsoCode(culture);
- if (language.FallbackLanguage == null)
+ if (language.FallbackLanguageId.HasValue == false)
{
value = defaultValue;
return false;
}
- var fallbackLanguage = language.FallbackLanguage;
- while (fallbackLanguage != null)
+ var fallbackLanguageId = language.FallbackLanguageId;
+ while (fallbackLanguageId.HasValue)
{
+ var fallbackLanguage = GetLanguageById(fallbackLanguageId.Value);
value = content.Value(alias, fallbackLanguage.IsoCode, segment, defaultValue);
if (ValueIsNotNullEmptyOrDefault(value, defaultValue))
{
return true;
}
- fallbackLanguage = GetNextFallbackLanguage(fallbackLanguage);
+ fallbackLanguageId = fallbackLanguage.FallbackLanguageId;
}
value = defaultValue;
@@ -185,34 +180,39 @@ namespace Umbraco.Web.Models.PublishedContent
}
var language = _localizationService.GetLanguageByIsoCode(culture);
- if (language.FallbackLanguage == null)
+ if (language.FallbackLanguageId.HasValue == false)
{
value = defaultValue;
return false;
}
- var fallbackLanguage = language.FallbackLanguage;
- while (fallbackLanguage != null)
+ var fallbackLanguageId = language.FallbackLanguageId;
+ while (fallbackLanguageId.HasValue)
{
+ var fallbackLanguage = GetLanguageById(fallbackLanguageId.Value);
value = content.Value(alias, fallbackLanguage.IsoCode, segment, defaultValue, recurse);
if (ValueIsNotNullEmptyOrDefault(value, defaultValue))
{
return true;
}
- fallbackLanguage = GetNextFallbackLanguage(fallbackLanguage);
+ fallbackLanguageId = fallbackLanguage.FallbackLanguageId;
}
value = defaultValue;
return false;
}
- private ILanguage GetNextFallbackLanguage(ILanguage fallbackLanguage)
+ private ILanguage GetLanguageById(int id)
{
- // Ensure reference to next fall-back language is loaded if it exists
- fallbackLanguage = _localizationService.GetLanguageById(fallbackLanguage.Id);
+ return _localizationService.GetLanguageById(id);
+ }
- return fallbackLanguage.FallbackLanguage;
+ private static bool ValueIsNotNullEmptyOrDefault(T value, T defaultValue)
+ {
+ return value != null &&
+ string.IsNullOrEmpty(value.ToString()) == false &&
+ value.Equals(defaultValue) == false;
}
}
}
|