I think that all options are good, even translations driven by definitions, but my concern is about ease of use.
A system that allows to any person, even if does not know anything about programming, participate actively in translations will be better.
I think that by making the system more abstract will affect the future participation of other kind of contributors. I refer specifically to use of classes for translations.
I think that you know that I've used gettext for all my modules, and this desition is taken for two reasons:
1. Transparency for translate.
2. Ease of use.
What do I mean?
1. For me, to write modules using strings with:
__('Text to be translated')
Is more transparent than:
define('CONSTANT','Text to be translated');
and then use this constant wherever I need. Using gettext simply I write a module and forget translations. Translations must be done using a gui editor easily.
Same thing about clases and other methods. This point bring me to point 2.
2. Is very easy for programmers write code and using strings directly and forget about translations. At the same time it's easier for translator simply to use the GUI editor and translate the strings without worrying about code.
Well, It is only an example. The main idea here is that regardless the choosen system, the important is the ease of use for those people that will use it.
IMHO, we need to think on every kind of contributor separately:
1. Translators
2. Developers
3. Designers
4. Final users
5. Other interested people.
I mean, wich tool is much convenient for every type of xoopser?
Sorry for my bad English.