Beispiel #1
0
    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()
Beispiel #2
0
    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()))
Beispiel #4
0
    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)
Beispiel #6
0
    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')
Beispiel #9
0
    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)
Beispiel #14
0
 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)
Beispiel #17
0
    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)
Beispiel #19
0
 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
         )
Beispiel #20
0
 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)
Beispiel #21
0
    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
Beispiel #22
0
    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)
Beispiel #23
0
def translate(content, target_language='en'):
    manager = ITranslationManager(content)
    manager.add_translation(target_language)
    return manager.get_translation(target_language)
Beispiel #24
0
    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()
Beispiel #25
0
    def get_translation(self, language):

        manager = ITranslationManager(self.context)
        return manager.get_translation(language)
    def get_translation(self, language):

        manager = ITranslationManager(self.context)
        return manager.get_translation(language)
Beispiel #27
0
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)
Beispiel #29
0
def makeTranslation(content, language='en'):
    manager = ITranslationManager(content)
    manager.add_translation(language)
    import transaction; transaction.commit()
    return manager.get_translation(language)
Beispiel #30
0
def makeTranslation(content, language='en'):
    manager = ITranslationManager(content)
    manager.add_translation(language)
    return manager.get_translation(language)