254 lines
9.8 KiB
C#
254 lines
9.8 KiB
C#
|
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.ReadUshort();
|
|||
|
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.ReadUshort();
|
|||
|
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.ReadUshort();
|
|||
|
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;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|