def test_content_is_translated_into_all_languages(self): a_ac = createContentInContainer( self.portal['ca'], 'Document', title=u"Test document") api.translate(a_ac, 'en') api.translate(a_ac, 'es') self.assertEqual(len(untranslated_languages(a_ac)), 0)
def test_universal_link_view(self): self.browser.addHeader('Accept-Language', 'ca') a_ca = createContentInContainer( self.portal['ca'], 'Document', title=u"Test document") a_en = api.translate(a_ca, 'en') api.translate(a_ca, 'es') transaction.commit() self.browser.open(a_en.absolute_url()) self.browser.getLink("Universal Link").click() self.assertEqual(self.browser.url, a_ca.absolute_url())
def test_universal_link_view(self): self.browser.addHeader('Accept-Language', 'ca') a_ca = createContentInContainer(self.portal['ca'], 'Document', title=u"Test document") a_en = api.translate(a_ca, 'en') api.translate(a_ca, 'es') transaction.commit() self.browser.open(a_en.absolute_url()) self.browser.getLink("Universal Link").click() self.assertEqual(self.browser.url, a_ca.absolute_url())
def test_relation_list_gets_translated(self): b_ca = api.translate(self.b_en, 'ca') a_ca = api.translate(self.a_en, 'ca') adapted = IRelatedItems(a_ca) bound = IRelatedItems['relatedItems'].bind(adapted) self.assertEqual(len(bound.get(adapted)), 1) value = bound.get(adapted) self.assertEqual(type(value[0]), RelationValue) dm = getMultiAdapter((adapted, IRelatedItems['relatedItems']), IDataManager) self.assertEqual(dm.get(), [b_ca])
def test_alternates(self): # Create a_ca = createContentInContainer( self.portal['ca'], 'Document', title=u"Test document") # Translate a_en = api.translate(a_ca, 'en') # Get the viewlet viewlet = AlternateLanguagesViewlet(a_en, self.request, None, None) viewlet.update() # Get translations translations = ITranslationManager(a_ca).get_translations() # Check translations self.assertEqual(len(viewlet.alternates), 2) for item in viewlet.alternates: self.assertIn(item['lang'], translations) self.assertEqual( "{0}/{1}/{2}".format( self.portal.absolute_url(), item['lang'], item['url']), translations[item['lang']].absolute_url() )
def test_languages_untranslated_by_closest(self): # Define selector policy self.registry = getUtility(IRegistry) self.settings = self.registry.forInterface(IMultiLanguagePolicies) self.settings.selector_lookup_translations_policy = 'closest' wftool = getToolByName(self.portal, "portal_workflow") a_ca = createContentInContainer( self.portal['ca'], 'Document', title=u"Test document") a_ca.setLanguage('ca') wftool.doActionFor(a_ca, 'publish') view = selector_view(a_ca, self.request) view.tg = ITG(a_ca) # Check that the 'original' language gets the created document view.lang = 'ca' url = view.getClosestDestination() self.assertEqual(url, a_ca.absolute_url()) # Check that untranslated languages get the nearest translated parent view.lang = 'es' url = view.getClosestDestination() self.assertEqual(url, self.portal['es'].absolute_url()) view.lang = 'en' url = view.getClosestDestination() self.assertEqual(url, self.portal['en'].absolute_url()) # Check that translating content updates the closest destination a_es = api.translate(a_ca, 'es') view.lang = 'es' url = view.getClosestDestination() self.assertEqual(url, a_es.absolute_url())
def request_translation(self, action): data, errors = self.extractData() if errors: self.status = self.formErrorsMessage return fieldname = data.get("field_to_translate") filepath = self._make_html_document_from_field(fieldname) result = self._translate(filepath, data.get("model"), data.get("tr_mode")) translation = pam.translate(self.context, target_language="en") translation.title = self.context.title translation.description = self.context.description translation.text = self.context.text if result is not None: annotated = IAnnotations(translation) annotated[KEY] = result messages = IStatusMessage(self.request) messages.add(_(u"TGATE translation requested correctly")) return self.request.response.redirect(translation.absolute_url()) else: messages = IStatusMessage(self.request) messages.add(_(u"Error when requesting translations"), "error") return self.request.response.redirect(self.context.absolute_url())
def test_modify_translations_delete(self): createContentInContainer( self.portal['ca'], 'Folder', title=u"Test folder") a_ca = createContentInContainer( self.portal['ca']['test-folder'], 'Document', title=u"Test document") a_en = api.translate(a_ca, 'en') view = a_en.restrictedTraverse('modify_translations')() self.assertIn( 'href="http://nohost/plone/ca/test-folder/test-document/delete_confirmation" ' # noqa§ 'title="Delete translated item"', view, 'modify_translations was missing delete link for translation' ) # Test https://github.com/plone/plone.app.multilingual/pull/283 self.assertNotIn( 'href="http://nohost/plone/en/test-document/delete_confirmation" ' # noqa§ 'title="Delete translated item"', view, 'modify_translations contained delete link for the context' )
def test_viewlet_render(self): """Validate that the alternate languages viewlet renders correctly.""" try: from plone.app.multilingual.setuphandlers import ( enable_translatable_behavior, ) except ImportError: pass else: enable_translatable_behavior(self.portal) sample_en = self.portal['en']['sample-folder'] sample_de = translate(sample_en, 'de') viewlet_orig = AlternateLanguagesViewlet( sample_de, self.app.REQUEST, None, None, ) viewlet_orig.update() viewlet = CustomAlternateLanguagesViewlet( sample_de, self.app.REQUEST, None, None, ) viewlet.update() self.assertTrue(len(viewlet.alternates), 3)
def add_subscriber(self, context, fields): request = self.request alsoProvides(request, IDisableCSRFProtection) form = EasyFormForm(context, request) form.updateFields() form.updateWidgets() data, errors = form.extractData() period_id = data.get("period") if isinstance(period_id, list): period_id = period_id[0] period = context.aq_parent.get(period_id) title = "{0} {1}".format(data.get("last_name"), data.get("first_name")) subscriber = api.content.create( container=period, type="subscriber", title=title ) self.add_subscriber_in_period(context, period, subscriber, form, data) if not IPloneAppMultilingualInstalled.providedBy(request): return registry = getUtility(IRegistry) langs = list(registry['plone.available_languages']) current_lang = api.portal.get_current_language()[:2] langs.remove(current_lang) for lang in langs: trans = ITranslationManager(period).get_translation(lang) if trans: new_subscriber = api_lng.translate(subscriber, lang) new_subscriber.title = title self.add_subscriber_in_period(context, trans, new_subscriber, form, data)
def test_relation_list_gets_translated(self): b_ca = api.translate(self.b_en, 'ca') a_ca = api.translate(self.a_en, 'ca') adapted = IRelatedItems(a_ca) bound = IRelatedItems['relatedItems'].bind(adapted) self.assertEqual(len(bound.get(adapted)), 1) value = bound.get(adapted) self.assertEqual(type(value[0]), RelationValue) dm = getMultiAdapter( (adapted, IRelatedItems['relatedItems']), IDataManager ) self.assertEqual(dm.get(), [b_ca])
def test_copied_relation_list_gets_translated(self): a_ca = api.translate(self.a_en, 'ca') b_ca = api.translate(self.b_en, 'ca') # But only after self.a_en is modified (this is a feature, not a bug): notify(ObjectModifiedEvent(self.a_en)) adapted = IRelatedItems(a_ca) bound = IRelatedItems['relatedItems'].bind(adapted) self.assertEqual(len(bound.get(adapted)), 1) value = bound.get(adapted) self.assertEqual(type(value[0]), RelationValue) dm = getMultiAdapter((adapted, IRelatedItems['relatedItems']), IDataManager) self.assertEqual(dm.get(), [b_ca])
def setUpFullyTranslatedContent(self): wftool = getToolByName(self.portal, 'portal_workflow') self.setUpPartiallyTranslatedContent() a_ca = api.translate(self.portal['en']['test-folder']['test-document'], 'ca') a_ca.setTitle(u"Test document CA") wftool.doActionFor(a_ca, 'publish') f_es = api.translate(self.portal['en']['test-folder'], 'es') f_es.setTitle(u"Test folder ES") wftool.doActionFor(f_es, 'publish') a_es = api.translate(self.portal['en']['test-folder']['test-document'], 'es') a_es.setTitle(u"Test document ES") wftool.doActionFor(a_es, 'publish') transaction.commit()
def test_copied_relation_list_gets_translated(self): a_ca = api.translate(self.a_en, 'ca') b_ca = api.translate(self.b_en, 'ca') # But only after self.a_en is modified (this is a feature, not a bug): notify(ObjectModifiedEvent(self.a_en)) adapted = IRelatedItems(a_ca) bound = IRelatedItems['relatedItems'].bind(adapted) self.assertEqual(len(bound.get(adapted)), 1) value = bound.get(adapted) self.assertEqual(type(value[0]), RelationValue) dm = getMultiAdapter( (adapted, IRelatedItems['relatedItems']), IDataManager ) self.assertEqual(dm.get(), [b_ca])
def setUpFullyTranslatedContent(self): wftool = getToolByName(self.portal, 'portal_workflow') self.setUpPartiallyTranslatedContent() a_ca = api.translate( self.portal['en']['test-folder']['test-document'], 'ca') a_ca.setTitle(u"Test document CA") wftool.doActionFor(a_ca, 'publish') f_es = api.translate( self.portal['en']['test-folder'], 'es') f_es.setTitle(u"Test folder ES") wftool.doActionFor(f_es, 'publish') a_es = api.translate( self.portal['en']['test-folder']['test-document'], 'es') a_es.setTitle(u"Test document ES") wftool.doActionFor(a_es, 'publish') transaction.commit()
def test_translate(self): # Create a_ca = createContentInContainer( self.portal['ca'], 'Document', title=u"Test document") self.assertEqual(ITranslationManager(a_ca).get_translations(), {'ca': a_ca}) # Translate a_en = api.translate(a_ca, 'en') self.assertEqual(ITranslationManager(a_ca).get_translations(), {'ca': a_ca, 'en': a_en})
def test_relation_list_gets_cleared(self): a_ca = api.translate(self.a_en, 'ca') adapted = IRelatedItems(self.a_en) dm = getMultiAdapter((adapted, IRelatedItems['relatedItems']), IDataManager) dm.set([]) notify(ObjectModifiedEvent(self.a_en)) adapted = IRelatedItems(a_ca) dm = getMultiAdapter((adapted, IRelatedItems['relatedItems']), IDataManager) self.assertEqual(dm.get(), [])
def test_get_translation_group(self): # Create a_ca = createContentInContainer(self.portal['ca'], 'Document', title=u"Test document") a_en = api.translate(a_ca, 'en') # get groups tg_ca = api.get_translation_group(a_en) tg_en = api.get_translation_group(a_en) # check self.assertTrue(tg_ca is not None) self.assertTrue(tg_en is not None) self.assertEqual(tg_en, tg_ca)
def translation_folderish(obj, lang, title): translated_obj = api_lng.translate(obj, lang) translate_title = translate(_(title), target_language=lang) normalizer = getUtility(IIDNormalizer) new_id = normalizer.normalize(translate_title) translated_obj.title = translate_title if translated_obj.id != new_id: api.content.rename(translated_obj, new_id=new_id) try: nav = IExcludeFromNavigation(translated_obj) except: pass if nav: nav.exclude_from_nav = True translated_obj.reindexObject() return translated_obj
def test_get_translation_group(self): # Create a_ca = createContentInContainer( self.portal['ca'], 'Document', title=u"Test document" ) a_en = api.translate(a_ca, 'en') # get groups tg_ca = api.get_translation_group(a_en) tg_en = api.get_translation_group(a_en) # check self.assertTrue(tg_ca is not None) self.assertTrue(tg_en is not None) self.assertEqual(tg_en, tg_ca)
def setUpPartiallyTranslatedContent(self): wftool = getToolByName(self.portal, 'portal_workflow') f_en = createContentInContainer( self.portal['en'], 'Folder', title=u"Test folder") wftool.doActionFor(f_en, 'publish') a_en = createContentInContainer( self.portal['en']['test-folder'], 'Document', title=u"Test document") wftool.doActionFor(a_en, 'publish') f_ca = api.translate(f_en, 'ca') f_ca.setTitle(u"Test folder CA") wftool.doActionFor(f_ca, 'publish') transaction.commit()
def test_translate(self): # Create a_ca = createContentInContainer(self.portal['ca'], 'Document', title=u"Test document") self.assertEqual( api.get_translation_manager(a_ca).get_translations(), {'ca': a_ca}) # Translate a_en = api.translate(a_ca, 'en') # check self.assertEqual( api.get_translation_manager(a_ca).get_translations(), { 'ca': a_ca, 'en': a_en })
def test_relation_list_gets_cleared(self): a_ca = api.translate(self.a_en, 'ca') adapted = IRelatedItems(self.a_en) dm = getMultiAdapter( (adapted, IRelatedItems['relatedItems']), IDataManager ) dm.set([]) notify(ObjectModifiedEvent(self.a_en)) adapted = IRelatedItems(a_ca) dm = getMultiAdapter( (adapted, IRelatedItems['relatedItems']), IDataManager ) self.assertEqual(dm.get(), [])
def test_move_content_existing_translation_inside(self): f_ca = createContentInContainer(self.portal['ca'], 'Folder', title=u"Test folder") a_ca = createContentInContainer(self.portal['ca']['test-folder'], 'Document', title=u"Test document") a_en = api.translate(a_ca, 'en') translations = ITranslationManager(self.portal['en'][a_en.id]) self.assertEqual( translations.get_translations(), { 'ca': self.portal['ca'][f_ca.id][a_ca.id], 'en': self.portal['en'][a_ca.id] }) self.assertIn(a_en.id, self.portal['en'].objectIds()) self.assertEqual(a_en, self.portal['en'][a_en.id]) # Change the content language of the created folder to 'en' multilingualMoveObject(f_ca, 'en') self.assertIn(f_ca.id, self.portal['en'].objectIds()) self.assertEqual(f_ca, self.portal['en'][f_ca.id]) self.assertIn(a_ca.id, self.portal['en'][f_ca.id].objectIds()) self.assertEqual(a_ca, self.portal['en'][f_ca.id][a_ca.id]) adapter = ILanguage(self.portal['en'][f_ca.id]) self.assertEqual(adapter.get_language(), 'en') adapter = ILanguage(self.portal['en'][f_ca.id][a_ca.id]) self.assertEqual(adapter.get_language(), 'en') translations = ITranslationManager(self.portal['en'][f_ca.id][a_ca.id]) self.assertEqual(translations.get_translations(), {'en': self.portal['en'][f_ca.id][a_ca.id]}) translations = ITranslationManager(self.portal['en'][a_en.id]) self.assertEqual(translations.get_translations(), {'en': self.portal['en'][a_en.id]})
def test_move_content_existing_translation_inside(self): f_ca = createContentInContainer( self.portal['ca'], 'Folder', title=u"Test folder") a_ca = createContentInContainer( self.portal['ca']['test-folder'], 'Document', title=u"Test document") a_en = api.translate(a_ca, 'en') translations = ITranslationManager(self.portal['en'][a_en.id]) self.assertEqual(translations.get_translations(), {'ca': self.portal['ca'][f_ca.id][a_ca.id], 'en': self.portal['en'][a_ca.id]}) self.assertIn(a_en.id, self.portal['en'].objectIds()) self.assertEqual(a_en, self.portal['en'][a_en.id]) # Change the content language of the created folder to 'en' multilingualMoveObject(f_ca, 'en') self.assertIn(f_ca.id, self.portal['en'].objectIds()) self.assertEqual(f_ca, self.portal['en'][f_ca.id]) self.assertIn(a_ca.id, self.portal['en'][f_ca.id].objectIds()) self.assertEqual(a_ca, self.portal['en'][f_ca.id][a_ca.id]) adapter = ILanguage(self.portal['en'][f_ca.id]) self.assertEqual(adapter.get_language(), 'en') adapter = ILanguage(self.portal['en'][f_ca.id][a_ca.id]) self.assertEqual(adapter.get_language(), 'en') translations = ITranslationManager(self.portal['en'][f_ca.id][a_ca.id]) self.assertEqual(translations.get_translations(), {'en': self.portal['en'][f_ca.id][a_ca.id]}) translations = ITranslationManager(self.portal['en'][a_en.id]) self.assertEqual(translations.get_translations(), {'en': self.portal['en'][a_en.id]})
def test_modify_translations_delete(self): createContentInContainer(self.portal['ca'], 'Folder', title=u"Test folder") a_ca = createContentInContainer(self.portal['ca']['test-folder'], 'Document', title=u"Test document") a_en = api.translate(a_ca, 'en') view = a_en.restrictedTraverse('modify_translations')() self.assertIn( 'href="http://nohost/plone/ca/test-folder/test-document/delete_confirmation" ' # noqa§ 'title="Delete translated item"', view, 'modify_translations was missing delete link for translation') # Test https://github.com/plone/plone.app.multilingual/pull/283 self.assertNotIn( 'href="http://nohost/plone/en/test-document/delete_confirmation" ' # noqa§ 'title="Delete translated item"', view, 'modify_translations contained delete link for the context')
def assertFullyTranslatedPages(self): a = createContentInContainer( self.portal['en'], 'Document', title=u"Test document") a_ca = api.translate(a, 'ca') a_ca.setTitle(u"Test Document (CA)") a_es = api.translate(a, 'es') a_es.setTitle(u"Test Document (ES)") wftool = getToolByName(self.portal, 'portal_workflow') wftool.doActionFor(a, 'publish') wftool.doActionFor(a_ca, 'publish') wftool.doActionFor(a_es, 'publish') notify(ObjectModifiedEvent(a)) notify(ObjectModifiedEvent(a_ca)) notify(ObjectModifiedEvent(a_es)) selector_viewlet =\ LanguageSelectorViewlet(a, self.request, None, None) selector_viewlet.update() selector_viewlet_languages = selector_viewlet.languages() self.assertEqual(selector_viewlet_languages, [{ 'code': u'en', u'flag': u'/++resource++country-flags/gb.gif', u'name': u'English', u'native': u'English', 'url': SELECTOR_VIEW_TEMPLATE % { 'url': self.portal_url, 'tg': ITG(a), 'lang': 'en', 'query': '?set_language=en' }, 'selected': True, 'translated': True, }, { 'code': u'ca', u'flag': u'/++resource++language-flags/ca.gif', u'name': u'Catalan', u'native': u'Catal\xe0', 'url': SELECTOR_VIEW_TEMPLATE % { 'url': self.portal_url, 'tg': ITG(a), 'lang': 'ca', 'query': '?set_language=ca' }, 'selected': False, 'translated': True, }, { 'code': u'es', u'flag': u'/++resource++country-flags/es.gif', u'name': u'Spanish', u'native': u'Espa\xf1ol', 'url': SELECTOR_VIEW_TEMPLATE % { 'url': self.portal_url, 'tg': ITG(a), 'lang': 'es', 'query': '?set_language=es' }, 'selected': False, 'translated': True, }]) transaction.commit() self.browser.open(selector_viewlet_languages[0]['url']) self.assertEqual(self.browser.url, a.absolute_url() + '?set_language=en') self.assertRegexpMatches(self.browser.contents, r"You\s*are here") self.browser.open(selector_viewlet_languages[1]['url']) self.assertEqual(self.browser.url, a_ca.absolute_url() + '?set_language=ca') self.assertIn(u'lang="ca"'.encode("utf-8"), self.browser.contents) self.browser.open(selector_viewlet_languages[2]['url']) self.assertEqual(self.browser.url, a_es.absolute_url() + '?set_language=es') self.assertIn(u'lang="es"'.encode("utf-8"), self.browser.contents)
def assertFullyTranslatedPages(self): a = createContentInContainer( self.portal['en'], 'Document', title=u"Test document" ) a_ca = api.translate(a, 'ca') a_ca.setTitle(u"Test Document (CA)") a_es = api.translate(a, 'es') a_es.setTitle(u"Test Document (ES)") wftool = getToolByName(self.portal, 'portal_workflow') wftool.doActionFor(a, 'publish') wftool.doActionFor(a_ca, 'publish') wftool.doActionFor(a_es, 'publish') notify(ObjectModifiedEvent(a)) notify(ObjectModifiedEvent(a_ca)) notify(ObjectModifiedEvent(a_es)) selector_viewlet = LanguageSelectorViewlet(a, self.request, None, None) selector_viewlet.update() selector_viewlet_languages = selector_viewlet.languages() self.assertEqual( selector_viewlet_languages, [ { 'code': u'en', u'flag': u'/++resource++country-flags/gb.gif', u'name': u'English', u'native': u'English', 'url': SELECTOR_VIEW_TEMPLATE % { 'url': self.portal_url, 'tg': ITG(a), 'lang': 'en', 'query': '?set_language=en', }, 'selected': True, 'translated': True, }, { 'code': u'ca', u'flag': u'/++resource++language-flags/ca.gif', u'name': u'Catalan', u'native': u'Catal\xe0', 'url': SELECTOR_VIEW_TEMPLATE % { 'url': self.portal_url, 'tg': ITG(a), 'lang': 'ca', 'query': '?set_language=ca', }, 'selected': False, 'translated': True, }, { 'code': u'es', u'flag': u'/++resource++country-flags/es.gif', u'name': u'Spanish', u'native': u'Espa\xf1ol', 'url': SELECTOR_VIEW_TEMPLATE % { 'url': self.portal_url, 'tg': ITG(a), 'lang': 'es', 'query': '?set_language=es', }, 'selected': False, 'translated': True, }, ], ) transaction.commit() self.browser.open(selector_viewlet_languages[0]['url']) self.assertEqual( self.browser.url, a.absolute_url() + '?set_language=en' ) self.assertRegexpMatches(self.browser.contents, r"You\s*are here") self.browser.open(selector_viewlet_languages[1]['url']) self.assertEqual( self.browser.url, a_ca.absolute_url() + '?set_language=ca' ) self.assertIn('lang="ca"', self.browser.contents) self.browser.open(selector_viewlet_languages[2]['url']) self.assertEqual( self.browser.url, a_es.absolute_url() + '?set_language=es' ) self.assertIn('lang="es"', self.browser.contents)