def createdEvent(obj, event): """ It can be a IObjectRemovedEvent - don't do anything IObjectMovedEvent IObjectAddedEvent IObjectCopiedEvent """ if IObjectRemovedEvent.providedBy(event): return portal = getSite() language_tool = getToolByName(portal, 'portal_languages') # On ObjectCopiedEvent and ObjectMovedEvent aq_parent(event.object) is # always equal to event.newParent. parent = aq_parent(event.object) if (language_tool.startNeutral() and ITranslatable.providedBy(obj)): # We leave this untouched by now. # We don't set languages set_recursive_language(obj, LANGUAGE_INDEPENDENT) elif (IPloneSiteRoot.providedBy(parent) and ITranslatable.providedBy(obj) and ILanguage(obj).get_language() == LANGUAGE_INDEPENDENT): # It's a root folder and we set the default language # ( not independent allowed ) language = language_tool.getPreferredLanguage() set_recursive_language(obj, language) elif ITranslatable.providedBy(parent): # Normal use case # We set the tg, linking language = ILanguage(parent).get_language() set_recursive_language(obj, language) sdm = obj.session_data_manager session = sdm.getSessionData() if 'tg' in session.keys() and \ not portal.portal_factory.isTemporary(obj): IMutableTG(obj).set(session['tg']) old_obj = ITranslationManager(obj).get_translation(session['old_lang']) # Copy ILanguage Independent field on on-the-fly translation cloner = ITranslationCloner(old_obj) cloner(obj) reindex_object(obj) del session['tg']
def createdEvent(obj, event): """ It can be a IObjectRemovedEvent - don't do anything IObjectMovedEvent IObjectAddedEvent IObjectCopiedEvent """ if IObjectRemovedEvent.providedBy(event): return portal = getSite() language_tool = getToolByName(portal, 'portal_languages') # On ObjectCopiedEvent and ObjectMovedEvent aq_parent(event.object) is # always equal to event.newParent. parent = aq_parent(event.object) if (language_tool.startNeutral() and ITranslatable.providedBy(obj)): # We leave this untouched by now. # We don't set languages set_recursive_language(obj, LANGUAGE_INDEPENDENT) elif (IPloneSiteRoot.providedBy(parent) and ITranslatable.providedBy(obj) and ILanguage(obj).get_language() == LANGUAGE_INDEPENDENT): # It's a root folder and we set the default language # ( not independent allowed ) language = language_tool.getPreferredLanguage() set_recursive_language(obj, language) elif ITranslatable.providedBy(parent): # Normal use case # We set the tg, linking language = ILanguage(parent).get_language() set_recursive_language(obj, language) sdm = obj.session_data_manager session = sdm.getSessionData() if 'tg' in session.keys() and \ not portal.portal_factory.isTemporary(obj): IMutableTG(obj).set(session['tg']) old_obj = ITranslationManager(obj).get_translation( session['old_lang']) # Copy ILanguage Independent field on on-the-fly translation cloner = ITranslationCloner(old_obj) cloner(obj) reindex_object(obj) del session['tg']
def set_child_folder_language(obj, parent): portal = getSite() language_tool = getToolByName(portal, 'portal_languages') if (language_tool.startNeutral() and ITranslatable.providedBy(obj)): # We leave this untouched by now. set_recursive_language(obj, LANGUAGE_INDEPENDENT) elif (IPloneSiteRoot.providedBy(parent) and ITranslatable.providedBy(obj) and ILanguage(obj).get_language() == LANGUAGE_INDEPENDENT): pl = getToolByName(portal, "portal_languages") language = pl.getPreferredLanguage() set_recursive_language(obj, language) elif ITranslatable.providedBy(parent): language = ILanguage(parent).get_language() set_recursive_language(obj, language)
def render(self): cat = getToolByName(self.context, 'portal_catalog') query = dict(portal_type='Folder', Language='en') res = cat(query) log.info('Total no. of folders found: {0}'.format(len(res))) links = dict() for r in res: if r.getPath().split('/')[2] != 'en': log.warning( "Found a folder with lang EN not under /en: {0}".format( r.getPath())) continue obj = r.getObject() if not ITranslatable.providedBy(obj): log.warning( 'Found a folder that is not translatable, WTF: {0}'.format( r.getPath())) continue tm = ITranslationManager(obj) log.info('Handling folder {0}.'.format('/'.join( obj.getPhysicalPath()))) for lang, trans in tm.get_translations().items(): if lang == 'en': continue # Copy "Exclude from navigation", section images and related sites trans.exclude_from_nav = obj.exclude_from_nav rsl = IRelatedSites(trans).related_sites_links if len(rsl): links['/'.join(trans.getPhysicalPath())] = rsl return json.dumps(links)
def _back_references(source_object, attribute_name, translation=None): catalog = getUtility(ICatalog) intids = getUtility(IIntIds) lang = queryAdapter(source_object, ILanguage).get_language() if translation: lang = queryAdapter(translation, ILanguage).get_language() gsm = getSecurityManager() result = [] for rel in catalog.findRelations({ 'to_id': intids.getId(aq_inner(source_object)), 'from_attribute':attribute_name }): obj = intids.queryObject(rel.from_id) if obj is not None and checkPermission('zope2.View', obj): if ITranslatable.providedBy(obj): trans_manager = ITranslationManager(aq_inner(obj)) try: trans_obj = trans_manager.get_translation(lang) except Unauthorized, e: continue if trans_obj: result.append(trans_obj) continue if gsm.checkPermission('zope2.View', obj): result.append(obj)
def _at_back_references(source_object, relationship, translation=None): lang = queryAdapter(source_object, ILanguage).get_language() if translation: lang = queryAdapter(translation, ILanguage).get_language() refs = IReferenceable(source_object).getBRefs(relationship=relationship) gsm = getSecurityManager() result = [] for obj in refs: if ITranslatable.providedBy(obj): trans_manager = ITranslationManager(aq_inner(obj)) try: trans_obj = trans_manager.get_translation(lang) except Unauthorized: continue if trans_obj: result.append(trans_obj) continue if gsm.checkPermission('zope2.View', obj): result.append(obj) return result
def get_all_events(self, batch=True): # Fall back to default language for local events kw = {} default_lang = api.portal.get_tool( "portal_languages").getDefaultLanguage() if ITranslatable.providedBy(self.context): if default_lang != self.context.Language(): portal = getSite() trans = ITranslationManager(self.context).get_translation( default_lang) root = getNavigationRootObject(trans, portal) kw['path'] = '/'.join(root.getPhysicalPath()) kw['Language'] = [default_lang, ''] start, end = self._start_end sort = 'start' sort_reverse = False if self.mode in ('past', 'all'): sort_reverse = True expand = True local_events = get_events( self.context, start=start, end=end, sort=sort, sort_reverse=sort_reverse, ret_mode=RET_MODE_ACCESSORS, expand=expand, **kw) remote_events = self._remote_events() reverse = self.mode == 'past' all_events = sorted(local_events + remote_events, key=lambda x: x.start, reverse=reverse) if batch: b_start = self.b_start b_size = self.b_size res = Batch(all_events, size=b_size, start=b_start, orphan=self.orphan) else: res = all_events return res
def copy_attributes(self, trans, attrs): res = [] warnings = [] for attr in attrs: field_name, behavior_name = attr.split('|') behavior_interface = None behavior_instance = queryUtility(IBehavior, name=behavior_name) if behavior_instance is not None: behavior_interface = behavior_instance.interface if behavior_interface is not None: value = getattr( behavior_interface(self.context), field_name, _marker) else: value = getattr(self.context, field_name, _marker) if IRelationValue.providedBy(value): obj = value.to_object adapter = queryAdapter(trans, ILanguage) if ITranslatable.providedBy(obj): trans_obj = ITranslationManager(obj)\ .get_translation(adapter.get_language()) if trans_obj: intids = getUtility(IIntIds) value = RelationValue(intids.getId(trans_obj)) if not (value == _marker): # We check if not (value == _marker) because # z3c.relationfield has an __eq__ if behavior_interface is not None: setattr(behavior_interface(trans), field_name, value) else: setattr(trans, field_name, value) res.append( u" > Transferred attribute '%s'" % field_name) return dict(res=res, warnings=warnings)
def render(self): cat = getToolByName(self.context, 'portal_catalog') query = dict(portal_type='Folder', Language='en') res = cat(query) log.info('Total no. of folders found: {0}'.format(len(res))) links = dict() for r in res: if r.getPath().split('/')[2] != 'en': log.warning("Found a folder with lang EN not under /en: {0}".format( r.getPath())) continue obj = r.getObject() if not ITranslatable.providedBy(obj): log.warning('Found a folder that is not translatable, WTF: {0}'.format( r.getPath())) continue tm = ITranslationManager(obj) log.info('Handling folder {0}.'.format('/'.join(obj.getPhysicalPath()))) for lang, trans in tm.get_translations().items(): if lang == 'en': continue # Copy "Exclude from navigation", section images and related sites trans.exclude_from_nav = obj.exclude_from_nav rsl = IRelatedSites(trans).related_sites_links if len(rsl): links['/'.join(trans.getPhysicalPath())] = rsl return json.dumps(links)
def set_recursive_language(obj, language): """ Set the language at this object and recursive """ ILanguage(obj).set_language(language) modified(obj) # XXX: this will create recursion, disabled if IFolderish.providedBy(obj): for item in obj.items(): if ITranslatable.providedBy(item): set_recursive_language(item, language)
def __call__(self, context): self.context = context # return all items in the current folder that are translatable terms = [ SimpleTerm(id, title=u'%s (%s)' % ( unicode(obj.Title(), 'utf-8'), id)) for id, obj in context.objectItems() if ITranslatable.providedBy(obj)] return SimpleVocabulary(terms)
def set_recursive_language(obj, language): """ Set the language at this object and recursive """ if ILanguage(obj).get_language() != language: ILanguage(obj).set_language(language) ITranslationManager(obj).update() reindex_object(obj) if IFolderish.providedBy(obj): for item in obj.items(): if ITranslatable.providedBy(item): set_recursive_language(item, language)
def set_recursive_language(obj, language): """ Set the language at this object and recursive """ ILanguage(obj).set_language(language) # XXX: this will create recursion, disabled # modified(obj) # update translations for each object update_on_modify(obj, None) if IFolderish.providedBy(obj): for item in obj.items(): if ITranslatable.providedBy(item): set_recursive_language(item, language)
def update(self): sdm = self.context.session_data_manager session = sdm.getSessionData(create=True) if ITranslatable.providedBy(self.context): self.lang = ILanguage(self.context).get_language() else: self.lang = 'NaN' if 'tg' in session.keys(): tg = session['tg'] self.available = True ptool = getToolByName(self.context, 'portal_catalog') query = {'TranslationGroup': tg, 'Language': 'all'} results = ptool.searchResults(query) self.origin = results
def back_references(source_object, attribute_name): """ Return back references from source object on specified attribute_name """ language_tool = getToolByName(source_object, 'portal_languages') default_language = language_tool.getDefaultLanguage() default_rels = [] # if this object is translatable, we should get the back relationship from the # default language of this object if ITranslatable.providedBy(source_object): trans_manager = ITranslationManager(aq_inner(source_object)) default_lang_obj = trans_manager.get_translation(default_language) if default_lang_obj: default_rels = _back_references(default_lang_obj, attribute_name, source_object) return list(set(default_rels + _back_references(source_object, attribute_name)))
def createdEvent(obj, event): portal = getSite() language_tool = getToolByName(portal, 'portal_languages') # On ObjectCopiedEvent and ObjectMovedEvent aq_parent(event.object) is # always equal to event.newParent. parent = aq_parent(event.object) if (language_tool.startNeutral() and ITranslatable.providedBy(obj)): # We leave this untouched by now. # We don't set languages set_recursive_language(obj, LANGUAGE_INDEPENDENT) elif (IPloneSiteRoot.providedBy(parent) and ITranslatable.providedBy(obj) and ILanguage(obj).get_language() == LANGUAGE_INDEPENDENT): # It's a root folder and we set the default language # ( not independent allowed ) language = language_tool.getPreferredLanguage() set_recursive_language(obj, language) elif ITranslatable.providedBy(parent): # Normal use case # We set the tg, linking language = ILanguage(parent).get_language() set_recursive_language(obj, language) sdm = obj.session_data_manager session = sdm.getSessionData() if 'tg' in session.keys() and \ not portal.portal_factory.isTemporary(obj): IMutableTG(obj).set(session['tg']) modified(obj) del session['tg']
def at_back_references(source_object, relationship): language_tool = getToolByName(source_object, 'portal_languages') default_language = language_tool.getDefaultLanguage() # if this object is translatable, we should get the back relationship from the # default language of this object default_rels = [] if ITranslatable.providedBy(source_object): trans_manager = ITranslationManager(aq_inner(source_object)) default_lang_obj = trans_manager.get_translation(default_language) if default_lang_obj: default_rels = _at_back_references(default_lang_obj, relationship, source_object) return list(set(default_rels + _at_back_references(source_object, relationship)))
def objectTranslated(ob, event): createdEvent(ob, event) if ITranslatable.providedBy(ob): if ob.language == "en" and ob.portal_type != "Folder": if not hasattr(ob, 'slideshow'): if ITranslationManager(ob).has_translation('nl'): original_ob = ITranslationManager(ob).get_translation('nl') if hasattr(original_ob, 'slideshow'): slideshow = original_ob['slideshow'] ITranslationManager(slideshow).add_translation('en') slideshow_trans = ITranslationManager(slideshow).get_translation('en') slideshow_trans.title = slideshow.title slideshow_trans.portal_workflow.doActionFor(slideshow_trans, "publish", comment="Slideshow published") for sitem in slideshow: if slideshow[sitem].portal_type == "Image": ITranslationManager(slideshow[sitem]).add_translation('en') trans = ITranslationManager(slideshow[sitem]).get_translation('en') trans.image = slideshow[sitem].image addCropToTranslation(slideshow[sitem], trans) ob.reindexObject() ob.reindexObject(idxs=["hasMedia"]) ob.reindexObject(idxs=["leadMedia"]) else: ob.invokeFactory( type_name="Folder", id=u'slideshow', title='slideshow', ) folder = ob['slideshow'] ILanguage(folder).set_language(ob.language) try: folder.portal_workflow.doActionFor(folder, "publish", comment="Slideshow content automatically published") ob.reindexObject() except: pass # TODO - check if NL has slideshow return return
def update(self): self.context = self.get_datacontext(self.context) self.available = True if (self.context and self.context.see_also) \ else False if self.available: user = api.user.get_current() language = api.portal.get_tool( 'portal_languages').getPreferredLanguage() items = list() for relation in self.context.see_also: obj = relation.to_object if ITranslatable.providedBy(obj): obj = ITranslationManager(obj).get_restricted_translation( language) or obj if user.has_permission('View', obj): items.append(obj) self.items = items
def get_all_events(self, batch=True): # Fall back to default language for local events kw = {} default_lang = api.portal.get_tool( "portal_languages").getDefaultLanguage() if ITranslatable.providedBy(self.context): if default_lang != self.context.Language(): portal = getSite() trans = ITranslationManager( self.context).get_translation(default_lang) root = getNavigationRootObject(trans, portal) kw['path'] = '/'.join(root.getPhysicalPath()) kw['Language'] = [default_lang, ''] start, end = self._start_end sort = 'start' sort_reverse = False if self.mode in ('past', 'all'): sort_reverse = True expand = True local_events = get_events(self.context, start=start, end=end, sort=sort, review_state='published', sort_reverse=sort_reverse, ret_mode=RET_MODE_ACCESSORS, expand=expand, **kw) remote_events = self._remote_events() reverse = self.mode == 'past' all_events = sorted(local_events + remote_events, key=lambda x: x.start, reverse=reverse) if batch: b_start = self.b_start b_size = self.b_size res = Batch(all_events, size=b_size, start=b_start, orphan=self.orphan) else: res = all_events return res
def __call__(self): """ Explore the site's content and place it on the right RLF """ context = aq_inner(self.context) pl = getToolByName(context, "portal_languages") pu = getToolByName(context, "portal_url") portal = pu.getPortalObject() supported_langs = pl.getSupportedLanguages() output = [] for path, obj in findObjects(portal): try: lang_adptr = ILanguage(obj) except: info_str = "Found object %s with no language support." % (path) logger.info(info_str) output.append(info_str) continue obj_lang = lang_adptr.get_language() if obj_lang not in supported_langs: info_str = "Found object %s with unsupported language %s." % ( path, obj_lang) logger.info(info_str) output.append(info_str) else: target_folder = ITranslationLocator(obj)(obj_lang) parent = aq_parent(obj) if IPloneSiteRoot.providedBy(parent) \ and ITranslatable.providedBy(obj) \ and not INavigationRoot.providedBy(obj): target_folder = getattr(portal, obj_lang, None) if target_folder != parent: cb_copy_data = parent.manage_cutObjects(obj.getId()) list_ids = target_folder.manage_pasteObjects(cb_copy_data) new_id = list_ids[0]['new_id'] new_object = target_folder[new_id] info_str = "Moved object %s to lang folder %s" % ( parent.getPhysicalPath(), obj_lang) logger.info(info_str) output.append(new_object.id) return output
def update(self): self.context = self.get_datacontext(self.context) self.available = True if (self.context and self.context.see_also) \ else False if self.available: user = api.user.get_current() language = api.portal.get_tool( 'portal_languages').getPreferredLanguage() items = list() for relation in self.context.see_also: if relation.isBroken(): continue obj = relation.to_object if ITranslatable.providedBy(obj): obj = ITranslationManager(obj).get_restricted_translation( language) or obj if user.has_permission('View', obj): items.append(obj) self.items = items
def _translations(self, missing): # Figure out the "closest" translation in the parent chain of the # context. We stop at both an INavigationRoot or an ISiteRoot to look # for translations. We do want to find something that is definitely # in the language the user asked for. context = aq_inner(self.context) translations = {} chain = aq_chain(context) first_pass = True _checkPermission = getSecurityManager().checkPermission for item in chain: if ISiteRoot.providedBy(item): # We have a site root, which works as a fallback has_view_permission = bool(_checkPermission('View', item)) for c in missing: translations[c] = (item, first_pass, has_view_permission) break 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): raise TypeError('The object "%s", of type "%s" available in %s is not translatable, but needs to be translatable' % \ (item, item.portal_type, item.absolute_url())) else: raise item_trans = canonical.get_translations() for code, trans in item_trans.items(): code = str(code) if code not in translations: # make a link to a translation only if the user # has view permission has_view_permission = bool(_checkPermission('View', trans)) if (not INavigationRoot.providedBy(item) and not has_view_permission): continue # If we don't yet have a translation for this language # add it and mark it as found translations[code] = (trans, first_pass, has_view_permission) missing = missing - set((code, )) if len(missing) <= 0: # We have translations for all break if INavigationRoot.providedBy(item): # Don't break out of the navigation root jail has_view_permission = bool(_checkPermission('View', item)) for c in missing: translations[c] = (item, False, has_view_permission) break first_pass = False # return a dict of language code to tuple. the first tuple element is # the translated object, the second argument indicates wether the # translation is a direct translation of the context or something from # higher up the translation chain return translations
def get_len_translations(self): if not ITranslatable.providedBy(self.context): return 0 tm = ITranslationManager(self.context) return len(tm.get_translations())
def render(self): cat = getToolByName(self.context, 'portal_catalog') query = dict(portal_type='Folder', Language='en') res = cat(query) log.info('Total no. of folders found: {0}'.format(len(res))) for r in res: if r.getPath().split('/')[2] != 'en': log.warning("Found a folder with lang EN not under /en: {0}".format( r.getPath())) continue obj = r.getObject() if not ITranslatable.providedBy(obj): log.warning('Found a folder that is not translatable, WTF: {0}'.format( r.getPath())) continue ordering = obj.getOrdering() order = ordering.idsInOrder() tm = ITranslationManager(obj) log.info('Handling folder {0}.'.format('/'.join(obj.getPhysicalPath()))) for lang, trans in tm.get_translations().items(): if lang == 'en': continue # Copy "Exclude from navigation", section images and related sites trans.exclude_from_nav = obj.exclude_from_nav IRelatedSites(trans).related_sites_links = IRelatedSites(obj).related_sites_links ISectionImage(trans).section_image = ISectionImage(obj).section_image # Copy over marker interfaces ifaces_to_add = IMarkerInterfaces(obj).getDirectlyProvidedNames() if len(ifaces_to_add): t_ifaces = IMarkerInterfaces(trans) add = t_ifaces.dottedToInterfaces(ifaces_to_add) t_ifaces.update(add=add, remove=list()) # handle the default page settings prop = 'default_page' propval = aq_base(obj).getProperty(prop, None) if propval: # get translation of default-page, if it exists (since the id might be different!) default_page = getattr(obj, propval, None) t_default_page = default_page and ITranslationManager(default_page).get_translation(lang) if not t_default_page: continue # check if marker interfaces need to be copied dp_ifaces_to_add = IMarkerInterfaces(default_page).getDirectlyProvidedNames() if len(dp_ifaces_to_add): t_dp_ifaces = IMarkerInterfaces(t_default_page) add = t_dp_ifaces.dottedToInterfaces(dp_ifaces_to_add) t_dp_ifaces.update(add=add, remove=list()) if aq_base(trans).hasProperty(prop): trans._delProperty(prop) trans._setProperty(id=prop, value=t_default_page.id, type="string") # now set the correct order t_ordering = trans.getOrdering() t_order = t_ordering.idsInOrder() for i in range(len(order)): if order[i] in t_order: t_ordering.moveObjectToPosition( order[i], i, suppress_events=True) if t_order != t_ordering.idsInOrder(): trans.reindexObject() log.info('Now, fix FOP languages') results = cat(portal_type="osha.hwccontent.focalpoint", Language='all') fopcnt = 0 for res in results: fop = res.getObject() if fop.Language() != '': fop.setLanguage('') fop.reindexObject() fopcnt += 1 log.info('Reset the language on {0} FOPs'.format(fopcnt)) return "ok"
def _get_translations_by_closest(self, supported_langs): """ Return the translations information by figuring out the 'closest' translation in the parent chain of the context. We stop at both an INavigationRoot or an ISiteRoot to look for translations. We do want to find something that is definitely in the language the user asked for regardless anything else. """ context = aq_inner(self.context) missing = set([str(c) for c in supported_langs]) translations = {} chain = aq_chain(context) first_pass = True _checkPermission = getSecurityManager().checkPermission for item in chain: if ISiteRoot.providedBy(item): # We have a site root, which works as a fallback has_view_permission = bool(_checkPermission('View', item)) for c in missing: translations[c] = (item, first_pass, has_view_permission) break 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 item_trans = canonical.get_translations() for code, trans in item_trans.items(): code = str(code) if code not in translations: # make a link to a translation only if the user # has view permission has_view_permission = bool(_checkPermission('View', trans)) if (not INavigationRoot.providedBy(item) and not has_view_permission): continue # If we don't yet have a translation for this language # add it and mark it as found translations[code] = (trans, first_pass, has_view_permission) missing = missing - set((code, )) if len(missing) <= 0: # We have translations for all break if INavigationRoot.providedBy(item): # Don't break out of the navigation root jail has_view_permission = bool(_checkPermission('View', item)) for c in missing: translations[c] = (item, False, has_view_permission) break first_pass = False # return a dict of language code to tuple. the first tuple element is # the translated object, the second argument indicates wether the # translation is a direct translation of the context or something from # higher up the translation chain return translations
def languages(self): context = aq_inner(self.context) registry = getUtility(IRegistry) find_translations_policy = registry.forInterface(IMultiLanguagePolicies).selector_lookup_translations_policy languages_info = super(LanguageSelectorViewlet, self).languages() supported_langs = [v['code'] for v in languages_info] results = [] # If it's neutral language don't do anything if ITranslatable.providedBy(context) and ILanguage(context).get_language() == LANGUAGE_INDEPENDENT: translations = {} elif find_translations_policy == 'closest': translations = self._get_translations_by_closest(supported_langs) else: translations = self._get_translations_by_dialog(supported_langs) # We want to preserve the current template / view as used for the # current object and also use it for the other languages append_path = self._findpath(context.getPhysicalPath(), self.request.get('PATH_INFO', '')) formvariables = self._formvariables(self.request.form) _checkPermission = getSecurityManager().checkPermission non_viewable = set() for lang_info in languages_info: # Avoid to modify the original language dict data = lang_info.copy() code = str(data['code']) data['translated'] = code in translations.keys() set_language = '?set_language=%s' % code try: appendtourl = '/'.join(append_path) if self.set_language: appendtourl += '?' + make_query(formvariables, dict(set_language=code)) elif formvariables: appendtourl += '?' + make_query(formvariables) except UnicodeError: appendtourl = '/'.join(append_path) if self.set_language: appendtourl += set_language if data['translated']: trans, direct, has_view_permission = translations[code] if not has_view_permission: # shortcut if the user cannot see the item non_viewable.add((data['code'])) continue state = getMultiAdapter((trans, self.request), name='plone_context_state') if direct: try: data['url'] = state.canonical_object_url() + \ appendtourl except AttributeError: data['url'] = context.absolute_url() + appendtourl else: try: data['url'] = state.canonical_object_url() + \ set_language except AttributeError: data['url'] = context.absolute_url() + set_language else: has_view_permission = bool(_checkPermission('View', context)) # Ideally, we should also check the View permission of default # items of folderish objects. # However, this would be expensive at it would mean that the # default item should be loaded as well. # # IOW, it is a conscious decision to not take in account the # use case where a user has View permission a folder but not on # its default item. if not has_view_permission: non_viewable.add((data['code'])) continue state = getMultiAdapter((context, self.request), name='plone_context_state') if find_translations_policy == 'closest': try: data['url'] = state.canonical_object_url() + appendtourl except AttributeError: data['url'] = context.absolute_url() + appendtourl else: try: data['url'] = state.canonical_object_url() + NOT_TRANSLATED_YET_TEMPLATE + '?' + make_query(dict(set_language=code)) except AttributeError: data['url'] = context.absolute_url() + NOT_TRANSLATED_YET_TEMPLATE + appendtourl results.append(data) # filter out non-viewable items results = [r for r in results if r['code'] not in non_viewable] return results
def render(self): cat = getToolByName(self.context, 'portal_catalog') query = dict(portal_type='Folder', Language='en') res = cat(query) log.info('Total no. of folders found: {0}'.format(len(res))) for r in res: if r.getPath().split('/')[2] != 'en': log.warning( "Found a folder with lang EN not under /en: {0}".format( r.getPath())) continue obj = r.getObject() if not ITranslatable.providedBy(obj): log.warning( 'Found a folder that is not translatable, WTF: {0}'.format( r.getPath())) continue ordering = obj.getOrdering() order = ordering.idsInOrder() tm = ITranslationManager(obj) log.info('Handling folder {0}.'.format('/'.join( obj.getPhysicalPath()))) for lang, trans in tm.get_translations().items(): if lang == 'en': continue # Copy "Exclude from navigation", section images and related sites trans.exclude_from_nav = obj.exclude_from_nav IRelatedSites(trans).related_sites_links = IRelatedSites( obj).related_sites_links ISectionImage(trans).section_image = ISectionImage( obj).section_image # Copy over marker interfaces ifaces_to_add = IMarkerInterfaces( obj).getDirectlyProvidedNames() if len(ifaces_to_add): t_ifaces = IMarkerInterfaces(trans) add = t_ifaces.dottedToInterfaces(ifaces_to_add) t_ifaces.update(add=add, remove=list()) # handle the default page settings prop = 'default_page' propval = aq_base(obj).getProperty(prop, None) if propval: # get translation of default-page, if it exists (since the id might be different!) default_page = getattr(obj, propval, None) t_default_page = default_page and ITranslationManager( default_page).get_translation(lang) if not t_default_page: continue # check if marker interfaces need to be copied dp_ifaces_to_add = IMarkerInterfaces( default_page).getDirectlyProvidedNames() if len(dp_ifaces_to_add): t_dp_ifaces = IMarkerInterfaces(t_default_page) add = t_dp_ifaces.dottedToInterfaces(dp_ifaces_to_add) t_dp_ifaces.update(add=add, remove=list()) if aq_base(trans).hasProperty(prop): trans._delProperty(prop) trans._setProperty(id=prop, value=t_default_page.id, type="string") # now set the correct order t_ordering = trans.getOrdering() t_order = t_ordering.idsInOrder() for i in range(len(order)): if order[i] in t_order: t_ordering.moveObjectToPosition(order[i], i, suppress_events=True) if t_order != t_ordering.idsInOrder(): trans.reindexObject() log.info('Now, fix FOP languages') results = cat(portal_type="osha.hwccontent.focalpoint", Language='all') fopcnt = 0 for res in results: fop = res.getObject() if fop.Language() != '': fop.setLanguage('') fop.reindexObject() fopcnt += 1 log.info('Reset the language on {0} FOPs'.format(fopcnt)) return "ok"
def export(self): if self.export_shoppinglist is True: objects = self._getObjectsFromShoppinglist() elif self.recursive is True: objects = self._getObjectsByPath() else: objects = [self.context] if self.html_compatibility: HEAD = HTML_HEAD else: HEAD = XLIFF_HEAD xliff_pages = [] for ob in objects: # Make extra sure the object is translatable. The multilingual # behavior for this type might have been deactivated without reindexing # all instances of this type. if not ITranslatable.providedBy(ob): continue xob = IXLIFF(ob) xliff_pages.append(( "/".join(ob.getPhysicalPath()), xob.render(self.html_compatibility, self.source_language),)) if self.zip is True: Z = StringIO() zf = zipfile.ZipFile(Z, 'w') if self.single_file is True: # single file as zip if len(xliff_pages) == 1: zf.writestr( xliff_pages[0][0], HEAD % dict(content=xliff_pages[0][1])) else: data = [x[1] for x in xliff_pages] zf.writestr( 'export.xliff', HEAD % dict(content="\n".join(data))) # multiple files as zip else: for page in xliff_pages: zf.writestr(page[0], HEAD % dict(content=page[1])) zf.close() Z.seek(0) content = Z.read() Z.close() else: # files as plain, so we need to join them to single_file. # one or more files to be returned directly, so we don't need # the filenames content = [x[1] for x in xliff_pages] content = "\n".join(content) content = HEAD % dict(content=content) # Set that as it has been selected implicitly by specifying # multiple files but not selecting zip self.single_file = True return content
def getClosestDestination(self): """Get the "closest translated object" URL. """ # We sould 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 root = getToolByName(self.context, 'portal_url') ltool = getToolByName(self.context, 'portal_languages') # We are useing 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 prefered language translation # Otherwise we get the first as context to look for translation prefered = ltool.getPreferredLanguage() 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): # 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 is_translatable(self): """ Helper method used on the linguatools object tab to see if it should render """ context = aq_inner(self.context) return ITranslatable.providedBy(context)
def cut_and_paste(ob, *args, **kw): """ Uses OFS to cut and paste an object. """ err = list() if not kw['target_path']: err.append('You must specify a target path') id = kw['id_to_move'] if not id: err.append(u'You must select an object to move') id = safe_unicode(id) if len(err): return err lang = kw['lang'] target_base = kw['target_base'] if target_base is None: err.append( u'No object was found at the given taget path %s' % kw['target_path']) return err if ITranslatable.providedBy(target_base): target_manager = ITranslationManager(target_base) target = target_manager.get_translation(lang) else: err.append( u'The target object is not translatable. Please ' 'choose a different target that is translatable.') return err if target is None: err.append( u'No translation in language "%s" was found of ' 'the target %s' % (lang, kw['target_path'])) return err if not IBaseFolder.providedBy(target): err.append( u'The target object is not folderish - pasting is ' 'not possible.') return err name = None if id in ob.objectIds(): name = id trans_object = getattr(ob, name) else: # look for translation via get_translation manager = ITranslationManager(kw['target_object']) trans_object = manager.get_translation(lang) if trans_object: if Acquisition.aq_parent(trans_object) == ob: name = trans_object.getId() if name is None: err.append( u'No translation of the requested object for language ' '%s found in %s' % (lang, '/'.join(ob.getPhysicalPath()))) return err if target == trans_object: err.append( u'The target cannot be identical to the object you want to move') return err # we need to pass a string name = safe_unicode(name).encode('utf-8') try: cut = ob.manage_cutObjects(name) except ResourceLockedError: lockable = ILockable(trans_object) lockable.unlock() cut = ob.manage_cutObjects(name) try: target.manage_pasteObjects(cut) except Exception, error: err.append( u'Not possible to paste item in language %s to target %s.' 'Error message: %s' % (lang, target.absolute_url(), error))