def get_attrs(self, html_compatibility, source_language): schema = get_dx_schema(self.context) attrs = [] for key in self.attrs: if key.startswith('qSEO_'): if self.context.hasProperty(key): value = self.context.getProperty(key) else: continue else: field = schema[key] if ILanguageIndependentField.providedBy(field): logger.warn( "Exporting language independent attribute %s, " "this may give unexpected results during import such as all " "language versions have the value of the last language set " "in the attribute!" % key) value = field.get(self.context) if IRichTextValue.providedBy(value): value = value.raw if isinstance(value, unicode): value = value.encode('UTF-8') if not value: value = '' data = dict(id=key, value=value, source_language=source_language) if html_compatibility: attrs.append(HTML_ATTR_BODY % data) else: attrs.append(XLIFF_ATTR_BODY % data) return attrs
def copy_fields(self, translation): fti = getUtility(IDexterityFTI, name=self.context.portal_type) schemas = [] schemas.append(fti.lookupSchema()) for behavior_schema in \ utils.getAdditionalSchemata(self.context, self.context.portal_type): if behavior_schema is not None: schemas.append(behavior_schema) for schema in schemas: for field_name in schema: if field_name in EXCLUDES: continue if not ILanguageIndependentField.providedBy(schema[field_name]): value = getattr(schema(self.context), field_name, _marker) if IRelationValue.providedBy(value): obj = value.to_object adapter = queryAdapter(translation, ILanguage) trans_obj = ITranslationManager(obj).get_translation(adapter.get_language()) if trans_obj: intids = component.getUtility(IIntIds) value = RelationValue(intids.getId(trans_obj)) if not (value == _marker): # We check if not (value == _marker) because z3c.relationfield has an __eq__ setattr(schema(translation), field_name, value)
def render(self): for field in self.fields.keys(): if field in self.schema: if ILanguageIndependentField.providedBy(self.schema[field]): self.widgets[field].addClass('languageindependent') self.babel_content = super(MultilingualEditForm, self).render() return self.babel()
def copy_fields(self, translation): fti = getUtility(IDexterityFTI, name=self.context.portal_type) schemas = [] schemas.append(fti.lookupSchema()) for behavior_schema in \ utils.getAdditionalSchemata(self.context, self.context.portal_type): if behavior_schema is not None: schemas.append(behavior_schema) doomed = False for schema in schemas: for field_name in schema: if ILanguageIndependentField.providedBy(schema[field_name]): doomed = True value = getattr(schema(self.context), field_name, _marker) if IRelationValue.providedBy(value): obj = value.to_object adapter = queryAdapter(translation, ILanguage) trans_obj = ITranslationManager(obj)\ .get_translation(adapter.get_language()) if trans_obj: intids = component.getUtility(IIntIds) value = RelationValue(intids.getId(trans_obj)) if not (value == _marker): # We check if not (value == _marker) because # z3c.relationfield has an __eq__ setattr(schema(translation), field_name, value) # If at least one field has been copied over to the translation # we need to inform subscriber to trigger an ObjectModifiedEvent # on that translation. return doomed
def get_attrs(self, html_compatibility, source_language): schema = get_dx_schema(self.context) attrs = [] for key in self.attrs: field = schema[key] if ILanguageIndependentField.providedBy(field): logger.warn( "Exporting language independent attribute %s, " "this may give unexpected results during import such as all " "language versions have the value of the last language set " "in the attribute!" % key ) value = field.get(self.context) if IRichTextValue.providedBy(value): value = value.raw if isinstance(value, unicode): value = value.encode("UTF-8") data = dict(id=key, value=value, source_language=source_language) if html_compatibility: attrs.append(HTML_ATTR_BODY % data) else: attrs.append(XLIFF_ATTR_BODY % data) return attrs
def render(self): for field in self.fields.keys(): if field in self.schema: if ILanguageIndependentField.providedBy(self.schema[field]): self.widgets[field].addClass('languageindependent') # With plone.autoform, fieldnames from additional schematas # reference their schema by prefixing their fieldname # with schema.__identifier__ and then a dot as a separator # See autoform.txt in the autoform package if '.' in field: schemaname, fieldname = field.split('.') for schema in self.additionalSchemata: if schemaname == schema.__identifier__ and fieldname in schema: if ILanguageIndependentField.providedBy(\ schema[fieldname]): self.widgets[field].addClass('languageindependent') self.babel_content = super(MultilingualEditForm, self).render() return self.babel()
def render(self): self.request['disable_border'] = True for field in self.fields.keys(): if field in self.schema: if ILanguageIndependentField.providedBy(self.schema[field]): self.widgets[field].addClass('languageindependent') # With plone.autoform, fieldnames from additional schematas # reference their schema by prefixing their fieldname # with schema.__identifier__ and then a dot as a separator # See autoform.txt in the autoform package if '.' in field: schemaname, fieldname = field.split('.') for schema in self.additionalSchemata: if schemaname == schema.__identifier__ and fieldname in schema: if ILanguageIndependentField.providedBy(\ schema[fieldname]): self.widgets[field].addClass('languageindependent') self.babel_content = super(MultilingualEditForm, self).render() return self.babel()
def copy_fields(self, translation): fti = getUtility(IDexterityFTI, name=self.context.portal_type) schemas = [] schemas.append(fti.lookupSchema()) for behavior_schema in \ utils.getAdditionalSchemata(self.context, self.context.portal_type): if behavior_schema is not None: schemas.append(behavior_schema) for schema in schemas: for field_name in schema: if ILanguageIndependentField.providedBy(schema[field_name]): value = getattr(self.context, field_name) setattr(translation, field_name, value)
def has_independent_fields(self): fti = getUtility(IDexterityFTI, name=self.context.portal_type) schemas = [] schemas.append(fti.lookupSchema()) for behavior_schema in \ utils.getAdditionalSchemata(self.context, self.context.portal_type): if behavior_schema is not None: schemas.append(behavior_schema) for schema in schemas: for field_name in schema: if ILanguageIndependentField.providedBy(schema[field_name]): return True return False
def get_translatable_fields(self): field_info = [] fti = getUtility(IDexterityFTI, name=self.context.portal_type) schemas = [] schemas.append(fti.lookupSchema()) for behavior_schema in dexterityutils.getAdditionalSchemata( self.context, self.context.portal_type): if behavior_schema is not None: schemas.append(behavior_schema) for schema in schemas: for field_name in schema: field = schema[field_name] if not ILanguageIndependentField.providedBy(field) \ and field_name != 'language': title = field.title # If the field's title is a translatable Message, get # the correct translation for it. Use fallback in case # we have a combined language code such as da-dk if isinstance(title, Message): trans_util = queryUtility( ITranslationDomain, title.domain) if trans_util: trans_util.setLanguageFallbacks(self.fallbacks) title = trans_util.translate( title, self.language) else: title = translate(title, self.language) # Mark required fields if getattr(field, 'required', False): title = "%s (%s) (*)" % (title, field_name) else: title = "%s (%s)" % (title, field_name) field_info.append(( "%s|%s" % (field_name, schema.__identifier__), title, )) return field_info
def write(self, fieldNode, schema, field): if ILanguageIndependentField.providedBy(field): fieldNode.set(ns('independent', self.namespace), "true")
def _setXLIFF(self, data, target_language=''): """ Set the data on one object """ site = getSite() uid_catalog = getToolByName(site, 'uid_catalog') if target_language == '': target_language = data['target-language'].encode('ascii') # nothing to do if there is no target language if not target_language: return try: oid = data['oid'].encode('ascii') results = uid_catalog(UID=oid) if len(results) != 1: #raise ValueError, "Uid catalog should return exactly one #result but returned %s." % len(results) raise KeyError, "Invalid OID %s" % oid source_ob = results[0].getObject() except KeyError: # old style xliff file. Using path #print "Using path to find target object" path = data['original'].encode('utf-8') source_ob = site.restrictedTraverse(path, None) if source_ob is None: raise ValueError( "%s not found, can not add translation." % data['original'].encode('utf-8')) # If the source object is language-neutral, it must receive a language # prior to translation # XXXX What to do if the source_ob HAS a language, but it differs # from the source-language inside the data? if source_ob.Language() == '': # Get the source language from the data source_language = data.get('source-language') # No source language present in the section, use site default if not source_language: langtool = getToolByName(site, 'portal_languages') source_language = langtool.getPreferredLanguage() source_ob.setLanguage(source_language) tm = ITranslationManager(source_ob) if not tm.has_translation(target_language): tm.add_translation(target_language) self.new_translations += 1 target_ob = tm.get_translation(target_language) if IBaseObject.providedBy(target_ob): # We dont want the id to get renamed to match the title target_ob.unmarkCreationFlag() values = {} for unit in data.findAll('trans-unit'): fieldname = unit['id'].encode('utf-8') value = unit.find('target').renderContents('utf-8').strip() # Note: We don't use xliff to remove values, so no value means no # translation and no change to the original # XXX: This doesn't handle values other than strings, this may be # a problem. if not value: continue # convert HTML entities value = safe_unicode(value) value = html_parser.unescape(value) values[fieldname] = value if IDexterityContent.providedBy(target_ob): # Dexterity schema = get_dx_schema(target_ob) for name, field in schema.items(): if ILanguageIndependentField.providedBy(field): # Copy from the original: field.set(target_ob, field.get(source_ob)) pass elif name == 'header_links': value = eval(values[name]) schema[name].set(target_ob, value) elif name in values: value = values[name] if IRichText.providedBy(field): value = RichTextValue(value,'text/html', 'text/x-html-safe') schema[name].set(target_ob, value) ######### set SEO Properties #### for seo_value in values: if seo_value.startswith('qSEO_'): if target_ob.hasProperty(seo_value): target_ob.manage_changeProperties({seo_value: values[seo_value].encode('utf-8')}) else: target_ob.manage_addProperty(seo_value, values[seo_value.encode('utf-8')], 'string') else: # Archetypes target_ob.processForm(data=1, metadata=1, values=values) # Set the correct format if shasattr(source_ob, 'text_format'): target_ob.setFormat(source_ob.text_format) self.total += 1
def _read_languageindependent(self): return ILanguageIndependentField.providedBy(self.field)
def _setXLIFF(self, data, target_language=''): """ Set the data on one object """ site = getSite() uid_catalog = getToolByName(site, 'uid_catalog') if target_language == '': target_language = data['target-language'].encode('ascii') # nothing to do if there is no target language if not target_language: return try: oid = data['oid'].encode('ascii') results = uid_catalog(UID=oid) if len(results) != 1: #raise ValueError, "Uid catalog should return exactly one #result but returned %s." % len(results) raise KeyError, "Invalid OID %s" % oid source_ob = results[0].getObject() except KeyError: # old style xliff file. Using path #print "Using path to find target object" path = data['original'].encode('utf-8') source_ob = site.restrictedTraverse(path, None) if source_ob is None: raise ValueError( "%s not found, can not add translation." % data['original'].encode('utf-8')) # If the source object is language-neutral, it must receive a language # prior to translation # XXXX What to do if the source_ob HAS a language, but it differs # from the source-language inside the data? if source_ob.Language() == '': # Get the source language from the data source_language = data.get('source-language') # No source language present in the section, use site default if not source_language: langtool = getToolByName(site, 'portal_languages') source_language = langtool.getPreferredLanguage() source_ob.setLanguage(source_language) tm = ITranslationManager(source_ob) if not tm.has_translation(target_language): tm.add_translation(target_language) self.new_translations += 1 target_ob = tm.get_translation(target_language) if IBaseObject.providedBy(target_ob): # We dont want the id to get renamed to match the title target_ob.unmarkCreationFlag() values = {} for unit in data.findAll('trans-unit'): fieldname = unit['id'].encode('utf-8') value = unit.find('target').renderContents('utf-8').strip() # Note: We don't use xliff to remove values, so no value means no # translation and no change to the original # XXX: This doesn't handle values other than strings, this may be # a problem. if not value: continue # convert HTML entities value = safe_unicode(value) value = html_parser.unescape(value) values[fieldname] = value if IDexterityContent.providedBy(target_ob): # Dexterity schema = get_dx_schema(target_ob) for name, field in schema.items(): if ILanguageIndependentField.providedBy(field): # Copy from the original: field.set(target_ob, field.get(source_ob)) pass elif name in values: value = values[name] if IRichText.providedBy(field): value = RichTextValue(value) schema[name].set(target_ob, value) else: # Archetypes target_ob.processForm(data=1, metadata=1, values=values) # Set the correct format if shasattr(source_ob, 'text_format'): target_ob.setFormat(source_ob.text_format) self.total += 1