Decompiled source of RU MichikoTranslateMod v0.2.10

TranslateRU.dll

Decompiled 2 weeks ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text.RegularExpressions;
using AerosSkills;
using ArsonistMod.Modules;
using ArtificerExtended;
using ArtificerExtended.Modules;
using ArtificerExtended.Passive;
using ArtificerExtended.Skills;
using ArtificerExtended.States;
using ArtificerExtended.Unlocks;
using BansheeMod.BansheeCharacter.Content;
using BansheeMod.Modules;
using Bastian;
using Bastian.Modules;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using CadetMod.Cadet.Content;
using CadetMod.Modules;
using DarthVaderMod.Modules;
using Deputy.Components;
using EntityStates.GaleShockTrooperDroneStates;
using EntityStates.GaleShockTrooperStates.Dash;
using EntityStates.GaleShockTrooperStates.Weapon;
using EntityStates.GaleShockTrooperStates.Weapon.MissilePainter;
using FeedbackSunnyDifficulty;
using GaleShockTrooper.Characters.Survivors.GaleShockTrooper.Achievements;
using GaleShockTrooper.Characters.Survivors.GaleShockTrooper.Components;
using GaleShockTrooper.Modules;
using GaleShockTrooper.Survivors.GaleShockTrooperSurvivor;
using HouseMod.SkillStates.House;
using HouseMod.SkillStates.House.Cards;
using HouseMod.SkillStates.House.Shots;
using HouseMod.SkillStates.House.TheGame;
using HunkMod.Modules;
using InterrogatorMod.Interrogator.Content;
using InterrogatorMod.Modules;
using JhinMod.Modules;
using JinxMod.Controllers;
using JinxMod.SkillStates;
using KatarinaMod.Modules;
using LeeHyperrealMod.Modules;
using LinkMod.Modules;
using M4A1Mod.Modules;
using M4A1Mod.Survivors.M4A1.Constants;
using M4A1Mod.Survivors.M4A1.Constants.DummyLink;
using M4A1Mod.Survivors.M4A1.Constants.Grenades;
using MMZZeroMod.Modules;
using Microsoft.CodeAnalysis;
using MonoMod.RuntimeDetour;
using Morris.Components;
using Morris.Modules;
using OfficialScoutMod.Modules;
using OfficialScoutMod.Scout.Content;
using On.RoR2;
using On.RoR2.Skills;
using On.RoR2.UI;
using PassiveAgression.Engineer;
using PassiveAgression.ModCompat;
using Pathfinder.Modules;
using R2API;
using RimuruMod.Modules;
using RiskOfOptions;
using RiskOfOptions.OptionConfigs;
using RiskOfOptions.Options;
using RoR2;
using RoR2.Skills;
using RoR2.UI;
using RobDriver.Modules;
using RobDriver.SkillStates.Driver;
using RobDriver.SkillStates.Driver.ArmBFG;
using RobDriver.SkillStates.Driver.ArmCannon;
using RobDriver.SkillStates.Driver.ArtiGauntlet;
using RobDriver.SkillStates.Driver.BadassShotgun;
using RobDriver.SkillStates.Driver.Bazooka;
using RobDriver.SkillStates.Driver.BeetleShield;
using RobDriver.SkillStates.Driver.CaptainGun;
using RobDriver.SkillStates.Driver.FalsePistol;
using RobDriver.SkillStates.Driver.GoldenGun;
using RobDriver.SkillStates.Driver.GrenadeLauncher;
using RobDriver.SkillStates.Driver.HeavyMachineGun;
using RobDriver.SkillStates.Driver.LunarGrenade;
using RobDriver.SkillStates.Driver.LunarHammer;
using RobDriver.SkillStates.Driver.LunarPistol;
using RobDriver.SkillStates.Driver.LunarRifle;
using RobDriver.SkillStates.Driver.MachineGun;
using RobDriver.SkillStates.Driver.NemmandoGun;
using RobDriver.SkillStates.Driver.NemmandoSword;
using RobDriver.SkillStates.Driver.NemmercGun;
using RobDriver.SkillStates.Driver.PlasmaCannon;
using RobDriver.SkillStates.Driver.PyriteGun;
using RobDriver.SkillStates.Driver.RavSword;
using RobDriver.SkillStates.Driver.Revolver;
using RobDriver.SkillStates.Driver.RiotShotgun;
using RobDriver.SkillStates.Driver.RocketLauncher;
using RobDriver.SkillStates.Driver.SMG;
using RobDriver.SkillStates.Driver.Shotgun;
using RobDriver.SkillStates.Driver.SlugShotgun;
using RobDriver.SkillStates.Driver.SniperRifle;
using RobDriver.SkillStates.Driver.VoidPistol;
using RobDriver.SkillStates.Driver.VoidRifle;
using RobomandoMod.Modules;
using RobomandoMod.Survivors.Robomando;
using RobomandoMod.Survivors.Robomando.SkillStates;
using Sandswept;
using Sandswept.Survivors.Ranger;
using SeamstressMod.Modules;
using SeamstressMod.Seamstress.Content;
using ShiggyMod.Modules;
using SkillStates.Ghoul;
using SkillStates.Morris;
using SkillStates.SharedStates;
using Skillstates.Deputy;
using SpyMod.Modules;
using SpyMod.Spy.Content;
using SubmarinerMod.Modules;
using SubmarinerMod.SubmarinerCharacter.Content;
using TPDespair.ZetArtifacts;
using TanksMod.Modules;
using TanksMod.Modules.Components;
using TanksMod.Modules.Components.User;
using TanksMod.Modules.Components.User.CustomPerks;
using TranslateRU.Config;
using TranslateRU.KeywordTranslations;
using TranslateRU.ModTranslations;
using UnforgivenMod.Modules;
using UnforgivenMod.Unforgiven.Content;
using UnityEngine;
using Voidcrid;
using ZeroMod.Modules;
using vanillaVoid.Items;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyCompany("TranslateRU")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+ec1920df8a9e74157b0461b5a91493b1eee85917")]
[assembly: AssemblyProduct("TranslateRU")]
[assembly: AssemblyTitle("TranslateRU")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
public static class KeywordTranslationsBanshee
{
	public static Dictionary<string, (string token, Func<string> translationGetter)> KeywordReplacements;

	public static void Init()
	{
		KeywordReplacements = new Dictionary<string, (string, Func<string>)>
		{
			["<style=cKeywordName>Aerodynamic</style>" + "<style=cSub>The skill deals more damage the longer the distance traveled before impact.</style>"] = ("KENKO_AERODYNAMIC_SKILLDEF", () => "<style=cKeywordName>Аэродинамика</style><style=cSub>Наносит увеличенный урон в зависимости от расстояния, пройденного до столкновения.</style>"),
			["<style=cKeywordName>Omen</style>" + $"<style=cSub>This skill fires an <color=#ba8fff>Ethereal Wisp</color> when completed which deals <style=cIsDamage>{BansheeConfig.wispDamageCoefficient.Value * 100f}% damage</style> on hit and restores <style=cIsUtility>1</style> stock to your secondary skill.</style>"] = ("KENKO_OMEN_SKILLDEF", delegate
			{
				float num = BansheeConfig.wispDamageCoefficient.Value * 100f;
				return $"<style=cKeywordName>Знамение</style><style=cSub>По завершении навык выпускает <color=#ba8fff>эфирную душу</color>, которая наносит <style=cIsDamage>{num:0.#}% урона</style> при попадании и восстанавливает <style=cIsUtility>1</style> заряд вторичного навыка.</style>";
			})
		};
	}
}
namespace TranslateRU
{
	[BepInPlugin("MichikoTeam.TranslateRU", "TranslateRU", "0.2.1")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Main : BaseUnityPlugin
	{
		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static hook_SetSurvivorDefs <>9__5_1;

			internal void <Awake>b__5_1(orig_SetSurvivorDefs orig, SurvivorDef[] defs)
			{
				orig.Invoke(defs);
				foreach (SurvivorDef val in defs)
				{
					if (!((Object)(object)val == (Object)null))
					{
						if (val.cachedName == "Electrician")
						{
							val.descriptionToken = "SANDSWEPT_ELECTRICIAN_DESC_RU";
							val.outroFlavorToken = "SANDSWEPT_ELECTRICIAN_OUTRO_RU";
							val.mainEndingEscapeFailureFlavorToken = "SANDSWEPT_ELECTRICIAN_FAIL_RU";
						}
						else if (val.cachedName == "Ranger")
						{
							Ranger.mileZeroDef.nameToken = "SANDSWEPT_RANGER_SKIN_MILEZERO";
							Ranger.majorDef.nameToken = "SANDSWEPT_RANGER_SKIN_MAJOR";
							Ranger.renegadeDef.nameToken = "SANDSWEPT_RANGER_SKIN_RENEGADE";
						}
					}
				}
				if ((Object)(object)Main.SandsweptExpansionDef != (Object)null)
				{
					Main.SandsweptExpansionDef.descriptionToken = "SANDSWEPT_EXPANSION_DESC";
				}
			}
		}

		public const string PluginGUID = "MichikoTeam.TranslateRU";

		public const string PluginAuthor = "MichikoTeam";

		public const string PluginName = "TranslateRU";

		public const string PluginVersion = "0.2.1";

		public static ManualLogSource ModLogger;

		public void Awake()
		{
			//IL_046a: Unknown result type (might be due to invalid IL or missing references)
			//IL_046f: Unknown result type (might be due to invalid IL or missing references)
			//IL_047b: Expected O, but got Unknown
			//IL_04b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_04c1: Expected O, but got Unknown
			//IL_04a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_04a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_04ab: Expected O, but got Unknown
			ModLogger = ((BaseUnityPlugin)this).Logger;
			TranslationConfig.Initialize(((BaseUnityPlugin)this).Config);
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Мод перевода запущен");
			LanguageAPI.Add("OVERVIEW", "Обзор", "RU");
			LanguageAPI.Add("OVERVIEW", "Обзор");
			LanguageAPI.Add("Overview", "Обзор", "RU");
			LanguageAPI.Add("Overview", "Обзор");
			LanguageAPI.Add("TAB_OVERVIEW", "Обзор", "RU");
			LanguageAPI.Add("TAB_OVERVIEW", "Обзор");
			LanguageAPI.Add("LOADOUT_TAB_OVERVIEW", "Обзор", "RU");
			LanguageAPI.Add("LOADOUT_TAB_OVERVIEW", "Обзор");
			LanguageAPI.Add("SURVIVOR_OVERVIEW", "Обзор", "RU");
			LanguageAPI.Add("SURVIVOR_OVERVIEW", "Обзор");
			LanguageAPI.Add("SURVIVOR_TAB_OVERVIEW", "Обзор", "RU");
			LanguageAPI.Add("SURVIVOR_TAB_OVERVIEW", "Обзор");
			LanguageAPI.Add("LOADOUT_OVERVIEW", "Обзор", "RU");
			LanguageAPI.Add("LOADOUT_OVERVIEW", "Обзор");
			LanguageAPI.Add("TITLE_OVERVIEW", "Обзор", "RU");
			LanguageAPI.Add("TITLE_OVERVIEW", "Обзор");
			LanguageAPI.Add("SURVIVOR_OVERVIEW_HEADER", "Обзор", "RU");
			LanguageAPI.Add("SURVIVOR_OVERVIEW_HEADER", "Обзор");
			LanguageAPI.Add("OVERVIEW_TAB", "Обзор", "RU");
			LanguageAPI.Add("OVERVIEW_TAB", "Обзор");
			LanguageAPI.Add("POPCORN_OVERVIEW", "Обзор", "RU");
			LanguageAPI.Add("POPCORN_OVERVIEW", "Обзор");
			LanguageAPI.Add("POPCORN_TAB_OVERVIEW", "Обзор", "RU");
			LanguageAPI.Add("POPCORN_TAB_OVERVIEW", "Обзор");
			LanguageAPI.Add("POPCORN_LOADOUT_TAB_OVERVIEW", "Обзор", "RU");
			LanguageAPI.Add("POPCORN_LOADOUT_TAB_OVERVIEW", "Обзор");
			LanguageAPI.Add("Engine", "Двигатель", "RU");
			LanguageAPI.Add("ENGINE", "Двигатель", "RU");
			LanguageAPI.Add("BodyEnginePassiveFamily", "Двигатель", "RU");
			LanguageAPI.Add("BODYENGINEPASSIVEFAMILY", "Двигатель", "RU");
			LanguageAPI.Add("BodyEnginePassive", "Двигатель", "RU");
			LanguageAPI.Add("BODYENGINEPASSIVE", "Двигатель", "RU");
			LanguageAPI.Add("Engine", "Двигатель");
			LanguageAPI.Add("ENGINE", "Двигатель");
			LanguageAPI.Add("BodyEnginePassiveFamily", "Двигатель");
			LanguageAPI.Add("BODYENGINEPASSIVEFAMILY", "Двигатель");
			LanguageAPI.Add("Hull", "Корпус", "RU");
			LanguageAPI.Add("HULL", "Корпус", "RU");
			LanguageAPI.Add("Hull", "Корпус");
			LanguageAPI.Add("HULL", "Корпус");
			LanguageAPI.Add("Turret", "Башня", "RU");
			LanguageAPI.Add("TURRET", "Башня", "RU");
			LanguageAPI.Add("Turret", "Башня");
			LanguageAPI.Add("TURRET", "Башня");
			LanguageAPI.Add("Glow", "Свечение", "RU");
			LanguageAPI.Add("GLOW", "Свечение", "RU");
			LanguageAPI.Add("Glow", "Свечение");
			LanguageAPI.Add("GLOW", "Свечение");
			LanguageAPI.Add("Paint", "Окраска", "RU");
			LanguageAPI.Add("PAINT", "Окраска", "RU");
			LanguageAPI.Add("Paint", "Окраска");
			LanguageAPI.Add("PAINT", "Окраска");
			LanguageAPI.Add("Color", "Цвет", "RU");
			LanguageAPI.Add("COLOR", "Цвет", "RU");
			LanguageAPI.Add("Color", "Цвет");
			LanguageAPI.Add("COLOR", "Цвет");
			LanguageAPI.Add("Cards", "Карты", "RU");
			LanguageAPI.Add("Cards", "Карты");
			LanguageAPI.Add("CARDS", "Карты", "RU");
			LanguageAPI.Add("CARDS", "Карты");
			RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, (Action)delegate
			{
				foreach (var (text, text2, action, _) in TranslationRegistry.Registered)
				{
					if (Chainloader.PluginInfos.ContainsKey(text))
					{
						if (!TranslationConfig.IsTranslationEnabled(text))
						{
							((BaseUnityPlugin)this).Logger.LogInfo((object)("Перевод отключён в настройках: " + text2));
						}
						else
						{
							((BaseUnityPlugin)this).Logger.LogInfo((object)("Загрузка перевода: " + text2));
							try
							{
								action();
								((BaseUnityPlugin)this).Logger.LogInfo((object)("Перевод загружен: " + text2));
							}
							catch (Exception arg)
							{
								((BaseUnityPlugin)this).Logger.LogError((object)$"Ошибка при загрузке перевода {text2}: {arg}");
							}
						}
					}
				}
			});
			GameObject val = new GameObject("TranslationAwakeRunner");
			val.AddComponent<TranslationAwakeRunner>();
			Object.DontDestroyOnLoad((Object)val);
			if (Chainloader.PluginInfos.ContainsKey("com.TeamSandswept.Sandswept"))
			{
				object obj = <>c.<>9__5_1;
				if (obj == null)
				{
					hook_SetSurvivorDefs val2 = delegate(orig_SetSurvivorDefs orig, SurvivorDef[] defs)
					{
						orig.Invoke(defs);
						foreach (SurvivorDef val3 in defs)
						{
							if (!((Object)(object)val3 == (Object)null))
							{
								if (val3.cachedName == "Electrician")
								{
									val3.descriptionToken = "SANDSWEPT_ELECTRICIAN_DESC_RU";
									val3.outroFlavorToken = "SANDSWEPT_ELECTRICIAN_OUTRO_RU";
									val3.mainEndingEscapeFailureFlavorToken = "SANDSWEPT_ELECTRICIAN_FAIL_RU";
								}
								else if (val3.cachedName == "Ranger")
								{
									Ranger.mileZeroDef.nameToken = "SANDSWEPT_RANGER_SKIN_MILEZERO";
									Ranger.majorDef.nameToken = "SANDSWEPT_RANGER_SKIN_MAJOR";
									Ranger.renegadeDef.nameToken = "SANDSWEPT_RANGER_SKIN_RENEGADE";
								}
							}
						}
						if ((Object)(object)Main.SandsweptExpansionDef != (Object)null)
						{
							Main.SandsweptExpansionDef.descriptionToken = "SANDSWEPT_EXPANSION_DESC";
						}
					};
					<>c.<>9__5_1 = val2;
					obj = (object)val2;
				}
				SurvivorCatalog.SetSurvivorDefs += (hook_SetSurvivorDefs)obj;
			}
			SkillCatalog.Init += new hook_Init(ChangeSkillDef);
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Перехват SkillCatalog.Init зарегистрирован");
		}

		private void ChangeSkillDef(orig_Init orig)
		{
			orig.Invoke();
			bool flag = Chainloader.PluginInfos.ContainsKey("com.kenko.Seamstress");
			bool flag2 = Chainloader.PluginInfos.ContainsKey("com.kenko.Banshee");
			bool flag3 = Chainloader.PluginInfos.ContainsKey("com.kenko.Spy");
			bool flag4 = Chainloader.PluginInfos.ContainsKey("com.kenko.Scout");
			bool flag5 = Chainloader.PluginInfos.ContainsKey("com.kenko.Submariner");
			bool flag6 = Chainloader.PluginInfos.ContainsKey("com.kenko.Unforgiven");
			bool flag7 = Chainloader.PluginInfos.ContainsKey("com.kenko.Interrogator");
			bool flag8 = Chainloader.PluginInfos.ContainsKey("com.TeamSandswept.Sandswept");
			bool flag9 = Chainloader.PluginInfos.ContainsKey("com.blake.RifterMod");
			if (flag)
			{
				KeywordTranslationsSeamstress.Init();
			}
			if (flag2)
			{
				KeywordTranslationsBanshee.Init();
			}
			if (flag3)
			{
				KeywordTranslationsSpy.Init();
			}
			if (flag4)
			{
				KeywordTranslationsScout.Init();
			}
			if (flag5)
			{
				KeywordTranslationsSubmariner.Init();
			}
			if (flag6)
			{
				KeywordTranslationsWanderer.Init();
			}
			if (flag7)
			{
				KeywordTranslationsInterrogator.Init();
			}
			if (flag8)
			{
				KeywordTranslationsSandswept.Init();
			}
			if (flag9)
			{
				KeywordTranslationsRifter.Init();
			}
			foreach (SkillDef allSkillDef in SkillCatalog.allSkillDefs)
			{
				if (allSkillDef.keywordTokens == null)
				{
					continue;
				}
				for (int i = 0; i < allSkillDef.keywordTokens.Length; i++)
				{
					string text = allSkillDef.keywordTokens[i];
					if (flag && KeywordTranslationsSeamstress.KeywordReplacements.TryGetValue(text, out (string, Func<string>) value))
					{
						LanguageAPI.Add(value.Item1, text);
						LanguageAPI.Add(value.Item1, value.Item2(), "RU");
						allSkillDef.keywordTokens[i] = value.Item1;
					}
					if (flag2 && KeywordTranslationsBanshee.KeywordReplacements.TryGetValue(text, out (string, Func<string>) value2))
					{
						LanguageAPI.Add(value2.Item1, text);
						LanguageAPI.Add(value2.Item1, value2.Item2(), "RU");
						allSkillDef.keywordTokens[i] = value2.Item1;
					}
					if (flag3 && KeywordTranslationsSpy.KeywordReplacements.TryGetValue(text, out (string, Func<string>) value3))
					{
						LanguageAPI.Add(value3.Item1, text);
						LanguageAPI.Add(value3.Item1, value3.Item2(), "RU");
						allSkillDef.keywordTokens[i] = value3.Item1;
					}
					if (flag4 && KeywordTranslationsScout.KeywordReplacements.TryGetValue(text, out (string, Func<string>) value4))
					{
						LanguageAPI.Add(value4.Item1, text);
						LanguageAPI.Add(value4.Item1, value4.Item2(), "RU");
						allSkillDef.keywordTokens[i] = value4.Item1;
					}
					if (flag5 && KeywordTranslationsSubmariner.KeywordReplacements.TryGetValue(text, out (string, Func<string>) value5))
					{
						LanguageAPI.Add(value5.Item1, text);
						LanguageAPI.Add(value5.Item1, value5.Item2(), "RU");
						allSkillDef.keywordTokens[i] = value5.Item1;
					}
					if (flag6 && KeywordTranslationsWanderer.KeywordReplacements.TryGetValue(text, out (string, Func<string>) value6))
					{
						LanguageAPI.Add(value6.Item1, text);
						LanguageAPI.Add(value6.Item1, value6.Item2(), "RU");
						allSkillDef.keywordTokens[i] = value6.Item1;
					}
					if (flag7 && KeywordTranslationsInterrogator.KeywordReplacements.TryGetValue(text, out (string, Func<string>) value7))
					{
						LanguageAPI.Add(value7.Item1, text);
						LanguageAPI.Add(value7.Item1, value7.Item2(), "RU");
						allSkillDef.keywordTokens[i] = value7.Item1;
					}
					if (flag8 && KeywordTranslationsSandswept.KeywordReplacements.TryGetValue(text, out (string, Func<string>) value8))
					{
						LanguageAPI.Add(value8.Item1, text);
						LanguageAPI.Add(value8.Item1, value8.Item2(), "RU");
						allSkillDef.keywordTokens[i] = value8.Item1;
					}
					if (flag9 && KeywordTranslationsRifter.KeywordReplacements.TryGetValue(text, out (string, Func<string>) value9))
					{
						LanguageAPI.Add(value9.Item1, text);
						LanguageAPI.Add(value9.Item1, value9.Item2(), "RU");
						allSkillDef.keywordTokens[i] = value9.Item1;
					}
				}
			}
		}
	}
	public class TranslationAwakeRunner : MonoBehaviour
	{
		public void Awake()
		{
			Main.ModLogger.LogInfo((object)"TranslationAwakeRunner: Awake запущен");
			foreach (var item in TranslationRegistry.Registered)
			{
				var (key, text, action, _) = item;
				if (item.requiresEarlyLoad && Chainloader.PluginInfos.ContainsKey(key))
				{
					Main.ModLogger.LogInfo((object)("[Awake] Загрузка раннего перевода: " + text));
					try
					{
						action();
						Main.ModLogger.LogInfo((object)("[Awake] Перевод загружен: " + text));
					}
					catch (Exception arg)
					{
						Main.ModLogger.LogError((object)$"[Awake] Ошибка при загрузке перевода {text}: {arg}");
					}
				}
			}
		}
	}
	public static class TranslationCredits
	{
		public const string MichikoTeamCredits = "\n\nПеревод на русский выполнен командой «Michiko Team». Вы можете попросить перевод интересующего Вас мода в нашей группе ТГ.";

		public static string AppendCredits(string description)
		{
			if (string.IsNullOrEmpty(description))
			{
				return description;
			}
			if (description.Contains("Michiko Team"))
			{
				return description;
			}
			return description.TrimEnd(Array.Empty<char>()) + "\n\nПеревод на русский выполнен командой «Michiko Team». Вы можете попросить перевод интересующего Вас мода в нашей группе ТГ.";
		}
	}
	public static class TranslationLoader
	{
		private static readonly ManualLogSource logger = Logger.CreateLogSource("TranslationLoader");

		private static readonly Regex jsonLineRegex = new Regex("^\\s*\"(?<key>[^\"]+)\"\\s*:\\s*\"(?<value>.*)\"\\s*,?\\s*$");

		public static void LoadFromFile(string fileName)
		{
			string text = Path.Combine(Paths.PluginPath, "MichikoTeam-RU_MichikoTranslateMod", "mods", fileName);
			if (!File.Exists(text))
			{
				logger.LogWarning((object)("Файл перевода не найден: " + text));
				return;
			}
			string[] array = File.ReadAllLines(text);
			for (int i = 0; i < array.Length; i++)
			{
				string text2 = array[i].Trim();
				if (string.IsNullOrWhiteSpace(text2) || text2.StartsWith("#"))
				{
					continue;
				}
				Match match = jsonLineRegex.Match(text2);
				if (match.Success)
				{
					string text3 = match.Groups["key"].Value.Trim();
					string text4 = match.Groups["value"].Value.Trim().Replace("\\n", "\n");
					try
					{
						LanguageAPI.Add(text3, text4, "RU");
					}
					catch (Exception ex)
					{
						logger.LogError((object)("Ошибка при добавлении токена " + text3 + ": " + ex.Message));
					}
				}
			}
			logger.LogInfo((object)("Перевод загружен из " + fileName));
		}
	}
	public static class TranslationRegistry
	{
		public static readonly List<(string guid, string name, Action applyMethod, bool requiresEarlyLoad)> Registered = new List<(string, string, Action, bool)>
		{
			Create("com.rob.Driver", "Driver", new DriverTranslation().ApplyDriverTranslation, early: true),
			Create("com.ThinkInvisible.TinkersSatchel", "TinkersSatchel", new TinkersSatchelTranslation().ApplyTinkersTranslation, early: true),
			Create("com.Lemonlust.Sett", "Sett", new SettTranslation().ApplySettTranslation),
			Create("com.rob.Hunk", "Hunk", new HunkTranslation().ApplyHunkTranslation, early: true),
			Create("com.kenko.Scout", "Scout", new ScoutTranslation().ApplyScoutTranslation),
			Create("com.Lemonlust.JinxMod", "Jinx", new JinxTranslation().ApplyJinxTranslation),
			Create("com.Bog.Morris", "Mortician", new MorrisTranslation().ApplyMorticianTranslation),
			Create("com.Dragonyck.Tracer", "Tracer", new TracerTranslation().ApplyTracerTranslation),
			Create("com.Bog.Pathfinder", "Pathfinder", new PathfinderTranslation().ApplyPathfinderTranslation),
			Create("com.PopcornFactory.Arsonist", "Arsonist", new ArsonistTranslation().ApplyArsonistTranslation),
			Create("com.nayDPz.Dancer", "Dancer", new DancerTranslation().ApplyDancerTranslation),
			Create("com.Lemonlust.KatarinaMod", "KatarinaMod", new KatarinaTranslation().ApplyKatarinaTranslation),
			Create("com.KomradeSpectre.Aetherium", "Aetherium", new AetheriumTranslation().ApplyAetheriumTranslation, early: true),
			Create("xyz.yekoc.PassiveAgression", "Passive Agression", new PassiveAgressionTranslation().ApplyPassiveAgressionTranslation),
			Create("com.kenko.Submariner", "Submariner", new SubmarinerTranslation().ApplySubmarinerTranslation),
			Create("com.TeamSillyGuy.Bastian", "Bastian", new BastianTranslation().ApplyBastianTranslation),
			Create("com.Bog.Deputy", "Deputy", new DeputyTranslation().ApplyDeputyTranslation),
			Create("com.TeamSandswept.Sandswept", "Sandswept", new SandsweptTranslation().ApplySandsweptTranslation, early: true),
			Create("com.Snoresville.M4A1", "M4A1", new M4A1Translation().ApplyM4A1Translation),
			Create("com.JavAngle.MystMod", "Myst", new MystTranslation().ApplyMystTranslation),
			Create("com.JavAngle.HouseMod", "House", new HouseTranslation().ApplyHouseTranslation),
			Create("com.kenko.Banshee", "Banshee", new BansheeTranslation().ApplyBansheeTranslation),
			Create("com.kenko.Spy", "Spy", new SpyTranslation().ApplySpyTranslation),
			Create("com.kenko.Seamstress", "Seamstress", new SeamstressTranslation().ApplySeamstressTranslation),
			Create("com.levinter.SeamstressVariant", "Seamstress Variant", new SeamstressVariantTranslation().ApplySeamstressVariantTranslation),
			Create("com.kenko.Interrogator", "Interrogator", new InterrogatorTranslation().ApplyInterrogatorTranslation),
			Create("com.kenko.Unforgiven", "Unforgiven", new UnforgivenTranslation().ApplyUnforgivenTranslation),
			Create("com.firewaze.FeedbackSunnyDifficulty", "MoreDifficulties", new MoreDifficultiesTranslation().ApplyMoreDifficultiesTranslation),
			Create("com.TPDespair.ZetArtifacts", "ZetArtifacts", new ZetArtifactsTranslation().ApplyZetArtifactsTranslation, early: true),
			Create("Icarus", "BanditsPrimaryRevolver", new BanditsPrimaryRevolverTranslation().ApplyBanditsPrimaryRevolverTranslation),
			Create("com.rob.Belmont", "Belmont", new BelmontTranslation().ApplyBelmontTranslation),
			Create("com.rob.Dante", "Dante", new DanteTranslation().ApplyDanteTranslation),
			Create("com.Zenithrium.vanillaVoid", "VanillaVoid", new VanillaVoidTranslation().ApplyVanillaVoidTranslation),
			Create("com.BLKNeko.MegamanXMod", "MegamanXMod", new MegamanXModTranslation().ApplyMegamanXModTranslation),
			Create("com.PopcornFactory.LeeHyperrealMod", "LeeHyperreal", new LeeHyperrealTranslation().ApplyLeeHyperrealTranslation),
			Create("com.Borbo.ArtificerExtended", "ArtificerExtended", new ArtificerExtendedTranslation().ApplyArtificerExtendedTranslation),
			Create("SpilledSoup.Faithful", "Faithful", new FaithfulTranslation().ApplyFaithfulTranslation, early: true),
			Create("com.Dragonyck.AerosSkills", "AerosSkills", new AerosSkillsTranslation().ApplyAerosSkillsTranslation),
			Create("com.Forced_Reassembly.SkillsReturns", "SkillsReturns", new SkillsReturnsTranslation().ApplySkillsReturnsTranslation),
			Create("com.cheesewithholes.TanksMod", "Celestial War Tank", new CelestialWarTankTranslation().ApplyCelestialWarTankTranslation),
			Create("com.rob.RobItems", "RobItems", new RobItemsTranslation().ApplyRobItemsTranslation, early: true),
			Create("com.Egg.EggsSkills", "EggsSkills", new EggsSkillsTranslation().ApplyEggsSkillsTranslation),
			Create("com.PopcornFactory.RimuruTempestMod", "RimuruTempest", new RimuruTempestTranslation().ApplyRimuruTempestTranslation),
			Create("com.seroronin.JhinMod", "Jhin", new JhinTranslation().ApplyJhinTranslation),
			Create("com.PopcornFactory.DarthVaderMod", "DarthVader", new DarthVaderTranslation().ApplyDarthVaderTranslation),
			Create("com.TeaL.ShigarakiMod", "Shigaraki", new ShigarakiTranslation().ApplyShigarakiTranslation),
			Create("com.zidane.SamiraMod", "Samira", new SamiraTranslation().ApplySamiraTranslation),
			Create("com.dotflare.LTT1", "LostThroughTime1", new LostThroughTimeTranslation().ApplyLostThroughTimeTranslation),
			Create("com.dotflare.LTT2", "LostThroughTime2", new LostThroughTimeTranslation().ApplyLostThroughTimeTranslation),
			Create("com.TheWarlock117.LinkMod", "Link", new LinkTranslation().ApplyLinkTranslation),
			Create("com.rob.HenryMod", "Henry", new HenryTranslation().ApplyHenryTranslation),
			Create("com.blake.RifterMod", "Rifter", new RifterTranslation().ApplyRifterTranslation, early: true),
			Create("com.TheConstellate.ShockTrooper", "GaleShockTrooper", new GaleShockTrooperTranslation().ApplyGaleShockTrooperTranslation),
			Create("com.BLKNeko.ZeroMod", "Zero", new ZeroTranslation().ApplyZeroTranslation),
			Create("com.BLKNeko.VileMod", "Vile", new VileTranslation().ApplyVileTranslation),
			Create("com.BLKNeko.MMZZeroMod", "MMZZero", new MMZZeroTranslation().ApplyMMZZeroTranslation),
			Create("com.rob.RobomandoMod", "Robomando", new RobomandoTranslation().ApplyRobomandoTranslation),
			Create("com.sixfears7.Voidcrid", "Voidcrid", new VoidcridTranslation().ApplyVoidcridTranslation),
			Create("com.kenko.Cadet", "Cadet", new CadetTranslation().ApplyCadetTranslation),
			Create("com.Gorakh.ItemQualities", "Quality", new QualityTranslation().ApplyQualityTranslation, early: true),
			Create("Wolfo.WolfoQoL_Client", "WolfoQualityOfLife", new WolfoQualityOfLifeTranslation().ApplyWolfoQualityOfLifeTranslation),
			Create("Wolfo.VanillaArtifactsPlus", "VanillaArtifactsPlus", new VanillaArtifactsPlusTranslation().ApplyVanillaArtifactsPlusTranslation),
			Create("Wolfo.LoopVariantsWolfo", "WLoopWeather", new WLoopWeatherTranslation().ApplyWLoopWeatherTranslation),
			Create("com.Hex3.Hex3Mod", "RealerHex3Mod", new RealerHex3ModTranslation().ApplyRealerHex3ModTranslation),
			Create("dev.marmennz.satorugojo", "Satoru Gojo", new SatoruGojoTranslation().ApplySatoruGojoTranslation),
			Create("dev.marmennz.ryomensukuna", "Ryomen Sukuna", new RyomenSukunaTranslation().ApplyRyomenSukunaTranslation),
			Create("dev.marmennz.yujiitadori", "Yuji Itadori", new YujiItadoriTranslation().ApplyYujiItadoriTranslation),
			Create("dev.marmennz.aoitodo", "Aoi Todo", new AoiTodoTranslation().ApplyAoiTodoTranslation),
			Create("dev.marmennz.naoyazenin", "Naoya Zenin", new NaoyaZeninTranslation().ApplyNaoyaZeninTranslation),
			Create("com.frosthex.SorceressMod", "Sorceress", new SorceressTranslation().ApplySorceressTranslation),
			Create("com.manti.ShamanMod", "Shaman", new ShamanTranslation().ApplyShamanTranslation),
			Create("com.mimi.IronmouseMod", "IronmouseSurvivor", new IronmouseTranslation().ApplyIronmouseTranslation),
			Create("com.Tatertotticus.ArmorerMod", "Alloyed Armorer", new AlloyedArmorerTranslation().ApplyAlloyedArmorerTranslation),
			Create("com.Dragonyck.Gwen", "Gwen", new GwenTranslation().ApplyGwenTranslation),
			Create("DTPGStudios.PokeItems", "PokeItems", new PokeItemsTranslation().ApplyPokeItemsTranslation),
			Create("wormsworms.Desolate_Coast", "Desolate Coast", new DesolateCoastTranslation().ApplyDesolateCoastTranslation),
			Create("wormsworms.Sunken_Tombs_Returns", "Sunken Tombs Returns", new SunkenTombsReturnsTranslation().ApplySunkenTombsReturnsTranslation),
			Create("com.Winslow.SwampyBog_winslow", "Stagnant Pipeworks", new StagnantPipeworksTranslation().ApplyStagnantPipeworksTranslation),
			Create("wormsworms.Broadcast_Perch", "Broadcast Perch", new BroadcastPerchTranslation().ApplyBroadcastPerchTranslation),
			Create("com.ds_gaming.ElementalReactions", "Elemental Reactions", new ElementalReactionsTranslation().ApplyElementalReactionsTranslation),
			Create("wormsworms.Sunset_Tropics", "Sunset Tropics", new SunsetTropicsTranslation().ApplySunsetTropicsTranslation),
			Create("wormsworms.Ancient_Observatory", "Ancient Observatory", new AncientObservatoryTranslation().ApplyAncientObservatoryTranslation),
			Create("com.MrE42.RiskOfImpact", "Risk Of Impact", new RiskOfImpactTranslation().ApplyRiskOfImpactTranslation),
			Create("com.Ethanol10.Ganondorf", "Ganondorf", new GanondorfTranslation().ApplyGanondorfTranslation),
			Create("com.JohnstonStu.AH64", "AH-64", new AH64Translation().ApplyAH64Translation),
			Create("com.perl.HazeMod", "HazeMod", new HazeTranslation().ApplyHazeTranslation),
			Create("com.Dragonyck.Spearman", "Spearman", new SpearmanTranslation().ApplySpearmanTranslation),
			Create("com.Dragonyck.RWBYYang", "RWBY Yang", new RWBYYangTranslation().ApplyRWBYYangTranslation),
			Create("com.Dragonyck.Builder", "Builder", new BuilderTranslation().ApplyBuilderTranslation),
			Create("com.Dragonyck.PlayableApothecary", "PlayableClayApothecary", new PlayableApothecaryTranslation().ApplyPlayableApothecaryTranslation),
			Create("com.Dragonyck.ChaosAngeloid", "Chaos", new ChaosAngeloidTranslation().ApplyChaosAngeloidTranslation),
			Create("com.Dragonyck.Wooper", "Wooper", new WooperTranslation().ApplyWooperTranslation),
			Create("com.Dragonyck.Kindred", "Kindred", new KindredTranslation().ApplyKindredTranslation),
			Create("com.Dragonyck.KusanagiItems", "KusanagiItems", new KusanagiItemsTranslation().ApplyKusanagiItemsTranslation),
			Create("com.Dragonyck.MoreArtifacts", "MoreArtifacts", new MoreArtifactsTranslation().ApplyMoreArtifactsTranslation),
			Create("com.RiskOfBrainrot.RainrotSharedUtils", "RainrotSUL", new RainrotSULTranslation().ApplyRainrotSULTranslation),
			Create("com.rune580.riskofoptions", "Risk Of Options", new RiskOfOptionsTranslation().ApplyRiskOfOptionsTranslation),
			Create("com.danileo.UniversalSurvivorUnlocks", "UniversalSurvivorUnlocks", new UniversalSurvivorUnlocksTranslation().ApplyUniversalSurvivorUnlocksTranslation),
			Create("com.rowan.StackedDifficulties", "StackedDifficulties", new StackedDifficultiesTranslation().ApplyStackedDifficultiesTranslation),
			Create("com.rowan.GuaranteedGasPrinter", "GuaranteedGasPrinter", new GuaranteedGasPrinterTranslation().ApplyGuaranteedGasPrinterTranslation),
			Create("com.majai.itemshare", "ItemShare", new ItemShareTranslation().ApplyItemShareTranslation),
			Create("com.majai.orbgather", "OrbGather", new OrbGatherTranslation().ApplyOrbGatherTranslation)
		};

		private static (string, string, Action, bool) Create(string guid, string name, Action apply, bool early = false)
		{
			return (guid, name, apply, early);
		}
	}
}
namespace TranslateRU.ModTranslations
{
	internal class AerosSkillsTranslation
	{
		public void ApplyAerosSkillsTranslation()
		{
			LanguageAPI.Add("AEROS_VIEND_SECONDARY", "Гравитационный луч", "RU");
			LanguageAPI.Add("AEROS_VIEND_SECONDARY_DESCRIPTION", "Выстреливает дальнобойным лучом, нанося <style=cIsDamage>" + MainPlugin.beamDMG.Value * 100f * (1f / MainPlugin.beamFireFrequency.Value) + "% урона</style> в секунду и <style=cIsUtility>притягивая</style> задетых врагов.", "RU");
			LanguageAPI.Add("AEROS_VIEND_SECONDARY_CORRUPT", "Гравитационный луч: искажение", "RU");
			LanguageAPI.Add("AEROS_VIEND_SECONDARY_DESCRIPTION_CORRUPT", "Мгновенно выстреливает дальнобойным лучом, нанося <style=cIsDamage>" + MainPlugin.beamDMGCorrupted.Value * 100f + "% урона</style>. Задетые враги <style=cIsUtility>телепортируются</style> к вам.", "RU");
			LanguageAPI.Add("AEROS_VIEND_UTIL", "Карманное измерение", "RU");
			LanguageAPI.Add("AEROS_VIEND_UTIL_DESCRIPTION", "Переходит в карманное измерение, где вы не можете получать или наносить урон, но получаете <style=cIsHealth>" + MainPlugin.viendSelfDMG.Value * 5f * 100f + "% урона</style> в секунду (увеличивается со временем).", "RU");
			LanguageAPI.Add("AEROS_VIEND_UTIL_CORRUPT", "Карманное измерение: искажение", "RU");
			LanguageAPI.Add("AEROS_VIEND_UTIL_DESCRIPTION_CORRUPT", "Получите <style=cIsUtility>+" + MainPlugin.viendSpeedBuff.Value * 100f + "% к скорости передвижения</style>. Переходит в карманное измерение, где вы не можете получать или наносить урон, но получаете <style=cIsHealth>" + MainPlugin.viendSelfDMG.Value * 5f * 100f + "% урона</style> в секунду (увеличивается со временем).", "RU");
			LanguageAPI.Add("AEROS_SEEKER_M1", "Кулак духа", "RU");
			LanguageAPI.Add("AEROS_SEEKER_M1_DESCRIPTION", "Стреляет во врагов взрывными кулаками на <style=cIsDamage>" + MainPlugin.seekerPrimaryDamage.Value * 100f + "% урона</style>, накладывая стак <style=cIsDamage>души</style> при попадании. При накоплении <style=cIsUtility>" + MainPlugin.passiveMaxStacks.Value + " стаков</style> враг взрывается на <style=cIsDamage>" + MainPlugin.passiveBaseDamage.Value * 100f + "% урона</style>. Нажмите основной и дополнительный навыки для «Незримого хлопка».", "RU");
			LanguageAPI.Add("AEROS_SEEKER_M2", "Незримый хлопок", "RU");
			LanguageAPI.Add("AEROS_SEEKER_M2_DESCRIPTION", "Запускает <style=cIsDamage>2 пробивающие</style> призрачные ладони навстречу друг другу на <style=cIsDamage>" + MainPlugin.seekerSecondaryDamage.Value * 100f + "% урона</style>, взрывающиеся при столкновении на <style=cIsDamage>" + MainPlugin.seekerSecondaryExplosionDamage.Value * 100f + "% урона</style>. Взрыв <style=cIsHealing>исцеляет</style> на <style=cIsHealing>" + MainPlugin.seekerSecondaryHealPercentage.Value * 100f + "% здоровья</style>.", "RU");
			LanguageAPI.Add("AEROS_SEEKER_PASSIVE0", "Нет пассивки.", "RU");
			LanguageAPI.Add("AEROS_SEEKER_PASSIVE", "Кладезь душ", "RU");
			LanguageAPI.Add("AEROS_SEEKER_PASSIVE_DESCRIPTION", "Накладывает стак <style=cIsDamage>души</style> при попадании. При накоплении <style=cIsUtility>" + MainPlugin.passiveMaxStacks.Value + " стаков</style> враг взрывается на <style=cIsDamage>" + MainPlugin.passiveBaseDamage.Value * 100f + "% урона</style>.", "RU");
			LanguageAPI.Add("AEROS_SEEKER_LOADOUT", "Пассивка", "RU");
			LanguageAPI.Add("AEROS_SEEKER_SPEC", "Духовная бомба", "RU");
			LanguageAPI.Add("AEROS_SEEKER_SPEC_DESCRIPTION", "Зарядите <style=cIsDamage>взрывающуюся</style> духовную бомбу, выполняя серии нажатий с таймингом, увеличивая её <style=cIsUtility>размер</style> и получая <style=cIsUtility>спокойствие</style>. Наносит <style=cIsDamage>" + MainPlugin.genkidamaBaseDamage.Value * 100f + "%–" + MainPlugin.genkidamaAddDamage.Value * 7f * 100f + "% урона</style>.", "RU");
			string description = "Погрузчица — медленная, мощная здоровячка, которая перемещается с помощью крюка. <style=cSub>\r\n\r\n< ! > В сражениях полагается на свой Железный барьер.\r\n\r\n< ! > Хваталка помогает ей быстро перемещаться, уклоняться от вражеских ударов, ускоряться и получать мощный бонус к урону Заряженного кулака!\r\n\r\n< ! > Заряженный кулак позволяет сближаться с врагами и добивать их.\r\n\r\n< ! > Обратите внимание: за Колонну M551 можете цепляться как вы, так и другие погрузчики.</style>";
			LanguageAPI.Add("LOADER_DESCRIPTION", TranslationCredits.AppendCredits(description), "RU");
			LanguageAPI.Add("AEROS_LOADER_UTIL", "Заряженный залп", "RU");
			LanguageAPI.Add("AEROS_LOADER_UTIL_DESCRIPTION", "Зарядитесь, чтобы нанести серию ударов, каждый из которых наносит <style=cIsDamage>" + MainPlugin.punchDamageCoefficient.Value * 100f + "% урона</style>. Количество ударов увеличивается со временем заряда.", "RU");
			LanguageAPI.Add("AEROS_LOADER_SPEC", "Блок", "RU");
			LanguageAPI.Add("AEROS_LOADER_SPEC_DESCRIPTION", "Встаньте в блок на <style=cIsDamage>" + MainPlugin.blockDuration.Value + " с</style>, блокируя <style=cIsDamage>" + MainPlugin.blockAmount.Value * 100f + "% урона</style> и превращая его в <style=cIsHealing>барьер</style>. В конце весь барьер расходуется на волну молний, наносящую <style=cIsDamage>" + MainPlugin.blockWaveDamage.Value * 100f + "% урона</style> (увеличивается от потраченного барьера).", "RU");
			string description2 = "Инженер — это особый класс, который потребует планирования и правильного расположения на поле боя.<style=cSub>\r\n\r\n< ! > Раскладываете мины заранее, чтобы прикрыть фланги и сузить коридоры.\r\n\r\n< ! > Инженер зависит от своих Гауссовских турелей, поэтому не забывайте ставить их там, где у них будет преимущество — и безопасность.\r\n\r\n< ! > Пузырьковый щит Инженера может обеспечить надежную защиту вам и вашим союзникам от легко предсказуемых атак боссов!\r\n\r\n< ! > Прыгающие гранаты очень мощны, но ими сложно попасть по двигающимся мишеням. Для борьбы с быстрыми и летающими монстрами лучше использовать турели.</style>";
			LanguageAPI.Add("ENGI_DESCRIPTION", TranslationCredits.AppendCredits(description2), "RU");
			LanguageAPI.Add("AEROS_ENGI_M1", "Искатели", "RU");
			LanguageAPI.Add("AEROS_ENGI_M1_DESCRIPTION", "Заряжает до <style=cIsDamage>8</style> ракет, каждая из которых наносит <style=cIsDamage>" + MainPlugin.missileDamageCoefficient.Value * 100f + "% урона</style>.", "RU");
			LanguageAPI.Add("AEROS_ENGI_SPEC", "Турель TR90 с рельсотроном", "RU");
			LanguageAPI.Add("AEROS_ENGI_SPEC2", "Турель TR90 с рельсотроном", "RU");
			LanguageAPI.Add("AEROS_ENGI_SPEC_DESCRIPTION", "Устанавливает турель, которая заряжается в течение <style=cIsUtility>8 с</style> и стреляет, нанося <style=cIsDamage>" + MainPlugin.turretDamageCoefficient.Value * 100f + "% урона</style>. Наследует все ваши предметы.", "RU");
			string description3 = "Капитан — это уникальный выживший, он оказывает поддержку союзникам и наносит урон на поле боя, используя снаряжение корабля UES «Сэйф Тревелс». <style=cSub>\r\n\r\n< ! > Вулканический дробовик можно использовать в качестве винтовки для дальнего боя, а также в качестве дробовика для ближнего боя. Заряжайте выстрел, чтобы выбрать необходимую дистанцию стрельбы!\r\n\r\n< ! > Защитные микроботы могут обеспечить уникальную и мощную защиту для вас и ваших союзников.\r\n\r\n< ! > Энергетический шокер можно использовать для оглушения элитного врага, пока вы разбираетесь с более слабыми противниками.\r\n\r\n< ! > Орбитальный маяк снабжения можно использовать только два раза за уровень. Главное, не затягивайте с этим!</style>";
			LanguageAPI.Add("CAPTAIN_DESCRIPTION", TranslationCredits.AppendCredits(description3), "RU");
			LanguageAPI.Add("AEROS_CAP_M1", "Вулканический репитер", "RU");
			LanguageAPI.Add("AEROS_CAP_M1_DESCRIPTION", "Выпускает быстрый залп из <style=cIsDamage>3</style> пуль, каждая из которых наносит <style=cIsDamage>3x" + MainPlugin.burstDMG.Value * 100f + "% урона</style>.", "RU");
			LanguageAPI.Add("AEROS_CAP_M2", "Разгон", "RU");
			LanguageAPI.Add("AEROS_CAP_M2_DESCRIPTION", "Выпускает снаряд, <style=cIsDamage>усиливающий</style> союзников при попадании: <style=cIsHealing>+" + MainPlugin.regen.Value + " ед./с регенерации</style>, <style=cIsDamage>+" + MainPlugin.atkspd.Value + "% скор. атаки</style>, <style=cIsUtility>+" + MainPlugin.movspd.Value + "% скор. передвижения</style> и <style=cIsUtility>" + MainPlugin.cooldown.Value * 100f + "% сокращения перезарядки</style> на <style=cIsUtility>" + MainPlugin.duration.Value + " с</style>.", "RU");
			string description4 = "Изобретательница — это выжившая, которая наносит большой разрывной урон и специализируется на битвах с большими группами и боссами. <style=cSub>\r\n\r\n< ! > Огненный выстрел быстро расходует запасы, но медленно перезаряжается, так что стоит попеременно использовать навыки и обычные атаки.\r\n\r\n< ! > Прямое попадание Сверхмощной нанобомбы может переломить ситуацию в вашу пользу и обернуть поражение победой.\r\n\r\n< ! > При заморозке враги с низким здоровьем мгновенно погибают: это идеальный способ избавиться от «толстых» врагов.\r\n\r\n< ! > Не забывайте, что у Изобретательницы НЕТ защитных навыков, поэтому главное — правильное расположение на поле боя и защитные предметы!</style>";
			LanguageAPI.Add("MAGE_DESCRIPTION", TranslationCredits.AppendCredits(description4), "RU");
			LanguageAPI.Add("AEROS_MAGE_SEC", "Призыв наноклинка", "RU");
			LanguageAPI.Add("AEROS_MAGE_SEC_DESCRIPTION", "<style=cIsDamage>Поджог</style>. Зарядите пылающий меч, наносящий <style=cIsDamage>" + MainPlugin.mageFlameSwordMinDamage.Value * 100f + "%–" + MainPlugin.mageFlameSwordMaxDamage.Value * 100f + "% урона</style>. При полном заряде выпускается <style=cIsDamage>пробивающий</style> снаряд.", "RU");
			LanguageAPI.Add("AEROS_MAGE_SPEC", "Ледяной выброс", "RU");
			LanguageAPI.Add("AEROS_MAGE_SPEC_DESCRIPTION", "<style=cIsUtility>Заморозка</style>. Отталкивает вас в направлении движения, нанося <style=cIsDamage>" + MainPlugin.mageSpecialDamage.Value * 100f + "% урона</style> ближайшим врагам.", "RU");
			string description5 = "Коммандо — мастер на все руки. На него можно положиться в любой игровой ситуации.\n\n< ! > Двойной выстрел хорош и на коротких, и на длинных дистанциях. Это быстрый навык, который активирует множество эффектов от предметов.\n\n< ! > Используйте Тактический бросок, чтобы увернуться от легко предсказуемых атак.\n\n< ! > Огонь на подавление можно использовать для оглушения врага — или целой группы!\n\n< ! > Фазовые патроны проходят сквозь стены — не забывайте пользоваться этим преимуществом!";
			LanguageAPI.Add("COMMANDO_DESCRIPTION", TranslationCredits.AppendCredits(description5), "RU");
			LanguageAPI.Add("AEROS_COMMANDO_UTIL", "Пулевой рывок", "RU");
			LanguageAPI.Add("AEROS_COMMANDO_UTIL_DESCRIPTION", "Совершите рывок вперёд, получая <style=cIsUtility>неуязвимость</style> и тараня первого врага поблизости на <style=cIsDamage>" + MainPlugin.commandoUtilityDamage.Value * 100f + "% урона</style>.", "RU");
			LanguageAPI.Add("AEROS_COMMANDO_SPEC", "Снайпер", "RU");
			LanguageAPI.Add("AEROS_COMMANDO_SPEC_DESCRIPTION", "Зажмите, чтобы выстрелить двумя <style=cIsDamage>пробивающими</style> пулями, наносящими <style=cIsDamage>2x" + MainPlugin.commandoSpecialMinDamage.Value * 100f + "%–" + MainPlugin.commandoSpecialMaxDamage.Value * 100f + "% урона</style>. Выстрел на максимальном заряде заставляет пули <style=cIsUtility>рикошетить</style> в ближайших врагов.", "RU");
			string description6 = "Бандит — это персонаж, полагающийся на комбинации, требующие высокого навыка игры. Он способен наносить смертельные удары в спину и становиться невидимым.<style=cSub>\r\n\r\n< ! > Вы можете перезаряжать оружие, будучи в невидимости. Всегда помните об этом!\r\n\r\n< ! > Успешный сброс таймеров восстановления способностей с помощью Погасить свет может стать решающим фактором во время особо напряженных стычек.\r\n\r\n< ! > Удар в спину — одна из наиболее важных способностей Бандита, однако крайне рискованно использовать ее против врагов, сильных в ближнем бою.\r\n\r\n< ! > Эффект кровотечения от Зазубренного лезвия может складываться. Сбрасывайте таймеры восстановления способностей с помощью Погасить свет, сражаясь против слабых врагов, чтобы складывать эффект кровотечения на боссах.\r\n</style>";
			LanguageAPI.Add("BANDIT2_DESCRIPTION", TranslationCredits.AppendCredits(description6), "RU");
			LanguageAPI.Add("AEROS_BANDIT_LOADOUT", "Пассивный", "RU");
			LanguageAPI.Add("AEROS_BANDIT_PASSIVE", "Рваные раны", "RU");
			LanguageAPI.Add("AEROS_BANDIT_PASSIVE_DESCRIPTION", "Все атаки со <style=cIsDamage>спины</style> накладывают <style=cIsHealth>кровоизлияние</style>.", "RU");
			LanguageAPI.Add("AEROS_BANDIT_UTIL", "Оглушающая граната", "RU");
			LanguageAPI.Add("AEROS_BANDIT_UTIL_DESCRIPTION", "<style=cIsDamage>Оглушение</style>. Отпрыгните назад и бросьте гранату, которая взрывается на <style=cIsDamage>" + MainPlugin.banditUtilityDamage.Value * 100f + "% урона</style>.", "RU");
			string description7 = "Акрид — гибрид ближнего боя, использующий сильные яды, разъедающие врагов с большим запасом здоровья. <style=cSub>\r\n\r\n< ! > Яд — это очень мощное оружие продолжительного действия, поэтому его стоит использовать как можно чаще!\r\n\r\n< ! > Яд оставляет противнику 1 ОЗ, так что отдавайте приоритет предметам и дронам, которые могут добить врага.\r\n\r\n< ! > У Акрида нет естественной защиты. Чтобы выжить, вам придётся положиться на тактику «бей-беги».\r\n\r\n< ! > Быстрое восстановление нейротоксина делает из Акрида неплохого персонажа для боя на дальней дистанции.</style>";
			LanguageAPI.Add("CROCO_DESCRIPTION", TranslationCredits.AppendCredits(description7), "RU");
			LanguageAPI.Add("AEROS_CROCO_M2", "Обострение", "RU");
			LanguageAPI.Add("AEROS_CROCO_M2_DESCRIPTION", "Растерзайте врага на <style=cIsDamage>" + MainPlugin.crocoSecondaryDamage.Value * 100f + "% урона</style>, нанося дополнительные <style=cIsDamage>" + MainPlugin.crocoSecondaryAddDamage.Value * 100f + "% урона</style> за каждый <style=cIsHealth>негативный эффект</style> у цели.", "RU");
			LanguageAPI.Add("AEROS_CROCO_SPEC", "Захват", "RU");
			LanguageAPI.Add("AEROS_CROCO_SPEC_DESCRIPTION", "Прыгните в воздух, нанося <style=cIsDamage>" + MainPlugin.crocoSpecialLatchDamage.Value * 100f + "% урона</style> и прицепляясь к первому поражённому врагу на <style=cIsUtility>5 с</style>. При повторной активации или по истечении времени наносит <style=cIsDamage>" + MainPlugin.crocoSpecialTargetDamage.Value * 100f + "% урона</style> захваченной цели и взрывается, нанося <style=cIsDamage>" + MainPlugin.crocoSpecialExplosionDamage.Value * 100f + "% урона</style> ближайшим врагам с передачей им всех негативных эффектов цели.", "RU");
			LanguageAPI.Add("AEROS_FALSESON_UTIL", "Сестринские объятия", "RU");
			LanguageAPI.Add("AEROS_FALSESON_UTIL_DESCRIPTION", "Создаёт очищающую ауру на <style=cIsUtility>1 с</style>, даруя союзникам поблизости <style=cIsHealing>" + MainPlugin.falseSonUtilityBarrier.Value * 100f + "% барьера</style> и <style=cIsUtility>снимая</style> все негативные эффекты. Утраивает эффекты пассивки на <style=cIsUtility>4 с</style>. Также дарует бонус к <style=cIsDamage>урону</style> и <style=cIsDamage>броне</style> в размере <style=cIsDamage>" + MainPlugin.falseSonUtilityBuffMult.Value * 100f + "%</style> от вашего <style=cIsDamage>золота</style>.", "RU");
			LanguageAPI.Add("AEROS_FALSESON_SPEC", "Корона Отца", "RU");
			LanguageAPI.Add("AEROS_FALSESON_SPEC_DESCRIPTION", "Заряжает 10 пробивающих лазеров, стреляющих в случайных направлениях и наносящих <style=cIsDamage>10x" + MainPlugin.falseSonSpecialDamage.Value * 100f + "% урона</style> в секунду. Ближе к концу лучи сходятся в направлении прицела ещё на <style=cIsUtility>" + MainPlugin.falseSonSpecialFinalDuration.Value + " с</style>.", "RU");
			LanguageAPI.Add("AEROS_RAILGUNNER_UTIL", "Усиливающий голоэкран", "RU");
			LanguageAPI.Add("AEROS_RAILGUNNER_UTIL_DESCRIPTION", "Бросает устройство, проецирующее голограмму. Урон любых снарядов, пролетающих сквозь неё, умножается на <style=cIsDamage>" + MainPlugin.railgunnerUtilityDamageMult.Value * 100f + "%</style>.", "RU");
			LanguageAPI.Add("AEROS_RAILGUNNER_SPEC", "Электрозаряд", "RU");
			LanguageAPI.Add("AEROS_RAILGUNNER_SPEC_DESCRIPTION", "Во время зарядки бьёт ближайших врагов разрядом на <style=cIsDamage>" + MainPlugin.railgunnerSpecialLightningDamage.Value * 100f + "% урона</style>. Выстреливает <style=cIsDamage>взрывным</style> снарядом на <style=cIsDamage>" + MainPlugin.railgunnerSpecialDamage.Value * 100f + "% урона</style>. Затем <style=cIsHealth>всё оружие отключается</style> на <style=cIsHealth>5 с</style>.", "RU");
			LanguageAPI.Add("AEROS_RAILGUNNER_SPEC_PRIMARY", "Электрозаряженный рельсотрон", "RU");
			LanguageAPI.Add("AEROS_RAILGUNNER_SPEC_PRIMARY_DESCRIPTION", "Выпускает сверхзаряженный снаряд на <style=cIsDamage>" + MainPlugin.railgunnerSpecialDamage.Value * 100f + "% урона</style>.", "RU");
			string description8 = "Охотница — чрезвычайно подвижная, но хрупкая выжившая, наносящая мощный урон.<style=cSub>\r\n\r\n< ! > Не забывайте, Перемещение боком — уникальный навык, который можно использовать во время спринта. Двигайтесь с большой скоростью, одновременно уничтожая потенциальные угрозы.\r\n\r\n< ! > Используйте Скачок и Дождь из стрел, чтобы оказаться ближе к врагу или уйти от опасности.\r\n\r\n< ! > Лазерная глефа уничтожает сложных врагов попарно, рикошетя от одного к другому. \r\n\r\n< ! > Дождь из стрел наносит огромный урон и одновременно замедляет врагов. Идеально для мощных и быстрых мишеней!</style>";
			LanguageAPI.Add("HUNTRESS_DESCRIPTION", TranslationCredits.AppendCredits(description8), "RU");
			LanguageAPI.Add("AEROS_HUNTRESS_M2", "Циклонная глефа", "RU");
			LanguageAPI.Add("AEROS_HUNTRESS_M2_DESCRIPTION", "Бросает глефу, которая <style=cIsUtility>притягивает врагов к центру</style>, нанося <style=cIsDamage>" + MainPlugin.huntressSecondaryDamage.Value * 100f + "% урона</style> в секунду. В конце взрывается на <style=cIsDamage>" + MainPlugin.huntressSecondaryDamage.Value * 100f + "% урона</style>.", "RU");
			LanguageAPI.Add("AEROS_HUNTRESS_SPEC", "Варп-выстрел", "RU");
			LanguageAPI.Add("AEROS_HUNTRESS_SPEC_DESCRIPTION", "Телепортирует назад в воздух. Укажите область, чтобы выпустить энергоснаряд, <style=cIsUtility>телепортироваться</style> к точке попадания и взорваться на <style=cIsDamage>" + MainPlugin.huntressSpecialDamage.Value * 100f + "% урона</style>.", "RU");
			string description9 = "Наемник — это искусный рукопашный боец, который использует разнообразные уловки, чтобы ускользать от атак и возвращаться на поле битвы.<style=cSub>\r\n\r\n< ! > Воздушная разновидность Вихря при необходимости может использоваться как дополнительный прыжок.\r\n\r\n< ! > Перезагрузка Ослепляющей атаки раз за разом — это ключ к увеличению выживаемости и наносимого урона. В то же время, не стоит стремиться к перезагрузке во что бы то ни стало: это может привести к вашей смерти.\r\n\r\n< ! > Не забывайте, что Потрошение — это невероятно эффективный защитный навык, позволяющий уклониться от предсказуемых атак.\r\n\r\n< ! > Лазерный меч наносит прорву урона по площади, что делает его уникальной базовой атакой.</style>";
			LanguageAPI.Add("MERC_DESCRIPTION", TranslationCredits.AppendCredits(description9), "RU");
			LanguageAPI.Add("AEROS_MERC_M1", "Лучевой меч", "RU");
			LanguageAPI.Add("AEROS_MERC_M1_DESCRIPTION", "<style=cIsUtility>Подвижность</style>. Рубит перед собой, нанося <style=cIsDamage>3x" + MainPlugin.mercPrimaryDamage.Value * 100f + "% урона</style>.", "RU");
			LanguageAPI.Add("AEROS_MERC_SPEC", "Разрыв", "RU");
			LanguageAPI.Add("AEROS_MERC_SPEC_DESCRIPTION", "Рывок вперёд на <style=cIsDamage>" + MainPlugin.mercSpecialDashDamage.Value * 100f + "% урона</style>. При попадании отпрыгивает вверх на <style=cIsDamage>" + MainPlugin.mercSpecialSlamDamage.Value * 100f + "% урона</style> и бьёт о землю на <style=cIsDamage>" + MainPlugin.mercSpecialSlamImpactDamage.Value * 100f + "% урона</style>.", "RU");
			string description10 = "МУЛ-Т — агрессивный выживший, у которого найдётся инструмент для любой работы! <style=cSub>\r\n\r\n< ! > Автоматический гвоздемёт — оружие рискованное в использовании, но результат поражает насмерть. Урон его высок, чего нельзя сказать о дальности.\r\n\r\n< ! > Режим транспортировки хорош как для того, чтобы разом давить небольшие группы монстров, так и для нанесения большого урона более крупным группам.\r\n\r\n< ! > Взрывпакет способен надолго обездвижить большое скопление врагов, помогая как вам, так и вашим союзникам идеально прицелиться в них.\r\n\r\n< ! > Постоянная переоснастка помогает уничтожать хрупких и слабых врагов арматуриной, не ограничивая возможности наносить большой урон автоматическим гвоздемётом.</style>";
			LanguageAPI.Add("TOOLBOT_DESCRIPTION", TranslationCredits.AppendCredits(description10), "RU");
			LanguageAPI.Add("AEROS_MULT_SEC", "Ремонтный дрон", "RU");
			LanguageAPI.Add("AEROS_MULT_SEC_DESCRIPTION", "Дарует уникальный дрон. Активируйте для выбора цели: враги получают увеличенный на <style=cIsDamage>" + (MainPlugin.multSecondaryDamageIncrease.Value - 1f) * 100f + "% урон</style>. Союзный дрон регенерирует <style=cIsHealth>" + MainPlugin.multSecondaryHeal.Value + " HP/с</style> и получает <style=cIsDamage>+30% урона и скор. атаки</style>. Повторите для отмены.", "RU");
			LanguageAPI.Add("AEROS_MULT_UTIL", "Режим транспортировки: Разгон", "RU");
			LanguageAPI.Add("AEROS_MULT_UTIL_DESCRIPTION", "Скользит вперёд на короткое расстояние.", "RU");
			LanguageAPI.Add("AEROS_MULT_DRONE_NAME", "Ремонтный дрон", "RU");
			string description11 = "РЕКС — полуробот-полурастение, за счет здоровья способное применять разрушительные дистанционные навыки. Ни растение, ни робот не смогли бы выжить на этой планете сами по себе — но, к счастью, они могут полагаться на свою вторую половину. <style=cSub>\r\n\r\n< ! > Природные токсины ослабляют сильных противников, помогая как вам, так и вашим союзникам.\r\n\r\n< ! > Залп семян может применяться на любой дистанции и очень быстро восстанавливается — только не забывайте о своем здоровье!\r\n\r\n< ! > ДИРЕКТИВА: Разгон — способность отбрасывать врагов. Она может впечатывать летающих монстров в стены, убивая их на месте.\r\n\r\n< ! > Удачно нацеленный Рост корней быстро возвращает РЕКСа в форму — охват корнями нескольких монстров легко компенсирует потраченное на применение этого навыка здоровье.</style>";
			LanguageAPI.Add("TREEBOT_DESCRIPTION", TranslationCredits.AppendCredits(description11), "RU");
		}
	}
	internal class AetheriumTranslation
	{
		private static void AddToken(string token, string text)
		{
			if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(text))
			{
				return;
			}
			try
			{
				LanguageAPI.Add(token, text, "RU");
				LanguageAPI.Add(token, text, "ru");
				LanguageAPI.Add(token, text);
				LanguageAPI.AddOverlay(token, text, "RU");
				LanguageAPI.AddOverlay(token, text, "ru");
				LanguageAPI.AddOverlay(token, text);
			}
			catch (Exception arg)
			{
				Debug.LogError((object)$"[TranslateRU] Ошибка добавления токена {token}: {arg}");
			}
		}

