You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			254 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			254 lines
		
	
	
		
			10 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.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;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |