I'm one of the people who put i18n into Plone (and incidentally, I also worked on Rosetta). The company where I'm working now is switching to Django. So you can count on me to help with this i18n thing :-)
So, the way we do it in Plone (since someone asked on the wiki), is more or less like this: - We have a component called "translation service", which loads the message catalogs and indexes them in memory. - The templates have i18n markup; so the strings are translated when the template is being rendered. - I originally implemented PlacelessTranslationService to choose a language based on the HTTP header, overridable by a cookie. Alas, that didn't work out so well :-( turns out most people don't even know they can set up language preferences in their browser. The more recent versions of plone are migrating to a click-the-flag system (which essentialy just sets the aforementioned cookie).
