Mercurial > repos > IBBoard
view Lang/AbstractTranslationSet.cs @ 75:b1ae6fce2e3f
Re #35: Add multi-level cascading of translations
* Add "parent language" property
* Make translation fetching request parent translation if none is found
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Wed, 07 Apr 2010 19:34:38 +0000 |
parents | 091bfa54d6c7 |
children | f45d28dc1d6a |
line wrap: on
line source
// This file (AbstractTranslationSet.cs) is a part of the IBBoard project and is copyright 2010 IBBoard // // The file and the library/program it is in are licensed and distributed, without warranty, under the GNU Affero GPL license, either version 3 of the License or (at your option) any later version. Please see COPYING for more information and the full license. using System; using System.Collections.Generic; namespace IBBoard.Lang { /// <summary> /// A collection of translations for a given language. The abstract class must be extended by implementations that /// provide different ways of loading the data. /// </summary> public abstract class AbstractTranslationSet { private TranslationLanguage language; protected Dictionary<string, string> translations; private TranslationLanguage parentLang; public AbstractTranslationSet(string languageCode) : this(languageCode, "") { //Do nothing extra } public AbstractTranslationSet(string languageCode, string parentLanguageCode) { language = new TranslationLanguage(languageCode); translations = new Dictionary<string, string>(); if (parentLanguageCode != null && !parentLanguageCode.Trim().Equals("")) { ParentLanguage = new TranslationLanguage(parentLanguageCode); } } /// <summary> /// Gets the language code that this translation claims to be for /// </summary> public string LanguageCode { get { return language.Code; } } /// <summary> /// Gets a translation from the translation set, or <code>null</code> if the translation doesn't exist. /// </summary> /// <param name="key"> /// The key (ID) of the translation to retrieve /// </param> public string this[string key] { get { 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 { get { return language.Name; } } public TranslationLanguage Language { get { return language; } } public TranslationLanguage ParentLanguage { get { return parentLang; } protected set { parentLang = value; } } public override bool Equals(object obj) { bool equal = true; if (obj == null || !obj.GetType().Equals(GetType())) { equal = false; } else { equal = LanguageCode.Equals(((AbstractTranslationSet)obj).LanguageCode); } return equal; } public override int GetHashCode () { return GetType().GetHashCode() + LanguageCode.GetHashCode(); } } }