I am playing around with newov and especially freeform. It is very nice. Since I need to support German at my web site it would nice if error messages and other information that are sent back to the visitor could be in an other language. I came up with a simple solution using a dict that holds all the messages in different languages. multilang.py multilangDict = {'emptyPasswd':{'eng':"Please enter a non-empty password.", 'de':"Ein leeres Passwort ist nicht erlaubt. Eingabe bitte wiederholen!" }, 'passwdDontMatch':{'eng':"Passwords do not match. Please reenter.", 'de':"Die Passwörter stimmen nicht überrein. Eingabe bitte wiederholen!" } } Umlauts (ö and ü) work with my browser settings but might need to use & uml; notation: multilang2.py from newov stan import xml multilangDict = {'emptyPasswd':{'eng':"Please enter a non-empty password.", 'de':"Ein leeres Passwort ist nicht erlaubt. Eingabe bitte wiederholen!" }, 'passwdDontMatch':{'eng':"Passwords do not match. Please reenter.", 'de':xml("Die Passw¨rter stimmen nicht æuuml;berrein. Eingabe bitte wiederholen!") } } Unicode might be necessary if languages like Chinese are needed. in freeform.py you just put: from nevow import multilang multilangDict = multilang.multilangDict lang = 'de' #read from configuration somewhere or set by visitor or url like www.example.com/mylang/foo and change the formless.InputError arguments to dict lookups, e.g.: class PasswordValidator(components.Adapter): __implements__ = IInputValidator, def validate(self, context, boundTo, data): """Password needs to look at two passwords in the data, """ pw1 = data[0] if pw1 == '': raise formless.InputError(multilangDict['emptyPasswd'][lang]) #changed args = context.locate(iwoven.IRequest).args binding = context.locate(formless.IBinding) pw2 = args.get("%s____2" % binding.name, [''])[0] if pw1 != pw2: raise formless.InputError(multilangDict['passwdDontMatch'][lang]) #changed f return self.original.coerce(data[0]) This works the way I want it. Since the number of messages is rather small a dict seems ok in terms of memory usage. Because the languages part is in a separate file, it can be maintained by anybody who knows the (foreign) languages without the need of looking through the code. If the same message is used at several places changing it becomes much easier too. How do you thing about it? Mike