# HG changeset patch # User IBBoard # Date 1270668878 0 # Node ID b1ae6fce2e3fddd20ee80d6597ad690b017a85e7 # Parent 726731c78414b87202284be467477a28c09017e5 Re #35: Add multi-level cascading of translations * Add "parent language" property * Make translation fetching request parent translation if none is found diff -r 726731c78414 -r b1ae6fce2e3f Lang/AbstractTranslationSet.cs --- a/Lang/AbstractTranslationSet.cs Wed Apr 07 14:56:17 2010 +0000 +++ b/Lang/AbstractTranslationSet.cs Wed Apr 07 19:34:38 2010 +0000 @@ -11,17 +11,30 @@ /// A collection of translations for a given language. The abstract class must be extended by implementations that /// provide different ways of loading the data. /// - public class AbstractTranslationSet + public abstract class AbstractTranslationSet { private TranslationLanguage language; protected Dictionary translations; + private TranslationLanguage parentLang; - public AbstractTranslationSet(string languageCode) + public AbstractTranslationSet(string languageCode) : this(languageCode, "") + { + //Do nothing extra + } + + public AbstractTranslationSet(string languageCode, string parentLanguageCode) { language = new TranslationLanguage(languageCode); translations = new Dictionary(); + + if (parentLanguageCode != null && !parentLanguageCode.Trim().Equals("")) + { + ParentLanguage = new TranslationLanguage(parentLanguageCode); + } + } + /// /// Gets the language code that this translation claims to be for /// @@ -40,9 +53,31 @@ { get { - return DictionaryUtils.GetValue(translations, key); + string translation = DictionaryUtils.GetValue(translations, key); + + if (parentLang != null && translation == null) + { + translation = GetParentTranslation(key); + } + + return translation; } } + + private string GetParentTranslation(string key) + { + AbstractTranslationSet parentTranslations = GetParentTranslations(); + string parentTranslation = null; + + if (parentTranslations != null) + { + parentTranslation = parentTranslations[key]; + } + + return parentTranslation; + } + + protected abstract AbstractTranslationSet GetParentTranslations(); public string LanguageName { @@ -57,6 +92,12 @@ get { return language; } } + public TranslationLanguage ParentLanguage + { + get { return parentLang; } + protected set { parentLang = value; } + } + public override bool Equals(object obj) { bool equal = true; diff -r 726731c78414 -r b1ae6fce2e3f Lang/ModifiableTranslationSet.cs --- a/Lang/ModifiableTranslationSet.cs Wed Apr 07 14:56:17 2010 +0000 +++ b/Lang/ModifiableTranslationSet.cs Wed Apr 07 19:34:38 2010 +0000 @@ -12,7 +12,14 @@ /// public class ModifiableTranslationSet : AbstractTranslationSet { - public ModifiableTranslationSet(string languageCode) : base(languageCode) + private AbstractTranslationSet parentTranslationSet; + + public ModifiableTranslationSet(string languageCode) : this(languageCode, "") + { + //Do nothing extra + } + + public ModifiableTranslationSet(string languageCode, string parentLanguageCode) : base(languageCode, parentLanguageCode) { //Do nothing extra } @@ -21,5 +28,17 @@ { translations[key] = translation; } + + public void SetParentTranslations(ModifiableTranslationSet parentTranslations) + { + ParentLanguage = parentTranslations.Language; + parentTranslationSet = parentTranslations; + } + + protected override AbstractTranslationSet GetParentTranslations() + { + return parentTranslationSet; + } + } } diff -r 726731c78414 -r b1ae6fce2e3f Lang/Translation.cs --- a/Lang/Translation.cs Wed Apr 07 14:56:17 2010 +0000 +++ b/Lang/Translation.cs Wed Apr 07 19:34:38 2010 +0000 @@ -129,7 +129,7 @@ private static void LoadTranslationForLanguage(string translationLanguage) { - SetCurrentTranslations(DictionaryUtils.GetValue(langToTranslationMap, translationLanguage)); + SetCurrentTranslations(GetTranslationSet(translationLanguage)); } /// @@ -292,5 +292,22 @@ return langs; } + + public static AbstractTranslationSet GetTranslationSet(string translationLanguage) + { + AbstractTranslationSet translations = null; + + if (translationLanguage != null) + { + translations = DictionaryUtils.GetValue(langToTranslationMap, translationLanguage); + + if (translations == null) + { + translations = new ModifiableTranslationSet(translationLanguage); + } + } + + return translations; + } } }