diff --git a/Content.Shared/Prototypes/LocalizedPrototype.cs b/Content.Shared/Prototypes/LocalizedPrototype.cs new file mode 100644 index 00000000000..acdd5fc180f --- /dev/null +++ b/Content.Shared/Prototypes/LocalizedPrototype.cs @@ -0,0 +1,35 @@ +using System.Linq; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Prototypes; + +public abstract class LocalizedPrototype : IPrototype +{ + [IdDataField] + public string ID { get; } = default!; + + public const string LocFormat = "{0}-{1}-{2}"; + + /// The localization string for the name of this prototype + public string NameLoc => ToLocalizationString("name"); + /// The localized string for the name of prototype + public string Name => Loc.GetString(NameLoc); + + /// + /// Returns an Loc string using the as the 'property'. + /// Given `desc` it will return `this-prototype-PrototypeId-desc`. + /// + public string ToLocalizationString(string field) + { + // Get the ID of the proto Type + var type = + ((PrototypeAttribute?) Attribute.GetCustomAttribute(GetType(), typeof(PrototypeAttribute)))?.Type + ?? GetType().Name.Remove(GetType().Name.Length - 9); + // Lowercase the first letter + type = char.ToLowerInvariant(type[0]) + type[1..]; + // Replace every uppercase letter with a dash and the lowercase letter + type = type.Aggregate("", (current, c) => current + (char.IsUpper(c) ? "-" + char.ToLowerInvariant(c) : c.ToString())); + + return string.Format(LocFormat, type, ID, field); + } +}