Decompiled source of TranslationsHelper v1.1.1

plugins\TranslationsHelper.dll

Decompiled 5 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text.RegularExpressions;
using BepInEx;
using JetBrains.Annotations;
using Jotunn;
using Jotunn.Entities;
using Jotunn.Managers;
using Jotunn.Utils;
using Microsoft.CodeAnalysis;
using TranslationsHelper.models;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("FixItFelix.TranslationsHelper")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("FixItFelix.TranslationsHelper")]
[assembly: AssemblyCopyright("Copyright ©  2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("e3243d22-4307-4008-ba36-9f326008cde5")]
[assembly: AssemblyFileVersion("1.1.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.1.0.0")]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
namespace TranslationsHelper
{
	public static class TranslationsPrinter
	{
		private static readonly string OutputPath = Path.Combine(Paths.BepInExRootPath, "TranslationsPrinterOutput");

		private const string FileSuffix = ".English.yml";

		public static void WriteData(string prefabNamePrefixFilter)
		{
			string prefabNamePrefixFilter2 = prefabNamePrefixFilter;
			IEnumerable<KeyValuePair<string, List<string>>> enumerable;
			if (!(prefabNamePrefixFilter2 == ""))
			{
				enumerable = TranslationsRegistry.ModPrefabTranslations.Where<KeyValuePair<string, List<string>>>((KeyValuePair<string, List<string>> pair) => pair.Key.StartsWith(prefabNamePrefixFilter2));
			}
			else
			{
				IEnumerable<KeyValuePair<string, List<string>>> modPrefabTranslations = TranslationsRegistry.ModPrefabTranslations;
				enumerable = modPrefabTranslations;
			}
			foreach (KeyValuePair<string, List<string>> item in enumerable)
			{
				if (item.Value.Count > 0)
				{
					string filPath = Path.Combine(OutputPath, item.Key + ".English.yml");
					WriteFile((from line in item.Value.Where((string line) => line != "").Distinct()
						orderby line
						select line).ToList(), filPath);
				}
				else
				{
					Logger.LogWarning((object)("mod '" + item.Key + "' does not contain any prefabs for translation"));
				}
			}
		}

		private static void WriteFile(List<string> translations, string filPath)
		{
			if (!Directory.Exists(OutputPath))
			{
				Directory.CreateDirectory(OutputPath);
			}
			File.WriteAllText(filPath, string.Join("\n", translations));
			Logger.LogInfo((object)$"wrote {translations.Count} translations to file '{filPath}'");
		}
	}
	[BepInPlugin("FixItFelix.TranslationsHelper", "TranslationsHelper", "1.1.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class TranslationsHelperPlugin : BaseUnityPlugin
	{
		private const string PluginAuthor = "FixItFelix";

		private const string PluginName = "TranslationsHelper";

		internal const string PluginVersion = "1.1.0";

		internal const string PluginGuid = "FixItFelix.TranslationsHelper";

		private void Awake()
		{
			ModQuery.Enable();
			PrefabManager.OnPrefabsRegistered += TranslationsRegistry.Initialize;
			CommandManager.Instance.AddConsoleCommand((ConsoleCommand)(object)new TranslationsPrinterController());
		}
	}
	public class TranslationsPrinterController : ConsoleCommand
	{
		public override string Name => "print_translations_to_file";

		public override string Help => "Write all prefabs loaded in-game into a YAML translations template file inside the BepInEx config folder 'TranslationsPrinterOutput'.";

		public override void Run(string[] args)
		{
			if (args.Length != 0)
			{
				Logger.LogInfo((object)("TranslationsPrinterController called with args '" + string.Join(" - ", args) + "'"));
				TranslationsPrinter.WriteData(args[0]);
			}
			else
			{
				TranslationsPrinter.WriteData("");
			}
		}
	}
	public static class TranslationsRegistry
	{
		public static readonly Dictionary<string, List<string>> ModPrefabTranslations = new Dictionary<string, List<string>>();

		public static void Initialize()
		{
			Logger.LogInfo((object)"scanning loaded prefabs for translations");
			foreach (KeyValuePair<string, List<string>> item in (from pair in ModQuery.GetPrefabs()
				group pair by pair.SourceMod.Name).ToDictionary((IGrouping<string, IModPrefab> group) => group.Key, (IGrouping<string, IModPrefab> group) => group.SelectMany(GetPrefabTranslations).ToList()))
			{
				Logger.LogInfo((object)$"adding {item.Value.Count} translation strings for mod {item.Key}");
				ModPrefabTranslations.Add(item.Key, item.Value);
			}
		}

		private static List<string> GetPrefabTranslations(IModPrefab prefab)
		{
			List<string> list = new List<string>();
			if ((Object)(object)prefab.Prefab == (Object)null)
			{
				return list;
			}
			Logger.LogInfo((object)("scanning prefab '" + ((Object)prefab.Prefab).name + "' for translation"));
			ItemDrop fromItemDrop = default(ItemDrop);
			if (prefab.Prefab.TryGetComponent<ItemDrop>(ref fromItemDrop))
			{
				list.AddRange(new CommonModel(fromItemDrop).Translate());
			}
			Piece fromPiece = default(Piece);
			if (prefab.Prefab.TryGetComponent<Piece>(ref fromPiece))
			{
				list.AddRange(new CommonModel(fromPiece).Translate());
			}
			Character fromCharacter = default(Character);
			if (prefab.Prefab.TryGetComponent<Character>(ref fromCharacter))
			{
				list.AddRange(new NameModel(fromCharacter).Translate());
			}
			Beehive original = default(Beehive);
			if (prefab.Prefab.TryGetComponent<Beehive>(ref original))
			{
				list.AddRange(new BeehiveModel(original).Translate());
			}
			CookingStation original2 = default(CookingStation);
			if (prefab.Prefab.TryGetComponent<CookingStation>(ref original2))
			{
				list.AddRange(new CookingStationModel(original2).Translate());
			}
			Fermenter original3 = default(Fermenter);
			if (prefab.Prefab.TryGetComponent<Fermenter>(ref original3))
			{
				list.AddRange(new FermenterModel(original3).Translate());
			}
			Smelter original4 = default(Smelter);
			if (prefab.Prefab.TryGetComponent<Smelter>(ref original4))
			{
				list.AddRange(new SmelterModel(original4).Translate());
			}
			Incinerator original5 = default(Incinerator);
			if (prefab.Prefab.TryGetComponent<Incinerator>(ref original5))
			{
				list.AddRange(new IncineratorModel(original5).Translate());
			}
			MapTable original6 = default(MapTable);
			if (prefab.Prefab.TryGetComponent<MapTable>(ref original6))
			{
				list.AddRange(new MapTableModel(original6).Translate());
			}
			OfferingBowl original7 = default(OfferingBowl);
			if (prefab.Prefab.TryGetComponent<OfferingBowl>(ref original7))
			{
				list.AddRange(new OfferingBowlModel(original7).Translate());
			}
			SapCollector original8 = default(SapCollector);
			if (prefab.Prefab.TryGetComponent<SapCollector>(ref original8))
			{
				list.AddRange(new SapCollectorModel(original8).Translate());
			}
			MineRock fromMineRock = default(MineRock);
			if (prefab.Prefab.TryGetComponent<MineRock>(ref fromMineRock))
			{
				list.AddRange(new NameModel(fromMineRock).Translate());
			}
			MineRock5 fromMineRock2 = default(MineRock5);
			if (prefab.Prefab.TryGetComponent<MineRock5>(ref fromMineRock2))
			{
				list.AddRange(new NameModel(fromMineRock2).Translate());
			}
			ItemStand fromItemStand = default(ItemStand);
			if (prefab.Prefab.TryGetComponent<ItemStand>(ref fromItemStand))
			{
				list.AddRange(new NameModel(fromItemStand).Translate());
			}
			Ladder fromLadder = default(Ladder);
			if (prefab.Prefab.TryGetComponent<Ladder>(ref fromLadder))
			{
				list.AddRange(new NameModel(fromLadder).Translate());
			}
			Plant fromPlant = default(Plant);
			if (prefab.Prefab.TryGetComponent<Plant>(ref fromPlant))
			{
				list.AddRange(new NameModel(fromPlant).Translate());
			}
			RuneStone original9 = default(RuneStone);
			if (prefab.Prefab.TryGetComponent<RuneStone>(ref original9))
			{
				list.AddRange(new RuneStoneModel(original9).Translate());
			}
			ShipControlls original10 = default(ShipControlls);
			if (prefab.Prefab.TryGetComponent<ShipControlls>(ref original10))
			{
				list.AddRange(new ShipControlModel(original10).Translate());
			}
			Teleport original11 = default(Teleport);
			if (prefab.Prefab.TryGetComponent<Teleport>(ref original11))
			{
				list.AddRange(new TeleportModel(original11).Translate());
			}
			Switch original12 = default(Switch);
			if (prefab.Prefab.TryGetComponent<Switch>(ref original12))
			{
				list.AddRange(new SwitchModel(original12).Translate());
			}
			ToggleSwitch original13 = default(ToggleSwitch);
			if (prefab.Prefab.TryGetComponent<ToggleSwitch>(ref original13))
			{
				list.AddRange(new SwitchModel(original13).Translate());
			}
			HoverText fromHoverText = default(HoverText);
			if (prefab.Prefab.TryGetComponent<HoverText>(ref fromHoverText))
			{
				list.AddRange(new NameModel(fromHoverText).Translate());
			}
			return list;
		}
	}
}
namespace TranslationsHelper.models
{
	public class BeehiveModel : NameModel
	{
		[UsedImplicitly]
		public readonly string AreaTextToken;

		[UsedImplicitly]
		public readonly string BlockedTextToken;

		[UsedImplicitly]
		public readonly string CheckTextToken;

		[UsedImplicitly]
		public readonly string ExtractTextToken;

		[UsedImplicitly]
		public readonly string FreeSpaceTextToken;

		[UsedImplicitly]
		public readonly string HappyTextToken;

		[UsedImplicitly]
		public readonly string NotConnectedTextToken;

		[UsedImplicitly]
		public readonly string SleepTextToken;

		public BeehiveModel(Beehive original)
			: base(((Object)original).name, original.m_name)
		{
			AreaTextToken = original.m_areaText;
			BlockedTextToken = original.m_blockedText;
			CheckTextToken = original.m_checkText;
			ExtractTextToken = original.m_extractText;
			FreeSpaceTextToken = original.m_freespaceText;
			HappyTextToken = original.m_happyText;
			NotConnectedTextToken = original.m_notConnectedText;
			SleepTextToken = original.m_sleepText;
		}

		public override List<string> Translate()
		{
			List<string> list = base.Translate();
			list.AddRange(new List<string>
			{
				TranslateTokenToPair(TranslationNameToken),
				TranslateTokenToPair(AreaTextToken),
				TranslateTokenToPair(BlockedTextToken),
				TranslateTokenToPair(CheckTextToken),
				TranslateTokenToPair(ExtractTextToken),
				TranslateTokenToPair(FreeSpaceTextToken),
				TranslateTokenToPair(HappyTextToken),
				TranslateTokenToPair(NotConnectedTextToken),
				TranslateTokenToPair(SleepTextToken)
			});
			return list;
		}
	}
	public class CommonModel : NameModel
	{
		[UsedImplicitly]
		public readonly string TranslationDescriptionToken;

		public CommonModel(ItemDrop fromItemDrop)
			: base(((Object)fromItemDrop).name, fromItemDrop.m_itemData.m_shared.m_name)
		{
			TranslationDescriptionToken = fromItemDrop.m_itemData.m_shared.m_description;
		}

		public CommonModel(Piece fromPiece)
			: base(((Object)fromPiece).name, fromPiece.m_name)
		{
			TranslationDescriptionToken = fromPiece.m_description;
		}

		public override List<string> Translate()
		{
			return new List<string>
			{
				TranslateTokenToPair(TranslationNameToken),
				TranslateTokenToPair(TranslationDescriptionToken)
			};
		}
	}
	public class CookingStationModel : NameModel
	{
		[UsedImplicitly]
		public readonly SwitchModel AddFoodSwitch;

		[UsedImplicitly]
		public readonly SwitchModel AddFuelSwitch;

		[UsedImplicitly]
		public readonly string AddItemTooltipToken;

		public CookingStationModel(CookingStation original)
			: base(((Object)original).name, original.m_name)
		{
			AddFoodSwitch = new SwitchModel(original.m_addFoodSwitch);
			AddFuelSwitch = new SwitchModel(original.m_addFuelSwitch);
			AddItemTooltipToken = original.m_addItemTooltip;
		}

		public override List<string> Translate()
		{
			List<string> list = new List<string>();
			list.Add(TranslateTokenToPair(TranslationNameToken));
			list.Add(TranslateTokenToPair(AddItemTooltipToken));
			list.AddRange(AddFoodSwitch.Translate());
			list.AddRange(AddFuelSwitch.Translate());
			return list;
		}
	}
	public class FermenterModel : NameModel
	{
		[UsedImplicitly]
		public readonly SwitchModel AddSwitch;

		[UsedImplicitly]
		public readonly SwitchModel TapSwitch;

		public FermenterModel(Fermenter original)
			: base(((Object)original).name, original.m_name)
		{
			AddSwitch = new SwitchModel(original.m_addSwitch);
			TapSwitch = new SwitchModel(original.m_tapSwitch);
		}

		public override List<string> Translate()
		{
			List<string> list = base.Translate();
			list.AddRange(AddSwitch.Translate());
			list.AddRange(TapSwitch.Translate());
			return list;
		}
	}
	public class IncineratorModel : Translatable
	{
		[UsedImplicitly]
		public readonly string Name;

		[UsedImplicitly]
		public readonly SwitchModel IncinerateSwitch;

		public IncineratorModel(Incinerator original)
		{
			Name = ((Object)original).name;
			IncinerateSwitch = new SwitchModel(original.m_incinerateSwitch);
		}

		public override List<string> Translate()
		{
			return IncinerateSwitch.Translate();
		}
	}
	public class MapTableModel : NameModel
	{
		[UsedImplicitly]
		public readonly SwitchModel ReadSwitch;

		[UsedImplicitly]
		public readonly SwitchModel WriteSwitch;

		public MapTableModel(MapTable original)
			: base(((Object)original).name, original.m_name)
		{
			ReadSwitch = new SwitchModel(original.m_readSwitch);
			WriteSwitch = new SwitchModel(original.m_writeSwitch);
		}

		public override List<string> Translate()
		{
			return base.Translate();
		}
	}
	public class NameModel : Translatable
	{
		[UsedImplicitly]
		public readonly string Name;

		[UsedImplicitly]
		public readonly string TranslationNameToken;

		public NameModel(string internalName, string nameToken)
		{
			Name = internalName;
			TranslationNameToken = nameToken;
		}

		public NameModel(Character fromCharacter)
			: this(((Object)fromCharacter).name, fromCharacter.m_name)
		{
		}

		public NameModel(HoverText fromHoverText)
			: this(((Object)fromHoverText).name, fromHoverText.m_text)
		{
		}

		public NameModel(MineRock fromMineRock)
			: this(((Object)fromMineRock).name, fromMineRock.m_name)
		{
		}

		public NameModel(MineRock5 fromMineRock5)
			: this(((Object)fromMineRock5).name, fromMineRock5.m_name)
		{
		}

		public NameModel(ItemStand fromItemStand)
			: this(((Object)fromItemStand).name, fromItemStand.m_name)
		{
		}

		public NameModel(Ladder fromLadder)
			: this(((Object)fromLadder).name, fromLadder.m_name)
		{
		}

		public NameModel(Plant fromPlant)
			: this(((Object)fromPlant).name, fromPlant.m_name)
		{
		}

		public NameModel(Chair fromChair)
			: this(((Object)fromChair).name, fromChair.m_name)
		{
		}

		public override List<string> Translate()
		{
			return new List<string> { TranslateTokenToPair(TranslationNameToken) };
		}
	}
	public class OfferingBowlModel : NameModel
	{
		[UsedImplicitly]
		public readonly string UseItemTextToken;

		public OfferingBowlModel(OfferingBowl original)
			: base(((Object)original).name, original.m_name)
		{
			UseItemTextToken = original.m_useItemText;
		}

		public override List<string> Translate()
		{
			List<string> list = base.Translate();
			list.Add(TranslateTokenToPair(UseItemTextToken));
			return list;
		}
	}
	public class RuneStoneModel : NameModel
	{
		[UsedImplicitly]
		public readonly string TextToken;

		[UsedImplicitly]
		public readonly string TopicToken;

		[UsedImplicitly]
		public readonly string LabelToken;

		public RuneStoneModel(RuneStone original)
			: base(((Object)original).name, original.m_name)
		{
			TextToken = original.m_text;
			TopicToken = original.m_topic;
			LabelToken = original.m_label;
		}

		public override List<string> Translate()
		{
			List<string> list = base.Translate();
			list.AddRange(new List<string>
			{
				TranslateTokenToPair(TextToken),
				TranslateTokenToPair(TopicToken),
				TranslateTokenToPair(LabelToken)
			});
			return list;
		}
	}
	public class SapCollectorModel : NameModel
	{
		[UsedImplicitly]
		public readonly string DrainingSlowTextToken;

		[UsedImplicitly]
		public readonly string DrainingTextToken;

		[UsedImplicitly]
		public readonly string ExtractTextToken;

		[UsedImplicitly]
		public readonly string FullTextToken;

		[UsedImplicitly]
		public readonly string NotConnectedTextToken;

		public SapCollectorModel(SapCollector original)
			: base(((Object)original).name, original.m_name)
		{
			DrainingSlowTextToken = original.m_drainingSlowText;
			DrainingTextToken = original.m_drainingText;
			ExtractTextToken = original.m_extractText;
			FullTextToken = original.m_fullText;
			NotConnectedTextToken = original.m_notConnectedText;
		}

		public override List<string> Translate()
		{
			List<string> list = base.Translate();
			list.AddRange(new List<string>
			{
				TranslateTokenToPair(DrainingTextToken),
				TranslateTokenToPair(DrainingSlowTextToken),
				TranslateTokenToPair(ExtractTextToken),
				TranslateTokenToPair(FullTextToken),
				TranslateTokenToPair(NotConnectedTextToken)
			});
			return list;
		}
	}
	public class ShipControlModel : Translatable
	{
		[UsedImplicitly]
		public readonly string Name;

		[UsedImplicitly]
		public readonly string HoverText;

		public ShipControlModel(ShipControlls original)
		{
			Name = ((Object)original).name;
			HoverText = original.m_hoverText;
		}

		public override List<string> Translate()
		{
			return new List<string> { TranslateTokenToPair(HoverText) };
		}
	}
	public class SmelterModel : NameModel
	{
		[UsedImplicitly]
		public readonly SwitchModel AddOreSwitch;

		[UsedImplicitly]
		public readonly string AddOreTooltipToken;

		[UsedImplicitly]
		public readonly SwitchModel AddWoodSwitch;

		[UsedImplicitly]
		public readonly SwitchModel EmptyOreSwitch;

		[UsedImplicitly]
		public readonly string EmptyOreTooltipToken;

		public SmelterModel(Smelter original)
			: base(((Object)original).name, original.m_name)
		{
			AddOreSwitch = new SwitchModel(original.m_addOreSwitch);
			AddOreTooltipToken = original.m_addOreTooltip;
			AddWoodSwitch = new SwitchModel(original.m_addWoodSwitch);
			EmptyOreSwitch = new SwitchModel(original.m_emptyOreSwitch);
			EmptyOreTooltipToken = original.m_emptyOreTooltip;
		}

		public override List<string> Translate()
		{
			List<string> list = base.Translate();
			list.AddRange(new List<string>
			{
				TranslateTokenToPair(AddOreTooltipToken),
				TranslateTokenToPair(EmptyOreTooltipToken)
			});
			list.AddRange(AddWoodSwitch.Translate());
			list.AddRange(EmptyOreSwitch.Translate());
			return list;
		}
	}
	public class SwitchModel : NameModel
	{
		[UsedImplicitly]
		public readonly string HoverTextToken;

		public SwitchModel(Switch? original)
			: base(((original != null) ? ((Object)original).name : null) ?? string.Empty, original?.m_name ?? string.Empty)
		{
			HoverTextToken = original?.m_hoverText ?? string.Empty;
		}

		public SwitchModel(ToggleSwitch original)
			: base(((Object)original).name, original.m_name)
		{
			HoverTextToken = original.m_hoverText;
		}

		public override List<string> Translate()
		{
			return new List<string>
			{
				TranslateTokenToPair(TranslationNameToken),
				TranslateTokenToPair(HoverTextToken)
			};
		}
	}
	public class TeleportModel : Translatable
	{
		[UsedImplicitly]
		public readonly string Name;

		[UsedImplicitly]
		public readonly string HoverText;

		[UsedImplicitly]
		public readonly string EnterText;

		public TeleportModel(Teleport original)
		{
			Name = ((Object)original).name;
			HoverText = original.m_hoverText;
			EnterText = original.m_enterText;
		}

		public override List<string> Translate()
		{
			return new List<string>
			{
				TranslateTokenToPair(HoverText),
				TranslateTokenToPair(EnterText)
			};
		}
	}
	public abstract class Translatable
	{
		public abstract List<string> Translate();

		protected string TranslateTokenToPair(string token)
		{
			Regex regex = new Regex("[^a-zA-Z0-9_$]");
			Regex regex2 = new Regex("[^a-zA-Z0-9_]");
			string text = regex.Replace(token, "");
			string text2 = regex2.Replace(text, "");
			if (text == "")
			{
				return "";
			}
			return text2 + ": \"" + Localization.instance.Localize(text) + "\"";
		}
	}
	public class VegvisirModel : NameModel
	{
		[UsedImplicitly]
		public readonly string HoverName;

		[UsedImplicitly]
		public readonly string UseText;

		public VegvisirModel(Vegvisir original)
			: base(((Object)original).name, original.m_name)
		{
			HoverName = original.m_hoverName;
			UseText = original.m_useText;
		}

		public override List<string> Translate()
		{
			List<string> list = base.Translate();
			list.AddRange(new List<string>
			{
				TranslateTokenToPair(HoverName),
				TranslateTokenToPair(UseText)
			});
			return list;
		}
	}
}