diff --git a/osu.Game/Graphics/UserInterface/OsuTabControl.cs b/osu.Game/Graphics/UserInterface/OsuTabControl.cs
index dbcce9a84a..0c220336a5 100644
--- a/osu.Game/Graphics/UserInterface/OsuTabControl.cs
+++ b/osu.Game/Graphics/UserInterface/OsuTabControl.cs
@@ -160,7 +160,7 @@ namespace osu.Game.Graphics.UserInterface
Margin = new MarginPadding { Top = 5, Bottom = 5 },
Origin = Anchor.BottomLeft,
Anchor = Anchor.BottomLeft,
- Text = (value as IHasDescription)?.Description ?? (value as Enum)?.GetDescription() ?? value.ToString(),
+ Text = (value as IHasDescription)?.Description ?? (value as Enum)?.GetLocalisableDescription() ?? value.ToString(),
Font = OsuFont.GetFont(size: 14)
},
Bar = new Box
diff --git a/osu.Game/Graphics/UserInterface/PageTabControl.cs b/osu.Game/Graphics/UserInterface/PageTabControl.cs
index d05a08108a..1ba9ad53bb 100644
--- a/osu.Game/Graphics/UserInterface/PageTabControl.cs
+++ b/osu.Game/Graphics/UserInterface/PageTabControl.cs
@@ -11,6 +11,7 @@ using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.UserInterface;
using osu.Framework.Input.Events;
+using osu.Framework.Localisation;
using osu.Game.Graphics.Sprites;
namespace osu.Game.Graphics.UserInterface
@@ -81,7 +82,7 @@ namespace osu.Game.Graphics.UserInterface
Active.BindValueChanged(active => Text.Font = Text.Font.With(Typeface.Torus, weight: active.NewValue ? FontWeight.Bold : FontWeight.Medium), true);
}
- protected virtual string CreateText() => (Value as Enum)?.GetDescription() ?? Value.ToString();
+ protected virtual LocalisableString CreateText() => (Value as Enum)?.GetLocalisableDescription() ?? Value.ToString();
protected override bool OnHover(HoverEvent e)
{
diff --git a/osu.Game/Overlays/BeatmapListing/FilterTabItem.cs b/osu.Game/Overlays/BeatmapListing/FilterTabItem.cs
index d64ee59682..46cb1e822f 100644
--- a/osu.Game/Overlays/BeatmapListing/FilterTabItem.cs
+++ b/osu.Game/Overlays/BeatmapListing/FilterTabItem.cs
@@ -67,7 +67,7 @@ namespace osu.Game.Overlays.BeatmapListing
///
/// Returns the label text to be used for the supplied .
///
- protected virtual LocalisableString LabelFor(T value) => (value as Enum)?.GetDescription() ?? value.ToString();
+ protected virtual LocalisableString LabelFor(T value) => (value as Enum)?.GetLocalisableDescription() ?? value.ToString();
private void updateState()
{
diff --git a/osu.Game/Overlays/BeatmapListing/SearchCategory.cs b/osu.Game/Overlays/BeatmapListing/SearchCategory.cs
index 84859bf5b5..8a9df76af3 100644
--- a/osu.Game/Overlays/BeatmapListing/SearchCategory.cs
+++ b/osu.Game/Overlays/BeatmapListing/SearchCategory.cs
@@ -1,10 +1,14 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System;
using System.ComponentModel;
+using osu.Framework.Localisation;
+using osu.Game.Resources.Localisation.Web;
namespace osu.Game.Overlays.BeatmapListing
{
+ [LocalisableEnum(typeof(SearchCategoryEnumLocalisationMapper))]
public enum SearchCategory
{
Any,
@@ -23,4 +27,43 @@ namespace osu.Game.Overlays.BeatmapListing
[Description("My Maps")]
Mine,
}
+
+ public class SearchCategoryEnumLocalisationMapper : EnumLocalisationMapper
+ {
+ public override LocalisableString Map(SearchCategory value)
+ {
+ switch (value)
+ {
+ case SearchCategory.Any:
+ return BeatmapsStrings.StatusAny;
+
+ case SearchCategory.Leaderboard:
+ return BeatmapsStrings.StatusLeaderboard;
+
+ case SearchCategory.Ranked:
+ return BeatmapsStrings.StatusRanked;
+
+ case SearchCategory.Qualified:
+ return BeatmapsStrings.StatusQualified;
+
+ case SearchCategory.Loved:
+ return BeatmapsStrings.StatusLoved;
+
+ case SearchCategory.Favourites:
+ return BeatmapsStrings.StatusFavourites;
+
+ case SearchCategory.Pending:
+ return BeatmapsStrings.StatusPending;
+
+ case SearchCategory.Graveyard:
+ return BeatmapsStrings.StatusGraveyard;
+
+ case SearchCategory.Mine:
+ return BeatmapsStrings.StatusMine;
+
+ default:
+ throw new ArgumentOutOfRangeException(nameof(value), value, null);
+ }
+ }
+ }
}
diff --git a/osu.Game/Overlays/BeatmapListing/SearchExplicit.cs b/osu.Game/Overlays/BeatmapListing/SearchExplicit.cs
index 3e57cdd48c..78e6a4e094 100644
--- a/osu.Game/Overlays/BeatmapListing/SearchExplicit.cs
+++ b/osu.Game/Overlays/BeatmapListing/SearchExplicit.cs
@@ -1,11 +1,34 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System;
+using osu.Framework.Localisation;
+using osu.Game.Resources.Localisation.Web;
+
namespace osu.Game.Overlays.BeatmapListing
{
+ [LocalisableEnum(typeof(SearchExplicitEnumLocalisationMapper))]
public enum SearchExplicit
{
Hide,
Show
}
+
+ public class SearchExplicitEnumLocalisationMapper : EnumLocalisationMapper
+ {
+ public override LocalisableString Map(SearchExplicit value)
+ {
+ switch (value)
+ {
+ case SearchExplicit.Hide:
+ return BeatmapsStrings.NsfwExclude;
+
+ case SearchExplicit.Show:
+ return BeatmapsStrings.NsfwInclude;
+
+ default:
+ throw new ArgumentOutOfRangeException(nameof(value), value, null);
+ }
+ }
+ }
}
diff --git a/osu.Game/Overlays/BeatmapListing/SearchExtra.cs b/osu.Game/Overlays/BeatmapListing/SearchExtra.cs
index af37e3264f..4b3fb6e833 100644
--- a/osu.Game/Overlays/BeatmapListing/SearchExtra.cs
+++ b/osu.Game/Overlays/BeatmapListing/SearchExtra.cs
@@ -1,10 +1,14 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System;
using System.ComponentModel;
+using osu.Framework.Localisation;
+using osu.Game.Resources.Localisation.Web;
namespace osu.Game.Overlays.BeatmapListing
{
+ [LocalisableEnum(typeof(SearchExtraEnumLocalisationMapper))]
public enum SearchExtra
{
[Description("Has Video")]
@@ -13,4 +17,22 @@ namespace osu.Game.Overlays.BeatmapListing
[Description("Has Storyboard")]
Storyboard
}
+
+ public class SearchExtraEnumLocalisationMapper : EnumLocalisationMapper
+ {
+ public override LocalisableString Map(SearchExtra value)
+ {
+ switch (value)
+ {
+ case SearchExtra.Video:
+ return BeatmapsStrings.ExtraVideo;
+
+ case SearchExtra.Storyboard:
+ return BeatmapsStrings.ExtraStoryboard;
+
+ default:
+ throw new ArgumentOutOfRangeException(nameof(value), value, null);
+ }
+ }
+ }
}
diff --git a/osu.Game/Overlays/BeatmapListing/SearchGeneral.cs b/osu.Game/Overlays/BeatmapListing/SearchGeneral.cs
index 175942c626..b4c629f7fa 100644
--- a/osu.Game/Overlays/BeatmapListing/SearchGeneral.cs
+++ b/osu.Game/Overlays/BeatmapListing/SearchGeneral.cs
@@ -1,10 +1,14 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System;
using System.ComponentModel;
+using osu.Framework.Localisation;
+using osu.Game.Resources.Localisation.Web;
namespace osu.Game.Overlays.BeatmapListing
{
+ [LocalisableEnum(typeof(SearchGeneralEnumLocalisationMapper))]
public enum SearchGeneral
{
[Description("Recommended difficulty")]
@@ -16,4 +20,25 @@ namespace osu.Game.Overlays.BeatmapListing
[Description("Subscribed mappers")]
Follows
}
+
+ public class SearchGeneralEnumLocalisationMapper : EnumLocalisationMapper
+ {
+ public override LocalisableString Map(SearchGeneral value)
+ {
+ switch (value)
+ {
+ case SearchGeneral.Recommended:
+ return BeatmapsStrings.GeneralRecommended;
+
+ case SearchGeneral.Converts:
+ return BeatmapsStrings.GeneralConverts;
+
+ case SearchGeneral.Follows:
+ return BeatmapsStrings.GeneralFollows;
+
+ default:
+ throw new ArgumentOutOfRangeException(nameof(value), value, null);
+ }
+ }
+ }
}
diff --git a/osu.Game/Overlays/BeatmapListing/SearchGenre.cs b/osu.Game/Overlays/BeatmapListing/SearchGenre.cs
index de437fac3e..b2709ecd2e 100644
--- a/osu.Game/Overlays/BeatmapListing/SearchGenre.cs
+++ b/osu.Game/Overlays/BeatmapListing/SearchGenre.cs
@@ -1,10 +1,14 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System;
using System.ComponentModel;
+using osu.Framework.Localisation;
+using osu.Game.Resources.Localisation.Web;
namespace osu.Game.Overlays.BeatmapListing
{
+ [LocalisableEnum(typeof(SearchGenreEnumLocalisationMapper))]
public enum SearchGenre
{
Any = 0,
@@ -26,4 +30,58 @@ namespace osu.Game.Overlays.BeatmapListing
Folk = 13,
Jazz = 14
}
+
+ public class SearchGenreEnumLocalisationMapper : EnumLocalisationMapper
+ {
+ public override LocalisableString Map(SearchGenre value)
+ {
+ switch (value)
+ {
+ case SearchGenre.Any:
+ return BeatmapsStrings.GenreAny;
+
+ case SearchGenre.Unspecified:
+ return BeatmapsStrings.GenreUnspecified;
+
+ case SearchGenre.VideoGame:
+ return BeatmapsStrings.GenreVideoGame;
+
+ case SearchGenre.Anime:
+ return BeatmapsStrings.GenreAnime;
+
+ case SearchGenre.Rock:
+ return BeatmapsStrings.GenreRock;
+
+ case SearchGenre.Pop:
+ return BeatmapsStrings.GenrePop;
+
+ case SearchGenre.Other:
+ return BeatmapsStrings.GenreOther;
+
+ case SearchGenre.Novelty:
+ return BeatmapsStrings.GenreNovelty;
+
+ case SearchGenre.HipHop:
+ return BeatmapsStrings.GenreHipHop;
+
+ case SearchGenre.Electronic:
+ return BeatmapsStrings.GenreElectronic;
+
+ case SearchGenre.Metal:
+ return BeatmapsStrings.GenreMetal;
+
+ case SearchGenre.Classical:
+ return BeatmapsStrings.GenreClassical;
+
+ case SearchGenre.Folk:
+ return BeatmapsStrings.GenreFolk;
+
+ case SearchGenre.Jazz:
+ return BeatmapsStrings.GenreJazz;
+
+ default:
+ throw new ArgumentOutOfRangeException(nameof(value), value, null);
+ }
+ }
+ }
}
diff --git a/osu.Game/Overlays/BeatmapListing/SearchLanguage.cs b/osu.Game/Overlays/BeatmapListing/SearchLanguage.cs
index 015cee8ce3..352383d576 100644
--- a/osu.Game/Overlays/BeatmapListing/SearchLanguage.cs
+++ b/osu.Game/Overlays/BeatmapListing/SearchLanguage.cs
@@ -1,10 +1,14 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System;
+using osu.Framework.Localisation;
using osu.Framework.Utils;
+using osu.Game.Resources.Localisation.Web;
namespace osu.Game.Overlays.BeatmapListing
{
+ [LocalisableEnum(typeof(SearchLanguageEnumLocalisationMapper))]
[HasOrderedElements]
public enum SearchLanguage
{
@@ -53,4 +57,61 @@ namespace osu.Game.Overlays.BeatmapListing
[Order(13)]
Other
}
+
+ public class SearchLanguageEnumLocalisationMapper : EnumLocalisationMapper
+ {
+ public override LocalisableString Map(SearchLanguage value)
+ {
+ switch (value)
+ {
+ case SearchLanguage.Any:
+ return BeatmapsStrings.LanguageAny;
+
+ case SearchLanguage.Unspecified:
+ return BeatmapsStrings.LanguageUnspecified;
+
+ case SearchLanguage.English:
+ return BeatmapsStrings.LanguageEnglish;
+
+ case SearchLanguage.Japanese:
+ return BeatmapsStrings.LanguageJapanese;
+
+ case SearchLanguage.Chinese:
+ return BeatmapsStrings.LanguageChinese;
+
+ case SearchLanguage.Instrumental:
+ return BeatmapsStrings.LanguageInstrumental;
+
+ case SearchLanguage.Korean:
+ return BeatmapsStrings.LanguageKorean;
+
+ case SearchLanguage.French:
+ return BeatmapsStrings.LanguageFrench;
+
+ case SearchLanguage.German:
+ return BeatmapsStrings.LanguageGerman;
+
+ case SearchLanguage.Swedish:
+ return BeatmapsStrings.LanguageSwedish;
+
+ case SearchLanguage.Spanish:
+ return BeatmapsStrings.LanguageSpanish;
+
+ case SearchLanguage.Italian:
+ return BeatmapsStrings.LanguageItalian;
+
+ case SearchLanguage.Russian:
+ return BeatmapsStrings.LanguageRussian;
+
+ case SearchLanguage.Polish:
+ return BeatmapsStrings.LanguagePolish;
+
+ case SearchLanguage.Other:
+ return BeatmapsStrings.GenreOther;
+
+ default:
+ throw new ArgumentOutOfRangeException(nameof(value), value, null);
+ }
+ }
+ }
}
diff --git a/osu.Game/Overlays/BeatmapListing/SearchPlayed.cs b/osu.Game/Overlays/BeatmapListing/SearchPlayed.cs
index eb7fb46158..93c0644d45 100644
--- a/osu.Game/Overlays/BeatmapListing/SearchPlayed.cs
+++ b/osu.Game/Overlays/BeatmapListing/SearchPlayed.cs
@@ -1,12 +1,38 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System;
+using osu.Framework.Localisation;
+using osu.Game.Resources.Localisation.Web;
+
namespace osu.Game.Overlays.BeatmapListing
{
- public enum SearchPlayed
+[LocalisableEnum(typeof(SearchPlayedEnumLocalisationMapper))]
+public enum SearchPlayed
+{
+ Any,
+ Played,
+ Unplayed
+}
+
+public class SearchPlayedEnumLocalisationMapper : EnumLocalisationMapper
+{
+ public override LocalisableString Map(SearchPlayed value)
{
- Any,
- Played,
- Unplayed
+ switch (value)
+ {
+ case SearchPlayed.Any:
+ return BeatmapsStrings.PlayedAny;
+
+ case SearchPlayed.Played:
+ return BeatmapsStrings.PlayedPlayed;
+
+ case SearchPlayed.Unplayed:
+ return BeatmapsStrings.PlayedUnplayed;
+
+ default:
+ throw new ArgumentOutOfRangeException(nameof(value), value, null);
+ }
}
}
+}
diff --git a/osu.Game/Overlays/BeatmapListing/SortCriteria.cs b/osu.Game/Overlays/BeatmapListing/SortCriteria.cs
index e409cbdda7..5ea885eecc 100644
--- a/osu.Game/Overlays/BeatmapListing/SortCriteria.cs
+++ b/osu.Game/Overlays/BeatmapListing/SortCriteria.cs
@@ -1,8 +1,13 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System;
+using osu.Framework.Localisation;
+using osu.Game.Resources.Localisation.Web;
+
namespace osu.Game.Overlays.BeatmapListing
{
+ [LocalisableEnum(typeof(SortCriteriaLocalisationMapper))]
public enum SortCriteria
{
Title,
@@ -14,4 +19,40 @@ namespace osu.Game.Overlays.BeatmapListing
Favourites,
Relevance
}
+
+ public class SortCriteriaLocalisationMapper : EnumLocalisationMapper
+ {
+ public override LocalisableString Map(SortCriteria value)
+ {
+ switch (value)
+ {
+ case SortCriteria.Title:
+ return BeatmapsStrings.ListingSearchSortingTitle;
+
+ case SortCriteria.Artist:
+ return BeatmapsStrings.ListingSearchSortingArtist;
+
+ case SortCriteria.Difficulty:
+ return BeatmapsStrings.ListingSearchSortingDifficulty;
+
+ case SortCriteria.Ranked:
+ return BeatmapsStrings.ListingSearchSortingRanked;
+
+ case SortCriteria.Rating:
+ return BeatmapsStrings.ListingSearchSortingRating;
+
+ case SortCriteria.Plays:
+ return BeatmapsStrings.ListingSearchSortingPlays;
+
+ case SortCriteria.Favourites:
+ return BeatmapsStrings.ListingSearchSortingFavourites;
+
+ case SortCriteria.Relevance:
+ return BeatmapsStrings.ListingSearchSortingRelevance;
+
+ default:
+ throw new ArgumentOutOfRangeException(nameof(value), value, null);
+ }
+ }
+ }
}
diff --git a/osu.Game/Overlays/OverlaySortTabControl.cs b/osu.Game/Overlays/OverlaySortTabControl.cs
index 0ebabd424f..5ece3e4019 100644
--- a/osu.Game/Overlays/OverlaySortTabControl.cs
+++ b/osu.Game/Overlays/OverlaySortTabControl.cs
@@ -143,7 +143,7 @@ namespace osu.Game.Overlays
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
Font = OsuFont.GetFont(size: 12, weight: FontWeight.SemiBold),
- Text = (value as Enum)?.GetDescription() ?? value.ToString()
+ Text = (value as Enum)?.GetLocalisableDescription() ?? value.ToString()
}
}
});
diff --git a/osu.Game/Overlays/TabControlOverlayHeader.cs b/osu.Game/Overlays/TabControlOverlayHeader.cs
index 7798dfa576..e6f7e250a7 100644
--- a/osu.Game/Overlays/TabControlOverlayHeader.cs
+++ b/osu.Game/Overlays/TabControlOverlayHeader.cs
@@ -106,7 +106,19 @@ namespace osu.Game.Overlays
public OverlayHeaderTabItem(T value)
: base(value)
{
- Text.Text = ((Value as Enum)?.GetDescription() ?? Value.ToString()).ToLower();
+ if (!(Value is Enum enumValue))
+ Text.Text = Value.ToString().ToLower();
+ else
+ {
+ var localisableDescription = enumValue.GetLocalisableDescription();
+ var nonLocalisableDescription = enumValue.GetDescription();
+
+ // If localisable == non-localisable, then we must have a basic string, so .ToLower() is used.
+ Text.Text = localisableDescription.Equals(nonLocalisableDescription)
+ ? nonLocalisableDescription.ToLower()
+ : localisableDescription;
+ }
+
Text.Font = OsuFont.GetFont(size: 14);
Text.Margin = new MarginPadding { Vertical = 16.5f }; // 15px padding + 1.5px line-height difference compensation
Bar.Margin = new MarginPadding { Bottom = bar_height };