def copy_related_fields(self, obj, target_languages): # XXX: Where is this used? try: fields = schema.getFieldsInOrder(obj.getTypeInfo().lookupSchema()) except AttributeError as e: log.info("Error: %s" % "/".join(obj.getPhysicalPath())) log.exception(e) pcat = api.portal.get_tool("portal_catalog") for key, value in fields: value = value.get(obj) if isinstance(value, list): manager = ITranslationManager(obj) for language in target_languages: translated_obj = manager.get_translation(language) uid_list = [] for uid in value: element = pcat(UID=uid, Language=obj.Language()) if element: manager = ITranslationManager( element[0].getObject()) # noqa element_trans = manager.get_translation(language) if element_trans: uid_list.append(IUUID(element_trans)) if uid_list: setattr(translated_obj, key, uid_list) translated_obj.reindexObject()
def reply(self): # Disable CSRF protection if "IDisableCSRFProtection" in dir(plone.protect.interfaces): alsoProvides(self.request, plone.protect.interfaces.IDisableCSRFProtection) data = json_body(self.request) id_ = data.get("id", None) if id_ is None: self.request.response.setStatus(400) return dict(error=dict(type="BadRequest", message="Missing content id to link to")) target = self.get_object(id_) if target is None: self.request.response.setStatus(400) return dict(error=dict(type="BadRequest", message="Content does not exist")) elif target.portal_type == "LRF": self.request.response.setStatus(400) return dict(error=dict( type="BadRequest", message= "Language Root Folders can only be linked between each other", )) target_language = ILanguage(target).get_language() manager = ITranslationManager(self.context) current_translation = manager.get_translation(target_language) target_manager = ITranslationManager(target) target_translation = target_manager.get_translation( self.context.language) if current_translation is not None: self.request.response.setStatus(400) return dict(error=dict( type="BadRequest", message="Source already translated into language {}".format( target_language), )) if target_translation is not None: self.request.response.setStatus(400) return dict(error=dict( type="BadRequest", message="Target already translated into language {}".format( target_language), )) manager.register_translation(target_language, target) # We want to leave a log in the transaction that the link has been executed ts = transaction.get() ts.note( f'Linked translation {"/".join(self.context.getPhysicalPath())} ({self.context.language}) -> {"/".join(target.getPhysicalPath())} ({target_language})' ) self.request.response.setStatus(201) self.request.response.setHeader("Location", self.context.absolute_url()) return {}
def test_content_is_linked(self): items = self._run_transmogrifier() self.assertEqual(4, len(items)) manager = ITranslationManager(self.folder_en) self.assertEqual(self.folder_de, manager.get_translation('de'), 'English and German content should be linked.') self.assertEqual(2, len(manager.get_translations())) manager = ITranslationManager(self.file_de) self.assertEqual(self.file_en, manager.get_translation('en'), 'English and German content should be linked.') self.assertEqual(2, len(manager.get_translations()))
def handle_modified(self, content): fieldmanager = ILanguageIndependentFieldsManager(content) if not fieldmanager.has_independent_fields(): return sm = getSecurityManager() try: # Do we have permission to sync language independent fields? if self.bypass_security_checks(): # Clone the current user and assign a new editor role to # allow edition of all translated objects even if the # current user whould not have permission to do that. tmp_user = UnrestrictedUser( sm.getUser().getId(), '', ['Editor', ], '') # Wrap the user in the acquisition context of the portal # and finally switch the user to our new editor acl_users = getToolByName(content, 'acl_users') tmp_user = tmp_user.__of__(acl_users) newSecurityManager(None, tmp_user) # Copy over all language independent fields transmanager = ITranslationManager(content) for translation in self.get_all_translations(content): trans_obj = transmanager.get_translation(translation) if fieldmanager.copy_fields(trans_obj): self.reindex_translation(trans_obj) finally: # Restore the old security manager setSecurityManager(sm)
def reply(self): # Disable CSRF protection if "IDisableCSRFProtection" in dir(plone.protect.interfaces): alsoProvides(self.request, plone.protect.interfaces.IDisableCSRFProtection) data = json_body(self.request) id_ = data.get("id", None) if id_ is None: self.request.response.setStatus(400) return dict(error=dict(type="BadRequest", message="Missing content id to link to")) target = self.get_object(id_) if target is None: self.request.response.setStatus(400) return dict(error=dict(type="BadRequest", message="Content does not exist")) target_language = ILanguage(target).get_language() manager = ITranslationManager(self.context) current_translation = manager.get_translation(target_language) if current_translation is not None: self.request.response.setStatus(400) return dict(error=dict( type="BadRequest", message="Already translated into language {}".format( target_language), )) manager.register_translation(target_language, target) self.request.response.setStatus(201) self.request.response.setHeader("Location", self.context.absolute_url()) return {}
def handle_modified(self, content): fieldmanager = ILanguageIndependentFieldsManager(content) if not fieldmanager.has_independent_fields(): return sm = getSecurityManager() try: # Do we have permission to sync language independent fields? if self.bypass_security_checks(): # Clone the current user and assign a new editor role to # allow edition of all translated objects even if the # current user whould not have permission to do that. tmp_user = UnrestrictedUser(sm.getUser().getId(), '', [ 'Editor', ], '') # Wrap the user in the acquisition context of the portal # and finally switch the user to our new editor acl_users = getToolByName(content, 'acl_users') tmp_user = tmp_user.__of__(acl_users) newSecurityManager(None, tmp_user) # Copy over all language independent fields transmanager = ITranslationManager(content) for translation in self.get_all_translations(content): trans_obj = transmanager.get_translation(translation) if fieldmanager.copy_fields(trans_obj): self.reindex_translation(trans_obj) finally: # Restore the old security manager setSecurityManager(sm)
def handle_remove(self, action): data, errors = self.extractData() manager = ITranslationManager(self.context) if not errors: for language in data['languages']: content = manager.get_translation(language) manager.remove_translation(language) aq_parent(content).manage_delObjects([content.getId()]) return self.request.response.redirect( self.context.absolute_url() + '/remove_translations')
def handle_remove(self, action): data, errors = self.extractData() manager = ITranslationManager(self.context) if not errors: for language in data['languages']: content = manager.get_translation(language) manager.remove_translation(language) aq_parent(content).manage_delObjects([content.getId()]) return self.request.response.redirect(self.context.absolute_url() + '/remove_translations')
def test_multilingual_content_is_linked(self): english_content = self.portal.get('en').get('accessibility') self.assertIsNotNone(english_content, 'Missing page /en/accessibility') german_content = self.portal.get('de').get('barrierefreiheit') self.assertIsNotNone(german_content, 'Missing page /de/barrierefreiheit') manager = ITranslationManager(english_content) self.assertEquals(german_content, manager.get_translation('de'), 'English and German content should be linked.')
def createdEvent(obj, event): """ Subscriber to set language on the child folder It can be a - IObjectRemovedEvent - don't do anything - IObjectMovedEvent - IObjectAddedEvent - IObjectCopiedEvent """ if IObjectRemovedEvent.providedBy(event): return request = getattr(event.object, 'REQUEST', getRequest()) if not IPloneAppMultilingualInstalled.providedBy(request): return # On ObjectCopiedEvent and ObjectMovedEvent aq_parent(event.object) is # always equal to event.newParent. parent = aq_parent(event.object) # special parent handling if not ITranslatable.providedBy(parent): set_recursive_language(obj, LANGUAGE_INDEPENDENT) return # Normal use case # We set the tg, linking language = ILanguage(parent).get_language() set_recursive_language(obj, language) request = getattr(event.object, 'REQUEST', getRequest()) try: ti = request.translation_info except AttributeError: return # AT check portal = getSite() portal_factory = getToolByName(portal, 'portal_factory', None) if ( not IDexterityContent.providedBy(obj) and portal_factory is not None and not portal_factory.isTemporary(obj) ): return IMutableTG(obj).set(ti['tg']) modified(obj) tm = ITranslationManager(obj) old_obj = tm.get_translation(ti['source_language']) ILanguageIndependentFieldsManager(old_obj).copy_fields(obj)
def __call__(self, language): """ Look for the closest translated folder or siteroot """ parent = aq_parent(self.context) translated_parent = parent found = False while not (IPloneSiteRoot.providedBy(parent) and not ILanguageRootFolder.providedBy(parent)) and not found: parent_translation = ITranslationManager(parent) if parent_translation.has_translation(language): translated_parent = \ parent_translation.get_translation(language) found = True parent = aq_parent(parent) return translated_parent
def createdEvent(obj, event): """ Subscriber to set language on the child folder It can be a - IObjectRemovedEvent - don't do anything - IObjectMovedEvent - IObjectAddedEvent - IObjectCopiedEvent """ if IObjectRemovedEvent.providedBy(event): return request = getattr(event.object, 'REQUEST', getRequest()) if not IPloneAppMultilingualInstalled.providedBy(request): return # On ObjectCopiedEvent and ObjectMovedEvent aq_parent(event.object) is # always equal to event.newParent. parent = aq_parent(event.object) # special parent handling if not ITranslatable.providedBy(parent): set_recursive_language(obj, LANGUAGE_INDEPENDENT) return # Normal use case # We set the tg, linking language = ILanguage(parent).get_language() set_recursive_language(obj, language) request = getattr(event.object, 'REQUEST', getRequest()) try: ti = request.translation_info except AttributeError: return # AT check portal = getSite() portal_factory = getToolByName(portal, 'portal_factory', None) if (not IDexterityContent.providedBy(obj) and portal_factory is not None and not portal_factory.isTemporary(obj)): return IMutableTG(obj).set(ti['tg']) modified(obj) tm = ITranslationManager(obj) old_obj = tm.get_translation(ti['source_language']) ILanguageIndependentFieldsManager(old_obj).copy_fields(obj)
def __call__(self, language): """ Look for the closest translated folder or siteroot """ parent = aq_parent(self.context) translated_parent = parent found = False while not (IPloneSiteRoot.providedBy(parent) and not ILanguageRootFolder.providedBy(parent))\ and not found: parent_translation = ITranslationManager(parent) if parent_translation.has_translation(language): translated_parent =\ parent_translation.get_translation(language) found = True parent = aq_parent(parent) return translated_parent
def create_translation(self, *args, **kwargs): """Create translation for an object with uid in the given target_language and return its UID Usage:: Create translation /plone/en/foo ca title=Translated """ disableCSRFProtection() # Parse arguments: uid_or_path = args[0] target_language = args[1] # BBB: Support keywords arguments with robotframework < 2.8.3 kwargs.update(dict([arg.split('=', 1) for arg in args[2:]])) # Look up translatable content pc = getToolByName(self, "portal_catalog") uid_results = pc.unrestrictedSearchResults(UID=uid_or_path) path_results = pc.unrestrictedSearchResults( path={ 'query': uid_or_path.rstrip('/'), 'depth': 0 }) obj = (uid_results or path_results)[0]._unrestrictedGetObject() # Translate manager = ITranslationManager(obj) manager.add_translation(target_language) translation = manager.get_translation(target_language) # Update fields data = constructMessageFromSchemata(obj, iterSchemata(obj)) for key, value in kwargs.items(): del data[key] data[key] = Header(value, 'utf-8') del data['language'] initializeObjectFromSchemata(translation, iterSchemata(obj), data) notify(ObjectModifiedEvent(translation)) # Return uid for the translation return IUUID(translation)
def __call__(self): if (self.request.method != 'POST' and not ('field' in self.request.form.keys() and 'lang_source' in self.request.form.keys())): return _("Need a field") else: manager = ITranslationManager(self.context) registry = getUtility(IRegistry) settings = registry.forInterface(IMultiLanguageExtraOptionsSchema) lang_target = ILanguage(self.context).get_language() lang_source = self.request.form['lang_source'] orig_object = manager.get_translation(lang_source) field = self.request.form['field'].split('.')[-1] if hasattr(orig_object, field): question = getattr(orig_object, field, '') if hasattr(question, 'raw'): question = question.raw else: return _("Invalid field") return google_translate(question, settings.google_translation_key, lang_target, lang_source)
def copy_contents_of(self, item, target_languages): if item.portal_type in SKIPPED_PORTAL_TYPES: log.info("Item skipped: {0}".format("/".join( item.getPhysicalPath()))) else: for language in target_languages: manager = ITranslationManager(item) if not manager.has_translation(language): manager.add_translation(language) log.info("Created translation for {}: {}".format( "/".join(item.getPhysicalPath()), language)) import transaction transaction.commit() translated = manager.get_translation(language) self.copy_fields(item, translated) self.copy_seo_properties(item, translated) self.copy_other_properties(item, translated) self.copy_other_things(item, translated) # translated.id = safe_unicode(translated.id).encode('utf-8') translated.reindexObject()
def create_translation(self, *args, **kwargs): """Create translation for an object with uid in the given target_language and return its UID Usage:: Create translation /plone/en/foo ca title=Translated """ disableCSRFProtection() # Parse arguments: uid_or_path = args[0] target_language = args[1] # BBB: Support keywords arguments with robotframework < 2.8.3 kwargs.update(dict([arg.split('=', 1) for arg in args[2:]])) # Look up translatable content pc = getToolByName(self, "portal_catalog") uid_results = pc.unrestrictedSearchResults(UID=uid_or_path) path_results = pc.unrestrictedSearchResults( path={'query': uid_or_path.rstrip('/'), 'depth': 0}) obj = (uid_results or path_results)[0]._unrestrictedGetObject() # Translate manager = ITranslationManager(obj) manager.add_translation(target_language) translation = manager.get_translation(target_language) # Update fields data = constructMessageFromSchemata(obj, iterSchemata(obj)) for key, value in kwargs.items(): del data[key] data[key] = Header(value, 'utf-8') del data['language'] initializeObjectFromSchemata(translation, iterSchemata(obj), data) notify(ObjectModifiedEvent(translation)) # Return uid for the translation return IUUID(translation)
def __call__(self): if (self.request.method != 'POST' and not ('field' in self.request.form.keys() and 'lang_source' in self.request.form.keys())): return _("Need a field") else: manager = ITranslationManager(self.context) registry = getUtility(IRegistry) settings = registry.forInterface(IMultiLanguageExtraOptionsSchema) lang_target = ILanguage(self.context).get_language() lang_source = self.request.form['lang_source'] orig_object = manager.get_translation(lang_source) try: question = orig_object.getField( self.request.form['field']).get(orig_object) except AttributeError: return _("Invalid field") return google_translate( question, settings.google_translation_key, lang_target, lang_source )
def __call__(self): if (self.request.method != 'POST' and not ('field' in self.request.form.keys() and 'lang_source' in self.request.form.keys())): return _("Need a field") else: manager = ITranslationManager(self.context) registry = getUtility(IRegistry) settings = registry.forInterface(IMultiLanguageExtraOptionsSchema, prefix="plone") lang_target = ILanguage(self.context).get_language() lang_source = self.request.form['lang_source'] orig_object = manager.get_translation(lang_source) field = self.request.form['field'].split('.')[-1] if hasattr(orig_object, field): question = getattr(orig_object, field, '') if hasattr(question, 'raw'): question = question.raw else: return _("Invalid field") return google_translate(question, settings.google_translation_key, lang_target, lang_source)
def run(self, resource, *args, **kwds): """Change the rdf resource """ context = self.context # ZZZ: should watch for availability of plone.app.multilingual if has_plone_multilingual: translations = ITranslationManager( context).get_translated_languages() if translations: translations_objs = [ITranslationManager.get_translation(o) for o in translations] resource.eea_hasTranslation = \ [rdflib.URIRef(o.absolute_url()) for o in translations_objs if o.absolute_url() != context.absolute_url()] else: resource.eea_isTranslationOf = \ rdflib.URIRef(context.absolute_url()) else: resource.eea_hasTranslation = ['No Translation'] return
def getClosestDestination(self): """Get the "closest translated object" URL. """ # We should travel the parent chain using the catalog here, # but I think using the acquisition chain is faster # (or well, __parent__ pointers) because the catalog # would require a lot of queries, while technically, # having done traversal up to this point you should # have the objects in memory already # As we don't have any content object we are going to look # for the best option site = getSite() root = getToolByName(site, 'portal_url') ltool = getToolByName(site, 'portal_languages') # We are using TranslationManager to get the translations of a # string tg try: manager = TranslationManager(self.tg) languages = manager.get_translations() except AttributeError: languages = [] if len(languages) == 0: # If there is no results there are no translations # we move to portal root return self.wrapDestination(root(), postpath=False) # We are going to see if there is the preferred language translation # Otherwise we get the first as context to look for translation prefered = ltool.getPreferredLanguage(self.request) if prefered in languages: context = languages[prefered] else: context = languages[list(languages.keys())[0]] checkPermission = getSecurityManager().checkPermission chain = self.getParentChain(context) for item in chain: if ISiteRoot.providedBy(item) \ and not ILanguageRootFolder.providedBy(item): # We do not care to get a permission error # if the whole of the portal cannot be viewed. # Having a permission issue on the root is fine; # not so much for everything else so that is checked there return self.wrapDestination(item.absolute_url()) elif IFactoryTempFolder.providedBy(item) or \ IFactoryTool.providedBy(item): # TempFolder or portal_factory, can't have a translation continue try: canonical = ITranslationManager(item) except TypeError: if not ITranslatable.providedBy(item): # In case there it's not translatable go to parent # This solves the problem when a parent is not # ITranslatable continue else: raise translation = canonical.get_translation(self.lang) if translation and (INavigationRoot.providedBy(translation) or bool(checkPermission('View', translation))): # Not a direct translation, therefore no postpath # (the view might not exist on a different context) return self.wrapDestination(translation.absolute_url(), postpath=False) # Site root's the fallback return self.wrapDestination(root(), postpath=False)
def translate(content, target_language='en'): manager = ITranslationManager(content) manager.add_translation(target_language) return manager.get_translation(target_language)
def __call__(self): context = self.context request = self.request catalog = context.portal_catalog portal = api.portal.get() alsoProvides(request, IDisableCSRFProtection) root_zh = portal.get('zh') if not root_zh: return root_en = portal.get('en') if not root_en: return prog_zh = root_zh.get('programs') if not prog_zh: return prog_en = root_en.get('programs') if not prog_en: return container_zh = prog_zh.get('recipients') if not container_zh: return container_en = prog_en.get('recipients') if not container_en: return with open('grant-list.csv', "rb") as file: rows = csv.reader(file, delimiter='\t') next(rows, None) for row in rows: folder_zh = container_zh.get(str(row[1])) if not folder_zh: fldr = api.content.create( type='Folder', container=container_zh, id=row[1], title=row[1] ) fldr.reindexObject() if row[2] == '': row[2] = row[3] if row[4] == '': row[4] = row[5] if row[3] == '': row[3] = row[2] if row[5] == '': row[5] = row[4] ctnt = api.content.create( type='Grant', container=container_zh.get(str(row[1])), id=row[0], title=safe_unicode(row[2]), year=row[1], director=row[4], description=row[6], department=row[7], region=row[8], category=row[9], budget=row[10], currency=row[11], status=row[12] ) manager = ITranslationManager(ctnt) manager.add_translation('en') trns = manager.get_translation('en') trns.id = str(row[0]) trns.title = row[3] trns.year = row[1] trns.director = row[5] trns.description = row[6] trns.department = row[7] trns.region = row[8] trns.category = row[9] trns.budget = row[10] trns.currency = row[11] trns.status = row[13] ctnt.reindexObject() trns.reindexObject()
def get_translation(self, language): manager = ITranslationManager(self.context) return manager.get_translation(language)
def makeTranslation(content, language="en"): manager = ITranslationManager(content) manager.add_translation(language) return manager.get_translation(language)
def getClosestDestination(self): """Get the "closest translated object" URL. """ # We should travel the parent chain using the catalog here, # but I think using the acquisition chain is faster # (or well, __parent__ pointers) because the catalog # would require a lot of queries, while technically, # having done traversal up to this point you should # have the objects in memory already # As we don't have any content object we are going to look # for the best option site = getSite() root = getToolByName(site, 'portal_url') ltool = getToolByName(site, 'portal_languages') # We are using TranslationManager to get the translations of a # string tg manager = TranslationManager(self.tg) context = None languages = manager.get_translations() if len(languages) == 0: # If there is no results there are no translations # we move to portal root return self.wrapDestination(root(), postpath=False) # We are going to see if there is the preferred language translation # Otherwise we get the first as context to look for translation prefered = ltool.getPreferredLanguage(self.request) if prefered in languages: context = languages[prefered] else: context = languages[languages.keys()[0]] checkPermission = getSecurityManager().checkPermission chain = self.getParentChain(context) for item in chain: if ISiteRoot.providedBy(item) \ and not ILanguageRootFolder.providedBy(item): # We do not care to get a permission error # if the whole of the portal cannot be viewed. # Having a permission issue on the root is fine; # not so much for everything else so that is checked there return self.wrapDestination(item.absolute_url()) elif IFactoryTempFolder.providedBy(item) or \ IFactoryTool.providedBy(item): # TempFolder or portal_factory, can't have a translation continue try: canonical = ITranslationManager(item) except TypeError: if not ITranslatable.providedBy(item): # In case there it's not translatable go to parent # This solves the problem when a parent is not # ITranslatable continue else: raise translation = canonical.get_translation(self.lang) if translation and ( INavigationRoot.providedBy(translation) or bool(checkPermission('View', translation)) ): # Not a direct translation, therefore no postpath # (the view might not exist on a different context) return self.wrapDestination(translation.absolute_url(), postpath=False) # Site root's the fallback return self.wrapDestination(root(), postpath=False)
def makeTranslation(content, language='en'): manager = ITranslationManager(content) manager.add_translation(language) import transaction; transaction.commit() return manager.get_translation(language)
def makeTranslation(content, language='en'): manager = ITranslationManager(content) manager.add_translation(language) return manager.get_translation(language)