using System; using System.Collections.Generic; using System.Text; using System.Collections; using System.IO; using System.Text.RegularExpressions; namespace Server { public class ClilocTranslator { private static byte[] m_Buffer = new byte[1024]; private static Dictionary clilocStringList; private static string language = "enu"; private static string clientPath = "D:\\Program\\Ultima Online 2D\\"; public static void Start() { if (language == null || language == "") language = "enu"; //TODO: Fix this like the SDK string path = string.Format("{0}cliloc.{1}", ClilocTranslator.clientPath, language); clilocStringList = new Dictionary(); #region Ultima SDK code + mod using (BinaryReader bin = new BinaryReader(new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))) { bin.ReadInt32(); bin.ReadInt16(); while (bin.PeekChar() != -1) { int number = bin.ReadInt32(); bin.ReadByte(); int length = bin.ReadInt16(); if (length > m_Buffer.Length) m_Buffer = new byte[(length + 1023) & ~1023]; bin.Read(m_Buffer, 0, length); clilocStringList[number] = new ClilocStringEntry(Encoding.UTF8.GetString(m_Buffer, 0, length)); } } #endregion } public static string GetString(int number, bool plural) { if (plural) return ClilocTranslator.clilocStringList[number].Plural; else return ClilocTranslator.clilocStringList[number].Singular; } public static string GetString(int number) { return ClilocTranslator.clilocStringList[number].Singular; } } public class ClilocStringEntry { string singular; string plural; public string Singular { get { return singular; } set { singular = value; } } public string Plural { get { return plural; } set { plural = value; } } public ClilocStringEntry(string clilocString) { if (clilocString.Contains("~")) clilocString = FormatVars(clilocString); this.singular = clilocString.ToLower(); if ((this.singular.Length - 1) >= 0 && this.singular[singular.Length - 1] != 's') this.plural = this.singular + "s"; else this.plural = this.singular; } public string FormatVars(string text) { Regex r = new Regex("~(.+?)~"); MatchCollection mC = r.Matches(text); for (int i = 0; i < mC.Count; i++) text = text.Replace(mC[i].ToString(), string.Format("{{0}}", i)); return text; } } }