How to I prevent <X> from being treated as a placeholder in the UI?

That’s going to be an illegible pain in offline editors though. I don’t want to deprive people of their tool of choice just because Transifex is in the mix.

Also, I don’t want to make people retranslate all those strings.

Personally, I do most of my translation in MemoQ with additional support from Transifex features on top of that, and other people will be using Virtaal or Poedit or Trados or some other offline tool.