[Zope-dev] zope.18n:translate() keyword arguments versus MessageID attributes

Michael Howitz mh at gocept.com
Wed Oct 27 02:44:11 EDT 2010


Am 26.10.2010 um 16:13 schrieb Tres Seaver:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> On 10/26/2010 09:36 AM, Christian Theune wrote:
>> Hi,
>> 
>> I've fiddled a bit with 
>> https://bugs.edge.launchpad.net/zope.i18n/+bug/592753 and ended up with 
>> an unclear situation:
>> 
>> The ``translate'' methods of both zope.i18n and ITranslationDomain have 
>> optional parameters for the domain/default/mapping attributes of a 
>> message ID.
>> 
>> The message ID attributes always override the parameters but it is not 
>> said why. (I probed the tests and they at least verify that this is the 
>> case but don't state motivation.)
>> 
>> As I had to chase this down for quite a while when I originally tried to 
>> call zope.i18n.translate() directly (for providing translated emails) it 
>> took me quite a while to understand what's going on.
>> 
>> I see two possibilities for improving the situation:
>> 
>> - don't implicitly ignore the parameters, but raise an exception if
>>   both a message id and at least one of the parameters (domain/default
>>   /mapping) is given and write some documentation that explains the
>>   situation (what is happening and why)
>> 
>> or
>> 
>> - make the parameters take precedence over the message id attributes
>> 
>> So - why not do the latter?
> 
> I prefer the latter, and don't think we need a deprecation cycle for it:
> if the call site is passing in a mapping, that is presumably more
> specific than anything stored in the catalog.  I can't see how we would
> break anything here, as nobody is likely to have actually used the
> feature (since it is effectively a no-op).

+1 But the `mapping` attribute should update the existing mapping of the message ID as this would allow to have a partial mapping stored on the message ID and add the other part when translating.

Creating new message IDs from existing message IDs should behave the same way:

police_and_dog = _('${a} + ${b} = ${c}', mapping=dict(a='police', c='police dog'))
police_dog = _(police_and_dog, mapping=dict(b='dog'))

Currently the mapping for `police_dog` is ignored but I think it should update the mapping of `police_and_dog` in the new message ID.

Currently you have to do the following to achieve the same:

mapping = police_and_dog.mapping.copy()
mapping.update(dict(b='dog'))
police_dog = _(unicode(police_and_dog), mapping=mapping)

Yours sincerely,
-- 
Michael Howitz · mh at gocept.com · software developer
gocept gmbh & co. kg · forsterstraße 29 · 06112 halle (saale) · germany
http://gocept.com · tel +49 345 1229889 8 · fax +49 345 1229889 1
Zope and Plone consulting and development



More information about the Zope-Dev mailing list