diff --git a/.github/RELEASE_TEMPLATE/content.md b/.github/RELEASE_TEMPLATE/content.md index bc1c8172..022e6074 100644 --- a/.github/RELEASE_TEMPLATE/content.md +++ b/.github/RELEASE_TEMPLATE/content.md @@ -47,5 +47,6 @@ This is an universal installer for the trainer. In most cases you just need to r - `Installer -c ` to disable a command. Example: `Installer -c Spawn`. - `Installer uninstall` to remove the trainer. - `Installer uninstall "C:\Battlestate Games\EFT"` to remove the trainer, adding `C:\Battlestate Games\EFT` to the search list. +- `Installer -l ` to compile the trainer for a specific language (like `fr`). See the supported ones [here](https://github.com/sailro/EscapeFromTarkov-Trainer/tree/master/Properties). [![Sponsor](https://img.shields.io/badge/sponsor-%E2%9D%A4-lightgrey?logo=github&style=flat-square)](https://github.com/sponsors/sailro) \ No newline at end of file diff --git a/BepInExPlugin/Properties/AssemblyInfo.cs b/BepInExPlugin/Properties/AssemblyInfo.cs index 5af089eb..3600335a 100644 --- a/BepInExPlugin/Properties/AssemblyInfo.cs +++ b/BepInExPlugin/Properties/AssemblyInfo.cs @@ -2,4 +2,4 @@ [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyProduct("EFT Trainer, BepInEx plugin")] -[assembly: AssemblyCopyright("Copyright © 2023 Sebastien Lebreton")] +[assembly: AssemblyCopyright("Copyright © 2024 Sebastien Lebreton")] diff --git a/Configuration/ConfigurationManager.cs b/Configuration/ConfigurationManager.cs index ebb4fc69..2c517863 100644 --- a/Configuration/ConfigurationManager.cs +++ b/Configuration/ConfigurationManager.cs @@ -4,6 +4,7 @@ using System.Reflection; using System.Text; using EFT.Trainer.Features; +using EFT.Trainer.Properties; using EFT.UI; using Newtonsoft.Json; @@ -28,7 +29,7 @@ public static void Load(string filename, Feature[] features, bool warnIfNotExist if (!File.Exists(filename)) { if (warnIfNotExists) - AddConsoleLog($"{filename} not found!"); + AddConsoleLog(string.Format(Strings.ErrorFileNotFoundFormat, filename)); return; } @@ -54,16 +55,16 @@ public static void Load(string filename, Feature[] features, bool warnIfNotExist } catch (JsonException) { - AddConsoleLog($"{key} seems corrupted in {filename}. Please fix.".Red()); + AddConsoleLog(string.Format(Strings.ErrorCorruptedPropertyFormat, key, filename).Red()); } } } - AddConsoleLog($"Loaded {filename}"); + AddConsoleLog(string.Format(Strings.CommandLoadSuccessFormat, filename)); } catch (Exception ioe) { - AddConsoleLog($"Unable to load {filename}. {ioe.Message}".Red()); + AddConsoleLog(string.Format(Strings.ErrorCannotLoadFormat, filename, ioe.Message).Red()); } } @@ -73,7 +74,7 @@ public static void LoadPropertyValue(string filename, Feature feature, string pr { if (!File.Exists(filename)) { - AddConsoleLog($"{filename} not found!"); + AddConsoleLog(string.Format(Strings.ErrorFileNotFoundFormat, filename).Red()); return; } @@ -89,14 +90,14 @@ public static void LoadPropertyValue(string filename, Feature feature, string pr } catch (JsonException) { - AddConsoleLog($"{filename} seems corrupted. Please fix.".Red()); + AddConsoleLog(string.Format(Strings.ErrorCorruptedFileFormat, filename).Red()); } - AddConsoleLog($"Loaded {filename}"); + AddConsoleLog(string.Format(Strings.CommandLoadSuccessFormat, filename)); } catch (Exception ioe) { - AddConsoleLog($"Unable to load {filename}. {ioe.Message}".Red()); + AddConsoleLog(string.Format(Strings.ErrorCannotLoadFormat, filename, ioe.Message).Red()); } } @@ -105,9 +106,7 @@ public static void Save(string filename, Feature[] features) try { var content = new StringBuilder(); - content.AppendLine("; Be careful when updating this file :)"); - content.AppendLine("; For keys, use https://docs.unity3d.com/ScriptReference/KeyCode.html"); - content.AppendLine("; Colors are stored as an array of 'RGBA' floats"); + content.AppendLine(Comment(Strings.CommandSaveHeader)); content.AppendLine(); foreach (var feature in features.OrderBy(f => f.GetType().FullName)) @@ -120,9 +119,9 @@ public static void Save(string filename, Feature[] features) var key = $"{featureType.FullName}.{op.Property.Name}"; var value = JsonConvert.SerializeObject(op.Property.GetValue(feature), Formatting.None, Converters); - var comment = op.Attribute.Comment; - if (!string.IsNullOrEmpty(comment)) - content.AppendLine($"; {comment}"); + var resourceId = op.Attribute.CommentResourceId; + if (!string.IsNullOrEmpty(resourceId)) + content.AppendLine(Comment(Strings.ResourceManager.GetString(resourceId))); content.AppendLine($"{key}={value}"); } @@ -132,14 +131,24 @@ public static void Save(string filename, Feature[] features) } File.WriteAllText(filename, content.ToString()); - AddConsoleLog($"Saved {filename}"); + AddConsoleLog(string.Format(Strings.CommandSaveSuccessFormat, filename)); } catch (Exception ioe) { - AddConsoleLog($"Unable to save {filename}. {ioe.Message}".Red()); + AddConsoleLog(string.Format(Strings.ErrorCannotSaveFormat, filename, ioe.Message).Red()); } } + private static string Comment(string? value) + { + if (string.IsNullOrEmpty(value)) + return string.Empty; + + const string commentToken = "; "; + + return commentToken + value!.Replace(Environment.NewLine, Environment.NewLine + commentToken); + } + public static void SavePropertyValue(string filename, Feature feature, string propertyName) { try @@ -150,11 +159,11 @@ public static void SavePropertyValue(string filename, Feature feature, string pr var content = JsonConvert.SerializeObject(tlProperty.Property.GetValue(feature), Formatting.Indented, Converters); File.WriteAllText(filename, content); - AddConsoleLog($"Saved {filename}"); + AddConsoleLog(string.Format(Strings.CommandSaveSuccessFormat, filename)); } catch (Exception ioe) { - AddConsoleLog($"Unable to save {filename}. {ioe.Message}".Red()); + AddConsoleLog(string.Format(Strings.ErrorCannotSaveFormat, filename, ioe.Message).Red()); } } diff --git a/Configuration/ConfigurationPropertyAttribute.cs b/Configuration/ConfigurationPropertyAttribute.cs index 7466d0d4..64101e75 100644 --- a/Configuration/ConfigurationPropertyAttribute.cs +++ b/Configuration/ConfigurationPropertyAttribute.cs @@ -9,6 +9,6 @@ public class ConfigurationPropertyAttribute : Attribute { public bool Skip { get; set; } = false; public int Order { get; set; } = int.MaxValue; - public string Comment { get; set; } = string.Empty; + public string CommentResourceId { get; set; } = string.Empty; public bool Browsable { get; set; } = true; } diff --git a/Configuration/TrackedItemConverter.cs b/Configuration/TrackedItemConverter.cs index 0d609b58..8045f1ef 100644 --- a/Configuration/TrackedItemConverter.cs +++ b/Configuration/TrackedItemConverter.cs @@ -1,5 +1,6 @@ using System; using EFT.Trainer.Features; +using EFT.Trainer.Properties; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -27,7 +28,7 @@ public override object ReadJson(JsonReader reader, Type objectType, object? exis { string name => new TrackedItem(name), JObject jobject => jobject.ToObject()!, - _ => new TrackedItem("corrupted trainer.ini") + _ => new TrackedItem(string.Format(Strings.ErrorCorruptedFileFormat, "trainer.ini")) }; } diff --git a/ConsoleCommands/BaseListCommand.cs b/ConsoleCommands/BaseListCommand.cs index 27c23696..4d373373 100644 --- a/ConsoleCommands/BaseListCommand.cs +++ b/ConsoleCommands/BaseListCommand.cs @@ -7,6 +7,7 @@ using EFT.InventoryLogic; using EFT.Trainer.Extensions; using EFT.Trainer.Features; +using EFT.Trainer.Properties; using JsonType; #nullable enable @@ -62,14 +63,14 @@ private void ListLootItems(Match match, ELootRarity? rarityFilter = null) if (rarityFilter.HasValue && rarityFilter.Value != rarity) continue; - var extra = rarity != ELootRarity.Not_exist ? $" ({rarity.Color()})" : string.Empty; - AddConsoleLog($"{itemName} [{list.Count.ToString().Cyan()}]{extra}"); + var extra = rarity != ELootRarity.Not_exist ? string.Format(Strings.CommandListRarityFormat, rarity.Color()) : string.Empty; + AddConsoleLog(string.Format(Strings.CommandListEnumerateFormat, itemName, list.Count.ToString().Cyan(), extra)); count += list.Count; } - AddConsoleLog("------"); - AddConsoleLog($"found {count.ToString().Cyan()} item(s)"); + AddConsoleLog(Strings.TextSeparator); + AddConsoleLog(string.Format(Strings.CommandListSuccessFormat, count.ToString().Cyan())); } private static void FindItemsInRootItem(Dictionary> itemsPerName, Item? rootItem) diff --git a/ConsoleCommands/ConsoleCommandWithArgument.cs b/ConsoleCommands/ConsoleCommandWithArgument.cs index 9278d20f..9061d0ee 100644 --- a/ConsoleCommands/ConsoleCommandWithArgument.cs +++ b/ConsoleCommands/ConsoleCommandWithArgument.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using EFT.Trainer.Properties; using EFT.UI; #nullable enable @@ -20,7 +21,7 @@ internal abstract class ConsoleCommandWithArgument : ConsoleCommand public override void Register() { #if DEBUG - AddConsoleLog($"Registering {Name} command with arguments..."); + AddConsoleLog(string.Format(Strings.DebugRegisteringCommandWithArgumentsFormat, Name)); #endif ConsoleScreen.Processor.RegisterCommand(Name, (string args) => { @@ -31,7 +32,7 @@ public override void Register() } else { - ConsoleScreen.LogError("Invalid arguments"); + AddConsoleLog(Strings.ErrorInvalidArguments.Red()); } }); } diff --git a/ConsoleCommands/ConsoleCommandWithoutArgument.cs b/ConsoleCommands/ConsoleCommandWithoutArgument.cs index 4c043726..9c1c9f0e 100644 --- a/ConsoleCommands/ConsoleCommandWithoutArgument.cs +++ b/ConsoleCommands/ConsoleCommandWithoutArgument.cs @@ -1,4 +1,5 @@ -using EFT.UI; +using EFT.Trainer.Properties; +using EFT.UI; #nullable enable @@ -11,7 +12,7 @@ internal abstract class ConsoleCommandWithoutArgument : ConsoleCommand public override void Register() { #if DEBUG - AddConsoleLog($"Registering {Name} command..."); + AddConsoleLog(string.Format(Strings.DebugRegisteringCommandFormat, Name)); #endif ConsoleScreen.Processor.RegisterCommand(Name, Execute); } diff --git a/ConsoleCommands/Dump.cs b/ConsoleCommands/Dump.cs index b0ec9e84..3a27509d 100644 --- a/ConsoleCommands/Dump.cs +++ b/ConsoleCommands/Dump.cs @@ -1,6 +1,7 @@ using System; using System.IO; using EFT.Trainer.Features; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; using UnityEngine.SceneManagement; @@ -12,7 +13,7 @@ namespace EFT.Trainer.ConsoleCommands; [UsedImplicitly] internal class Dump : ConsoleCommandWithoutArgument { - public override string Name => "dump"; + public override string Name => Strings.CommandDump; public override void Execute() { @@ -21,7 +22,7 @@ public override void Execute() Directory.CreateDirectory(thisDump); - AddConsoleLog("Dumping scenes..."); + AddConsoleLog(Strings.CommandDumpScenes); for (int i = 0; i < SceneManager.sceneCount; i++) { var scene = SceneManager.GetSceneAt(i); @@ -32,7 +33,7 @@ public override void Execute() File.WriteAllText(Path.Combine(thisDump, GetSafeFilename($"@scene - {scene.name}.txt")), json); } - AddConsoleLog("Dumping game objects..."); + AddConsoleLog(Strings.CommandDumpGameObjects); foreach (var go in UnityEngine.Object.FindObjectsOfType()) { if (go == null || go.transform.parent != null || !go.activeSelf) @@ -43,7 +44,7 @@ public override void Execute() File.WriteAllText(Path.Combine(thisDump, filename), json); } - AddConsoleLog($"Dump created in {thisDump}"); + AddConsoleLog(string.Format(Strings.CommandDumpSuccessFormat, thisDump)); } private static string GetSafeFilename(string filename) diff --git a/ConsoleCommands/List.cs b/ConsoleCommands/List.cs index 2f364ec6..580a7914 100644 --- a/ConsoleCommands/List.cs +++ b/ConsoleCommands/List.cs @@ -1,4 +1,5 @@ -using JetBrains.Annotations; +using EFT.Trainer.Properties; +using JetBrains.Annotations; #nullable enable @@ -7,5 +8,5 @@ namespace EFT.Trainer.ConsoleCommands; [UsedImplicitly] internal class List : BaseListCommand { - public override string Name => "list"; + public override string Name => Strings.CommandList; } diff --git a/ConsoleCommands/ListRare.cs b/ConsoleCommands/ListRare.cs index 5d297226..200330ec 100644 --- a/ConsoleCommands/ListRare.cs +++ b/ConsoleCommands/ListRare.cs @@ -1,4 +1,5 @@ -using JetBrains.Annotations; +using EFT.Trainer.Properties; +using JetBrains.Annotations; using JsonType; #nullable enable @@ -8,6 +9,6 @@ namespace EFT.Trainer.ConsoleCommands; [UsedImplicitly] internal class ListRare : BaseListCommand { - public override string Name => "listr"; + public override string Name => Strings.CommandListRare; protected override ELootRarity? Rarity => ELootRarity.Rare; } diff --git a/ConsoleCommands/ListSuperRare.cs b/ConsoleCommands/ListSuperRare.cs index 2dedb987..02b4628d 100644 --- a/ConsoleCommands/ListSuperRare.cs +++ b/ConsoleCommands/ListSuperRare.cs @@ -1,4 +1,5 @@ -using JetBrains.Annotations; +using EFT.Trainer.Properties; +using JetBrains.Annotations; using JsonType; #nullable enable @@ -8,6 +9,6 @@ namespace EFT.Trainer.ConsoleCommands; [UsedImplicitly] internal class ListSuperRare : BaseListCommand { - public override string Name => "listsr"; + public override string Name => Strings.CommandListSuperRare; protected override ELootRarity? Rarity => ELootRarity.Superrare; } diff --git a/ConsoleCommands/LoadTrackList.cs b/ConsoleCommands/LoadTrackList.cs index aeef24d3..42178aa5 100644 --- a/ConsoleCommands/LoadTrackList.cs +++ b/ConsoleCommands/LoadTrackList.cs @@ -1,5 +1,6 @@ using System.Text.RegularExpressions; using EFT.Trainer.Configuration; +using EFT.Trainer.Properties; using JetBrains.Annotations; #nullable enable @@ -9,7 +10,7 @@ namespace EFT.Trainer.ConsoleCommands; [UsedImplicitly] internal class LoadTrackList : BaseTrackListCommand { - public override string Name => "loadtl"; + public override string Name => Strings.CommandLoadTrackList; public override void Execute(Match match) { diff --git a/ConsoleCommands/SaveTrackList.cs b/ConsoleCommands/SaveTrackList.cs index 4129cfb3..a1474c91 100644 --- a/ConsoleCommands/SaveTrackList.cs +++ b/ConsoleCommands/SaveTrackList.cs @@ -1,5 +1,6 @@ using System.Text.RegularExpressions; using EFT.Trainer.Configuration; +using EFT.Trainer.Properties; using JetBrains.Annotations; #nullable enable @@ -9,7 +10,7 @@ namespace EFT.Trainer.ConsoleCommands; [UsedImplicitly] internal class SaveTrackList : BaseTrackListCommand { - public override string Name => "savetl"; + public override string Name => Strings.CommandSaveTrackList; public override void Execute(Match match) { diff --git a/ConsoleCommands/Spawn.cs b/ConsoleCommands/Spawn.cs index 8da25ba1..f59e2bd0 100644 --- a/ConsoleCommands/Spawn.cs +++ b/ConsoleCommands/Spawn.cs @@ -6,6 +6,7 @@ using EFT.CameraControl; using EFT.Trainer.Extensions; using EFT.Trainer.Features; +using EFT.Trainer.Properties; using JetBrains.Annotations; #nullable enable @@ -15,7 +16,7 @@ namespace EFT.Trainer.ConsoleCommands; [UsedImplicitly] internal class Spawn : BaseTemplateCommand { - public override string Name => "spawn"; + public override string Name => Strings.CommandSpawn; public override void Execute(Match match) { @@ -33,14 +34,14 @@ public override void Execute(Match match) switch (templates.Length) { case 0: - AddConsoleLog("No template found!"); + AddConsoleLog(Strings.ErrorNoTemplateFound.Red()); return; case > 1: { foreach (var template in templates) - AddConsoleLog($"{template._id}: {template.ShortNameLocalizationKey.Localized().Green()} [{template.NameLocalizationKey.Localized()}]"); + AddConsoleLog(string.Format(Strings.CommandTemplateEnumerateFormat, template._id, template.ShortNameLocalizationKey.Localized().Green(), template.NameLocalizationKey.Localized())); - AddConsoleLog($"found {templates.Length.ToString().Cyan()} templates, be more specific"); + AddConsoleLog(string.Format(Strings.ErrorTooManyTemplatesFormat, templates.Length.ToString().Cyan())); return; } } @@ -56,7 +57,7 @@ public override void Execute(Match match) { if (task.IsFaulted) { - AddConsoleLog("Failed to load item bundle!"); + AddConsoleLog(Strings.ErrorFailedToLoadItemBundle.Red()); } else { @@ -64,7 +65,7 @@ public override void Execute(Match match) var item = itemFactory.CreateItem(MongoID.Generate(), tpl._id, null); if (item == null) { - AddConsoleLog("Failed to create item!"); + AddConsoleLog(Strings.ErrorFailedToCreateItem.Red()); } else { diff --git a/ConsoleCommands/Status.cs b/ConsoleCommands/Status.cs index 3b3daa3a..37968eac 100644 --- a/ConsoleCommands/Status.cs +++ b/ConsoleCommands/Status.cs @@ -1,4 +1,5 @@ using EFT.Trainer.Features; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -9,12 +10,14 @@ namespace EFT.Trainer.ConsoleCommands; [UsedImplicitly] internal class Status : ConsoleCommandWithoutArgument { - public override string Name => "status"; + public override string Name => Strings.CommandStatus; private static string GetFeatureHelpText(ToggleFeature feature) { - var toggleKey = feature.Key != KeyCode.None ? $" ({feature.Key} to toggle)" : string.Empty; - return $"{feature.Name} is {(feature.Enabled ? "on".Green() : "off".Red())}{toggleKey}"; + var toggleKey = feature.Key != KeyCode.None ? string.Format(Strings.CommandStatusTextToggleFormat, feature.Key) : string.Empty; + return string + .Format(Strings.CommandStatusTextFormat, feature.Name, feature.Enabled ? Strings.TextOn.Green() : Strings.TextOff.Red(), toggleKey) + .Trim(); } public override void Execute() diff --git a/ConsoleCommands/Template.cs b/ConsoleCommands/Template.cs index 01a4945a..948d5f46 100644 --- a/ConsoleCommands/Template.cs +++ b/ConsoleCommands/Template.cs @@ -2,6 +2,7 @@ using System.Text.RegularExpressions; using Comfort.Common; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; #nullable enable @@ -11,7 +12,7 @@ namespace EFT.Trainer.ConsoleCommands; [UsedImplicitly] internal class Template : BaseTemplateCommand { - public override string Name => "template"; + public override string Name => Strings.CommandTemplate; public override void Execute(Match match) { @@ -27,9 +28,9 @@ public override void Execute(Match match) var templates = FindTemplates(search).ToArray(); foreach (var template in templates) - AddConsoleLog($"{template._id}: {template.ShortNameLocalizationKey.Localized().Green()} [{template.NameLocalizationKey.Localized()}]"); + AddConsoleLog(string.Format(Strings.CommandTemplateEnumerateFormat, template._id, template.ShortNameLocalizationKey.Localized().Green(), template.NameLocalizationKey.Localized())); - AddConsoleLog("------"); - AddConsoleLog($"found {templates.Length.ToString().Cyan()} template(s)"); + AddConsoleLog(Strings.TextSeparator); + AddConsoleLog(string.Format(Strings.CommandTemplateSuccessFormat, templates.Length.ToString().Cyan())); } } diff --git a/ConsoleCommands/ToggleFeatureCommand.cs b/ConsoleCommands/ToggleFeatureCommand.cs index e9d0405c..f4274f67 100644 --- a/ConsoleCommands/ToggleFeatureCommand.cs +++ b/ConsoleCommands/ToggleFeatureCommand.cs @@ -1,5 +1,6 @@ using System.Text.RegularExpressions; using EFT.Trainer.Features; +using EFT.Trainer.Properties; #nullable enable @@ -8,7 +9,7 @@ namespace EFT.Trainer.ConsoleCommands; internal class ToggleFeatureCommand(ToggleFeature feature) : ConsoleCommandWithArgument { public override string Name => feature.Name; - public override string Pattern => $"(?<{ValueGroup}>(on)|(off))"; + public override string Pattern => $"(?<{ValueGroup}>({Strings.TextOn})|({Strings.TextOff}))"; public override void Execute(Match match) { @@ -16,11 +17,7 @@ public override void Execute(Match match) if (matchGroup is not {Success: true}) return; - feature.Enabled = matchGroup.Value switch - { - "on" => true, - "off" => false, - _ => feature.Enabled - }; + var value = matchGroup.Value; + feature.Enabled = value == Strings.TextOn; } } diff --git a/ConsoleCommands/Track.cs b/ConsoleCommands/Track.cs index 221a2833..41a4638c 100644 --- a/ConsoleCommands/Track.cs +++ b/ConsoleCommands/Track.cs @@ -1,4 +1,5 @@ -using JetBrains.Annotations; +using EFT.Trainer.Properties; +using JetBrains.Annotations; #nullable enable @@ -7,5 +8,5 @@ namespace EFT.Trainer.ConsoleCommands; [UsedImplicitly] internal class Track : BaseTrackCommand { - public override string Name => "track"; + public override string Name => Strings.CommandTrack; } diff --git a/ConsoleCommands/TrackList.cs b/ConsoleCommands/TrackList.cs index 5f0731ee..d074a034 100644 --- a/ConsoleCommands/TrackList.cs +++ b/ConsoleCommands/TrackList.cs @@ -1,4 +1,5 @@ using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; #nullable enable @@ -8,7 +9,7 @@ namespace EFT.Trainer.ConsoleCommands; [UsedImplicitly] internal class TrackList : ConsoleCommandWithoutArgument { - public override string Name => "tracklist"; + public override string Name => Strings.CommandTrackList; public override void Execute() { @@ -19,15 +20,15 @@ public override void Execute() internal static void ShowTrackList(ConsoleCommand command, Features.LootItems lootItems, bool changed = false) { if (changed) - command.AddConsoleLog("Tracking list updated..."); + command.AddConsoleLog(Strings.CommandTrackListUpdated); foreach (var templateId in lootItems.Wishlist) - command.AddConsoleLog($"Tracking: {templateId.LocalizedShortName()} (Wishlist)"); + command.AddConsoleLog(string.Format(Strings.CommandTrackListWishListEnumerateFormat, templateId.LocalizedShortName())); foreach (var item in lootItems.TrackedNames) { - var extra = item.Rarity.HasValue ? $" ({item.Rarity.Value.Color()})" : string.Empty; - command.AddConsoleLog(item.Color.HasValue ? $"Tracking: {item.Name.Color(item.Color.Value)}{extra}" : $"Tracking: {item.Name}{extra}"); + var extra = item.Rarity.HasValue ? string.Format(Strings.CommandTrackListRarityFormat, item.Rarity.Value.Color()) : string.Empty; + command.AddConsoleLog(string.Format(Strings.CommandTrackListEnumerateFormat, item.Color.HasValue ? item.Name.Color(item.Color.Value) : item.Name, extra)); } } } diff --git a/ConsoleCommands/TrackRare.cs b/ConsoleCommands/TrackRare.cs index 58dfd6d4..06292f33 100644 --- a/ConsoleCommands/TrackRare.cs +++ b/ConsoleCommands/TrackRare.cs @@ -1,4 +1,5 @@ -using JetBrains.Annotations; +using EFT.Trainer.Properties; +using JetBrains.Annotations; using JsonType; #nullable enable @@ -8,6 +9,6 @@ namespace EFT.Trainer.ConsoleCommands; [UsedImplicitly] internal class TrackRare : BaseTrackCommand { - public override string Name => "trackr"; + public override string Name => Strings.CommandTrackRare; protected override ELootRarity? Rarity => ELootRarity.Rare; } diff --git a/ConsoleCommands/TrackSuperRare.cs b/ConsoleCommands/TrackSuperRare.cs index 8d76abdd..91cce15d 100644 --- a/ConsoleCommands/TrackSuperRare.cs +++ b/ConsoleCommands/TrackSuperRare.cs @@ -1,4 +1,5 @@ -using JetBrains.Annotations; +using EFT.Trainer.Properties; +using JetBrains.Annotations; using JsonType; #nullable enable @@ -8,6 +9,6 @@ namespace EFT.Trainer.ConsoleCommands; [UsedImplicitly] internal class TrackSuperRare : BaseTrackCommand { - public override string Name => "tracksr"; + public override string Name => Strings.CommandTrackSuperRare; protected override ELootRarity? Rarity => ELootRarity.Superrare; } diff --git a/ConsoleCommands/UnTrack.cs b/ConsoleCommands/UnTrack.cs index 8a893ff8..9f124473 100644 --- a/ConsoleCommands/UnTrack.cs +++ b/ConsoleCommands/UnTrack.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using EFT.Trainer.Properties; using JetBrains.Annotations; #nullable enable @@ -8,7 +9,7 @@ namespace EFT.Trainer.ConsoleCommands; [UsedImplicitly] internal class UnTrack : BaseTrackCommand { - public override string Name => "untrack"; + public override string Name => Strings.CommandUnTrack; public override void Execute(Match match) { diff --git a/EFT.Trainer.sln b/EFT.Trainer.sln index a1e18885..9e37f211 100644 --- a/EFT.Trainer.sln +++ b/EFT.Trainer.sln @@ -5,7 +5,7 @@ VisualStudioVersion = 17.4.33205.214 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NLog.EFT.Trainer", "NLog.EFT.Trainer.csproj", "{F4EB56B6-F914-11E9-AAD5-362B9E155667}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Installer", "Installer\Installer.csproj", "{C7DC685F-89CE-4BA1-8F95-41DA8E18F585}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Installer", "Installer\Installer.csproj", "{C7DC685F-89CE-4BA1-8F95-41DA8E18F585}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BepInExPlugin", "BepInExPlugin\BepInExPlugin.csproj", "{00C66BBD-ED7F-4E01-B7E4-0388F76FD31C}" EndProject diff --git a/Features/Aimbot.cs b/Features/Aimbot.cs index 48515716..3f54a6f1 100644 --- a/Features/Aimbot.cs +++ b/Features/Aimbot.cs @@ -4,6 +4,7 @@ using EFT.InventoryLogic; using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using EFT.Trainer.UI; using JetBrains.Annotations; using UnityEngine; @@ -15,8 +16,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Aimbot : HoldFeature { - public override string Name => "aimbot"; - public override string Description => "Aimbot. Automatic aiming and/or shooting (SilentAim)."; + public override string Name => Strings.FeatureAimbotName; + public override string Description => Strings.FeatureAimbotDescription; public override KeyCode Key { get; set; } = KeyCode.Slash; diff --git a/Features/Ammunition.cs b/Features/Ammunition.cs index 974ddfd2..8c1b6779 100644 --- a/Features/Ammunition.cs +++ b/Features/Ammunition.cs @@ -3,6 +3,7 @@ using EFT.Ballistics; using EFT.InventoryLogic; using EFT.Trainer.Model; +using EFT.Trainer.Properties; using JetBrains.Annotations; #nullable enable @@ -12,8 +13,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Ammunition : ToggleFeature { - public override string Name => "ammo"; - public override string Description => "Unlimited ammo."; + public override string Name => Strings.FeatureAmmunitionName; + public override string Description => Strings.FeatureAmmunitionDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/AutomaticGun.cs b/Features/AutomaticGun.cs index 1b9f6388..8db5363b 100644 --- a/Features/AutomaticGun.cs +++ b/Features/AutomaticGun.cs @@ -1,6 +1,7 @@ using EFT.InventoryLogic; using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; #nullable enable @@ -10,8 +11,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class AutomaticGun : ToggleFeature { - public override string Name => "autogun"; - public override string Description => "Force all guns (even bolt action guns) to use automatic firing mode with customizable fire rate."; + public override string Name => Strings.FeatureAutomaticGunName; + public override string Description => Strings.FeatureAutomaticGunDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/BaseMapToggleFeature.cs b/Features/BaseMapToggleFeature.cs index 7599935b..9be0fb78 100644 --- a/Features/BaseMapToggleFeature.cs +++ b/Features/BaseMapToggleFeature.cs @@ -42,7 +42,17 @@ internal abstract class BaseMapToggleFeature : ToggleFeature protected Camera? MapCamera => _mapCamera; - private static readonly string[] _directions = ["N", "NE", "E", "SE", "S", "SW", "W", "NW", "N"]; + private static readonly string[] _directions = [ + Properties.Strings.DirectionNorth, + Properties.Strings.DirectionNorthEast, + Properties.Strings.DirectionEast, + Properties.Strings.DirectionSouthEast, + Properties.Strings.DirectionSouth, + Properties.Strings.DirectionSouthWest, + Properties.Strings.DirectionWest, + Properties.Strings.DirectionNorthWest, + Properties.Strings.DirectionNorth + ]; protected void ToggleMapCameraIfNeeded(bool state) { diff --git a/Features/CachableFeature.cs b/Features/CachableFeature.cs index 8e0d6034..271f8ffa 100644 --- a/Features/CachableFeature.cs +++ b/Features/CachableFeature.cs @@ -53,7 +53,7 @@ private IEnumerator RefreshDataScheduler() } #if DEBUG_PERFORMANCE - AddConsoleLog($"Refreshed {GetType().Name} in {_stopwatch.ElapsedMilliseconds}ms"); + AddConsoleLog(string.Format(EFT.Trainer.Properties.Strings.DebugPerformanceRefreshedFormat, GetType().Name, _stopwatch.ElapsedMilliseconds)); #endif } diff --git a/Features/Commands.cs b/Features/Commands.cs index 18f777c8..4e1e4c4b 100644 --- a/Features/Commands.cs +++ b/Features/Commands.cs @@ -1,8 +1,10 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using EFT.Trainer.Configuration; using EFT.Trainer.ConsoleCommands; +using EFT.Trainer.Properties; using EFT.UI; using UnityEngine; @@ -12,8 +14,8 @@ namespace EFT.Trainer.Features; internal class Commands : FeatureRenderer { - public override string Name => "commands"; - public override string Description => "This main popup window."; + public override string Name => Strings.FeatureCommandsName; + public override string Description => Strings.FeatureCommandsDescription; [ConfigurationProperty(Skip = true)] // we do not want to offer save/load support for this public override bool Enabled { get; set; } = false; @@ -27,6 +29,7 @@ internal class Commands : FeatureRenderer public override KeyCode Key { get; set; } = KeyCode.RightAlt; private bool Registered { get; set; } = false; + private Dictionary PropertyDisplays { get; } = new(); protected override void Update() { @@ -39,9 +42,37 @@ protected override void Update() if (!PreloaderUI.Instantiated) return; + RegisterPropertyDisplays(); RegisterCommands(); } + private void RegisterPropertyDisplays() + { + const string prefix = nameof(OrderedProperty.Property); + + var properties = typeof(Strings) + .GetProperties(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public) + .Where(p => p.Name.StartsWith(prefix)); + + PropertyDisplays.Clear(); + + foreach (var property in properties) + { + var key = property.Name.Substring(prefix.Length); + var value = property.GetValue(null) as string ?? string.Empty; + + PropertyDisplays.Add(key, value); + } + } + + protected override string GetPropertyDisplay(string propertyName) + { + if (PropertyDisplays.TryGetValue(propertyName, out var value)) + return value; + + return $"!! [{propertyName}] !!"; // missing translation in Strings.resx + } + private void RegisterCommands() { foreach(var feature in Context.ToggleableFeatures.Value) @@ -58,10 +89,10 @@ private void RegisterCommands() command.Register(); // built-in commands - new BuiltInCommand("load", () => LoadSettings()) + new BuiltInCommand(Strings.CommandLoadName, () => LoadSettings()) .Register(); - new BuiltInCommand("save", SaveSettings) + new BuiltInCommand(Strings.CommandSaveName, SaveSettings) .Register(); // Load default configuration diff --git a/Features/CrossHair.cs b/Features/CrossHair.cs index 2d3801fa..dedd28d7 100644 --- a/Features/CrossHair.cs +++ b/Features/CrossHair.cs @@ -1,5 +1,6 @@ using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using EFT.Trainer.UI; using JetBrains.Annotations; using UnityEngine; @@ -11,8 +12,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class CrossHair : ToggleFeature { - public override string Name => "crosshair"; - public override string Description => "Crosshair with customizable size, color, thickness and auto-hide feature when aiming."; + public override string Name => Strings.FeatureCrosshairName; + public override string Description => Strings.FeatureCrosshairDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/Durability.cs b/Features/Durability.cs index 9dbbe726..18629c87 100644 --- a/Features/Durability.cs +++ b/Features/Durability.cs @@ -1,6 +1,7 @@ using System.Linq; using EFT.InventoryLogic; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; #nullable enable @@ -10,8 +11,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Durability : ToggleFeature { - public override string Name => "durability"; - public override string Description => "Maximum durability of items."; + public override string Name => Strings.FeatureDurabilityName; + public override string Description => Strings.FeatureDurabilityDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/Examine.cs b/Features/Examine.cs index 6723fa98..0dfd8cfe 100644 --- a/Features/Examine.cs +++ b/Features/Examine.cs @@ -1,4 +1,5 @@ using EFT.InventoryLogic; +using EFT.Trainer.Properties; using JetBrains.Annotations; #nullable enable @@ -8,8 +9,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Examine : ToggleFeature { - public override string Name => "examine"; - public override string Description => "All items already examined. Instant search."; + public override string Name => Strings.FeatureExamineName; + public override string Description => Strings.FeatureExamineDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/ExfiltrationPoints.cs b/Features/ExfiltrationPoints.cs index 99a493aa..a8f0df90 100644 --- a/Features/ExfiltrationPoints.cs +++ b/Features/ExfiltrationPoints.cs @@ -5,6 +5,7 @@ using EFT.Interactive; using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -15,8 +16,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class ExfiltrationPoints : PointOfInterests { - public override string Name => "exfil"; - public override string Description => "Exfiltration points with customizable colors given eligibility, status filter, distance."; + public override string Name => Strings.FeatureExfiltrationPointsName; + public override string Description => Strings.FeatureExfiltrationPointsDescription; [ConfigurationProperty(Order = 10)] public Color EligibleColor { get; set; } = Color.green; @@ -97,19 +98,19 @@ public override void RefreshData(List data) private static string GetName(ExfiltrationPoint point, bool isEligible) { var localizedName = point.Settings.Name.Localized(); - return !isEligible ? localizedName : $"{localizedName} ({GetStatus(point.Status)})"; + return !isEligible ? localizedName : string.Format(Strings.FeatureExfiltrationPointsEligibleFormat, localizedName, GetStatus(point.Status)); } public static string GetStatus(EExfiltrationStatus status) { return status switch { - EExfiltrationStatus.AwaitsManualActivation => "Activate", - EExfiltrationStatus.Countdown => "Timer", - EExfiltrationStatus.NotPresent => "Closed", - EExfiltrationStatus.Pending => "Pending", - EExfiltrationStatus.RegularMode => "Open", - EExfiltrationStatus.UncompleteRequirements => "Requirement", + EExfiltrationStatus.AwaitsManualActivation => Strings.FeatureExfiltrationPointsStatusActivate, + EExfiltrationStatus.Countdown => Strings.FeatureExfiltrationPointsStatusTimer, + EExfiltrationStatus.NotPresent => Strings.FeatureExfiltrationPointsStatusClosed, + EExfiltrationStatus.Pending => Strings.FeatureExfiltrationPointsStatusPending, + EExfiltrationStatus.RegularMode => Strings.FeatureExfiltrationPointsStatusOpen, + EExfiltrationStatus.UncompleteRequirements => Strings.FeatureExfiltrationPointsStatusRequirement, _ => string.Empty }; } diff --git a/Features/Feature.cs b/Features/Feature.cs index 3ed72bc9..c4b97820 100644 --- a/Features/Feature.cs +++ b/Features/Feature.cs @@ -35,20 +35,20 @@ public void HarmonyPrefix(HarmonyLib.Harmony harmony, Type originalType, string var original = HarmonyLib.AccessTools.Method(originalType, originalMethod, parameters); if (original == null) { - AddConsoleLog($"Cannot find original method {originalType}.{originalMethod}"); + AddConsoleLog(string.Format(Properties.Strings.ErrorCannotFindOriginalMethodFormat, $"{originalType}.{originalMethod}")); return; } var prefix = HarmonyLib.AccessTools.Method(GetType(), newMethod); if (prefix == null) { - AddConsoleLog($"Cannot find prefix method {newMethod}"); + AddConsoleLog(string.Format(Properties.Strings.ErrorCannotFindPrefixMethodFormat, newMethod)); return; } harmony.Patch(original, prefix: new HarmonyLib.HarmonyMethod(prefix)); #if DEBUG - AddConsoleLog($"Patched {originalType}.{originalMethod} with {GetType()}.{newMethod}"); + AddConsoleLog(string.Format(Properties.Strings.DebugPatchedMethodFormat, $"{originalType}.{originalMethod}", $"{GetType()}.{newMethod}")); #endif } @@ -57,20 +57,20 @@ public void HarmonyPostfix(HarmonyLib.Harmony harmony, Type originalType, string var original = HarmonyLib.AccessTools.Method(originalType, originalMethod); if (original == null) { - AddConsoleLog($"Cannot find original method {originalType}.{originalMethod}"); + AddConsoleLog(string.Format(Properties.Strings.ErrorCannotFindOriginalMethodFormat, $"{originalType}.{originalMethod}")); return; } var postfix = HarmonyLib.AccessTools.Method(GetType(), newMethod); if (postfix == null) { - AddConsoleLog($"Cannot find postfix method {newMethod}"); + AddConsoleLog(string.Format(Properties.Strings.ErrorCannotFindPostfixMethodFormat, newMethod)); return; } harmony.Patch(original, postfix: new HarmonyLib.HarmonyMethod(postfix)); #if DEBUG - AddConsoleLog($"Patched {originalType}.{originalMethod} with {GetType()}.{newMethod}"); + AddConsoleLog(string.Format(Properties.Strings.DebugPatchedMethodFormat, $"{originalType}.{originalMethod}", $"{GetType()}.{newMethod}")); #endif } diff --git a/Features/FeatureRenderer.cs b/Features/FeatureRenderer.cs index bb4d2b4b..533a1317 100644 --- a/Features/FeatureRenderer.cs +++ b/Features/FeatureRenderer.cs @@ -4,6 +4,7 @@ using System.Linq; using EFT.InputSystem; using EFT.Trainer.Configuration; +using EFT.Trainer.Properties; using EFT.Trainer.UI; using UnityEngine; @@ -44,7 +45,6 @@ private static float FixCoordinate(float coord, float maxValue, float defaultVal return coord; } - internal abstract class SelectionContext { protected SelectionContext(IFeature feature, OrderedProperty orderedProperty, float parentX, float parentY, Func> builder) @@ -81,7 +81,7 @@ protected override void OnGUIWhenEnabled() SetupInputNode(); _clientWindowRect = new Rect(X, Y, 490, _clientWindowRect.height); - _clientWindowRect = GUILayout.Window(0, _clientWindowRect, RenderFeatureWindow, "EFT Trainer", GUILayout.ExpandHeight(true), GUILayout.ExpandWidth(true)); + _clientWindowRect = GUILayout.Window(0, _clientWindowRect, RenderFeatureWindow, Strings.FeatureCommandsTitle , GUILayout.ExpandHeight(true), GUILayout.ExpandWidth(true)); X = _clientWindowRect.x; Y = _clientWindowRect.y; @@ -91,7 +91,7 @@ protected override void OnGUIWhenEnabled() _keyCodeSelectionContext = null; } - private static bool HandleSelectionContext(SelectionContext? context) + private bool HandleSelectionContext(SelectionContext? context) { if (context == null) return false; @@ -99,7 +99,7 @@ private static bool HandleSelectionContext(SelectionContext? context) var property = context.OrderedProperty.Property; var picker = context.Picker; - picker.DrawWindow(context.Id, property.Name); + picker.DrawWindow(context.Id, GetPropertyDisplay(property.Name)); property.SetValue(context.Feature, picker.Value); return picker.IsSelected; @@ -108,7 +108,7 @@ private static bool HandleSelectionContext(SelectionContext? context) private int _selectedTabIndex = 0; private void RenderFeatureWindow(int id) { - var fixedTabs = new[] {"[summary]"}; + var fixedTabs = new[] {Strings.FeatureRendererSummary}; var tabs = fixedTabs .Concat @@ -157,19 +157,19 @@ private static string RenderFeatureText(Feature feature) if (feature is not ToggleFeature toggleFeature || ConfigurationManager.IsSkippedProperty(feature, nameof(Enabled))) return feature.Name; - return $"{toggleFeature.Name} is {(toggleFeature.Enabled ? "on".Green() : "off".Red())}"; + return string.Format(Strings.CommandStatusTextFormat, feature.Name, toggleFeature.Enabled ? Strings.TextOn.Green() : Strings.TextOff.Red(), string.Empty); } private void RenderSummary() { GUILayout.BeginVertical(); - GUILayout.Label("Welcome to EFT Trainer !\n", DescriptionStyle); + GUILayout.Label($"{Strings.FeatureRendererWelcome}\n", DescriptionStyle); - if (GUILayout.Button("Load settings")) + if (GUILayout.Button(Strings.CommandLoadDescription)) LoadSettings(); - if (GUILayout.Button("Save settings")) + if (GUILayout.Button(Strings.CommandSaveDescription)) SaveSettings(); GUILayout.EndVertical(); @@ -220,7 +220,7 @@ private void RenderFeatureProperty(Feature feature, OrderedProperty orderedPrope GUILayout.FlexibleSpace(); GUILayout.BeginHorizontal(); - GUILayout.Label(property.Name, LabelStyle); + GUILayout.Label(GetPropertyDisplay(property.Name), LabelStyle); GUILayout.FlexibleSpace(); var currentValue = property.GetValue(feature); @@ -247,6 +247,8 @@ private void RenderFeatureProperty(Feature feature, OrderedProperty orderedPrope GUILayout.EndHorizontal(); } + protected abstract string GetPropertyDisplay(string propertyName); + private object RenderFeaturePropertyAsUIComponent(IFeature feature, OrderedProperty orderedProperty, object currentValue, GUILayoutOption width) { var property = orderedProperty.Property; @@ -305,7 +307,7 @@ private object RenderFeaturePropertyAsUIComponent(IFeature feature, OrderedPrope } - GUILayout.Label($"Unsupported type: {propertyType.FullName}"); + GUILayout.Label(string.Format(Strings.ErrorUnsupportedTypeFormat, propertyType.FullName)); break; } diff --git a/Features/FovChanger.cs b/Features/FovChanger.cs index eda2e918..8319f9b9 100644 --- a/Features/FovChanger.cs +++ b/Features/FovChanger.cs @@ -1,4 +1,5 @@ using EFT.Trainer.Configuration; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -7,8 +8,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class FovChanger : ToggleFeature { - public override string Name => "fovchanger"; - public override string Description => "Change Field Of View (FOV)."; + public override string Name => Strings.FeatureFovChangerName; + public override string Description => Strings.FeatureFovChangerDescription; [ConfigurationProperty(Order = 1)] public override bool Enabled { get; set; } = false; diff --git a/Features/FreeCamera.cs b/Features/FreeCamera.cs index b14e3419..c81ec933 100644 --- a/Features/FreeCamera.cs +++ b/Features/FreeCamera.cs @@ -1,5 +1,6 @@ using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -13,8 +14,8 @@ internal class FreeCamera : ToggleFeature private const string MouseXAxis = "Mouse X"; private const string MouseYAxis = "Mouse Y"; - public override string Name => "camera"; - public override string Description => "Free camera with fast mode and teleportation."; + public override string Name => Strings.FeatureCameraName; + public override string Description => Strings.FeatureCameraDescription; [ConfigurationProperty(Skip = true)] // we do not want to offer save/load support for this public override bool Enabled { get; set; } = false; diff --git a/Features/GameState.cs b/Features/GameState.cs index 7735d2de..d06c58e5 100644 --- a/Features/GameState.cs +++ b/Features/GameState.cs @@ -4,6 +4,7 @@ using Comfort.Common; using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -13,8 +14,8 @@ namespace EFT.Trainer.Features; internal class GameState : CachableFeature { - public override string Name => "gamestate"; - public override string Description => "Refresh all game information for other features."; + public override string Name => Strings.FeatureGameStateName; + public override string Description => Strings.FeatureGameStateDescription; public static GameStateSnapshot? Current { get; private set; } diff --git a/Features/Ghost.cs b/Features/Ghost.cs index de9f08f4..86e8f2ac 100644 --- a/Features/Ghost.cs +++ b/Features/Ghost.cs @@ -1,4 +1,5 @@ using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -9,8 +10,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Ghost : ToggleFeature { - public override string Name => "ghost"; - public override string Description => "Stop bots from seeing you."; + public override string Name => Strings.FeatureGhostName; + public override string Description => Strings.FeatureGhostDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/Grenades.cs b/Features/Grenades.cs index 929b7add..83471ebf 100644 --- a/Features/Grenades.cs +++ b/Features/Grenades.cs @@ -2,6 +2,7 @@ using Comfort.Common; using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -12,8 +13,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Grenades : CachableFeature { - public override string Name => "grenade"; - public override string Description => "Grenades outline."; + public override string Name => Strings.FeatureGrenadesName; + public override string Description => Strings.FeatureGrenadesDescription; [ConfigurationProperty] public Color Color { get; set; } = Color.red; diff --git a/Features/Health.cs b/Features/Health.cs index 07414984..5a2149c4 100644 --- a/Features/Health.cs +++ b/Features/Health.cs @@ -2,6 +2,7 @@ using EFT.HealthSystem; using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; #nullable enable @@ -11,8 +12,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Health : ToggleFeature { - public override string Name => "health"; - public override string Description => "Full health, prevent any damage (so even when falling), keep energy and hydration at maximum."; + public override string Name => Strings.FeatureHealthName; + public override string Description => Strings.FeatureHealthDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/Hits.cs b/Features/Hits.cs index 501a88eb..38f6433d 100644 --- a/Features/Hits.cs +++ b/Features/Hits.cs @@ -2,6 +2,7 @@ using EFT.HealthSystem; using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using EFT.Trainer.UI; using JetBrains.Annotations; using UnityEngine; @@ -13,8 +14,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Hits : ToggleFeature { - public override string Name => "hits"; - public override string Description => "Hit markers (hit, armor, health with configurable colors)."; + public override string Name => Strings.FeatureHitsName; + public override string Description => Strings.FeatureHitsDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/Hud.cs b/Features/Hud.cs index b308a7f8..cbf18b56 100644 --- a/Features/Hud.cs +++ b/Features/Hud.cs @@ -4,6 +4,7 @@ using EFT.Trainer.UI; using UnityEngine; using System.Text; +using EFT.Trainer.Properties; using JetBrains.Annotations; #nullable enable @@ -13,8 +14,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Hud : ToggleFeature { - public override string Name => "hud"; - public override string Description => "HUD (compass, ammo left in chamber / magazine, fire mode, coordinates)."; + public override string Name => Strings.FeatureHudName; + public override string Description => Strings.FeatureHudDescription; [ConfigurationProperty] public Color Color { get; set; } = Color.white; @@ -22,7 +23,17 @@ internal class Hud : ToggleFeature [ConfigurationProperty] public bool ShowCompass { get; set; } = true; - private static readonly string[] _directions = ["N", "NE", "E", "SE", "S", "SW", "W", "NW", "N"]; + private static readonly string[] _directions = [ + Strings.DirectionNorth, + Strings.DirectionNorthEast, + Strings.DirectionEast, + Strings.DirectionSouthEast, + Strings.DirectionSouth, + Strings.DirectionSouthWest, + Strings.DirectionWest, + Strings.DirectionNorthWest, + Strings.DirectionNorth + ]; [ConfigurationProperty] public bool ShowCoordinates { get; set; } = false; @@ -46,7 +57,6 @@ protected override void OnGUIWhenEnabled() return; _sb.Clear(); - const string separator = " - "; if (ShowCompass) { @@ -55,16 +65,16 @@ protected override void OnGUIWhenEnabled() var heading = Quaternion.LookRotation(forward).eulerAngles.y; _sb.Append(_directions[(int)Mathf.Round(heading % 360 / 45)]); - _sb.Append(separator); + _sb.Append(Strings.FeatureHudSeparator); } - _sb.Append($"{mag.Count}+{weapon.ChamberAmmoCount}/{mag.MaxCount} [{weapon.SelectedFireMode}]"); + _sb.Append(string.Format(Strings.FeatureHudWeaponFormat, mag.Count, weapon.ChamberAmmoCount, mag.MaxCount, weapon.SelectedFireMode)); if (ShowCoordinates) { - _sb.Append(separator); + _sb.Append(Strings.FeatureHudSeparator); var position = player.Transform.position; - _sb.Append($"({Mathf.RoundToInt(position.x)},{Mathf.RoundToInt(position.z)})"); + _sb.Append(string.Format(Strings.FeatureHudCoordinatesFormat, Mathf.RoundToInt(position.x), Mathf.RoundToInt(position.z))); } Render.DrawString(new Vector2(512, Screen.height - 16f), _sb.ToString(), Color); diff --git a/Features/Interact.cs b/Features/Interact.cs index 03ae93c3..382592b9 100644 --- a/Features/Interact.cs +++ b/Features/Interact.cs @@ -1,4 +1,5 @@ using EFT.Trainer.Configuration; +using EFT.Trainer.Properties; using JetBrains.Annotations; namespace EFT.Trainer.Features; @@ -6,8 +7,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Interact : ToggleFeature { - public override string Name => "interact"; - public override string Description => "Change distance for loot/door interaction."; + public override string Name => Strings.FeatureInteractName; + public override string Description => Strings.FeatureInteractDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/LootItems.cs b/Features/LootItems.cs index e17d48ce..fefbc11b 100644 --- a/Features/LootItems.cs +++ b/Features/LootItems.cs @@ -6,6 +6,7 @@ using EFT.InventoryLogic; using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using EFT.UI; using JsonType; using UnityEngine; @@ -17,13 +18,13 @@ namespace EFT.Trainer.Features; // StayInTarkov (SIT) is exposing a LootItems type in the global namespace, so make sure to use a qualified name for this one internal class LootItems : PointOfInterests { - public override string Name => "loot"; - public override string Description => "List all lootable items and track any item by name or rarity or in-game wishlist in raid (even in containers and corpses). Use track and tracklist commands to control display."; + public override string Name => Strings.FeatureLootItemsName; + public override string Description => Strings.FeatureLootItemsDescription; [ConfigurationProperty] public Color Color { get; set; } = Color.cyan; - [ConfigurationProperty(Browsable = false, Comment = @"Example: [""foo"", ""bar""] or with extended properties: [{""Name"":""foo"",""Color"":[1.0,0.0,0.0,1.0]},{""Name"":""bar"",""Color"":[1.0,1.0,1.0,0.8],""Rarity"":""Rare""}]")] + [ConfigurationProperty(Browsable = false, CommentResourceId = nameof(Strings.PropertyTrackedNamesComment))] public List TrackedNames { get; set; } = []; [ConfigurationProperty] diff --git a/Features/LootableContainers.cs b/Features/LootableContainers.cs index 50adfca1..ac51e0a4 100644 --- a/Features/LootableContainers.cs +++ b/Features/LootableContainers.cs @@ -3,6 +3,7 @@ using EFT.Interactive; using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -13,8 +14,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class LootableContainers : PointOfInterests { - public override string Name => "stash"; - public override string Description => "Hidden/special stashes like buried barrels, ground caches, air drops or corpses."; + public override string Name => Strings.FeatureStashName; + public override string Description => Strings.FeatureStashDescription; //Static Hashset for List of Container IDS private static readonly HashSet _targetedContainer = diff --git a/Features/Map.cs b/Features/Map.cs index 57040f35..b14f7afb 100644 --- a/Features/Map.cs +++ b/Features/Map.cs @@ -1,5 +1,6 @@ using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using EFT.Trainer.UI; using JetBrains.Annotations; using UnityEngine; @@ -11,8 +12,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Map : BaseMapToggleFeature { - public override string Name => "map"; - public override string Description => "Full screen map with radar esp."; + public override string Name => Strings.FeatureMapName; + public override string Description => Strings.FeatureMapDescription; [ConfigurationProperty(Skip = true)] // we do not want to offer save/load support for this public override bool Enabled { get; set; } = false; diff --git a/Features/NightVision.cs b/Features/NightVision.cs index f32dfab3..d9b51fd2 100644 --- a/Features/NightVision.cs +++ b/Features/NightVision.cs @@ -1,5 +1,6 @@ using EFT.InventoryLogic; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -10,8 +11,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class NightVision : ToggleFeature { - public override string Name => "night"; - public override string Description => "Night vision."; + public override string Name => Strings.FeatureNightVisionName; + public override string Description => Strings.FeatureNightVisionDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/NoCollision.cs b/Features/NoCollision.cs index aff9fce5..dbb52b0f 100644 --- a/Features/NoCollision.cs +++ b/Features/NoCollision.cs @@ -1,4 +1,5 @@ -using JetBrains.Annotations; +using EFT.Trainer.Properties; +using JetBrains.Annotations; using UnityEngine; #nullable enable @@ -8,8 +9,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class NoCollision : ToggleFeature { - public override string Name => "nocoll"; - public override string Description => "No physical collisions, making you immune to bullets, grenades and barbed wires."; + public override string Name => Strings.FeatureNoCollisionName; + public override string Description => Strings.FeatureNoCollisionDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/NoMalfunctions.cs b/Features/NoMalfunctions.cs index abddd7c8..73533363 100644 --- a/Features/NoMalfunctions.cs +++ b/Features/NoMalfunctions.cs @@ -1,5 +1,6 @@ using EFT.InventoryLogic; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; #nullable enable @@ -9,8 +10,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class NoMalfunctions : ToggleFeature { - public override string Name => "nomal"; - public override string Description => "No weapon malfunctions: no misfires or failures to eject or feed. No jammed bolts or overheating."; + public override string Name => Strings.FeatureNoMalfunctionsName; + public override string Description => Strings.FeatureNoMalfunctionsDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/NoRecoil.cs b/Features/NoRecoil.cs index a6dc564c..cd9c8a03 100644 --- a/Features/NoRecoil.cs +++ b/Features/NoRecoil.cs @@ -1,4 +1,5 @@ using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; #nullable enable @@ -8,8 +9,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class NoRecoil : ToggleFeature { - public override string Name => "norecoil"; - public override string Description => "No recoil."; + public override string Name => Strings.FeatureNoRecoilName; + public override string Description => Strings.FeatureNoRecoilDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/NoSway.cs b/Features/NoSway.cs index b45fd367..75a87f27 100644 --- a/Features/NoSway.cs +++ b/Features/NoSway.cs @@ -1,4 +1,5 @@ using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -9,8 +10,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class NoSway : ToggleFeature { - public override string Name => "nosway"; - public override string Description => "No sway."; + public override string Name => Strings.FeatureNoSwayName; + public override string Description => Strings.FeatureNoSwayDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/NoVisor.cs b/Features/NoVisor.cs index 0ddaeb30..1066897c 100644 --- a/Features/NoVisor.cs +++ b/Features/NoVisor.cs @@ -1,4 +1,5 @@ using System; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -9,8 +10,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class NoVisor : ToggleFeature { - public override string Name => "novisor"; - public override string Description => "No visor, so even when using a face shield-visor you won't see it."; + public override string Name => Strings.FeatureNoVisorName; + public override string Description => Strings.FeatureNoVisorDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/Players.cs b/Features/Players.cs index e478fe43..9f3f2583 100644 --- a/Features/Players.cs +++ b/Features/Players.cs @@ -5,6 +5,7 @@ using EFT.InventoryLogic; using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using EFT.Trainer.UI; using JetBrains.Annotations; using UnityEngine; @@ -42,8 +43,8 @@ public class ShootableColor(Color color, Color borderColor) : IFeature [UsedImplicitly] internal class Players : ToggleFeature { - public override string Name => "wallhack"; - public override string Description => "Wallhack (you'll see Bear/Boss/Cultist/Scav/Usec with configurable colors through walls). Charms, boxes, info (weapon and health), skeletons and distance."; + public override string Name => Strings.FeaturePlayersName; + public override string Description => Strings.FeaturePlayersDescription; [ConfigurationProperty(Order = 10)] public PlayerColor BearColors { get; set; } = new(Color.blue, Color.red, Color.red); @@ -232,7 +233,8 @@ protected void OnGUI() var maximumPlayerHealth = bodyPartHealth.Maximum; var weaponText = ennemyHandController != null && ennemyHandController.Item is Weapon weapon ? weapon.ShortName.Localized() : string.Empty; - var infoText = $"{weaponText} {Mathf.Round(currentPlayerHealth * 100 / maximumPlayerHealth)}% [{distance}m]".Trim(); + var distanceText = string.Format(Strings.FeaturePointOfInterestsDistanceFormat, distance); + var infoText = string.Format(Strings.FeaturePlayersFormat, weaponText, Mathf.Round(currentPlayerHealth * 100 / maximumPlayerHealth), distanceText).Trim(); Render.DrawString(new Vector2(boxPositionX, boxPositionY - 20f), infoText, playerColors.InfoColor, false); } diff --git a/Features/PointOfInterests.cs b/Features/PointOfInterests.cs index e4d5a5ba..5e7ee5cc 100644 --- a/Features/PointOfInterests.cs +++ b/Features/PointOfInterests.cs @@ -5,6 +5,7 @@ using System.Text; using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using EFT.Trainer.UI; using UnityEngine; @@ -80,7 +81,8 @@ public override void ProcessDataOnGUI(IReadOnlyList data) if (owner != null && distinctGroup.Count > 1) { flags = GetCaptionFlags.Name; - drawPosition = new Vector2(drawPosition.x, drawPosition.y + Render.DrawString(drawPosition, $">> In {owner} [{distance}m]", GroupingColor, false).y); + var distanceText = string.Format(Strings.FeaturePointOfInterestsDistanceFormat, distance); + drawPosition = new Vector2(drawPosition.x, drawPosition.y + Render.DrawString(drawPosition, string.Format(Strings.FeaturePointOfInterestsGroupFormat, owner, distanceText), GroupingColor, false).y); } foreach (var poi in distinctGroup) @@ -102,25 +104,22 @@ public enum GetCaptionFlags public virtual string GetCaption(PointOfInterest poi, double distance, GetCaptionFlags flags = GetCaptionFlags.All) { - var result = new StringBuilder(); + var nameText = string.Empty; + var distanceText = string.Empty; + var ownerText = string.Empty; if ((flags & GetCaptionFlags.Name) != 0) - { - result.Append(poi.Name); - result.Append(" "); - } + nameText = poi.Name; if (poi.Owner != null && (flags & GetCaptionFlags.Owner) != 0) - { - result.Append($"(in {poi.Owner})"); - result.Append(" "); - } + ownerText = string.Format(Strings.FeaturePointOfInterestsOwnerFormat, poi.Owner); if ((flags & GetCaptionFlags.Distance) != 0) - { - result.Append($"[{distance}m]"); - } + distanceText = string.Format(Strings.FeaturePointOfInterestsDistanceFormat, distance); - return result.ToString(); + return string + .Format(Strings.FeaturePointOfInterestsFormat, nameText, ownerText, distanceText) + .Replace(" ", " ") + .Trim(); } } diff --git a/Features/Quests.cs b/Features/Quests.cs index 2f12969a..fac2fdf0 100644 --- a/Features/Quests.cs +++ b/Features/Quests.cs @@ -6,6 +6,7 @@ using EFT.Quests; using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -16,8 +17,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Quests : PointOfInterests { - public override string Name => "quest"; - public override string Description => "Locations for taking/placing quest items. Only items related to your started quests are displayed."; + public override string Name => Strings.FeatureQuestsName; + public override string Description => Strings.FeatureQuestsDescription; [ConfigurationProperty] public Color Color { get; set; } = Color.magenta; @@ -146,7 +147,7 @@ private void RefreshPlaceOrRepairItemLocations(QuestDataClass[] startedQuests, P private void AddQuestRecord(List records, Condition condition, QuestDataClass quest, Vector3 position) { var poi = Pool.Get(); - poi.Name = $"{condition.FormattedDescription} ({quest.Template!.Name})"; + poi.Name = string.Format(Strings.FeatureQuestsFormat, condition.FormattedDescription, quest.Template!.Name); poi.Position = position; poi.Color = Color; poi.Owner = null; diff --git a/Features/QuickThrow.cs b/Features/QuickThrow.cs index e692ccb8..39bbf922 100644 --- a/Features/QuickThrow.cs +++ b/Features/QuickThrow.cs @@ -1,6 +1,7 @@ using System.Linq; using EFT.InventoryLogic; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -11,8 +12,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class QuickTrow : TriggerFeature { - public override string Name => "quickthrow"; - public override string Description => "Quick-throw grenades."; + public override string Name => Strings.FeatureQuickTrowName; + public override string Description => Strings.FeatureQuickTrowDescription; public override KeyCode Key { get; set; } = KeyCode.None; diff --git a/Features/Radar.cs b/Features/Radar.cs index b45745a5..5d3cb036 100644 --- a/Features/Radar.cs +++ b/Features/Radar.cs @@ -1,4 +1,5 @@ using EFT.Trainer.Configuration; +using EFT.Trainer.Properties; using EFT.Trainer.UI; using JetBrains.Annotations; using UnityEngine; @@ -10,8 +11,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Radar : BaseMapToggleFeature { - public override string Name => "radar"; - public override string Description => "2D radar."; + public override string Name => Strings.FeatureRadarName; + public override string Description => Strings.FeatureRadarDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/Skills.cs b/Features/Skills.cs index 97768b81..f8226dd5 100644 --- a/Features/Skills.cs +++ b/Features/Skills.cs @@ -1,4 +1,5 @@ using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -9,8 +10,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Skills : TriggerFeature { - public override string Name => "skills"; - public override string Description => "All skills to Elite level (51) and all weapons mastering to level 3."; + public override string Name => Strings.FeatureSkillsName; + public override string Description => Strings.FeatureSkillsDescription; public override KeyCode Key { get; set; } = KeyCode.None; diff --git a/Features/Speed.cs b/Features/Speed.cs index d3d0b5ea..e6eee98b 100644 --- a/Features/Speed.cs +++ b/Features/Speed.cs @@ -1,5 +1,6 @@ using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -10,8 +11,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Speed : HoldFeature { - public override string Name => "speed"; - public override string Description => "Speed boost to be able to go through walls/objects, or to move faster. Be careful to not kill yourself."; + public override string Name => Strings.FeatureSpeedName; + public override string Description => Strings.FeatureSpeedDescription; public override KeyCode Key { get; set; } = KeyCode.None; diff --git a/Features/Stamina.cs b/Features/Stamina.cs index 850e045b..1d5efe8d 100644 --- a/Features/Stamina.cs +++ b/Features/Stamina.cs @@ -1,4 +1,5 @@ using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -9,8 +10,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Stamina : ToggleFeature { - public override string Name => "stamina"; - public override string Description => "Unlimited stamina."; + public override string Name => Strings.FeatureStaminaName; + public override string Description => Strings.FeatureStaminaDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/ThermalVision.cs b/Features/ThermalVision.cs index 4ce27a25..b6edf850 100644 --- a/Features/ThermalVision.cs +++ b/Features/ThermalVision.cs @@ -1,5 +1,6 @@ using EFT.InventoryLogic; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -10,8 +11,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class ThermalVision : ToggleFeature { - public override string Name => "thermal"; - public override string Description => "Thermal vision."; + public override string Name => Strings.FeatureThermalVisionName; + public override string Description => Strings.FeatureThermalVisionDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/Train.cs b/Features/Train.cs index b7581956..bd3f3ca8 100644 --- a/Features/Train.cs +++ b/Features/Train.cs @@ -1,5 +1,6 @@ using System; using EFT.MovingPlatforms; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -10,8 +11,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Train : TriggerFeature { - public override string Name => "train"; - public override string Description => "Summon train on compatible maps like Reserve or Lighthouse."; + public override string Name => Strings.FeatureTrainName; + public override string Description => Strings.FeatureTrainDescription; public override KeyCode Key { get; set; } = KeyCode.None; diff --git a/Features/WallShoot.cs b/Features/WallShoot.cs index 61fd5bd6..85160b17 100644 --- a/Features/WallShoot.cs +++ b/Features/WallShoot.cs @@ -1,6 +1,7 @@ using EFT.Ballistics; using EFT.Trainer.Extensions; using EFT.Trainer.Model; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -11,8 +12,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class WallShoot : ToggleFeature { - public override string Name => "wallshoot"; - public override string Description => "Shoot through wall/helmet/vest/material with maximum penetration and minimal deviation/ricochet."; + public override string Name => Strings.FeatureWallShootName; + public override string Description => Strings.FeatureFeatureWallShootDescription; #pragma warning disable IDE0060 [UsedImplicitly] diff --git a/Features/Weather.cs b/Features/Weather.cs index f23774d3..854a1c1f 100644 --- a/Features/Weather.cs +++ b/Features/Weather.cs @@ -1,4 +1,5 @@ -using EFT.Weather; +using EFT.Trainer.Properties; +using EFT.Weather; using JetBrains.Annotations; using UnityEngine; @@ -9,8 +10,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Weather : TriggerFeature { - public override string Name => "weather"; - public override string Description => "Clear weather."; + public override string Name => Strings.FeatureWeatherName; + public override string Description => Strings.FeatureWeatherDescription; public override KeyCode Key { get; set; } = KeyCode.None; diff --git a/Features/WorldInteractiveObjects.cs b/Features/WorldInteractiveObjects.cs index a7aac500..8a289e99 100644 --- a/Features/WorldInteractiveObjects.cs +++ b/Features/WorldInteractiveObjects.cs @@ -1,5 +1,6 @@ using EFT.Interactive; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -10,8 +11,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class WorldInteractiveObjects : TriggerFeature { - public override string Name => "opener"; - public override string Description => "Door/Keycard reader/Car unlocker."; + public override string Name => Strings.FeatureWorldInteractiveObjectsName; + public override string Description => Strings.FeatureWorldInteractiveObjectsDescription; public override KeyCode Key { get; set; } = KeyCode.KeypadPeriod; diff --git a/Installer/CompilationContext.cs b/Installer/CompilationContext.cs index f56a297f..9b0fcfc1 100644 --- a/Installer/CompilationContext.cs +++ b/Installer/CompilationContext.cs @@ -14,4 +14,5 @@ internal class CompilationContext(Installation installation, string projectTitle public string[] Exclude { get; set; } = []; public ZipArchive? Archive { get; set; } public bool IsFatalFailure { get; set; } = false; + public string Language { get; set; } = ""; } diff --git a/Installer/CompilationResult.cs b/Installer/CompilationResult.cs new file mode 100644 index 00000000..d197c547 --- /dev/null +++ b/Installer/CompilationResult.cs @@ -0,0 +1,13 @@ +using System.IO.Compression; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; + +namespace Installer; + +internal class CompilationResult(CSharpCompilation? compilation, ZipArchive? archive, Diagnostic[] errors, ResourceDescription[] resources) +{ + public CSharpCompilation? Compilation { get; } = compilation; + public ZipArchive? Archive { get; } = archive; + public Diagnostic[] Errors { get; } = errors; + public ResourceDescription[] Resources { get; } = resources; +} diff --git a/Installer/Compiler.cs b/Installer/Compiler.cs index 3755e5b4..1fb51e79 100644 --- a/Installer/Compiler.cs +++ b/Installer/Compiler.cs @@ -1,9 +1,12 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.IO; using System.IO.Compression; using System.Linq; +using System.Resources; +using System.Resources.NetStandard; using System.Text; using System.Text.RegularExpressions; using Installer.Properties; @@ -156,6 +159,59 @@ private IEnumerable GetSyntaxTrees() } } + public bool IsLocalizationSupported() + { + return IsLanguageSupported(null); + } + + public bool IsLanguageSupported(CompilationContext? context) + { + return GetSourceFiles().Any(f => f.EndsWith(string.Concat("Strings.", context?.Language ?? string.Empty, ".Designer.cs").Replace("..","."), StringComparison.OrdinalIgnoreCase)); + } + + public IEnumerable GetResources(CompilationContext context) + { + var matches = ResourceFileRegex().Matches(ProjectContent); + + foreach (var match in matches.Cast()) + { + if (!match.Success) + continue; + + // For now we only select one resource file, and use it as "neutral" + var file = match.Groups["file"].Value; + if (!file.EndsWith(string.Concat("Strings.", context.Language, ".resx").Replace("..","."), StringComparison.OrdinalIgnoreCase)) + continue; + + var entry = ProjectArchive.Entries.FirstOrDefault(e => e.FullName.EndsWith(file.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar), StringComparison.OrdinalIgnoreCase)); + if (entry == null) + continue; + + using var stream = entry.Open(); + using var reader = new ResXResourceReader(stream); + + using var memory = new MemoryStream(); + using var writer = new ResourceWriter(memory); + + foreach (DictionaryEntry resourcEntry in reader) + writer.AddResource(resourcEntry.Key.ToString()!, resourcEntry.Value); + + var resource = new MemoryStream(); + + writer.Generate(); + memory.Position = 0; + memory.CopyTo(resource); + resource.Position = 0; + + var resourceName = file + .Replace(@"Properties\Strings", "EFT.Trainer.Properties.Strings") + .Replace($".{context.Language}.", ".", StringComparison.OrdinalIgnoreCase) + .Replace(".resx", ".resources"); + + yield return new ResourceDescription(resourceName, () => resource, isPublic: true); + } + } + public CSharpCompilation Compile(string assemblyName) { var syntaxTrees = GetSyntaxTrees() @@ -167,9 +223,12 @@ public CSharpCompilation Compile(string assemblyName) return CSharpCompilation.Create(assemblyName, syntaxTrees, references, CompilationOptions); } - [GeneratedRegex(".*)\"\\s*/>")] + [GeneratedRegex(".*)\"\\s*/?>")] private static partial Regex CompileFileRegex(); [GeneratedRegex("<(Project)?Reference\\s+Include=\"(?.*)\"\\s*/?>")] private static partial Regex ProjectReferenceRegex(); + + [GeneratedRegex(".*)\"\\s*/?>")] + private static partial Regex ResourceFileRegex(); } diff --git a/Installer/InstallCommand.cs b/Installer/InstallCommand.cs index 5f64a336..2a433677 100644 --- a/Installer/InstallCommand.cs +++ b/Installer/InstallCommand.cs @@ -13,6 +13,7 @@ using Installer.Properties; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.Emit; using Spectre.Console; using Spectre.Console.Cli; @@ -37,6 +38,10 @@ internal class Settings : CommandSettings [Description("Disable command.")] [CommandOption("-c|--command")] public string[]? DisabledCommands { get; set; } + + [Description("Language.")] + [CommandOption("-l|--language")] + public string Language { get; set; } = ""; } public static string[] ToSourceFile(string[]? names, string folder) @@ -67,9 +72,9 @@ public override async Task ExecuteAsync(CommandContext commandContext, Sett settings.DisabledFeatures = ToSourceFile(settings.DisabledFeatures, features); settings.DisabledCommands = ToSourceFile(settings.DisabledCommands, commands); - var (compilation, archive) = await BuildTrainerAsync(settings, installation, features, commands); + var result = await BuildTrainerAsync(settings, installation, features, commands); - if (compilation == null) + if (result.Compilation == null) { // Failure AnsiConsole.MarkupLine($"[red]Unable to compile trainer for version {installation.Version}. Please file an issue here : https://github.com/sailro/EscapeFromTarkov-Trainer/issues [/]"); @@ -86,35 +91,35 @@ public override async Task ExecuteAsync(CommandContext commandContext, Sett return (int)ExitCode.Canceled; } - if (!CreateDll(installation, "NLog.EFT.Trainer.dll", dllPath => compilation.Emit(dllPath))) + if (!CreateDll(installation, "NLog.EFT.Trainer.dll", dllPath => result.Compilation.Emit(dllPath, manifestResources: result.Resources))) return (int)ExitCode.CreateDllFailed; if (!CreateDll(installation, "0Harmony.dll", dllPath => File.WriteAllBytes(dllPath, Resources._0Harmony), false)) return (int)ExitCode.CreateHarmonyDllFailed; - if (!CreateOutline(installation, archive!)) + if (!CreateOutline(installation, result.Archive!)) return (int)ExitCode.CreateOutlineFailed; const string bepInExPluginProject = "BepInExPlugin.csproj"; - if (installation.UsingBepInEx && archive!.Entries.Any(e => e.Name == bepInExPluginProject)) + if (installation.UsingBepInEx && result.Archive!.Entries.Any(e => e.Name == bepInExPluginProject)) { AnsiConsole.MarkupLine("[green][[BepInEx]][/] detected. Creating plugin instead of using NLog configuration."); // reuse successful context for compiling. var pluginContext = new CompilationContext(installation, "plugin", bepInExPluginProject) { - Archive = archive, + Archive = result.Archive, Branch = GetInitialBranch(settings) }; - var (pluginCompilation, _, _) = await GetCompilationAsync(pluginContext); + var pluginResult = await GetCompilationAsync(pluginContext); - if (pluginCompilation == null) + if (pluginResult.Compilation == null) { AnsiConsole.MarkupLine($"[red]Unable to compile plugin for version {installation.Version}. Please file an issue here : https://github.com/sailro/EscapeFromTarkov-Trainer/issues [/]"); return (int)ExitCode.PluginCompilationFailed; } - if (!CreateDll(installation, Path.Combine(installation.BepInExPlugins, "aki-efttrainer.dll"), dllPath => pluginCompilation.Emit(dllPath))) + if (!CreateDll(installation, Path.Combine(installation.BepInExPlugins, "aki-efttrainer.dll"), dllPath => pluginResult.Compilation.Emit(dllPath))) return (int)ExitCode.CreatePluginDllFailed; } else @@ -140,37 +145,38 @@ public override async Task ExecuteAsync(CommandContext commandContext, Sett return (int)ExitCode.Success; } - private static async Task<(CSharpCompilation?, ZipArchive?)> BuildTrainerAsync(Settings settings, Installation installation, params string[] folders) + private static async Task BuildTrainerAsync(Settings settings, Installation installation, params string[] folders) { // Try first to compile against master var context = new CompilationContext(installation, "trainer", "NLog.EFT.Trainer.csproj") { Exclude = [.. settings.DisabledFeatures!, .. settings.DisabledCommands!], - Branch = GetInitialBranch(settings) + Branch = GetInitialBranch(settings), + Language = settings.Language }; - var (compilation, archive, errors) = await GetCompilationAsync(context); - var files = errors + var result = await GetCompilationAsync(context); + var files = result.Errors .Select(d => d.Location.SourceTree?.FilePath) .Where(s => s is not null) .Distinct() .ToArray(); if (context.IsFatalFailure) - return (compilation, archive); + return result; - if (compilation == null) + if (result.Compilation == null) { // Failure, so try with a dedicated branch if exists var retryBranch = GetRetryBranch(installation, context); if (retryBranch != null) { context.Branch = retryBranch; - (compilation, archive, _) = await GetCompilationAsync(context); + result = await GetCompilationAsync(context); } } - if (compilation == null && files.Length != 0 && files.All(file => folders.Any(folder => file!.StartsWith(folder)))) + if (result.Compilation == null && files.Length != 0 && files.All(file => folders.Any(folder => file!.StartsWith(folder)))) { // Failure, retry by removing faulting features if possible AnsiConsole.MarkupLine($"[yellow]Trying to disable faulting feature/command: [red]{GetFaultingNames(files!)}[/].[/]"); @@ -178,13 +184,13 @@ public override async Task ExecuteAsync(CommandContext commandContext, Sett context.Exclude = [.. files!, .. settings.DisabledFeatures!, .. settings.DisabledCommands!]; context.Branch = GetFallbackBranch(settings); - (compilation, archive, errors) = await GetCompilationAsync(context); + result = await GetCompilationAsync(context); - if (errors.Length == 0) + if (result.Errors.Length == 0) AnsiConsole.MarkupLine("[yellow]We found a fallback! But please file an issue here : https://github.com/sailro/EscapeFromTarkov-Trainer/issues [/]"); } - return (compilation, archive); + return result; } private static string GetFaultingNames(string[] files) @@ -234,18 +240,20 @@ private static void TryCreateGameDocumentFolder() } } - private static async Task<(CSharpCompilation?, ZipArchive?, Diagnostic[])> GetCompilationAsync(CompilationContext context) + private static async Task GetCompilationAsync(CompilationContext context) { var errors = Array.Empty(); + ResourceDescription[] resources = []; var archive = context.Archive ?? await GetSnapshotAsync(context, context.Branch); if (archive == null) { context.Try++; - return (null, null, errors); + return new(null, null, errors, resources); } CSharpCompilation? compilation = null; + AnsiConsole .Status() .Start($"Compiling {context.ProjectTitle}", _ => @@ -269,12 +277,25 @@ private static void TryCreateGameDocumentFolder() } else { - AnsiConsole.MarkupLine($">> [blue]Try #{context.Try}[/] Compilation [green]succeed[/] for [blue]{context.Branch.EscapeMarkup()}[/] branch."); + resources = compiler + .GetResources(context) + .ToArray(); + + if (compiler.IsLocalizationSupported() && !resources.Any()) + { + AnsiConsole.MarkupLine($"[yellow]Warning: no localization support for language '{context.Language.EscapeMarkup()}'.[/]"); + compilation = null; + context.IsFatalFailure = true; + } + else + { + AnsiConsole.MarkupLine($">> [blue]Try #{context.Try}[/] Compilation [green]succeed[/] for [blue]{context.Branch.EscapeMarkup()}[/] branch."); + } } }); context.Try++; - return (compilation, archive, errors); + return new(compilation, archive, errors, resources); } private static async Task GetSnapshotAsync(CompilationContext context, string branch) @@ -418,6 +439,15 @@ private static bool CreateOutline(Installation installation, ZipArchive archive) } private static bool CreateDll(Installation installation, string filename, Action creator, bool overwrite = true) + { + return CreateDll(installation, filename, s => + { + creator(s); + return null; + }, overwrite); + } + + private static bool CreateDll(Installation installation, string filename, Func creator, bool overwrite = true) { var dllPath = Path.IsPathRooted(filename) ? filename : Path.Combine(installation.Managed, filename); var dllPathBepInExCore = Path.IsPathRooted(filename) ? null : Path.Combine(installation.BepInExCore, filename); @@ -431,9 +461,24 @@ private static bool CreateDll(Installation installation, string filename, Action if (!overwrite && File.Exists(dllPath)) return true; - creator(dllPath); - AnsiConsole.MarkupLine($"Created [green]{Path.GetFileName(dllPath).EscapeMarkup()}[/] in [blue]{Path.GetDirectoryName(dllPath).EscapeMarkup()}[/]."); + var result = creator(dllPath); + if (result != null) + { + var errors = result + .Diagnostics + .Where(d => d.Severity == DiagnosticSeverity.Error) + .ToArray(); +#if DEBUG + foreach (var error in errors) + AnsiConsole.MarkupLine($"[grey]>> {error.Id} [[{error.Location.SourceTree?.FilePath.EscapeMarkup()}]]: {error.GetMessage().EscapeMarkup()}.[/]"); +#endif + + if (!result.Success) + throw new Exception(errors.FirstOrDefault()?.GetMessage() ?? "Unknown error while emitting assembly"); + } + + AnsiConsole.MarkupLine($"Created [green]{Path.GetFileName(dllPath).EscapeMarkup()}[/] in [blue]{Path.GetDirectoryName(dllPath).EscapeMarkup()}[/]."); return true; } catch (Exception ex) diff --git a/Installer/Installation.cs b/Installer/Installation.cs index 0dfe4e46..df58ae55 100644 --- a/Installer/Installation.cs +++ b/Installer/Installation.cs @@ -139,8 +139,9 @@ private static bool TryDiscoverInstallation(string? path, [NotNullWhen(true)] ou if (!Directory.Exists(installation.Managed)) return false; - var akiFolder = Path.Combine(path, "Aki_Data"); - installation.UsingSptAki = Directory.Exists(akiFolder); + var legacyAkiFolder = Path.Combine(path, "Aki_Data"); + var akiFolder = Path.Combine(path, "SPT_Data"); + installation.UsingSptAki = Directory.Exists(akiFolder) || Directory.Exists(legacyAkiFolder); installation.UsingBepInEx = Directory.Exists(installation.BepInExPlugins); diff --git a/Installer/Installer.csproj b/Installer/Installer.csproj index a45e4edc..8a382a5a 100644 --- a/Installer/Installer.csproj +++ b/Installer/Installer.csproj @@ -17,7 +17,7 @@ Sebastien Lebreton https://github.com/sailro/EscapeFromTarkov-Trainer - 2.9.0.0 + 3.0.0.0 Sebastien Lebreton @@ -27,6 +27,7 @@ + @@ -34,6 +35,7 @@ + diff --git a/Model/ReflectionWrapper.cs b/Model/ReflectionWrapper.cs index 1416ef54..b96e3fd1 100644 --- a/Model/ReflectionWrapper.cs +++ b/Model/ReflectionWrapper.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Reflection; +using EFT.Trainer.Properties; using EFT.UI; using HarmonyLib; @@ -22,7 +23,7 @@ internal class ReflectionWrapper { #if DEBUG if (warnOnFailure) - AddConsoleLog($"Unable to find {name} on {_instanceType.Name}"); + AddConsoleLog(string.Format(Strings.ErrorCannotFindField, name, _instanceType.Name)); #endif return default; } diff --git a/NLog.EFT.Trainer.csproj b/NLog.EFT.Trainer.csproj index 2f98022a..898692db 100644 --- a/NLog.EFT.Trainer.csproj +++ b/NLog.EFT.Trainer.csproj @@ -209,6 +209,16 @@ + + Strings.fr.resx + True + True + + + True + True + Strings.resx + @@ -222,6 +232,18 @@ + + + ResXFileCodeGenerator + Strings.fr.Designer.cs + Designer + + + ResXFileCodeGenerator + Strings.Designer.cs + Designer + + copy /Y "$(TargetPath)" "$(EFTManagedPath)" diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 654cb802..f16bb424 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -2,4 +2,4 @@ [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyProduct("EFT Trainer")] -[assembly: AssemblyCopyright("Copyright © 2023 Sebastien Lebreton")] +[assembly: AssemblyCopyright("Copyright © 2024 Sebastien Lebreton")] diff --git a/Properties/Strings.Designer.cs b/Properties/Strings.Designer.cs new file mode 100644 index 00000000..e41d6fc8 --- /dev/null +++ b/Properties/Strings.Designer.cs @@ -0,0 +1,2360 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace EFT.Trainer.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Strings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Strings() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("EFT.Trainer.Properties.Strings", typeof(Strings).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to dump. + /// + internal static string CommandDump { + get { + return ResourceManager.GetString("CommandDump", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Dumping game objects.... + /// + internal static string CommandDumpGameObjects { + get { + return ResourceManager.GetString("CommandDumpGameObjects", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Dumping Scenes.... + /// + internal static string CommandDumpScenes { + get { + return ResourceManager.GetString("CommandDumpScenes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Dump created in {0}. + /// + internal static string CommandDumpSuccessFormat { + get { + return ResourceManager.GetString("CommandDumpSuccessFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to list. + /// + internal static string CommandList { + get { + return ResourceManager.GetString("CommandList", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} [{1}] {2}. + /// + internal static string CommandListEnumerateFormat { + get { + return ResourceManager.GetString("CommandListEnumerateFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to listr. + /// + internal static string CommandListRare { + get { + return ResourceManager.GetString("CommandListRare", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ({0}). + /// + internal static string CommandListRarityFormat { + get { + return ResourceManager.GetString("CommandListRarityFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Found {0} item(s). + /// + internal static string CommandListSuccessFormat { + get { + return ResourceManager.GetString("CommandListSuccessFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to listsr. + /// + internal static string CommandListSuperRare { + get { + return ResourceManager.GetString("CommandListSuperRare", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Load settings. + /// + internal static string CommandLoadDescription { + get { + return ResourceManager.GetString("CommandLoadDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to load. + /// + internal static string CommandLoadName { + get { + return ResourceManager.GetString("CommandLoadName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Loaded {0}. + /// + internal static string CommandLoadSuccessFormat { + get { + return ResourceManager.GetString("CommandLoadSuccessFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to loadtl. + /// + internal static string CommandLoadTrackList { + get { + return ResourceManager.GetString("CommandLoadTrackList", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Save settings. + /// + internal static string CommandSaveDescription { + get { + return ResourceManager.GetString("CommandSaveDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Be careful when updating this file :) + ///For keys, use https://docs.unity3d.com/ScriptReference/KeyCode.html + ///Colors are stored as an array of 'RGBA' floats. + /// + internal static string CommandSaveHeader { + get { + return ResourceManager.GetString("CommandSaveHeader", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to save. + /// + internal static string CommandSaveName { + get { + return ResourceManager.GetString("CommandSaveName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Saved {0}. + /// + internal static string CommandSaveSuccessFormat { + get { + return ResourceManager.GetString("CommandSaveSuccessFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to savetl. + /// + internal static string CommandSaveTrackList { + get { + return ResourceManager.GetString("CommandSaveTrackList", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to spawn. + /// + internal static string CommandSpawn { + get { + return ResourceManager.GetString("CommandSpawn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to status. + /// + internal static string CommandStatus { + get { + return ResourceManager.GetString("CommandStatus", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} is {1} {2}. + /// + internal static string CommandStatusTextFormat { + get { + return ResourceManager.GetString("CommandStatusTextFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ({0} to toggle). + /// + internal static string CommandStatusTextToggleFormat { + get { + return ResourceManager.GetString("CommandStatusTextToggleFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to template. + /// + internal static string CommandTemplate { + get { + return ResourceManager.GetString("CommandTemplate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: {1} [{2}]. + /// + internal static string CommandTemplateEnumerateFormat { + get { + return ResourceManager.GetString("CommandTemplateEnumerateFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Found {0} template(s). + /// + internal static string CommandTemplateSuccessFormat { + get { + return ResourceManager.GetString("CommandTemplateSuccessFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to track. + /// + internal static string CommandTrack { + get { + return ResourceManager.GetString("CommandTrack", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to tracklist. + /// + internal static string CommandTrackList { + get { + return ResourceManager.GetString("CommandTrackList", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tracking: {0} {1}. + /// + internal static string CommandTrackListEnumerateFormat { + get { + return ResourceManager.GetString("CommandTrackListEnumerateFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ({0}). + /// + internal static string CommandTrackListRarityFormat { + get { + return ResourceManager.GetString("CommandTrackListRarityFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tracking list updated.... + /// + internal static string CommandTrackListUpdated { + get { + return ResourceManager.GetString("CommandTrackListUpdated", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tracking: {0} (Wishlist). + /// + internal static string CommandTrackListWishListEnumerateFormat { + get { + return ResourceManager.GetString("CommandTrackListWishListEnumerateFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to trackr. + /// + internal static string CommandTrackRare { + get { + return ResourceManager.GetString("CommandTrackRare", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to tracksr. + /// + internal static string CommandTrackSuperRare { + get { + return ResourceManager.GetString("CommandTrackSuperRare", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to untrack. + /// + internal static string CommandUnTrack { + get { + return ResourceManager.GetString("CommandUnTrack", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Patched {0} with {1}. + /// + internal static string DebugPatchedMethodFormat { + get { + return ResourceManager.GetString("DebugPatchedMethodFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Refreshed {0} in {1}ms. + /// + internal static string DebugPerformanceRefreshedFormat { + get { + return ResourceManager.GetString("DebugPerformanceRefreshedFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Registering {0} command.... + /// + internal static string DebugRegisteringCommandFormat { + get { + return ResourceManager.GetString("DebugRegisteringCommandFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Registering {0} command with arguments.... + /// + internal static string DebugRegisteringCommandWithArgumentsFormat { + get { + return ResourceManager.GetString("DebugRegisteringCommandWithArgumentsFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to E. + /// + internal static string DirectionEast { + get { + return ResourceManager.GetString("DirectionEast", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to N. + /// + internal static string DirectionNorth { + get { + return ResourceManager.GetString("DirectionNorth", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to NE. + /// + internal static string DirectionNorthEast { + get { + return ResourceManager.GetString("DirectionNorthEast", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to NW. + /// + internal static string DirectionNorthWest { + get { + return ResourceManager.GetString("DirectionNorthWest", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to S. + /// + internal static string DirectionSouth { + get { + return ResourceManager.GetString("DirectionSouth", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SE. + /// + internal static string DirectionSouthEast { + get { + return ResourceManager.GetString("DirectionSouthEast", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SW. + /// + internal static string DirectionSouthWest { + get { + return ResourceManager.GetString("DirectionSouthWest", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to W. + /// + internal static string DirectionWest { + get { + return ResourceManager.GetString("DirectionWest", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to find {0} on {1}. + /// + internal static string ErrorCannotFindField { + get { + return ResourceManager.GetString("ErrorCannotFindField", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cannot find original method {0}. + /// + internal static string ErrorCannotFindOriginalMethodFormat { + get { + return ResourceManager.GetString("ErrorCannotFindOriginalMethodFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cannot find postfix method {0}. + /// + internal static string ErrorCannotFindPostfixMethodFormat { + get { + return ResourceManager.GetString("ErrorCannotFindPostfixMethodFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cannot find prefix method {0}. + /// + internal static string ErrorCannotFindPrefixMethodFormat { + get { + return ResourceManager.GetString("ErrorCannotFindPrefixMethodFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to load {0}. {1}. + /// + internal static string ErrorCannotLoadFormat { + get { + return ResourceManager.GetString("ErrorCannotLoadFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to save {0}. {1}. + /// + internal static string ErrorCannotSaveFormat { + get { + return ResourceManager.GetString("ErrorCannotSaveFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} seems corrupted. Please fix. + /// + internal static string ErrorCorruptedFileFormat { + get { + return ResourceManager.GetString("ErrorCorruptedFileFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} seems corrupted in {1}. Please fix. + /// + internal static string ErrorCorruptedPropertyFormat { + get { + return ResourceManager.GetString("ErrorCorruptedPropertyFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failed to create item!. + /// + internal static string ErrorFailedToCreateItem { + get { + return ResourceManager.GetString("ErrorFailedToCreateItem", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failed to load item bundle!. + /// + internal static string ErrorFailedToLoadItemBundle { + get { + return ResourceManager.GetString("ErrorFailedToLoadItemBundle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} not found!. + /// + internal static string ErrorFileNotFoundFormat { + get { + return ResourceManager.GetString("ErrorFileNotFoundFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid arguments. + /// + internal static string ErrorInvalidArguments { + get { + return ResourceManager.GetString("ErrorInvalidArguments", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No template found!. + /// + internal static string ErrorNoTemplateFound { + get { + return ResourceManager.GetString("ErrorNoTemplateFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Found {0} templates, be more specific. + /// + internal static string ErrorTooManyTemplatesFormat { + get { + return ResourceManager.GetString("ErrorTooManyTemplatesFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unsupported type: {0}. + /// + internal static string ErrorUnsupportedTypeFormat { + get { + return ResourceManager.GetString("ErrorUnsupportedTypeFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Aimbot. Automatic aiming and/or shooting (SilentAim).. + /// + internal static string FeatureAimbotDescription { + get { + return ResourceManager.GetString("FeatureAimbotDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to aimbot. + /// + internal static string FeatureAimbotName { + get { + return ResourceManager.GetString("FeatureAimbotName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unlimited ammo.. + /// + internal static string FeatureAmmunitionDescription { + get { + return ResourceManager.GetString("FeatureAmmunitionDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ammo. + /// + internal static string FeatureAmmunitionName { + get { + return ResourceManager.GetString("FeatureAmmunitionName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Force all guns (even bolt action guns) to use automatic firing mode with customizable fire rate.. + /// + internal static string FeatureAutomaticGunDescription { + get { + return ResourceManager.GetString("FeatureAutomaticGunDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to autogun. + /// + internal static string FeatureAutomaticGunName { + get { + return ResourceManager.GetString("FeatureAutomaticGunName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Free camera with fast mode and teleportation.. + /// + internal static string FeatureCameraDescription { + get { + return ResourceManager.GetString("FeatureCameraDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to camera. + /// + internal static string FeatureCameraName { + get { + return ResourceManager.GetString("FeatureCameraName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This main popup window.. + /// + internal static string FeatureCommandsDescription { + get { + return ResourceManager.GetString("FeatureCommandsDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to commands. + /// + internal static string FeatureCommandsName { + get { + return ResourceManager.GetString("FeatureCommandsName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to EFT Trainer. + /// + internal static string FeatureCommandsTitle { + get { + return ResourceManager.GetString("FeatureCommandsTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Crosshair with customizable size, color, thickness and auto-hide feature when aiming.. + /// + internal static string FeatureCrosshairDescription { + get { + return ResourceManager.GetString("FeatureCrosshairDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to crosshair. + /// + internal static string FeatureCrosshairName { + get { + return ResourceManager.GetString("FeatureCrosshairName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maximum durability of items.. + /// + internal static string FeatureDurabilityDescription { + get { + return ResourceManager.GetString("FeatureDurabilityDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to durability. + /// + internal static string FeatureDurabilityName { + get { + return ResourceManager.GetString("FeatureDurabilityName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All items already examined. Instant search.. + /// + internal static string FeatureExamineDescription { + get { + return ResourceManager.GetString("FeatureExamineDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to examine. + /// + internal static string FeatureExamineName { + get { + return ResourceManager.GetString("FeatureExamineName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exfiltration points with customizable colors given eligibility, status filter, distance.. + /// + internal static string FeatureExfiltrationPointsDescription { + get { + return ResourceManager.GetString("FeatureExfiltrationPointsDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} ({1}). + /// + internal static string FeatureExfiltrationPointsEligibleFormat { + get { + return ResourceManager.GetString("FeatureExfiltrationPointsEligibleFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to exfil. + /// + internal static string FeatureExfiltrationPointsName { + get { + return ResourceManager.GetString("FeatureExfiltrationPointsName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Activate. + /// + internal static string FeatureExfiltrationPointsStatusActivate { + get { + return ResourceManager.GetString("FeatureExfiltrationPointsStatusActivate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Closed. + /// + internal static string FeatureExfiltrationPointsStatusClosed { + get { + return ResourceManager.GetString("FeatureExfiltrationPointsStatusClosed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open. + /// + internal static string FeatureExfiltrationPointsStatusOpen { + get { + return ResourceManager.GetString("FeatureExfiltrationPointsStatusOpen", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pending. + /// + internal static string FeatureExfiltrationPointsStatusPending { + get { + return ResourceManager.GetString("FeatureExfiltrationPointsStatusPending", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Requirement. + /// + internal static string FeatureExfiltrationPointsStatusRequirement { + get { + return ResourceManager.GetString("FeatureExfiltrationPointsStatusRequirement", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Timer. + /// + internal static string FeatureExfiltrationPointsStatusTimer { + get { + return ResourceManager.GetString("FeatureExfiltrationPointsStatusTimer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Shoot through wall/helmet/vest/material with maximum penetration and minimal deviation/ricochet.. + /// + internal static string FeatureFeatureWallShootDescription { + get { + return ResourceManager.GetString("FeatureFeatureWallShootDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Change Field Of View (FOV).. + /// + internal static string FeatureFovChangerDescription { + get { + return ResourceManager.GetString("FeatureFovChangerDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to fovchanger. + /// + internal static string FeatureFovChangerName { + get { + return ResourceManager.GetString("FeatureFovChangerName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Refresh all game information for other features.. + /// + internal static string FeatureGameStateDescription { + get { + return ResourceManager.GetString("FeatureGameStateDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to gamestate. + /// + internal static string FeatureGameStateName { + get { + return ResourceManager.GetString("FeatureGameStateName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Stop bots from seeing you.. + /// + internal static string FeatureGhostDescription { + get { + return ResourceManager.GetString("FeatureGhostDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ghost. + /// + internal static string FeatureGhostName { + get { + return ResourceManager.GetString("FeatureGhostName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Grenades outline.. + /// + internal static string FeatureGrenadesDescription { + get { + return ResourceManager.GetString("FeatureGrenadesDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to grenade. + /// + internal static string FeatureGrenadesName { + get { + return ResourceManager.GetString("FeatureGrenadesName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Full health, prevent any damage (so even when falling), keep energy and hydration at maximum.. + /// + internal static string FeatureHealthDescription { + get { + return ResourceManager.GetString("FeatureHealthDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to health. + /// + internal static string FeatureHealthName { + get { + return ResourceManager.GetString("FeatureHealthName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hit markers (hit, armor, health with configurable colors).. + /// + internal static string FeatureHitsDescription { + get { + return ResourceManager.GetString("FeatureHitsDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to hits. + /// + internal static string FeatureHitsName { + get { + return ResourceManager.GetString("FeatureHitsName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ({0},{1}). + /// + internal static string FeatureHudCoordinatesFormat { + get { + return ResourceManager.GetString("FeatureHudCoordinatesFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to HUD (compass, ammo left in chamber / magazine, fire mode, coordinates).. + /// + internal static string FeatureHudDescription { + get { + return ResourceManager.GetString("FeatureHudDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to hud. + /// + internal static string FeatureHudName { + get { + return ResourceManager.GetString("FeatureHudName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to - . + /// + internal static string FeatureHudSeparator { + get { + return ResourceManager.GetString("FeatureHudSeparator", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}+{1}/{2} [{3}]. + /// + internal static string FeatureHudWeaponFormat { + get { + return ResourceManager.GetString("FeatureHudWeaponFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Change distance for loot/door interaction.. + /// + internal static string FeatureInteractDescription { + get { + return ResourceManager.GetString("FeatureInteractDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to interact. + /// + internal static string FeatureInteractName { + get { + return ResourceManager.GetString("FeatureInteractName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to List all lootable items and track any item by name or rarity or in-game wishlist in raid (even in containers and corpses). Use track and tracklist commands to control display.. + /// + internal static string FeatureLootItemsDescription { + get { + return ResourceManager.GetString("FeatureLootItemsDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to loot. + /// + internal static string FeatureLootItemsName { + get { + return ResourceManager.GetString("FeatureLootItemsName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Full screen map with radar esp.. + /// + internal static string FeatureMapDescription { + get { + return ResourceManager.GetString("FeatureMapDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to map. + /// + internal static string FeatureMapName { + get { + return ResourceManager.GetString("FeatureMapName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Night vision.. + /// + internal static string FeatureNightVisionDescription { + get { + return ResourceManager.GetString("FeatureNightVisionDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to night. + /// + internal static string FeatureNightVisionName { + get { + return ResourceManager.GetString("FeatureNightVisionName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No physical collisions, making you immune to bullets, grenades and barbed wires.. + /// + internal static string FeatureNoCollisionDescription { + get { + return ResourceManager.GetString("FeatureNoCollisionDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to nocoll. + /// + internal static string FeatureNoCollisionName { + get { + return ResourceManager.GetString("FeatureNoCollisionName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No weapon malfunctions: no misfires or failures to eject or feed. No jammed bolts or overheating.. + /// + internal static string FeatureNoMalfunctionsDescription { + get { + return ResourceManager.GetString("FeatureNoMalfunctionsDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to nomal. + /// + internal static string FeatureNoMalfunctionsName { + get { + return ResourceManager.GetString("FeatureNoMalfunctionsName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No recoil.. + /// + internal static string FeatureNoRecoilDescription { + get { + return ResourceManager.GetString("FeatureNoRecoilDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to norecoil. + /// + internal static string FeatureNoRecoilName { + get { + return ResourceManager.GetString("FeatureNoRecoilName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No sway.. + /// + internal static string FeatureNoSwayDescription { + get { + return ResourceManager.GetString("FeatureNoSwayDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to nosway. + /// + internal static string FeatureNoSwayName { + get { + return ResourceManager.GetString("FeatureNoSwayName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No visor, so even when using a face shield-visor you won't see it.. + /// + internal static string FeatureNoVisorDescription { + get { + return ResourceManager.GetString("FeatureNoVisorDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to novisor. + /// + internal static string FeatureNoVisorName { + get { + return ResourceManager.GetString("FeatureNoVisorName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Wallhack (you'll see Bear/Boss/Cultist/Scav/Usec with configurable colors through walls). Charms, boxes, info (weapon and health), skeletons and distance.. + /// + internal static string FeaturePlayersDescription { + get { + return ResourceManager.GetString("FeaturePlayersDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} {1}% {2}. + /// + internal static string FeaturePlayersFormat { + get { + return ResourceManager.GetString("FeaturePlayersFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to wallhack. + /// + internal static string FeaturePlayersName { + get { + return ResourceManager.GetString("FeaturePlayersName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to [{0}m]. + /// + internal static string FeaturePointOfInterestsDistanceFormat { + get { + return ResourceManager.GetString("FeaturePointOfInterestsDistanceFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} {1} {2}. + /// + internal static string FeaturePointOfInterestsFormat { + get { + return ResourceManager.GetString("FeaturePointOfInterestsFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to >> In {0} {1}. + /// + internal static string FeaturePointOfInterestsGroupFormat { + get { + return ResourceManager.GetString("FeaturePointOfInterestsGroupFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to (in {0}). + /// + internal static string FeaturePointOfInterestsOwnerFormat { + get { + return ResourceManager.GetString("FeaturePointOfInterestsOwnerFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Locations for taking/placing quest items. Only items related to your started quests are displayed.. + /// + internal static string FeatureQuestsDescription { + get { + return ResourceManager.GetString("FeatureQuestsDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} ({1}). + /// + internal static string FeatureQuestsFormat { + get { + return ResourceManager.GetString("FeatureQuestsFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to quest. + /// + internal static string FeatureQuestsName { + get { + return ResourceManager.GetString("FeatureQuestsName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Quick-throw grenades.. + /// + internal static string FeatureQuickTrowDescription { + get { + return ResourceManager.GetString("FeatureQuickTrowDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to quickthrow. + /// + internal static string FeatureQuickTrowName { + get { + return ResourceManager.GetString("FeatureQuickTrowName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 2D radar.. + /// + internal static string FeatureRadarDescription { + get { + return ResourceManager.GetString("FeatureRadarDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to radar. + /// + internal static string FeatureRadarName { + get { + return ResourceManager.GetString("FeatureRadarName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to [summary]. + /// + internal static string FeatureRendererSummary { + get { + return ResourceManager.GetString("FeatureRendererSummary", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Welcome to EFT-Trainer !. + /// + internal static string FeatureRendererWelcome { + get { + return ResourceManager.GetString("FeatureRendererWelcome", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All skills to Elite level (51) and all weapons mastering to level 3.. + /// + internal static string FeatureSkillsDescription { + get { + return ResourceManager.GetString("FeatureSkillsDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to skills. + /// + internal static string FeatureSkillsName { + get { + return ResourceManager.GetString("FeatureSkillsName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Speed boost to be able to go through walls/objects, or to move faster. Be careful to not kill yourself.. + /// + internal static string FeatureSpeedDescription { + get { + return ResourceManager.GetString("FeatureSpeedDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to speed. + /// + internal static string FeatureSpeedName { + get { + return ResourceManager.GetString("FeatureSpeedName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unlimited stamina.. + /// + internal static string FeatureStaminaDescription { + get { + return ResourceManager.GetString("FeatureStaminaDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to stamina. + /// + internal static string FeatureStaminaName { + get { + return ResourceManager.GetString("FeatureStaminaName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hidden/special stashes like buried barrels, ground caches, air drops or corpses.. + /// + internal static string FeatureStashDescription { + get { + return ResourceManager.GetString("FeatureStashDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to stash. + /// + internal static string FeatureStashName { + get { + return ResourceManager.GetString("FeatureStashName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Thermal vision.. + /// + internal static string FeatureThermalVisionDescription { + get { + return ResourceManager.GetString("FeatureThermalVisionDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to thermal. + /// + internal static string FeatureThermalVisionName { + get { + return ResourceManager.GetString("FeatureThermalVisionName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Summon train on compatible maps like Reserve or Lighthouse.. + /// + internal static string FeatureTrainDescription { + get { + return ResourceManager.GetString("FeatureTrainDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to train. + /// + internal static string FeatureTrainName { + get { + return ResourceManager.GetString("FeatureTrainName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to wallshoot. + /// + internal static string FeatureWallShootName { + get { + return ResourceManager.GetString("FeatureWallShootName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Clear weather.. + /// + internal static string FeatureWeatherDescription { + get { + return ResourceManager.GetString("FeatureWeatherDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to weather. + /// + internal static string FeatureWeatherName { + get { + return ResourceManager.GetString("FeatureWeatherName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Door/Keycard reader/Car unlocker.. + /// + internal static string FeatureWorldInteractiveObjectsDescription { + get { + return ResourceManager.GetString("FeatureWorldInteractiveObjectsDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to opener. + /// + internal static string FeatureWorldInteractiveObjectsName { + get { + return ResourceManager.GetString("FeatureWorldInteractiveObjectsName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Armor-damage color. + /// + internal static string PropertyArmorDamageColor { + get { + return ResourceManager.GetString("PropertyArmorDamageColor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Backward. + /// + internal static string PropertyBackward { + get { + return ResourceManager.GetString("PropertyBackward", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bear colors. + /// + internal static string PropertyBearColors { + get { + return ResourceManager.GetString("PropertyBearColors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Border color. + /// + internal static string PropertyBorderColor { + get { + return ResourceManager.GetString("PropertyBorderColor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Boss colors. + /// + internal static string PropertyBossColors { + get { + return ResourceManager.GetString("PropertyBossColors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Box thickness. + /// + internal static string PropertyBoxThickness { + get { + return ResourceManager.GetString("PropertyBoxThickness", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cache time (sec). + /// + internal static string PropertyCacheTimeInSec { + get { + return ResourceManager.GetString("PropertyCacheTimeInSec", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Camera offset. + /// + internal static string PropertyCameraOffset { + get { + return ResourceManager.GetString("PropertyCameraOffset", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Change time. + /// + internal static string PropertyChangeTime { + get { + return ResourceManager.GetString("PropertyChangeTime", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Color. + /// + internal static string PropertyColor { + get { + return ResourceManager.GetString("PropertyColor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cultist colors. + /// + internal static string PropertyCultistColors { + get { + return ResourceManager.GetString("PropertyCultistColors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Display time. + /// + internal static string PropertyDisplayTime { + get { + return ResourceManager.GetString("PropertyDisplayTime", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Distance. + /// + internal static string PropertyDistance { + get { + return ResourceManager.GetString("PropertyDistance", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Eligible color. + /// + internal static string PropertyEligibleColor { + get { + return ResourceManager.GetString("PropertyEligibleColor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enabled. + /// + internal static string PropertyEnabled { + get { + return ResourceManager.GetString("PropertyEnabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fade-out time. + /// + internal static string PropertyFadeOutTime { + get { + return ResourceManager.GetString("PropertyFadeOutTime", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fast mode. + /// + internal static string PropertyFastMode { + get { + return ResourceManager.GetString("PropertyFastMode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fast movement speed. + /// + internal static string PropertyFastMovementSpeed { + get { + return ResourceManager.GetString("PropertyFastMovementSpeed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Food / water. + /// + internal static string PropertyFoodWater { + get { + return ResourceManager.GetString("PropertyFoodWater", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Forward. + /// + internal static string PropertyForward { + get { + return ResourceManager.GetString("PropertyForward", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to FOV. + /// + internal static string PropertyFov { + get { + return ResourceManager.GetString("PropertyFov", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to FOV circle color. + /// + internal static string PropertyFovCircleColor { + get { + return ResourceManager.GetString("PropertyFovCircleColor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to FOV circle thickness. + /// + internal static string PropertyFovCircleThickness { + get { + return ResourceManager.GetString("PropertyFovCircleThickness", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to FOV radius. + /// + internal static string PropertyFovRadius { + get { + return ResourceManager.GetString("PropertyFovRadius", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Free look sensitivity. + /// + internal static string PropertyFreeLookSensitivity { + get { + return ResourceManager.GetString("PropertyFreeLookSensitivity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Grouping Color. + /// + internal static string PropertyGroupingColor { + get { + return ResourceManager.GetString("PropertyGroupingColor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Health-damage color. + /// + internal static string PropertyHealthDamageColor { + get { + return ResourceManager.GetString("PropertyHealthDamageColor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hide when aiming. + /// + internal static string PropertyHideWhenAiming { + get { + return ResourceManager.GetString("PropertyHideWhenAiming", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hit-marker color. + /// + internal static string PropertyHitMarkerColor { + get { + return ResourceManager.GetString("PropertyHitMarkerColor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Info color. + /// + internal static string PropertyInfoColor { + get { + return ResourceManager.GetString("PropertyInfoColor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Intensity. + /// + internal static string PropertyIntensity { + get { + return ResourceManager.GetString("PropertyIntensity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Key. + /// + internal static string PropertyKey { + get { + return ResourceManager.GetString("PropertyKey", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Left. + /// + internal static string PropertyLeft { + get { + return ResourceManager.GetString("PropertyLeft", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Marksman colors. + /// + internal static string PropertyMarksmanColors { + get { + return ResourceManager.GetString("PropertyMarksmanColors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maximum distance. + /// + internal static string PropertyMaximumDistance { + get { + return ResourceManager.GetString("PropertyMaximumDistance", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Movement speed. + /// + internal static string PropertyMovementSpeed { + get { + return ResourceManager.GetString("PropertyMovementSpeed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Not eligible color. + /// + internal static string PropertyNotEligibleColor { + get { + return ResourceManager.GetString("PropertyNotEligibleColor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Not shootable colors. + /// + internal static string PropertyNotShootableColors { + get { + return ResourceManager.GetString("PropertyNotShootableColors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Radar background. + /// + internal static string PropertyRadarBackground { + get { + return ResourceManager.GetString("PropertyRadarBackground", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Radar crosshair. + /// + internal static string PropertyRadarCrosshair { + get { + return ResourceManager.GetString("PropertyRadarCrosshair", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Radar percentage. + /// + internal static string PropertyRadarPercentage { + get { + return ResourceManager.GetString("PropertyRadarPercentage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Radar range. + /// + internal static string PropertyRadarRange { + get { + return ResourceManager.GetString("PropertyRadarRange", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Range. + /// + internal static string PropertyRange { + get { + return ResourceManager.GetString("PropertyRange", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Rate. + /// + internal static string PropertyRate { + get { + return ResourceManager.GetString("PropertyRate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remove negative effects. + /// + internal static string PropertyRemoveNegativeEffects { + get { + return ResourceManager.GetString("PropertyRemoveNegativeEffects", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Right. + /// + internal static string PropertyRight { + get { + return ResourceManager.GetString("PropertyRight", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Rogue-Usec colors. + /// + internal static string PropertyRogueUsecColors { + get { + return ResourceManager.GetString("PropertyRogueUsecColors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Scav-assault colors. + /// + internal static string PropertyScavAssaultColors { + get { + return ResourceManager.GetString("PropertyScavAssaultColors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Scav colors. + /// + internal static string PropertyScavColors { + get { + return ResourceManager.GetString("PropertyScavColors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Scav-raider colors. + /// + internal static string PropertyScavRaiderColors { + get { + return ResourceManager.GetString("PropertyScavRaiderColors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Search inside containers. + /// + internal static string PropertySearchInsideContainers { + get { + return ResourceManager.GetString("PropertySearchInsideContainers", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Search inside corpses. + /// + internal static string PropertySearchInsideCorpses { + get { + return ResourceManager.GetString("PropertySearchInsideCorpses", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Shootable colors. + /// + internal static string PropertyShootableColors { + get { + return ResourceManager.GetString("PropertyShootableColors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show armor damage. + /// + internal static string PropertyShowArmorDamage { + get { + return ResourceManager.GetString("PropertyShowArmorDamage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show Bosses. + /// + internal static string PropertyShowBosses { + get { + return ResourceManager.GetString("PropertyShowBosses", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show boxes. + /// + internal static string PropertyShowBoxes { + get { + return ResourceManager.GetString("PropertyShowBoxes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show charms. + /// + internal static string PropertyShowCharms { + get { + return ResourceManager.GetString("PropertyShowCharms", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show compass. + /// + internal static string PropertyShowCompass { + get { + return ResourceManager.GetString("PropertyShowCompass", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show containers. + /// + internal static string PropertyShowContainers { + get { + return ResourceManager.GetString("PropertyShowContainers", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show coordinates. + /// + internal static string PropertyShowCoordinates { + get { + return ResourceManager.GetString("PropertyShowCoordinates", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show corpses. + /// + internal static string PropertyShowCorpses { + get { + return ResourceManager.GetString("PropertyShowCorpses", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show Cultists. + /// + internal static string PropertyShowCultists { + get { + return ResourceManager.GetString("PropertyShowCultists", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show eligible. + /// + internal static string PropertyShowEligible { + get { + return ResourceManager.GetString("PropertyShowEligible", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show fov circle. + /// + internal static string PropertyShowFovCircle { + get { + return ResourceManager.GetString("PropertyShowFovCircle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show health-damage. + /// + internal static string PropertyShowHealthDamage { + get { + return ResourceManager.GetString("PropertyShowHealthDamage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show Hit-marker. + /// + internal static string PropertyShowHitMarker { + get { + return ResourceManager.GetString("PropertyShowHitMarker", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show infos. + /// + internal static string PropertyShowInfos { + get { + return ResourceManager.GetString("PropertyShowInfos", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show map. + /// + internal static string PropertyShowMap { + get { + return ResourceManager.GetString("PropertyShowMap", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show Marksmen. + /// + internal static string PropertyShowMarksmen { + get { + return ResourceManager.GetString("PropertyShowMarksmen", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show not eligible. + /// + internal static string PropertyShowNotEligible { + get { + return ResourceManager.GetString("PropertyShowNotEligible", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show not shootable. + /// + internal static string PropertyShowNotShootable { + get { + return ResourceManager.GetString("PropertyShowNotShootable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show players. + /// + internal static string PropertyShowPlayers { + get { + return ResourceManager.GetString("PropertyShowPlayers", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show prices. + /// + internal static string PropertyShowPrices { + get { + return ResourceManager.GetString("PropertyShowPrices", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show Rogues. + /// + internal static string PropertyShowRogues { + get { + return ResourceManager.GetString("PropertyShowRogues", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show Scav-assaults. + /// + internal static string PropertyShowScavAssaults { + get { + return ResourceManager.GetString("PropertyShowScavAssaults", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show Scav-raiders. + /// + internal static string PropertyShowScavRaiders { + get { + return ResourceManager.GetString("PropertyShowScavRaiders", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show Scavs. + /// + internal static string PropertyShowScavs { + get { + return ResourceManager.GetString("PropertyShowScavs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show shootable. + /// + internal static string PropertyShowShootable { + get { + return ResourceManager.GetString("PropertyShowShootable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show skeletons. + /// + internal static string PropertyShowSkeletons { + get { + return ResourceManager.GetString("PropertyShowSkeletons", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Silent aim. + /// + internal static string PropertySilentAim { + get { + return ResourceManager.GetString("PropertySilentAim", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Silent aim next-shot-delay. + /// + internal static string PropertySilentAimNextShotDelay { + get { + return ResourceManager.GetString("PropertySilentAimNextShotDelay", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Silent aim speed-factor. + /// + internal static string PropertySilentAimSpeedFactor { + get { + return ResourceManager.GetString("PropertySilentAimSpeedFactor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Size. + /// + internal static string PropertySize { + get { + return ResourceManager.GetString("PropertySize", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Skeleton thickness. + /// + internal static string PropertySkeletonThickness { + get { + return ResourceManager.GetString("PropertySkeletonThickness", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Smoothness. + /// + internal static string PropertySmoothness { + get { + return ResourceManager.GetString("PropertySmoothness", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Status filter. + /// + internal static string PropertyStatusFilter { + get { + return ResourceManager.GetString("PropertyStatusFilter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Teleport. + /// + internal static string PropertyTeleport { + get { + return ResourceManager.GetString("PropertyTeleport", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Thickness. + /// + internal static string PropertyThickness { + get { + return ResourceManager.GetString("PropertyThickness", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Example: ["foo", "bar"] or with extended properties: [{"Name":"foo","Color":[1.0,0.0,0.0,1.0]},{"Name":"bar","Color":[1.0,1.0,1.0,0.8],"Rarity":"Rare"}]. + /// + internal static string PropertyTrackedNamesComment { + get { + return ResourceManager.GetString("PropertyTrackedNamesComment", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Track Wishlist. + /// + internal static string PropertyTrackWishlist { + get { + return ResourceManager.GetString("PropertyTrackWishlist", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Usec colors. + /// + internal static string PropertyUsecColors { + get { + return ResourceManager.GetString("PropertyUsecColors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Vitals only. + /// + internal static string PropertyVitalsOnly { + get { + return ResourceManager.GetString("PropertyVitalsOnly", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to X. + /// + internal static string PropertyX { + get { + return ResourceManager.GetString("PropertyX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to XRay-Vision. + /// + internal static string PropertyXRayVision { + get { + return ResourceManager.GetString("PropertyXRayVision", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Y. + /// + internal static string PropertyY { + get { + return ResourceManager.GetString("PropertyY", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to off. + /// + internal static string TextOff { + get { + return ResourceManager.GetString("TextOff", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to on. + /// + internal static string TextOn { + get { + return ResourceManager.GetString("TextOn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ------. + /// + internal static string TextSeparator { + get { + return ResourceManager.GetString("TextSeparator", resourceCulture); + } + } + } +} diff --git a/Properties/Strings.fr.Designer.cs b/Properties/Strings.fr.Designer.cs new file mode 100644 index 00000000..e69de29b diff --git a/Properties/Strings.fr.resx b/Properties/Strings.fr.resx new file mode 100644 index 00000000..358e1c8d --- /dev/null +++ b/Properties/Strings.fr.resx @@ -0,0 +1,924 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + dump + + + Analyse des objets du jeu... + + + Analyse des scenes... + + + Analyse crée dans {0} + Filename + + + list + + + {0} [{1}] {2} + Item name, count, optional rarity + + + listr + + + ({0}) + Rarity + + + {0} objet(s) trouvé(s) + Item count + + + listsr + + + Charger les réglages + + + load + + + Chargement de {0} + Filename + + + loadtl + + + Enregistrer les réglages + + + Soyez prudent lorsque vous mettez à jour ce fichier :) +Pour les clés, utilisez https://docs.unity3d.com/ScriptReference/KeyCode.html +Les couleurs sont stockées sous la forme d'un tableau de valeurs flottantes 'RGBA' + + + save + + + Enregistrement de {0} + Filename + + + savetl + + + spawn + + + status + + + {0} est {1} {2} + Feature name, status, optional toggle text if a key is set + + + ({0} pour basculer) + Key + + + template + + + {0}: {1} [{2}] + Template id, short-name, name + + + {0} template(s) trouvée(s) + Template count + + + track + + + tracklist + + + Suivi: {0} {1} + Item short-name, optional rarity + + + ({0}) + Rarity + + + Liste de suivi mise à jour... + + + Suivi: {0} (Liste de souhaits) + Item short-name + + + trackr + + + tracksr + + + untrack + + + Modification de {0} avec {1} + Method names + + + Rafraichissement de {0} en {1}ms + Type name, elapsed milliseconds + + + Enregistrement de la commande {0}... + Command name + + + Enregistrement de la commande {0} avec des arguments... + Command name + + + E + + + N + + + NE + + + NO + + + S + + + SE + + + SO + + + O + + + Impossible de trouver {0} dans {1} + Field name, type name + + + Impossible de trouver la méthode originale {0} + Method name + + + Impossible de trouver la méthode suffixe {0} + Method name + + + Impossible de trouver la méthode préfixe {0} + Method name + + + Impossible de charger {0}. {1} + Filename, error message + + + Impossible d'enregistrer {0}. {1} + Filename, error message + + + {0} semble corrompu. Merci de corriger + Filename + + + {0} semble corrompu dans {1}. Merci de corriger + Key, filename + + + Impossible de créer l'objet! + + + Impossible de charger le paquet! + + + {0} introuvable! + Filename + + + Arguments invalides + + + Aucune template trouvée! + + + {0} templates trouvées, essayez d'être plus spécficique + Template count > 1 + + + Type non supporté: {0} + Property type-name + + + Robot de visée. Visée et/ou tir automatique. + + + aimbot + + + Munitions illimitées. + + + ammo + + + Force toutes les armes (même les fusils à verrou) à utiliser le mode de tir automatique avec une cadence de tir personnalisable. + + + autogun + + + Caméra libre avec mode rapide et téléportation. + + + camera + + + Cette fenêtre principale. + + + commands + + + EFT Trainer + + + Réticule dont la taille, la couleur et l'épaisseur sont personnalisables et qui se masque automatiquement lors de la visée. + + + crosshair + + + Durabilité maximale des objets. + + + durability + + + Tous les objets ont déjà été examinés. Recherche instantanée. + + + examine + + + Points d'exfiltration avec couleurs personnalisables en fonction de l'éligibilité, du filtre de statut, de la distance. + + + {0} ({1}) + Name, status + + + exfil + + + Activate + + + Closed + + + Open + + + Pending + + + Requirement + + + Timer + + + Tirer à travers un mur, un casque, un gilet ou un matériau avec une pénétration maximale et une déviation/ricochet minimale. + + + Modification du champ de vision. + + + fovchanger + + + Rafraîchir toutes les informations sur le jeu pour d'autres fonctionnalités. + + + gamestate + + + Empêcher les robots de vous voir. + + + ghost + + + Aperçu des grenades. + + + grenade + + + Pleine santé, éviter tout dommage (même en cas de chute), maintenir l'énergie et l'hydratation au maximum. + + + health + + + Marqueurs d'impacts (armure, santé avec couleurs configurables). + + + hits + + + ({0},{1}) + X, y + + + Affichage (boussole, munitions restantes dans la chambre / le chargeur, mode de tir, coordonnées). + + + hud + + + - + + + {0}+{1}/{2} [{3}] + Magazine count, chamber count, magazine capacity, fire-mode + + + Modifier la distance pour l'interaction avec le loot et les portes. + + + interact + + + Liste de tous les objets à looter et suivi de n'importe quel objet par nom, rareté ou liste de souhaits dans le raid (même dans les conteneurs et les cadavres). Utilisez les commandes track et tracklist pour contrôler l'affichage. + + + loot + + + Carte plein écran avec radar. + + + map + + + Vision nocturne. + + + night + + + Pas de collisions physiques, ce qui vous immunise contre les balles, les grenades et les fils barbelés. + + + nocoll + + + Pas de dysfonctionnement de l'arme : pas de ratés de tir, d'éjection ou d'alimentation. Pas de blocage de la culasse ni de surchauffe. + + + nomal + + + Pas de recul. + + + norecoil + + + Pas d'oscillation. + + + nosway + + + Pas de visière, donc même si vous utilisez un écran facial, vous ne le verrez pas. + + + novisor + + + Wallhack (vous verrez Bear/Boss/Cultist/Scav/Usec avec des couleurs configurables à travers les murs). Silhouettes, boîtes, infos (armes et santé), squelettes et distance. + + + {0} {1}% {2} + Weapon name, health %, distance + + + wallhack + + + [{0}m] + Distance + + + {0} {1} {2} + Name, optional formatted owner, optional formatted distance + + + >> In {0} {1} + Owner, distance + + + (in {0}) + Owner + + + Emplacements pour prendre/placer des objets de quête. Seuls les objets liés aux quêtes que vous avez commencées sont affichés. + + + {0} ({1}) + Condition description, quest name + + + quest + + + Grenades à lancer rapide. + + + quickthrow + + + Radar 2D. + + + radar + + + [sommaire] + + + Bienvenue à EFT-Trainer ! + + + Toutes les compétences au niveau Elite (51) et toutes les armes au niveau 3. + + + skills + + + Augmentation de la vitesse pour pouvoir passer à travers les murs/objets, ou pour se déplacer plus rapidement. Faites attention à ne pas vous tuer. + + + speed + + + Endurance illimitée. + + + stamina + + + Voir les cachettes comme des barils enterrés, des caches au sol, des parachutages ou des cadavres. + + + stash + + + Vision thermique. + + + thermal + + + Appeler un train sur des cartes compatibles comme Reserve ou Lighthouse. + + + train + + + wallshoot + + + Temps dégagé. + + + weather + + + Déverrouillage de porte/lecteur de carte magnétique/voiture. + + + opener + + + Couleur impact armure + + + Arrière + + + Couleurs Bear + + + Couleur bordure + + + Couleurs Boss + + + Epaisseur boîte + + + Durée de cache (sec) + + + Offset de camera + + + Changer l'heure + + + Couleur + + + Couleurs Cultistes + + + Temps d'affichage + + + Distance + + + Couleur éligible + + + Activé + + + Temps de fondu + + + Mode rapide + + + Vitesse de mvt. rapide + + + Nourriture / eau + + + Avant + + + Champ visuel + + + Couleur champ visuel + + + Epaisseur champ visuel + + + Rayon champ visuel + + + Sensibilité vision libre + + + Couleur de groupement + + + Couleur impact santé + + + Cacher en cas de visée + + + Couleur du marqueur + + + Couleur d'information + + + Intensité + + + Touche + + + Gauche + + + Couleurs Snipers + + + Distance maximum + + + Vitesse de mouvement + + + Couleur non-éligible + + + Couleurs des non-cibles + + + Arrière-plan du radar + + + Réticule radar + + + Pourcentage du radar + + + Portée du radar + + + Portée + + + Cadence + + + Supprimer effets négatifs + + + Droite + + + Couleurs Rogue-Usec + + + Couleurs Scav-assault + + + Couleurs Scav + + + Couleurs Scav-raider + + + Chercher les conteneurs + + + Chercher les cadavres + + + Couleurs des cibles + + + Montrer impacts armure + + + Montrer les Boss + + + Montrer les boites + + + Montrer les silhouettes + + + Montrer la boussole + + + Montrer les conteneurs + + + Montrer les coordonnées + + + Montrer les cadavres + + + Montrer les Cultistes + + + Montrer les éligibles + + + Montrer le champ visuel + + + Montrer impacts santé + + + Montrer les marqueurs + + + Montrer les infos + + + Montrer la carte + + + Montrer les Snipers + + + Montrer les non-éligibles + + + Montrer les non-cibles + + + Montrer les joueurs + + + Montrer les prix + + + Montrer les Rogues + + + Montrer les Scav-assaults + + + Montrer les Scav-raiders + + + Montrer les Scavs + + + Montrer les cibles + + + Montrer les squelettes + + + Visée silencieuse + + + Delai du prochain tir + + + Vitesse de visée + + + Taille + + + Epaisseur du squelette + + + Lissage + + + Filtre de statut + + + Teleporter + + + Epaisseur + + + Exemple: ["foo", "bar"] ou avec des propriétés étendues: [{"Name":"foo","Color":[1.0,0.0,0.0,1.0]},{"Name":"bar","Color":[1.0,1.0,1.0,0.8],"Rarity":"Rare"}] + + + Suivre la liste de souhaits + + + Couleurs Usec + + + Organes vitaux seulement + + + X + + + Vision à rayons X + + + Y + + + off + + + on + + + ------ + + \ No newline at end of file diff --git a/Properties/Strings.resx b/Properties/Strings.resx new file mode 100644 index 00000000..983d8734 --- /dev/null +++ b/Properties/Strings.resx @@ -0,0 +1,924 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + dump + + + Dumping game objects... + + + Dumping Scenes... + + + Dump created in {0} + Filename + + + list + + + {0} [{1}] {2} + Item name, count, optional rarity + + + listr + + + ({0}) + Rarity + + + Found {0} item(s) + Item count + + + listsr + + + Load settings + + + load + + + Loaded {0} + Filename + + + loadtl + + + Save settings + + + Be careful when updating this file :) +For keys, use https://docs.unity3d.com/ScriptReference/KeyCode.html +Colors are stored as an array of 'RGBA' floats + + + save + + + Saved {0} + Filename + + + savetl + + + spawn + + + status + + + {0} is {1} {2} + Feature name, status, optional toggle text if a key is set + + + ({0} to toggle) + Key + + + template + + + {0}: {1} [{2}] + Template id, short-name, name + + + Found {0} template(s) + Template count + + + track + + + tracklist + + + Tracking: {0} {1} + Item short-name, optional rarity + + + ({0}) + Rarity + + + Tracking list updated... + + + Tracking: {0} (Wishlist) + Item short-name + + + trackr + + + tracksr + + + untrack + + + Patched {0} with {1} + Method names + + + Refreshed {0} in {1}ms + Type name, elapsed milliseconds + + + Registering {0} command... + Command name + + + Registering {0} command with arguments... + Command name + + + E + + + N + + + NE + + + NW + + + S + + + SE + + + SW + + + W + + + Unable to find {0} on {1} + Field name, type name + + + Cannot find original method {0} + Method name + + + Cannot find postfix method {0} + Method name + + + Cannot find prefix method {0} + Method name + + + Unable to load {0}. {1} + Filename, error message + + + Unable to save {0}. {1} + Filename, error message + + + {0} seems corrupted. Please fix + Filename + + + {0} seems corrupted in {1}. Please fix + Key, filename + + + Failed to create item! + + + Failed to load item bundle! + + + {0} not found! + Filename + + + Invalid arguments + + + No template found! + + + Found {0} templates, be more specific + Template count > 1 + + + Unsupported type: {0} + Property type-name + + + Aimbot. Automatic aiming and/or shooting (SilentAim). + + + aimbot + + + Unlimited ammo. + + + ammo + + + Force all guns (even bolt action guns) to use automatic firing mode with customizable fire rate. + + + autogun + + + Free camera with fast mode and teleportation. + + + camera + + + This main popup window. + + + commands + + + EFT Trainer + + + Crosshair with customizable size, color, thickness and auto-hide feature when aiming. + + + crosshair + + + Maximum durability of items. + + + durability + + + All items already examined. Instant search. + + + examine + + + Exfiltration points with customizable colors given eligibility, status filter, distance. + + + {0} ({1}) + Name, status + + + exfil + + + Activate + + + Closed + + + Open + + + Pending + + + Requirement + + + Timer + + + Shoot through wall/helmet/vest/material with maximum penetration and minimal deviation/ricochet. + + + Change Field Of View (FOV). + + + fovchanger + + + Refresh all game information for other features. + + + gamestate + + + Stop bots from seeing you. + + + ghost + + + Grenades outline. + + + grenade + + + Full health, prevent any damage (so even when falling), keep energy and hydration at maximum. + + + health + + + Hit markers (hit, armor, health with configurable colors). + + + hits + + + ({0},{1}) + X, y + + + HUD (compass, ammo left in chamber / magazine, fire mode, coordinates). + + + hud + + + - + + + {0}+{1}/{2} [{3}] + Magazine count, chamber count, magazine capacity, fire-mode + + + Change distance for loot/door interaction. + + + interact + + + List all lootable items and track any item by name or rarity or in-game wishlist in raid (even in containers and corpses). Use track and tracklist commands to control display. + + + loot + + + Full screen map with radar esp. + + + map + + + Night vision. + + + night + + + No physical collisions, making you immune to bullets, grenades and barbed wires. + + + nocoll + + + No weapon malfunctions: no misfires or failures to eject or feed. No jammed bolts or overheating. + + + nomal + + + No recoil. + + + norecoil + + + No sway. + + + nosway + + + No visor, so even when using a face shield-visor you won't see it. + + + novisor + + + Wallhack (you'll see Bear/Boss/Cultist/Scav/Usec with configurable colors through walls). Charms, boxes, info (weapon and health), skeletons and distance. + + + {0} {1}% {2} + Weapon name, health %, distance + + + wallhack + + + [{0}m] + Distance + + + {0} {1} {2} + Name, optional formatted owner, optional formatted distance + + + >> In {0} {1} + Owner, distance + + + (in {0}) + Owner + + + Locations for taking/placing quest items. Only items related to your started quests are displayed. + + + {0} ({1}) + Condition description, quest name + + + quest + + + Quick-throw grenades. + + + quickthrow + + + 2D radar. + + + radar + + + [summary] + + + Welcome to EFT-Trainer ! + + + All skills to Elite level (51) and all weapons mastering to level 3. + + + skills + + + Speed boost to be able to go through walls/objects, or to move faster. Be careful to not kill yourself. + + + speed + + + Unlimited stamina. + + + stamina + + + Hidden/special stashes like buried barrels, ground caches, air drops or corpses. + + + stash + + + Thermal vision. + + + thermal + + + Summon train on compatible maps like Reserve or Lighthouse. + + + train + + + wallshoot + + + Clear weather. + + + weather + + + Door/Keycard reader/Car unlocker. + + + opener + + + Armor-damage color + + + Backward + + + Bear colors + + + Border color + + + Boss colors + + + Box thickness + + + Cache time (sec) + + + Camera offset + + + Change time + + + Color + + + Cultist colors + + + Display time + + + Distance + + + Eligible color + + + Enabled + + + Fade-out time + + + Fast mode + + + Fast movement speed + + + Food / water + + + Forward + + + FOV + + + FOV circle color + + + FOV circle thickness + + + FOV radius + + + Free look sensitivity + + + Grouping Color + + + Health-damage color + + + Hide when aiming + + + Hit-marker color + + + Info color + + + Intensity + + + Key + + + Left + + + Marksman colors + + + Maximum distance + + + Movement speed + + + Not eligible color + + + Not shootable colors + + + Radar background + + + Radar crosshair + + + Radar percentage + + + Radar range + + + Range + + + Rate + + + Remove negative effects + + + Right + + + Rogue-Usec colors + + + Scav-assault colors + + + Scav colors + + + Scav-raider colors + + + Search inside containers + + + Search inside corpses + + + Shootable colors + + + Show armor damage + + + Show Bosses + + + Show boxes + + + Show charms + + + Show compass + + + Show containers + + + Show coordinates + + + Show corpses + + + Show Cultists + + + Show eligible + + + Show fov circle + + + Show health-damage + + + Show Hit-marker + + + Show infos + + + Show map + + + Show Marksmen + + + Show not eligible + + + Show not shootable + + + Show players + + + Show prices + + + Show Rogues + + + Show Scav-assaults + + + Show Scav-raiders + + + Show Scavs + + + Show shootable + + + Show skeletons + + + Silent aim + + + Silent aim next-shot-delay + + + Silent aim speed-factor + + + Size + + + Skeleton thickness + + + Smoothness + + + Status filter + + + Teleport + + + Thickness + + + Example: ["foo", "bar"] or with extended properties: [{"Name":"foo","Color":[1.0,0.0,0.0,1.0]},{"Name":"bar","Color":[1.0,1.0,1.0,0.8],"Rarity":"Rare"}] + + + Track Wishlist + + + Usec colors + + + Vitals only + + + X + + + XRay-Vision + + + Y + + + off + + + on + + + ------ + + \ No newline at end of file