using System; using System.Collections; using System.Collections.Generic; using Cute; using LitJson; using UnityEngine; namespace Wizard; public class LocalizeJson { private enum ParserState { ObjectAwait, ObjectStart, ObjectEnd, KeyAwait, KeyStart, KeyEnd, ValueAwait, ValueStart, ValueEnd } private static readonly string PC_SP_TEXT_PREFIX = "[pcsp]"; private static readonly char PC_SP_SPLIT = '|'; public static void Parse(IDictionary dic, string region, string text, bool isTrimKey = false) { int i; for (i = 0; i < text.Length && Convert.ToInt32(text[i]) == 65279; i++) { } int length = text.Length; int num = 0; int num2 = 0; string text2 = ""; bool flag = false; bool flag2 = false; bool flag3 = false; bool flag4 = false; ParserState parserState = ParserState.ObjectAwait; for (; i < text.Length; i++) { char c = text[i]; switch (c) { case '{': switch (parserState) { case ParserState.ObjectAwait: parserState = ParserState.ObjectStart; num2++; break; default: flag4 = true; break; case ParserState.KeyStart: case ParserState.ValueStart: break; } break; case '"': switch (parserState) { case ParserState.ObjectStart: case ParserState.KeyAwait: parserState = ParserState.KeyStart; num = i + 1; break; case ParserState.ValueAwait: parserState = ParserState.ValueStart; num = i + 1; break; case ParserState.KeyStart: if (flag3) { text2 = text.Substring(num, i - num); } else if (num2 == 2 && text.Substring(num, i - num) == region) { flag3 = true; } parserState = ParserState.KeyEnd; break; case ParserState.ValueStart: if (flag3) { string text3 = text.Substring(num, i - num); if (flag) { text3 = text3.Replace("\\n", "\n"); flag = false; } if (flag2) { text3 = text3.Replace("\\\"", "\""); flag2 = false; } if (text3.StartsWith(PC_SP_TEXT_PREFIX, StringComparison.Ordinal)) { text3 = text3.Remove(0, PC_SP_TEXT_PREFIX.Length); text3 = text3.Split(PC_SP_SPLIT)[0]; } dic.Add(isTrimKey ? text2.Trim() : text2, text3); } parserState = ParserState.ValueEnd; break; default: flag4 = true; break; } break; case ':': switch (parserState) { case ParserState.KeyEnd: parserState = ((num2 == 3) ? ParserState.ValueAwait : ParserState.ObjectAwait); break; default: flag4 = true; break; case ParserState.KeyStart: case ParserState.ValueStart: break; } break; case '}': switch (parserState) { case ParserState.ObjectStart: case ParserState.ObjectEnd: case ParserState.ValueEnd: if (flag3) { return; } parserState = ParserState.ObjectEnd; num2--; break; default: flag4 = true; break; case ParserState.KeyStart: case ParserState.ValueStart: break; } break; case ',': switch (parserState) { case ParserState.ObjectEnd: parserState = ParserState.KeyAwait; break; case ParserState.ValueEnd: parserState = ParserState.KeyAwait; break; default: flag4 = true; break; case ParserState.KeyStart: case ParserState.ValueStart: break; } break; case '\\': i++; if (flag3 && i < text.Length) { switch (text[i]) { case 'n': flag = true; break; case '"': flag2 = true; break; } } break; default: if (parserState != ParserState.KeyStart && parserState != ParserState.ValueStart) { switch (c) { default: flag4 = true; break; case '\t': case '\n': case '\r': case ' ': break; } } break; } if (flag4) { throw new ApplicationException($"Could not parse localize JSON: invalid '{c}' at position {i}, state {parserState.ToString()}, around '{text.Substring(Math.Max(i - 32, 0), Math.Min(64, length - i))}'"); } } } public static void LegacyParse(IDictionary dic, string region, string fileName, bool isTrimKey = false) { TextAsset textAsset = Toolbox.ResourcesManager.LoadObject(fileName) as TextAsset; IDictionary dictionary = JsonMapper.ToObject(textAsset.ToString())[textAsset.name]; foreach (string key in dictionary.Keys) { if (key != region) { continue; } IDictionary dictionary2 = (IDictionary)dictionary[region]; { foreach (string key2 in dictionary2.Keys) { dic.Add(isTrimKey ? key2.Trim() : key2, dictionary2[key2].ToString()); } break; } } } }