-- ============================================================
-- Asylum Compagnon — Locale.lua
-- Localisation FR / EN. Le client français (frFR) affiche le français
-- (les chaînes du code SONT les clés françaises → identité, zéro coût) ;
-- tout autre client affiche l'anglais via le dictionnaire ci-dessous.
--
-- Les noms de CLASSES et de SORTS ne sont PAS traduits ici : on les lit
-- directement dans le jeu (déjà localisés) via NS.ClassLabel / NS.SpellName.
-- Jargon WoW EN vérifié (Wowhead / client officiel).
-- ============================================================

local ADDON_NAME, NS = ...

local EN = (GetLocale and GetLocale() ~= "frFR") or false

-- Dictionnaire : clé française (telle qu'écrite dans le code) → anglais.
-- Les chaînes de format gardent les mêmes spécificateurs (%s/%d/%%) et
-- le même ordre dans les deux langues.
local DICT = {
    -- ---- Navigation / titres de page ----
    ["Accueil"]              = "Home",
    ["Optimisation"]         = "Optimization",
    ["Inventaire"]           = "Inventory",
    ["Kicks"]                = "Kicks",
    ["Cooldowns"]            = "Cooldowns",
    ["Cooldowns de groupe"]  = "Group Cooldowns",
    ["Buffs & auras"]        = "Buffs & Auras",
    ["Butin"]                = "Loot",
    ["Clés & Coffre"]        = "Keys & Vault",
    ["Alertes"]              = "Alerts",

    -- ---- Boutons génériques ----
    ["Actualiser"]           = "Refresh",
    ["« Retour"]             = "« Back",
    ["Réinitialiser la position"] = "Reset position",

    -- ---- Accueil (tableau de bord v0.26) ----
    ["Asylum Compagnon"]     = "Asylum Companion",
    ["Aucun ami détecté.\nRejoins un groupe ou une guilde où l'addon est installé."] =
        "No friend detected.\nJoin a party or guild where the addon is installed.",
    ["Bonjour"]              = "Hello",
    ["Bonsoir"]              = "Good evening",
    ["Amis en ligne"]        = "Friends online",
    ["Ta préparation"]       = "Your readiness",
    ["Stocks bas"]           = "Low stock",
    ["Clé de la semaine"]    = "Keystone of the week",
    ["Derniers runs M+"]     = "Recent M+ runs",
    ["Personne d'autre en ligne."] = "No one else online.",
    ["%d hors ligne"]        = "%d offline",
    ["Rien à signaler."]     = "All good.",

    -- ---- Optimisation : étapes Raidbots + statuts ----
    ["|cff%s1|r · Ouvre Raidbots :"] = "|cff%s1|r · Open Raidbots:",
    ["|cff%s2|r · Copie le code (clic = tout sélectionner, puis Ctrl+C) :"] =
        "|cff%s2|r · Copy the profile (click = select all, then Ctrl+C):",
    ["|cff%s3|r · Colle sur Raidbots et lance la simulation."] =
        "|cff%s3|r · Paste on Raidbots and run the sim.",
    ["Code généré "]        = "Profile generated ",
    ["Code reçu %s"]        = "Profile received %s",
    ["  |cffeab308(plus récent dispo)|r"] = "  |cffeab308(newer available)|r",
    ["# Impossible de générer le code pour l'instant."] =
        "# Unable to generate the profile right now.",
    ["# Pas encore de code reçu pour ce personnage.\n"] =
        "# No profile received for this character yet.\n",
    ["# Clique « Actualiser » pour lui demander son code."] =
        "# Click \"Refresh\" to request their profile.",
    ["demande envoyée…"]    = "request sent…",
    ["synchro indisponible"] = "sync unavailable",
    ["synchro "]            = "sync ",
    ["Synchro active"]      = "Sync active",
    ["Synchro indisponible"] = "Sync unavailable",

    -- ---- Optimisation / Inventaire ----
    ["en direct"]            = "live",
    ["en ligne"]             = "online",
    ["hors ligne"]           = "offline",
    ["(toi)"]                = "(you)",
    ["(pas de kick)"]        = "(no kick)",
    ["Niveau %d"]            = "Level %d",
    ["Niveau "]              = "Level ",
    ["# Il doit être en ligne avec l'addon installé.\n"] =
        "# They must be online with the addon installed.\n",
    ["Code SimulationCraft"] = "SimulationCraft profile",
    ["Ouvrir Raidbots Top Gear"] = "Open Raidbots Top Gear",
    ["Clic dans la zone → tout est sélectionné → Ctrl+C pour copier."] =
        "Click the box → everything is selected → Ctrl+C to copy.",
    ["Aucun consommable suivi possédé pour l'instant."] =
        "No tracked consumable owned yet.",
    ["Aucun consommable suivi possédé."] = "No tracked consumable owned.",
    ["Inventaire non reçu (version d'addon trop ancienne)."] =
        "Inventory not received (addon version too old).",
    ["Sacs + banque · |cffea48500|r = épuisé · |cfffacd40≤%d|r = stock bas"] =
        "Bags + bank · |cffea48500|r = out · |cfffacd40≤%d|r = low",
    ["Dernière synchro · |cffea48500|r = épuisé · |cfffacd40≤%d|r = stock bas"] =
        "Last sync · |cffea48500|r = out · |cfffacd40≤%d|r = low",

    -- ---- Kicks ----
    ["Suivi des interruptions (kicks)"] = "Interrupt (kick) tracker",
    ["Afficher l'encadré des kicks dans l'interface"] = "Show the kick frame",
    ["Opacité du fond de l'encadré : |cff%s%d%%|r"] = "Frame background opacity: |cff%s%d%%|r",
    ["PRÊT"]                 = "READY",
    ["Suivis actuellement : "] = "Currently tracked: ",
    ["personne"]            = "nobody",
    ["|cff22c55ePRÊT|r = kick disponible · |cfff2a33c12 s|r = en recharge · |TInterface\\RaidFrame\\ReadyCheck-Ready:14|t = sort bien interrompu · |TInterface\\RaidFrame\\ReadyCheck-NotReady:14|t = kick dans le vent"] =
        "|cff22c55eREADY|r = interrupt available · |cfff2a33c12 s|r = on cooldown · |TInterface\\RaidFrame\\ReadyCheck-Ready:14|t = spell interrupted · |TInterface\\RaidFrame\\ReadyCheck-NotReady:14|t = wasted kick",
    ["\n|cffea4850Détection indisponible (restrictions Blizzard) — un /reload peut aider.|r"] =
        "\n|cffea4850Detection unavailable (Blizzard restrictions) — a /reload may help.|r",

    -- ---- Cooldowns ----
    ["Tracker de cooldowns de groupe"] = "Group cooldown tracker",
    ["Afficher l'encadré des cooldowns"] = "Show the cooldown frame",
    ["Opacité du fond : |cff%s%d%%|r"] = "Background opacity: |cff%s%d%%|r",
    ["Blocs — clic = tout afficher / tout masquer :"] = "Blocks — click to show / hide all:",
    ["Offensifs"]           = "Offensive",
    ["Défensifs"]           = "Defensive",
    ["Externes"]            = "External",
    ["Externes / raid"]     = "External / raid",
    ["Bloodlust"]           = "Bloodlust",
    ["Résurr."]             = "Res",
    ["Résurrection"]        = "Res",
    ["Battle Rez : |cff22c55e%d|r"] = "Battle Rez: |cff22c55e%d|r",
    ["Lust actif"]          = "Lust active",
    ["Sated"]               = "Sated",
    ["Lust"]                = "Lust",
    ["Prêt"]                = "Ready",
    ["Catégorie dans l'infobulle"] = "Category in tooltip",
    ["Suivre les potions de combat"] = "Track combat potions",
    ["Espacement des lignes"] = "Row spacing",
    ["Espacement pseudo/icône"] = "Name/icon spacing",
    ["Verrouiller le cadre"] = "Lock frame",
    ["Rotation de kick (badges 1/2)"] = "Kick rotation (1/2 badges)",
    ["Activer dans :"] = "Enable in:",
    ["Affichage"] = "Display",
    ["Activation"] = "Enable in",
    ["Légende"] = "Legend",
    ["Rotation de kick"] = "Kick rotation",
    ["Blocs — afficher / masquer"] = "Blocks — show / hide",
    ["Classes"] = "Classes",
    ["Consommables"] = "Consumables",
    ["or / max"] = "gold / max",
    ["qualité inférieure"] = "lower quality",
    ["absent"] = "missing",
    ["Suivis actuellement : "] = "Currently tracked: ",
    ["|cffea4850Détection indisponible (restrictions Blizzard) — un /reload peut aider.|r"] =
        "|cffea4850Detection unavailable (Blizzard restrictions) — a /reload may help.|r",
    ["Monde"] = "World",
    ["Donjons"] = "Dungeons",
    ["Raids"] = "Raids",
    ["Rotation de kick — joueurs inclus :"] = "Kick rotation — included players:",
    ["Auto : coché si le joueur a une interruption. Décoche/recoche pour forcer."] = "Auto: ticked if the player has an interrupt. Toggle to force.",
    -- Stats M+ + alerte Bloodlust
    ["Stats M+"] = "M+ Stats",
    ["Statistiques Mythique+"] = "Mythic+ Statistics",
    ["Actions par catégorie et par joueur (ceux qui ont l'addon)."] = "Actions by category and player (those who run the addon).",
    ["Aucun donjon enregistré"] = "No dungeon recorded yet",
    ["Aucune donnée pour ce donjon."] = "No data for this dungeon.",
    ["Réussis"] = "Successful",
    ["Ratés"] = "Missed",
    ["Survole Off / Déf / Ext / Kick pour le détail"] = "Hover Off / Déf / Ext / Kick for details",
    ["Survole Off / Déf / Ext / Kick pour le détail · glisse le coin ↘ pour redimensionner"] = "Hover Off / Déf / Ext / Kick for details · drag the ↘ corner to resize",
    ["clé en cours"] = "key in progress",
    ["Donjon"] = "Dungeon",
    ["Alerte Bloodlust (Potion + Burst)"] = "Bloodlust alert (Potion + Burst)",
    ["Message + son quand un Lust est lancé"] = "Message + sound when a Lust is cast",
    ["Jouer un son"] = "Play a sound",
    ["Taille du message"] = "Message size",
    ["Couleur (préréglage 1-7)"] = "Color (preset 1-7)",
    ["BLOODLUST — Potion + Burst !"] = "BLOODLUST — Potion + Burst!",
    ["Déplacer le message"] = "Move the message",
    ["Valider la position"] = "Confirm position",
    ["Glisse le cadre, puis clique « Valider la position »"] =
        "Drag the frame, then click \"Confirm position\"",
    ["Prochaine charge :"]  = "Next charge:",
    ["charges"]             = "charges",
    ["Offensif"]            = "Offensive",
    ["Défensif"]            = "Defensive",
    ["Externe"]             = "External",
    ["Potion"]              = "Potion",
    ["Potions"]             = "Potions",

    -- ---- Toolbox ----
    ["Boîte à outils"] = "Toolbox",
    ["Vente automatique"] = "Auto-sell",
    ["Réparation automatique"] = "Auto-repair",
    ["Files d'attente"] = "Queues",
    ["Relève du courrier"] = "Mail",
    ["Alerte HP bas"] = "Low HP alert",
    ["Journaux de combat"] = "Combat logs",
    ["Tout activer"] = "Enable all",
    ["Tout désactiver"] = "Disable all",
    ["Automatisations locales (n'affectent que toi)."] = "Local automations (affect only you).",
    ["Notifications locales (chat, écran, son)."] = "Local notifications (chat, screen, sound).",
    ["Vendre les objets gris chez un marchand"] = "Sell grey items at a merchant",
    ["Vend automatiquement toute la camelote (gris) à l'ouverture d'un marchand."] = "Automatically sells all junk (grey) when you open a merchant.",
    ["Réparer automatiquement"] = "Auto-repair",
    ["Répare tout au marchand — fonds de guilde en priorité, sinon ton or."] = "Repairs everything at a merchant — guild funds first, otherwise your gold.",
    ["Accepter automatiquement les files"] = "Auto-accept queues",
    ["Accepte la fenêtre « prêt » (donjon), la vérification de rôle et l'entrée en champ de bataille."] = "Accepts the ready popup (dungeon), the role check and the battleground port.",
    ["Bouton « Tout récupérer » sur le courrier"] = "\"Collect all\" button on the mailbox",
    ["Ajoute un bouton en bas de la boîte aux lettres pour tout ramasser (argent + objets)."] = "Adds a button at the bottom of the mailbox to take everything (money + items).",
    ["Tout récupérer"] = "Collect all",
    ["Récupération…"] = "Collecting…",
    ["Courrier récupéré."] = "Mail collected.",
    ["Récupération arrêtée (sacs pleins ?)."] = "Collection stopped (bags full?).",
    ["Rien à récupérer."] = "Nothing to collect.",
    ["Équipement réparé (fonds de guilde)."] = "Gear repaired (guild funds).",
    ["Équipement réparé : %s"] = "Gear repaired: %s",
    ["Répare tout au marchand à l'ouverture."] = "Repairs everything at a merchant when it opens.",
    ["Fonds de guilde en priorité"] = "Guild funds first",
    ["Décoché = toujours réparer avec ton or."] = "Unchecked = always repair with your own gold.",
    ["Alerte HP bas (bord d'écran rouge + son)"] = "Low HP alert (red screen edge + sound)",
    ["Seuil HP bas"] = "Low HP threshold",
    ["Afficher SpellID / IconID (infobulles)"] = "Show SpellID / IconID (tooltips)",

    -- ---- Durabilité ----
    ["Durabilité de l'équipement"] = "Gear durability",
    ["Alerte de durabilité faible"] = "Low durability alert",
    ["Seuil jaune (moyen)"] = "Yellow threshold (medium)",
    ["Seuil rouge (critique)"] = "Red threshold (critical)",
    ["|cffea4850Durabilité critique :|r %d%%"] = "|cffea4850Critical durability:|r %d%%",
    ["Durabilité critique : %d%%"] = "Critical durability: %d%%",
    ["|cfffacd40Durabilité faible :|r %d%%"] = "|cfffacd40Low durability:|r %d%%",
    ["Durabilité faible : %d%%"] = "Low durability: %d%%",

    -- ---- Journal de combat ----
    ["Journal de combat (Warcraft Logs)"] = "Combat log (Warcraft Logs)",
    ["Log auto en donjon"] = "Auto-log in dungeons",
    ["Log auto en raid"] = "Auto-log in raids",
    ["Journal de combat activé (Warcraft Logs)."] = "Combat log started (Warcraft Logs).",
    ["Journal de combat arrêté."] = "Combat log stopped.",

    -- ---- Emplacements d'enchantement ----
    ["Tête"]      = "Head",
    ["Épaules"]   = "Shoulders",
    ["Torse"]     = "Chest",
    ["Arme"]      = "Weapon",
    ["Jambes"]    = "Legs",
    ["Pieds"]     = "Feet",
    ["Anneau 1"]  = "Ring 1",
    ["Anneau 2"]  = "Ring 2",

    -- ---- Coffre / fenêtre ----
    ["cases = ilvl du reward · → ilvl au palier suivant"] = "cells = reward ilvl · → ilvl at next tier",
    ["Taille max / normale"] = "Max / normal size",
    ["Fermer"] = "Close",

    -- ---- Buffs & auras / appel ----
    ["Préparation du groupe"] = "Group readiness",
    ["Flacon"]              = "Flask",
    ["Bouffe"]              = "Food",
    ["Huile"]               = "Oil",
    -- libellés courts de buffs de classe (colonnes de la grille)
    ["Robu."]               = "Stam",   -- Robustesse / Stamina
    ["Int."]                = "Int",    -- Intelligence
    ["Sauvage"]             = "Vers",   -- Marque du fauve / Versatility
    ["Cri"]                 = "AP",     -- Cri de guerre / Attack Power
    ["Furie"]               = "Mast",   -- Furie-des-cieux / Mastery
    ["Aura"]                = "Aura",   -- Auras paladin
    ["Appel — tout le monde est prêt |cff22c55e✓|r (flacon / bouffe / huile / buffs OK)"] =
        "Ready check — everyone's ready |cff22c55e✓|r (flask / food / oil / buffs OK)",
    ["Appel — préparation du groupe :"] = "Ready check — group readiness:",
    ["|cffea4850manque|r "] = "|cffea4850missing|r ",
    ["check appel indisponible ("] = "ready-check report unavailable (",

    -- ---- Butin (loot) ----
    ["Aide au butin"]       = "Loot helper",
    ["Survole un objet équipable (sac, butin, lien de chat) : l'addon dit pour qui du groupe c'est un up, d'après l'équipement partagé. Comparaison par ilvl, filtrée par classe et spé."] =
        "Hover any equippable item (bag, loot window, chat link): the addon shows who in the group it upgrades, from shared gear. Item-level comparison, filtered by class and spec.",
    ["Afficher les upgrades dans les infobulles"] = "Show upgrades in tooltips",
    ["Afficher SpellID / IconID dans les infobulles"] = "Show SpellID / IconID in tooltips",
    ["Asylum — up pour :"] = "Asylum — upgrade for:",
    ["Asylum|r |cff8b8fa3— aucun up dans le groupe|r"] = "Asylum|r |cff8b8fa3— no upgrade in the group|r",
    [" |cff8b8fa3· faibles : "] = " |cff8b8fa3· weak: ",
    [" |cffcfd2dc· ilvl moy "] = " |cffcfd2dc· avg ilvl ",
    [" |cff8b8fa3· pas de données|r"] = " |cff8b8fa3· no data|r",
    -- emplacements
    ["Tête"] = "Head", ["Cou"] = "Neck", ["Épaules"] = "Shoulders", ["Dos"] = "Back",
    ["Torse"] = "Chest", ["Poignets"] = "Wrists", ["Mains"] = "Hands", ["Ceinture"] = "Waist",
    ["Jambes"] = "Legs", ["Pieds"] = "Feet", ["Anneau 1"] = "Ring 1", ["Anneau 2"] = "Ring 2",
    ["Bijou 1"] = "Trinket 1", ["Bijou 2"] = "Trinket 2", ["Arme (MD)"] = "Main hand",
    ["Main gauche"] = "Off hand",
    -- enchantements
    ["Enchantements"] = "Enchants",
    ["Cape"] = "Cloak", ["Arme"] = "Weapon",
    -- inventaire (refonte)
    ["Mes consommables"] = "My consumables",
    ["Consommables"] = "Consumables",
    ["Flacons"]   = "Flasks",
    ["Nourriture"] = "Food",
    ["Huiles"]    = "Oils",
    ["Divers"]    = "Misc",
    ["Auto-marteau"] = "Auto-Hammer",
    -- page Diag (diagnostic synchro)
    ["Diag"] = "Diag",
    ["Diag — synchronisation"] = "Diag — sync",
    ["Tout tester"] = "Run all tests",
    ["Codes envoi"] = "Send codes",
    ["Ping whisper"] = "Whisper ping",
    ["Récap"] = "Recap",
    ["Réception"] = "Reception",
    ["Vider"] = "Clear",
    ["Diagnostic communication et combat"] = "Communication and combat diagnostic",
    ["Test whisper"] = "Whisper test",
    ["Commtest"] = "Commtest",
    ["Sonde combat"] = "Combat probe",
    ["Interruptions lancées"] = "Interrupts cast",
    ["(le récap s'affichera ici après avoir cliqué « Récap »)"] = "(the recap will appear here after clicking \"Recap\")",
    ["Solo"]      = "Solo",
    ["Qui en a (groupe)"] = "Who has it (group)",
    ["Tous les personnages"] = "All characters",
    ["Rerolls"] = "Rerolls",
    ["Mon personnage"] = "My character",
    ["Historique"] = "History",
    ["Reconnecte-toi sur ce perso pour régénérer son code."] =
        "Log back onto this character to regenerate its code.",
    ["Qui a :"] = "Who has:",
    ["reroll"] = "reroll",
    ["vu "] = "seen ",
    ["historique"] = "history",
    ["Personne (groupe / guilde / rerolls) ne l'a."] = "Nobody (group / guild / rerolls) has it.",
    ["Aucun perso connecté ni reroll en historique."] = "No connected character or reroll in history.",
    ["Tout afficher"] = "Show all",
    ["Personne dans ton groupe n'en a."] = "Nobody in your group has any.",
    ["Clique un consommable à gauche pour voir qui en a."] =
        "Click a consumable on the left to see who has it.",

    -- ---- Clés & Coffre ----
    ["Clés Mythique+ & Coffre convoité"] = "Mythic+ Keys & Great Vault",
    ["Survole un nom pour afficher son coffre (9 cases). Données partagées par les amis."] =
        "Hover a name to show their vault (9 slots). Data shared by friends.",
    ["Survole un nom pour son coffre (9 cases). Joueurs en ligne : ton groupe, puis ta guilde."] =
        "Hover a name for their vault (9 slots). Online players: your group, then your guild.",
    ["Pas encore de données de coffre."] = "No vault data yet.",
    ["aucune clé"]          = "no keystone",
    ["Groupe"]              = "Group",
    ["Guilde"]              = "Guild",
    ["Ready check"]         = "Ready check",
    ["Pull"]                = "Pull",
    ["Insérer ma clé automatiquement"] = "Auto-insert my keystone",
    ["Boutons Ready check + Pull sur la fenêtre de clé"] =
        "Ready check + Pull buttons on the keystone window",
    ["Raid"] = "Raid", ["Donjons"] = "Dungeons", ["Monde"] = "World", ["PvP"] = "PvP",
    ["Gouffres"] = "Delves", ["Piste"] = "Track",

    -- ---- Alertes / réglages ----
    ["Alertes de stock épuisé"] = "Out-of-stock alerts",
    ["Message dans le chat"]    = "Chat message",
    ["Alerte au centre de l'écran"] = "On-screen (raid warning)",
    ["Alerte sonore"]           = "Sound alert",
    ["Fonctionnalités (affichage local)"] = "Features (local display)",
    ["Couper l'affichage n'empêche jamais l'envoi des infos à tes amis : leur addon reste à jour."] =
        "Turning off a display never stops sharing your data with friends: their addon stays up to date.",
    ["Rapport chat à l'appel (ready check)"] = "Chat report on ready check",

    -- ---- Alertes stock (Core) ----
    ["|cffea4850stock épuisé :|r %s"] = "|cffea4850out of stock:|r %s",
    ["Stock épuisé : %s"] = "Out of stock: %s",
    ["|cfffacd40stock bas :|r %s (%d)"] = "|cfffacd40low stock:|r %s (%d)",
    ["Stock bas : %s (%d)"] = "Low stock: %s (%d)",

    -- ---- Slash / messages Core ----
    ["chargé — |cff%s/asylum|r pour ouvrir, ou clique le bouton autour de la minimap."] =
        "loaded — |cff%s/asylum|r to open, or click the button around the minimap.",
    ["tes buffs actuels :"] = "your current buffs:",
    ["annonce envoyée au groupe et à la guilde."] = "announce sent to party and guild.",
    ["synchro indisponible (canal de communication non enregistré)."] =
        "sync unavailable (addon channel not registered).",
    ["réglages remis par défaut (liste d'amis vidée)."] =
        "settings restored to defaults (friend list cleared).",
    ["commandes : |cffffffff/asylum|r ouvrir · |cffffffff/asylum keys|r clés du groupe · |cffffffff/asylum ping|r test de comms · |cffffffff/asylum sync|r annoncer · |cffffffff/asylum reset|r"] =
        "commands: |cffffffff/asylum|r open · |cffffffff/asylum keys|r group keystones · |cffffffff/asylum ping|r comms test · |cffffffff/asylum sync|r announce · |cffffffff/asylum reset|r",
    ["Clés M+ :"] = "M+ keystones:",
    ["cooldowns suivis pour %s :"] = "tracked cooldowns for %s:",
    [" |cff22c55e[affiché]|r"] = " |cff22c55e[shown]|r",

    -- ---- Minimap / tooltip bouton ----
    ["Clic gauche : ouvrir / fermer"] = "Left-click: open / close",
    ["Clic gauche : rafraîchir + annoncer"] = "Left-click: refresh + announce",
    ["Clic droit : ouvrir / fermer le menu"] = "Right-click: open / close menu",
    ["Glisser : déplacer le bouton"]  = "Drag: move the button",
    ["Rafraîchissement dispo dans %d s."] = "Refresh available in %d s.",
    ["Données rafraîchies et annoncées au groupe/guilde."] = "Data refreshed and announced to group/guild.",

    -- ---- Aperçu des overlays (menus Kick / Cooldowns) ----
    ["Aperçu du cadre"]   = "Preview frame",
    ["Arrêter l'aperçu"]  = "Stop preview",
    ["Placez le cadre puis verrouillez-le."] = "Place the frame, then lock it.",
    ["Aperçu"]            = "Preview",
    ["Arrêter"]           = "Stop",

    -- ---- Fenêtre de sélection des cooldowns par classe ----
    ["Activer tout"]     = "Enable all",
    ["Désactiver tout"]  = "Disable all",

    -- ---- Cadenas sur la barre de titre des overlays ----
    ["Déverrouiller le cadre"] = "Unlock frame",
}

-- Traduit une chaîne (client FR : identité ; sinon EN via dictionnaire).
function NS.L(s)
    if not EN then return s end
    if s == nil then return s end
    return DICT[s] or s
end

-- Nom de classe localisé par le jeu (déjà FR sur client FR, EN sinon).
function NS.ClassLabel(token)
    if token and LOCALIZED_CLASS_NAMES_MALE and LOCALIZED_CLASS_NAMES_MALE[token] then
        return LOCALIZED_CLASS_NAMES_MALE[token]
    end
    return token or "?"
end

-- Nom de sort localisé par le jeu (fallback = libellé fourni).
function NS.SpellName(spellID, fallback)
    if spellID then
        local getName = (C_Spell and C_Spell.GetSpellName) or GetSpellInfo
        if getName then
            local ok, name = pcall(getName, spellID)
            if ok and name and name ~= "" then return name end
        end
    end
    return fallback
end
