xgettext only knew the tr keyword, so binding descriptions - translated at runtime via tr(b.description) in _translate_bindings() - never made it into base.pot. The strings added manually in #4363 were wiped by the regeneration in #4557. Teach the generator two more keywords: Binding:3 picks up our own binding definitions, and tr_noop marks strings that only exist inside the textual package, listed in the new tui/binding_descriptions.py. The list walks the full MRO of the textual classes used in components.py, since _translate_bindings() operates on the merged bindings map (e.g. Scroll Up comes from ScrollView and carries live translations in 18 locales today). Raw Input and Button widgets never went through _translate_bindings(), so their help-panel descriptions stayed English regardless of .po content - subclass them (_Input/_Button) following the _OptionList pattern to make those translations real. test_tooling/check_binding_descriptions.py verifies the list against the installed textual after upgrades (manual, not wired into CI). |
||
|---|---|---|
| .. | ||
| applications | ||
| default_profiles | ||
| lib | ||
| locales | ||
| scripts | ||
| tui | ||
| __init__.py | ||
| __main__.py | ||
| examples | ||
| main.py | ||