extends Node # UIStrings — loads UI display text from data/ui-strings.yaml. # Access: UIStrings.get_text("hud.mode_label") -> "Mode" # Falls back to the key itself if not found, with a push_warning. const STRINGS_PATH: String = "res://data/ui-strings.yaml" var _strings: Dictionary = {} var _loaded: bool = false func _ready() -> void: _load_strings() func _load_strings() -> void: if not FileAccess.file_exists(STRINGS_PATH): push_warning("UIStrings: file not found: %s" % STRINGS_PATH) return var file := FileAccess.open(STRINGS_PATH, FileAccess.READ) if file == null: push_warning("UIStrings: failed to open: %s" % STRINGS_PATH) return var text := file.get_as_text() file.close() _strings = _parse_yaml(text) _loaded = true print("UIStrings: loaded %d strings from %s" % [_strings.size(), STRINGS_PATH]) ## Get a UI string by dotted key. Returns the key itself if not found. func get_text(key: String) -> String: if _strings.has(key): return _strings[key] push_warning("UIStrings: missing key '%s'" % key) return key ## Check if a key exists. func has_key(key: String) -> bool: return _strings.has(key) ## Get all keys. func get_all_keys() -> PackedStringArray: return PackedStringArray(_strings.keys()) ## Reload from disk (useful for hot-reload during development). func reload() -> void: _strings.clear() _loaded = false _load_strings() ## Parse YAML with arbitrary nesting depth. ## Returns flat Dictionary with dotted keys: { "section.sub.key": "value" }. ## Delegates to YamlParser.parse_flat() (#560). static func _parse_yaml(text: String) -> Dictionary: return load("res://scripts/util/yaml_parser.gd").parse_flat(text)