254 lines
9.8 KiB
C#
Raw Normal View History

2025-06-07 17:43:34 +08:00
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;
}
}
}
}