As far at the i18n goes, I'd recommend using Locale::Maketext::Extract, which I recommend not because I'm the maintainer, but because it is good! I became the maintainer BECAUSE it is good and I wanted to make it better.
i18n is complex, and Locale::Maketext adds the flexibility to solve issues like (eg) multiple forms of plural, differing word orders etc, while Locale::Maketext::Lexicon and its companion Locale::Maketext::Extract (with xgettext.pl) makes it easy:
- for your translators, because everything gets dumped to a .PO file, which they can edit with (eg) poEdit, and
- for your programmers, because it'll parse your Perl code, templates and YAML and pull out the latest versions of strings that need translating -> less maintenance
To get an idea of how it all works, read (in order):