summaryrefslogtreecommitdiff
path: root/Thronefall_v1.57/Thronefall/I2.Loc/LocalizationReader.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Thronefall_v1.57/Thronefall/I2.Loc/LocalizationReader.cs')
-rw-r--r--Thronefall_v1.57/Thronefall/I2.Loc/LocalizationReader.cs195
1 files changed, 195 insertions, 0 deletions
diff --git a/Thronefall_v1.57/Thronefall/I2.Loc/LocalizationReader.cs b/Thronefall_v1.57/Thronefall/I2.Loc/LocalizationReader.cs
new file mode 100644
index 0000000..a940e76
--- /dev/null
+++ b/Thronefall_v1.57/Thronefall/I2.Loc/LocalizationReader.cs
@@ -0,0 +1,195 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using UnityEngine;
+
+namespace I2.Loc;
+
+public class LocalizationReader
+{
+ public static Dictionary<string, string> ReadTextAsset(TextAsset asset)
+ {
+ StringReader stringReader = new StringReader(Encoding.UTF8.GetString(asset.bytes, 0, asset.bytes.Length).Replace("\r\n", "\n").Replace("\r", "\n"));
+ Dictionary<string, string> dictionary = new Dictionary<string, string>(StringComparer.Ordinal);
+ string line;
+ while ((line = stringReader.ReadLine()) != null)
+ {
+ if (TextAsset_ReadLine(line, out var key, out var value, out var _, out var _, out var _) && !string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(value))
+ {
+ dictionary[key] = value;
+ }
+ }
+ return dictionary;
+ }
+
+ public static bool TextAsset_ReadLine(string line, out string key, out string value, out string category, out string comment, out string termType)
+ {
+ key = string.Empty;
+ category = string.Empty;
+ comment = string.Empty;
+ termType = string.Empty;
+ value = string.Empty;
+ int num = line.LastIndexOf("//", StringComparison.Ordinal);
+ if (num >= 0)
+ {
+ comment = line.Substring(num + 2).Trim();
+ comment = DecodeString(comment);
+ line = line.Substring(0, num);
+ }
+ int num2 = line.IndexOf("=", StringComparison.Ordinal);
+ if (num2 < 0)
+ {
+ return false;
+ }
+ key = line.Substring(0, num2).Trim();
+ value = line.Substring(num2 + 1).Trim();
+ value = value.Replace("\r\n", "\n").Replace("\n", "\\n");
+ value = DecodeString(value);
+ if (key.Length > 2 && key[0] == '[')
+ {
+ int num3 = key.IndexOf(']');
+ if (num3 >= 0)
+ {
+ termType = key.Substring(1, num3 - 1);
+ key = key.Substring(num3 + 1);
+ }
+ }
+ ValidateFullTerm(ref key);
+ return true;
+ }
+
+ public static string ReadCSVfile(string Path, Encoding encoding)
+ {
+ string text = string.Empty;
+ using (StreamReader streamReader = new StreamReader(Path, encoding))
+ {
+ text = streamReader.ReadToEnd();
+ }
+ text = text.Replace("\r\n", "\n");
+ return text.Replace("\r", "\n");
+ }
+
+ public static List<string[]> ReadCSV(string Text, char Separator = ',')
+ {
+ int iStart = 0;
+ List<string[]> list = new List<string[]>();
+ while (iStart < Text.Length)
+ {
+ string[] array = ParseCSVline(Text, ref iStart, Separator);
+ if (array == null)
+ {
+ break;
+ }
+ list.Add(array);
+ }
+ return list;
+ }
+
+ private static string[] ParseCSVline(string Line, ref int iStart, char Separator)
+ {
+ List<string> list = new List<string>();
+ int length = Line.Length;
+ int iWordStart = iStart;
+ bool flag = false;
+ while (iStart < length)
+ {
+ char c = Line[iStart];
+ if (flag)
+ {
+ if (c == '"')
+ {
+ if (iStart + 1 >= length || Line[iStart + 1] != '"')
+ {
+ flag = false;
+ }
+ else if (iStart + 2 < length && Line[iStart + 2] == '"')
+ {
+ flag = false;
+ iStart += 2;
+ }
+ else
+ {
+ iStart++;
+ }
+ }
+ }
+ else if (c == '\n' || c == Separator)
+ {
+ AddCSVtoken(ref list, ref Line, iStart, ref iWordStart);
+ if (c == '\n')
+ {
+ iStart++;
+ break;
+ }
+ }
+ else if (c == '"')
+ {
+ flag = true;
+ }
+ iStart++;
+ }
+ if (iStart > iWordStart)
+ {
+ AddCSVtoken(ref list, ref Line, iStart, ref iWordStart);
+ }
+ return list.ToArray();
+ }
+
+ private static void AddCSVtoken(ref List<string> list, ref string Line, int iEnd, ref int iWordStart)
+ {
+ string text = Line.Substring(iWordStart, iEnd - iWordStart);
+ iWordStart = iEnd + 1;
+ text = text.Replace("\"\"", "\"");
+ if (text.Length > 1 && text[0] == '"' && text[text.Length - 1] == '"')
+ {
+ text = text.Substring(1, text.Length - 2);
+ }
+ list.Add(text);
+ }
+
+ public static List<string[]> ReadI2CSV(string Text)
+ {
+ string[] separator = new string[1] { "[*]" };
+ string[] separator2 = new string[1] { "[ln]" };
+ List<string[]> list = new List<string[]>();
+ string[] array = Text.Split(separator2, StringSplitOptions.None);
+ foreach (string text in array)
+ {
+ list.Add(text.Split(separator, StringSplitOptions.None));
+ }
+ return list;
+ }
+
+ public static void ValidateFullTerm(ref string Term)
+ {
+ Term = Term.Replace('\\', '/');
+ int num = Term.IndexOf('/');
+ if (num >= 0)
+ {
+ int startIndex;
+ while ((startIndex = Term.LastIndexOf('/')) != num)
+ {
+ Term = Term.Remove(startIndex, 1);
+ }
+ }
+ }
+
+ public static string EncodeString(string str)
+ {
+ if (string.IsNullOrEmpty(str))
+ {
+ return string.Empty;
+ }
+ return str.Replace("\r\n", "<\\n>").Replace("\r", "<\\n>").Replace("\n", "<\\n>");
+ }
+
+ public static string DecodeString(string str)
+ {
+ if (string.IsNullOrEmpty(str))
+ {
+ return string.Empty;
+ }
+ return str.Replace("<\\n>", "\r\n");
+ }
+}