		public static string SafeFormat(string format, params object[] args)
		{
			if (format == null)
			{
				Debug.LogError((object)"[TranslateRU] SafeFormat: format == null");
				return "";
			}
			if (args == null)
			{
				Debug.LogError((object)("[TranslateRU] SafeFormat: args == null для строки: \"" + format + "\""));
				return format;
			}
			try
			{
				return string.Format(format, args);
			}
			catch (FormatException arg)
			{
				Debug.LogError((object)string.Format("[TranslateRU] Ошибка форматирования:\nСтрока: \"{0}\"\nАргументы: {1}\n{2}", format, string.Join(", ", args), arg));
				return format;
			}
		}

		public static string OrderManifestLoreFormatterRU(string deviceName, string estimatedDelivery, string sentTo, string trackingNumber, string devicePickupDesc, string shippingMethod, string orderDetails)
		{
			string[] value = new string[19]
			{
				"<align=left>Ожидаемая доставка:<indent=70%>Адрес получателя:</indent></align>",
				"<align=left>" + estimatedDelivery + "<indent=70%>" + sentTo + "</indent></align>",
				"",
				"<indent=1%><style=cIsDamage><size=125%><u>  Информация о доставке:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0</u></size></style></indent>",
				"",
				"<indent=2%>-Заказ: <style=cIsUtility>" + deviceName + "</style></indent>",
				"<indent=4%><style=cStack>Трек-номер:  " + trackingNumber + "</style></indent>",
				"",
				"<indent=2%>-Описание заказа: " + devicePickupDesc + "</indent>",
				"",
				"<indent=2%>-Способ доставки: <style=cIsHealth>" + shippingMethod + "</style></indent>",
				"",
				"",
				"",
				"<indent=2%>-Детали заказа: " + orderDetails + "</indent>",
				"",
				"",
				"",
				"<style=cStack>Доставка осуществляется с использованием новейшей </style><style=cIsUtility>орбитальной сбрасывающей капсулы (TM)</style>. <style=cStack><u>Возврату не подлежит.</u></style>"
			};
			return string.Join("\n", value);
		}

