Rather than roll my own translation solution, I think it makes the most sense to simply use GNU gettext. This would obsolete our recent work on the MessageEngine, which essentially is a similar solution.
If anyone has advice on using gettext with games, please pass it along. I believe several successful projects (e.g. Wesnoth) already use it to great effect.
Looks like gettext can just as easily handle data files as strings in source codes. See this wesnoth campaign file example.