At my $DAYJOB we use gettext for I18N. I wrote a plugin to xgettext.pl that extracts all English text from the database tables and add them to the master messages.pot.
It works very well - translators deal with only one file when doing translation - the po file. There's no fiddling with database entries when doing translations.