| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 | using System.Collections.Generic;using FairyGUI.Utils;namespace FairyGUI{    public class TranslationHelper    {        public static Dictionary<string, Dictionary<string, string>> strings;        public static void LoadFromXML(XML source)        {            strings = new Dictionary<string, Dictionary<string, string>>();            XMLList.Enumerator et = source.GetEnumerator("string");            while (et.MoveNext())            {                XML cxml = et.Current;                string key = cxml.GetAttribute("name");                string text = cxml.text;                int i = key.IndexOf("-");                if (i == -1)                    continue;                string key2 = key.Substring(0, i);                string key3 = key.Substring(i + 1);                Dictionary<string, string> col;                if (!strings.TryGetValue(key2, out col))                {                    col = new Dictionary<string, string>();                    strings[key2] = col;                }                col[key3] = text;            }        }        public static void TranslateComponent(PackageItem item)        {            if (TranslationHelper.strings == null)                return;            Dictionary<string, string> strings;            if (!TranslationHelper.strings.TryGetValue(item.owner.id + item.id, out strings))                return;            string elementId, value;            ByteBuffer buffer = item.rawData;            buffer.Seek(0, 2);            int childCount = buffer.ReadShort();            for (int i = 0; i < childCount; i++)            {                int dataLen = buffer.ReadShort();                int curPos = buffer.position;                buffer.Seek(curPos, 0);                ObjectType baseType = (ObjectType)buffer.ReadByte();                ObjectType type = baseType;                buffer.Skip(4);                elementId = buffer.ReadS();                if (type == ObjectType.Component)                {                    if (buffer.Seek(curPos, 6))                        type = (ObjectType)buffer.ReadByte();                }                buffer.Seek(curPos, 1);                if (strings.TryGetValue(elementId + "-tips", out value))                    buffer.WriteS(value);                buffer.Seek(curPos, 2);                int gearCnt = buffer.ReadShort();                for (int j = 0; j < gearCnt; j++)                {                    int nextPos = buffer.ReadShort();                    nextPos += buffer.position;                    if (buffer.ReadByte() == 6) //gearText                    {                        buffer.Skip(2);//controller                        int valueCnt = buffer.ReadShort();                        for (int k = 0; k < valueCnt; k++)                        {                            string page = buffer.ReadS();                            if (page != null)                            {                                if (strings.TryGetValue(elementId + "-texts_" + k, out value))                                    buffer.WriteS(value);                                else                                    buffer.Skip(2);                            }                        }                        if (buffer.ReadBool() && strings.TryGetValue(elementId + "-texts_def", out value))                            buffer.WriteS(value);                    }                    buffer.position = nextPos;                }                if (baseType == ObjectType.Component && buffer.version >= 2)                {                    buffer.Seek(curPos, 4);                    buffer.Skip(2); //pageController                    buffer.Skip(4 * buffer.ReadShort());                    int cpCount = buffer.ReadShort();                    for (int k = 0; k < cpCount; k++)                    {                        string target = buffer.ReadS();                        int propertyId = buffer.ReadShort();                        if (propertyId == 0 && strings.TryGetValue(elementId + "-cp-" + target, out value))                            buffer.WriteS(value);                        else                            buffer.Skip(2);                    }                }                switch (type)                {                    case ObjectType.Text:                    case ObjectType.RichText:                    case ObjectType.InputText:                        {                            if (strings.TryGetValue(elementId, out value))                            {                                buffer.Seek(curPos, 6);                                buffer.WriteS(value);                            }                            if (strings.TryGetValue(elementId + "-prompt", out value))                            {                                buffer.Seek(curPos, 4);                                buffer.WriteS(value);                            }                            break;                        }                    case ObjectType.List:                    case ObjectType.Tree:                        {                            buffer.Seek(curPos, 8);                            buffer.Skip(2);                            int itemCount = buffer.ReadShort();                            for (int j = 0; j < itemCount; j++)                            {                                int nextPos = buffer.ReadShort();                                nextPos += buffer.position;                                buffer.Skip(2); //url                                if (type == ObjectType.Tree)                                    buffer.Skip(2);                                //title                                if (strings.TryGetValue(elementId + "-" + j, out value))                                    buffer.WriteS(value);                                else                                    buffer.Skip(2);                                //selected title                                if (strings.TryGetValue(elementId + "-" + j + "-0", out value))                                    buffer.WriteS(value);                                else                                    buffer.Skip(2);                                if (buffer.version >= 2)                                {                                    buffer.Skip(6);                                    buffer.Skip(buffer.ReadShort() * 4);//controllers                                    int cpCount = buffer.ReadShort();                                    for (int k = 0; k < cpCount; k++)                                    {                                        string target = buffer.ReadS();                                        int propertyId = buffer.ReadShort();                                        if (propertyId == 0 && strings.TryGetValue(elementId + "-" + j + "-" + target, out value))                                            buffer.WriteS(value);                                        else                                            buffer.Skip(2);                                    }                                }                                buffer.position = nextPos;                            }                            break;                        }                    case ObjectType.Label:                        {                            if (buffer.Seek(curPos, 6) && (ObjectType)buffer.ReadByte() == type)                            {                                if (strings.TryGetValue(elementId, out value))                                    buffer.WriteS(value);                                else                                    buffer.Skip(2);                                buffer.Skip(2);                                if (buffer.ReadBool())                                    buffer.Skip(4);                                buffer.Skip(4);                                if (buffer.ReadBool() && strings.TryGetValue(elementId + "-prompt", out value))                                    buffer.WriteS(value);                            }                            break;                        }                    case ObjectType.Button:                        {                            if (buffer.Seek(curPos, 6) && (ObjectType)buffer.ReadByte() == type)                            {                                if (strings.TryGetValue(elementId, out value))                                    buffer.WriteS(value);                                else                                    buffer.Skip(2);                                if (strings.TryGetValue(elementId + "-0", out value))                                    buffer.WriteS(value);                            }                            break;                        }                    case ObjectType.ComboBox:                        {                            if (buffer.Seek(curPos, 6) && (ObjectType)buffer.ReadByte() == type)                            {                                int itemCount = buffer.ReadShort();                                for (int j = 0; j < itemCount; j++)                                {                                    int nextPos = buffer.ReadShort();                                    nextPos += buffer.position;                                    if (strings.TryGetValue(elementId + "-" + j, out value))                                        buffer.WriteS(value);                                    buffer.position = nextPos;                                }                                if (strings.TryGetValue(elementId, out value))                                    buffer.WriteS(value);                            }                            break;                        }                }                buffer.position = curPos + dataLen;            }        }    }}
 |