Localization support

This commit is contained in:
PurpleHato 2025-08-14 22:59:54 +02:00
commit 1595598941
2 changed files with 395 additions and 12 deletions

View file

@ -1026,17 +1026,55 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l
} }
if (item00->itemEntry.modIndex == MOD_NONE) { if (item00->itemEntry.modIndex == MOD_NONE) {
std::string message;
switch (gSaveContext.language) {
case LANGUAGE_FRA:
message = "Vous obtenez: ";
break;
case LANGUAGE_GER:
message = "Du hast: ";
break;
case LANGUAGE_ENG:
default:
message = "You found ";
break;
}
Notification::Emit({ Notification::Emit({
.itemIcon = GetTextureForItemId(item00->itemEntry.itemId), .itemIcon = GetTextureForItemId(item00->itemEntry.itemId),
.message = "You found ", .message = message,
.suffix = SohUtils::GetItemName(item00->itemEntry.itemId), .suffix = SohUtils::GetItemName(item00->itemEntry.itemId),
}); });
} else if (item00->itemEntry.modIndex == MOD_RANDOMIZER) { } else if (item00->itemEntry.modIndex == MOD_RANDOMIZER) {
Notification::Emit({ std::string message;
.message = "You found ", std::string itemName;
.suffix = Rando::StaticData::RetrieveItem((RandomizerGet)item00->itemEntry.getItemId)
switch (gSaveContext.language) {
case LANGUAGE_FRA:
message = "Vous obtenez: ";
itemName = Rando::StaticData::RetrieveItem((RandomizerGet)item00->itemEntry.getItemId)
.GetName() .GetName()
.english, .french;
break;
case LANGUAGE_GER:
message = "Du hast: ";
itemName = Rando::StaticData::RetrieveItem((RandomizerGet)item00->itemEntry.getItemId)
.GetName()
.german;
break;
case LANGUAGE_ENG:
default:
message = "You found ";
itemName = Rando::StaticData::RetrieveItem((RandomizerGet)item00->itemEntry.getItemId)
.GetName()
.english;
break;
}
Notification::Emit({
.message = message,
.suffix = itemName,
}); });
} }

View file