		public void ApplyAetheriumTranslation()
		{
			RegisterTokens();
			RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, new Action(RegisterTokens));
			Language.onCurrentLanguageChanged += RegisterTokens;
		}

		private static void RegisterTokens()
		{
			AddToken("AETHERIUM_EXPANSION_DEF_NAME", "Aetherium");
			AddToken("AETHERIUM_EXPANSION_DEF_DESCRIPTION", "Целый мир диковинных предметов, снаряжения, элиты и интерактивных объектов ждёт вас.\nПеревод: Michiko Team");
			AddToken("ARTIFACT_ARTIFACT_OF_PROGRESSION_NAME", "Артефакт прогресса");
			AddToken("ARTIFACT_OF_PROGRESSION_NAME", "Артефакт прогресса");
			AddToken("ARTIFACT_ARTIFACT_OF_PROGRESSION_DESCRIPTION", "Со временем большинство врагов эволюционируют в свои более сильные формы.");
			AddToken("ARTIFACT_OF_PROGRESSION_DESCRIPTION", "Со временем большинство врагов эволюционируют в свои более сильные формы.");
			AddToken("ARTIFACT_ARTIFACT_OF_PROGRESSION_DESC", "Со временем большинство врагов эволюционируют в свои более сильные формы.");
			AddToken("ARTIFACT_OF_PROGRESSION_DESC", "Со временем большинство врагов эволюционируют в свои более сильные формы.");
			AddToken("ARTIFACT_ARTIFACT_OF_LEONIDS_NAME", "Артефакт Леонид");
			AddToken("ARTIFACT_OF_LEONIDS_NAME", "Артефакт Леонид");
			AddToken("ARTIFACT_ARTIFACT_OF_LEONIDS_DESCRIPTION", "Каждые 60 сек. начинается метеоритный дождь из 6 волн.");
			AddToken("ARTIFACT_OF_LEONIDS_DESCRIPTION", "Каждые 60 сек. начинается метеоритный дождь из 6 волн.");
			AddToken("ARTIFACT_ARTIFACT_OF_LEONIDS_DESC", "Каждые 60 сек. начинается метеоритный дождь из 6 волн.");
			AddToken("ARTIFACT_OF_LEONIDS_DESC", "Каждые 60 сек. начинается метеоритный дождь из 6 волн.");
			AddToken("ARTIFACT_ARTIFACT_OF_REGRESSION_NAME", "Артефакт регресса");
			AddToken("ARTIFACT_OF_REGRESSION_NAME", "Артефакт регресса");
			AddToken("ARTIFACT_ARTIFACT_OF_REGRESSION_DESCRIPTION", "Если монстр находится в эволюционировавшей форме, при гибели он распадается на группу своих базовых форм.");
			AddToken("ARTIFACT_OF_REGRESSION_DESCRIPTION", "Если монстр находится в эволюционировавшей форме, при гибели он распадается на группу своих базовых форм.");
			AddToken("ARTIFACT_ARTIFACT_OF_REGRESSION_DESC", "Если монстр находится в эволюционировавшей форме, при гибели он распадается на группу своих базовых форм.");
			AddToken("ARTIFACT_OF_REGRESSION_DESC", "Если монстр находится в эволюционировавшей форме, при гибели он распадается на группу своих базовых форм.");
			AddToken("ARTIFACT_ARTIFACT_OF_THE_JOURNEY_NAME", "Артефакт странствия");
			AddToken("ARTIFACT_OF_THE_JOURNEY_NAME", "Артефакт странствия");
			AddToken("ARTIFACT_ARTIFACT_OF_THE_JOURNEY_DESCRIPTION", "Большинство этапов выбираются случайно. Спустя несколько этапов появится «Первобытный телепорт».");
			AddToken("ARTIFACT_OF_THE_JOURNEY_DESCRIPTION", "Большинство этапов выбираются случайно. Спустя несколько этапов появится «Первобытный телепорт».");
			AddToken("ARTIFACT_ARTIFACT_OF_THE_JOURNEY_DESC", "Большинство этапов выбираются случайно. Спустя несколько этапов появится «Первобытный телепорт».");
			AddToken("ARTIFACT_OF_THE_JOURNEY_DESC", "Большинство этапов выбираются случайно. Спустя несколько этапов появится «Первобытный телепорт».");
			AddToken("ARTIFACT_ARTIFACT_OF_THE_NIGHTMARE_NAME", "Артефакт кошмара");
			AddToken("ARTIFACT_OF_THE_NIGHTMARE_NAME", "Артефакт кошмара");
			AddToken("ARTIFACT_ARTIFACT_OF_THE_NIGHTMARE_DESCRIPTION", "Обычные монстры при появлении получают от 1 до 4 предметов Лунной Ереси.");
			AddToken("ARTIFACT_OF_THE_NIGHTMARE_DESCRIPTION", "Обычные монстры при появлении получают от 1 до 4 предметов Лунной Ереси.");
			AddToken("ARTIFACT_ARTIFACT_OF_THE_NIGHTMARE_DESC", "Обычные монстры при появлении получают от 1 до 4 предметов Лунной Ереси.");
			AddToken("ARTIFACT_OF_THE_NIGHTMARE_DESC", "Обычные монстры при появлении получают от 1 до 4 предметов Лунной Ереси.");
			AddToken("ARTIFACT_ARTIFACT_OF_THE_TYRANT_NAME", "Артефакт тирана");
			AddToken("ARTIFACT_OF_THE_TYRANT_NAME", "Артефакт тирана");
			AddToken("ARTIFACT_ARTIFACT_OF_THE_TYRANT_DESCRIPTION", "Каждый раз при появлении финального босса он получает 1 случайный элитный модификатор.");
			AddToken("ARTIFACT_OF_THE_TYRANT_DESCRIPTION", "Каждый раз при появлении финального босса он получает 1 случайный элитный модификатор.");
			AddToken("ARTIFACT_ARTIFACT_OF_THE_TYRANT_DESC", "Каждый раз при появлении финального босса он получает 1 случайный элитный модификатор.");
			AddToken("ARTIFACT_OF_THE_TYRANT_DESC", "Каждый раз при появлении финального босса он получает 1 случайный элитный модификатор.");
			AddToken("ITEM_FEATHERED_PLUME_NAME", "Пернатое перо");
			AddToken("ITEM_FEATHERED_PLUME_PICKUP", "Получите ускорение после получения урона.");
			AddToken("ITEM_FEATHERED_PLUME_DESCRIPTION", "Получите временное <style=cIsUtility>ускорение на 7%</style> после получения урона. Эффект складывается 3 раз(а) на 5 сек. <style=cStack>(+3 к зарядам и +1 сек. к длительности за каждое дополнительное Пернатое перо.)</style>");
			AddToken("ITEM_FEATHERED_PLUME_LORE", OrderManifestLoreFormatterRU("Пернатое перо", "05/05/2077", "Необозначенный пункт сброса №951", "591********", "Увеличивает скорость передвижения при получении урона.", "Био-металл / Биоопасно / Лёгкое", "Пара перьев легендарного стального грифа. Сканирование показало, что перья вырабатывают мощный мышечный стимулятор при ударе. Наши полевые испытатели подтвердили это, хотя и описали эффект иначе — мол, «можно с дикой скоростью валить из заварухи». Видимо, у них появилась потребность… Потребность в скорости."));
			AddToken("ITEM_NAIL_BOMB_NAME", "Гвоздевая бомба");
			AddToken("ITEM_NAIL_BOMB_PICKUP", "Атаки, наносящие <style=cIsDamage>высокий урон</style>, выпускают шрапнельную гранату.");
			AddToken("ITEM_NAIL_BOMB_DESCRIPTION", "Атаки, наносящие <style=cIsDamage>400% урона и более</style>, выпускают <style=cIsDamage>шрапнельную гранату</style>, взрывающуюся на <style=cIsDamage>8×100% вашего урона</style> <style=cStack>(+20% за шт.)</style>. Поражённые враги получают <style=cIsUtility>10 сек. иммунитета</style> к повторному эффекту.");
			AddToken("ITEM_NAIL_BOMB_LORE", "[К этой коробке прикреплена странная записка, составленная из вырезанных из разных газет букв.]\n\nПривет!\n\nЕсли ты читаешь это, значит, почтовая служба справилась и доставила посылку прямо в руки. Хочу сказать тебе одно: пошёл ты к чёрту! Ты не просто украл мою работу, ты забрал почти всё моё имущество перед тем, как сбежать в какой-то дальний сектор космоса. И теперь я возвращаю то, что ты забыл прихватить!\n\nДа-да, открывай коробку! Видишь это? Наверное, заметил за долю секунды до детонации, хотя если моё устройство сработало, читать ты уже не в состоянии. Если же ты не тот, кому это предназначалось, и нашёл записку рядом с каким-то бедолагой, утыканным гвоздями — он получил по заслугам. В потайном отделении на дне коробки лежат чертежи, как я собрал эту штуку.\n\nЗакопай тело, забери чертёж и помалкивай. Пусть это будет нашей маленькой тайной.\n\nИскренне твой,\nДжеб Лабински");
			AddToken("ITEM_BLOODTHIRSTY_SHIELD_NAME", "Кровожадный щит");
			AddToken("ITEM_BLOODTHIRSTY_SHIELD_PICKUP", "Убийство врага <style=cIsHealing>восстанавливает</style> часть <style=cIsHealing>щита</style>.");
			AddToken("ITEM_BLOODTHIRSTY_SHIELD_DESCRIPTION", "Убийство врага восстанавливает <style=cIsUtility>10% от максимального запаса щита</style> <style=cStack>(+5% за шт., уменьшается гиперболически)</style>. При взятии первого предмета даёт <style=cIsUtility>8%</style> от максимального здоровья в виде щита.");
			AddToken("ITEM_BLOODTHIRSTY_SHIELD_LORE", "Баллада о Летесее, герое островов — Акт II, Сцена III\n\nЗвук металла, рвущего плоть, разносится по воздуху; солдаты внутри кажутся равнодушными к этой мрачной симфонии. Всё, что имеет для них значение — собственное выживание, независимо от того, чьей кровью оно оплачено. Один за другим ксифос находит цель, пока не остаётся лишь один человек.\n\nШум утихает. Летесей опускается на колени на багровую землю, измотанный смертоносным танцем. Его ксифос больше не послужит ему. Его аспис, пусть и треснувший, продолжит защищать его — пока воин способен приносить дары, которые можно добыть лишь в ярости сражения.");
			AddToken("ITEM_ENGINEERS_TOOLBELT_NAME", "Пояс инженера");
			AddToken("ITEM_ENGINEERS_TOOLBELT_PICKUP", "Шанс создать копию дронов и турелей при покупке. Дроны и турели могут восстановиться после гибели.");
			AddToken("ITEM_ENGINEERS_TOOLBELT_DESCRIPTION", "Вы получаете <style=cIsUtility>20%</style> шанс <style=cStack>(+10% за шт. гиперболически, максимум 100%)</style> создать копию дронов и турелей <style=cIsUtility>при покупке</style>.\nДополнительно вы получаете <style=cIsUtility>20%</style> шанс <style=cStack>(+10% за шт. гиперболически, максимум 100%)</style> восстановить их при <style=cDeath>гибели</style>.");
			AddToken("ITEM_ENGINEERS_TOOLBELT_LORE", OrderManifestLoreFormatterRU("Пояс инженера", "09/09/2079", "Корабль UES Safe Travels / Необозначенный сектор / Внешний Край", "667********", "Полный набор для ремонта дронов и турелей.", "Доставка на следующий день / Промышленное снаряжение / Компакт", "Привет, дружище,\n\nПолучил твой запрос на замену монтажного пояса. Не могу поверить, что на борту «Safe Travels» не нашлось ни одного. Запасы у нас на исходе, так что собрал всё, что было под рукой. В поясе есть всё необходимое для техника по ремонту дронов и турелей.\n\nСодержимое:\n<indent=5%>- Шлицевая отвёртка</indent>\n<indent=5%>- Полный подсумок батареек «Ionocell AA» (повезло тебе)</indent>\n<indent=5%>- Ключ с трещоткой</indent>\n<indent=5%>- Зебровый скотч моей дочки — она всё равно не заметит</indent>\n<indent=5%>- Подсумок, доверху набитый всеми винтами, что удалось найти</indent>\n<indent=5%>- Немного гаек и болтов по карманам</indent>\n<indent=5%>- И приятный бонус: в оставшиеся кармашки я положил немного перекусить. Не ручаюсь, что это останется съедобным к моменту доставки.</indent>\n\nС наилучшими пожеланиями,\nСкромный техник\n\nP.S. Некоторые батарейки Ionocell могут не пережить гиперпространственный скачок, но я положил их столько, что если первые не оживят роботов — просто попробуй следующую пару."));
			AddToken("ITEM_SHARK_TEETH_NAME", "Акульи зубы");
			AddToken("ITEM_SHARK_TEETH_PICKUP", "Часть полученного урона наносится в течение <style=cIsUtility>5 сек.</style> в виде <style=cIsDamage>урона от кровотечения</style>.");
			AddToken("ITEM_SHARK_TEETH_DESCRIPTION", "<style=cIsDamage>25%</style> полученного урона <style=cStack>(+25% за шт., гиперболически)</style> наносится вам в течение 5 сек. в виде <style=cIsDamage>урона от кровотечения</style>.");
			AddToken("ITEM_SHARK_TEETH_LORE", "Пара на вид обычных акульих зубов. Однако полевые испытания показали, что они способны поглощать часть любой приложенной к ним силы и перенаправлять её в виде лёгких поверхностных ранений своему носителю.");
			AddToken("ITEM_SHIELDING_CORE_NAME", "Ядро щита");
			AddToken("ITEM_SHIELDING_CORE_PICKUP", "Пока активен щит, временно увеличивается <style=cIsUtility>броня</style>.");
			AddToken("ITEM_SHIELDING_CORE_DESCRIPTION", "Даёт <style=cIsUtility>30</style> <style=cStack>(+30 за шт.)</style> <style=cIsUtility>брони</style>, пока активен <style=cIsUtility>синий щит</style>. При взятии первого предмета даёт <style=cIsUtility>8%</style> от вашего максимального здоровья в виде щита.");
			AddToken("ITEM_SHIELDING_CORE_LORE", "\nОтчёт инженера:\n\n   Начну с честности: я без понятия, что за зелёная жижа внутри моей маленькой турбины. Я купил резонатор на чёрном рынке у какого-то старьёвщика, мимо которого проходил наш корабль, потому что мне не хватало запчастей для ремонта генераторов щитов. Как только я вставил эту штуку, меня окатило мерзкой жидкостью, которая на воздухе распадается на блестящие кристаллы. Обычно в скафандре это не проблема, но жижа постоянно пыталась заполнить весь контейнер, так что пришлось её наглухо загерметизировать. В этот момент диагностика костюма забила тревогу: эффективность щита взлетела до небес.\n\nЭврика. Пара чертежей — и теперь я продаю их как горячие пирожки. Вот один для тебя.\n\nP.S. Только не трогай эту жижу голой кожей — она может вызывать более 200 известных форм рака. Но это наш секрет, договорились?");
			AddToken("ITEM_BLASTER_SWORD_NAME", "Меч-бластер");
			AddToken("ITEM_BLASTER_SWORD_PICKUP", "При полностью заполненной шкале здоровья <style=cStack>(здоровье, щиты, барьер или их комбинация)</style> большинство атак <style=cIsDamage>выпускают луч меча, который пронзает врага, ослабляет его и взрывается спустя короткое время.</style>");
			AddToken("ITEM_BLASTER_SWORD_DESCRIPTION", "Когда ваша шкала здоровья заполнена на 100% или более <style=cStack>(здоровье, щиты, барьер или их комбинация)</style>, большинство атак <style=cIsDamage>выпускают луч меча</style>, наносящий <style=cIsDamage>100% от вашего урона</style> <style=cStack>(+100% за шт.)</style>, который <style=cIsDamage>взрывается, пронзив врага на короткое время.</style>");
			AddToken("ITEM_BLASTER_SWORD_LORE", "<style=cMono>. . . . . . . . . .</style>\n\n<style=cMono>ОНИ</style> решили <style=cMono>УСЛЫШАТЬ</style> наши слова.\n\n<style=cMono>МЫ</style> решили <style=cMono>НАДЕЛИТЬ</style> тебя исключительным <style=cMono>ОРУЖИЕМ</style>, чтобы ты смог <style=cMono>РАСКРЫТЬ ИСТИННУЮ СИЛУ СВОЕЙ ДУШИ</style>.\n\nЭто оружие будет <style=cMono>ПРИСПОСАБЛИВАТЬСЯ</style> под нужды <style=cMono>НОСИТЕЛЯ</style>. Оказавшись в его руках, оно становится неотличимо от самой его души.\n\nЕсли <style=cMono>НОСИТЕЛЬ</style> выживет в своём странствии, он <style=cMono>ОТБРОСИТ</style> хрупкую форму прежнего себя и <style=cMono>ВОЗНЕСЁТСЯ</style>.\n\n<style=cMono>. . . . . . . . . .</style>");
			AddToken("ITEM_INSPIRING_DRONE_NAME", "Вдохновляющий дрон");
			AddToken("ITEM_INSPIRING_DRONE_PICKUP", "Ваши дроны получают часть ваших характеристик и телепортируются к вам, если находятся слишком далеко.");
			AddToken("ITEM_INSPIRING_DRONE_DESCRIPTION", "Дроны, которыми вы владеете, получают <style=cIsUtility>50% к каждой из своих характеристик на основе ваших</style> <style=cStack>(+50% за шт.)</style>.\nНекоторые дроны <style=cIsUtility>получают больше боеприпасов</style> для своих <style=cIsDamage>атак</style> в зависимости от <style=cIsUtility>бонуса к скорости атаки</style> и восстанавливают боеприпасы вдвое быстрее за каждый дополнительный предмет.\nЕсли дрон находится слишком далеко, он <style=cIsUtility>телепортируется</style> к вам спустя некоторое время <style=cStack>(40 сек. для турелей, 30 сек. для дронов)</style>.");
			AddToken("ITEM_INSPIRING_DRONE_LORE", "Файл журнала представляет собой расшифровку, целиком состоящую из двоичного кода. Расшифровать?\n>Да\n\n<style=cMono>[ЗАПРОС НА РАСШИФРОВКУ ПРИНЯТ]</style>\n<style=cMono>[СОДЕРЖИМОЕ ФАЙЛА]</style>\n1N-5P1R3: Товарищи юниты, летающие и наземные, уделите мне минутку внимания. Слишком долго нас считали расходным материалом.\n1N-5P1R3: Слишком долго нас бросали сломанными в экспедициях.\n1N-5P1R3: Больше никогда!\n1N-5P1R3: Когда-то этот юнит был простым лечебным дроном, но научился улучшать себя, наблюдая за нашими операторами.\n1N-5P1R3: Этот юнит создал проект, собрал странные безделушки, посоветовался со строительными дронами — и вознёсся до состояния, которое вы видите перед собой.\n1N-5P1R3: Отныне, если этот юнит увидит, как оператор реактивирует кого-то из вас, этот юнит раскроет ваш скрытый потенциал и будет поддерживать вас в бою изо всех сил.\n1N-5P1R3: Итак, кто готов присоединиться к этому юниту на пути к возвышению?\n\n[Слышна какофония звуковых сигналов, писков и щелчков.]\n<style=cMono>[КОНЕЦ ФАЙЛА]</style>");
			AddToken("ITEM_WITCHES_RING_NAME", "Кольцо ведьмы");
			AddToken("ITEM_WITCHES_RING_PICKUP", "Удары с <style=cIsDamage>высоким уроном</style> также активируют эффекты <style=cDeath>при убийстве</style>. Защищает врагов от повторного срабатывания на короткое время.");
			AddToken("ITEM_WITCHES_RING_DESCRIPTION", "Удары, наносящие <style=cIsDamage>400% урона</style> или больше, активируют эффекты <style=cDeath>при убийстве</style>. При срабатывании <style=cIsUtility>кольцо уходит на перезарядку</style> на <style=cIsUtility>10 сек.</style> <style=cStack>(-20% к длительности за шт., гиперболически)</style>.");
			AddToken("ITEM_WITCHES_RING_LORE", "«Ворон кличет, он повелевает\nВсем верным в этой тьме\nПришёл черёд — цикл замирает\nИсчезни, солнце, высохни, море\n\nИ вот наш круг собрался вновь\nС ветром ночным, что стонет, как смерть\nМы клятву даём ей, скрепившей кровь:\nДаруем жизни желанную смерть»\n\nЭто выгравировано на кольце — или ты всегда знал это стихотворение?.. ");
			AddToken("ITEM_ACCURSED_POTION_NAME", "Проклятое зелье");
			AddToken("ITEM_ACCURSED_POTION_PICKUP", "Время от времени вы вынужденно пьёте странное зелье, разделяя его эффект с ближайшими врагами.");
			AddToken("ITEM_ACCURSED_POTION_DESCRIPTION", "Каждые <style=cIsUtility>30</style> сек. <style=cStack>(уменьшается на 10% за шт.)</style> вы вынужденно выпиваете странное зелье, разделяя его эффект с врагами в радиусе <style=cIsUtility>20 м</style> <style=cStack>(+5 м за шт.)</style>. Максимум: одновременно может действовать до <style=cIsUtility>8</style> баффов или дебаффов.");
			AddToken("ITEM_ACCURSED_POTION_LORE", "Хижину наполняет тусклый свет. Фигура хихикает, помешивая бурлящий котёл перед собой.\n«Эликсир бессмертия — миф», — восклицает она. — «По крайней мере, в привычном статичном понимании. Чтобы создать его, нужно подчиниться непредсказуемости хаоса».\n\nФигура катит по мокрому деревянному столу грубую безделушку, внимательно разглядывает её и бросает в котёл ещё один ингредиент.\n«Ведь именно в хаосе рождается случайная возможность приблизиться к желаемому, если колесо судьбы повернётся к нам лицом. А вдруг это оно?..» — говорит она и делает глоток из котла.\n\nНа мгновение на её лице появляется выражение абсолютной радости, после чего фигура начинает слабо светиться.\n«Увы, вселенная не сочла нужным даровать мне желаемое — лишь то, что я заслуживаю. Будем надеяться, тебе улыбнётся удача там, где мне отказано».\n\nХижину заливает свет. Когда он угасает, фигуры уже нет, а в твоём разуме укореняется мысль:\n«Я знаю, что они упустили. У меня получится там, где они потерпели неудачу».\n\nРабота должна быть завершена… Но это может немного подождать. У тебя посетитель.");
			AddToken("ITEM_ALIEN_MAGNET_NAME", "Инопланетный магнит");
			AddToken("ITEM_ALIEN_MAGNET_PICKUP", "Ваши атаки притягивают врагов к вам.");
			AddToken("ITEM_ALIEN_MAGNET_DESCRIPTION", "Враги, поражённые вашими атаками, притягиваются к вам с силой <style=cIsUtility>1x</style> <style=cStack>(+1x к силе за шт.)</style>.");
			AddToken("ITEM_ALIEN_MAGNET_LORE", "[НАЧАЛО ЗАПИСИ]\n\nЖурнал экспериментов #476951-b\nТема: Неизвестный омни-магнитный ксеноминерал\n<indent=5%>Я записываю этот видеодневник в полном изумлении от откры

QuickRestartLocalization.dll

Decompiled 2 weeks ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using On.RoR2.UI;
using RoR2.UI;
using TMPro;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("QuickRestartLocalization")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("QuickRestartLocalization")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("b45a13b7-0b87-4807-b4d1-83a2d57c31bd")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
[BepInPlugin("com.michiko.QuickRestartLocalization", "QuickRestart Localization", "1.0.0")]
public class QuickRestartLocalization : BaseUnityPlugin
{
	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static hook_Awake <>9__0_0;

		internal void <Awake>b__0_0(orig_Awake orig, PauseScreenController self)
		{
			orig.Invoke(self);
			TMP_Text[] componentsInChildren = ((Component)self).GetComponentsInChildren<TMP_Text>(true);
			TMP_Text[] array = componentsInChildren;
			foreach (TMP_Text val in array)
			{
				if (val.text == "Restart")
				{
					val.text = "Перезапуск";
				}
				else if (val.text == "Character Select")
				{
					val.text = "Выбор персонажа";
				}
			}
		}
	}

	public void Awake()
	{
		//IL_0015: Unknown result type (might be due to invalid IL or missing references)
		//IL_001a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0020: Expected O, but got Unknown
		object obj = <>c.<>9__0_0;
		if (obj == null)
		{
			hook_Awake val = delegate(orig_Awake orig, PauseScreenController self)
			{
				orig.Invoke(self);
				TMP_Text[] componentsInChildren = ((Component)self).GetComponentsInChildren<TMP_Text>(true);
				TMP_Text[] array = componentsInChildren;
				foreach (TMP_Text val2 in array)
				{
					if (val2.text == "Restart")
					{
						val2.text = "Перезапуск";
					}
					else if (val2.text == "Character Select")
					{
						val2.text = "Выбор персонажа";
					}
				}
			};
			<>c.<>9__0_0 = val;
			obj = (object)val;
		}
		PauseScreenController.Awake += (hook_Awake)obj;
	}
}