"""UI texts from `config/texts.yaml`, validated at startup so a missing key fails fast instead of mid-dialog.""" from pathlib import Path import yaml from pydantic import BaseModel, ConfigDict class _Strict(BaseModel): model_config = ConfigDict(extra="forbid", frozen=True) class MenuTexts(_Strict): commit: str status: str logs: str alerts: str members: str back: str cancel: str placeholder: str class StartTexts(_Strict): welcome: str no_access: str invite_rejected: str class HelpTexts(_Strict): text: str class SectionTexts(_Strict): commit: str logs: str alerts: str members: str cancelled: str class MembersTexts(_Strict): title: str line: str never: str invite: str revoke: str confirm: str confirm_yes: str confirm_no: str revoked: str not_revoked: str invite_caption: str class CommitTexts(_Strict): title: str empty: str page: str up: str prev: str next: str dir_button: str file_button: str new_file: str new_dir: str file_card: str last_commit: str no_commits: str view: str replace: str delete: str to_dir: str soon: str unavailable: str sent_as_file: str ask_file_name: str ask_dir_name: str bad_name: str exists: str protected: str ask_content: str too_big: str binary: str encoding: str syntax: str fix: str force: str added: str modified: str deleted: str draft_button: str draft_title: str draft_empty: str unstage: str draft_full: str in_draft_new: str in_draft_modified: str in_draft_deleted: str mark_new: str mark_modified: str mark_deleted: str op_add: str op_modify: str op_delete: str message_button: str message_current: str message_missing: str ask_message: str bad_message: str push_button: str commit_button: str edit_message: str push_confirm: str push_go: str pushing: str pushed: str ci_pending: str conflict: str overwrite: str push_empty: str push_limit: str push_failed: str class StatusTexts(_Strict): title: str line: str empty: str unavailable: str card: str none: str no_limit: str check_button: str refresh: str to_list: str to_card: str checking: str report_title: str report_container: str report_line: str check_running: str check_health: str check_restarts: str check_cpu: str check_mem: str check_log_errors: str check_http: str days: str hours: str minutes: str seconds: str class Texts(_Strict): menu: MenuTexts start: StartTexts help: HelpTexts section: SectionTexts members: MembersTexts commit: CommitTexts status: StatusTexts def load_texts(config_dir: Path) -> Texts: with (config_dir / "texts.yaml").open(encoding="utf-8") as f: return Texts.model_validate(yaml.safe_load(f))