using System;
using System.IO;
using System.Collections;
namespace TeamXBMC.TranslatorCore
{
///
/// Represents an array of strings to be translated.
///
public class TranslatorArray : ICollection
{
private ArrayList strings=new ArrayList();
private Hashtable stringsMap=new Hashtable();
private TranslatorArrayEnumerator enumerator=TranslatorArrayEnumerator.All;
private double versionOriginal=0.0;
private bool modified=false;
#region Constructors
public TranslatorArray()
{
//
// TODO: Add constructor logic here
//
}
#endregion
#region ICollection Members
public bool IsSynchronized
{
get{return false;}
}
public int Count
{
get{return strings.Count;}
}
public void CopyTo(Array array, int index)
{
strings.CopyTo(array, index);
}
public object SyncRoot
{
get{return this;}
}
#endregion
#region IEnumerable Members
public IEnumerator GetEnumerator()
{
switch (enumerator)
{
case TranslatorArrayEnumerator.All:
return strings.GetEnumerator();
case TranslatorArrayEnumerator.Translated:
return new EnumeratorTranslated(strings.GetEnumerator());
case TranslatorArrayEnumerator.Untranslated:
return new EnumeratorUntranslated(strings.GetEnumerator());
case TranslatorArrayEnumerator.Changed:
return new EnumeratorChanged(strings.GetEnumerator());
default:
return strings.GetEnumerator();
}
}
#endregion
#region Array methods
///
/// Adds a TranslatorItem to the array.
///
private void Add(TranslatorItem item)
{
strings.Add(item);
stringsMap.Add(item.StringOriginal.Id, item);
}
///
/// Sorts the array
///
private void Sort()
{
strings.Sort();
}
///
/// Clears the array
///
public void Clear()
{
strings.Clear();
stringsMap.Clear();
versionOriginal=0.0;
}
///
/// Returns a TranslatorItem by a certain id
///
public bool GetItemById(long id, ref TranslatorItem item)
{
if (!stringsMap.Contains(id))
{
item=null;
return false;
}
item=(TranslatorItem)stringsMap[id];
return true;
}
#endregion
#region Language file processing
///
/// Loads the current language file and checks its string for its state
///
public void Load()
{
if (Settings.Instance.LanguageFolder=="" || Settings.Instance.Language=="")
return;
modified=false;
if (!File.Exists(Settings.Instance.FilenameOriginal))
throw new TranslatorException("File "+Settings.Instance.FilenameOriginal+" was not found. Please be sure your language folder is set properly.");
if (!File.Exists(Settings.Instance.FilenameTranslated))
throw new TranslatorException("File "+Settings.Instance.FilenameTranslated+" was not found. Please be sure your language folder is set properly.");
StringArray stringsOriginal=new StringArray();
stringsOriginal.Load(Settings.Instance.FilenameOriginal);
versionOriginal=stringsOriginal.Version;
StringArray stringsTranslated=new StringArray();
stringsTranslated.Load(Settings.Instance.FilenameTranslated);
try
{
DetermineTranslated(stringsTranslated, stringsOriginal);
DetermineUntranslated(stringsTranslated, stringsOriginal);
DetermineChanged(stringsTranslated, stringsOriginal);
Sort();
foreach (TranslatorItem item in strings)
{ // Add StringModified to the stringUpdated delegate
// to be informed if a string has changed
item.StringTranslated.stringUpdated+=new StringItem.StringUpdatedDelegate(StringModified);
}
}
catch(Exception e)
{
throw new TranslatorException("Error processing xml data", e);
}
}
///
/// Returns true if the current language file is modified
///
public bool IsModified
{
get { return modified; }
}
///
/// Save the current language file
///
public void Save()
{
StringArray strings=new StringArray();
enumerator=TranslatorArrayEnumerator.All;
foreach (TranslatorItem item in this)
{
if (item.State==TranslationState.Translated || item.State==TranslationState.Changed)
strings.Add(item.StringTranslated);
}
strings.Sort();
ArrayList comments=new ArrayList();
comments.Add("Language file translated with Team XBMC Translator");
if (Settings.Instance.TranslatorName!="")
comments.Add("Translator: "+Settings.Instance.TranslatorName);
if (Settings.Instance.TranslatorEmail!="")
comments.Add("Email: "+Settings.Instance.TranslatorEmail);
DateTime time=DateTime.Now;
comments.Add("Date of translation: "+time.GetDateTimeFormats(System.Globalization.CultureInfo.InvariantCulture)[0]);
comments.Add("$"+"Revision"+"$");
if (versionOriginal>0.0)
comments.Add("Based on english strings version "+versionOriginal.ToString(System.Globalization.CultureInfo.InvariantCulture));
strings.Save(Settings.Instance.FilenameTranslated, (string[])comments.ToArray(typeof(string)));
modified=false;
}
///
/// Creates all TranlatorItems with the state translated
///
private void DetermineTranslated(StringArray stringsTranslated, StringArray stringsOriginal)
{
foreach (StringItem item in stringsOriginal)
{
StringItem itemTranslated=null;
if (stringsTranslated.GetStringById(item.Id, ref itemTranslated))
{
Add(new TranslatorItem(itemTranslated, item, TranslationState.Translated));
}
}
}
///
/// Creates all TranlatorItems with the state untranslated
///
private void DetermineUntranslated(StringArray stringsTranslated, StringArray stringsOriginal)
{
foreach (StringItem item in stringsOriginal.GetStringsNotIn(stringsTranslated))
{
StringItem itemUntranslated=new StringItem(item);
itemUntranslated.Text="";
Add(new TranslatorItem(itemUntranslated, item, TranslationState.Untranslated));
}
}
///
/// Creates all TranlatorItems with the state changed.
/// It also saves the master language history
///
private void DetermineChanged(StringArray stringsTranslated, StringArray stringsOriginal)
{
string filenameSaved=System.Windows.Forms.Application.LocalUserAppDataPath.Substring(0, System.Windows.Forms.Application.LocalUserAppDataPath.LastIndexOf(@"\"))+@"\strings.xml";
string filenamePrev=System.Windows.Forms.Application.LocalUserAppDataPath.Substring(0, System.Windows.Forms.Application.LocalUserAppDataPath.LastIndexOf(@"\"))+@"\stringsPrev.xml";
// No history yet?
if (!File.Exists(filenameSaved))
{ // Copy our master language, to have a history
File.Copy(Settings.Instance.FilenameOriginal, filenameSaved, true);
return;
}
StringArray stringsSaved=new StringArray();
stringsSaved.Load(filenameSaved);
// Check the version of the saved master language
if (stringsOriginal.Version>stringsSaved.Version)
{ // saved is older then our current master language,
// update history
File.Copy(filenameSaved, filenamePrev, true);
File.Copy(Settings.Instance.FilenameOriginal, filenameSaved, true);
}
else if (stringsOriginal.Version
/// This function is called if a StringItem has beeen modified
///
private void StringModified(StringItem item)
{
modified=true;
}
#endregion
#region Properties
///
/// Gets/Sets the current enumerator. See
/// TranslatorArrayEnumerator for more info.
///
public TranslatorArrayEnumerator Enumerator
{
get { return enumerator; }
set { enumerator=value; }
}
#endregion
}
}