@startuml messages-class-diagram title CR-Core — Messages service (class diagram) skinparam classAttributeIconSize 0 hide empty members package "fr.luc.crcore.util.message" { interface MessagesService { + get(key, placeholderPairs...): String + raw(key): String + has(key): boolean + set(key, template): void + reload(): void + loadAdditional(resourceName): void + setApplyColorCodes(enabled): void + isApplyColorCodes(): boolean + getUserFile(): File } class YamlMessagesService { - plugin: JavaPlugin - defaults: Map ' in-memory (jar resource) - messages: Map ' effective (defaults + user file) - userFileName: String ' -messages.yml - userFile: File - applyColorCodes: boolean -- + YamlMessagesService(plugin: JavaPlugin) -- - loadDefaultsFromResource(): void ' charge crcore-messages.yml (jar) - ensureUserFile(): void ' copie template si absent - rebuildEffectiveMessages(): void ' defaults + user file - {static} flatten(section, prefix, out): void } YamlMessagesService ..|> MessagesService } package "fr.luc.crcore" { class CRCore { + messages(): MessagesService # buildMessagesService(): MessagesService ' override point } CRCore "1" *-- "1" MessagesService : owns } note bottom of YamlMessagesService Modèle "un seul fichier par plugin" : Sources en mémoire (la 2e écrase la 1ère sur clés communes) : 1. crcore-messages.yml ← jar (toujours présent, fallback) 2. -messages.yml ← dataFolder (édité par l'admin) Création du fichier user au 1er boot : Priorité 1 : ressource du plugin de jeu sous le même nom Priorité 2 : copie des defaults CR-Core Placeholders : {name} via varargs key/value Codes couleur : &a → §a (toggle) end note @enduml