When we decided to commercially support Seaside for Cincom Smalltalk we took a step back and looked at the small things we could quickly do that would help out our users. One obvious thing was internationalization of web applications.
VisualWorks already has a great deal of internationalization support, from UserMessages for translations to Locale based numerics, dates, times, etc. However, these settings are global to the image. That's not so useful if you're building a web application.
So with Seaside, it was clear we could take advantage of the process model and make all Locale support act on a per-process basis. This provides a great deal of flexibility for people building Web Services, socket based applications, Web Applications in Web ToolKit, VisualWave and Seaside and simply presenting a user interface in multiple languages on different screens.
This behavior should appear in the next version of Cincom Smalltalk - that means you'll pick it up in both VisualWorks and ObjectStudio 8 when they release their next versions.
How does this relate to Seaside? There was a question posted in response to our recent podcast on Seaside in Cincom Smalltalk asking why wouldn't we set up our locales to be specific to sessions. Good news Philippe, we did! - as a request comes in for Seaside, the current locale is extracted from the session and applied to the running process. In effect, each request that comes in gets specialized to the desired Locale. As an added bonus, changing the locale stores the change back in to the session.
We include in our Seaside distribution a test for internationalization of this nature. The work for this was done by Martin Kobetic and reviewed by Steve Dahl, Tamara Kogan and myself. So if we break anything with the change, you know where we live.. well, where I podcast at least.
To use the localization behavior, you can access it directly on the session object inside a WAComponent, eg:
self session availableLocales.
self session locale.
self session locale: self session availableLocales last.
Locale current languageID.
(#translatedString << 'Translated String' >> #myDemoApp)