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')
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)
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)
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 makeTranslation(content, language='en'): manager = ITranslationManager(content) manager.add_translation(language) import transaction transaction.commit() return manager.get_translation(language)
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