Skip to content

Commit

Permalink
Add LocalizedPrototype Type (#747)
Browse files Browse the repository at this point in the history
# Description

Adds a new Type for Prototypes to inherit instead of IPrototype with
standard localization formats and lambda shortcuts to them.

---
  • Loading branch information
DEATHB4DEFEAT authored Oct 2, 2024
1 parent 83bc824 commit 7deb42f
Showing 1 changed file with 35 additions and 0 deletions.
35 changes: 35 additions & 0 deletions Content.Shared/Prototypes/LocalizedPrototype.cs
Original file line number Diff line number Diff line change
@@ -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}";

/// <summary>The localization string for the name of this prototype</summary>
public string NameLoc => ToLocalizationString("name");
/// <summary>The localized string for the name of prototype</summary>
public string Name => Loc.GetString(NameLoc);

/// <summary>
/// Returns an Loc string using the <see cref="field"/> as the 'property'.
/// Given `desc` it will return `this-prototype-PrototypeId-desc`.
/// </summary>
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);
}
}

0 comments on commit 7deb42f

Please sign in to comment.