# HG changeset patch # User Adrien Di Mascio # Date 1253129357 -7200 # Node ID 5247789df5413ad10d8ff9d62f87f1571f9c1a51 # Parent 7d53d84919329f8530a2807017a0bcfeb30ec9cd [gettext] provide GNU contexts to avoid translations ambiguities diff -r 7d53d8491932 -r 5247789df541 common/i18n.py --- a/common/i18n.py Wed Sep 16 21:23:35 2009 +0200 +++ b/common/i18n.py Wed Sep 16 21:29:17 2009 +0200 @@ -25,10 +25,14 @@ output.close() -def add_msg(w, msgid): +def add_msg(w, msgid, msgctx=None): """write an empty pot msgid definition""" if isinstance(msgid, unicode): msgid = msgid.encode('utf-8') + if msgctx: + if isinstance(msgctx, unicode): + msgctx = msgctx.encode('utf-8') + w('msgctxt "%s"\n' % msgctx) msgid = msgid.replace('"', r'\"').splitlines() if len(msgid) > 1: w('msgid ""\n') diff -r 7d53d8491932 -r 5247789df541 cwconfig.py --- a/cwconfig.py Wed Sep 16 21:23:35 2009 +0200 +++ b/cwconfig.py Wed Sep 16 21:29:17 2009 +0200 @@ -812,7 +812,7 @@ self.info("loading language %s", language) try: tr = translation('cubicweb', path, languages=[language]) - self.translations[language] = tr.ugettext + self.translations[language] = (tr.ugettext, tr.upgettext) except (ImportError, AttributeError, IOError): self.exception('localisation support error for language %s', language) diff -r 7d53d8491932 -r 5247789df541 dbapi.py --- a/dbapi.py Wed Sep 16 21:23:35 2009 +0200 +++ b/dbapi.py Wed Sep 16 21:29:17 2009 +0200 @@ -214,10 +214,13 @@ self.lang = 'en' # use req.__ to translate a message without registering it to the catalog try: - self._ = self.__ = self.translations[self.lang] + gettext, pgettext = self.translations[self.lang] + self._ = self.__ = gettext + self.pgettext = pgettext except KeyError: # this occurs usually during test execution self._ = self.__ = unicode + self.pgettext = lambda x,y: y self.debug('request default language: %s', self.lang) def decorate_rset(self, rset): diff -r 7d53d8491932 -r 5247789df541 devtools/devctl.py --- a/devtools/devctl.py Wed Sep 16 21:23:35 2009 +0200 +++ b/devtools/devctl.py Wed Sep 16 21:29:17 2009 +0200 @@ -121,6 +121,7 @@ entities = [e for e in schema.entities() if not e in libschema] else: entities = schema.entities() + rinlined = uicfg.autoform_is_inlined done = set() for eschema in sorted(entities): etype = eschema.type @@ -129,8 +130,14 @@ if not eschema.is_final(): add_msg(w, 'This %s' % etype) add_msg(w, 'New %s' % etype) - add_msg(w, 'add a %s' % etype) - add_msg(w, 'remove this %s' % etype) + for rschema, targetschemas, role in eschema.relation_definitions(True): + targetschemas = [tschema for tschema in targetschemas + if rinlined.etype_get(eschema, rschema, role, tschema)] + for tschema in targetschemas: + add_msg(w, 'add a %s' % tschema, + 'inlined:%s.%s.%s' % (etype, rschema, role)) + add_msg(w, 'remove this %s' % tschema, + 'inlined:%s:%s:%s' % (etype, rschema, role)) if eschema.description and not eschema.description in done: done.add(eschema.description) add_msg(w, eschema.description) @@ -143,7 +150,8 @@ relations = schema.relations() for rschema in sorted(set(relations)): rtype = rschema.type - add_msg(w, rtype) + for subjschema in rschema.subjects(): + add_msg(w, rtype, subjschema.type) done.add(rtype) if not (schema.rschema(rtype).is_final() or rschema.symetric): add_msg(w, '%s_object' % rtype) @@ -157,7 +165,7 @@ if eschema.is_final(): continue for role, rschemas in (('subject', eschema.subject_relations()), - ('object', eschema.object_relations())): + ('object', eschema.object_relations())): for rschema in rschemas: if rschema.is_final(): continue diff -r 7d53d8491932 -r 5247789df541 schema.py --- a/schema.py Wed Sep 16 21:23:35 2009 +0200 +++ b/schema.py Wed Sep 16 21:29:17 2009 +0200 @@ -100,7 +100,7 @@ etype = ETYPE_NAME_MAP[etype] return etype -def display_name(req, key, form=''): +def display_name(req, key, form='', context=None): """return a internationalized string for the key (schema entity or relation name) in a given form """ @@ -111,7 +111,11 @@ key = key + '_' + form # ensure unicode # added .lower() in case no translation are available - return unicode(req._(key)).lower() + if context: + return req.pgettext(context, key).lower() + else: + return unicode(req._(key)).lower() + __builtins__['display_name'] = deprecated('display_name should be imported from cubicweb.schema')(display_name) def ERSchema_display_name(self, req, form=''): diff -r 7d53d8491932 -r 5247789df541 server/session.py --- a/server/session.py Wed Sep 16 21:23:35 2009 +0200 +++ b/server/session.py Wed Sep 16 21:29:17 2009 +0200 @@ -210,13 +210,18 @@ vreg = self.vreg language = language or self.user.property_value('ui.language') try: - self._ = self.__ = vreg.config.translations[language] + gettext, pgettext = vreg.config.translations[language] + self._ = self.__ = gettext + self.pgettext = pgettext except KeyError: language = vreg.property_value('ui.language') try: - self._ = self.__ = vreg.config.translations[language] + gettext, pgettext = vreg.config.translations[language] + self._ = self.__ = gettext + self.pgettext = pgettext except KeyError: self._ = self.__ = unicode + self.pgettext = lambda x,y: y self.lang = language def change_property(self, prop, value): diff -r 7d53d8491932 -r 5247789df541 web/formfields.py --- a/web/formfields.py Wed Sep 16 21:23:35 2009 +0200 +++ b/web/formfields.py Wed Sep 16 21:29:17 2009 +0200 @@ -513,6 +513,7 @@ help = rschema.rproperty(targetschema, eschema, 'description') kwargs['required'] = card in '1+' kwargs['name'] = rschema.type + kwargs['label'] = (eschema.type, rschema.type) kwargs.setdefault('help', help) if rschema.is_final(): if skip_meta_attr and rschema in eschema.meta_attributes(): diff -r 7d53d8491932 -r 5247789df541 web/request.py --- a/web/request.py Wed Sep 16 21:23:35 2009 +0200 +++ b/web/request.py Wed Sep 16 21:29:17 2009 +0200 @@ -114,7 +114,8 @@ self.set_default_language(vreg) def set_language(self, lang): - self._ = self.__ = self.translations[lang] + gettext, self.pgettext = self.translations[lang] + self._ = self.__ = gettext self.lang = lang self.cnx.set_session_props(lang=lang) self.debug('request language: %s', lang) diff -r 7d53d8491932 -r 5247789df541 web/views/formrenderers.py --- a/web/views/formrenderers.py Wed Sep 16 21:23:35 2009 +0200 +++ b/web/views/formrenderers.py Wed Sep 16 21:29:17 2009 +0200 @@ -87,7 +87,10 @@ def render_label(self, form, field): if field.label is None: return u'' - label = self.req._(field.label) + if isinstance(field.label, tuple): # i.e. needs contextual translation + label = self.req.pgettext(*field.label) + else: + label = self.req._(field.label) attrs = {'for': form.context[field]['id']} if field.required: attrs['class'] = 'required' @@ -485,7 +488,7 @@ def inline_relation_form(self, w, form, rschema, targettype, role): entity = form.edited_entity - __ = self.req.__ + __ = self.req.pgettext w(u'
' % rschema) existant = entity.has_eid() and entity.related(rschema) if existant: @@ -513,8 +516,9 @@ entity.eid, targettype, rschema, role) if card in '1?': js = "toggleVisibility('%s'); %s" % (divid, js) + ctx = 'inlined:%s.%s.%s' % (entity.e_schema, rschema, role) w(u'+ %s.' - % (rschema, entity.eid, js, __('add a %s' % targettype))) + % (rschema, entity.eid, js, __(ctx, 'add a %s' % targettype))) w(u'
') w(u'
 
') w(u'')