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);
+ }
+}