/// <summary>
        /// Loads all of the locale symbols defined in an XML document.
        /// </summary>
        /// <param name="layoutDocument">The XML document to load locale symbols from.</param>
        /// <returns>The symbols that were loaded.</returns>
        public static LocaleSymbolCollection LoadLocaleSymbols(XDocument symbolDocument)
        {
            // Make sure there is a root <symbols> tag
            XContainer container = symbolDocument.Element("symbols");
            if (container == null)
                throw new ArgumentException("Invalid symbols document");

            // Symbol tags have the format:
            // <symbol code="0x(the byte array)" display="(Friendly Name)" />
            LocaleSymbolCollection result = new LocaleSymbolCollection();
            foreach (XElement symbol in container.Elements("symbol"))
            {
                string code = XMLUtil.GetStringAttribute(symbol, "code");
                string display = XMLUtil.GetStringAttribute(symbol, "display");

                // Convert code to int
                code = code.Replace("0x", "");
                byte[] codeBytes = FunctionHelpers.HexStringToBytes(code);
                string codeString = Encoding.UTF8.GetString(codeBytes);
                char codeChar = codeString[0];

                result.AddSymbol(codeChar, display);
            }
            return result;
        }
        /// <summary>
        /// Adds a collection of symbols to this symbol collection.
        /// </summary>
        /// <param name="symbols">The symbols to add.</param>
        public void AddSymbols(LocaleSymbolCollection symbols)
        {
            foreach (var symbol in symbols._charReplacements)
                _charReplacements[symbol.Key] = symbol.Value;

            foreach (var str in symbols._stringReplacements)
                _stringReplacements[str.Key] = str.Value;
        }
 public ThirdGenLanguage(StructureValueCollection values, FileSegmenter segmenter, FileSegmentGroup localeArea, BuildInformation buildInfo)
 {
     _pointerLayout = buildInfo.GetLayout("locale index table entry");
     _encryptionKey = buildInfo.LocaleKey;
     _symbols = buildInfo.LocaleSymbols;
     _localeArea = localeArea;
     _sizeAlign = (_encryptionKey != null) ? AES.BlockSize : 1;
     Load(values, segmenter, localeArea);
 }
        /// <summary>
        ///     Adds a collection of symbols to this symbol collection.
        /// </summary>
        /// <param name="symbols">The symbols to add.</param>
        public void AddSymbols(LocaleSymbolCollection symbols)
        {
            foreach (var symbol in symbols._charReplacements)
            {
                _charReplacements[symbol.Key] = symbol.Value;
            }

            foreach (var str in symbols._stringReplacements)
            {
                _stringReplacements[str.Key] = str.Value;
            }
        }
        public LocaleEditor(GameLanguage language, ICacheFile cache, IStreamManager streamManager, Trie stringIdTrie,
			LocaleSymbolCollection symbols)
        {
            InitializeComponent();

            _currentLanguage = language;
            _cache = cache;
            _streamManager = streamManager;
            _symbols = symbols;
            StringIDTrie = stringIdTrie;

            // Thread the loading routine
            var thrd = new Thread(LoadAll);
            thrd.SetApartmentState(ApartmentState.STA);
            thrd.Start();
        }