using System;
using System.Xml;
using System.Collections;
namespace TeamXBMC.TranslatorCore
{
///
/// Holds language specific settings like date/time format or codepages.
///
public class LanguageInfo
{
public class Region
{
private string dateLong="DDDD, D MMMM YYYY";
private string dateShort="DD/MM/YYYY";
private string time="H:mm:ss";
private string symbolAM="";
private string symbolPM="";
private string speedUnit="kmh";
private string tempUnit="C";
private string name="(default)";
public Region()
{
}
public string DateLong
{
get { return dateLong; }
set { dateLong=value; }
}
public string DateShort
{
get { return dateShort; }
set { dateShort=value; }
}
public string Time
{
get { return time; }
set { time=value; }
}
public string SymbolAM
{
get { return symbolAM; }
set { symbolAM=value; }
}
public string SymbolPM
{
get { return symbolPM; }
set { symbolPM=value; }
}
public string SpeedUnit
{
get { return speedUnit; }
set { speedUnit=value; }
}
public string TempUnit
{
get { return tempUnit; }
set { tempUnit=value; }
}
public string Name
{
get { return name; }
set { name=value; }
}
public void Load(XmlElement element)
{
if (element.GetAttribute("name")!="")
name=element.GetAttribute("name");
XmlNode node=null;
node=element.SelectSingleNode("dateshort");
if (node!=null)
dateShort=node.InnerText;
node=element.SelectSingleNode("datelong");
if (node!=null)
dateLong=node.InnerText;
XmlElement timeElement=(XmlElement)element.SelectSingleNode("time");
if (timeElement!=null)
{
symbolAM=timeElement.GetAttribute("symbolAM");
symbolPM=timeElement.GetAttribute("symbolPM");
time=timeElement.InnerText;
}
node=element.SelectSingleNode("speedunit");
if (node!=null)
speedUnit=node.InnerText;
node=element.SelectSingleNode("tempunit");
if (node!=null)
tempUnit=node.InnerText;
}
public void Save(ref XmlElement element)
{
if (name!="(default)")
element.SetAttribute("name", name);
XmlElement dateShortElement=element.OwnerDocument.CreateElement("dateshort");
dateShortElement.InnerText=dateShort;
element.AppendChild(dateShortElement);
XmlElement dateLongElement=element.OwnerDocument.CreateElement("datelong");
dateLongElement.InnerText=dateLong;
element.AppendChild(dateLongElement);
XmlElement timeElement=element.OwnerDocument.CreateElement("time");
timeElement.InnerText=time;
timeElement.SetAttribute("symbolAM", symbolAM);
timeElement.SetAttribute("symbolPM", symbolPM);
element.AppendChild(timeElement);
XmlElement tempUnitElement=element.OwnerDocument.CreateElement("tempunit");
tempUnitElement.InnerText=tempUnit;
element.AppendChild(tempUnitElement);
XmlElement speedUnitElement=element.OwnerDocument.CreateElement("speedunit");
speedUnitElement.InnerText=speedUnit;
element.AppendChild(speedUnitElement);
}
};
private string dvdMenu="en";
private string dvdAudio="en";
private string dvdSubtitle="en";
private string charsetGui="CP1251";
private string charsetSubtitle="CP1251";
private bool forceUnicodeFont=false;
private ArrayList regions=new ArrayList();
public LanguageInfo()
{
// Add a region with default values
regions.Add(new Region());
}
///
/// Load a language info from filename
///
public void Load(string filename)
{
XmlTextReader reader=null;
try
{
reader=new XmlTextReader(filename);
XmlDocument doc=new XmlDocument();
doc.Load(reader);
XmlNode node=null;
node=doc.DocumentElement.SelectSingleNode("/language/charsets/gui");
if (node!=null)
{
XmlElement gui=(XmlElement)node;
charsetGui=gui.InnerText;
forceUnicodeFont=(gui.GetAttribute("unicodefont")=="true");
}
node=doc.DocumentElement.SelectSingleNode("/language/charsets/subtitle");
if (node!=null)
{
charsetSubtitle=node.InnerText;
}
node=doc.DocumentElement.SelectSingleNode("/language/dvd/menu");
if (node!=null)
{
dvdMenu=node.InnerText;
}
node=doc.DocumentElement.SelectSingleNode("/language/dvd/audio");
if (node!=null)
{
dvdAudio=node.InnerText;
}
node=doc.DocumentElement.SelectSingleNode("/language/dvd/subtitle");
if (node!=null)
{
dvdSubtitle=node.InnerText;
}
XmlNodeList regionNodes=doc.DocumentElement.SelectNodes("/language/regions/region");
if (regionNodes.Count>0)
{
regions.Clear(); // remove default region
foreach (XmlNode regionNode in regionNodes)
{
Region region=new Region();
region.Load((XmlElement)regionNode);
regions.Add(region);
}
}
}
catch(Exception e)
{
throw new TranslatorException("Error loading "+filename, e);
}
finally
{
if (reader!=null)
reader.Close();
}
}
///
/// Save the language info to filename
///
public void Save(string filename)
{
XmlTextWriter writer=null;
try
{
XmlDocument doc=new XmlDocument();
doc.AppendChild(doc.CreateXmlDeclaration("1.0", "utf-8", "yes"));
XmlElement root=doc.CreateElement("language");
doc.AppendChild(root);
XmlNode charsetsNode=doc.CreateElement("charsets");
root.AppendChild(charsetsNode);
XmlElement guiElement=doc.CreateElement("gui");
guiElement.InnerText=charsetGui;
guiElement.SetAttribute("unicodefont", forceUnicodeFont ? "true" : "false");
charsetsNode.AppendChild(guiElement);
XmlNode subtitleNode=doc.CreateElement("subtitle");
subtitleNode.InnerText=charsetSubtitle;
charsetsNode.AppendChild(subtitleNode);
XmlNode dvdNode=doc.CreateElement("dvd");
root.AppendChild(dvdNode);
XmlNode dvdMenuNode=doc.CreateElement("menu");
dvdMenuNode.InnerText=dvdMenu;
dvdNode.AppendChild(dvdMenuNode);
XmlNode dvdAudioNode=doc.CreateElement("audio");
dvdAudioNode.InnerText=dvdAudio;
dvdNode.AppendChild(dvdAudioNode);
XmlNode dvdSubtitleNode=doc.CreateElement("subtitle");
dvdSubtitleNode.InnerText=dvdSubtitle;
dvdNode.AppendChild(dvdSubtitleNode);
XmlNode regionsNode=doc.CreateElement("regions");
root.AppendChild(regionsNode);
foreach (Region region in regions)
{
XmlElement regionNode=doc.CreateElement("region");
regionsNode.AppendChild(regionNode);
region.Save(ref regionNode);
}
writer=new XmlTextWriter(filename, System.Text.Encoding.UTF8);
writer.Formatting=Formatting.Indented;
doc.Save(writer);
}
catch(Exception e)
{
throw new TranslatorException("Error saving "+filename, e);
}
finally
{
if (writer!=null)
writer.Close();
}
}
///
/// Gets/Sets the dvd menu language as ISO-639:1988 language code
///
public string DvdMenu
{
get { return dvdMenu; }
set { dvdMenu=value; }
}
///
/// Gets/Sets the dvd audio language as ISO-639:1988 language code
///
public string DvdAudio
{
get { return dvdAudio; }
set { dvdAudio=value; }
}
///
/// Gets/Sets the dvd subtitle language as ISO-639:1988 language code
///
public string DvdSubtitle
{
get { return dvdSubtitle; }
set { dvdSubtitle=value; }
}
///
/// Gets/Sets the charset used for the user interface of xbmc
///
public string CharsetGui
{
get { return charsetGui; }
set { charsetGui=value; }
}
///
/// Gets/Sets the default charset used for the subtitles in xbmc
///
public string CharsetSubtitle
{
get { return charsetSubtitle; }
set { charsetSubtitle=value; }
}
///
/// Gets/Sets if the language need a unicode font to display properly
///
public bool ForceUnicodeFont
{
get { return forceUnicodeFont; }
set { forceUnicodeFont=value; }
}
///
/// Returns the available region, a region contains
/// things like date/time format or speed and temp units
///
public Region[] Regions
{
get { return (Region[])regions.ToArray(typeof(Region)); }
}
///
/// Removes a region from the language info by name
///
public void RemoveRegion(string regionName)
{
Region toDelete=null;
foreach (Region region in regions)
{
if (region.Name==regionName)
{
// Region to remove is found
toDelete=region;
break;
}
}
// remove it
if (toDelete!=null)
regions.Remove(toDelete);
}
///
/// Adds a region to the language info.
/// The name of the new region is returned.
///
public string AddRegion()
{
int i=1;
string newName="";
bool found=false;
while (!found)
{
// Try next name
newName="Region"+i.ToString();
i++;
// Does the new region name already exist
bool exists=false;
foreach (Region region in regions)
{
if (region.Name==newName)
{
exists=true;
break;
}
}
if (!exists)
{ // none existing name found
// add a region with this name
found=true;
Region region=new Region();
region.Name=newName;
regions.Add(region);
break;
}
}
return newName;
}
}
}