Mercurial > repos > IBBoard
view Lang/TranslationXmlLoader.cs @ 83:13f0ffb012cb
Re warfoundry:#272 : Program errors on exit if language file fails to load.
* Make ID of translation required
* Add method to check if language exists
no-open-ticket
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Sat, 15 May 2010 14:41:41 +0000 |
parents | a23c07137fa4 |
children | 90b9a3fe3c18 |
line wrap: on
line source
// This file (TranslationXmlLoader.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.IO; using System.Xml; using System.Xml.Schema; using System.Collections.Generic; using IBBoard.IO; using IBBoard.Xml; namespace IBBoard.Lang { /// <summary> /// A simple loader of translations from XML files /// </summary> public class TranslationXmlLoader { private XmlReaderSettings settings; private string schemaLocation; private TranslationXmlExtractor extractor; public TranslationXmlLoader(string schemaLocation) { this.schemaLocation = schemaLocation; extractor = new TranslationXmlExtractor(); } public AbstractTranslationSet LoadTranslations(string path) { FileInfo file = new FileInfo(path); if (!file.Exists) { throw new TranslationLoadException("Translation file "+file.FullName+" did not exist"); } XmlDocument doc = LoadTranslationDocument(file); XmlTranslationSet translations = new XmlTranslationSet(extractor.GetLanguageOfDocument(doc)); translations.SetParentLanguage(extractor.GetParentLanguageOfDocument(doc)); translations.SetTranslationNodes(extractor.GetTranslationNodes(doc)); return translations; } private XmlDocument LoadTranslationDocument(FileInfo file) { XmlDocument doc = new XmlDocument(); XmlReader valReader = XmlReader.Create(file.OpenRead(), GetReaderSettings()); try { doc.Load(valReader); } catch (DirectoryNotFoundException ex) { throw new TranslationLoadException("Problem validating schema for translation: " + ex.Message, ex); } catch (XmlSchemaException ex) { throw new TranslationLoadException("Problem validating schema for translation: " + ex.Message, ex); } catch (XmlException ex) { throw new TranslationLoadException("Problem reading data for translation: " + ex.Message, ex); } finally { valReader.Close(); } return doc; } /// <summary> /// Lazy-getter for XML reader settings. May throw a <see cref="TranslationLoadException"/> if there is a problem with the translation schema. /// </summary> /// <returns> /// A <see cref="XmlReaderSettings"/> with the default values for validating the translation document against the translation schema /// </returns> private XmlReaderSettings GetReaderSettings() { if (settings == null) { try { settings = new XmlReaderSettings(); settings.ValidationType = ValidationType.Schema; settings.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings; settings.ValidationEventHandler+= new ValidationEventHandler(ValidationEventMethod); XmlSchemaSet cache = new XmlSchemaSet(); cache.Add("http://ibboard.co.uk/translation", schemaLocation); settings.Schemas.Add(cache); } catch (DirectoryNotFoundException ex) { throw new TranslationLoadException("Problem validating schema for translation: " + ex.Message, ex); } catch (XmlSchemaException ex) { throw new TranslationLoadException("Problem validating schema for translation: " + ex.Message, ex); } catch (XmlException ex) { throw new TranslationLoadException("Problem reading data for schema: " + ex.Message, ex); } } return settings; } private void ValidationEventMethod(object sender, ValidationEventArgs e) { throw new TranslationLoadException("Problem validating schema for translation: " + e.Exception.Message, e.Exception); } } }