// locale.hpp - Sistema d'internacionalització (i18n) basat en YAML // © 2026 JailDesigner // // Locale amb claus en notació de punts ("notification.fullscreen_on"). El YAML // pot ser jerarquitzat i s'aplana en càrrega, així el consumidor només veu // claus planes. Suporta seqüències de strings (es desen com prefix.0, // prefix.1, ...). No hi ha hot-swap d'idioma: es fixa a l'arrencada des de // `config.yaml` (camp `locale`) i només es recarrega reiniciant el joc. #pragma once #include #include #include #include class Locale { public: static auto get() -> Locale&; Locale(const Locale&) = delete; Locale(Locale&&) = delete; auto operator=(const Locale&) -> Locale& = delete; auto operator=(Locale&&) -> Locale& = delete; // Llig el fitxer YAML i emplena el mapping intern. Si hi ha un error de // parse o el fitxer no existeix, deixa el mapping com estava i ho // notifica per stderr. Retorna true només si la càrrega ha tingut èxit. auto load(const std::string& file_path) -> bool; // Canvi d'idioma en runtime. Recarrega `locale/.yaml`. Retorna true // si la càrrega ha tingut èxit. Els lookups posteriors (tots els draw* // criden Locale::text() cada frame) ja veuen el nou idioma. Els missatges // ja capturats (toast actiu, banner de stage start ja triat) sobreviuen // fins al seu cicle natural. auto switchTo(const std::string& lang) -> bool; // Retorna la traducció; si la clau no existeix, retorna la pròpia clau // com a fallback visible (així una clau mal escrita es detecta sense // trencar el render). [[nodiscard]] auto text(const std::string& key) const -> std::string; // Compta quantes claus consecutives existeixen amb el prefix donat // (prefix.0, prefix.1, ...). Útil per pools indexats com stage.start.N. [[nodiscard]] auto count(const std::string& prefix) const -> std::size_t; private: Locale() = default; ~Locale() = default; std::unordered_map strings_; }; // Substitució simple d'un placeholder dins una plantilla (p.ex. "{n}" → "3"). // S'usa per interpolar valors runtime en strings traduïdes. [[nodiscard]] auto localeSubstitute(std::string tpl, std::string_view placeholder, std::string_view value) -> std::string;