def handle_add_save(self, action, data): """After succesful creation of translation, redirect to the view. """ #url = url.absoluteURL(self.context, self.request) #language = get_language_by_name(data["language"])["name"] session = Session() trusted = removeSecurityProxy(self.context) mapper = sa.orm.object_mapper(trusted) pk = getattr(trusted, mapper.primary_key[0].name) curr_trans_by_name = dict( (ct.field_name, ct) for ct in get_field_translations(self.context, data["language"])) def is_changed(context, field_name, new_field_text): if field_name in curr_trans_by_name: old_field_text = curr_trans_by_name[field_name].field_text else: old_field_text = getattr(context, field_name) return not old_field_text == new_field_text translated_attribute_names = [] for field_name in data.keys(): if field_name == "language": continue if is_changed(self.context, field_name, data[field_name]): translated_attribute_names.append(field_name) if field_name in curr_trans_by_name: translation = curr_trans_by_name[field_name] else: translation = domain.FieldTranslation() translation.object_id = pk translation.object_type = naming.polymorphic_identity( trusted.__class__) translation.field_name = field_name translation.lang = data["language"] session.add(translation) translation.field_text = data[field_name] if translated_attribute_names: session.flush() notify( TranslationCreatedEvent(self.context, data["language"], sorted(translated_attribute_names))) # !+EVENT_DRIVEN_CACHE_INVALIDATION(mr, mar-2011) no translate event # invalidate caches for this domain object type #invalidate_caches_for(trusted.__class__.__name__, "translate") #if not self._next_url: # self._next_url = ( \ # "%s/versions/%s" % (url, stringKey(version)) + \ # "?portal_status_message=Translation added") self._finished_add = True
def handle_add_save(self, action, data): """After succesful creation of translation, redirect to the view. """ #url = url.absoluteURL(self.context, self.request) #language = get_language_by_name(data["language"])["name"] session = Session() trusted = removeSecurityProxy(self.context) mapper = sa.orm.object_mapper(trusted) pk = getattr(trusted, mapper.primary_key[0].name) curr_trans_by_name = dict( (ct.field_name, ct) for ct in get_field_translations(self.context, data["language"]) ) def is_changed(context, field_name, new_field_text): if field_name in curr_trans_by_name: old_field_text = curr_trans_by_name[field_name].field_text else: old_field_text = getattr(context, field_name) return not old_field_text == new_field_text translated_attribute_names = [] for field_name in data.keys(): if field_name == "language": continue if is_changed(self.context, field_name, data[field_name]): translated_attribute_names.append(field_name) if field_name in curr_trans_by_name: translation = curr_trans_by_name[field_name] else: translation = domain.FieldTranslation() translation.object_id = pk translation.object_type = naming.polymorphic_identity(trusted.__class__) translation.field_name = field_name translation.lang = data["language"] session.add(translation) translation.field_text = data[field_name] if translated_attribute_names: session.flush() notify(TranslationCreatedEvent(self.context, data["language"], sorted(translated_attribute_names))) # !+EVENT_DRIVEN_CACHE_INVALIDATION(mr, mar-2011) no translate event # invalidate caches for this domain object type #invalidate_caches_for(trusted.__class__.__name__, "translate") #if not self._next_url: # self._next_url = ( \ # "%s/versions/%s" % (url, stringKey(version)) + \ # "?portal_status_message=Translation added") self._finished_add = True
def translate(self, context, name): """Gets translated field values """ lang = get_default_language() if not lang: return getattr(context, name, "") if interfaces.ITranslatable.providedBy(context): if context.language != lang: translation = get_field_translations(context, lang) if translation: translation = filter(lambda tr:tr.field_name==name, translation) if translation[0].field_text: return translation[0].field_text return getattr(context, name)
def translate(self, context, name): """Gets translated field values """ lang = get_default_language() if not lang: return getattr(context, name, "") if interfaces.ITranslatable.providedBy(context): if context.language != lang: translation = get_field_translations(context, lang) if translation: translation = filter(lambda tr: tr.field_name == name, translation) if translation[0].field_text: return translation[0].field_text return getattr(context, name)
def setUpWidgets(self, ignore_request=False): languages = get_all_languages() self.form_fields = filterFields(self.context, self.form_fields) # do not display empty form fields omit_names = [] for f in self.form_fields: val = getattr(self.context, f.__name__) if val is None: omit_names.append(f.__name__) self.form_fields = self.form_fields.omit(*omit_names) context = self.context if ITranslatable.providedBy(self.context): lang = get_default_language() try: translation = get_field_translations(self.context, lang) except: translation = [] if ( not translation and getattr(self.context, "language", None) and getattr(self.context, "language", None) != lang ): supported_lang = languages.get(lang) if supported_lang: langname = supported_lang.get("native", None) if langname == None: langname = supported_lang.get("name") self.status = translate( _(u"This content is not yet translated into" + " $language", mapping={"language": langname}), domain="bungeni", context=self.request, ) context = copy(removeSecurityProxy(self.context)) for field_translation in translation: setattr(context, field_translation.field_name, field_translation.field_text) self.widgets = form.setUpEditWidgets( self.form_fields, "", context, self.request, adapters=self.adapters, for_display=True, ignore_request=ignore_request, )
def translation_status(self): if ITranslatable.providedBy(self.context) and len(capi.pivot_languages): untranslated = list(capi.pivot_languages) if self.context.language in untranslated: untranslated.remove(self.context.language) for pivot_lang in untranslated: if translation.get_field_translations(self.context, pivot_lang): untranslated.remove(pivot_lang) if len(untranslated): i18n_langs = [] locale = locales.getLocale(get_default_language().split("-")[0], None) for lang in untranslated: if locale and locale.displayNames and locale.displayNames.languages: i18n_langs.append(locale.displayNames.languages.get(lang, lang)) continue i18n_langs.append(lang) return ", ".join(i18n_langs) return translate(_("translated"), context=get_request()) return translate("n/a", context=get_request())
def setUpWidgets(self, ignore_request=False): languages = get_all_languages() self.form_fields = filterFields(self.context, self.form_fields) #do not display empty form fields omit_names = [] for f in self.form_fields: val = getattr(self.context, f.__name__) if val is None: omit_names.append(f.__name__) self.form_fields = self.form_fields.omit(*omit_names) context = self.context if ITranslatable.providedBy(self.context): lang = get_default_language() try: translation = get_field_translations(self.context, lang) except: translation = [] if (not translation and getattr(self.context, "language", None) and getattr(self.context, "language", None) != lang): supported_lang = languages.get(lang) if supported_lang: langname = supported_lang.get("native", None) if langname == None: langname = supported_lang.get("name") self.status = translate( _(u"This content is not yet translated into" +\ " $language", mapping={"language": langname}), domain="bungeni", context=self.request ) context = copy(removeSecurityProxy(self.context)) for field_translation in translation: setattr(context, field_translation.field_name, field_translation.field_text) self.widgets = form.setUpEditWidgets(self.form_fields, "", context, self.request, adapters=self.adapters, for_display=True, ignore_request=ignore_request)
def getMessages(self): """display a message indicating that a doc needs translation to pivot""" messages = [] if capi.pivot_languages: is_translated = False context_lang = self.context.language for lang in capi.pivot_languages: if lang == context_lang: is_translated = True break trans = translation.get_field_translations(self.context, lang) if trans: is_translated = True break if not is_translated: messages.append( {"level": "warning", "header": _("Pivot Translation"), "text": u"This document has no pivot translation."} ) return messages
def translation_status(self): if ITranslatable.providedBy(self.context) and len(capi.pivot_languages): untranslated = list(capi.pivot_languages) if self.context.language in untranslated: untranslated.remove(self.context.language) for pivot_lang in untranslated: if translation.get_field_translations(self.context, pivot_lang): untranslated.remove(pivot_lang) if len(untranslated): i18n_langs = [] locale = locales.getLocale(get_default_language().split("-")[0], None) for lang in untranslated: if (locale and locale.displayNames and locale.displayNames.languages ): i18n_langs.append( locale.displayNames.languages.get(lang, lang)) continue i18n_langs.append(lang) return ", ".join(i18n_langs) return translate(_("translated"), context=get_request()) return translate("n/a", context=get_request())
def setUpWidgets(self, ignore_request=False): self.set_untranslatable_fields_for_display() #get the translation if available language = self.request.get("language") translation = get_field_translations(self.context, language) if translation: self.is_translation = True else: self.is_translation = False context = copy(removeSecurityProxy(self.context)) for field_translation in translation: setattr(context, field_translation.field_name, field_translation.field_text) self.widgets = formlib.form.setUpEditWidgets( self.form_fields, self.prefix, context, self.request, adapters=self.adapters, ignore_request=ignore_request) if language is not None: widget = self.widgets["language"] try: self.language = language widget.vocabulary = CurrentLanguageVocabulary().__call__(self) widget.vocabulary.getTermByToken(language) except LookupError: raise BadRequest("No such language token: '%s'" % language) # if the term exists in the vocabulary, set the value on # the widget widget.setRenderedValue(language) # for translations, add a ``render_original`` method to each # widget, which will render the display widget bound to the # original (HEAD) document # render pivot language as source if there is a translation head = self.context if capi.pivot_languages: for plang in capi.pivot_languages: trans = get_field_translations(head, plang) if trans: head = copy(removeSecurityProxy(head)) for field_translation in trans: setattr(head, field_translation.field_name, field_translation.field_text) break form_fields = ui.setUpFields(self.context.__class__, "view") for widget in self.widgets: form_field = form_fields.get(widget.context.__name__) if form_field is None: form_field = formlib.form.Field(widget.context) # bind field to head document field = form_field.field.bind(head) # create custom widget or instantiate widget using # component lookup if form_field.custom_widget is not None: display_widget = form_field.custom_widget( field, self.request) else: display_widget = component.getMultiAdapter( (field, self.request), IDisplayWidget) display_widget.setRenderedValue(field.get(head)) # attach widget as ``render_original`` widget.render_original = display_widget
def setUpWidgets(self, ignore_request=False): self.set_untranslatable_fields_for_display() #get the translation if available language = self.request.get("language") translation = get_field_translations(self.context, language) if translation: self.is_translation = True else: self.is_translation = False context = copy(removeSecurityProxy(self.context)) for field_translation in translation: setattr(context, field_translation.field_name, field_translation.field_text) self.widgets = formlib.form.setUpEditWidgets( self.form_fields, self.prefix, context, self.request, adapters=self.adapters, ignore_request=ignore_request) if language is not None: widget = self.widgets["language"] try: self.language = language widget.vocabulary = CurrentLanguageVocabulary().__call__(self) widget.vocabulary.getTermByToken(language) except LookupError: raise BadRequest("No such language token: '%s'" % language) # if the term exists in the vocabulary, set the value on # the widget widget.setRenderedValue(language) # for translations, add a ``render_original`` method to each # widget, which will render the display widget bound to the # original (HEAD) document # render pivot language as source if there is a translation head = self.context if capi.pivot_languages: for plang in capi.pivot_languages: trans = get_field_translations(head, plang) if trans: head = copy(removeSecurityProxy(head)) for field_translation in trans: setattr(head, field_translation.field_name, field_translation.field_text) break form_fields = ui.setUpFields(self.context.__class__, "view") for widget in self.widgets: form_field = form_fields.get(widget.context.__name__) if form_field is None: form_field = formlib.form.Field(widget.context) # bind field to head document field = form_field.field.bind(head) # create custom widget or instantiate widget using # component lookup if form_field.custom_widget is not None: display_widget = form_field.custom_widget(field, self.request) else: display_widget = component.getMultiAdapter( (field, self.request), IDisplayWidget) display_widget.setRenderedValue(field.get(head)) # attach widget as ``render_original`` widget.render_original = display_widget