@ -7,6 +7,7 @@
#include <assert.h> #include <assert.h>
#include <spdlog/spdlog.h> #include <spdlog/spdlog.h>
#include "Enhancements/randomizer/randomizerTypes.h" #include "Enhancements/randomizer/randomizerTypes.h"
#include <variables.h>
std::vector<std::string> sceneNames = { std::vector<std::string> sceneNames = {
"Inside the Deku Tree", "Inside the Deku Tree",
@ -121,7 +122,7 @@ std::vector<std::string> sceneNames = {
"Treasure Chest Room", "Treasure Chest Room",
}; };
std::vector<std::string> itemNames = { std::vector<std::string> itemNamesEng = {
"Deku Stick", "Deku Stick",
"Deku Nut", "Deku Nut",
"Bomb", "Bomb",
@ -280,7 +281,327 @@ std::vector<std::string> itemNames = {
"Deku Nut Upgrade (40)", "Deku Nut Upgrade (40)",
}; };
std::vector<std::string> questItemNames = { std::vector<std::string> itemNamesFra = {
"Bâton Mojo",
"Noix Mojo",
"Bombe",
"Arc des Fées",
"Flèche de Feu",
"Feu de Din",
"Lance-Pierre des Fées",
"Ocarina des Fées",
"Ocarina du Temps",
"Missile Teigneux",
"Grappin",
"Super Grappin",
"Flèche de Glace",
"Vent de Farore",
"Boomerang",
"Loupe de Vérité",
"Haricot Magique",
"Marteau des Titans",
"Flèche de Lumière",
"Amour de Nayru",
"Bouteille Vide",
"Potion Rouge",
"Potion Verte",
"Potion Bleue",
"Fée en Bouteille",
"Poisson",
"Lait Lon Lon et Bouteille",
"Lettre de Ruto",
"Flamme Bleue",
"Insectes",
"Grand Spectre",
"Lait Lon Lon (Demi)",
"Spectre",
"Oeuf Suspect",
"Poule",
"Lettre de Zelda",
"Masque Pikachu",
"Masque de Mort",
"Masque du Fantôme",
"Capuche de Lapin",
"Masque Goron",
"Masque Zora",
"Masque Gerudo",
"Masque de Vérité",
"ÉPUISÉ",
"Oeuf de Poche",
"Cocotte de Poche",
"Cocorico Bleu",
"Champignon Suspect",
"Potion Suspecte",
"Scie de Charpentier",
"Épée Goron (Cassée)",
"Ordonnance",
"Grenouille Oeil",
"Gouttes pour les Yeux",
"Certificat",
"Arc des Fées & Flèche de Feu",
"Arc des Fées & Flèche de Glace",
"Arc des Fées & Flèche de Lumière",
"Épée Kokiri",
"Épée de Légende",
"Lame des Géants & Épée Biggoron",
"Bouclier Mojo",
"Bouclier Hylien",
"Bouclier Miroir",
"Tunique Kokiri",
"Tunique Goron",
"Tunique Zora",
"Bottes Kokiri",
"Bottes de Plomb",
"Bottes des Airs",
"Sac de Graines (30)",
"Sac de Graines (40)",
"Sac de Graines (50)",
"Carquois (30)",
"Grand Carquois (40)",
"Très Grand Carquois (50)",
"Sac de Bombes (20)",
"Grand Sac de Bombes (30)",
"Très Grand Sac de Bombes (40)",
"Bracelet Goron",
"Gantelets d'Argent",
"Gantelets d'Or",
"Écaille d'Argent",
"Écaille d'Or",
"Lame des Géants (Cassée)",
"Bourse d'Adulte",
"Bourse de Géant",
"Graines Mojo (5)",
"Canne à Pêche",
"Menuet des Bois",
"Boléro du Feu",
"Sérénade de l'Eau",
"Requiem de l'Esprit",
"Nocturne de l'Ombre",
"Prélude de la Lumière",
"Berceuse de Zelda",
"Chanson d'Epona",
"Chanson de Saria",
"Chant du Soleil",
"Chant du Temps",
"Chant des Tempêtes",
"Médaillon de la Forêt",
"Médaillon du Feu",
"Médaillon de l'Eau",
"Médaillon de l'Esprit",
"Médaillon de l'Ombre",
"Médaillon de la Lumière",
"Émeraude Kokiri",
"Rubis Goron",
"Saphir Zora",
"Pierre de Souffrance",
"Carte Gerudo",
"Symbole de Skulltula d'Or",
"Réceptacle de Coeur",
"Quart de Coeur",
"Clé du Boss",
"Boussole",
"Carte du Donjon",
"Petite Clé",
"Petite Magie",
"Grande Magie",
"Quart de Coeur",
"[Retiré]",
"[Retiré]",
"[Retiré]",
"[Retiré]",
"[Retiré]",
"[Retiré]",
"[Retiré]",
"Lait Lon Lon",
"Coeur",
"Rubis Vert",
"Rubis Bleu",
"Rubis Rouge",
"Rubis Pourpre",
"Rubis Argenté",
"[Retiré]",
"Bâtons Mojo (5)",
"Bâtons Mojo (10)",
"Noix Mojo (5)",
"Noix Mojo (10)",
"Bombes (5)",
"Bombes (10)",
"Bombes (20)",
"Bombes (30)",
"Flèches (Petites)",
"Flèches (Moyennes)",
"Flèches (Grandes)",
"Graines Mojo (30)",
"Missile Teigneux (5)",
"Missile Teigneux (20)",
"Amélioration Bâtons Mojo (20)",
"Amélioration Bâtons Mojo (30)",
"Amélioration Noix Mojo (30)",
"Amélioration Noix Mojo (40)",
};
std::vector<std::string> itemNamesGer = {
"Deku-Stab",
"Deku-Nuss",
"Bombe",
"Feenbogen",
"Feuerpfeil",
"Dins Feuerinferno",
"Feen-Schleuder",
"Feen-Okarina",
"Okarina der Zeit",
"Krabbelmine",
"Enterhaken",
"Enterhaken (Lang)",
"Eispfeil",
"Farores Donnersturm",
"Bumerang",
"Auge der Wahrheit",
"Zauberbohne",
"Megatonhammer",
"Lichtpfeil",
"Nayrus Umarmung",
"Leere Flasche",
"Roter Trank",
"Grüner Trank",
"Blauer Trank",
"Fee in Flasche",
"Fisch",
"Lon Lon Milch & Flasche",
"Brief von Ruto",
"Blaue Flamme",
"Insekten",
"Großer Irrgeist",
"Lon Lon Milch (Halb)",
"Irrgeist",
"Seltsames Ei",
"Huhn",
"Brief von Zelda",
"Fuchsmaske",
"Totenkopfmaske",
"Schädelmaske",
"Hasenohren",
"Goron-Maske",
"Zora-Maske",
"Gerudo-Maske",
"Maske der Wahrheit",
"AUSVERKAUFT",
"Taschenei",
"Taschenhuhn",
"Cojiro",
"Seltsamer Pilz",
"Seltsamer Trank",
"Säge des Schmugglers",
"Goronen-Schwert (Kaputt)",
"Rezept",
"Augenfrosch",
"Augentropfen",
"Abholschein",
"Feenbogen & Feuerpfeil",
"Feenbogen & Eispfeil",
"Feenbogen & Lichtpfeil",
"Kokiri-Schwert",
"Master-Schwert",
"Riesenmesser & Biggorons Schwert",
"Deku-Schild",
"Hylia-Schild",
"Spiegelschild",
"Kokiri-Gewand",
"Goronen-Gewand",
"Zora-Gewand",
"Kokiri-Stiefel",
"Eisenstiefel",
"Schwebestiefel",
"Kugelbeutel (30)",
"Kugelbeutel (40)",
"Kugelbeutel (50)",
"Köcher (30)",
"Großer Köcher (40)",
"Riesenköcher (50)",
"Bombentasche (20)",
"Große Bombentasche (30)",
"Riesen-Bombentasche (40)",
"Goronen-Armband",
"Silberhandschuhe",
"Goldhandschuhe",
"Silberschuppe",
"Goldschuppe",
"Riesenmesser (Kaputt)",
"Erwachsenenbörse",
"Riesenbörse",
"Deku-Samen (5)",
"Angel",
"Menuett des Waldes",
"Bolero des Feuers",
"Serenade des Wassers",
"Requiem der Geister",
"Nocturne der Schatten",
"Präludium des Lichts",
"Zeldas Wiegenlied",
"Eponas Lied",
"Sarias Lied",
"Sonnenlied",
"Hymne der Zeit",
"Sturm-Lied",
"Amulett des Waldes",
"Amulett des Feuers",
"Amulett des Wassers",
"Amulett der Geister",
"Amulett der Schatten",
"Amulett des Lichts",
"Kokiri-Smaragd",
"Goronen-Rubin",
"Zora-Saphir",
"Stein des Wissens",
"Gerudo-Pass",
"Goldene Skulltula-Marke",
"Herzcontainer",
"Herzteil",
"Boss-Schlüssel",
"Kompass",
"Dungeon-Karte",
"Kleiner Schlüssel",
"Kleine Magie",
"Große Magie",
"Herzteil",
"[Entfernt]",
"[Entfernt]",
"[Entfernt]",
"[Entfernt]",
"[Entfernt]",
"[Entfernt]",
"[Entfernt]",
"Lon Lon Milch",
"Herz",
"Grüner Rubin",
"Blauer Rubin",
"Roter Rubin",
"Violetter Rubin",
"Silberner Rubin",
"[Entfernt]",
"Deku-Stäbe (5)",
"Deku-Stäbe (10)",
"Deku-Nüsse (5)",
"Deku-Nüsse (10)",
"Bomben (5)",
"Bomben (10)",
"Bomben (20)",
"Bomben (30)",
"Pfeile (Klein)",
"Pfeile (Mittel)",
"Pfeile (Groß)",
"Deku-Samen (30)",
"Krabbelmine (5)",
"Krabbelmine (20)",
"Deku-Stab-Erweiterung (20)",
"Deku-Stab-Erweiterung (30)",
"Deku-Nuss-Erweiterung (30)",
"Deku-Nuss-Erweiterung (40)",
};
std::vector<std::string> questItemNamesEng = {
"Forest Medallion", "Fire Medallion", "Water Medallion", "Spirit Medallion", "Shadow Medallion", "Forest Medallion", "Fire Medallion", "Water Medallion", "Spirit Medallion", "Shadow Medallion",
"Light Medallion", "Minuet of Forest", "Bolero of Fire", "Serenade of Water", "Requiem of Spirit", "Light Medallion", "Minuet of Forest", "Bolero of Fire", "Serenade of Water", "Requiem of Spirit",
"Nocturne of Shadow", "Prelude of Light", "Zelda's Lullaby", "Epona's Song", "Saria's Song", "Nocturne of Shadow", "Prelude of Light", "Zelda's Lullaby", "Epona's Song", "Saria's Song",
@ -288,6 +609,16 @@ std::vector<std::string> questItemNames = {
"Zora's Sapphire", "Stone of Agony", "Gerudo's Card", "Gold Skulltula Token", "Zora's Sapphire", "Stone of Agony", "Gerudo's Card", "Gold Skulltula Token",
}; };
std::vector<std::string> questItemNamesFra = {
"Médaillon de la Forêt", "Médaillon du Feu", "Médaillon de l'Eau", "Médaillon de l'Esprit",
"Médaillon de l'Ombre", "Médaillon de la Lumière", "Menuet des Bois", "Boléro du Feu",
"Sérénade de l'Eau", "Requiem de l'Esprit", "Nocturne de l'Ombre", "Prélude de la Lumière",
"Berceuse de Zelda", "Chanson d'Epona", "Chanson de Saria", "Chant du Soleil",
"Chant du Temps", "Chant des Tempêtes", "Émeraude Kokiri", "Rubis Goron",
"Saphir Zora", "Pierre de Souffrance", "Carte Gerudo", "Symbole de Skulltula d'Or",
};
std::array<std::string, RA_MAX> rcareaPrefixes = { std::array<std::string, RA_MAX> rcareaPrefixes = {
"KF", "KF",
"LW", "LW",
@ -334,23 +665,37 @@ const std::string& SohUtils::GetSceneName(int32_t scene) {
} }
const std::string& SohUtils::GetItemName(int32_t item) { const std::string& SohUtils::GetItemName(int32_t item) {
if (item > itemNames.size()) { const std::vector<std::string>* currentItemNames = nullptr;
switch (gSaveContext.language) {
case LANGUAGE_FRA:
currentItemNames = &itemNamesFra;
break;
case LANGUAGE_GER:
currentItemNames = &itemNamesGer;
break;
case LANGUAGE_ENG:
default:
currentItemNames = &itemNamesEng;
break;
}
if (item >= currentItemNames->size()) {
SPDLOG_WARN("Passed invalid item id to SohUtils::GetItemName: ({})", item); SPDLOG_WARN("Passed invalid item id to SohUtils::GetItemName: ({})", item);
assert(false); assert(false);
return ""; return "";
} }
return (*currentItemNames)[item];
return itemNames[item];
} }
const std::string& SohUtils::GetQuestItemName(int32_t item) { const std::string& SohUtils::GetQuestItemName(int32_t item) {
if (item > questItemNames.size()) { if (item > questItemNamesEng.size()) {
SPDLOG_WARN("Passed invalid quest item id to SohUtils::GetQuestItemName: ({})", item); SPDLOG_WARN("Passed invalid quest item id to SohUtils::GetQuestItemName: ({})", item);
assert(false); assert(false);
return ""; return "";
} }
return questItemNames[item]; return questItemNamesEng[item];
} }
const std::string& SohUtils::GetRandomizerCheckAreaPrefix(int32_t rcarea) { const std::string& SohUtils::GetRandomizerCheckAreaPrefix(int32_t rcarea) {