From: Thomas D. <svn...@pl...> - 2012-11-13 16:20:05
|
Repository: Products.LinguaPlone Branch: refs/heads/master Date: 2012-11-13T08:19:47-08:00 Author: Thomas Desvenain (tdesvenain) <tho...@gm...> Commit: https://github.com/plone/Products.LinguaPlone/commit/47011754c16b46607ded33e60b79187a7d0aea4d Merge pull request #10 from erral/multilingual-content-markup Add a viewlet to mark the translated content of the current page, to help search engines crawl the content Files changed: A Products/LinguaPlone/browser/contentlinkviewlet.pt A Products/LinguaPlone/browser/contentlinkviewlet.py A Products/LinguaPlone/tests/test_contentlinkviewlet.py M CHANGES.txt M Products/LinguaPlone/browser/configure.zcml diff --git a/CHANGES.txt b/CHANGES.txt index ca2798a..dbaa26b 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -4,6 +4,10 @@ Changelog 4.1.3 (unreleased) ------------------ +- Add a viewlet to mark the translated content as suggested by Google at + http://googlewebmastercentral.blogspot.com.es/2011/12/new-markup-for-multilingual-content.html + [erral] + - Update bootstrap.py for zc.buildout 1.5.0. [pjstevns] diff --git a/Products/LinguaPlone/browser/configure.zcml b/Products/LinguaPlone/browser/configure.zcml index 38e9631..b2ecb74 100644 --- a/Products/LinguaPlone/browser/configure.zcml +++ b/Products/LinguaPlone/browser/configure.zcml @@ -131,4 +131,13 @@ attribute="getDeletableLanguages" /> + <browser:viewlet + for="Products.LinguaPlone.interfaces.ITranslatable" + name="Products.LinguaPlone.multilingualcontentviewlet" + manager="plone.app.layout.viewlets.interfaces.IHtmlHeadLinks" + class=".contentlinkviewlet.MultilingualContentViewlet" + template="contentlinkviewlet.pt" + permission="zope2.View" + /> + </configure> diff --git a/Products/LinguaPlone/browser/contentlinkviewlet.pt b/Products/LinguaPlone/browser/contentlinkviewlet.pt new file mode 100644 index 0000000..b2b332f --- /dev/null +++ b/Products/LinguaPlone/browser/contentlinkviewlet.pt @@ -0,0 +1,5 @@ +<tal:link repeat="content view/translations"> + <link rel="alternate" + tal:attributes="hreflang content/Language; + href content/absolute_url" /> +</tal:link> \ No newline at end of file diff --git a/Products/LinguaPlone/browser/contentlinkviewlet.py b/Products/LinguaPlone/browser/contentlinkviewlet.py new file mode 100644 index 0000000..a3108eb --- /dev/null +++ b/Products/LinguaPlone/browser/contentlinkviewlet.py @@ -0,0 +1,17 @@ +from Acquisition import aq_inner +from AccessControl.SecurityManagement import getSecurityManager + +from plone.app.layout.viewlets import ViewletBase + +class MultilingualContentViewlet(ViewletBase): + + def update(self): + # We have to check the view permission on the translated object, because + # getTranslations returns all objects, no matter the workflow state + context = aq_inner(self.context) + current = context.Language() + _checkPermission = getSecurityManager().checkPermission + self.translations = [] + for lang, content in context.getTranslations(review_state=False).items(): + if lang != current and _checkPermission('View', content): + self.translations.append(content) \ No newline at end of file diff --git a/Products/LinguaPlone/tests/test_contentlinkviewlet.py b/Products/LinguaPlone/tests/test_contentlinkviewlet.py new file mode 100644 index 0000000..131fb6c --- /dev/null +++ b/Products/LinguaPlone/tests/test_contentlinkviewlet.py @@ -0,0 +1,29 @@ +from zope.interface import directlyProvides + +from Products.LinguaPlone.tests.base import LinguaPloneTestCase +from Products.LinguaPlone.tests.utils import makeContent +from Products.LinguaPlone.tests.utils import makeTranslation +from Products.LinguaPlone.interfaces import ILinguaPloneProductLayer + +from Products.LinguaPlone.browser.contentlinkviewlet import MultilingualContentViewlet + +class TestContentLinkViewlet(LinguaPloneTestCase): + + def afterSetUp(self): + directlyProvides(self.portal.REQUEST, ILinguaPloneProductLayer) + self.addLanguage('de') + self.setLanguage('en') + self.folder.setLanguage('') + self.english = makeContent(self.folder, 'SimpleType', 'doc') + self.english.setLanguage('en') + self.german = makeTranslation(self.english, 'de') + + def testViewletGeneratesTranslationList(self): + viewlet = MultilingualContentViewlet(self.english, self.app.REQUEST, None, None) + viewlet.update() + self.failIf(getattr(viewlet, 'translations', None) is None) + + def testViewletGeneratedLinks(self): + viewlet = MultilingualContentViewlet(self.english, self.app.REQUEST, None, None) + viewlet.update() + self.assertEqual(len(viewlet.translations), 1) |