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