A game framework written with osu! in mind.
1// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
2// See the LICENCE file in the repository root for full licence text.
3
4using System;
5
6#nullable enable
7
8namespace osu.Framework.Localisation
9{
10 /// <summary>
11 /// A descriptor representing text that can be localised and formatted.
12 /// </summary>
13 public readonly struct LocalisableString : IEquatable<LocalisableString>
14 {
15 /// <summary>
16 /// The underlying data.
17 /// </summary>
18 internal readonly object? Data;
19
20 /// <summary>
21 /// Creates a new <see cref="LocalisableString"/> with underlying string data.
22 /// </summary>
23 public LocalisableString(string data)
24 {
25 Data = data;
26 }
27
28 /// <summary>
29 /// Creates a new <see cref="LocalisableString"/> with underlying localisable string data.
30 /// </summary>
31 public LocalisableString(ILocalisableStringData data)
32 {
33 Data = data;
34 }
35
36 // it's somehow common to call default(LocalisableString), and we should return empty string then.
37 public override string ToString() => Data?.ToString() ?? string.Empty;
38
39 public bool Equals(LocalisableString other) => LocalisableStringEqualityComparer.Default.Equals(this, other);
40 public override bool Equals(object? obj) => obj is LocalisableString other && Equals(other);
41 public override int GetHashCode() => LocalisableStringEqualityComparer.Default.GetHashCode(this);
42
43 public static implicit operator LocalisableString(string text) => new LocalisableString(text);
44 public static implicit operator LocalisableString(TranslatableString translatable) => new LocalisableString(translatable);
45 public static implicit operator LocalisableString(RomanisableString romanisable) => new LocalisableString(romanisable);
46 public static implicit operator LocalisableString(LocalisableFormattableString formattable) => new LocalisableString(formattable);
47 public static implicit operator LocalisableString(CaseTransformableString transformable) => new LocalisableString(transformable);
48
49 public static bool operator ==(LocalisableString left, LocalisableString right) => left.Equals(right);
50 public static bool operator !=(LocalisableString left, LocalisableString right) => !left.Equals(right);
51 }
52}