On Dec 31, 2010, at 11:20 AM, Martin Weissenboeck wrote: > No, I did not not want to translate these sentences manually. > The error_message=T(..) does not work, because there are some if-statements > inside the class IS_INT_IN_RANGE (and in some other classes). > > One solution could be a list of error messages for these classes.
You don't need a list, because for any given instance, only one of the error messages is used, depending on which combination of min & max you set. > > My proposal uses T as an addition parameter of the __init__ methode of class > IS_INT_IN_RANGE (and all other classes) in validators.py and therefore there > is not compatiblity problem. I can use everything as before and the > translation method (T-search) works with every "internal" error_message. I think the T-search would have to change, since it doesn't look in gluon. Not a big change. > > This usage of T has another advantage: > > Currenty error_messages are defined twice: > 1st inside validators.py, e.g.: > def __init__(self, expression, error_message='invalid expression'): > ... > self.error_message = error_message > > 2nd on using the class, e.g. > a=IS_MATCH(...,error_message=T('invalid expression') > I think, this is against the rule "Don't repeat yourself" > > With an additional T-parameter these lines could be written as follows: > 1st inside validators.py, e.g.: > def __init__(self, expression, error_message='invalid expression', T=lambda > x:x): > ... > self.error_message = T(error_message) > > 2nd on using the class, e.g. > a=IS_MATCH(...,T=T) # if you like the default message > Now the default error message appears only once, but could be changed by the > user. > But I don't know whether this will slow down web2py. The ideal solution would be one that allowed using T() normally in gluon (at least in code that's invoked from an application); that avoids the T=T requirement. My conjecture is when Python compiles the gluon code, it binds T references (to what? that's the hole in my theory) at compile time, and thus ignores the presence of T in globals. Making T an argument forces Python to defer binding. > > 2010/12/31 Jonathan Lundell <jlund...@pobox.com> > On Dec 31, 2010, at 6:18 AM, Martin Weissenboeck wrote: >> I want to translate my web page to German. The T()"operator" is very fine, >> but I could not find any way to translate message like >> "enter an integer less than or equal to %(max)g" >> in class IS_INT_IN_RANGE. >> >> I think it is very unprofessional to mix English and German words and I have >> tried to find a solution. > > Am I correct that you had to make the translation entries manually (because > the T() search doesn't look in gluon)? > > I assume that the current logic was written with the intention of passing in > error_message=T(something); does that work too? > > I wonder whether there isn't a general solution that would let us use T() in > gluon code that's invoked by applications. > > > >> >> I have changed the following lines (file validators.py, class >> IS_INT_IN_RANGE) >> >> def __init__( >> self, >> minimum=None, >> maximum=None, >> error_message=None, >> T=lambda x:x, >> ): >> self.minimum = self.maximum = None >> if minimum is None: >> if maximum is None: >> if error_message is None: >> self.error_message = T('enter an integer') >> else: >> self.maximum = int(maximum) >> if error_message is None: >> error_message = T('enter an integer less than or equal >> to %(max)g') >> self.error_message = error_message % dict(max=self.maximum-1) >> elif maximum is None: >> self.minimum = int(minimum) >> if error_message is None: >> error_message = T('enter an integer greater than or equal to >> %(min)g') >> self.error_message = error_message % dict(min=self.minimum) >> else: >> self.minimum = int(minimum) >> self.maximum = int(maximum) >> if error_message is None: >> error_message = T('enter an integer between %(min)g and >> %(max)g') >> self.error_message = error_message % dict(min=self.minimum, >> max=self.maximum-1) >> >> And I have used it: >> >> Field('number', type='integer', >> requires=IS_INT_IN_RANGE(2,5,T=T), label=T('number')), >> .... >> >> It's full compatible. Are there any disadvantages in my solution? Or is >> there any other solution? >> >> Of course the whole file validators.py has to be changed. Maybe the file >> tools.py too? >> Is it possible to use this proposal in the next release? >> > > > > > > -- > Mit freundlichen Grüßen / With kind regards > Martin Weissenböck > Gregor-Mendel-Str. 37, 1190 Wien > Austria / European Union > Tel +43 1 31400 00 > Fax +43 1 31400 700