diff --git a/InGameStats.cs b/InGameStats.cs index 8ce1318..4228e1b 100644 --- a/InGameStats.cs +++ b/InGameStats.cs @@ -2,6 +2,8 @@ using UnityEngine.UI; using TMPro; using System.Reflection; +using UnityEngine.Localization; +using UnityEngine.Localization.Tables; namespace InGameStats; @@ -214,11 +216,15 @@ private void Update() { // Update the stat texts with the current values foreach (StatType stat in enabledStats) if (_statTexts.TryGetValue(stat, out TextMeshProUGUI? text) && text != null) { + string titleString = + InGameStatsUtils.statDisplayNames.TryGetValue(stat, out LocalizedString title) + ? title.GetLocalizedString() + : stat.ToString(); try { string value = GetStatValue(stat); - text.text = $"{InGameStatsUtils.statDisplayNames[stat]}: {value}"; + text.text = $"{titleString}: {value}"; } catch { - text.text = $"{InGameStatsUtils.statDisplayNames[stat]}: N/A"; + text.text = $"{titleString}: N/A"; } } } @@ -322,6 +328,9 @@ public void CreateStatUI() { } } + internal static LocalizedString failedString = InGameStatsUtils.TryGetLocalizedString("Failed", "Failed"); + internal static LocalizedString successString = InGameStatsUtils.TryGetLocalizedString("Yes", "Yes"); + /// /// Gets the value of a specific stat based on the provided StatType. /// @@ -347,11 +356,11 @@ private string GetStatValue(StatType stat) { StatType.Shard => RunHandler.isEndless ? "Endless" : (RunHandler.RunData.shardID + 1).ToString(), StatType.Level => InGameStatsUtils.GetLevelStats(), StatType.Seed => RunHandler.RunData.currentSeed.ToString(), - StatType.NoDeath => _noDeath ? "Yes" : "No", - StatType.NoItems => _noItems ? "Yes" : "No", - StatType.NoHit => _noHit ? "Yes" : "No", - StatType.OnlyPerfectLanding => _onlyPerfectLanding ? "Yes" : "No", - StatType.OnlySRanks => _onlySRanks ? "Yes" : "No", + StatType.NoDeath => (_noDeath ? successString : failedString).GetLocalizedString(), + StatType.NoItems => (_noItems ? successString : failedString).GetLocalizedString(), + StatType.NoHit => (_noHit ? successString : failedString).GetLocalizedString(), + StatType.OnlyPerfectLanding => (_onlyPerfectLanding ? successString : failedString).GetLocalizedString(), + StatType.OnlySRanks => (_onlySRanks ? successString : failedString).GetLocalizedString(), _ => "N/A" }; } diff --git a/InGameStats.csproj b/InGameStats.csproj index 1f94574..9a7f732 100644 --- a/InGameStats.csproj +++ b/InGameStats.csproj @@ -12,4 +12,10 @@ none 1.11 + + + + Always + + diff --git a/InGameStats.localization.json b/InGameStats.localization.json new file mode 100644 index 0000000..ae0e766 --- /dev/null +++ b/InGameStats.localization.json @@ -0,0 +1,536 @@ +{ + "PerfectLandingStreak": { + "default": "Perfect Land. Streak", + "en": "Perfect Land. Streak", + "fr": "Série de parfaits", + "zh": "完美着陆连击", + "it": "Serie perfetta", + "de": "Perfekte Land. Serie", + "es-ES": "Racha de perfectos", + "ja": "パーフェクト着陸連続", + "pt-BR": "Sequência de perfeitos", + "ru": "Идеал. серия", + "sv": "Perfekt land. Streak" + }, + "BestLandingStreak": { + "default": "Best Land. Streak", + "en": "Best Land. Streak", + "fr": "Meilleure série", + "zh": "最佳着陆连击", + "it": "Miglior serie", + "de": "Beste Land. Serie", + "es-ES": "Mejor racha", + "ja": "最高着陸連続", + "pt-BR": "Melhor sequência", + "ru": "Лучшая серия", + "sv": "Bästa land. Streak" + }, + "AverageLandingScore": { + "default": "Average Land. Score", + "en": "Average Land. Score", + "fr": "Moyenne d'atterrissage", + "zh": "平均着陆分数", + "it": "Punteggio medio", + "de": "Durchschn. Punktzahl", + "es-ES": "Puntuación media", + "ja": "平均着陸スコア", + "pt-BR": "Pontuação média", + "ru": "Средний балл", + "sv": "Genomsnittlig land. poäng" + }, + "DistanceTravelled": { + "default": "Distance", + "en": "Distance", + "fr": "Distance", + "zh": "距离", + "it": "Distanza", + "de": "Distanz", + "es-ES": "Distancia", + "ja": "距離", + "pt-BR": "Distância", + "ru": "Расстояние", + "sv": "Avstånd" + }, + "GroundDistanceTravelled": { + "default": "Ground Distance", + "en": "Ground Distance", + "fr": "Distance au sol", + "zh": "地面距离", + "it": "Distanza a terra", + "de": "Bodenabstand", + "es-ES": "Distancia al suelo", + "ja": "地面距離", + "pt-BR": "Distância do solo", + "ru": "Расстояние по земле", + "sv": "Markavstånd" + }, + "AirDistanceTravelled": { + "default": "Air Distance", + "en": "Air Distance", + "fr": "Distance aérienne", + "zh": "空中距离", + "it": "Distanza aerea", + "de": "Luftabstand", + "es-ES": "Distancia aérea", + "ja": "空中距離", + "pt-BR": "Distância aérea", + "ru": "Воздушное расстояние", + "sv": "Luftavstånd" + }, + "Luck": { + "default": "Luck", + "en": "Luck", + "fr": "Chance", + "zh": "运气", + "it": "Fortuna", + "de": "Glück", + "es-ES": "Suerte", + "ja": "運", + "pt-BR": "Sorte", + "ru": "Удача", + "sv": "Tur" + }, + "Boost": { + "default": "Boost", + "en": "Boost", + "fr": "Accélération", + "zh": "加速", + "it": "Potenza", + "de": "Boost", + "es-ES": "Aceleración", + "ja": "ブースト", + "pt-BR": "Aceleração", + "ru": "Ускорение", + "sv": "Boost" + }, + "Health": { + "default": "Health", + "en": "Health", + "fr": "Santé", + "zh": "健康", + "it": "Salute", + "de": "Gesundheit", + "es-ES": "Salud", + "ja": "健康", + "pt-BR": "Saúde", + "ru": "Здоровье", + "sv": "Hälsa" + }, + "MaxHealth": { + "default": "Max Health", + "en": "Max Health", + "fr": "Santé max", + "zh": "最大健康", + "it": "Salute max", + "de": "Max. Gesundheit", + "es-ES": "Salud máxima", + "ja": "最大健康", + "pt-BR": "Saúde máxima", + "ru": "Макс. здоровье", + "sv": "Max hälsa" + }, + "MaxEnergy": { + "default": "Max Energy", + "en": "Max Energy", + "fr": "Énergie max", + "zh": "最大能量", + "it": "Energia max", + "de": "Max. Energie", + "es-ES": "Energía máxima", + "ja": "最大エネルギー", + "pt-BR": "Energia máxima", + "ru": "Макс. энергия", + "sv": "Max energi" + }, + "PickupRange": { + "default": "Pickup Range", + "en": "Pickup Range", + "fr": "Portée de ramassage", + "zh": "拾取范围", + "it": "Raggio di raccolta", + "de": "Aufnahmeradius", + "es-ES": "Rango de recogida", + "ja": "ピックアップ範囲", + "pt-BR": "Raio de coleta", + "ru": "Радиус сбора", + "sv": "Plocka upp räckvidd" + }, + "Speed": { + "default": "Speed", + "en": "Speed", + "fr": "Vitesse", + "zh": "速度", + "it": "Velocità", + "de": "Geschwindigkeit", + "es-ES": "Velocidad", + "ja": "スピード", + "pt-BR": "Velocidade", + "ru": "Скорость", + "sv": "Hastighet" + }, + "LevelSpeed": { + "default": "Collapse Speed", + "en": "Collapse Speed", + "fr": "Vitesse d'effondrement", + "zh": "崩溃速度", + "it": "Velocità di collasso", + "de": "Zusammenbruchs-Geschwindigkeit", + "es-ES": "Velocidad de colapso", + "ja": "崩壊速度", + "pt-BR": "Velocidade de colapso", + "ru": "Скорость коллапса", + "sv": "Kollaps hastighet" + }, + "Shard": { + "default": "Shard", + "en": "Shard", + "fr": "Éclat", + "zh": "碎片", + "it": "Frammento", + "de": "Splitter", + "es-ES": "Fragmento", + "ja": "シャード", + "pt-BR": "Fragmento", + "ru": "Осколок", + "sv": "Skärva" + }, + "Level": { + "default": "Level", + "en": "Level", + "fr": "Niveau", + "zh": "等级", + "it": "Livello", + "de": "Ebene", + "es-ES": "Nivel", + "ja": "レベル", + "pt-BR": "Nível", + "ru": "Уровень", + "sv": "Nivå" + }, + "Seed": { + "default": "Seed", + "en": "Seed", + "fr": "Graine", + "zh": "种子", + "it": "Seme", + "de": "Saat", + "es-ES": "Semilla", + "ja": "シード", + "pt-BR": "Semente", + "ru": "Семя", + "sv": "Frö" + }, + "NoHit": { + "default": "No Hit", + "en": "No Hit", + "fr": "Aucun coup", + "zh": "无伤", + "it": "Nessun colpo", + "de": "Kein Treffer", + "es-ES": "Sin golpes", + "ja": "ノーヒット", + "pt-BR": "Sem dano", + "ru": "Без урона", + "sv": "Ingen träff" + }, + "NoDeath": { + "default": "No Death", + "en": "No Death", + "fr": "Aucune mort", + "zh": "无死亡", + "it": "Nessuna morte", + "de": "Kein Tod", + "es-ES": "Sin muertes", + "ja": "ノーデス", + "pt-BR": "Sem mortes", + "ru": "Без смертей", + "sv": "Ingen död" + }, + "NoItems": { + "default": "No Items", + "en": "No Items", + "fr": "Aucun objet", + "zh": "无物品", + "it": "Nessun oggetto", + "de": "Keine Gegenstände", + "es-ES": "Sin objetos", + "ja": "アイテムなし", + "pt-BR": "Sem itens", + "ru": "Без предметов", + "sv": "Inga föremål" + }, + "OnlyPerfectLanding": { + "default": "Only Perfect Landing", + "en": "Only Perfect Landing", + "fr": "Seulement atterrissage parfait", + "zh": "仅完美着陆", + "it": "Solo atterraggio perfetto", + "de": "Nur perfekte Landung", + "es-ES": "Solo aterrizaje perfecto", + "ja": "完璧な着陸のみ", + "pt-BR": "Apenas pouso perfeito", + "ru": "Только идеальная посадка", + "sv": "Endast perfekt landning" + }, + "OnlySRanks": { + "default": "Only S Ranks", + "en": "Only S Ranks", + "fr": "Seulement rangs S", + "zh": "仅S级", + "it": "Solo ranghi S", + "de": "Nur S-Ränge", + "es-ES": "Solo rangos S", + "ja": "Sランクのみ", + "pt-BR": "Apenas classificações S", + "ru": "Только ранги S", + "sv": "Endast S-rank" + }, + + "XOffset": { + "default": "X Offset", + "en": "X Offset", + "fr": "Décalage X", + "zh": "X 偏移量", + "it": "Offset X", + "de": "X-Versatz", + "es-ES": "Desplazamiento X", + "ja": "Xオフセット", + "pt-BR": "Deslocamento X", + "ru": "Смещение X", + "sv": "X-offset" + }, + "YOffset": { + "default": "Y Offset", + "en": "Y Offset", + "fr": "Décalage Y", + "zh": "Y 偏移量", + "it": "Offset Y", + "de": "Y-Versatz", + "es-ES": "Desplazamiento Y", + "ja": "Yオフセット", + "pt-BR": "Deslocamento Y", + "ru": "Смещение Y", + "sv": "Y-offset" + }, + "FontSize": { + "default": "Font Size", + "en": "Font Size", + "fr": "Taille de police", + "zh": "字体大小", + "it": "Dimensione del carattere", + "de": "Schriftgröße", + "es-ES": "Tamaño de fuente", + "ja": "フォントサイズ", + "pt-BR": "Tamanho da fonte", + "ru": "Размер шрифта", + "sv": "Teckenstorlek" + }, + "DisplaySide": { + "default": "Display Side", + "en": "Display Side", + "fr": "Côté d'affichage", + "zh": "显示侧", + "it": "Lato di visualizzazione", + "de": "Anzeigeseite", + "es-ES": "Lado de visualización", + "ja": "表示側", + "pt-BR": "Lado de exibição", + "ru": "Сторона отображения", + "sv": "Visningssida" + }, + "LeftSide": { + "default": "Left Side", + "en": "Left Side", + "fr": "Côté gauche", + "zh": "左侧", + "it": "Lato sinistro", + "de": "Linke Seite", + "es-ES": "Lado izquierdo", + "ja": "左側", + "pt-BR": "Lado esquerdo", + "ru": "Левая сторона", + "sv": "Vänster sida" + }, + "RightSide": { + "default": "Right Side", + "en": "Right Side", + "fr": "Côté droit", + "zh": "右侧", + "it": "Lato destro", + "de": "Rechte Seite", + "es-ES": "Lado derecho", + "ja": "右側", + "pt-BR": "Lado direito", + "ru": "Правая сторона", + "sv": "Höger sida" + }, + "StatsColor": { + "default": "Stats Color", + "en": "Stats Color", + "fr": "Couleur des statistiques", + "zh": "统计颜色", + "it": "Colore delle statistiche", + "de": "Statistikfarbe", + "es-ES": "Color de estadísticas", + "ja": "統計色", + "pt-BR": "Cor das estatísticas", + "ru": "Цвет статистики", + "sv": "Statistikfärg" + }, + "Uncolorized": { + "default": "Uncolorized", + "en": "Uncolorized", + "fr": "Non colorisé", + "zh": "未上色", + "it": "Non colorato", + "de": "Uncolorized", + "es-ES": "Sin colorizar", + "ja": "未着色", + "pt-BR": "Sem coloração", + "ru": "Без окраски", + "sv": "Oinfärgad" + }, + "Colorized": { + "default": "Colorized", + "en": "Colorized", + "fr": "Colorisé", + "zh": "上色", + "it": "Colorato", + "de": "Färbig", + "es-ES": "Colorizado", + "ja": "着色", + "pt-BR": "Colorido", + "ru": "Окрашенный", + "sv": "Färgad" + }, + "CustomFont": { + "default": "Custom Font", + "en": "Custom Font", + "fr": "Police personnalisée", + "zh": "自定义字体", + "it": "Carattere personalizzato", + "de": "Benutzerdefinierte Schriftart", + "es-ES": "Fuente personalizada", + "ja": "カスタムフォント", + "pt-BR": "Fonte personalizada", + "ru": "Пользовательский шрифт", + "sv": "Anpassad font" + }, + "DefaultFont": { + "default": "Default Font", + "en": "Default Font", + "fr": "Police par défaut", + "zh": "默认字体", + "it": "Carattere predefinito", + "de": "Standard-Schriftart", + "es-ES": "Fuente predeterminada", + "ja": "デフォルトフォント", + "pt-BR": "Fonte padrão", + "ru": "Шрифт по умолчанию", + "sv": "Standardfont" + }, + "GameFont": { + "default": "Game Font", + "en": "Game Font", + "fr": "Police du jeu", + "zh": "游戏字体", + "it": "Carattere di gioco", + "de": "Spielschriftart", + "es-ES": "Fuente del juego", + "ja": "ゲームフォント", + "pt-BR": "Fonte do jogo", + "ru": "Игровой шрифт", + "sv": "Spelfont" + }, + "PerfectLandingStreakMode": { + "default": "Perfect Landing Streak Mode", + "en": "Perfect Landing Streak Mode", + "fr": "Mode série de parfaits", + "zh": "完美着陆连击模式", + "it": "Modalità serie perfetta", + "de": "Perfekte Land. Serienmodus", + "es-ES": "Modo racha perfecta", + "ja": "パーフェクト着陸連続モード", + "pt-BR": "Modo sequência perfeita", + "ru": "Режим идеальной серии", + "sv": "Perfekt landning streak-läge" + }, + "Standard": { + "default": "Standard", + "en": "Standard", + "fr": "Standard", + "zh": "标准", + "it": "Standard", + "de": "Standard", + "es-ES": "Estándar", + "ja": "標準", + "pt-BR": "Padrão", + "ru": "Стандартный", + "sv": "Standard" + }, + "Strict": { + "default": "Strict", + "en": "Strict", + "fr": "Strict", + "zh": "严格", + "it": "Severo", + "de": "Streng", + "es-ES": "Estricto", + "ja": "厳格", + "pt-BR": "Estrito", + "ru": "Строгий", + "sv": "Strikt" + }, + "Hidden": { + "default": "Hidden", + "en": "Hidden", + "fr": "Caché", + "zh": "隐藏", + "it": "Nascosto", + "de": "Versteckt", + "es-ES": "Oculto", + "ja": "隠された", + "pt-BR": "Oculto", + "ru": "Скрытый", + "sv": "Dold" + }, + "Shown": { + "default": "Shown", + "en": "Shown", + "fr": "Montré", + "zh": "显示", + "it": "Mostrato", + "de": "Angezeigt", + "es-ES": "Mostrado", + "ja": "表示された", + "pt-BR": "Exibido", + "ru": "Показано", + "sv": "Visad" + }, + "Yes": { + "default": "Yes", + "en": "Yes", + "fr": "Oui", + "zh": "是", + "it": "Sì", + "de": "Ja", + "es-ES": "Sí", + "ja": "はい", + "pt-BR": "Sim", + "ru": "Да", + "sv": "Ja" + }, + "Failed": { + "default": "Failed", + "en": "Failed", + "fr": "Échoué", + "zh": "失败", + "it": "Fallito", + "de": "Fehlgeschlagen", + "es-ES": "Fallido", + "ja": "失敗した", + "pt-BR": "Falhou", + "ru": "Не удалось", + "sv": "Misslyckades" + } +} \ No newline at end of file diff --git a/InGameStatsSettings.cs b/InGameStatsSettings.cs index eb272fd..1acac39 100644 --- a/InGameStatsSettings.cs +++ b/InGameStatsSettings.cs @@ -14,7 +14,7 @@ public override void ApplyValue() { InGameStats.Instance.CreateStatUI(); } protected override float GetDefaultValue() => 10f; - public LocalizedString GetDisplayName() => new UnlocalizedString("X Base Offset"); + public LocalizedString GetDisplayName() => InGameStatsUtils.TryGetLocalizedString("XOffset", "X Base Offset"); public string GetCategory() => InGameStatsProgram.GetCategory(); protected override float2 GetMinMaxValue() => new (0f, Screen.width); @@ -33,7 +33,7 @@ public override void ApplyValue() { InGameStats.Instance.CreateStatUI(); } protected override float GetDefaultValue() => 0f; - public LocalizedString GetDisplayName() => new UnlocalizedString("Y Base Offset"); + public LocalizedString GetDisplayName() => InGameStatsUtils.TryGetLocalizedString("YOffset", "Y Base Offset"); public string GetCategory() => InGameStatsProgram.GetCategory(); protected override float2 GetMinMaxValue() => new (0f, Screen.height); @@ -53,7 +53,7 @@ public override void ApplyValue() { InGameStats.Instance.CreateStatUI(); } protected override int GetDefaultValue() => 12; - public LocalizedString GetDisplayName() => new UnlocalizedString("Font Size"); + public LocalizedString GetDisplayName() => InGameStatsUtils.TryGetLocalizedString("FontSize", "Font Size"); public string GetCategory() => InGameStatsProgram.GetCategory(); public override void Load(ISettingsSaveLoad loader) { @@ -65,8 +65,8 @@ public override void Load(ISettingsSaveLoad loader) { [HasteSetting] public class RightSideSetting : BoolSetting, IExposedSetting { - public override LocalizedString OffString { get; } = new UnlocalizedString("Left Side"); - public override LocalizedString OnString { get; } = new UnlocalizedString("Right Side"); + public override LocalizedString OffString { get; } = InGameStatsUtils.TryGetLocalizedString("LeftSide", "Left Side"); + public override LocalizedString OnString { get; } = InGameStatsUtils.TryGetLocalizedString("RightSide", "Right Side"); public override void ApplyValue() { Debug.Log($"RightSide: {Value}"); InGameStats.Instance.rightSide = Value; @@ -74,7 +74,7 @@ public override void ApplyValue() { } protected override bool GetDefaultValue() => false; public string GetCategory() => InGameStatsProgram.GetCategory(); - public LocalizedString GetDisplayName() => new UnlocalizedString("Right Side"); + public LocalizedString GetDisplayName() => InGameStatsUtils.TryGetLocalizedString("DisplaySide", "Display Side"); public override void Load(ISettingsSaveLoad loader) { base.Load(loader); @@ -85,8 +85,8 @@ public override void Load(ISettingsSaveLoad loader) { [HasteSetting] public class FontColorSetting : BoolSetting, IExposedSetting { - public override LocalizedString OffString { get; } = new UnlocalizedString("Uncolorized"); - public override LocalizedString OnString { get; } = new UnlocalizedString("Colorized"); + public override LocalizedString OffString { get; } = InGameStatsUtils.TryGetLocalizedString("Uncolorized", "Uncolorized"); + public override LocalizedString OnString { get; } = InGameStatsUtils.TryGetLocalizedString("Colorized", "Colorized"); public override void ApplyValue() { Debug.Log($"FontColor: {Value}"); InGameStats.Instance.colors = Value; @@ -94,7 +94,7 @@ public override void ApplyValue() { } protected override bool GetDefaultValue() => true; public string GetCategory() => InGameStatsProgram.GetCategory(); - public LocalizedString GetDisplayName() => new UnlocalizedString("Colorized Stats"); + public LocalizedString GetDisplayName() => InGameStatsUtils.TryGetLocalizedString("StatsColor", "Stats Color"); public override void Load(ISettingsSaveLoad loader) { base.Load(loader); @@ -105,8 +105,8 @@ public override void Load(ISettingsSaveLoad loader) { [HasteSetting] public class CustomFontSetting : BoolSetting, IExposedSetting { - public override LocalizedString OffString { get; } = new UnlocalizedString("Default Font"); - public override LocalizedString OnString { get; } = new UnlocalizedString("Game Font"); + public override LocalizedString OffString { get; } = InGameStatsUtils.TryGetLocalizedString("DefaultFont", "Default Font"); + public override LocalizedString OnString { get; } = InGameStatsUtils.TryGetLocalizedString("GameFont", "Game Font"); public override void ApplyValue() { Debug.Log($"CustomFont: {Value}"); InGameStats.Instance.font = Value; @@ -114,7 +114,7 @@ public override void ApplyValue() { } protected override bool GetDefaultValue() => true; public string GetCategory() => InGameStatsProgram.GetCategory(); - public LocalizedString GetDisplayName() => new UnlocalizedString("Custom Font"); + public LocalizedString GetDisplayName() => InGameStatsUtils.TryGetLocalizedString("CustomFont", "Custom Font"); public override void Load(ISettingsSaveLoad loader) { base.Load(loader); @@ -144,14 +144,14 @@ public override void ApplyValue() { InGameStats.Instance.CreateStatUI(); } protected override PerfectLandingStreakType GetDefaultValue() => PerfectLandingStreakType.Standard; - public LocalizedString GetDisplayName() => new UnlocalizedString("Perfect Landing Streak Mode"); + public LocalizedString GetDisplayName() => InGameStatsUtils.TryGetLocalizedString("PerfectLandingStreakMode", "Perfect Landing Streak Mode"); public string GetCategory() => InGameStatsProgram.GetCategory(); public override List GetLocalizedChoices() { return new List { - new UnlocalizedString("None"), - new UnlocalizedString("Standard"), - new UnlocalizedString("Strict") + InGameStatsUtils.TryGetLocalizedString("Hidden", "Hidden"), + InGameStatsUtils.TryGetLocalizedString("Standard", "Standard"), + InGameStatsUtils.TryGetLocalizedString("Strict", "Strict") }; } @@ -176,8 +176,8 @@ public override void Load(ISettingsSaveLoad loader) { } public abstract class EnableStatSetting : BoolSetting, IExposedSetting { - public override LocalizedString OffString { get; } = new UnlocalizedString("Hidden"); - public override LocalizedString OnString { get; } = new UnlocalizedString("Shown"); + public override LocalizedString OffString { get; } = InGameStatsUtils.TryGetLocalizedString("Hidden", "Hidden"); + public override LocalizedString OnString { get; } = InGameStatsUtils.TryGetLocalizedString("Shown", "Shown"); public override void ApplyValue() { Debug.Log($"{InGameStatsUtils.statDisplayNames[StatType]}: {Value}"); InGameStats.Instance.enabledStats.Remove(StatType); @@ -189,7 +189,7 @@ public override void ApplyValue() { public string GetCategory() => InGameStatsProgram.GetCategory(); protected abstract StatType StatType { get; } - public LocalizedString GetDisplayName() => new UnlocalizedString(InGameStatsUtils.statDisplayNames[StatType]); + public LocalizedString GetDisplayName() => InGameStatsUtils.statDisplayNames[StatType]; public override void Load(ISettingsSaveLoad loader) { base.Load(loader); diff --git a/InGameStatsUtils.cs b/InGameStatsUtils.cs index 0a6f839..fd2c064 100644 --- a/InGameStatsUtils.cs +++ b/InGameStatsUtils.cs @@ -1,5 +1,8 @@ using System.Reflection; +using Landfall.Haste; using UnityEngine; +using UnityEngine.Localization; +using UnityEngine.Localization.Tables; namespace InGameStats; @@ -167,31 +170,42 @@ public static bool GetOnlySRank() { return true; } + internal static LocalizedString TryGetLocalizedString(string key, string fallback = "") { + TableReference tableReference = (TableReference) "InGameStats"; + TableEntryReference tableEntryReference = (TableEntryReference) key; + LocalizedString title = new(tableReference, tableEntryReference); + return + title.TableReference.ReferenceType != TableReference.Type.Empty && + title.TableEntryReference.ReferenceType != TableEntryReference.Type.Empty + ? title + : new UnlocalizedString(fallback); + } + /// /// Dictionary of stat types and their display names. /// - public static readonly Dictionary statDisplayNames = new() { - { StatType.PerfectLandingStreak, "Perfect Land. Streak" }, - { StatType.BestLandingStreak, "Best Land. Streak" }, - { StatType.AverageLandingScore, "Average Land. Score" }, - { StatType.DistanceTravelled, "Distance" }, - { StatType.GroundDistanceTravelled, "Ground Distance" }, - { StatType.AirDistanceTravelled, "Air Distance" }, - { StatType.Luck, "Luck" }, - { StatType.Boost, "Boost" }, - { StatType.Health, "Health" }, - { StatType.MaxHealth, "Max Health" }, - { StatType.MaxEnergy, "Max Energy" }, - { StatType.PickupRange, "Pickup Range" }, - { StatType.Speed, "Speed" }, - { StatType.LevelSpeed, "Collapse Speed" }, - { StatType.Shard, "Shard" }, - { StatType.Level, "Level" }, - { StatType.Seed, "Seed" }, - { StatType.NoHit, "No Hit" }, - { StatType.NoDeath, "No Death" }, - { StatType.NoItems, "No Items" }, - { StatType.OnlyPerfectLanding, "Only Perfect Landing" }, - { StatType.OnlySRanks, "Only S Ranks" }, + public static readonly Dictionary statDisplayNames = new() { + { StatType.PerfectLandingStreak, TryGetLocalizedString("PerfectLandingStreak", "Perfect Land. Streak") }, + { StatType.BestLandingStreak, TryGetLocalizedString("BestLandingStreak", "Best Land. Streak") }, + { StatType.AverageLandingScore, TryGetLocalizedString("AverageLandingScore", "Average Land. Score") }, + { StatType.DistanceTravelled, TryGetLocalizedString("DistanceTravelled", "Distance") }, + { StatType.GroundDistanceTravelled, TryGetLocalizedString("GroundDistanceTravelled", "Ground Distance") }, + { StatType.AirDistanceTravelled, TryGetLocalizedString("AirDistanceTravelled", "Air Distance") }, + { StatType.Luck, TryGetLocalizedString("Luck", "Luck") }, + { StatType.Boost, TryGetLocalizedString("Boost", "Boost") }, + { StatType.Health, TryGetLocalizedString("Health", "Health") }, + { StatType.MaxHealth, TryGetLocalizedString("MaxHealth", "Max Health") }, + { StatType.MaxEnergy, TryGetLocalizedString("MaxEnergy", "Max Energy") }, + { StatType.PickupRange, TryGetLocalizedString("PickupRange", "Pickup Range") }, + { StatType.Speed, TryGetLocalizedString("Speed", "Speed") }, + { StatType.LevelSpeed, TryGetLocalizedString("LevelSpeed", "Collapse Speed") }, + { StatType.Shard, TryGetLocalizedString("Shard", "Shard") }, + { StatType.Level, TryGetLocalizedString("Level", "Level") }, + { StatType.Seed, TryGetLocalizedString("Seed", "Seed") }, + { StatType.NoHit, TryGetLocalizedString("NoHit", "No Hit") }, + { StatType.NoDeath, TryGetLocalizedString("NoDeath", "No Death") }, + { StatType.NoItems, TryGetLocalizedString("NoItems", "No Items") }, + { StatType.OnlyPerfectLanding, TryGetLocalizedString("OnlyPerfectLanding", "Only Perfect Landing") }, + { StatType.OnlySRanks, TryGetLocalizedString("OnlySRanks", "Only S Ranks") }, }; } \ No newline at end of file