Files
RothenburgAR/Assets/RothenburgAR/Scripts/Common/TextElement.cs

125 lines
3.9 KiB
C#

using UnityEngine;
using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;
namespace RothenburgAR.Common
{
public class TextElement
{
private Dictionary<string, TextEntryLanguageEntry> TextEntries { get; set; }
public int EntryAmount
{
get { return TextEntries.Count; }
}
public TextElement()
{
TextEntries = new Dictionary<string, TextEntryLanguageEntry>();
}
public void AddTextElement(string languageKey, TextEntryType type, string value)
{
if (type == TextEntryType.Invalid)
return;
if (TextEntries.ContainsKey(languageKey))
throw new Exception("Already defined: " + languageKey);
TextEntries.Add(languageKey, new TextEntryLanguageEntry(type, value));
}
public string GetTextByLanguage(string langKey)
{
TextEntryLanguageEntry te;
if (TextEntries.TryGetValue(langKey, out te)) return te.Text;
if (LanguageManager.Instance.DefaultLanguageKey != langKey)
return GetTextByLanguage(LanguageManager.Instance.DefaultLanguageKey);
else
return LanguageManager.ERR_NO_TEXT_FOR_LANG;
}
public static TextEntryType GetTextEntryTypeFromString(string text)
{
switch (text.ToLower())
{
case "inline":
return TextEntryType.Inline;
case "file":
return TextEntryType.File;
default:
return TextEntryType.Invalid;
}
}
public static TextElement BuildFromXmlNode(string basePath, XmlNodeList xmlNodeList)
{
TextElement textElement = new TextElement();
foreach (XmlNode xmlNode in xmlNodeList)
{
if (xmlNode == null || xmlNode.Attributes == null)
throw new ArgumentNullException();
if (xmlNode.Attributes["lang"] == null)
throw new Exception("Attribute lang is not defined.");
if (xmlNode.Attributes["value"] == null)
throw new Exception("Attribute value is not defined.");
if (xmlNode.Attributes["type"] == null)
throw new Exception("Attribute type is not defined.");
var langCode = xmlNode.Attributes["lang"].Value;
var typeStr = xmlNode.Attributes["type"].Value;
TextEntryType type = TextElement.GetTextEntryTypeFromString(typeStr);
var valueStr = xmlNode.Attributes["value"].Value;
if (type == TextEntryType.File)
valueStr = valueStr;
textElement.AddTextElement(langCode, type, valueStr);
}
return textElement;
}
}
public enum TextEntryType
{
Invalid = 0,
Inline = 1,
File = 2
}
public class TextEntryLanguageEntry
{
private string Value { get; set; }
private TextEntryType Type { get; set; }
public string Text
{
get
{
// If it is an Inline-Text, just return it
if (Type == TextEntryType.Inline)
return Value;
// Attention:
// if there should be performance issues, here could be a nice place to add caching
var file = Resources.Load<TextAsset>(Value);
// If it is no inline text, we need to have a file path as "value".
if (file == null)
throw new FileNotFoundException();
return file.text;
}
}
public TextEntryLanguageEntry(TextEntryType type, string value)
{
Value = value;
Type = type;
}
}
}