def translate_this(
        context, attrs=[], translation_exists=False, target_languages=[]):
    """ Translates the current object into all languages and transfers the
        given attributes
    """
    info = list()
    warnings = list()
    errors = list()

    # if context is language-neutral, it must receive a language before
    # it is translated
    lang_support = ILanguage(context)
    manager = ITranslationManager(context)
    if lang_support.get_language() == '':
        lang_support.set_language(
            context.portal_languages.getPreferredLanguage())
    canLang = lang_support.get_language()

    # if the user didn't select target languages, get all supported languages
    # from the language tool
    if not target_languages:
        portal_languages = getToolByName(context, 'portal_languages')
        target_languages = portal_languages.getSupportedLanguages()
    content_helper = IContentHelper(context)
    for lang in target_languages:
        if lang == canLang:
            continue
        res = list()
        if not manager.get_translation(lang):
            if not translation_exists:
                # need to make lang a string. It can be unicode so checkid will
                # freak out and lead to an infinite recursion
                manager.add_translation(str(lang))
                res.append("Added Translation for %s" % lang)
                # For a new translation, make sure the title is copied as well
                attrs = content_helper.check_for_title_attr(attrs)
            else:
                warnings.append(
                    u'Translation in language %s does not exist, '
                    'skipping' % lang)
                continue
        else:
            if not translation_exists:
                warnings.append(
                    u'Translation for language %s already '
                    'exists, skipping' % lang)
                continue
            res.append(u"Found translation for %s " % lang)
        trans = manager.get_translation(lang)
        content_results = content_helper.copy_attributes(trans, attrs)
        res.extend(content_results['res'])
        warnings.extend(content_results['warnings'])
        info.append(u"\n".join(res))
    return (info, warnings, errors)
    def handle_create(self, action):
        data, errors = self.extractData()
        if not errors:
            language = data['language']
            translation_manager = ITranslationManager(aq_inner(self.context))
            if ILanguage(self.context).get_language() == LANGUAGE_INDEPENDENT:
                language_tool = getToolByName(self.context, 'portal_languages')
                default_language = language_tool.getDefaultLanguage()
                ILanguage(self.context).set_language(default_language)
                translation_manager.update()
                self.context.reindexObject(idxs='language')

            translation_manager.add_translation(language)
            translated = translation_manager.get_translation(language)
            return self.request.response.redirect(translated.absolute_url() \
                + '/edit')
Exemple #3
0
    def handle_create(self, action):
        data, errors = self.extractData()
        if not errors:
            language = data['language']
            translation_manager = ITranslationManager(aq_inner(self.context))
            if ILanguage(self.context).get_language() == LANGUAGE_INDEPENDENT:
                language_tool = getToolByName(self.context, 'portal_languages')
                default_language = language_tool.getDefaultLanguage()
                ILanguage(self.context).set_language(default_language)
                translation_manager.update()
                self.context.reindexObject(idxs='language')

            translation_manager.add_translation(language)
            translated = translation_manager.get_translation(language)
            registry = getUtility(IRegistry)
            settings = registry.forInterface(IMultiLanguageExtraOptionsSchema)
            if settings.redirect_babel_view:
                return self.request.response.redirect(
                    translated.absolute_url() + '/babel_edit')
            else:
                return self.request.response.redirect(
                    translated.absolute_url() +
                    '/edit?set_language=%s' % language)
Exemple #4
0
    def handle_create(self, action):
        data, errors = self.extractData()
        if not errors:
            language = data['language']
            translation_manager = ITranslationManager(aq_inner(self.context))
            if ILanguage(self.context).get_language() == LANGUAGE_INDEPENDENT:
                language_tool = getToolByName(self.context, 'portal_languages')
                default_language = language_tool.getDefaultLanguage()
                ILanguage(self.context).set_language(default_language)
                translation_manager.update()
                self.context.reindexObject(idxs='language')

            translation_manager.add_translation(language)
            translated = translation_manager.get_translation(language)
            registry = getUtility(IRegistry)
            settings = registry.forInterface(IMultiLanguageExtraOptionsSchema)
            if settings.redirect_babel_view:
                return self.request.response.redirect(
                    translated.absolute_url() + '/babel_edit?set_language=%s' % language)
            else:
                return self.request.response.redirect(
                    translated.absolute_url() + '/edit?set_language=%s' %
                    language)
def makeTranslation(content, language='en'):
    manager = ITranslationManager(content)
    manager.add_translation(language)
    import transaction; transaction.commit()
    return manager.get_translation(language)
Exemple #6
0
    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
Exemple #7
0
def makeTranslation(content, language='en'):
    manager = ITranslationManager(content)
    manager.add_translation(language)
    import transaction
    transaction.commit()
    return manager.get_translation(language)
Exemple #8
0
    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