Merge default dev-dc
authorDamien Correia
Tue, 17 Jul 2018 15:09:38 +0200
branchdev-dc
changeset 857 67e46871cb2a
parent 751 dcc20bece9b6 (current diff)
parent 852 ae0c84d7029f (diff)
child 858 1afd36ed6947
Merge default
src/pyams_content/component/theme/zmi/templates/themes-info.pt
--- a/.hgtags	Mon Jun 25 17:26:50 2018 +0200
+++ b/.hgtags	Tue Jul 17 15:09:38 2018 +0200
@@ -18,3 +18,5 @@
 95026785904d443509d93895ddf761b7967d9d46 0.1.14
 95026785904d443509d93895ddf761b7967d9d46 0.1.14
 1978e4dad1d8f950411807ed2df23fd030a39b60 0.1.14
+fc8fe2dede6309db4a8cfc5b53eb894cca2f6970 0.1.15
+9cc7207c1399658ef821a1ecdde86df0b5a1298d 0.1.15.1
--- a/buildout.cfg	Mon Jun 25 17:26:50 2018 +0200
+++ b/buildout.cfg	Tue Jul 17 15:09:38 2018 +0200
@@ -86,4 +86,4 @@
 eggs = pyams_content [test]
 
 [versions]
-pyams_content = 0.1.15
+pyams_content = 0.1.16
--- a/docs/HISTORY.txt	Mon Jun 25 17:26:50 2018 +0200
+++ b/docs/HISTORY.txt	Tue Jul 17 15:09:38 2018 +0200
@@ -1,12 +1,19 @@
 History
 =======
 
+0.1.15.1
+--------
+ - added request argument when rendering pictogram image
+
 0.1.15
 ------
- - added "basic" illustration component
+ - added "basic" and "navigation" illustration components
  - added pictogram selection widget
  - added optional pictogram to links
  - added generic menu feature
+ - added key numbers portlet
+ - added site container "rename" view to change object URL
+ - include quick search results table in main dashboard view
 
 0.1.14
 ------
--- a/setup.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/setup.py	Tue Jul 17 15:09:38 2018 +0200
@@ -22,7 +22,7 @@
 README = os.path.join(DOCS, 'README.txt')
 HISTORY = os.path.join(DOCS, 'HISTORY.txt')
 
-version = '0.1.15'
+version = '0.1.16'
 long_description = open(README).read() + '\n\n' + open(HISTORY).read()
 
 tests_require = []
--- a/src/pyams_content.egg-info/PKG-INFO	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content.egg-info/PKG-INFO	Tue Jul 17 15:09:38 2018 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: pyams-content
-Version: 0.1.15
+Version: 0.1.15.1
 Summary: PyAMS base content interfaces and classes
 Home-page: http://hg.ztfy.org/pyams/pyams_content
 Author: Thierry Florac
@@ -73,12 +73,19 @@
         History
         =======
         
+        0.1.15.1
+        --------
+         - added request argument when rendering pictogram image
+        
         0.1.15
         ------
-         - added "basic" illustration component
+         - added "basic" and "navigation" illustration components
          - added pictogram selection widget
          - added optional pictogram to links
          - added generic menu feature
+         - added key numbers portlet
+         - added site container "rename" view to change object URL
+         - include quick search results table in main dashboard view
         
         0.1.14
         ------
--- a/src/pyams_content.egg-info/SOURCES.txt	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content.egg-info/SOURCES.txt	Tue Jul 17 15:09:38 2018 +0200
@@ -181,8 +181,11 @@
 src/pyams_content/interfaces/__init__.py
 src/pyams_content/interfaces/container.py
 src/pyams_content/locales/pyams_content.pot
+src/pyams_content/locales/pyams_content.pot.orig
 src/pyams_content/locales/fr/LC_MESSAGES/pyams_content.mo
+src/pyams_content/locales/fr/LC_MESSAGES/pyams_content.mo.orig
 src/pyams_content/locales/fr/LC_MESSAGES/pyams_content.po
+src/pyams_content/locales/fr/LC_MESSAGES/pyams_content.po.orig
 src/pyams_content/profile/__init__.py
 src/pyams_content/profile/admin.py
 src/pyams_content/profile/interfaces/__init__.py
@@ -228,6 +231,9 @@
 src/pyams_content/shared/common/portlet/content/skin/__init__.py
 src/pyams_content/shared/common/portlet/content/zmi/__init__.py
 src/pyams_content/shared/common/portlet/content/zmi/preview.pt
+src/pyams_content/shared/common/skin/__init__.py
+src/pyams_content/shared/common/skin/oid.py
+src/pyams_content/shared/common/skin/url.py
 src/pyams_content/shared/common/zmi/__init__.py
 src/pyams_content/shared/common/zmi/dashboard.py
 src/pyams_content/shared/common/zmi/header.py
@@ -236,6 +242,7 @@
 src/pyams_content/shared/common/zmi/owner.py
 src/pyams_content/shared/common/zmi/portal.py
 src/pyams_content/shared/common/zmi/properties.py
+src/pyams_content/shared/common/zmi/rename.py
 src/pyams_content/shared/common/zmi/search.py
 src/pyams_content/shared/common/zmi/security.py
 src/pyams_content/shared/common/zmi/site.py
--- a/src/pyams_content/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -27,7 +27,7 @@
         CREATE_CONTENT_PERMISSION, MANAGE_CONTENT_PERMISSION, COMMENT_CONTENT_PERMISSION, PUBLISH_CONTENT_PERMISSION
     from pyams_content.interfaces import WEBMASTER_ROLE, PILOT_ROLE, MANAGER_ROLE, OWNER_ROLE, CONTRIBUTOR_ROLE, \
         READER_ROLE, OPERATOR_ROLE, GUEST_ROLE
-    from pyams_security.interfaces import ADMIN_USER_ID
+    from pyams_security.interfaces import ADMIN_USER_ID, SYSTEM_ADMIN_ROLE
     from pyams_thesaurus.interfaces import CREATE_THESAURUS_PERMISSION, ADMIN_THESAURUS_PERMISSION
     from pyams_utils.interfaces import PUBLIC_PERMISSION, VIEW_PERMISSION, MANAGE_PERMISSION, \
         VIEW_SYSTEM_PERMISSION, MANAGE_ROLES_PERMISSION, MANAGE_SKIN_PERMISSION
@@ -48,6 +48,13 @@
     config.register_permission({'id': PUBLISH_CONTENT_PERMISSION,
                                 'title': _("Publish content")})
 
+    # update system administrator permissions
+    config.register_role({'id': SYSTEM_ADMIN_ROLE,
+                          'title': _("System manager (role)"),
+                          'permissions': {CREATE_THESAURUS_PERMISSION, ADMIN_THESAURUS_PERMISSION,
+                                          MANAGE_SITE_ROOT_PERMISSION, MANAGE_SITE_PERMISSION, MANAGE_TOOL_PERMISSION,
+                                          MANAGE_SKIN_PERMISSION}})
+
     # register custom roles
     config.register_role({'id': WEBMASTER_ROLE,
                           'title': _("Webmaster (role)"),
@@ -57,7 +64,9 @@
                                           MANAGE_SITE_ROOT_PERMISSION, MANAGE_SITE_PERMISSION, MANAGE_TOOL_PERMISSION,
                                           CREATE_CONTENT_PERMISSION, MANAGE_CONTENT_PERMISSION, MANAGE_SKIN_PERMISSION,
                                           COMMENT_CONTENT_PERMISSION, PUBLISH_CONTENT_PERMISSION},
-                          'managers': {ADMIN_USER_ID, 'role:system.Manager', 'role:pyams.Webmaster'}})
+                          'managers': {ADMIN_USER_ID,
+                                       'role:{0}'.format(SYSTEM_ADMIN_ROLE),
+                                       'role:{0}'.format(WEBMASTER_ROLE)}})
     config.register_role({'id': PILOT_ROLE,
                           'title': _("Pilot (role)"),
                           'permissions': {PUBLIC_PERMISSION, VIEW_PERMISSION, MANAGE_PERMISSION,
@@ -65,13 +74,17 @@
                                           MANAGE_SITE_PERMISSION, MANAGE_TOOL_PERMISSION,
                                           MANAGE_CONTENT_PERMISSION, COMMENT_CONTENT_PERMISSION,
                                           PUBLISH_CONTENT_PERMISSION},
-                          'managers': {ADMIN_USER_ID, 'role:system.Manager', 'role:pyams.Webmaster'}})
+                          'managers': {ADMIN_USER_ID,
+                                       'role:{0}'.format(SYSTEM_ADMIN_ROLE),
+                                       'role:{0}'.format(WEBMASTER_ROLE)}})
     config.register_role({'id': MANAGER_ROLE,
                           'title': _("Manager (role)"),
                           'permissions': {PUBLIC_PERMISSION, VIEW_PERMISSION, MANAGE_PERMISSION,
                                           VIEW_SYSTEM_PERMISSION, MANAGE_CONTENT_PERMISSION,
                                           COMMENT_CONTENT_PERMISSION, PUBLISH_CONTENT_PERMISSION},
-                          'managers': {ADMIN_USER_ID, 'role:system.Manager', 'role:pyams.Webmaster',
+                          'managers': {ADMIN_USER_ID,
+                                       'role:{0}'.format(SYSTEM_ADMIN_ROLE),
+                                       'role:{0}'.format(WEBMASTER_ROLE),
                                        'role:pyams.Pilot'}})
     config.register_role({'id': OWNER_ROLE,
                           'title': _("Owner (role)"),
@@ -84,20 +97,32 @@
                                           VIEW_SYSTEM_PERMISSION,
                                           CREATE_CONTENT_PERMISSION, MANAGE_CONTENT_PERMISSION,
                                           COMMENT_CONTENT_PERMISSION},
-                          'managers': {ADMIN_USER_ID, 'role:system.Manager', 'role:pyams.Webmaster',
-                                       'role:pyams.Pilot', 'role:pyams.Owner'}})
+                          'managers': {ADMIN_USER_ID,
+                                       'role:{0}'.format(SYSTEM_ADMIN_ROLE),
+                                       'role:{0}'.format(WEBMASTER_ROLE),
+                                       'role:pyams.Pilot',
+                                       'role:pyams.Owner'}})
     config.register_role({'id': READER_ROLE,
                           'title': _("Reader (role)"),
                           'permissions': {PUBLIC_PERMISSION, VIEW_PERMISSION, MANAGE_PERMISSION,
                                           VIEW_SYSTEM_PERMISSION, COMMENT_CONTENT_PERMISSION},
-                          'managers': {ADMIN_USER_ID, 'role:system.Manager', 'role:pyams.Webmaster',
-                                       'role:pyams.Pilot', 'role:pyams.Manager', 'role:pyams.Contributor'}})
+                          'managers': {ADMIN_USER_ID,
+                                       'role:{0}'.format(SYSTEM_ADMIN_ROLE),
+                                       'role:{0}'.format(WEBMASTER_ROLE),
+                                       'role:pyams.Pilot',
+                                       'role:pyams.Manager',
+                                       'role:pyams.Contributor'}})
     config.register_role({'id': OPERATOR_ROLE,
                           'title': _("Operator (role)"),
                           'permissions': {PUBLIC_PERMISSION, VIEW_PERMISSION, VIEW_SYSTEM_PERMISSION},
-                          'managers': {ADMIN_USER_ID, 'role:system.Manager'}})
+                          'managers': {ADMIN_USER_ID,
+                                       'role:{0}'.format(SYSTEM_ADMIN_ROLE)}})
     config.register_role({'id': GUEST_ROLE,
                           'title': _("Guest user (role)"),
                           'permissions': {PUBLIC_PERMISSION, VIEW_PERMISSION},
-                          'managers': {ADMIN_USER_ID, 'role:system.Manager', 'role:pyams.Webmaster',
-                                       'role:pyams.Pilot', 'role:pyams.Manager', 'role:pyams.Contributor'}})
+                          'managers': {ADMIN_USER_ID,
+                                       'role:{0}'.format(SYSTEM_ADMIN_ROLE),
+                                       'role:{0}'.format(WEBMASTER_ROLE),
+                                       'role:pyams.Pilot',
+                                       'role:pyams.Manager',
+                                       'role:pyams.Contributor'}})
--- a/src/pyams_content/component/association/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/association/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -42,6 +42,9 @@
 
     visible = FieldProperty(IAssociationItem['visible'])
 
+    def is_visible(self, request=None):
+        return True
+
     def get_url(self, request=None, view_name=None):
         return absolute_url(self, request, view_name)
 
--- a/src/pyams_content/component/association/container.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/association/container.py	Tue Jul 17 15:09:38 2018 +0200
@@ -19,6 +19,7 @@
 from pyams_content.component.association.interfaces import IAssociationContainer, IAssociationContainerTarget, \
     ASSOCIATION_CONTAINER_KEY, IAssociationItem, IAssociationInfo
 from pyams_content.features.checker.interfaces import IContentChecker
+from pyams_zmi.layer import IAdminLayer
 from zope.location.interfaces import ISublocations
 from zope.traversing.interfaces import ITraversable
 
@@ -54,8 +55,10 @@
             # make sure that association item is correctly indexed
             index_object(value)
 
-    def get_visible_items(self):
-        return filter(lambda x: IAssociationItem(x).visible, self.values())
+    def get_visible_items(self, request=None):
+        for item in filter(lambda x: IAssociationItem(x).visible, self.values()):
+            if IAdminLayer.providedBy(request) or item.is_visible(request):
+                yield item
 
 
 @adapter_config(context=IAssociationContainerTarget, provides=IAssociationContainer)
--- a/src/pyams_content/component/association/interfaces/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/association/interfaces/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -44,6 +44,9 @@
                    required=True,
                    default=True)
 
+    def is_visible(self, request=None):
+        """Is association item published?"""
+
     def get_url(self, request=None, view_name=None):
         """Get link URL"""
 
@@ -70,7 +73,7 @@
     def append(self, value, notify=True):
         """Append given value to container"""
 
-    def get_visible_items(self):
+    def get_visible_items(self, request=None):
         """Get list of visible items"""
 
 
--- a/src/pyams_content/component/extfile/zmi/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/extfile/zmi/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -106,11 +106,6 @@
     fields = field.Fields(IExtFile).select('data', 'filename', 'title', 'description', 'author', 'language')
     edit_permission = MANAGE_CONTENT_PERMISSION
 
-    def updateWidgets(self, prefix=None):
-        super(ExtFileAddForm, self).updateWidgets(prefix)
-        if 'description' in self.widgets:
-            self.widgets['description'].widget_css_class = 'textarea'
-
     def create(self, data):
         factory = EXTERNAL_FILES_FACTORIES.get('file')
         if factory is not None:
@@ -142,11 +137,6 @@
     fields = field.Fields(IExtFile).select('data', 'filename', 'title', 'description', 'author', 'language')
     edit_permission = MANAGE_CONTENT_PERMISSION
 
-    def updateWidgets(self, prefix=None):
-        super(ExtFilePropertiesEditForm, self).updateWidgets(prefix)
-        if 'description' in self.widgets:
-            self.widgets['description'].widget_css_class = 'textarea'
-
     def get_ajax_output(self, changes):
         if ('title' in changes.get(IBaseExtFile, ())) or \
            ('filename' in changes.get(IBaseExtFile, ())) or \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_content/component/file/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -0,0 +1,41 @@
+#
+# Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_file.interfaces import IFile
+from pyams_skin.layer import IPyAMSUserLayer
+from pyams_utils.interfaces import VIEW_SYSTEM_PERMISSION
+from pyams_workflow.interfaces import IWorkflowPublicationInfo
+
+# import packages
+from pyams_file.views.file import FileView
+from pyramid.exceptions import NotFound
+from pyramid.location import lineage
+from pyramid.view import view_config
+
+
+@view_config(context=IFile, request_type=IPyAMSUserLayer)
+def ProtectedFileView(request):
+    """Protected file view"""
+    context = request.context
+    if not request.has_permission(VIEW_SYSTEM_PERMISSION, context=context):  # authenticated operator
+        for parent in lineage(context):
+            publication_info = IWorkflowPublicationInfo(parent, None)
+            if (publication_info is not None) and not publication_info.is_visible(request):
+                raise NotFound()
+
+    return FileView(request)
--- a/src/pyams_content/component/gallery/interfaces/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/gallery/interfaces/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -60,7 +60,7 @@
 
     author = TextLine(title=_("Author"),
                       description=_("Name of document's author"),
-                      required=False)
+                      required=True)
 
     author_comments = I18nTextField(title=_("Author's comments"),
                                     description=_("Comments relatives to author's rights management"),
@@ -88,6 +88,9 @@
                    default=True)
 
 
+GALLERY_FILE_HIDDEN_FIELDS = ('__parent__', '__name__', 'visible')
+
+
 class IBaseGallery(IOrderedContainer, IAttributeAnnotatable, IRenderedContent):
     """Base gallery interface"""
 
--- a/src/pyams_content/component/gallery/zmi/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/gallery/zmi/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -68,11 +68,6 @@
 
     edit_permission = MANAGE_CONTENT_PERMISSION
 
-    def updateWidgets(self, prefix=None):
-        super(GalleryPropertiesEditForm, self).updateWidgets(prefix)
-        if 'description' in self.widgets:
-            self.widgets['description'].widget_css_class = 'textarea'
-
     def get_ajax_output(self, changes):
         if 'title' in changes.get(IGallery, ()):
             return {
--- a/src/pyams_content/component/gallery/zmi/file.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/gallery/zmi/file.py	Tue Jul 17 15:09:38 2018 +0200
@@ -16,7 +16,8 @@
 # import standard library
 
 # import interfaces
-from pyams_content.component.gallery.interfaces import IGallery, IGalleryFile
+from pyams_content.component.gallery.interfaces import IGallery, IGalleryFile, IGalleryParagraph, \
+    GALLERY_FILE_HIDDEN_FIELDS
 from pyams_content.component.gallery.zmi.interfaces import IGalleryMediasAddFields, IGalleryContentsView
 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
 from pyams_file.interfaces.archive import IArchiveExtractor
@@ -37,12 +38,14 @@
 from pyams_form.form import AJAXAddForm, ajax_config
 from pyams_form.group import NamedWidgetsGroup
 from pyams_pagelet.pagelet import pagelet_config
+from pyams_skin.event import get_json_refresh_event
 from pyams_skin.viewlet.toolbar import ToolbarAction, JsToolbarActionItem
 from pyams_utils.registry import query_utility
 from pyams_utils.traversing import get_parent
 from pyams_utils.url import absolute_url
 from pyams_viewlet.viewlet import viewlet_config
 from pyams_zmi.form import AdminDialogEditForm, AdminDialogAddForm
+from pyramid.renderers import render
 from z3c.form import field
 from zope.lifecycleevent import ObjectCreatedEvent
 from zope.location import locate
@@ -72,11 +75,6 @@
     fields = field.Fields(IGalleryMediasAddFields)
     edit_permission = MANAGE_CONTENT_PERMISSION
 
-    def updateWidgets(self, prefix=None):
-        super(GalleryMediaAddForm, self).updateWidgets(prefix)
-        if 'author_comments' in self.widgets:
-            self.widgets['author_comments'].widget_css_class = 'textarea'
-
     def create(self, data):
         medias = []
         medias_data = data['medias_data']
@@ -185,7 +183,7 @@
     icon_css_class = 'fa fa-fw fa-picture-o'
     dialog_class = 'modal-large'
 
-    fields = field.Fields(IGalleryFile).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(IGalleryFile).omit(*GALLERY_FILE_HIDDEN_FIELDS)
     edit_permission = MANAGE_CONTENT_PERMISSION
 
     @property
@@ -195,15 +193,9 @@
 
     def updateWidgets(self, prefix=None):
         super(GalleryFilePropertiesEditForm, self).updateWidgets(prefix)
-        if 'description' in self.widgets:
-            self.widgets['description'].widget_css_class = 'textarea'
-        if 'author_comments' in self.widgets:
-            self.widgets['author_comments'].widget_css_class = 'textarea'
         if 'pif_number' in self.widgets:
             self.widgets['pif_number'].input_css_class = 'col-md-3'
-        if 'sound_description' in self.widgets:
-            self.widgets['sound_description'].widget_css_class = 'textarea'
-            
+
     def updateGroups(self):
         self.add_group(NamedWidgetsGroup(self, 'audio_file', self.widgets,
                                          ('sound', 'sound_title', 'sound_description'),
@@ -227,6 +219,12 @@
                         'title': II18n(self.context).query_attribute('title', request=self.request)
                     }
                 })
+        paragraph = get_parent(self.context, IGalleryParagraph)
+        if paragraph is not None:
+            output.setdefault('events', []).append(
+                get_json_refresh_event(object_id='media_{0}_{1}'.format(paragraph.__name__, self.context.__name__),
+                                       content=render('templates/gallery-media-thumbnail.pt',
+                                                      {'media': self.context}, request=self.request)))
         return output
 
 
--- a/src/pyams_content/component/gallery/zmi/paragraph.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/gallery/zmi/paragraph.py	Tue Jul 17 15:09:38 2018 +0200
@@ -18,7 +18,8 @@
 # import interfaces
 from pyams_content.component.gallery.interfaces import IGalleryParagraph, IBaseGallery, GALLERY_PARAGRAPH_TYPE
 from pyams_content.component.gallery.zmi.interfaces import IGalleryContentsView
-from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphContainer
+from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphContainer, \
+    PARAGRAPH_HIDDEN_FIELDS
 from pyams_content.component.paragraph.zmi.interfaces import IParagraphInnerEditor, IParagraphContainerView
 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
 from pyams_form.interfaces.form import IInnerForm, IInnerSubForm
@@ -69,14 +70,9 @@
     legend = _("Add new gallery")
     icon_css_class = 'fa fa-fw fa-picture-o'
 
-    fields = field.Fields(IGalleryParagraph).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(IGalleryParagraph).omit(*PARAGRAPH_HIDDEN_FIELDS)
     edit_permission = MANAGE_CONTENT_PERMISSION
 
-    def updateWidgets(self, prefix=None):
-        super(GalleryAddForm, self).updateWidgets(prefix)
-        if 'description' in self.widgets:
-            self.widgets['description'].widget_css_class = 'textarea'
-
     def create(self, data):
         return Gallery()
 
@@ -96,16 +92,11 @@
     legend = _("Edit gallery properties")
     icon_css_class = 'fa fa-fw fa-picture-o'
 
-    fields = field.Fields(IGalleryParagraph).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(IGalleryParagraph).omit(*PARAGRAPH_HIDDEN_FIELDS)
     fields['renderer'].widgetFactory = RendererFieldWidget
 
     edit_permission = MANAGE_CONTENT_PERMISSION
 
-    def updateWidgets(self, prefix=None):
-        super(GalleryPropertiesEditForm, self).updateWidgets(prefix)
-        if 'description' in self.widgets:
-            self.widgets['description'].widget_css_class = 'textarea'
-
     def get_ajax_output(self, changes):
         updated = changes.get(IBaseGallery, ())
         if 'title' in updated:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_content/component/gallery/zmi/templates/gallery-media-thumbnail.pt	Tue Jul 17 15:09:38 2018 +0200
@@ -0,0 +1,13 @@
+<img class="thumbnail"
+	 data-ams-hint-gravity="s"
+	 tal:define="thumbnails tales:thumbnails(media.data);
+				 thumbnail thumbnails.get_thumbnail('128x128');
+				 image_size thumbnail.get_image_size();
+				 margin_left 64 - image_size[0] / 2;
+				 margin_top 64 - image_size[1] / 2;
+				 title i18n:media.title;
+				 src tales:absolute_url(thumbnail);"
+	 tal:attributes="src string:${src}?_=${tales:timestamp(thumbnail)};
+					 id 'media_{0}_{1}'.format(context.__name__, media.__name__);
+					 original-title title or '--';
+					 style string:margin-left: ${margin_left}px;; margin-right: ${margin_left}px;; margin-top: ${margin_top}px;; margin-bottom: ${margin_top}px;;" />
--- a/src/pyams_content/component/gallery/zmi/templates/gallery-medias.pt	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/gallery/zmi/templates/gallery-medias.pt	Tue Jul 17 15:09:38 2018 +0200
@@ -1,7 +1,7 @@
 <div class="form-group" i18n:domain="pyams_content"
 	 data-ams-plugins="pyams_content"
 	 tal:define="gallery_images context.values()"
-	 tal:attributes="data-ams-plugin-pyams_content-src extension:resource_path('pyams_content.skin:pyams_content');
+	 tal:attributes="data-ams-plugin-pyams_content-src tales:resource_path('pyams_content.skin:pyams_content');
 					 id string:gallery_medias_${context.__name__};"
 	 data-ams-plugin-pyams_content-async="false">
 	<fieldset class="margin-top-10 padding-top-5 padding-bottom-0">
@@ -13,7 +13,7 @@
 		<div class="btn-group pull-right"
 			 tal:condition="gallery_images">
 			<a class="btn btn-xs btn-primary"
-			   tal:attributes="href extension:absolute_url(context, 'get-medias.zip')"
+			   tal:attributes="href tales:absolute_url(context, 'get-medias.zip')"
 			   i18n:translate="">Download medias</a>
 		</div>
 		<div class="pull-left persistent">
@@ -21,7 +21,7 @@
 		</div>
 		<div class="clearfix"></div>
 		<div class="sortable fancybox gallery"
-			 tal:attributes="data-ams-location extension:absolute_url(context);
+			 tal:attributes="data-ams-location tales:absolute_url(context);
 							 class '{0} fancybox gallery'.format('sortable' if request.has_permission(view.permission) else '');"
 			 data-ams-sortable-stop="PyAMS_content.galleries.setOrder"
 			 data-ams-sortable-helper="clone"
@@ -33,7 +33,7 @@
 				 class="media margin-5 margin-bottom-10 radius-4 padding-5 pull-left text-center"
 				 style="position: relative;"
 				 tal:attributes="data-ams-element-name media.__name__">
-				<tal:var define="thumbnails extension:thumbnails(media.data);">
+				<tal:var define="thumbnails tales:thumbnails(media.data);">
 					<tal:if condition="thumbnails">
 						<tal:if condition="media.data.content_type.startswith('image/')">
 							<a class="fancyimg hint" data-toggle
@@ -41,7 +41,7 @@
 							   title="Zoom image" i18n:attributes="title"
 							   tal:define="target thumbnails.get_thumbnail('800x600')"
 							   tal:attributes="class 'fancyimg hint {0}'.format('not-visible' if not media.visible else '');
-											   href extension:absolute_url(target);
+											   href tales:absolute_url(target);
 											   rel string:gallery_${context.__name__};">
 								<img class="thumbnail"
 									 data-ams-hint-gravity="s"
@@ -49,8 +49,9 @@
 												 image_size thumbnail.get_image_size();
 												 margin_left 64 - image_size[0] / 2;
 												 margin_top 64 - image_size[1] / 2;
-												 title i18n:media.title;"
-									 tal:attributes="src extension:absolute_url(thumbnail);
+												 title i18n:media.title;
+												 src tales:absolute_url(thumbnail);"
+									 tal:attributes="src string:${src}?_=${tales:timestamp(thumbnail)};
 													 id 'media_{0}_{1}'.format(context.__name__, media.__name__);
 													 original-title title or '--';
 													 style string:margin-left: ${margin_left}px;; margin-right: ${margin_left}px;; margin-top: ${margin_top}px;; margin-bottom: ${margin_top}px;;" />
@@ -67,7 +68,7 @@
 							   tal:attributes="href target" data-toggle="modal">
 								<img class="thumbnail no-border"
 									 data-ams-hint-gravity="s"
-									 tal:attributes="src extension:absolute_url(thumbnail);
+									 tal:attributes="src tales:absolute_url(thumbnail);
 													 id 'media_{0}_{1}'.format(context.__name__, media.__name__);
 													 original-title title or '--';
 													 style string:margin-left: ${margin_left}px;; margin-right: ${margin_left}px;; margin-top: ${margin_top}px;; margin-bottom: ${margin_top}px;;" />
@@ -81,7 +82,7 @@
 					</tal:if>
 				</tal:var>
 				<div class="btn-group margin-top-10"
-					 tal:define="actions extension:context_actions(media);">
+					 tal:define="actions tales:context_actions(media);">
 					<tal:loop repeat="viewlet actions.viewlets"
 							  content="structure viewlet.render()" />
 				</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_content/component/illustration/thesaurus.py	Tue Jul 17 15:09:38 2018 +0200
@@ -0,0 +1,37 @@
+#
+# Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_content.component.illustration import IBasicIllustrationTarget
+from pyams_thesaurus.interfaces.extension import IThesaurusTermExtension
+
+# import packages
+from pyams_utils.registry import utility_config
+
+from pyams_content import _
+
+
+@utility_config(name='illustration', provides=IThesaurusTermExtension)
+class IllustrationThesaurusExtension(object):
+    """Illustration thesaurus extension"""
+
+    label = _("Illustration")
+
+    target_interface = IBasicIllustrationTarget
+    target_view = 'illustration-dialog.html'
+
+    icon = '<i class="fa fa-fw fa-file-image-o"></i>'
--- a/src/pyams_content/component/illustration/zmi/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/illustration/zmi/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -122,11 +122,6 @@
         if not IBaseParagraph.providedBy(self.context):
             return 'open'
 
-    def updateWidgets(self, prefix=None):
-        super(IllustrationPropertiesInnerEditForm, self).updateWidgets(prefix)
-        if 'description' in self.widgets:
-            self.widgets['description'].widget_css_class = 'textarea'
-
     def get_ajax_output(self, changes):
         output = super(IllustrationPropertiesInnerEditForm, self).get_ajax_output(changes)
         events = output.setdefault('events', [])
--- a/src/pyams_content/component/illustration/zmi/paragraph.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/illustration/zmi/paragraph.py	Tue Jul 17 15:09:38 2018 +0200
@@ -79,11 +79,6 @@
 
     edit_permission = MANAGE_CONTENT_PERMISSION
 
-    def updateWidgets(self, prefix=None):
-        super(IllustrationAddForm, self).updateWidgets(prefix)
-        if 'description' in self.widgets:
-            self.widgets['description'].widget_css_class = 'textarea'
-
     def create(self, data):
         return Illustration()
 
@@ -110,11 +105,6 @@
 
     edit_permission = MANAGE_CONTENT_PERMISSION
 
-    def updateWidgets(self, prefix=None):
-        super(IllustrationPropertiesEditForm, self).updateWidgets(prefix)
-        if 'description' in self.widgets:
-            self.widgets['description'].widget_css_class = 'textarea'
-
     def get_ajax_output(self, changes):
         output = super(self.__class__, self).get_ajax_output(changes)
         if 'title' in changes.get(IIllustration, ()):
--- a/src/pyams_content/component/illustration/zmi/templates/illustration-thumbnail.pt	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/illustration/zmi/templates/illustration-thumbnail.pt	Tue Jul 17 15:09:38 2018 +0200
@@ -1,4 +1,4 @@
 <tal:var i18n:domain="pyams_content">
 	<img tal:define="illustration i18n:view.illustration.data"
-		 tal:attributes="src extension:absolute_url(illustration, '++thumb++128x24.png')" />
+		 tal:attributes="src tales:absolute_url(illustration, '++thumb++128x24.png')" />
 </tal:var>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_content/component/illustration/zmi/thesaurus.py	Tue Jul 17 15:09:38 2018 +0200
@@ -0,0 +1,50 @@
+#
+# Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_content.component.illustration.interfaces import IBasicIllustration, IIllustration
+from pyams_skin.layer import IPyAMSLayer
+from pyams_thesaurus.interfaces import MANAGE_THESAURUS_CONTENT_PERMISSION
+from pyams_thesaurus.interfaces.term import IThesaurusTerm
+from pyams_utils.interfaces import VIEW_SYSTEM_PERMISSION
+
+# import packages
+from pyams_form.form import ajax_config
+from pyams_pagelet.pagelet import pagelet_config
+from pyams_zmi.form import AdminDialogEditForm
+from z3c.form import field
+
+from pyams_content import _
+
+
+@pagelet_config(name='illustration-dialog.html', context=IThesaurusTerm, layer=IPyAMSLayer,
+                permission=VIEW_SYSTEM_PERMISSION)
+@ajax_config(name='illustration-dialog.json', context=IThesaurusTerm, layer=IPyAMSLayer)
+class ThesaurusTermIllustrationPropertiesEditForm(AdminDialogEditForm):
+    """Thesaurus term illustration properties edit form"""
+
+    prefix = 'illustration_form.'
+
+    legend = _("Edit illustration properties")
+    dialog_class = 'modal-large'
+    icon_css_class = 'fa fa-fw fa-file-image-o'
+
+    fields = field.Fields(IBasicIllustration).omit('__parent__', '__name__')
+    edit_permission = MANAGE_THESAURUS_CONTENT_PERMISSION
+
+    def getContent(self):
+        return IIllustration(self.context)
--- a/src/pyams_content/component/keynumber/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/keynumber/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -146,7 +146,7 @@
             index_object(value)
 
     def get_visible_items(self):
-        return filter(lambda x: IKeyNumber(x).visible, self.values())
+        yield from filter(lambda x: IKeyNumber(x).visible, self.values())
 
 
 @adapter_config(context=IKeyNumberContainerTarget, provides=IKeyNumberContainer)
--- a/src/pyams_content/component/keynumber/interfaces/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/keynumber/interfaces/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -59,6 +59,9 @@
                              required=False)
 
 
+KEYNUMBER_HIDDEN_FIELDS = ('__parent__', '__name__', 'visible')
+
+
 class IKeyNumberContainer(IOrderedContainer):
     """Key numbers container interface"""
 
--- a/src/pyams_content/component/keynumber/portlet/zmi/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/keynumber/portlet/zmi/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -55,11 +55,6 @@
 class KeyNumberPortletSettingsPropertiesEditor(PortletSettingsPropertiesEditor):
     """Key number portlet settings properties editor"""
 
-    def updateWidgets(self, prefix=None):
-        super().updateWidgets(prefix)
-        if 'teaser' in self.widgets:
-            self.widgets['teaser'].widget_css_class = 'textarea'
-
 
 @adapter_config(name='properties.json', context=(IKeyNumberPortletSettings, IPyAMSLayer), provides=IPagelet)
 class KeyNumberPortletAJAXEditor(AJAXEditForm, KeyNumberPortletEditor):
--- a/src/pyams_content/component/keynumber/portlet/zmi/templates/keynumber-preview.pt	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/keynumber/portlet/zmi/templates/keynumber-preview.pt	Tue Jul 17 15:09:38 2018 +0200
@@ -1,9 +1,10 @@
 <div tal:define="settings view.settings" i18n:domain="pyams_content">
 	<strong tal:define="title i18n:settings.title"
 			tal:condition="title">
-		<tal:var content="title"/><br /></strong>
+		<tal:var content="title" /><br />
+	</strong>
 	<div tal:define="teaser i18n:settings.teaser"
-		 tal:content="structure extension:html(teaser)">Teaser</div>
+		 tal:content="structure tales:html(teaser)">Teaser</div>
 	<ul>
 		<li tal:repeat="number settings.keynumbers.get_visible_items()">
 			<span tal:define="label i18n:number.label"
@@ -14,10 +15,13 @@
 			<span tal:define="unit i18n:number.unit"
 				  tal:condition="unit"
 				  tal:content="unit">Unit</span>
-			<span tal:content="i18n:number.text">text</span>
+			<tal:var define="txt i18n:number.text">
+				<tal:if condition="txt"> / </tal:if>
+				<span tal:content="i18n:number.text">text</span>
+			</tal:var>
 		</li>
 	</ul>
-	<div tal:define="visible_links list(settings.links.get_visible_items())"
+	<div tal:define="visible_links list(settings.links.get_visible_items(request))"
 		 tal:condition="visible_links">
 		<u><i18n:var translate="" >Associated links</i18n:var> :</u>
 		<ul>
--- a/src/pyams_content/component/keynumber/zmi/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/keynumber/zmi/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -17,7 +17,8 @@
 import json
 
 # import interfaces
-from pyams_content.component.keynumber.interfaces import IKeyNumberContainer, IKeyNumberContainerTarget, IKeyNumber
+from pyams_content.component.keynumber.interfaces import IKeyNumberContainer, IKeyNumberContainerTarget, IKeyNumber, \
+    KEYNUMBER_HIDDEN_FIELDS
 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
 from pyams_form.interfaces.form import IInnerSubForm
 from pyams_skin.interfaces.viewlet import IWidgetTitleViewletManager
@@ -229,7 +230,7 @@
     legend = _("Add new keynumber")
     icon_css_class = 'fa fa-fw fa-dashboard'
 
-    fields = field.Fields(IKeyNumber).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(IKeyNumber).omit(*KEYNUMBER_HIDDEN_FIELDS)
     edit_permission = None  # use context permission checker
 
     def create(self, data):
@@ -258,7 +259,7 @@
     legend = _("Edit keynumber properties")
     icon_css_class = 'fa fa-fw fa-dashboard'
 
-    fields = field.Fields(IKeyNumber).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(IKeyNumber).omit(*KEYNUMBER_HIDDEN_FIELDS)
     edit_permission = None  # use context permission checker
 
     def get_ajax_output(self, changes):
--- a/src/pyams_content/component/links/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/links/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -9,7 +9,6 @@
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE.
 #
-from pyams_skin.layer import IPyAMSUserLayer
 
 __docformat__ = 'restructuredtext'
 
@@ -25,18 +24,17 @@
 from pyams_form.interfaces.form import IFormContextPermissionChecker
 from pyams_i18n.interfaces import II18n
 from pyams_sequence.interfaces import ISequentialIdInfo
-from pyams_workflow.interfaces import IWorkflow
+from pyams_workflow.interfaces import IWorkflow, IWorkflowPublicationInfo
 
 # import packages
 from pyams_content.component.association import AssociationItem
 from pyams_content.features.checker import BaseContentChecker
-from pyams_content.workflow import VISIBLE_STATES
-from pyams_sequence.utility import get_reference_target
+from pyams_sequence.reference import get_reference_target
 from pyams_utils.adapter import adapter_config, ContextAdapter
 from pyams_utils.registry import query_utility
 from pyams_utils.request import check_request
 from pyams_utils.traversing import get_parent
-from pyams_utils.url import absolute_url, relative_url
+from pyams_utils.url import relative_url
 from pyams_utils.vocabulary import vocabulary_config
 from pyams_utils.zodb import volatile_property
 from zope.interface import implementer
@@ -126,8 +124,22 @@
 
     reference = FieldProperty(IInternalLink['reference'])
 
+    @volatile_property
+    def target(self):
+        return get_reference_target(self.reference)
+
     def get_target(self, state=None):
-        return get_reference_target(self.reference, state)
+        if not state:
+            return self.target
+        else:
+            return get_reference_target(self.reference, state)
+
+    def is_visible(self, request=None):
+        target = self.get_target()
+        if target is not None:
+            publication_info = IWorkflowPublicationInfo(target, None)
+            if publication_info is not None:
+                return publication_info.is_visible(request)
 
     def get_editor_url(self):
         return 'oid://{0}'.format(self.reference)
--- a/src/pyams_content/component/links/interfaces/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/links/interfaces/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -54,9 +54,6 @@
 class IInternalLink(IBaseLink, IInternalReference):
     """Internal link interface"""
 
-    def get_target(self, state=None):
-        """Get reference target"""
-
 
 class IExternalLink(IBaseLink):
     """External link interface"""
--- a/src/pyams_content/component/links/zmi/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/links/zmi/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -94,11 +94,6 @@
 
     edit_permission = MANAGE_CONTENT_PERMISSION
 
-    def updateWidgets(self, prefix=None):
-        super(InternalLinkAddForm, self).updateWidgets(prefix)
-        if 'description' in self.widgets:
-            self.widgets['description'].widget_css_class = 'textarea'
-
     def create(self, data):
         return InternalLink()
 
@@ -131,11 +126,6 @@
 
     edit_permission = None  # defined by IFormContextPermissionChecker adapter
 
-    def updateWidgets(self, prefix=None):
-        super(InternalLinkPropertiesEditForm, self).updateWidgets(prefix)
-        if 'description' in self.widgets:
-            self.widgets['description'].widget_css_class = 'textarea'
-
     def get_ajax_output(self, changes):
         if ('title' in changes.get(IBaseLink, ())) or \
            ('reference' in changes.get(IInternalLink, ())):
@@ -193,11 +183,6 @@
 
     edit_permission = MANAGE_CONTENT_PERMISSION
 
-    def updateWidgets(self, prefix=None):
-        super(ExternalLinkAddForm, self).updateWidgets(prefix)
-        if 'description' in self.widgets:
-            self.widgets['description'].widget_css_class = 'textarea'
-
     def create(self, data):
         return ExternalLink()
 
@@ -230,11 +215,6 @@
 
     edit_permission = None  # defined by IFormContextPermissionChecker adapter
 
-    def updateWidgets(self, prefix=None):
-        super(ExternalLinkPropertiesEditForm, self).updateWidgets(prefix)
-        if 'description' in self.widgets:
-            self.widgets['description'].widget_css_class = 'textarea'
-
     def get_ajax_output(self, changes):
         if ('title' in changes.get(IBaseLink, ())) or \
            ('url' in changes.get(IExternalLink, ())):
@@ -292,11 +272,6 @@
 
     edit_permission = MANAGE_CONTENT_PERMISSION
 
-    def updateWidgets(self, prefix=None):
-        super(MailtoLinkAddForm, self).updateWidgets(prefix)
-        if 'description' in self.widgets:
-            self.widgets['description'].widget_css_class = 'textarea'
-
     def create(self, data):
         return MailtoLink()
 
@@ -328,11 +303,6 @@
 
     edit_permission = None  # defined by IFormContextPermissionChecker adapter
 
-    def updateWidgets(self, prefix=None):
-        super(MailtoLinkPropertiesEditForm, self).updateWidgets(prefix)
-        if 'description' in self.widgets:
-            self.widgets['description'].widget_css_class = 'textarea'
-
     def get_ajax_output(self, changes):
         if ('title' in changes.get(IBaseLink, ())) or changes.get(IMailtoLink, ()):
             return self.get_associations_table()
--- a/src/pyams_content/component/paragraph/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/paragraph/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -82,6 +82,7 @@
     icon_hint = ''
 
     visible = FieldProperty(IBaseParagraph['visible'])
+    anchor = FieldProperty(IBaseParagraph['anchor'])
     title = FieldProperty(IBaseParagraph['title'])
 
     empty_title = ' -' * 8
--- a/src/pyams_content/component/paragraph/audio.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/paragraph/audio.py	Tue Jul 17 15:09:38 2018 +0200
@@ -44,10 +44,9 @@
     icon_class = 'fa-volume-up'
     icon_hint = AUDIO_PARAGRAPH_NAME
 
-    body = FieldProperty(IAudioParagraph['body'])
+    data = FileProperty(IAudioParagraph['data'])
     description = FieldProperty(IAudioParagraph['description'])
     author = FieldProperty(IAudioParagraph['author'])
-    data = FileProperty(IAudioParagraph['data'])
     renderer = FieldProperty(IAudioParagraph['renderer'])
 
 
--- a/src/pyams_content/component/paragraph/interfaces/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/paragraph/interfaces/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -46,10 +46,18 @@
                    required=True,
                    default=True)
 
+    anchor = Bool(title=_("Anchor?"),
+                  description=_("Is this paragraph a navigation anchor?"),
+                  required=True,
+                  default=False)
+
     title = I18nTextLineField(title=_("§ Title"),
                               required=False)
 
 
+PARAGRAPH_HIDDEN_FIELDS = ('__parent__', '__name__', 'visible', 'anchor')
+
+
 class IParagraphContainer(IOrderedContainer):
     """Paragraphs container"""
 
--- a/src/pyams_content/component/paragraph/interfaces/audio.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/paragraph/interfaces/audio.py	Tue Jul 17 15:09:38 2018 +0200
@@ -20,7 +20,7 @@
 
 # import packages
 from pyams_file.schema import AudioField
-from pyams_i18n.schema import I18nHTMLField, I18nTextField
+from pyams_i18n.schema import I18nTextField, I18nTextLineField
 from zope.schema import TextLine, Choice
 
 from pyams_content import _
@@ -38,8 +38,12 @@
 class IAudioParagraph(IBaseParagraph):
     """Audio paragraph"""
 
-    body = I18nHTMLField(title=_("Body"),
-                         required=False)
+    data = AudioField(title=_("Audio data"),
+                      description=_("Audio file content"),
+                      required=True)
+
+    title = I18nTextLineField(title=_("Legend"),
+                              required=False)
 
     description = I18nTextField(title=_("Description"),
                                 description=_("File description displayed by front-office template"),
@@ -47,10 +51,6 @@
 
     author = TextLine(title=_("Author"),
                       description=_("Name of document's author"),
-                      required=False)
-
-    data = AudioField(title=_("Audio data"),
-                      description=_("Audio file content"),
                       required=True)
 
     renderer = Choice(title=_("Audio template"),
--- a/src/pyams_content/component/paragraph/interfaces/contact.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/paragraph/interfaces/contact.py	Tue Jul 17 15:09:38 2018 +0200
@@ -28,7 +28,7 @@
 else:
     have_gis = True
 from pyams_i18n.schema import I18nTextLineField
-from pyams_sequence.schema import InternalReference
+from pyams_sequence.schema import InternalReferenceField
 from pyams_utils.schema import MailAddressField
 from zope.schema import TextLine, Text, Choice
 
@@ -59,10 +59,10 @@
                                      description=_("Contact email address"),
                                      required=False)
 
-    contact_form = InternalReference(title=_("Contact form"),
-                                     description=_("Reference of contact form"),
-                                     required=False,
-                                     content_type=FORM_CONTENT_TYPE)
+    contact_form = InternalReferenceField(title=_("Contact form"),
+                                          description=_("Reference of contact form"),
+                                          required=False,
+                                          content_type=FORM_CONTENT_TYPE)
 
     photo = ImageField(title=_("Photo"),
                        description=_("Use 'browse' button to select contact picture"),
--- a/src/pyams_content/component/paragraph/interfaces/video.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/paragraph/interfaces/video.py	Tue Jul 17 15:09:38 2018 +0200
@@ -51,7 +51,7 @@
 
     author = TextLine(title=_("Author"),
                       description=_("Name of document's author"),
-                      required=False)
+                      required=True)
 
     renderer = Choice(title=_("Video template"),
                       description=_("Presentation template used for this video"),
--- a/src/pyams_content/component/paragraph/milestone.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/paragraph/milestone.py	Tue Jul 17 15:09:38 2018 +0200
@@ -167,7 +167,7 @@
             index_object(value)
 
     def get_visible_items(self):
-        return filter(lambda x: IMilestone(x).visible, self.values())
+        yield from filter(lambda x: IMilestone(x).visible, self.values())
 
 
 @adapter_config(context=IMilestoneContainerTarget, provides=IMilestoneContainer)
--- a/src/pyams_content/component/paragraph/pictogram.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/paragraph/pictogram.py	Tue Jul 17 15:09:38 2018 +0200
@@ -158,7 +158,7 @@
             index_object(value)
 
     def get_visible_items(self):
-        return filter(lambda x: IPictogramItem(x).visible, self.values())
+        yield from filter(lambda x: IPictogramItem(x).visible, self.values())
 
 
 @adapter_config(context=IPictogramContainerTarget, provides=IPictogramContainer)
--- a/src/pyams_content/component/paragraph/zmi/audio.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/paragraph/zmi/audio.py	Tue Jul 17 15:09:38 2018 +0200
@@ -17,7 +17,8 @@
 
 # import interfaces
 from pyams_content.component.association.zmi.interfaces import IAssociationsParentForm
-from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphContainer
+from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphContainer, \
+    PARAGRAPH_HIDDEN_FIELDS
 from pyams_content.component.paragraph.interfaces.audio import IAudioParagraph, AUDIO_PARAGRAPH_TYPE
 from pyams_content.component.paragraph.zmi.interfaces import IParagraphInnerEditor, IParagraphContainerView
 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
@@ -31,10 +32,9 @@
 # import packages
 from pyams_content.component.paragraph.audio import AudioParagraph
 from pyams_content.component.paragraph.zmi import BaseParagraphAJAXAddForm, BaseParagraphAJAXEditForm, \
-    BaseParagraphAddMenu, BaseParagraphPropertiesEditForm, IParagraphEditFormButtons
+    BaseParagraphAddMenu, BaseParagraphPropertiesEditForm, IParagraphEditFormButtons, get_json_paragraph_refresh_event
 from pyams_content.features.renderer.zmi.widget import RendererFieldWidget
 from pyams_form.form import ajax_config
-from pyams_form.group import NamedWidgetsGroup
 from pyams_pagelet.pagelet import pagelet_config
 from pyams_skin.event import get_json_form_refresh_event, get_json_widget_refresh_event
 from pyams_utils.adapter import adapter_config
@@ -68,28 +68,9 @@
     dialog_class = 'modal-large'
     icon_css_class = 'fa fa-fw fa-volume-up'
 
-    fields = field.Fields(IAudioParagraph).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(IAudioParagraph).omit(*PARAGRAPH_HIDDEN_FIELDS)
     edit_permission = MANAGE_CONTENT_PERMISSION
 
-    def updateWidgets(self, prefix=None):
-        super(AudioParagraphAddForm, self).updateWidgets(prefix)
-        if 'description' in self.widgets:
-            self.widgets['description'].widget_css_class = 'textarea'
-        if 'body' in self.widgets:
-            self.widgets['body'].label = ''
-            
-    def updateGroups(self):
-        self.add_group(NamedWidgetsGroup(self, 'body_group', self.widgets, ('body',),
-                                         bordered=False,
-                                         legend=_("HTML content"),
-                                         css_class='inner switcher padding-right-10 no-y-padding pull-left',
-                                         switch=True,
-                                         display_mode='auto'))
-        self.add_group(NamedWidgetsGroup(self, 'data_group', self.widgets,
-                                         ('description', 'author', 'data', 'renderer'),
-                                         bordered=False))
-        super(AudioParagraphAddForm, self).updateGroups()
-
     def create(self, data):
         return AudioParagraph()
 
@@ -109,31 +90,11 @@
     dialog_class = 'modal-large'
     icon_css_class = 'fa fa-fw fa-volume-up'
 
-    fields = field.Fields(IAudioParagraph).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(IAudioParagraph).omit(*PARAGRAPH_HIDDEN_FIELDS)
     fields['renderer'].widgetFactory = RendererFieldWidget
 
     edit_permission = MANAGE_CONTENT_PERMISSION
 
-    def updateWidgets(self, prefix=None):
-        super(AudioParagraphPropertiesEditForm, self).updateWidgets(prefix)
-        if 'description' in self.widgets:
-            self.widgets['description'].widget_css_class = 'textarea'
-        if 'body' in self.widgets:
-            self.widgets['body'].label = ''
-            
-    def updateGroups(self):
-        self.add_group(NamedWidgetsGroup(self, 'body_group', self.widgets, ('body',),
-                                         bordered=False,
-                                         fieldset_class='margin-top-10 padding-y-5',
-                                         legend=_("HTML content"),
-                                         css_class='inner switcher padding-right-10 no-y-padding pull-left',
-                                         switch=True,
-                                         display_mode='auto'))
-        self.add_group(NamedWidgetsGroup(self, 'data_group', self.widgets,
-                                         ('description', 'author', 'data', 'renderer'),
-                                         bordered=False))
-        super(AudioParagraphPropertiesEditForm, self).updateGroups()
-
 
 @adapter_config(context=(IAudioParagraph, IPyAMSLayer), provides=IParagraphInnerEditor)
 @ajax_config(name='inner-properties.json', context=IAudioParagraph, layer=IPyAMSLayer,
@@ -159,8 +120,12 @@
             ITransactionManager(self.context).get().commit()
             output.setdefault('events', []).append(
                 get_json_form_refresh_event(self.context, self.request, AudioParagraphPropertiesInnerEditForm))
-        elif 'renderer' in updated:
-            output.setdefault('events', []).append(
-                get_json_widget_refresh_event(self.context, self.request,
-                                              AudioParagraphPropertiesInnerEditForm, 'renderer'))
+        else:
+            if 'title' in updated:
+                output.setdefault('events', []).append(
+                    get_json_paragraph_refresh_event(self.context, self.request))
+            if 'renderer' in updated:
+                output.setdefault('events', []).append(
+                    get_json_widget_refresh_event(self.context, self.request,
+                                                  AudioParagraphPropertiesInnerEditForm, 'renderer'))
         return output
--- a/src/pyams_content/component/paragraph/zmi/contact.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/paragraph/zmi/contact.py	Tue Jul 17 15:09:38 2018 +0200
@@ -17,7 +17,7 @@
 
 # import interfaces
 from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphContainer, \
-    IBaseParagraph
+    IBaseParagraph, PARAGRAPH_HIDDEN_FIELDS
 from pyams_content.component.paragraph.interfaces.contact import CONTACT_PARAGRAPH_TYPE, IContactParagraph
 from pyams_content.component.paragraph.zmi.interfaces import IParagraphContainerView, IParagraphInnerEditor
 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
@@ -67,14 +67,9 @@
     dialog_class = 'modal-large'
     icon_css_class = 'fa fa-fw fa-id-card-o'
 
-    fields = field.Fields(IContactParagraph).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(IContactParagraph).omit(*PARAGRAPH_HIDDEN_FIELDS)
     edit_permission = MANAGE_CONTENT_PERMISSION
 
-    def updateWidgets(self, prefix=None):
-        super(ContactParagraphAddForm, self).updateWidgets(prefix)
-        if 'address' in self.widgets:
-            self.widgets['address'].widget_css_class = 'textarea'
-
     def create(self, data):
         return ContactParagraph()
 
@@ -94,16 +89,11 @@
     legend = _("Edit contact card properties")
     icon_css_class = 'fa fa-fw fa-id-card-o'
 
-    fields = field.Fields(IContactParagraph).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(IContactParagraph).omit(*PARAGRAPH_HIDDEN_FIELDS)
     fields['renderer'].widgetFactory = RendererFieldWidget
 
     edit_permission = MANAGE_CONTENT_PERMISSION
 
-    def updateWidgets(self, prefix=None):
-        super(ContactParagraphPropertiesEditForm, self).updateWidgets(prefix)
-        if 'address' in self.widgets:
-            self.widgets['address'].widget_css_class = 'textarea'
-
 
 @adapter_config(context=(IContactParagraph, IPyAMSLayer), provides=IParagraphInnerEditor)
 @ajax_config(name='inner-properties.json', context=IContactParagraph, layer=IPyAMSLayer,
--- a/src/pyams_content/component/paragraph/zmi/container.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/paragraph/zmi/container.py	Tue Jul 17 15:09:38 2018 +0200
@@ -41,7 +41,7 @@
 from pyams_content.skin import pyams_content
 from pyams_form.security import ProtectedFormObjectMixin
 from pyams_pagelet.pagelet import pagelet_config
-from pyams_skin.container import switch_element_visibility
+from pyams_skin.container import switch_element_visibility, switch_element_attribute
 from pyams_skin.page import DefaultPageHeaderAdapter
 from pyams_skin.table import BaseTable, I18nColumn, TrashColumn, SorterColumn, ImageColumn, \
     VisibilitySwitcherColumn
@@ -108,7 +108,8 @@
             'data-ams-post-reload': 'PyAMS_content.paragraphs.postReload',
             'data-ams-tablednd-drag-handle': 'td.sorter',
             'data-ams-tablednd-drop-target': 'set-paragraphs-order.json',
-            'data-ams-visibility-switcher': 'switch-paragraph-visibility.json'
+            'data-ams-visibility-switcher': 'switch-paragraph-visibility.json',
+            'data-ams-anchor-switcher': 'switch-paragraph-anchor.json'
         })
         return attributes
 
@@ -183,12 +184,40 @@
     return column.table.context
 
 
+@adapter_config(name='anchor', context=(IParagraphContainerTarget, IPyAMSLayer, ParagraphContainerBaseTable),
+                provides=IColumn)
+class ParagraphContainerAnchorColumn(ProtectedFormObjectMixin, VisibilitySwitcherColumn):
+    """Paragraphs container anchor switcher column"""
+
+    switch_attribute = 'anchor'
+    visible_icon_class = 'fa fa-fw fa-anchor'
+    hidden_icon_class = 'fa fa-fw fa-anchor txt-color-silver opacity-50'
+
+    icon_hint = _("Set navigation anchor")
+
+    url = 'PyAMS_content.paragraphs.switchAnchor'
+    weight = 6
+
+
+@view_config(name='switch-paragraph-anchor.json', context=IParagraphContainer, request_type=IPyAMSLayer,
+             permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
+def switch_paragraph_anchor(request):
+    """Switch paragraph anchor"""
+    return switch_element_attribute(request, IParagraphContainer, attribute_name='anchor')
+
+
+@adapter_config(context=ParagraphContainerAnchorColumn, provides=IFormSecurityContext)
+def anchor_column_security_context_factory(column):
+    """Anchor column security context factory"""
+    return column.table.context
+
+
 @adapter_config(name='pictogram', context=(IParagraphContainerTarget, IPyAMSLayer, ParagraphContainerBaseTable),
                 provides=IColumn)
 class ParagraphContainerPictogramColumn(ImageColumn):
     """Paragraph container pictogram column"""
 
-    weight = 6
+    weight = 8
 
     def get_icon_class(self, item):
         return item.icon_class
--- a/src/pyams_content/component/paragraph/zmi/frame.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/paragraph/zmi/frame.py	Tue Jul 17 15:09:38 2018 +0200
@@ -18,7 +18,8 @@
 # import interfaces
 from pyams_content.component.association.interfaces import IAssociationContainerTarget
 from pyams_content.component.association.zmi.interfaces import IAssociationsParentForm
-from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphContainer
+from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphContainer, \
+    PARAGRAPH_HIDDEN_FIELDS
 from pyams_content.component.paragraph.interfaces.frame import IFrameParagraph, FRAME_PARAGRAPH_TYPE
 from pyams_content.component.paragraph.zmi.interfaces import IParagraphInnerEditor, IParagraphContainerView
 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
@@ -101,14 +102,9 @@
     label_css_class = 'control-label col-md-2'
     input_css_class = 'col-md-10'
 
-    fields = field.Fields(IFrameParagraph).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(IFrameParagraph).omit(*PARAGRAPH_HIDDEN_FIELDS)
     edit_permission = MANAGE_CONTENT_PERMISSION
 
-    def updateWidgets(self, prefix=None):
-        super(FrameParagraphAddForm, self).updateWidgets(prefix)
-        if 'body' in self.widgets:
-            self.widgets['body'].widget_css_class = 'textarea'
-
     def create(self, data):
         return FrameParagraph()
 
@@ -132,7 +128,7 @@
     label_css_class = 'control-label col-md-2'
     input_css_class = 'col-md-10'
 
-    fields = field.Fields(IFrameParagraph).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(IFrameParagraph).omit(*PARAGRAPH_HIDDEN_FIELDS)
     fields['renderer'].widgetFactory = RendererFieldWidget
 
     edit_permission = MANAGE_CONTENT_PERMISSION
@@ -144,7 +140,6 @@
             for lang in body_widget.langs:
                 widget = body_widget.widgets[lang]
                 widget.id = '{id}_{name}'.format(id=widget.id, name=self.context.__name__)
-            body_widget.widget_css_class = 'textarea'
 
     def get_ajax_output(self, changes):
         output = super(self.__class__, self).get_ajax_output(changes)
--- a/src/pyams_content/component/paragraph/zmi/header.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/paragraph/zmi/header.py	Tue Jul 17 15:09:38 2018 +0200
@@ -69,7 +69,7 @@
     def updateWidgets(self, prefix=None):
         super(HeaderParagraphAddForm, self).updateWidgets(prefix)
         if 'header' in self.widgets:
-            self.widgets['header'].widget_css_class = 'textarea height-100'
+            self.widgets['header'].widget_css_class = 'input height-100'
 
     def create(self, data):
         return HeaderParagraph()
@@ -98,7 +98,7 @@
     def updateWidgets(self, prefix=None):
         super(HeaderParagraphPropertiesEditForm, self).updateWidgets(prefix)
         if 'header' in self.widgets:
-            self.widgets['header'].widget_css_class = 'textarea height-100'
+            self.widgets['header'].widget_css_class = 'input height-100'
 
     def get_ajax_output(self, changes):
         output = super(self.__class__, self).get_ajax_output(changes)
--- a/src/pyams_content/component/paragraph/zmi/html.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/paragraph/zmi/html.py	Tue Jul 17 15:09:38 2018 +0200
@@ -19,7 +19,7 @@
 from pyams_content.component.association.interfaces import IAssociationContainerTarget
 from pyams_content.component.association.zmi.interfaces import IAssociationsParentForm
 from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphFactorySettings, \
-    IParagraphContainer
+    IParagraphContainer, PARAGRAPH_HIDDEN_FIELDS
 from pyams_content.component.paragraph.interfaces.html import IHTMLParagraph, IRawParagraph, RAW_PARAGRAPH_TYPE, \
     HTML_PARAGRAPH_TYPE
 from pyams_content.component.paragraph.zmi.interfaces import IParagraphInnerEditor, IParagraphContainerView
@@ -92,13 +92,13 @@
     label_css_class = 'control-label col-md-2'
     input_css_class = 'col-md-10'
 
-    fields = field.Fields(IRawParagraph).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(IRawParagraph).omit(*PARAGRAPH_HIDDEN_FIELDS)
     edit_permission = MANAGE_CONTENT_PERMISSION
 
     def updateWidgets(self, prefix=None):
         super(RawParagraphAddForm, self).updateWidgets(prefix)
         if 'body' in self.widgets:
-            self.widgets['body'].widget_css_class = 'textarea height-100'
+            self.widgets['body'].widget_css_class = 'input height-100'
 
     def create(self, data):
         return RawParagraph()
@@ -119,7 +119,7 @@
     legend = _("Edit raw HTML paragraph properties")
     icon_css_class = 'fa fa-fw fa-code'
 
-    fields = field.Fields(IRawParagraph).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(IRawParagraph).omit(*PARAGRAPH_HIDDEN_FIELDS)
     fields['renderer'].widgetFactory = RendererFieldWidget
 
     edit_permission = MANAGE_CONTENT_PERMISSION
@@ -127,7 +127,7 @@
     def updateWidgets(self, prefix=None):
         super(RawParagraphPropertiesEditForm, self).updateWidgets(prefix)
         if 'body' in self.widgets:
-            self.widgets['body'].widget_css_class = 'textarea height-100'
+            self.widgets['body'].widget_css_class = 'input height-100'
 
 
 @adapter_config(context=(IRawParagraph, IPyAMSLayer), provides=IParagraphInnerEditor)
@@ -175,14 +175,9 @@
     label_css_class = 'control-label col-md-2'
     input_css_class = 'col-md-10'
 
-    fields = field.Fields(IHTMLParagraph).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(IHTMLParagraph).omit(*PARAGRAPH_HIDDEN_FIELDS)
     edit_permission = MANAGE_CONTENT_PERMISSION
 
-    def updateWidgets(self, prefix=None):
-        super(HTMLParagraphAddForm, self).updateWidgets(prefix)
-        if 'body' in self.widgets:
-            self.widgets['body'].widget_css_class = 'textarea'
-
     def create(self, data):
         return HTMLParagraph()
 
@@ -205,7 +200,7 @@
     label_css_class = 'control-label col-md-2'
     input_css_class = 'col-md-10'
 
-    fields = field.Fields(IHTMLParagraph).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(IHTMLParagraph).omit(*PARAGRAPH_HIDDEN_FIELDS)
     fields['renderer'].widgetFactory = RendererFieldWidget
 
     edit_permission = MANAGE_CONTENT_PERMISSION
@@ -217,7 +212,6 @@
             for lang in body_widget.langs:
                 widget = body_widget.widgets[lang]
                 widget.id = '{id}_{name}'.format(id=widget.id, name=self.context.__name__)
-            body_widget.widget_css_class = 'textarea'
 
     def get_ajax_output(self, changes):
         output = super(self.__class__, self).get_ajax_output(changes)
--- a/src/pyams_content/component/paragraph/zmi/keypoint.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/paragraph/zmi/keypoint.py	Tue Jul 17 15:09:38 2018 +0200
@@ -16,7 +16,8 @@
 # import standard library
 
 # import interfaces
-from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphContainer
+from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphContainer, \
+    PARAGRAPH_HIDDEN_FIELDS
 from pyams_content.component.paragraph.interfaces.keypoint import IKeypointsParagraph, KEYPOINTS_PARAGRAPH_TYPE
 from pyams_content.component.paragraph.zmi.interfaces import IParagraphInnerEditor, IParagraphContainerView
 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
@@ -64,13 +65,13 @@
     legend = _("Add new key points paragraph")
     icon_css_class = 'fa fa-fw fa-list-ol'
 
-    fields = field.Fields(IKeypointsParagraph).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(IKeypointsParagraph).omit(*PARAGRAPH_HIDDEN_FIELDS)
     edit_permission = MANAGE_CONTENT_PERMISSION
 
     def updateWidgets(self, prefix=None):
         super(KeypointsParagraphAddForm, self).updateWidgets(prefix)
         if 'body' in self.widgets:
-            self.widgets['body'].widget_css_class = 'textarea height-100'
+            self.widgets['body'].widget_css_class = 'input height-100'
 
     def create(self, data):
         return KeypointsParagraph()
@@ -91,7 +92,7 @@
     legend = _("Edit key points paragraph properties")
     icon_css_class = 'fa fa-fw fa-list-ol'
 
-    fields = field.Fields(IKeypointsParagraph).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(IKeypointsParagraph).omit(*PARAGRAPH_HIDDEN_FIELDS)
     fields['renderer'].widgetFactory = RendererFieldWidget
 
     edit_permission = MANAGE_CONTENT_PERMISSION
@@ -99,7 +100,7 @@
     def updateWidgets(self, prefix=None):
         super(KeypointsParagraphPropertiesEditForm, self).updateWidgets(prefix)
         if 'body' in self.widgets:
-            self.widgets['body'].widget_css_class = 'textarea height-100'
+            self.widgets['body'].widget_css_class = 'input height-100'
 
 
 @adapter_config(context=(IKeypointsParagraph, IPyAMSLayer), provides=IParagraphInnerEditor)
--- a/src/pyams_content/component/paragraph/zmi/milestone.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/paragraph/zmi/milestone.py	Tue Jul 17 15:09:38 2018 +0200
@@ -17,7 +17,8 @@
 import json
 
 # import interfaces
-from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphContainer
+from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphContainer, \
+    PARAGRAPH_HIDDEN_FIELDS
 from pyams_content.component.paragraph.interfaces.milestone import MILESTONE_PARAGRAPH_TYPE, IMilestoneParagraph, \
     IMilestoneContainer, IMilestoneContainerTarget, IMilestone
 from pyams_content.component.paragraph.zmi import IParagraphContainerView, IParagraphEditFormButtons
@@ -312,7 +313,7 @@
     legend = _("Add new milestone")
     icon_css_class = 'fa fa-fw fa-arrow-h'
 
-    fields = field.Fields(IMilestone).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(IMilestone).omit(*PARAGRAPH_HIDDEN_FIELDS)
     edit_permission = MANAGE_CONTENT_PERMISSION
 
     def create(self, data):
@@ -339,7 +340,7 @@
     legend = _("Edit milestone properties")
     icon_css_class = 'fa fa-fw fa-arrows-h'
 
-    fields = field.Fields(IMilestone).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(IMilestone).omit(*PARAGRAPH_HIDDEN_FIELDS)
     edit_permission = MANAGE_CONTENT_PERMISSION
 
     def get_ajax_output(self, changes):
--- a/src/pyams_content/component/paragraph/zmi/pictogram.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/paragraph/zmi/pictogram.py	Tue Jul 17 15:09:38 2018 +0200
@@ -17,7 +17,8 @@
 import json
 
 # import interfaces
-from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphContainer
+from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphContainer, \
+    PARAGRAPH_HIDDEN_FIELDS
 from pyams_content.component.paragraph.interfaces.pictogram import PICTOGRAM_PARAGRAPH_TYPE, IPictogramParagraph, \
     IPictogramContainer, IPictogramContainerTarget, IPictogramItem
 from pyams_content.component.paragraph.zmi import IParagraphContainerView, IParagraphEditFormButtons
@@ -228,7 +229,7 @@
         if pictogram is not None:
             image = II18n(pictogram).query_attribute('image', request=self.request)
             if image:
-                return render_image(image, 48, 48, self.request)
+                return render_image(image, 48, 48, self.request, timestamp=True)
         return '--'
 
 
@@ -272,7 +273,7 @@
         value = super(PictogramsTableBodyColumn, self).getValue(obj)
         if not value:
             return BaseParagraph.empty_title
-        return get_text_start(value, 40, 10)
+        return get_text_start(value, 80, 10)
 
 
 @adapter_config(name='trash', context=(IPictogramContainerTarget, IPyAMSLayer, PictogramsTable), provides=IColumn)
@@ -317,7 +318,7 @@
     legend = _("Add new pictogram")
     icon_css_class = 'fa fa-fw fa-arrow-h'
 
-    fields = field.Fields(IPictogramItem).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(IPictogramItem).omit(*PARAGRAPH_HIDDEN_FIELDS)
     fields['pictogram_name'].widgetFactory = PictogramSelectFieldWidget
 
     edit_permission = MANAGE_CONTENT_PERMISSION
@@ -325,7 +326,7 @@
     def updateWidgets(self, prefix=None):
         super(PictogramAddForm, self).updateWidgets(prefix)
         if 'body' in self.widgets:
-            self.widgets['body'].widget_css_class = 'textarea height-100'
+            self.widgets['body'].widget_css_class = 'input height-100'
 
     def create(self, data):
         return PictogramItem()
@@ -359,7 +360,7 @@
     legend = _("Edit pictogram properties")
     icon_css_class = 'fa fa-fw fa-linode'
 
-    fields = field.Fields(IPictogramItem).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(IPictogramItem).omit(*PARAGRAPH_HIDDEN_FIELDS)
     fields['pictogram_name'].widgetFactory = PictogramSelectFieldWidget
 
     edit_permission = MANAGE_CONTENT_PERMISSION
@@ -367,7 +368,7 @@
     def updateWidgets(self, prefix=None):
         super(PictogramPropertiesEditForm, self).updateWidgets(prefix)
         if 'body' in self.widgets:
-            self.widgets['body'].widget_css_class = 'textarea height-100'
+            self.widgets['body'].widget_css_class = 'input height-100'
 
     def get_ajax_output(self, changes):
         output = super(self.__class__, self).get_ajax_output(changes)
--- a/src/pyams_content/component/paragraph/zmi/verbatim.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/paragraph/zmi/verbatim.py	Tue Jul 17 15:09:38 2018 +0200
@@ -17,7 +17,8 @@
 
 # import interfaces
 from pyams_content.component.association.zmi.interfaces import IAssociationsParentForm
-from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphContainer
+from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphContainer, \
+    PARAGRAPH_HIDDEN_FIELDS
 from pyams_content.component.paragraph.interfaces.verbatim import IVerbatimParagraph, VERBATIM_PARAGRAPH_TYPE
 from pyams_content.component.paragraph.zmi.interfaces import IParagraphInnerEditor, IParagraphContainerView
 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
@@ -69,14 +70,9 @@
     legend = _("Add new verbatim paragraph")
     icon_css_class = 'fa fa-fw fa-quote-right'
 
-    fields = field.Fields(IVerbatimParagraph).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(IVerbatimParagraph).omit(*PARAGRAPH_HIDDEN_FIELDS)
     edit_permission = MANAGE_CONTENT_PERMISSION
 
-    def updateWidgets(self, prefix=None):
-        super(VerbatimParagraphAddForm, self).updateWidgets(prefix)
-        if 'quote' in self.widgets:
-            self.widgets['quote'].widget_css_class = 'textarea'
-
     def create(self, data):
         return VerbatimParagraph()
 
@@ -96,16 +92,11 @@
     legend = _("Edit verbatim paragraph properties")
     icon_css_class = 'fa fa-fw fa-quote-right'
 
-    fields = field.Fields(IVerbatimParagraph).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(IVerbatimParagraph).omit(*PARAGRAPH_HIDDEN_FIELDS)
     fields['renderer'].widgetFactory = RendererFieldWidget
 
     edit_permission = MANAGE_CONTENT_PERMISSION
 
-    def updateWidgets(self, prefix=None):
-        super(VerbatimParagraphPropertiesEditForm, self).updateWidgets(prefix)
-        if 'quote' in self.widgets:
-            self.widgets['quote'].widget_css_class = 'textarea'
-
 
 @adapter_config(context=(IVerbatimParagraph, IPyAMSLayer), provides=IParagraphInnerEditor)
 @ajax_config(name='inner-properties.json', context=IVerbatimParagraph, layer=IPyAMSLayer,
--- a/src/pyams_content/component/paragraph/zmi/video.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/paragraph/zmi/video.py	Tue Jul 17 15:09:38 2018 +0200
@@ -17,7 +17,8 @@
 
 # import interfaces
 from pyams_content.component.association.zmi.interfaces import IAssociationsParentForm
-from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphContainer
+from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphContainer, \
+    PARAGRAPH_HIDDEN_FIELDS
 from pyams_content.component.paragraph.interfaces.video import IVideoParagraph, VIDEO_PARAGRAPH_TYPE
 from pyams_content.component.paragraph.zmi.interfaces import IParagraphInnerEditor, IParagraphContainerView
 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
@@ -67,14 +68,9 @@
     dialog_class = 'modal-large'
     icon_css_class = 'fa fa-fw fa-film'
 
-    fields = field.Fields(IVideoParagraph).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(IVideoParagraph).omit(*PARAGRAPH_HIDDEN_FIELDS)
     edit_permission = MANAGE_CONTENT_PERMISSION
 
-    def updateWidgets(self, prefix=None):
-        super(VideoParagraphAddForm, self).updateWidgets(prefix)
-        if 'description' in self.widgets:
-            self.widgets['description'].widget_css_class = 'textarea'
-
     def create(self, data):
         return VideoParagraph()
 
@@ -95,16 +91,11 @@
     dialog_class = 'modal-large'
     icon_css_class = 'fa fa-fw fa-film'
 
-    fields = field.Fields(IVideoParagraph).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(IVideoParagraph).omit(*PARAGRAPH_HIDDEN_FIELDS)
     fields['renderer'].widgetFactory = RendererFieldWidget
 
     edit_permission = MANAGE_CONTENT_PERMISSION
 
-    def updateWidgets(self, prefix=None):
-        super(VideoParagraphPropertiesEditForm, self).updateWidgets(prefix)
-        if 'description' in self.widgets:
-            self.widgets['description'].widget_css_class = 'textarea'
-
 
 @adapter_config(context=(IVideoParagraph, IPyAMSLayer), provides=IParagraphInnerEditor)
 @ajax_config(name='inner-properties.json', context=IVideoParagraph, layer=IPyAMSLayer,
--- a/src/pyams_content/component/theme/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/theme/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -17,7 +17,9 @@
 
 # import interfaces
 from pyams_content.component.theme.interfaces import IThemesManagerTarget, IThemesManager, THEMES_MANAGER_KEY, \
-    IThemesTarget, IThemesInfo, THEMES_INFO_KEY
+    IThemesTarget, IThemesInfo, THEMES_INFO_KEY, ITagsManager, ITagsManagerTarget, TAGS_MANAGER_KEY, ITagsInfo, \
+    ITagsTarget, TAGS_INFO_KEY, ICollectionsManager, ICollectionsManagerTarget, COLLECTIONS_MANAGER_KEY, \
+    ICollectionsInfo, ICollectionsTarget, COLLECTIONS_INFO_KEY
 from pyams_content.features.checker.interfaces import IContentChecker, ERROR_VALUE
 
 # import packages
@@ -31,6 +33,58 @@
 from pyams_content import _
 
 
+#
+# Tags management
+#
+
+@implementer(ITagsManager)
+class TagsManager(Persistent, Contained):
+    """Tags manager persistent class"""
+
+    thesaurus_name = FieldProperty(ITagsManager['thesaurus_name'])
+    extract_name = FieldProperty(ITagsManager['extract_name'])
+
+
+@adapter_config(context=ITagsManagerTarget, provides=ITagsManager)
+def tags_manager_factory(target):
+    """Tags manager factory"""
+    return get_annotation_adapter(target, TAGS_MANAGER_KEY, TagsManager, name='++tags-manager++')
+
+
+@implementer(ITagsInfo)
+class TagsInfo(Persistent, Contained):
+    """Tags info persistent class"""
+
+    tags = FieldProperty(ITagsInfo['tags'])
+
+
+@adapter_config(context=ITagsTarget, provides=ITagsInfo)
+def tags_info_factory(target):
+    """Tags info factory"""
+    return get_annotation_adapter(target, TAGS_INFO_KEY, TagsInfo, name='++tags++')
+
+
+@adapter_config(name='tags', context=ITagsTarget, provides=IContentChecker)
+class TagsContentChecker(BaseContentChecker):
+    """Tags info content checker"""
+
+    label = _("Tags")
+    weight = 205
+
+    def inner_check(self, request):
+        output = []
+        translate = request.localizer.translate
+        tags = ITagsInfo(self.context)
+        if not tags.tags:
+            output.append(translate(ERROR_VALUE).format(field=translate(ITagsInfo['tags'].title),
+                                                        message=translate(_("no defined tag"))))
+        return output
+
+
+#
+# Themes management
+#
+
 @implementer(IThemesManager)
 class ThemesManager(Persistent, Contained):
     """Themes manager persistent class"""
@@ -63,7 +117,7 @@
     """Themes info content checker"""
 
     label = _("Themes")
-    weight = 200
+    weight = 210
 
     def inner_check(self, request):
         output = []
@@ -73,3 +127,51 @@
             output.append(translate(ERROR_VALUE).format(field=translate(IThemesInfo['themes'].title),
                                                         message=translate(_("no defined theme"))))
         return output
+
+
+#
+# Collections management
+#
+
+@implementer(ICollectionsManager)
+class CollectionsManager(Persistent, Contained):
+    """Collections manager persistent class"""
+
+    thesaurus_name = FieldProperty(ICollectionsManager['thesaurus_name'])
+    extract_name = FieldProperty(ICollectionsManager['extract_name'])
+
+
+@adapter_config(context=ICollectionsManagerTarget, provides=ICollectionsManager)
+def collections_manager_factory(target):
+    """Collections manager factory"""
+    return get_annotation_adapter(target, COLLECTIONS_MANAGER_KEY, CollectionsManager, name='++collections-manager++')
+
+
+@implementer(ICollectionsInfo)
+class CollectionsInfo(Persistent, Contained):
+    """Collections info persistent class"""
+
+    collections = FieldProperty(ICollectionsInfo['collections'])
+
+
+@adapter_config(context=ICollectionsTarget, provides=ICollectionsInfo)
+def collections_info_factory(target):
+    """Collections info factory"""
+    return get_annotation_adapter(target, COLLECTIONS_INFO_KEY, CollectionsInfo, name='++collections++')
+
+
+@adapter_config(name='collections', context=ICollectionsTarget, provides=IContentChecker)
+class CollectionsContentChecker(BaseContentChecker):
+    """Collections info content checker"""
+
+    label = _("Collections")
+    weight = 215
+
+    def inner_check(self, request):
+        output = []
+        translate = request.localizer.translate
+        collections = ICollectionsInfo(self.context)
+        if not collections.collections:
+            output.append(translate(ERROR_VALUE).format(field=translate(ICollectionsInfo['collections'].title),
+                                                        message=translate(_("no defined collection"))))
+        return output
--- a/src/pyams_content/component/theme/interfaces/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/theme/interfaces/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -25,6 +25,51 @@
 from pyams_content import _
 
 
+#
+# Tags management
+#
+
+TAGS_MANAGER_KEY = 'pyams_content.tags.manager'
+TAGS_INFO_KEY = 'pyams_content.tags.info'
+
+
+class ITagsManager(IThesaurusContextManager):
+    """Tags manager interface"""
+
+
+class ITagsManagerTarget(IThesaurusContextManagerTarget):
+    """Marker interface for tags manager"""
+
+
+class ITagsInfo(Interface):
+    """Tags information interface"""
+
+    tags = ThesaurusTermsListField(title=_("Tags"),
+                                   required=False)
+
+
+class ITagsTarget(Interface):
+    """Tags target interface"""
+
+
+PORTLET_SETTINGS_TAGS_KEY = 'pyams_content.portlet.tags.settings'
+
+
+class IPortletTagsSettings(Interface):
+    """Interface for portlet settings managing tags"""
+
+    tags = ThesaurusTermsListField(title=_("Tags"),
+                                   required=False)
+
+
+class IPortletTagsSettingsTarget(Interface):
+    """Marker interface for portlet settings managing tags"""
+
+
+#
+# Themes management
+#
+
 THEMES_MANAGER_KEY = 'pyams_content.themes.manager'
 THEMES_INFO_KEY = 'pyams_content.themes.info'
 
@@ -54,6 +99,50 @@
 class IPortletThemesSettings(Interface):
     """Interface for portlet settings managing themes"""
 
+    themes = ThesaurusTermsListField(title=_("Themes"),
+                                     required=False)
+
 
 class IPortletThemesSettingsTarget(Interface):
     """Marker interface for portlet settings managing themes"""
+
+
+#
+# Collections management
+#
+
+COLLECTIONS_MANAGER_KEY = 'pyams_content.collections.manager'
+COLLECTIONS_INFO_KEY = 'pyams_content.collections.info'
+
+
+class ICollectionsManager(IThesaurusContextManager):
+    """Collections manager interface"""
+
+
+class ICollectionsManagerTarget(IThesaurusContextManagerTarget):
+    """Marker interface for tools managing collections"""
+
+
+class ICollectionsInfo(Interface):
+    """Collections information interface"""
+
+    collections = ThesaurusTermsListField(title=_("Collections"),
+                                          required=False)
+
+
+class ICollectionsTarget(Interface):
+    """Collections target interface"""
+
+
+PORTLET_SETTINGS_COLLECTIONS_KEY = 'pyams_content.portlet.collections.settings'
+
+
+class IPortletCollectionsSettings(Interface):
+    """Interface for portlet settings managing collections"""
+
+    collections = ThesaurusTermsListField(title=_("Collections"),
+                                          required=False)
+
+
+class IPortletCollectionsSettingsTarget(Interface):
+    """Marker interface for portlet settings managing collections"""
--- a/src/pyams_content/component/theme/portlet.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/theme/portlet.py	Tue Jul 17 15:09:38 2018 +0200
@@ -16,8 +16,10 @@
 # import standard library
 
 # import interfaces
-from pyams_content.component.theme.interfaces import IPortletThemesSettings, IPortletThemesSettingsTarget, \
-    PORTLET_SETTINGS_THEMES_KEY
+from pyams_content.component.theme.interfaces import \
+    IPortletThemesSettings, IPortletThemesSettingsTarget, PORTLET_SETTINGS_THEMES_KEY, \
+    IPortletTagsSettings, IPortletTagsSettingsTarget, PORTLET_SETTINGS_TAGS_KEY, \
+    IPortletCollectionsSettings, IPortletCollectionsSettingsTarget, PORTLET_SETTINGS_COLLECTIONS_KEY
 from zope.traversing.interfaces import ITraversable
 
 # import packages
@@ -25,17 +27,51 @@
 from pyams_utils.adapter import adapter_config, ContextAdapter, get_annotation_adapter
 from zope.container.contained import Contained
 from zope.interface import implementer
+from zope.schema.fieldproperty import FieldProperty
 
 
+#
+# Portlets tags management
+#
+
+@implementer(IPortletTagsSettings)
+class PortletTagsSettings(Persistent, Contained):
+    """Portlet tags settings"""
+
+    tags = FieldProperty(IPortletTagsSettings['tags'])
+
+
+@adapter_config(context=IPortletTagsSettingsTarget, provides=IPortletTagsSettings)
+def portlet_tags_settings_factory(context):
+    """Portlet tags settings adapter"""
+    return get_annotation_adapter(context, PORTLET_SETTINGS_TAGS_KEY, PortletTagsSettings,
+                                  name='++tags++')
+
+
+@adapter_config(name='tags', context=IPortletTagsSettingsTarget, provides=ITraversable)
+class TagsPortletsSettingsTraverser(ContextAdapter):
+    """++tags++ portlet settings adapter"""
+
+    def traverse(self, name, furtherpath=None):
+        return IPortletTagsSettings(self.context)
+
+
+#
+# Portlets themes management
+#
+
 @implementer(IPortletThemesSettings)
 class PortletThemesSettings(Persistent, Contained):
     """Portlet themes settings"""
 
+    themes = FieldProperty(IPortletThemesSettings['themes'])
+
 
 @adapter_config(context=IPortletThemesSettingsTarget, provides=IPortletThemesSettings)
 def portlet_themes_settings_factory(context):
     """Portlet themes settings adapter"""
-    return get_annotation_adapter(context, PORTLET_SETTINGS_THEMES_KEY, PortletThemesSettings, name='++themes++')
+    return get_annotation_adapter(context, PORTLET_SETTINGS_THEMES_KEY, PortletThemesSettings,
+                                  name='++themes++')
 
 
 @adapter_config(name='themes', context=IPortletThemesSettingsTarget, provides=ITraversable)
@@ -44,3 +80,29 @@
 
     def traverse(self, name, furtherpath=None):
         return IPortletThemesSettings(self.context)
+
+
+#
+# Portlets collections management
+#
+
+@implementer(IPortletCollectionsSettings)
+class PortletCollectionsSettings(Persistent, Contained):
+    """Portlet collections settings"""
+
+    collections = FieldProperty(IPortletCollectionsSettings['collections'])
+
+
+@adapter_config(context=IPortletCollectionsSettingsTarget, provides=IPortletCollectionsSettings)
+def portlet_collections_settings_factory(context):
+    """Portlet collections settings adapter"""
+    return get_annotation_adapter(context, PORTLET_SETTINGS_COLLECTIONS_KEY, PortletCollectionsSettings,
+                                  name='++collections++')
+
+
+@adapter_config(name='collections', context=IPortletCollectionsSettingsTarget, provides=ITraversable)
+class CollectionsPortletsSettingsTraverser(ContextAdapter):
+    """++collections++ portlet settings adapter"""
+
+    def traverse(self, name, furtherpath=None):
+        return IPortletCollectionsSettings(self.context)
--- a/src/pyams_content/component/theme/zmi/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/theme/zmi/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -16,35 +16,83 @@
 # import standard library
 
 # import interfaces
-from pyams_content.component.theme.interfaces import IThemesTarget, IThemesInfo, IThemesManagerTarget, IThemesManager
+from pyams_content.component.theme import ITagsTarget, ITagsInfo, ITagsManager, IThemesTarget, IThemesInfo, \
+    IThemesManagerTarget, IThemesManager, ICollectionsTarget, ICollectionsInfo, ICollectionsManager, \
+    ICollectionsManagerTarget
 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
 from pyams_form.interfaces.form import IWidgetForm
-from pyams_skin.interfaces import IInnerPage, IPageHeader
+from pyams_skin.interfaces import IInnerPage, IPageHeader, IDialog
 from pyams_skin.layer import IPyAMSLayer
-from pyams_thesaurus.interfaces.thesaurus import IThesaurus
 from pyams_utils.interfaces import VIEW_SYSTEM_PERMISSION
 from pyams_zmi.interfaces.menu import IPropertiesMenu
 from pyams_zmi.layer import IAdminLayer
 
 # import packages
 from pyams_content.shared.common.zmi import WfSharedContentHeaderAdapter
-from pyams_form.form import ajax_config
+from pyams_form.form import ajax_config, AJAXEditForm, EditForm
 from pyams_pagelet.pagelet import pagelet_config
 from pyams_skin.viewlet.menu import MenuItem
-from pyams_template.template import template_config
+from pyams_thesaurus.zmi.widget import ThesaurusTermsTreeFieldWidget
 from pyams_utils.adapter import adapter_config
-from pyams_utils.registry import query_utility
 from pyams_utils.traversing import get_parent
 from pyams_viewlet.viewlet import viewlet_config
-from pyams_zmi.form import AdminEditForm
+from pyams_zmi.form import AdminEditForm, AdminDialogEditForm
 from z3c.form import field
 from zope.interface import implementer
 
 from pyams_content import _
 
 
+#
+# Tags management
+#
+
+@viewlet_config(name='tags.menu', context=ITagsTarget, layer=IAdminLayer,
+                manager=IPropertiesMenu, permission=VIEW_SYSTEM_PERMISSION, weight=350)
+class TagsMenu(MenuItem):
+    """Tags menu"""
+
+    label = _("Tags...")
+    icon_class = 'fa-tag'
+    url = '#tags.html'
+
+
+@pagelet_config(name='tags.html', context=ITagsTarget, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
+@ajax_config(name='tags.json', context=ITagsTarget, layer=IPyAMSLayer, permission=MANAGE_CONTENT_PERMISSION)
+@implementer(IWidgetForm, IInnerPage)
+class TagsEditForm(AdminEditForm):
+    """Tags edit form"""
+
+    legend = _("Content tags")
+
+    label_css_class = 'control-label hidden'
+    input_css_class = 'col-md-12'
+
+    fields = field.Fields(ITagsInfo)
+    fields['tags'].widgetFactory = ThesaurusTermsTreeFieldWidget
+
+    def updateWidgets(self, prefix=None):
+        super(TagsEditForm, self).updateWidgets(prefix)
+        if 'tags' in self.widgets:
+            widget = self.widgets['tags']
+            manager = ITagsManager(self.request.root)
+            widget.thesaurus_name = manager.thesaurus_name
+            widget.extract_name = manager.extract_name
+
+
+@adapter_config(context=(ITagsTarget, IAdminLayer, TagsEditForm), provides=IPageHeader)
+class TagsHeaderAdapter(WfSharedContentHeaderAdapter):
+    """Shared content tags header adapter"""
+
+    icon_class = 'fa fa-fw fa-tag'
+
+
+#
+# Themes management
+#
+
 @viewlet_config(name='themes.menu', context=IThemesTarget, layer=IAdminLayer,
-                manager=IPropertiesMenu, permission=VIEW_SYSTEM_PERMISSION, weight=350)
+                manager=IPropertiesMenu, permission=VIEW_SYSTEM_PERMISSION, weight=352)
 class ThemesMenu(MenuItem):
     """Themes menu"""
 
@@ -53,49 +101,101 @@
     url = '#themes.html'
 
 
-@pagelet_config(name='themes.html', context=IThemesTarget, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
-@template_config(template='templates/themes-info.pt', layer=IPyAMSLayer)
-@ajax_config(name='themes.json', context=IThemesTarget, layer=IPyAMSLayer, permission=MANAGE_CONTENT_PERMISSION)
-@implementer(IWidgetForm, IInnerPage)
-class ThemesEditForm(AdminEditForm):
-    """Themes edit form"""
+class BaseThemesEditForm(EditForm):
+    """Base themes edit form"""
 
     legend = _("Content themes")
 
+    label_css_class = 'control-label hidden'
+    input_css_class = 'col-md-12'
+
     fields = field.Fields(IThemesInfo)
+    fields['themes'].widgetFactory = ThesaurusTermsTreeFieldWidget
+
+    edit_permission = MANAGE_CONTENT_PERMISSION
+
+    def updateWidgets(self, prefix=None):
+        super(BaseThemesEditForm, self).updateWidgets(prefix)
+        if 'themes' in self.widgets:
+            widget = self.widgets['themes']
+            target = get_parent(self.context, IThemesManagerTarget)
+            manager = IThemesManager(target)
+            widget.thesaurus_name = manager.thesaurus_name
+            widget.extract_name = manager.extract_name
+
+
+@adapter_config(context=(IThemesTarget, IAdminLayer, BaseThemesEditForm), provides=IPageHeader)
+class ThemesHeaderAdapter(WfSharedContentHeaderAdapter):
+    """Shared content themes header adapter"""
+
+    icon_class = 'fa fa-fw fa-tags'
+
+
+@pagelet_config(name='themes.html', context=IThemesTarget, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
+@ajax_config(name='themes.json', context=IThemesTarget, layer=IPyAMSLayer, base=AJAXEditForm)
+@implementer(IWidgetForm, IInnerPage)
+class ThemesEditForm(BaseThemesEditForm, AdminEditForm):
+    """Themes edit form"""
+
+
+@pagelet_config(name='themes-dialog.html', context=IThemesTarget, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
+@ajax_config(name='themes-dialog.json', context=IThemesTarget, layer=IPyAMSLayer, base=AJAXEditForm)
+@implementer(IDialog)
+class DialogThemesEditForm(BaseThemesEditForm, AdminDialogEditForm):
+    """Dialog themes edit form"""
+
+    dialog_class = 'modal-large'
+
+
+#
+# Collections management
+#
+
+@viewlet_config(name='collections.menu', context=ICollectionsTarget, layer=IAdminLayer,
+                manager=IPropertiesMenu, permission=VIEW_SYSTEM_PERMISSION, weight=354)
+class CollectionsMenu(MenuItem):
+    """Collections menu"""
+
+    label = _("Collections...")
+    icon_class = 'fa-book'
+    url = '#collections.html'
+
+
+@pagelet_config(name='collections.html', context=ICollectionsTarget, layer=IPyAMSLayer,
+                permission=VIEW_SYSTEM_PERMISSION)
+@ajax_config(name='collections.json', context=ICollectionsTarget, layer=IPyAMSLayer,
+             permission=MANAGE_CONTENT_PERMISSION)
+@implementer(IWidgetForm, IInnerPage)
+class CollectionsEditForm(AdminEditForm):
+    """Collections edit form"""
+
+    legend = _("Content collections")
+
+    label_css_class = 'control-label hidden'
+    input_css_class = 'col-md-12'
+
+    fields = field.Fields(ICollectionsInfo)
+    fields['collections'].widgetFactory = ThesaurusTermsTreeFieldWidget
 
     def __init__(self, context, request):
-        super(ThemesEditForm, self).__init__(context, request)
-        target = get_parent(self.context, IThemesManagerTarget)
-        manager = IThemesManager(target)
+        super(CollectionsEditForm, self).__init__(context, request)
+        target = get_parent(self.context, ICollectionsManagerTarget)
+        manager = ICollectionsManager(target)
         self.thesaurus_name = manager.thesaurus_name
         self.extract_name = manager.extract_name
 
     def updateWidgets(self, prefix=None):
-        super(ThemesEditForm, self).updateWidgets(prefix)
-        widget = self.widgets['themes']
-        widget.thesaurus_name = self.thesaurus_name
-        widget.extract_name = self.extract_name
-
-    @property
-    def top_terms(self):
-        thesaurus = query_utility(IThesaurus, name=self.thesaurus_name)
-        if thesaurus is not None:
-            return sorted(thesaurus.get_top_terms(extract=self.extract_name),
-                          key=lambda x: x.label)
-        else:
-            return ()
-
-    def get_subterms(self, term):
-        for subterm in term.specifics:
-            if (not self.extract_name) or (self.extract_name in subterm.extracts):
-                yield subterm
-                for another in self.get_subterms(subterm):
-                    yield another
+        super(CollectionsEditForm, self).updateWidgets(prefix)
+        if 'collections' in self.widgets:
+            widget = self.widgets['collections']
+            target = get_parent(self.context, ICollectionsManagerTarget)
+            manager = ICollectionsManager(target)
+            widget.thesaurus_name = manager.thesaurus_name
+            widget.extract_name = manager.extract_name
 
 
-@adapter_config(context=(IThemesTarget, IAdminLayer, ThemesEditForm), provides=IPageHeader)
-class ThemesHeaderAdapter(WfSharedContentHeaderAdapter):
-    """Shared content themes header adapter"""
+@adapter_config(context=(ICollectionsTarget, IAdminLayer, CollectionsEditForm), provides=IPageHeader)
+class CollectionsHeaderAdapter(WfSharedContentHeaderAdapter):
+    """Shared content collections header adapter"""
 
-    icon_class = 'fa fa-fw fa-tags'
+    icon_class = 'fa fa-fw fa-book'
--- a/src/pyams_content/component/theme/zmi/manager.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/theme/zmi/manager.py	Tue Jul 17 15:09:38 2018 +0200
@@ -9,6 +9,7 @@
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE.
 #
+from pyams_content.component.theme import ICollectionsManagerTarget, ICollectionsManager
 
 __docformat__ = 'restructuredtext'
 
@@ -16,8 +17,9 @@
 # import standard library
 
 # import interfaces
-from pyams_content.component.theme.interfaces import IThemesManagerTarget, IThemesManager
-from pyams_content.interfaces import MANAGE_TOOL_PERMISSION
+from pyams_content.component.theme.interfaces import ITagsManagerTarget, ITagsManager, IThemesManagerTarget, \
+    IThemesManager
+from pyams_content.interfaces import MANAGE_TOOL_PERMISSION, MANAGE_SITE_ROOT_PERMISSION
 from pyams_skin.layer import IPyAMSLayer
 from pyams_utils.interfaces.data import IObjectData
 from pyams_zmi.interfaces.menu import IPropertiesMenu
@@ -37,8 +39,62 @@
 from pyams_content import _
 
 
+#
+# Tags management view
+#
+
+@viewlet_config(name='tags-manager.menu', context=ITagsManagerTarget, layer=IAdminLayer,
+                manager=IPropertiesMenu, permission=MANAGE_SITE_ROOT_PERMISSION, weight=40)
+class TagsManagerMenu(MenuItem):
+    """Tags menu"""
+
+    label = _("Tags settings...")
+    icon_class = 'fa-tag'
+    url = 'tags.html'
+    modal_target = True
+
+
+@pagelet_config(name='tags.html', context=ITagsManagerTarget, layer=IPyAMSLayer,
+                permission=MANAGE_TOOL_PERMISSION)
+@ajax_config(name='tags.json', context=ITagsManagerTarget, layer=IPyAMSLayer)
+class TagsManagerEditForm(AdminDialogEditForm):
+    """Tags manager edit form"""
+
+    prefix = 'manager_themes.'
+
+    legend = _("Selected tags")
+
+    fields = field.Fields(ITagsManager)
+    edit_permission = MANAGE_SITE_ROOT_PERMISSION
+
+    def getContent(self):
+        return ITagsManager(self.context)
+
+    def updateWidgets(self, prefix=None):
+        super(TagsManagerEditForm, self).updateWidgets(prefix)
+        widget = self.widgets['thesaurus_name']
+        widget.object_data = {
+            'ams-plugins': 'pyams_content',
+            'ams-plugin-pyams_content-src': get_resource_path(pyams_content),
+            'ams-plugin-pyams_content-callback': 'PyAMS_content.themes.initExtracts',
+            'ams-plugin-pyams_content-async': 'false'
+        }
+        alsoProvides(widget, IObjectData)
+        widget = self.widgets['extract_name']
+        widget.object_data = {
+            'ams-events-handlers': {
+                'select2-open': 'PyAMS_content.themes.getExtracts'
+            }
+        }
+        alsoProvides(widget, IObjectData)
+
+
+#
+# Themes management view
+#
+
 @viewlet_config(name='themes-manager.menu', context=IThemesManagerTarget, layer=IAdminLayer,
-                manager=IPropertiesMenu, permission=MANAGE_TOOL_PERMISSION, weight=40)
+                manager=IPropertiesMenu, permission=MANAGE_TOOL_PERMISSION, weight=41)
 class ThemesManagerMenu(MenuItem):
     """Themes menu"""
 
@@ -61,14 +117,73 @@
     fields = field.Fields(IThemesManager)
     edit_permission = MANAGE_TOOL_PERMISSION
 
+    def getContent(self):
+        return IThemesManager(self.context)
+
     def updateWidgets(self, prefix=None):
         super(ThemesManagerEditForm, self).updateWidgets(prefix)
-        if 'extract_name' in self.widgets:
-            widget = self.widgets['extract_name']
-            widget.object_data = {
-                'ams-plugins': 'pyams_content',
-                'ams-plugin-pyams_content-src': get_resource_path(pyams_content),
-                'ams-plugin-pyams_content-callback': 'PyAMS_content.themes.initExtracts',
-                'ams-plugin-pyams_content-async': 'false'
+        widget = self.widgets['thesaurus_name']
+        widget.object_data = {
+            'ams-plugins': 'pyams_content',
+            'ams-plugin-pyams_content-src': get_resource_path(pyams_content),
+            'ams-plugin-pyams_content-callback': 'PyAMS_content.themes.initExtracts',
+            'ams-plugin-pyams_content-async': 'false'
+        }
+        alsoProvides(widget, IObjectData)
+        widget = self.widgets['extract_name']
+        widget.object_data = {
+            'ams-events-handlers': {
+                'select2-open': 'PyAMS_content.themes.getExtracts'
             }
-            alsoProvides(widget, IObjectData)
+        }
+        alsoProvides(widget, IObjectData)
+
+
+#
+# Collections management view
+#
+
+@viewlet_config(name='collections-manager.menu', context=ICollectionsManagerTarget, layer=IAdminLayer,
+                manager=IPropertiesMenu, permission=MANAGE_TOOL_PERMISSION, weight=42)
+class CollectionsManagerMenu(MenuItem):
+    """Collections menu"""
+
+    label = _("Collections settings...")
+    icon_class = 'fa-book'
+    url = 'collections.html'
+    modal_target = True
+
+
+@pagelet_config(name='collections.html', context=ICollectionsManagerTarget, layer=IPyAMSLayer,
+                permission=MANAGE_TOOL_PERMISSION)
+@ajax_config(name='collections.json', context=ICollectionsManagerTarget, layer=IPyAMSLayer)
+class CollectionsManagerEditForm(AdminDialogEditForm):
+    """Collections manager edit form"""
+
+    prefix = 'manager_themes.'
+
+    legend = _("Selected collections")
+
+    fields = field.Fields(ICollectionsManager)
+    edit_permission = MANAGE_TOOL_PERMISSION
+
+    def getContent(self):
+        return ICollectionsManager(self.context)
+
+    def updateWidgets(self, prefix=None):
+        super(CollectionsManagerEditForm, self).updateWidgets(prefix)
+        widget = self.widgets['thesaurus_name']
+        widget.object_data = {
+            'ams-plugins': 'pyams_content',
+            'ams-plugin-pyams_content-src': get_resource_path(pyams_content),
+            'ams-plugin-pyams_content-callback': 'PyAMS_content.collections.initExtracts',
+            'ams-plugin-pyams_content-async': 'false'
+        }
+        alsoProvides(widget, IObjectData)
+        widget = self.widgets['extract_name']
+        widget.object_data = {
+            'ams-events-handlers': {
+                'select2-open': 'PyAMS_content.themes.getExtracts'
+            }
+        }
+        alsoProvides(widget, IObjectData)
--- a/src/pyams_content/component/theme/zmi/portlet.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/theme/zmi/portlet.py	Tue Jul 17 15:09:38 2018 +0200
@@ -16,7 +16,8 @@
 # import standard library
 
 # import interfaces
-from pyams_content.component.theme.interfaces import IPortletThemesSettingsTarget
+from pyams_content.component.theme.interfaces import IPortletTagsSettingsTarget, IPortletThemesSettingsTarget, \
+    IPortletCollectionsSettingsTarget, IPortletTagsSettings, IPortletThemesSettings, IPortletCollectionsSettings
 from pyams_form.interfaces.form import IInnerTabForm
 from pyams_skin.layer import IPyAMSLayer
 
@@ -25,11 +26,25 @@
 from pyams_utils.adapter import adapter_config
 from pyams_zmi.form import InnerAdminEditForm
 from z3c.form import field
-from zope.interface import Interface
 
 from pyams_content import _
 
 
+@adapter_config(name='tags', context=(IPortletTagsSettingsTarget, IPyAMSLayer, PortletSettingsEditor),
+                provides=IInnerTabForm)
+class PortletSettingsTagsEditor(InnerAdminEditForm):
+    """Portlet settings for tags"""
+
+    prefix = 'tags_form.'
+
+    tab_label = _("Tags")
+    legend = None
+
+    fields = field.Fields(IPortletTagsSettings)
+
+    weight = 50
+
+
 @adapter_config(name='themes', context=(IPortletThemesSettingsTarget, IPyAMSLayer, PortletSettingsEditor),
                 provides=IInnerTabForm)
 class PortletSettingsThemesEditor(InnerAdminEditForm):
@@ -40,6 +55,21 @@
     tab_label = _("Themes")
     legend = None
 
-    fields = field.Fields(Interface)
+    fields = field.Fields(IPortletThemesSettings)
+
+    weight = 52
+
 
-    weight = 50
+@adapter_config(name='collections', context=(IPortletCollectionsSettingsTarget, IPyAMSLayer, PortletSettingsEditor),
+                provides=IInnerTabForm)
+class PortletSettingsCollectionsEditor(InnerAdminEditForm):
+    """Portlet settings for collections"""
+
+    prefix = 'collections_form.'
+
+    tab_label = _("Collections")
+    legend = None
+
+    fields = field.Fields(IPortletCollectionsSettings)
+
+    weight = 54
--- a/src/pyams_content/component/theme/zmi/templates/themes-info.pt	Mon Jun 25 17:26:50 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,102 +0,0 @@
-<div class="ams-widget">
-	<header>
-		<span tal:condition="view.widget_icon_class | nothing"
-			  class="widget-icon"><i tal:attributes="class view.widget_icon_class"></i>
-		</span>
-		<h2 tal:content="view.legend"></h2>
-		<tal:var content="structure provider:pyams.widget_title" />
-		<tal:var content="structure provider:pyams.toolbar" />
-	</header>
-	<div class="widget-body no-padding">
-		<div tal:define="prefix provider:form_prefix"
-			 tal:replace="structure prefix">Form prefix</div>
-		<tal:var content="structure provider:content_help" />
-		<form method="post"
-			  data-async
-			  tal:attributes="id view.id;
-							  name view.name;
-							  action view.get_form_action();
-							  method view.method;
-							  enctype view.enctype;
-							  acceptCharset view.acceptCharset;
-							  accept view.accept;
-							  autocomplete view.autocomplete;
-							  class view.css_class;
-							  data-ams-data extension:object_data(view);
-							  data-ams-form-handler view.get_ajax_handler() | nothing;
-							  data-ams-form-options view.get_form_options() | nothing;
-							  data-ams-form-submit-target view.form_target | nothing;
-							  data-ams-form-download-target view.download_target | nothing;
-							  data-ams-warn-on-change view.warn_on_change;">
-			<div class="modal-viewport">
-				<fieldset>
-					<div class="widgets-prefix"
-						 tal:define="prefix provider:widgets_prefix"
-						 tal:condition="prefix"
-						 tal:content="structure prefix">Widgets prefix</div>
-					<tal:loop repeat="term view.top_terms">
-						<div class="col col-xs-6 col-sm-4 col-md-4 col-lg-3">
-							<div class="ams-widget" data-ams-widget-toggle-button="false"
-								 tal:attributes="id string:them_${repeat['term'].index()}">
-								<header class="no-margin"><h2 tal:content="term.label"></h2></header>
-								<div class="widget-body no-padding viewport-y viewport-200 viewport-x-none"
-									 style="height: 200px; width: calc(100% - 2px);">
-									<tal:loop repeat="subterm view.get_subterms(term)">
-										<div tal:define="padding (subterm.level - 1) * 20"
-											 tal:attributes="style string:padding-left: ${padding}px;; line-height: 1em;;">
-											<input type="checkbox" name="form.widgets.themes:list"
-												   tal:attributes="id string:term_${subterm.label};
-																   value subterm.label;
-																   checked subterm.label in view.widgets['themes'].value" />
-											<label tal:attributes="for string:term_${subterm.label}"
-												   tal:content="subterm.label"></label>
-										</div>
-									</tal:loop>
-								</div>
-							</div>
-						</div>
-					</tal:loop>
-					<div class="widgets-suffix"
-						 tal:define="suffix provider:widgets_suffix"
-						 tal:condition="suffix"
-						 tal:content="structure suffix">Widgets suffix</div>
-					<div class="subforms"
-						 tal:condition="view.subforms">
-						<fieldset tal:define="title view.subforms_legend"
-								  tal:omit-tag="not:title">
-							<legend tal:condition="title" tal:content="title" i18n:translate="">Title</legend>
-							<tal:loop repeat="subform view.subforms">
-								<tal:var replace="structure subform.render()" />
-							</tal:loop>
-						</fieldset>
-					</div>
-					<div class="tabforms"
-						 tal:condition="view.tabforms">
-						<ul class="nav nav-tabs">
-							<li tal:repeat="tabform view.tabforms"
-								tal:attributes="class 'small {active} {errors}'.format(active='active' if repeat['tabform'].start() else '',
-																					   errors='state-error' if tabform.widgets.errors else '')">
-								<a data-toggle="tab"
-								   tal:attributes="href string:#${tabform.id}"
-								   tal:content="tabform.tab_label" i18n:translate="">Tab label</a>
-							</li>
-						</ul>
-						<div class="tab-content">
-							<div class="tab-pane fade in"
-								 tal:repeat="tabform view.tabforms"
-								 tal:attributes="id tabform.id;
-												 class 'tab-pane {active} fade in'.format(active='active' if repeat['tabform'].start() else '');"
-								 tal:content="structure tabform.render()"></div>
-						</div>
-					</div>
-				</fieldset>
-			</div>
-			<footer tal:condition="view.actions and (view.is_dialog or (view.mode == 'input'))">
-				<button tal:repeat="action view.actions.values()"
-						tal:replace="structure action.render()">Action</button>
-			</footer>
-		</form>
-		<div tal:define="prefix provider:form_suffix"
-			 tal:replace="structure prefix">Form suffix</div>
-	</div>
-</div>
--- a/src/pyams_content/component/video/interfaces/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/video/interfaces/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -51,7 +51,7 @@
 
     author = TextLine(title=_("Author"),
                       description=_("Name of document's author"),
-                      required=False)
+                      required=True)
 
     provider_name = Choice(title=_("Video provider"),
                            description=_("Name of external platform providing selected video"),
--- a/src/pyams_content/component/video/zmi/paragraph.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/component/video/zmi/paragraph.py	Tue Jul 17 15:09:38 2018 +0200
@@ -81,8 +81,6 @@
 
     def updateWidgets(self, prefix=None):
         super(ExternalVideoParagraphAddForm, self).updateWidgets(prefix)
-        if 'description' in self.widgets:
-            self.widgets['description'].widget_css_class = 'textarea'
         if 'provider_name' in self.widgets:
             widget = self.widgets['provider_name']
             widget.object_data = {
@@ -142,7 +140,6 @@
 
     def updateGroups(self):
         if 'integration_code' in self.widgets:  # custom video provider
-            self.widgets['integration_code'].widget_css_class = 'textarea'
             self.add_group(NamedWidgetsGroup(self, 'integration_code', self.widgets, ('integration_code', ),
                                              bordered=False))
         elif 'video_id' in self.widgets:
@@ -206,8 +203,6 @@
 
     def updateWidgets(self, prefix=None):
         super(ExternalVideoParagraphPropertiesEditForm, self).updateWidgets(prefix)
-        if 'description' in self.widgets:
-            self.widgets['description'].widget_css_class = 'textarea'
         if 'provider_name' in self.widgets:
             self.widgets['provider_name'].mode = DISPLAY_MODE
 
@@ -216,7 +211,6 @@
             provider = self.context.get_provider()
             if provider is not None:
                 if 'integration_code' in self.widgets:  # custom video provider
-                    self.widgets['integration_code'].widget_css_class = 'textarea'
                     self.add_group(NamedWidgetsGroup(self, 'integration_code', self.widgets, ('integration_code',),
                                                      bordered=False))
                 elif 'video_id' in self.widgets:
--- a/src/pyams_content/features/alert/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/features/alert/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -23,7 +23,7 @@
 from pyams_form.interfaces.form import IFormContextPermissionChecker
 
 # import packages
-from pyams_sequence.utility import get_reference_target
+from pyams_sequence.reference import get_reference_target
 from pyams_utils.adapter import adapter_config, ContextAdapter
 from pyams_utils.registry import query_utility
 from pyams_utils.zodb import volatile_property
@@ -61,9 +61,16 @@
         table = query_utility(IPictogramTable)
         return table.get(self.pictogram_name)
 
-    def get_target(self):
+    @volatile_property
+    def target(self):
         return get_reference_target(self.reference)
 
+    def get_target(self, state=None):
+        if not state:
+            return self.target
+        else:
+            return get_reference_target(self.reference)
+
 
 @adapter_config(context=IAlertItem, provides=IFormContextPermissionChecker)
 class AlertitemPermissionChecker(ContextAdapter):
--- a/src/pyams_content/features/alert/container.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/features/alert/container.py	Tue Jul 17 15:09:38 2018 +0200
@@ -46,7 +46,7 @@
             index_object(value)
 
     def get_visible_items(self):
-        return filter(lambda x: IAlertItem(x).visible, self.values())
+        yield from filter(lambda x: IAlertItem(x).visible, self.values())
 
 
 @adapter_config(context=IAlertTarget, provides=IAlertContainer)
--- a/src/pyams_content/features/alert/interfaces.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/features/alert/interfaces.py	Tue Jul 17 15:09:38 2018 +0200
@@ -24,7 +24,7 @@
 
 # import packages
 from pyams_i18n.schema import I18nTextLineField
-from pyams_sequence.schema import InternalReference
+from pyams_sequence.schema import InternalReferenceField
 from zope.container.constraints import containers, contains
 from zope.interface import Interface, Attribute
 from zope.schema import Bool, Choice, Datetime, Int
@@ -70,11 +70,11 @@
                                 description=_("Alert message"),
                                 required=True)
 
-    reference = InternalReference(title=_("Internal reference"),
-                                  description=_("Internal link target reference. You can search a reference using "
+    reference = InternalReferenceField(title=_("Internal reference"),
+                                       description=_("Internal link target reference. You can search a reference using "
                                                 "'+' followed by internal number, of by entering text matching "
                                                 "content title."),
-                                  required=False)
+                                       required=False)
 
     pictogram_name = Choice(title=_("Pictogram"),
                             description=_("Name of the pictogram to select"),
@@ -98,9 +98,6 @@
                            min=0,
                            default=48)
 
-    def get_target(self):
-        """Get internal reference target"""
-
 
 class IAlertContainer(IOrderedContainer):
     """Alert container interface"""
--- a/src/pyams_content/features/footer/skin/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/features/footer/skin/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -14,16 +14,23 @@
 
 
 # import standard library
+import logging
+logger = logging.getLogger('PyAMS (content)')
 
 # import interfaces
 from pyams_content.features.footer.interfaces import IFooterTarget, IFooterRenderer, IFooterSettings
 from pyams_content.features.renderer.interfaces import HIDDEN_RENDERER_NAME
+from pyams_portal.interfaces import PREVIEW_MODE
 from pyams_skin.layer import IPyAMSLayer
+from pyams_utils.interfaces import ICacheKeyValue
 from pyams_utils.interfaces.url import DISPLAY_CONTEXT
 
 # import packages
+from pyams_cache.beaker import get_cache
 from pyams_content.features.renderer.skin import BaseContentRenderer
+from pyams_portal.portlet import PORTLETS_CACHE_REGION, PORTLETS_CACHE_NAME, PORTLETS_CACHE_KEY
 from pyams_utils.adapter import adapter_config
+from pyams_utils.traversing import get_parent
 from pyramid.decorator import reify
 
 from pyams_content import _
@@ -33,17 +40,41 @@
     """Base footer renderer"""
 
     @reify
+    def settings_target(self):
+        context = self.request.annotations.get(DISPLAY_CONTEXT)
+        if context is None:
+            context = self.context
+        return get_parent(context, IFooterTarget)
+
+    @reify
     def settings(self):
         if self.settings_interface is None:
             return None
-        context = self.request.annotations.get(DISPLAY_CONTEXT)
-        if context is None:
-            context = self.context
-        settings = IFooterSettings(context)
+        target = self.settings_target
+        settings = IFooterSettings(target)
         while settings.inherit:
             settings = IFooterSettings(settings.parent)
         return settings.settings
 
+    def render(self):
+        preview_mode = self.request.annotations.get(PREVIEW_MODE, False)
+        if preview_mode:
+            return super(BaseFooterRenderer, self).render()
+        else:
+            portlets_cache = get_cache(PORTLETS_CACHE_REGION, PORTLETS_CACHE_NAME)
+            cache_key = PORTLETS_CACHE_KEY.format(portlet=self.name,
+                                                  context=ICacheKeyValue(self.settings_target))
+            if self.context is not self.request.context:  # display shared content
+                cache_key = '{0}::shared'.format(cache_key)
+            try:
+                result = portlets_cache.get_value(cache_key)
+                logger.debug("Retrieving header content from cache key {0}".format(cache_key))
+            except KeyError:
+                result = super(BaseFooterRenderer, self).render()
+                portlets_cache.set_value(cache_key, result)
+                logger.debug("Storing header content for cache key {0}".format(cache_key))
+            return result
+
 
 @adapter_config(name=HIDDEN_RENDERER_NAME, context=(IFooterTarget, IPyAMSLayer), provides=IFooterRenderer)
 class HiddenFooterRenderer(BaseFooterRenderer):
--- a/src/pyams_content/features/header/skin/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/features/header/skin/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -14,16 +14,24 @@
 
 
 # import standard library
+import logging
+logger = logging.getLogger('PyAMS (content)')
 
 # import interfaces
 from pyams_content.features.header.interfaces import IHeaderTarget, IHeaderRenderer, IHeaderSettings
+from pyams_content.features.header.skin.interfaces import IHeaderClass
 from pyams_content.features.renderer.interfaces import HIDDEN_RENDERER_NAME
+from pyams_portal.interfaces import PREVIEW_MODE
 from pyams_skin.layer import IPyAMSLayer
+from pyams_utils.interfaces import ICacheKeyValue
 from pyams_utils.interfaces.url import DISPLAY_CONTEXT
 
 # import packages
+from pyams_cache.beaker import get_cache
 from pyams_content.features.renderer.skin import BaseContentRenderer
+from pyams_portal.portlet import PORTLETS_CACHE_REGION, PORTLETS_CACHE_NAME, PORTLETS_CACHE_KEY
 from pyams_utils.adapter import adapter_config
+from pyams_utils.traversing import get_parent
 from pyramid.decorator import reify
 
 from pyams_content import _
@@ -33,17 +41,46 @@
     """Base header renderer"""
 
     @reify
+    def settings_target(self):
+        context = self.request.annotations.get(DISPLAY_CONTEXT)
+        if context is None:
+            context = self.context
+        return get_parent(context, IHeaderTarget)
+
+    @reify
     def settings(self):
         if self.settings_interface is None:
             return None
-        context = self.request.annotations.get(DISPLAY_CONTEXT)
-        if context is None:
-            context = self.context
-        settings = IHeaderSettings(context)
+        target = self.settings_target
+        settings = IHeaderSettings(target)
         while settings.inherit:
             settings = IHeaderSettings(settings.parent)
         return settings.settings
 
+    @property
+    def main_header_class(self):
+        request = self.request
+        return request.registry.queryMultiAdapter((request.context, request), IHeaderClass, default='')
+
+    def render(self):
+        preview_mode = self.request.annotations.get(PREVIEW_MODE, False)
+        if preview_mode:
+            return super(BaseHeaderRenderer, self).render()
+        else:
+            portlets_cache = get_cache(PORTLETS_CACHE_REGION, PORTLETS_CACHE_NAME)
+            cache_key = PORTLETS_CACHE_KEY.format(portlet=self.name,
+                                                  context=ICacheKeyValue(self.settings_target))
+            if self.context is not self.request.context:  # display shared content
+                cache_key = '{0}::shared'.format(cache_key)
+            try:
+                result = portlets_cache.get_value(cache_key)
+                logger.debug("Retrieving header content from cache key {0}".format(cache_key))
+            except KeyError:
+                result = super(BaseHeaderRenderer, self).render()
+                portlets_cache.set_value(cache_key, result)
+                logger.debug("Storing header content for cache key {0}".format(cache_key))
+            return result
+
 
 @adapter_config(name=HIDDEN_RENDERER_NAME, context=(IHeaderTarget, IPyAMSLayer), provides=IHeaderRenderer)
 class HiddenHeaderRenderer(BaseHeaderRenderer):
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_content/features/header/skin/interfaces.py	Tue Jul 17 15:09:38 2018 +0200
@@ -0,0 +1,25 @@
+#
+# Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+
+# import packages
+from zope.interface import Interface
+
+
+class IHeaderClass(Interface):
+    """Custom header CSS class"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_content/features/html/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -0,0 +1,53 @@
+#
+# Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+from pyquery import PyQuery
+
+# import interfaces
+from pyams_sequence.interfaces import ISequentialIntIds
+from pyams_utils.interfaces.text import IHTMLRenderer
+from pyams_utils.interfaces.url import DISPLAY_CONTEXT
+from pyams_workflow.interfaces import IWorkflowPublicationInfo
+from pyramid.interfaces import IRequest
+
+# import packages
+from pyams_sequence.reference import get_reference_target
+from pyams_utils.adapter import adapter_config, ContextRequestAdapter
+from pyams_utils.registry import get_utility
+from pyams_utils.url import relative_url
+
+
+@adapter_config(name='oid_to_href', context=(str, IRequest), provides=IHTMLRenderer)
+class OIDHTMLRenderer(ContextRequestAdapter):
+    """An HTML renderer converting all "oid://" URLs to internal relative links"""
+
+    def render(self):
+        context = self.request.annotations.get(DISPLAY_CONTEXT, self.request.context)
+        html = PyQuery('<div>{0}</div>'.format(self.context))
+        sequence = get_utility(ISequentialIntIds)
+        for link in html('a[href]'):
+            href = link.attrib['href']
+            if href.startswith('oid://'):
+                oid = sequence.get_full_oid(href.split('//', 1)[1])
+                target = get_reference_target(oid, request=self.request)
+                if target is not None:
+                    publication_info = IWorkflowPublicationInfo(target, None)
+                    if (publication_info is not None) and publication_info.is_visible(self.request):
+                        link.attrib['href'] = relative_url(target, self.request, context)
+                        continue
+                # invalid link => remove href!
+                del link.attrib['href']
+        return html.html()
--- a/src/pyams_content/features/menu/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/features/menu/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -20,6 +20,8 @@
 
 # import packages
 from pyams_content.component.association.container import AssociationContainer
+from pyams_sequence.reference import get_reference_target
+from pyams_utils.zodb import volatile_property
 from zope.interface import implementer
 from zope.schema.fieldproperty import FieldProperty
 
@@ -34,11 +36,22 @@
 
     visible = FieldProperty(IMenu['visible'])
     title = FieldProperty(IMenu['title'])
+    reference = FieldProperty(IMenu['reference'])
+
+    @volatile_property
+    def target(self):
+        return get_reference_target(self.reference)
+
+    def get_target(self, state=None):
+        if not state:
+            return self.target
+        else:
+            return get_reference_target(self.reference)
 
 
 @implementer(IMenusContainer)
 class MenusContainer(AssociationContainer):
     """Associations menus container"""
 
-    def get_visible_items(self):
-        return filter(lambda x: IMenu(x).visible, self.values())
+    def get_visible_items(self, request=None):
+        yield from filter(lambda x: IMenu(x).visible, self.values())
--- a/src/pyams_content/features/menu/interfaces/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/features/menu/interfaces/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -17,10 +17,11 @@
 
 # import interfaces
 from pyams_content.component.association.interfaces import IAssociationContainer, IAssociationContainerTarget
-from zope.annotation.interfaces import IAttributeAnnotatable
+from pyams_sequence.interfaces import IInternalReference
 
 # import packages
 from pyams_i18n.schema import I18nTextLineField
+from pyams_sequence.schema import InternalReferenceField
 from zope.container.constraints import containers, contains
 from zope.interface import Interface
 from zope.schema import Bool
@@ -50,7 +51,7 @@
     """Menu links container marker interface"""
 
 
-class IMenu(IMenuLinksContainer):
+class IMenu(IMenuLinksContainer, IInternalReference):
     """Menu container interface"""
 
     containers('.IMenusContainer')
@@ -64,6 +65,10 @@
                               description=_("Displayed menu label"),
                               required=True)
 
+    reference = InternalReferenceField(title=_("Internal reference"),
+                                       description=_("Direct reference to menu target"),
+                                       required=False)
+
 
 class IMenusContainer(IAssociationContainer):
     """Menus container interface"""
--- a/src/pyams_content/features/menu/portlet/navigation/zmi/double.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/features/menu/portlet/navigation/zmi/double.py	Tue Jul 17 15:09:38 2018 +0200
@@ -16,7 +16,6 @@
 # import standard library
 
 # import interfaces
-from pyams_content.component.illustration.interfaces import IIllustration, ILinkIllustration
 from pyams_content.component.links.interfaces import IInternalLink
 from pyams_content.features.menu.portlet.navigation.interfaces.double import IDoubleNavigationPortletSettings, \
     IDoubleNavigationMenusContainer
@@ -89,16 +88,3 @@
             return True
         target = link.get_target()
         return (target is not None) and IWorkflowPublicationInfo(target).is_published()
-
-    @classmethod
-    def get_link_illustration(cls, link):
-        illustration = IIllustration(link, None)
-        if (illustration is None) or not illustration.has_data():
-            if IInternalLink.providedBy(link):
-                target = link.get_target()
-                if target is None:
-                    return
-                illustration = ILinkIllustration(target, None)
-                if (illustration is None) or not illustration.has_data():
-                    illustration = IIllustration(target, None)
-        return illustration
--- a/src/pyams_content/features/menu/portlet/navigation/zmi/simple.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/features/menu/portlet/navigation/zmi/simple.py	Tue Jul 17 15:09:38 2018 +0200
@@ -16,7 +16,6 @@
 # import standard library
 
 # import interfaces
-from pyams_content.component.illustration.interfaces import IIllustration, ILinkIllustration
 from pyams_content.component.links.interfaces import IInternalLink
 from pyams_content.features.menu.portlet.navigation.interfaces.simple import ISimpleNavigationPortletSettings, \
     ISimpleNavigationMenu
@@ -89,16 +88,3 @@
             return True
         target = link.get_target()
         return (target is not None) and IWorkflowPublicationInfo(target).is_published()
-
-    @classmethod
-    def get_link_illustration(cls, link):
-        illustration = IIllustration(link, None)
-        if (illustration is None) or not illustration.has_data():
-            if IInternalLink.providedBy(link):
-                target = link.get_target()
-                if target is None:
-                    return
-                illustration = ILinkIllustration(target, None)
-                if (illustration is None) or not illustration.has_data():
-                    illustration = IIllustration(target, None)
-        return illustration
--- a/src/pyams_content/features/menu/portlet/navigation/zmi/templates/double-preview.pt	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/features/menu/portlet/navigation/zmi/templates/double-preview.pt	Tue Jul 17 15:09:38 2018 +0200
@@ -1,22 +1,19 @@
-<div tal:define="settings view.settings">
+<div tal:define="settings view.settings" i18n:domain="pyams_content">
 	<strong tal:content="i18n:settings.title">Title</strong>
 	<tal:var define="subtitle i18n:settings.subtitle" condition="subtitle" content="subtitle" />
 	<ul>
-		<li tal:repeat="menu settings.menus.get_visible_items()">
+		<li tal:repeat="menu settings.menus.get_visible_items(request)">
 			<span tal:content="i18n:menu.title">Title</span>
 			<ul>
-				<li tal:repeat="link menu.get_visible_items()"
-					tal:attributes="illustration view.get_link_illustration(link);">
+				<li tal:repeat="link menu.get_visible_items(request)">
 					<i class="fa fa-fw fa-eye-slash text-danger hint opaque align-base"
 					   tal:condition="not:view.get_link_status(link)"
 					   title="Link target is not published!" i18n:attributes="title"></i>
 					<i class="fa fa-fw fa-file-image-o text-danger hint opaque align-base"
-					   tal:define="illustration view.get_link_illustration(link)"
+					   tal:define="illustration tales:pyams_illustration(link)"
 					   tal:condition="not:illustration and illustration.has_data()"
-					   title="Link has no illustration"></i>
+					   title="Link has no illustration" i18n:attributes="title"></i>
 					<tal:var define="info view.get_link_info(link)">
-						<span tal:content="info.user_title">User title</span>
-						&ndash;
 						<span tal:content="info.inner_title">Inner title</span>
 					</tal:var>
 				</li>
--- a/src/pyams_content/features/menu/portlet/navigation/zmi/templates/simple-preview.pt	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/features/menu/portlet/navigation/zmi/templates/simple-preview.pt	Tue Jul 17 15:09:38 2018 +0200
@@ -2,18 +2,15 @@
 	<strong tal:content="i18n:settings.title">Title</strong>
 	<tal:var define="subtitle i18n:settings.subtitle" condition="subtitle" content="subtitle" />
 	<ul>
-		<li tal:repeat="link settings.links.get_visible_items()"
-			tal:attributes="illustration view.get_link_illustration(link);">
+		<li tal:repeat="link settings.links.get_visible_items(request)">
 			<i class="fa fa-fw fa-eye-slash text-danger hint opaque align-base"
 			   tal:condition="not:view.get_link_status(link)"
 			   title="Link target is not published!" i18n:attributes="title"></i>
 			<i class="fa fa-fw fa-file-image-o text-danger hint opaque align-base"
-			   tal:define="illustration view.get_link_illustration(link)"
+			   tal:define="illustration tales:pyams_illustration(link)"
 			   tal:condition="not:illustration and illustration.has_data()"
 			   title="Link has no illustration" i18n:attributes="title"></i>
 			<tal:var define="info view.get_link_info(link)">
-				<span tal:content="info.user_title">User title</span>
-				&ndash;
 				<span tal:content="info.inner_title">Inner title</span>
 			</tal:var>
 		</li>
--- a/src/pyams_content/features/menu/zmi/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/features/menu/zmi/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -41,7 +41,7 @@
 from pyams_skin.table import BaseTable, SorterColumn, VisibilitySwitcherColumn, I18nColumn, TrashColumn, NameColumn, \
     get_table_id
 from pyams_skin.viewlet.toolbar import ToolbarAction
-from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter, ContextAdapter
+from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter, ContextAdapter, NullAdapter
 from pyams_utils.traversing import get_parent
 from pyams_utils.url import absolute_url
 from pyams_viewlet.viewlet import viewlet_config
@@ -92,7 +92,7 @@
     legend = _("Add new menu")
     icon_css_class = 'fa fa-fw fa-bars'
 
-    fields = field.Fields(IMenu).select('title')
+    fields = field.Fields(IMenu).select('title', 'reference')
     edit_permission = MANAGE_TEMPLATE_PERMISSION
 
     def create(self, data):
@@ -125,7 +125,7 @@
 
     dialog_class = 'modal-large'
 
-    fields = field.Fields(IMenu).select('title')
+    fields = field.Fields(IMenu).select('title', 'reference')
     edit_permission = MANAGE_TEMPLATE_PERMISSION
 
     def get_ajax_output(self, changes):
@@ -487,3 +487,13 @@
     """Menu external link properties edit form"""
 
     edit_permission = None  # managed by IFormContextPermissionChecker adapter
+
+
+#
+# Custom adapters
+#
+
+@adapter_config(name='size', context=(IMenu, IPyAMSLayer, MenuLinksTable), provides=IColumn)
+@adapter_config(name='size', context=(IMenuLinksContainerTarget, IPyAMSLayer, LinksTable), provides=IColumn)
+class MenuLinksTableSizeColumn(NullAdapter):
+    """Menu links table size column"""
--- a/src/pyams_content/features/preview/zmi/templates/preview.pt	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/features/preview/zmi/templates/preview.pt	Tue Jul 17 15:09:38 2018 +0200
@@ -13,8 +13,8 @@
 					<i class="fa fa-fw fa-times-circle"></i>
 				</button>
 				<h3 class="modal-title"
-					tal:define="config extension:configuration;">
-					<span class="title" tal:content="view.title | context.title | config.title">Title</span>
+					tal:define="config tales:configuration;">
+					<span class="title" tal:content="structure view.title | context.title | config.title">Title</span>
 				</h3>
 				<tal:var replace="structure provider:form_toolbar" />
 			</tal:if>
@@ -24,7 +24,7 @@
 				<tal:if condition="len(langs) == 1">
 					<div class="margin-top-10">
 						<iframe src="preview.html" frameborder="0" style="width: 100%;"
-								tal:define="url extension:absolute_url(context, 'preview.html')"
+								tal:define="url tales:absolute_url(context, 'preview.html')"
 								tal:attributes="src string:${url}?lang=${langs[0]}"
 								onload="this.style.height = (jQuery(parent.window).height() - 150) + 'px'"></iframe>
 					</div>
@@ -35,7 +35,7 @@
 							<li tal:define="active python:'active' if repeat['lang'].start() else ''"
 								tal:attributes="class string:small ${active}">
 								<a data-toggle="tab" class="xsmall"
-								   tal:define="url extension:absolute_url(context, 'preview.html')"
+								   tal:define="url tales:absolute_url(context, 'preview.html')"
 								   tal:attributes="href string:#preview-${lang}">
 									<img tal:attributes="src string:/--static--/pyams_i18n/img/flags/${lang}.png" />
 								</a>
@@ -48,7 +48,7 @@
 								 tal:attributes="class string:clearfix tab-pane ${active} fade in padding-5;
 												 id string:preview-${lang};">
 								<iframe src="preview.html" frameborder="0" style="width: 100%;"
-										tal:define="url extension:absolute_url(context, 'preview.html')"
+										tal:define="url tales:absolute_url(context, 'preview.html')"
 										tal:attributes="src string:${url}?lang=${lang}"
 										onload="this.style.height = (jQuery(parent.window).height() - 150) + 'px'"></iframe>
 							</div>
--- a/src/pyams_content/features/renderer/zmi/templates/renderer-input.pt	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/features/renderer/zmi/templates/renderer-input.pt	Tue Jul 17 15:09:38 2018 +0200
@@ -4,7 +4,7 @@
 			title="Edit renderer properties" i18n:attributes="title"
 			data-ams-hint-gravity="se" data-toggle="modal"
 			tal:condition="render"
-			tal:attributes="data-ams-url extension:absolute_url(context, 'renderer-properties.html');"></i>
+			tal:attributes="data-ams-url tales:absolute_url(context, 'renderer-properties.html');"></i>
 		<i class="icon-append fa fa-fw fa-pencil-square-o opacity-25"
 			tal:condition="not:render"></i>
 	</tal:var>
@@ -33,7 +33,7 @@
 								onchange view/onchange;
 								multiple view/multiple;
 								size view/size;
-								data-ams-data extension:object_data(view);'>
+								data-ams-data tales:object_data(view);'>
 			<option tal:repeat="entry view/items"
 					tal:attributes="value entry/value;
 									selected python:entry['value'] in view.value;"
--- a/src/pyams_content/features/review/zmi/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/features/review/zmi/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -111,7 +111,6 @@
     def updateWidgets(self, prefix=None):
         super(WfSharedContentReviewForm, self).updateWidgets(prefix)
         if 'comment' in self.widgets:
-            self.widgets['comment'].widget_css_class = 'textarea'
             self.widgets['comment'].addClass('height-100')
 
     def updateActions(self):
--- a/src/pyams_content/features/review/zmi/templates/review-add-comment.pt	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/features/review/zmi/templates/review-add-comment.pt	Tue Jul 17 15:09:38 2018 +0200
@@ -2,7 +2,7 @@
 	tal:attributes="class 'message {0}'.format(comment.comment_type)">
 	<tal:var define="avatar options['profile'].avatar">
 		<tal:if condition="avatar">
-			<img tal:attributes="src extension:absolute_url(avatar, '++thumb++square:32x32.png')" />
+			<img tal:attributes="src tales:absolute_url(avatar, '++thumb++square:32x32.png')" />
 		</tal:if>
 		<tal:if condition="not:avatar">
 			<i class="fa fa-lg fa-user img"></i>
@@ -21,7 +21,7 @@
 				</tal:if>
 				<time class="margin-left-10" i18n:translate="">just now</time>
 			</a>
-			<tal:var content="structure extension:html(comment.comment)" />
+			<tal:var content="structure tales:html(comment.comment)" />
 		</span>
 	</tal:var>
 </li>
--- a/src/pyams_content/features/review/zmi/templates/review-comments-json.pt	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/features/review/zmi/templates/review-comments-json.pt	Tue Jul 17 15:09:38 2018 +0200
@@ -3,7 +3,7 @@
 	<tal:var define="principal view.get_principal(comment.owner);
 					 avatar view.get_avatar(principal);">
 		<tal:if condition="avatar">
-			<img tal:attributes="src extension:absolute_url(avatar, '++thumb++square:32x32.png')" />
+			<img tal:attributes="src tales:absolute_url(avatar, '++thumb++square:32x32.png')" />
 		</tal:if>
 		<tal:if condition="not:avatar">
 			<i class="fa fa-lg fa-user img"></i>
@@ -30,7 +30,7 @@
 					  i18n:translate="">Selected reviewers:</span>&nbsp;
 				<tal:var content="comment.reviewers" /><br />
 			</div>
-			<tal:var content="structure extension:html(comment.comment)" />
+			<tal:var content="structure tales:html(comment.comment)" />
 		</span>
 	</tal:var>
 </li>
--- a/src/pyams_content/features/review/zmi/templates/review-comments.pt	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/features/review/zmi/templates/review-comments.pt	Tue Jul 17 15:09:38 2018 +0200
@@ -1,7 +1,7 @@
 <div class="ams-widget comments" i18n:domain="pyams_content"
 	 data-ams-plugins="pyams_content"
-	 tal:attributes="data-ams-plugin-pyams_content-src extension:resource_path('pyams_content.skin:pyams_content');
-					 data-ams-plugin-pyams_content-css extension:resource_path('pyams_content.skin:pyams_content_css');"
+	 tal:attributes="data-ams-plugin-pyams_content-src tales:resource_path('pyams_content.skin:pyams_content');
+					 data-ams-plugin-pyams_content-css tales:resource_path('pyams_content.skin:pyams_content_css');"
 	 data-ams-plugin-pyams_content-async="false"
 	 data-ams-callback="PyAMS_content.review.initComments">
 	<header>
@@ -20,7 +20,7 @@
 					<tal:var define="principal view.get_principal(comment.owner);
 									 avatar view.get_avatar(principal);">
 						<tal:if condition="avatar">
-							<img tal:attributes="src extension:absolute_url(avatar, '++thumb++square:32x32.png')" />
+							<img tal:attributes="src tales:absolute_url(avatar, '++thumb++square:32x32.png')" />
 						</tal:if>
 						<tal:if condition="not:avatar">
 							<i class="fa fa-lg fa-user img"></i>
@@ -47,7 +47,7 @@
 									  i18n:translate="">Selected reviewers:</span>&nbsp;
 								<tal:var content="comment.reviewers" />
 							</div>
-							<tal:var content="structure extension:html(comment.comment)" />
+							<tal:var content="structure tales:html(comment.comment)" />
 						</span>
 					</tal:var>
 				</li>
@@ -56,7 +56,7 @@
 		<div class="chat-footer no-padding">
 			<form method="post" data-async
 				  data-ams-form-data-init-callback="PyAMS_content.review.initCommentData"
-				  tal:attributes="data-ams-form-handler extension:absolute_url(context, 'add-review-comment.json')">
+				  tal:attributes="data-ams-form-handler tales:absolute_url(context, 'add-review-comment.json')">
 				<fieldset class="textarea-div no-margin">
 					<div class="btn btn-xs btn-success margin-left-10 margin-top-5"
 						 data-ams-url="PyAMS_content.review.addCommentAction">
--- a/src/pyams_content/features/review/zmi/templates/review-notification.pt	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/features/review/zmi/templates/review-notification.pt	Tue Jul 17 15:09:38 2018 +0200
@@ -39,7 +39,7 @@
 	</p>
 	<pre style="padding: 5px 20px;" tal:content="options['comment']">comment</pre>
 	<p i18n:translate="">To review and comment this publication, please use the following link: <a i18n:name="target"
-			tal:attributes="href extension:absolute_url(context, 'admin')"
+			tal:attributes="href tales:absolute_url(context, 'admin')"
 			tal:content="i18n:context.title"></a>.</p>
 	<p i18n:translate="">After reading this content, please use the « Comments » menu entry.</p>
 	<p i18n:translate="">If you don't want to reply to this request, please contact
--- a/src/pyams_content/generations/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/generations/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -19,10 +19,12 @@
 
 # import interfaces
 from pyams_catalog.interfaces import MINUTE_RESOLUTION, DATE_RESOLUTION
-from pyams_content.component.theme import IThemesInfo
-from pyams_content.interfaces import IBaseContent
+from pyams_content.component.theme import ITagsInfo, IThemesInfo, ICollectionsInfo
+from pyams_content.interfaces import IBaseContent, WEBMASTER_ROLE, OWNER_ROLE, PILOT_ROLE, MANAGER_ROLE, \
+    CONTRIBUTOR_ROLE
 from pyams_content.root.interfaces import ISiteRootToolsConfiguration
 from pyams_content.shared.common.interfaces import IWfSharedContent
+from pyams_content.shared.common.interfaces.types import IWfTypedSharedContent
 from pyams_content.shared.form.interfaces import IFormsManagerFactory
 from pyams_content.shared.imagemap.interfaces import IImageMapManagerFactory
 from pyams_content.shared.logo.interfaces import ILogosManagerFactory
@@ -95,11 +97,13 @@
 REQUIRED_INDEXES = [
     ('content_type', FieldIndexWithInterface, {'interface': IBaseContent,
                                                'discriminator': 'content_type'}),
-    ('role:owner', PrincipalsRoleIndex, {'role_id': 'pyams.Owner'}),
-    ('role:pilot', PrincipalsRoleIndex, {'role_id': 'pyams.Pilot'}),
-    ('role:manager', PrincipalsRoleIndex, {'role_id': 'pyams.Manager'}),
-    ('role:contributor', PrincipalsRoleIndex, {'role_id': 'pyams.Contributor'}),
-    ('role:webmaster', PrincipalsRoleIndex, {'role_id': 'pyams.Webmaster'}),
+    ('data_type', FieldIndexWithInterface, {'interface': IWfTypedSharedContent,
+                                            'discriminator': 'data_type'}),
+    ('role:owner', PrincipalsRoleIndex, {'role_id': OWNER_ROLE}),
+    ('role:pilot', PrincipalsRoleIndex, {'role_id': PILOT_ROLE}),
+    ('role:manager', PrincipalsRoleIndex, {'role_id': MANAGER_ROLE}),
+    ('role:contributor', PrincipalsRoleIndex, {'role_id': CONTRIBUTOR_ROLE}),
+    ('role:webmaster', PrincipalsRoleIndex, {'role_id': WEBMASTER_ROLE}),
     ('parents', KeywordIndexWithInterface, {'interface': IPathElements,
                                             'discriminator': 'parents'}),
     ('workflow_state', FieldIndexWithInterface, {'interface': IWorkflowState,
@@ -129,6 +133,10 @@
     ('first_publication_date', DatetimeIndexWithInterface, {'interface': IWorkflowPublicationInfo,
                                                             'discriminator': 'first_publication_date',
                                                             'resolution': MINUTE_RESOLUTION}),
+    ('tags', ThesaurusTermsListFieldIndex, {'interface': ITagsInfo,
+                                            'discriminator': 'tags',
+                                            'include_parents': False,
+                                            'include_synonyms': False}),
     ('themes', ThesaurusTermsListFieldIndex, {'interface': IThemesInfo,
                                               'discriminator': 'themes',
                                               'include_parents': False,
@@ -140,7 +148,11 @@
     ('themes_all', ThesaurusTermsListFieldIndex, {'interface': IThemesInfo,
                                                   'discriminator': 'themes',
                                                   'include_parents': True,
-                                                  'include_synonyms': True})
+                                                  'include_synonyms': True}),
+    ('collections', ThesaurusTermsListFieldIndex, {'interface': ICollectionsInfo,
+                                                   'discriminator': 'collections',
+                                                   'include_parents': False,
+                                                   'include_synonyms': False})
 ]
 
 
--- a/src/pyams_content/interfaces/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/interfaces/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -93,7 +93,9 @@
     """Base content interface"""
 
     __name__ = TextLine(title=_("Unique key"),
-                        description=_("WARNING: this key can't be modified after creation!!!"),
+                        description=_("WARNING: this key can't be modified after creation!!! Spaces, "
+                                      "uppercase letters ou accentuated characters will be replaced "
+                                      "automatically."),
                         required=True)
 
     title = I18nTextLineField(title=_("Title"),
Binary file src/pyams_content/locales/fr/LC_MESSAGES/pyams_content.mo has changed
--- a/src/pyams_content/locales/fr/LC_MESSAGES/pyams_content.po	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/locales/fr/LC_MESSAGES/pyams_content.po	Tue Jul 17 15:09:38 2018 +0200
@@ -5,7 +5,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE 1.0\n"
-"POT-Creation-Date: 2018-06-23 16:27+0200\n"
+"POT-Creation-Date: 2018-07-17 14:54+0200\n"
 "PO-Revision-Date: 2015-09-10 10:42+0200\n"
 "Last-Translator: Thierry Florac <tflorac@ulthar.net>\n"
 "Language-Team: French\n"
@@ -45,822 +45,141 @@
 msgstr "Publier le contenu"
 
 #: src/pyams_content/__init__.py:53
+msgid "System manager (role)"
+msgstr "Administrateur (rôle)"
+
+#: src/pyams_content/__init__.py:60
 msgid "Webmaster (role)"
 msgstr "Webmestre (rôle)"
 
-#: src/pyams_content/__init__.py:62
+#: src/pyams_content/__init__.py:71
 msgid "Pilot (role)"
 msgstr "Pilote (rôle)"
 
-#: src/pyams_content/__init__.py:70
+#: src/pyams_content/__init__.py:81
 msgid "Manager (role)"
 msgstr "Responsable (rôle)"
 
-#: src/pyams_content/__init__.py:77
+#: src/pyams_content/__init__.py:90
 msgid "Owner (role)"
 msgstr "Propriétaire (rôle)"
 
-#: src/pyams_content/__init__.py:82
+#: src/pyams_content/__init__.py:95
 msgid "Contributor (role)"
 msgstr "Contributeur (rôle)"
 
-#: src/pyams_content/__init__.py:90
+#: src/pyams_content/__init__.py:106
 msgid "Reader (role)"
 msgstr "Relecteur (rôle)"
 
-#: src/pyams_content/__init__.py:96
+#: src/pyams_content/__init__.py:116
 msgid "Operator (role)"
 msgstr "Opérateur (rôle)"
 
-#: src/pyams_content/__init__.py:100
+#: src/pyams_content/__init__.py:121
 msgid "Guest user (role)"
 msgstr "Invité (rôle)"
 
-#: src/pyams_content/reference/pictograms/interfaces/__init__.py:44
-#: src/pyams_content/component/extfile/__init__.py:223
-#: src/pyams_content/component/extfile/__init__.py:238
-#: src/pyams_content/shared/imagemap/interfaces/__init__.py:66
-#: src/pyams_content/shared/logo/interfaces/__init__.py:46
-msgid "Image"
-msgstr "Image"
-
-#: src/pyams_content/reference/pictograms/interfaces/__init__.py:45
-msgid "Pictogram content"
-msgstr "Utilisez le bouton \"Parcourir\" pour modifier le contenu de l'image"
-
-#: src/pyams_content/reference/pictograms/interfaces/__init__.py:48
-#: src/pyams_content/component/gallery/interfaces/__init__.py:54
-#: src/pyams_content/component/illustration/interfaces/__init__.py:56
-msgid "Accessibility title"
-msgstr "Alternative (accessibilité)"
-
-#: src/pyams_content/reference/pictograms/interfaces/__init__.py:49
-#: src/pyams_content/component/illustration/interfaces/__init__.py:57
-msgid "Alternate title used to describe image content"
-msgstr ""
-"Ce texte est affiché lorsque le contenu ne peut être téléchargé ou affiché ; "
-"il est aussi utilisé par les navigateurs des personnes souffrant de "
-"déficiences visuelles. Il doit donc décrire le contenu, pour se conformer "
-"aux normes d'accessibilité."
-
-#. Default: Header
-#: src/pyams_content/reference/pictograms/interfaces/__init__.py:52
-msgid "pictogram-header"
-msgstr "En-tête par défaut"
-
-#: src/pyams_content/reference/pictograms/interfaces/__init__.py:53
-msgid "Default header associated with this pictogram"
-msgstr "En-tête par défaut associé à ce pictogramme"
-
-#: src/pyams_content/reference/pictograms/interfaces/__init__.py:73
-#: src/pyams_content/reference/pictograms/zmi/manager.py:63
-#: src/pyams_content/reference/pictograms/zmi/templates/manager-selection.pt:34
-msgid "Selected pictograms"
-msgstr "Pictogrammes sélectionnés"
-
-#: src/pyams_content/reference/pictograms/interfaces/__init__.py:74
-msgid "List of selected pictograms which will be available to shared contents"
-msgstr "Liste des pictogrammes proposés dans les contenus partagés"
-
-#: src/pyams_content/reference/pictograms/zmi/__init__.py:59
-#: src/pyams_content/component/paragraph/zmi/pictogram.py:304
-msgid "Add pictogram"
-msgstr "Ajouter un pictogramme"
-
-#: src/pyams_content/reference/pictograms/zmi/__init__.py:71
-#: src/pyams_content/component/paragraph/zmi/pictogram.py:317
-msgid "Add new pictogram"
-msgstr "Ajout d'un pictogramme"
-
-#: src/pyams_content/reference/pictograms/zmi/__init__.py:95
-#: src/pyams_content/component/paragraph/zmi/pictogram.py:359
-msgid "Edit pictogram properties"
-msgstr "Propriétés du pictogramme"
-
-#: src/pyams_content/reference/pictograms/zmi/__init__.py:150
-#: src/pyams_content/interfaces/__init__.py:99
-#: src/pyams_content/features/menu/portlet/navigation/interfaces/simple.py:31
-#: src/pyams_content/features/menu/portlet/navigation/interfaces/double.py:31
-#: src/pyams_content/component/gallery/interfaces/__init__.py:94
-#: src/pyams_content/component/paragraph/interfaces/milestone.py:45
-#: src/pyams_content/component/paragraph/zmi/container.py:223
-#: src/pyams_content/component/paragraph/zmi/milestone.py:231
-#: src/pyams_content/component/links/zmi/reverse.py:73
-#: src/pyams_content/component/keynumber/portlet/interfaces/__init__.py:31
-#: src/pyams_content/shared/imagemap/zmi/container.py:123
-#: src/pyams_content/shared/common/zmi/dashboard.py:109
-#: src/pyams_content/shared/common/zmi/templates/advanced-search.pt:188
-#: src/pyams_content/shared/site/zmi/folder.py:70
-#: src/pyams_content/root/zmi/templates/advanced-search.pt:188
-msgid "Title"
-msgstr "Titre"
-
-#: src/pyams_content/reference/pictograms/zmi/__init__.py:169
-#: src/pyams_content/reference/pictograms/zmi/widget.py:55
-msgid "Default header: --"
-msgstr "En-tête par défaut : --"
-
-#: src/pyams_content/reference/pictograms/zmi/manager.py:51
-msgid "Pictograms selection..."
-msgstr "Sélection de pictogrammes"
-
-#: src/pyams_content/reference/pictograms/zmi/templates/manager-selection.pt:7
-msgid "Available pictograms"
-msgstr "Pictogrammes disponibles"
-
-#: src/pyams_content/reference/pictograms/zmi/templates/manager-selection.pt:21
-#: src/pyams_content/reference/pictograms/zmi/templates/manager-selection.pt:48
-msgid "Display pictogram properties"
-msgstr "Propriétés du pictogramme"
-
-#: src/pyams_content/reference/pictograms/zmi/templates/pictogram-header.pt:6
-msgid "Default header: ${header}"
-msgstr "En-tête par défaut : ${header}"
-
-#: src/pyams_content/reference/zmi/__init__.py:51
-msgid "References"
-msgstr "Tables de réf."
-
-#: src/pyams_content/reference/zmi/__init__.py:69
-#: src/pyams_content/reference/zmi/table.py:129
-msgid "References tables"
-msgstr "Tables de références"
-
-#: src/pyams_content/reference/zmi/table.py:73
-msgid "Contents"
-msgstr "Contenu"
-
-#: src/pyams_content/reference/zmi/table.py:83
-msgid "Table contents"
-msgstr "Contenu de la table"
-
-#: src/pyams_content/reference/zmi/table.py:143
-msgid "Properties..."
-msgstr "Propriétés"
-
-#: src/pyams_content/reference/zmi/table.py:157
-msgid "Edit table properties"
-msgstr "Propriétés de la table"
-
-#: src/pyams_content/reference/zmi/table.py:167
-msgid "Table management"
-msgstr "Gérer cette table"
-
-#: src/pyams_content/interfaces/__init__.py:95
-msgid "Unique key"
-msgstr "Clé unique"
-
-#: src/pyams_content/interfaces/__init__.py:96
-msgid "WARNING: this key can't be modified after creation!!!"
-msgstr "ATTENTION : cette clé ne pourra plus être modifiée !!!"
-
-#: src/pyams_content/interfaces/__init__.py:100
-#: src/pyams_content/shared/site/zmi/folder.py:71
-msgid "Visible label used to display content"
-msgstr "Le titre présenté aux internautes"
-
-#: src/pyams_content/interfaces/__init__.py:103
-msgid "Short name"
-msgstr "Fil d'Ariane"
-
-#: src/pyams_content/interfaces/__init__.py:104
-msgid "Short name used in breadcrumbs"
-msgstr "Libellé utilisé dans le fil d'Ariane"
-
-#: src/pyams_content/interfaces/__init__.py:111
-#: src/pyams_content/features/review/interfaces.py:74
-#: src/pyams_content/shared/view/interfaces/__init__.py:40
-msgid "Creation date"
-msgstr "Date de création"
-
-#: src/pyams_content/interfaces/__init__.py:115
-msgid "Modification date"
-msgstr "Dernière modification apportée"
-
-#: src/pyams_content/skin/zmi/viewlet/toplinks/__init__.py:46
-msgid "Shared sites"
-msgstr "Sites et blogs"
-
-#: src/pyams_content/skin/zmi/viewlet/toplinks/__init__.py:67
-msgid "Shared contents"
-msgstr "Gabarits"
-
-#: src/pyams_content/skin/zmi/viewlet/toplinks/__init__.py:90
-msgid "Shared tools"
-msgstr "Outils"
-
-#: src/pyams_content/skin/zmi/viewlet/toplinks/__init__.py:113
-msgid "My roles"
-msgstr "Mes rôles"
-
-#: src/pyams_content/skin/zmi/viewlet/toplinks/templates/user-addings.pt:7
-msgid "Create new content"
-msgstr "Créer un nouveau contenu"
-
-#: src/pyams_content/profile/interfaces/__init__.py:33
-msgid "User favorites"
-msgstr "Favoris de l'utilisateur"
-
-#: src/pyams_content/profile/interfaces/__init__.py:34
-msgid "List of internal numbers of shared contents stored for quick access"
-msgstr "Liste des numéros internes des contenus mémorisés pour un accès rapide"
-
-#: src/pyams_content/profile/interfaces/__init__.py:37
-msgid "Default table length"
-msgstr "Longueur des tableaux"
-
-#: src/pyams_content/profile/interfaces/__init__.py:38
-msgid "Default length used for inner tables and dashboards"
-msgstr "Longueur par défaut des tableaux internes et des tableaux de bord"
-
-#: src/pyams_content/profile/zmi/__init__.py:42
-msgid "Admin. profile"
-msgstr "Profil intervenant"
-
-#: src/pyams_content/features/menu/interfaces/__init__.py:58
-#: src/pyams_content/features/alert/interfaces.py:54
-#: src/pyams_content/component/paragraph/interfaces/pictogram.py:41
-#: src/pyams_content/component/paragraph/interfaces/milestone.py:40
-#: src/pyams_content/component/paragraph/interfaces/__init__.py:44
-#: src/pyams_content/component/association/interfaces/__init__.py:42
-#: src/pyams_content/component/keynumber/interfaces/__init__.py:39
-#: src/pyams_content/shared/form/interfaces/__init__.py:87
-#: src/pyams_content/shared/site/interfaces/__init__.py:117
-msgid "Visible?"
-msgstr "Visible ?"
-
-#: src/pyams_content/features/menu/interfaces/__init__.py:59
-#: src/pyams_content/component/association/interfaces/__init__.py:43
-msgid "Is this item visible in front-office?"
-msgstr "Si 'non', ce lien ne sera pas présenté aux internautes"
-
-#: src/pyams_content/features/menu/interfaces/__init__.py:63
-msgid "Menu title"
-msgstr "Libellé"
-
-#: src/pyams_content/features/menu/interfaces/__init__.py:64
-msgid "Displayed menu label"
-msgstr "Libellé du menu"
-
-#: src/pyams_content/features/menu/zmi/__init__.py:81
-msgid "Add menu..."
-msgstr "Ajouter un menu"
-
-#: src/pyams_content/features/menu/zmi/__init__.py:92
-msgid "Add new menu"
-msgstr "Ajout d'un menu"
-
-#: src/pyams_content/features/menu/zmi/__init__.py:123
-msgid "Edit menu properties"
-msgstr "Propriétés du menu"
-
-#: src/pyams_content/features/menu/zmi/__init__.py:208
-#: src/pyams_content/shared/form/interfaces/__init__.py:62
-#: src/pyams_content/shared/form/zmi/field.py:159
-#: src/pyams_content/shared/common/interfaces/types.py:40
-#: src/pyams_content/shared/common/zmi/templates/preview-input.pt:34
-#: src/pyams_content/shared/common/zmi/templates/check-input.pt:34
-msgid "Label"
-msgstr "Libellé"
-
-#: src/pyams_content/features/menu/zmi/__init__.py:110
-msgid "Menu was correctly added."
-msgstr "Le menu a été ajouté."
-
-#: src/pyams_content/features/menu/zmi/__init__.py:388
-msgid "Link was correctly added."
-msgstr "Le lien a été ajouté."
-
-#: src/pyams_content/features/menu/zmi/templates/menu-name-cell.pt:7
-msgid "Click to see menu items"
-msgstr "Montrer ou cacher les éléments du menu"
-
-#: src/pyams_content/features/menu/portlet/navigation/simple.py:68
-msgid "Simple navigation"
-msgstr "Navigation à un niveau"
-
-#: src/pyams_content/features/menu/portlet/navigation/double.py:68
-msgid "Double navigation"
-msgstr "Navigation à deux niveaux"
-
-#: src/pyams_content/features/menu/portlet/navigation/interfaces/simple.py:32
-#: src/pyams_content/features/menu/portlet/navigation/interfaces/double.py:32
-msgid "Portlet main title"
-msgstr "Titre du composant"
-
-#: src/pyams_content/features/menu/portlet/navigation/interfaces/simple.py:35
-#: src/pyams_content/features/menu/portlet/navigation/interfaces/double.py:35
-msgid "Subtitle"
-msgstr "Sous-titre"
-
-#: src/pyams_content/features/menu/portlet/navigation/interfaces/simple.py:36
-#: src/pyams_content/features/menu/portlet/navigation/interfaces/double.py:36
-msgid "Portlet subtitle"
-msgstr "Sous-titre du composant"
-
-#: src/pyams_content/features/menu/portlet/navigation/zmi/simple.py:70
-msgid "Navigation links"
-msgstr "Liens de navigation"
-
-#: src/pyams_content/features/menu/portlet/navigation/zmi/double.py:70
-msgid "Navigation menus"
-msgstr "Menus de navigation"
-
-#: src/pyams_content/features/menu/portlet/navigation/zmi/templates/simple-preview.pt:9
-#: src/pyams_content/features/menu/portlet/navigation/zmi/templates/double-preview.pt:12
-#: src/pyams_content/component/keynumber/portlet/zmi/templates/keynumber-preview.pt:27
-msgid "Link target is not published!"
-msgstr "Le contenu ciblé n'est pas publié"
-
-#: src/pyams_content/features/menu/portlet/navigation/zmi/templates/simple-preview.pt:13
-msgid "Link has no illustration"
-msgstr "Le lien n'a pas d'illustration"
-
-#: src/pyams_content/features/checker/interfaces.py:27
-#, python-format
-msgid " - {field}: <span class=\"text-danger\">no value</span>"
-msgstr " - {field} : <span class=\"text-danger\">non renseigné</span>"
-
-#: src/pyams_content/features/checker/interfaces.py:28
-#, python-format
-msgid " - {field} ({lang}): <span class=\"text-danger\">no value</span>"
-msgstr " - {field} ({lang}) : <span class=\"text-danger\">non renseigné</span>"
-
-#: src/pyams_content/features/checker/interfaces.py:29
-#, python-format
-msgid " - {field}: <span class=\"text-danger\">{message}</span>"
-msgstr " - {field} : <span class=\"text-danger\">{message}</span>"
-
-#: src/pyams_content/features/checker/zmi/__init__.py:43
-#: src/pyams_content/shared/common/zmi/templates/check-input.pt:39
-msgid "Audit"
-msgstr "Audit"
-
-#: src/pyams_content/features/checker/zmi/__init__.py:58
-msgid "Content check"
-msgstr "Audit du contenu"
-
-#: src/pyams_content/features/checker/zmi/__init__.py:82
-msgid "No checker available. This content is clean!"
-msgstr "Pas de vérificateur disponible. Ce contenu est propre !"
-
-#: src/pyams_content/features/checker/zmi/__init__.py:78
-#, python-format
-msgid "{0}:"
-msgstr "{0} :"
-
-#: src/pyams_content/features/alert/interfaces.py:40
-msgid "Success"
-msgstr "Levée d'alerte"
-
-#: src/pyams_content/features/alert/interfaces.py:41
-msgid "Information"
-msgstr "Information"
-
-#: src/pyams_content/features/alert/interfaces.py:42
-msgid "Warning"
-msgstr "Avertissement"
-
-#: src/pyams_content/features/alert/interfaces.py:43
-msgid "Danger"
-msgstr "Danger !"
-
-#: src/pyams_content/features/alert/interfaces.py:55
-msgid "Is this alert visible in front-office?"
-msgstr "Si 'non', cette alerte ne sera pas présentée aux internautes"
-
-#: src/pyams_content/features/alert/interfaces.py:59
-msgid "Alert gravity"
-msgstr "Niveau de gravité"
-
-#: src/pyams_content/features/alert/interfaces.py:60
-msgid "Alert gravity will affect rendered alert style"
-msgstr "Le niveau de gravité choisi affectera le style de rendu de l'alerte"
-
-#. Default: Heading
-#: src/pyams_content/features/alert/interfaces.py:65
-#: src/pyams_content/features/alert/zmi/container.py:157
-msgid "alert-header"
-msgstr "En-tête"
-
-#: src/pyams_content/features/alert/interfaces.py:66
-msgid "Short alert header (Alert, Important...)"
-msgstr "En-tête de l'alerte (« Alerte », « Important », « Prudence »...)"
-
-#: src/pyams_content/features/alert/interfaces.py:69
-#: src/pyams_content/features/alert/zmi/container.py:169
-msgid "Message"
-msgstr "Message"
-
-#: src/pyams_content/features/alert/interfaces.py:70
-msgid "Alert message"
-msgstr "Le message d'alerte doit être assez court et explicite"
-
-#: src/pyams_content/features/alert/interfaces.py:73
-#: src/pyams_content/shared/imagemap/interfaces/__init__.py:95
-msgid "Internal reference"
-msgstr "Référence interne"
-
-#: src/pyams_content/features/alert/interfaces.py:74
-msgid ""
-"Internal link target reference. You can search a reference using '+' "
-"followed by internal number, of by entering text matching content title."
-msgstr ""
-"Référence interne vers la cible du lien. Vous pouvez la rechercher par des "
-"mots de son titre, ou par son numéro interne (précédé d'un '+') ; le titre "
-"d'origine peut être modifié en utilisant le titre de substitution."
-
-#: src/pyams_content/features/alert/interfaces.py:79
-#: src/pyams_content/component/paragraph/interfaces/pictogram.py:46
-#: src/pyams_content/component/links/interfaces/__init__.py:43
-#: src/pyams_content/shared/common/interfaces/types.py:68
-msgid "Pictogram"
-msgstr "Pictogramme"
-
-#: src/pyams_content/features/alert/interfaces.py:80
-#: src/pyams_content/component/paragraph/interfaces/pictogram.py:47
-msgid "Name of the pictogram to select"
-msgstr "Sélection du pictogramme à afficher"
-
-#: src/pyams_content/features/alert/interfaces.py:86
-msgid "Display start date"
-msgstr "Date d'affichage"
-
-#: src/pyams_content/features/alert/interfaces.py:87
-msgid "First date at which alert should be displayed"
-msgstr ""
-"Première date à laquelle l'alerte sera affichée. Laissez la zone vide pour "
-"qu'elle soit affichée immédiatement."
-
-#: src/pyams_content/features/alert/interfaces.py:90
-msgid "Display end date"
-msgstr "Date de retrait"
-
-#: src/pyams_content/features/alert/interfaces.py:91
-msgid "Last date at which alert should be displayed"
-msgstr ""
-"Dernière date à laquelle l'alerte sera affichée. Laissez la zone vide pour "
-"qu'elle ne soit pas retirée."
-
-#: src/pyams_content/features/alert/interfaces.py:94
-msgid "Maximum interval"
-msgstr "Intervalle d'affichage"
-
-#: src/pyams_content/features/alert/interfaces.py:95
-msgid ""
-"Maximum interval between alert displays on a given device, given in hours; "
-"set to 0 to always display the alert"
-msgstr ""
-"Cet intervalle est donné en heures ; passé ce délai, pour un internaute "
-"donné, l'alerte apparaîtra à nouveau. Si aucun intervalle n'est indiqué, "
-"l'alerte s'affichera en permanence."
-
-#: src/pyams_content/features/alert/zmi/container.py:55
-msgid "Alerts"
-msgstr "Alertes"
-
-#: src/pyams_content/features/alert/zmi/container.py:191
-msgid "Alert list"
-msgstr "Liste des alertes"
-
-#: src/pyams_content/features/alert/zmi/container.py:90
-msgid "No currently defined alert."
-msgstr "Aucune alerte n'est définie actuellement."
-
-#: src/pyams_content/features/alert/zmi/__init__.py:45
-msgid "Add alert"
-msgstr "Ajouter une alerte"
-
-#: src/pyams_content/features/alert/zmi/__init__.py:56
-msgid "Add new alert"
-msgstr "Ajout d'une alerte"
-
-#: src/pyams_content/features/alert/zmi/__init__.py:79
-msgid "Edit alert properties"
-msgstr "Propriétés de l'alerte"
-
-#: src/pyams_content/features/preview/zmi/__init__.py:45
-#: src/pyams_content/component/paragraph/zmi/__init__.py:207
-#: src/pyams_content/shared/common/zmi/templates/preview-input.pt:39
-msgid "Preview"
-msgstr "Aperçu"
-
-#: src/pyams_content/features/preview/zmi/__init__.py:62
-msgid "Content preview"
-msgstr "Aperçu du contenu"
-
-#: src/pyams_content/features/preview/zmi/__init__.py:67
-#, python-format
-msgid "{title} ({preview})"
-msgstr "{title} ({preview})"
-
-#: src/pyams_content/features/preview/zmi/__init__.py:68
-msgid "preview"
-msgstr "aperçu"
-
-#: src/pyams_content/features/renderer/skin/__init__.py:67
-msgid "Hidden content"
-msgstr "Contenu non affiché"
-
-#: src/pyams_content/features/renderer/zmi/__init__.py:70
-#: src/pyams_content/features/renderer/zmi/templates/renderer-input.pt:4
-msgid "Edit renderer properties"
-msgstr "Propriétés du mode de rendu"
-
-#: src/pyams_content/features/header/interfaces/__init__.py:39
-#: src/pyams_content/component/paragraph/interfaces/header.py:43
-msgid "Header template"
-msgstr "Mode de rendu"
-
-#: src/pyams_content/features/header/interfaces/__init__.py:40
-#: src/pyams_content/component/paragraph/interfaces/header.py:44
-msgid "Presentation template used for this header"
-msgstr "Mode de rendu utilisé par ce chapô"
-
-#: src/pyams_content/features/header/skin/__init__.py:53
-msgid "Hidden header"
-msgstr "Ne pas afficher d'en-tête de pages"
-
-#: src/pyams_content/features/header/zmi/__init__.py:66
-msgid "Page header"
-msgstr "En-tête de pages"
-
-#: src/pyams_content/features/header/zmi/__init__.py:84
-msgid "Edit header settings"
-msgstr "Paramétrage des en-têtes de pages"
-
-#: src/pyams_content/features/header/zmi/__init__.py:161
-msgid ""
-"WARNING: Header properties are saved automatically when changing inherit "
-"mode!!"
-msgstr ""
-"ATTENTION : les propriétés de l'en-tête sont enregistrées automatiquement "
-"lorsque vous modifiez le mode d'héritage !!"
-
-#: src/pyams_content/features/header/zmi/__init__.py:229
-msgid "Header renderer settings"
-msgstr "Propriétés du mode de rendu"
-
-#: src/pyams_content/features/header/zmi/__init__.py:113
-msgid "Don't inherit parent header"
-msgstr "Ne pas hériter de l'en-tête de pages du parent"
-
-#: src/pyams_content/features/footer/interfaces/__init__.py:39
-msgid "Footer template"
-msgstr "Mode de rendu"
-
-#: src/pyams_content/features/footer/interfaces/__init__.py:40
-msgid "Presentation template used for this footer"
-msgstr "Mode de rendu utilisé par ce pied de page"
-
-#: src/pyams_content/features/footer/skin/__init__.py:53
-msgid "Hidden footer"
-msgstr "Ne pas afficher de pied de pages"
-
-#: src/pyams_content/features/footer/zmi/__init__.py:60
-msgid "Page footer"
-msgstr "Pied de pages"
-
-#: src/pyams_content/features/footer/zmi/__init__.py:78
-msgid "Edit footer settings"
-msgstr "Paramétrage des pieds de pages"
-
-#: src/pyams_content/features/footer/zmi/__init__.py:152
-msgid ""
-"WARNING: Footer properties are saved automatically when changing inherit "
-"mode!!"
-msgstr ""
-"ATTENTION : les propriétés du pied de page sont enregistrées automatiquement "
-"lorsque vous modifiez le mode d'héritage !!"
-
-#: src/pyams_content/features/footer/zmi/__init__.py:220
-msgid "Footer renderer settings"
-msgstr "Propriétés du mode de rendu"
-
-#: src/pyams_content/features/footer/zmi/__init__.py:107
-msgid "Don't inherit parent footer"
-msgstr "Ne pas hériter du pied de pages du parent"
-
-#: src/pyams_content/features/review/interfaces.py:32
-msgid "Review request"
-msgstr "Demande de relecture"
-
-#: src/pyams_content/features/review/interfaces.py:33
-msgid "Reviewer comment"
-msgstr "Commentaire"
-
-#: src/pyams_content/features/review/interfaces.py:56
-msgid "Comment writer"
-msgstr "Rédacteur"
-
-#: src/pyams_content/features/review/interfaces.py:59
-msgid "Content reviewers"
-msgstr "Relecteurs sollicités"
-
-#: src/pyams_content/features/review/interfaces.py:62
-msgid "Comment type"
-msgstr "Type de commentaire"
-
-#: src/pyams_content/features/review/interfaces.py:67
-msgid "Comment body"
-msgstr "Commentaire"
-
-#: src/pyams_content/features/review/interfaces.py:70
-msgid "Reviewer comment?"
-msgstr "Commentaire d'un relecteur ?"
-
-#: src/pyams_content/features/review/interfaces.py:86
-msgid "Reviewers list"
-msgstr "Liste des relecteurs"
-
-#: src/pyams_content/features/review/interfaces.py:87
-msgid "List of principals which reviewed the comment"
-msgstr "Liste des utilisateurs qui ont apporté des commentaires sur ce contenu"
-
-#: src/pyams_content/features/review/__init__.py:181
-#, python-format
-msgid "Request comment: {comment}"
-msgstr "Commentaire joint : {comment}"
-
-#: src/pyams_content/features/review/__init__.py:211
-#, python-format
-msgid "A new comment was added on content « {0} »"
-msgstr "Un nouveau commentaire a été ajouté pour le contenu « {0} »"
-
-#: src/pyams_content/features/review/__init__.py:168
-#, python-format
-msgid "[{service_name}] A content review is requested"
-msgstr "[{service_name}] Demande de relecture"
-
-#: src/pyams_content/features/review/zmi/__init__.py:61
-msgid "Ask for review..."
-msgstr "Demander une relecture"
-
-#: src/pyams_content/features/review/zmi/__init__.py:100
-msgid "Content review request"
-msgstr "Demande de relecture"
-
-#: src/pyams_content/features/review/zmi/__init__.py:166
-msgid "Comments"
-msgstr "Commentaires"
-
-#: src/pyams_content/features/review/zmi/__init__.py:186
-msgid "Review comments"
-msgstr "Commentaires associés à cette version"
-
-#: src/pyams_content/features/review/zmi/__init__.py:71
-msgid "Sought principals"
-msgstr "Relecteurs sollicités"
-
-#: src/pyams_content/features/review/zmi/__init__.py:72
-msgid "List of principals from which a review is requested"
-msgstr ""
-"Liste des utilisateurs que vous souhaitez solliciter par mail pour relire ce "
-"contenu"
-
-#: src/pyams_content/features/review/zmi/__init__.py:75
-msgid "Comment"
-msgstr "Commentaire"
-
-#: src/pyams_content/features/review/zmi/__init__.py:76
-msgid "Comment associated with this request"
-msgstr ""
-"Ce commentaire associé à cette demande sera également transmis par mail"
-
-#: src/pyams_content/features/review/zmi/__init__.py:79
-msgid "Notify all reviewers"
-msgstr "Notifier tous les relecteurs"
-
-#: src/pyams_content/features/review/zmi/__init__.py:80
-msgid ""
-"If 'yes', selected reviewers will be notified by mail of your request, even "
-"if they were already members of the reviewers group. Otherwise, only new "
-"reviewers will be notified"
-msgstr ""
-"Si 'oui', tous les relecteurs sollicités seront notifiés par mail de votre "
-"demande, même s'ils avaient déjà été sollicités auparavant. Dans le cas "
-"contraire, seuls les nouveaux relecteurs seront notifiés."
-
-#: src/pyams_content/features/review/zmi/__init__.py:90
-#: src/pyams_content/component/paragraph/zmi/__init__.py:212
-#: src/pyams_content/shared/common/zmi/owner.py:73
-#: src/pyams_content/shared/common/zmi/__init__.py:275
-#: src/pyams_content/shared/common/zmi/workflow.py:122
-#: src/pyams_content/shared/common/zmi/workflow.py:209
-#: src/pyams_content/shared/common/zmi/workflow.py:249
-#: src/pyams_content/shared/common/zmi/workflow.py:303
-#: src/pyams_content/shared/common/zmi/workflow.py:392
-#: src/pyams_content/shared/common/zmi/workflow.py:448
-#: src/pyams_content/shared/common/zmi/workflow.py:488
-#: src/pyams_content/shared/common/zmi/workflow.py:529
-#: src/pyams_content/shared/common/zmi/workflow.py:572
-#: src/pyams_content/shared/common/zmi/workflow.py:612
-#: src/pyams_content/shared/common/zmi/workflow.py:653
-#: src/pyams_content/shared/common/zmi/workflow.py:704
-msgid "Cancel"
-msgstr "Annuler"
-
-#: src/pyams_content/features/review/zmi/__init__.py:91
-msgid "Ask for content review"
-msgstr "Demander la relecture"
-
-#: src/pyams_content/features/review/zmi/__init__.py:147
-msgid "Request successful. No new notification have been sent"
-msgstr ""
-"Votre demande a été transmise. Aucune nouvelle notification n'a été envoyée."
-
-#: src/pyams_content/features/review/zmi/__init__.py:260
-msgid "Message is mandatory!"
-msgstr "Un commentaire est obligatoire !"
-
-#: src/pyams_content/features/review/zmi/__init__.py:135
-#, python-format
-msgid "Request successful. {count} new notification(s) have been sent"
-msgstr "Votre demande a été transmise. {count} notification(s) envoyée(s)."
-
-#: src/pyams_content/features/review/zmi/templates/review-comments-json.pt:15
-#: src/pyams_content/features/review/zmi/templates/review-add-comment.pt:14
-#: src/pyams_content/features/review/zmi/templates/review-comments.pt:32
-msgid "Review query from"
-msgstr "Demande de relecture de "
-
-#: src/pyams_content/features/review/zmi/templates/review-comments-json.pt:21
-#: src/pyams_content/features/review/zmi/templates/review-add-comment.pt:20
-#: src/pyams_content/features/review/zmi/templates/review-comments.pt:38
-msgid "(as reviewer)"
-msgstr "(relecteur)"
-
-#: src/pyams_content/features/review/zmi/templates/review-comments-json.pt:30
-#: src/pyams_content/features/review/zmi/templates/review-comments.pt:47
-msgid "Selected reviewers:"
-msgstr "Auprès de :"
-
-#: src/pyams_content/features/review/zmi/templates/review-notification.pt:4
-msgid "[${service_name}] You are requested for a content review"
-msgstr "[${service_name}] Demande de relecture"
-
-#: src/pyams_content/features/review/zmi/templates/review-notification.pt:30
-msgid "Hello,"
-msgstr "Bonjour,"
-
-#: src/pyams_content/features/review/zmi/templates/review-notification.pt:31
-msgid ""
-"You have been requested by ${sender}, contributor of « ${service_name} » "
-"website, to make a review of a content."
-msgstr ""
-"Vous êtes sollicité par ${sender}, contributeur du site internet "
-"${service_name}, qui souhaite recueillir votre commentaire à propos d'un "
-"contenu."
-
-#: src/pyams_content/features/review/zmi/templates/review-notification.pt:36
-msgid "${sender} added the following message to his request:"
-msgstr "${sender} a accompagné sa demande de relecture du message suivant :"
-
-#: src/pyams_content/features/review/zmi/templates/review-notification.pt:41
-msgid ""
-"To review and comment this publication, please use the following link: "
-"${target}."
-msgstr "Pour accéder à cette contribution, cliquer ici : ${target}."
-
-#: src/pyams_content/features/review/zmi/templates/review-notification.pt:44
-msgid "After reading this content, please use the « Comments » menu entry."
-msgstr ""
-"Lorsque vous aurez pris connaissance du contenu, cliquez sur « Commentaires "
-"» dans le menu en colonne de gauche."
-
-#: src/pyams_content/features/review/zmi/templates/review-notification.pt:45
-msgid ""
-"If you don't want to reply to this request, please contact ${sender} "
-"directly by replying to this mail."
-msgstr ""
-"Si vous ne souhaitez pas donner suite à cette demande, vous pouvez répondre "
-"directement à ${sender} en lui adressant un message dans ce sens."
-
-#: src/pyams_content/features/review/zmi/templates/review-notification.pt:47
-msgid "Thank you."
-msgstr "Merci."
-
-#: src/pyams_content/features/review/zmi/templates/review-add-comment.pt:22
-msgid "just now"
-msgstr "À l'instant !"
-
-#: src/pyams_content/features/review/zmi/templates/review-comments.pt:64
-msgid "Add comment"
-msgstr "Déposer un commentaire"
-
-#: src/pyams_content/features/review/zmi/templates/review-comments.pt:67
-msgid "Add a comment..."
-msgstr "Votre commentaire..."
-
-#: src/pyams_content/features/review/zmi/templates/review-comments.pt:73
-msgid "Add this comment"
-msgstr "Ajouter ce commentaire"
-
 #: src/pyams_content/component/gallery/__init__.py:154
 msgid "Gallery"
 msgstr "Galerie de médias"
 
-#: src/pyams_content/component/gallery/interfaces/__init__.py:130
+#: src/pyams_content/component/gallery/zmi/file.py:60
+#: src/pyams_content/component/gallery/zmi/file.py:72
+#: src/pyams_content/component/gallery/zmi/paragraph.py:155
+msgid "Add media(s)"
+msgstr "Ajouter des médias"
+
+#: src/pyams_content/component/gallery/zmi/file.py:182
+msgid "Update media properties"
+msgstr "Propriétés du média"
+
+#: src/pyams_content/component/gallery/zmi/file.py:236
+msgid "Remove media..."
+msgstr "Supprimer le média"
+
+#: src/pyams_content/component/gallery/zmi/file.py:146
+msgid "Show/hide media"
+msgstr "Cliquez pour rendre le média visible ou non"
+
+#: src/pyams_content/component/gallery/zmi/file.py:203
+msgid "Audio content"
+msgstr "Contenu audio associé"
+
+#: src/pyams_content/component/gallery/zmi/paragraph.py:57
+msgid "Medias gallery..."
+msgstr "Galerie de médias"
+
+#: src/pyams_content/component/gallery/zmi/paragraph.py:70
+msgid "Add new gallery"
+msgstr "Ajout d'une galerie de médias"
+
+#: src/pyams_content/component/gallery/zmi/paragraph.py:92
+msgid "Edit gallery properties"
+msgstr "Propriétés de la galerie de médias"
+
+#: src/pyams_content/component/gallery/zmi/__init__.py:63
+msgid "Update gallery properties"
+msgstr "Propriétés de la galerie de médias"
+
+#: src/pyams_content/component/gallery/zmi/__init__.py:90
+msgid "Update gallery contents"
+msgstr "Contenu de la galerie de médias"
+
+#: src/pyams_content/component/gallery/zmi/interfaces.py:36
+msgid "Images or videos data"
+msgstr "Fichier"
+
+#: src/pyams_content/component/gallery/zmi/interfaces.py:37
+msgid "You can upload a single file or choose to upload a whole ZIP archive"
+msgstr ""
+"Vous pouvez déposer les médias un par un, ou en nombre en les réunissant au "
+"préalable dans un fichier ZIP"
+
+#: src/pyams_content/component/gallery/zmi/interfaces.py:40
+#: src/pyams_content/component/gallery/interfaces/__init__.py:61
+#: src/pyams_content/component/extfile/interfaces/__init__.py:44
+#: src/pyams_content/component/illustration/interfaces/__init__.py:68
+#: src/pyams_content/component/paragraph/interfaces/video.py:52
+#: src/pyams_content/component/paragraph/interfaces/audio.py:52
+#: src/pyams_content/component/paragraph/interfaces/verbatim.py:44
+#: src/pyams_content/component/video/interfaces/__init__.py:52
+msgid "Author"
+msgstr "Auteur"
+
+#: src/pyams_content/component/gallery/zmi/interfaces.py:41
+#: src/pyams_content/component/gallery/interfaces/__init__.py:62
+#: src/pyams_content/component/extfile/interfaces/__init__.py:45
+#: src/pyams_content/component/paragraph/interfaces/video.py:53
+#: src/pyams_content/component/paragraph/interfaces/audio.py:53
+#: src/pyams_content/component/video/interfaces/__init__.py:53
+msgid "Name of document's author"
+msgstr "Sous la forme \"Prénom Nom / Organisme\""
+
+#: src/pyams_content/component/gallery/zmi/interfaces.py:44
+msgid "Author comments"
+msgstr "À propos de l'auteur"
+
+#: src/pyams_content/component/gallery/zmi/interfaces.py:45
+#: src/pyams_content/component/gallery/interfaces/__init__.py:66
+msgid "Comments relatives to author's rights management"
+msgstr ""
+"Commentaires (non publiés mais à conserver) relatifs à l'auteur et à la "
+"gestion de ses droits"
+
+#: src/pyams_content/component/gallery/zmi/templates/gallery-medias.pt:11
+msgid "Gallery medias"
+msgstr "Contenu de la galerie"
+
+#: src/pyams_content/component/gallery/zmi/templates/gallery-medias.pt:17
+msgid "Download medias"
+msgstr "Télécharger tous les médias"
+
+#: src/pyams_content/component/gallery/zmi/templates/gallery-medias.pt:41
+msgid "Zoom image"
+msgstr "Agrandir l'image"
+
+#: src/pyams_content/component/gallery/interfaces/__init__.py:133
 msgid "Medias gallery"
 msgstr "Galerie de médias"
 
@@ -878,12 +197,19 @@
 "Cliquez sur le bouton 'Parcourir...' pour sélectionner un nouveau contenu..."
 
 #: src/pyams_content/component/gallery/interfaces/__init__.py:51
+#: src/pyams_content/component/illustration/interfaces/__init__.py:53
 #: src/pyams_content/component/paragraph/interfaces/video.py:45
+#: src/pyams_content/component/paragraph/interfaces/audio.py:45
 #: src/pyams_content/component/video/interfaces/__init__.py:75
-#: src/pyams_content/component/illustration/interfaces/__init__.py:53
 msgid "Legend"
 msgstr "Légende"
 
+#: src/pyams_content/component/gallery/interfaces/__init__.py:54
+#: src/pyams_content/component/illustration/interfaces/__init__.py:56
+#: src/pyams_content/reference/pictograms/interfaces/__init__.py:48
+msgid "Accessibility title"
+msgstr "Alternative (accessibilité)"
+
 #: src/pyams_content/component/gallery/interfaces/__init__.py:55
 msgid "Alternate title used to describe media content"
 msgstr ""
@@ -893,49 +219,22 @@
 "conformer aux normes d'accessibilité."
 
 #: src/pyams_content/component/gallery/interfaces/__init__.py:58
-#: src/pyams_content/component/gallery/interfaces/__init__.py:98
+#: src/pyams_content/component/gallery/interfaces/__init__.py:101
 #: src/pyams_content/component/extfile/interfaces/__init__.py:40
+#: src/pyams_content/component/illustration/interfaces/__init__.py:64
 #: src/pyams_content/component/paragraph/interfaces/video.py:48
-#: src/pyams_content/component/paragraph/interfaces/audio.py:44
+#: src/pyams_content/component/paragraph/interfaces/audio.py:48
 #: src/pyams_content/component/links/interfaces/__init__.py:39
 #: src/pyams_content/component/video/interfaces/__init__.py:48
-#: src/pyams_content/component/illustration/interfaces/__init__.py:64
+#: src/pyams_content/shared/common/interfaces/__init__.py:154
 #: src/pyams_content/shared/form/interfaces/__init__.py:66
-#: src/pyams_content/shared/common/interfaces/__init__.py:149
 msgid "Description"
 msgstr "Description"
 
-#: src/pyams_content/component/gallery/interfaces/__init__.py:61
-#: src/pyams_content/component/gallery/zmi/interfaces.py:40
-#: src/pyams_content/component/extfile/interfaces/__init__.py:44
-#: src/pyams_content/component/paragraph/interfaces/video.py:52
-#: src/pyams_content/component/paragraph/interfaces/verbatim.py:44
-#: src/pyams_content/component/paragraph/interfaces/audio.py:48
-#: src/pyams_content/component/video/interfaces/__init__.py:52
-#: src/pyams_content/component/illustration/interfaces/__init__.py:68
-msgid "Author"
-msgstr "Auteur"
-
-#: src/pyams_content/component/gallery/interfaces/__init__.py:62
-#: src/pyams_content/component/gallery/zmi/interfaces.py:41
-#: src/pyams_content/component/extfile/interfaces/__init__.py:45
-#: src/pyams_content/component/paragraph/interfaces/video.py:53
-#: src/pyams_content/component/paragraph/interfaces/audio.py:49
-#: src/pyams_content/component/video/interfaces/__init__.py:53
-msgid "Name of document's author"
-msgstr "Sous la forme \"Prénom Nom / Organisme\""
-
 #: src/pyams_content/component/gallery/interfaces/__init__.py:65
 msgid "Author's comments"
 msgstr "À propos de l'auteur"
 
-#: src/pyams_content/component/gallery/interfaces/__init__.py:66
-#: src/pyams_content/component/gallery/zmi/interfaces.py:45
-msgid "Comments relatives to author's rights management"
-msgstr ""
-"Commentaires (non publiés mais à conserver) relatifs à l'auteur et à la "
-"gestion de ses droits"
-
 #: src/pyams_content/component/gallery/interfaces/__init__.py:69
 msgid "Source ID"
 msgstr "ID source"
@@ -948,7 +247,7 @@
 
 #: src/pyams_content/component/gallery/interfaces/__init__.py:73
 #: src/pyams_content/component/extfile/interfaces/__init__.py:89
-#: src/pyams_content/component/paragraph/interfaces/audio.py:52
+#: src/pyams_content/component/paragraph/interfaces/audio.py:41
 msgid "Audio data"
 msgstr "Fichier"
 
@@ -980,125 +279,56 @@
 msgid "If 'no', this media won't be displayed in front office"
 msgstr "Si 'non', ce média ne sera pas présenté aux internautes"
 
-#: src/pyams_content/component/gallery/interfaces/__init__.py:95
+#: src/pyams_content/component/gallery/interfaces/__init__.py:97
+#: src/pyams_content/component/keynumber/portlet/interfaces/__init__.py:31
+#: src/pyams_content/component/paragraph/zmi/milestone.py:232
+#: src/pyams_content/component/paragraph/zmi/container.py:252
+#: src/pyams_content/component/paragraph/interfaces/milestone.py:45
+#: src/pyams_content/component/links/zmi/reverse.py:73
+#: src/pyams_content/shared/common/zmi/dashboard.py:109
+#: src/pyams_content/shared/common/zmi/templates/advanced-search.pt:188
+#: src/pyams_content/shared/view/portlet/interfaces.py:56
+#: src/pyams_content/shared/imagemap/zmi/container.py:123
+#: src/pyams_content/shared/site/zmi/folder.py:70
+#: src/pyams_content/root/zmi/templates/advanced-search.pt:188
+#: src/pyams_content/interfaces/__init__.py:101
+#: src/pyams_content/reference/pictograms/zmi/__init__.py:150
+#: src/pyams_content/features/menu/portlet/navigation/interfaces/simple.py:31
+#: src/pyams_content/features/menu/portlet/navigation/interfaces/double.py:31
+msgid "Title"
+msgstr "Titre"
+
+#: src/pyams_content/component/gallery/interfaces/__init__.py:98
 msgid "Gallery title, as shown in front-office"
 msgstr "Titre de la galerie présenté aux internautes"
 
-#: src/pyams_content/component/gallery/interfaces/__init__.py:99
+#: src/pyams_content/component/gallery/interfaces/__init__.py:102
 msgid "Gallery description displayed by front-office template"
 msgstr "Description de la galerie de médias présentée aux internautes"
 
-#: src/pyams_content/component/gallery/interfaces/__init__.py:102
+#: src/pyams_content/component/gallery/interfaces/__init__.py:105
 msgid "Gallery template"
 msgstr "Mode de rendu"
 
-#: src/pyams_content/component/gallery/interfaces/__init__.py:103
+#: src/pyams_content/component/gallery/interfaces/__init__.py:106
 msgid "Presentation template used for this gallery"
 msgstr ""
 "<span>Modèle de présentation utilisé par cette galerie.<br /"
 "><strong>ATTENTION :</strong> certains modes de rendu ne prennent en charge "
 "que certains types de médias !!</span>"
 
-#: src/pyams_content/component/gallery/zmi/interfaces.py:36
-msgid "Images or videos data"
-msgstr "Fichier"
-
-#: src/pyams_content/component/gallery/zmi/interfaces.py:37
-msgid "You can upload a single file or choose to upload a whole ZIP archive"
-msgstr ""
-"Vous pouvez déposer les médias un par un, ou en nombre en les réunissant au "
-"préalable dans un fichier ZIP"
-
-#: src/pyams_content/component/gallery/zmi/interfaces.py:44
-msgid "Author comments"
-msgstr "À propos de l'auteur"
-
-#: src/pyams_content/component/gallery/zmi/paragraph.py:56
-msgid "Medias gallery..."
-msgstr "Galerie de médias"
-
-#: src/pyams_content/component/gallery/zmi/paragraph.py:69
-msgid "Add new gallery"
-msgstr "Ajout d'une galerie de médias"
-
-#: src/pyams_content/component/gallery/zmi/paragraph.py:96
-msgid "Edit gallery properties"
-msgstr "Propriétés de la galerie de médias"
-
-#: src/pyams_content/component/gallery/zmi/paragraph.py:164
-#: src/pyams_content/component/gallery/zmi/file.py:57
-#: src/pyams_content/component/gallery/zmi/file.py:69
-msgid "Add media(s)"
-msgstr "Ajouter des médias"
-
-#: src/pyams_content/component/gallery/zmi/__init__.py:63
-msgid "Update gallery properties"
-msgstr "Propriétés de la galerie de médias"
-
-#: src/pyams_content/component/gallery/zmi/__init__.py:95
-msgid "Update gallery contents"
-msgstr "Contenu de la galerie de médias"
-
-#: src/pyams_content/component/gallery/zmi/file.py:184
-msgid "Update media properties"
-msgstr "Propriétés du média"
-
-#: src/pyams_content/component/gallery/zmi/file.py:238
-msgid "Remove media..."
-msgstr "Supprimer le média"
-
-#: src/pyams_content/component/gallery/zmi/file.py:148
-msgid "Show/hide media"
-msgstr "Cliquez pour rendre le média visible ou non"
-
-#: src/pyams_content/component/gallery/zmi/file.py:211
-msgid "Audio content"
-msgstr "Contenu audio associé"
-
-#: src/pyams_content/component/gallery/zmi/templates/gallery-medias.pt:11
-msgid "Gallery medias"
-msgstr "Contenu de la galerie"
-
-#: src/pyams_content/component/gallery/zmi/templates/gallery-medias.pt:17
-msgid "Download medias"
-msgstr "Télécharger tous les médias"
-
-#: src/pyams_content/component/gallery/zmi/templates/gallery-medias.pt:41
-msgid "Zoom image"
-msgstr "Agrandir l'image"
-
-#: src/pyams_content/component/theme/__init__.py:65
-#: src/pyams_content/component/theme/interfaces/__init__.py:43
-#: src/pyams_content/component/theme/zmi/portlet.py:40
-msgid "Themes"
-msgstr "Thèmes"
-
-#: src/pyams_content/component/theme/__init__.py:74
-msgid "no defined theme"
-msgstr "aucun thème défini"
-
-#: src/pyams_content/component/theme/zmi/__init__.py:51
-#: src/pyams_content/shared/view/zmi/theme.py:48
-msgid "Themes..."
-msgstr "Thèmes"
-
-#: src/pyams_content/component/theme/zmi/__init__.py:63
-msgid "Content themes"
-msgstr "Thèmes du contenu"
-
-#: src/pyams_content/component/theme/zmi/manager.py:45
-msgid "Themes settings..."
-msgstr "Paramétrage des thèmes"
-
-#: src/pyams_content/component/theme/zmi/manager.py:59
-msgid "Selected themes"
-msgstr "Thèmes sélectionnés"
-
 #: src/pyams_content/component/extfile/__init__.py:172
 #: src/pyams_content/component/extfile/__init__.py:176
 msgid "Standard file"
 msgstr "Fichier"
 
+#: src/pyams_content/component/extfile/__init__.py:223
+#: src/pyams_content/component/extfile/__init__.py:238
+#: src/pyams_content/shared/imagemap/interfaces/__init__.py:67
+#: src/pyams_content/reference/pictograms/interfaces/__init__.py:44
+msgid "Image"
+msgstr "Image"
+
 #: src/pyams_content/component/extfile/__init__.py:253
 #: src/pyams_content/component/extfile/__init__.py:257
 #: src/pyams_content/component/paragraph/interfaces/video.py:34
@@ -1110,10 +340,78 @@
 msgid "Audio file"
 msgstr "Fichier audio"
 
+#: src/pyams_content/component/extfile/zmi/__init__.py:74
+msgid "External files"
+msgstr "Fichiers"
+
+#: src/pyams_content/component/extfile/zmi/__init__.py:89
+msgid "Add external file"
+msgstr "Fichier"
+
+#: src/pyams_content/component/extfile/zmi/__init__.py:103
+msgid "Add new external file"
+msgstr "Ajout d'un fichier"
+
+#: src/pyams_content/component/extfile/zmi/__init__.py:133
+msgid "Update file properties"
+msgstr "Propriétés du fichier"
+
+#: src/pyams_content/component/extfile/zmi/__init__.py:161
+msgid "Images"
+msgstr "Images"
+
+#: src/pyams_content/component/extfile/zmi/__init__.py:176
+msgid "Add image"
+msgstr "Image téléchargeable"
+
+#: src/pyams_content/component/extfile/zmi/__init__.py:190
+msgid "Add new image"
+msgstr "Ajout d'une image téléchargeable"
+
+#: src/pyams_content/component/extfile/zmi/__init__.py:221
+msgid "Update image properties"
+msgstr "Propriétés de l'image téléchargeable"
+
+#: src/pyams_content/component/extfile/zmi/__init__.py:254
+msgid "Videos"
+msgstr "Vidéos"
+
+#: src/pyams_content/component/extfile/zmi/__init__.py:269
+msgid "Add video"
+msgstr "Vidéo téléchargeable"
+
+#: src/pyams_content/component/extfile/zmi/__init__.py:283
+msgid "Add new video"
+msgstr "Ajout d'une vidéo téléchargeable"
+
+#: src/pyams_content/component/extfile/zmi/__init__.py:307
+msgid "Update video properties"
+msgstr "Propriétés de la vidéo téléchargeable"
+
+#: src/pyams_content/component/extfile/zmi/__init__.py:333
+msgid "Audios files"
+msgstr "Fichiers audios"
+
+#: src/pyams_content/component/extfile/zmi/__init__.py:348
+msgid "Add audio file"
+msgstr "Bande son téléchargeable"
+
+#: src/pyams_content/component/extfile/zmi/__init__.py:362
+msgid "Add new audio file"
+msgstr "Ajout d'une bande son téléchargeable"
+
+#: src/pyams_content/component/extfile/zmi/__init__.py:386
+msgid "Update audio file properties"
+msgstr "Propriétés de la bande son téléchargeable"
+
+#: src/pyams_content/component/extfile/zmi/__init__.py:50
+msgid "External file type"
+msgstr "Type de fichier joint"
+
 #: src/pyams_content/component/extfile/interfaces/__init__.py:36
 #: src/pyams_content/component/links/interfaces/__init__.py:35
-#: src/pyams_content/shared/imagemap/interfaces/__init__.py:54
-#: src/pyams_content/shared/site/interfaces/__init__.py:113
+#: src/pyams_content/shared/imagemap/interfaces/__init__.py:55
+#: src/pyams_content/shared/site/interfaces/__init__.py:114
 msgid "Alternate title"
 msgstr "Titre de substitution"
 
@@ -1123,13 +421,13 @@
 
 #: src/pyams_content/component/extfile/interfaces/__init__.py:41
 #: src/pyams_content/component/paragraph/interfaces/video.py:49
-#: src/pyams_content/component/paragraph/interfaces/audio.py:45
+#: src/pyams_content/component/paragraph/interfaces/audio.py:49
 #: src/pyams_content/component/video/interfaces/__init__.py:49
 msgid "File description displayed by front-office template"
 msgstr "Description du fichier, présentée aux internautes"
 
 #: src/pyams_content/component/extfile/interfaces/__init__.py:48
-#: src/pyams_content/component/links/interfaces/__init__.py:68
+#: src/pyams_content/component/links/interfaces/__init__.py:65
 msgid "Language"
 msgstr "Langue"
 
@@ -1158,7 +456,7 @@
 "Cliquez sur le bouton 'Parcourir...' pour sélectionner un nouveau contenu"
 
 #: src/pyams_content/component/extfile/interfaces/__init__.py:73
-#: src/pyams_content/shared/logo/interfaces/__init__.py:47
+#: src/pyams_content/shared/logo/interfaces/__init__.py:48
 msgid "Image data"
 msgstr "Fichier"
 
@@ -1178,78 +476,182 @@
 "Cliquez sur le bouton 'Parcourir...' pour sélectionner un nouveau contenu"
 
 #: src/pyams_content/component/extfile/interfaces/__init__.py:90
-#: src/pyams_content/component/paragraph/interfaces/audio.py:53
+#: src/pyams_content/component/paragraph/interfaces/audio.py:42
 msgid "Audio file content"
 msgstr ""
 "Cliquez sur le bouton 'Parcourir...' pour sélectionner un nouveau contenu"
 
-#: src/pyams_content/component/extfile/zmi/__init__.py:74
-msgid "External files"
-msgstr "Fichiers"
-
-#: src/pyams_content/component/extfile/zmi/__init__.py:89
-msgid "Add external file"
-msgstr "Fichier"
-
-#: src/pyams_content/component/extfile/zmi/__init__.py:103
-msgid "Add new external file"
-msgstr "Ajout d'un fichier"
-
-#: src/pyams_content/component/extfile/zmi/__init__.py:138
-msgid "Update file properties"
-msgstr "Propriétés du fichier"
-
-#: src/pyams_content/component/extfile/zmi/__init__.py:171
-msgid "Images"
-msgstr "Images"
-
-#: src/pyams_content/component/extfile/zmi/__init__.py:186
-msgid "Add image"
-msgstr "Image téléchargeable"
-
-#: src/pyams_content/component/extfile/zmi/__init__.py:200
-msgid "Add new image"
-msgstr "Ajout d'une image téléchargeable"
-
-#: src/pyams_content/component/extfile/zmi/__init__.py:231
-msgid "Update image properties"
-msgstr "Propriétés de l'image téléchargeable"
-
-#: src/pyams_content/component/extfile/zmi/__init__.py:264
-msgid "Videos"
-msgstr "Vidéos"
-
-#: src/pyams_content/component/extfile/zmi/__init__.py:279
-msgid "Add video"
-msgstr "Vidéo téléchargeable"
-
-#: src/pyams_content/component/extfile/zmi/__init__.py:293
-msgid "Add new video"
-msgstr "Ajout d'une vidéo téléchargeable"
-
-#: src/pyams_content/component/extfile/zmi/__init__.py:317
-msgid "Update video properties"
-msgstr "Propriétés de la vidéo téléchargeable"
-
-#: src/pyams_content/component/extfile/zmi/__init__.py:343
-msgid "Audios files"
-msgstr "Fichiers audios"
-
-#: src/pyams_content/component/extfile/zmi/__init__.py:358
-msgid "Add audio file"
-msgstr "Bande son téléchargeable"
-
-#: src/pyams_content/component/extfile/zmi/__init__.py:372
-msgid "Add new audio file"
-msgstr "Ajout d'une bande son téléchargeable"
-
-#: src/pyams_content/component/extfile/zmi/__init__.py:396
-msgid "Update audio file properties"
-msgstr "Propriétés de la bande son téléchargeable"
-
-#: src/pyams_content/component/extfile/zmi/__init__.py:50
-msgid "External file type"
-msgstr "Type de fichier joint"
+#: src/pyams_content/component/keynumber/__init__.py:189
+#: src/pyams_content/component/keynumber/zmi/__init__.py:199
+#: src/pyams_content/component/keynumber/portlet/zmi/__init__.py:74
+#: src/pyams_content/component/paragraph/interfaces/keynumber.py:29
+msgid "Key numbers"
+msgstr "Chiffres-clés"
+
+#. Default: Header
+#: src/pyams_content/component/keynumber/zmi/__init__.py:147
+#: src/pyams_content/component/keynumber/interfaces/__init__.py:44
+msgid "key-number-label"
+msgstr "En-tête"
+
+#: src/pyams_content/component/keynumber/zmi/__init__.py:159
+#: src/pyams_content/component/keynumber/interfaces/__init__.py:49
+msgid "Number"
+msgstr "Chiffre"
+
+#. Default: Unit
+#: src/pyams_content/component/keynumber/zmi/__init__.py:168
+#: src/pyams_content/component/keynumber/interfaces/__init__.py:53
+msgid "key-number-unit"
+msgstr "Unité"
+
+#: src/pyams_content/component/keynumber/zmi/__init__.py:180
+#: src/pyams_content/component/keynumber/interfaces/__init__.py:57
+#: src/pyams_content/component/paragraph/zmi/pictogram.py:268
+#: src/pyams_content/component/paragraph/interfaces/pictogram.py:58
+msgid "Associated text"
+msgstr "Texte associé"
+
+#: src/pyams_content/component/keynumber/zmi/__init__.py:218
+msgid "Add keynumber"
+msgstr "Ajouter un chiffre-clé"
+
+#: src/pyams_content/component/keynumber/zmi/__init__.py:230
+msgid "Add new keynumber"
+msgstr "Ajout d'un chiffre-clé"
+
+#: src/pyams_content/component/keynumber/zmi/__init__.py:259
+msgid "Edit keynumber properties"
+msgstr "Propriétés du chiffre-clé"
+
+#: src/pyams_content/component/keynumber/zmi/__init__.py:245
+msgid "Key number was correctly added"
+msgstr "Le chiffre-clé a été ajouté."
+
+#: src/pyams_content/component/keynumber/portlet/__init__.py:71
+msgid "Key Numbers"
+msgstr "Chiffres-clés"
+
+#: src/pyams_content/component/keynumber/portlet/zmi/__init__.py:97
+#: src/pyams_content/component/keynumber/portlet/zmi/templates/keynumber-preview.pt:26
+msgid "Associated links"
+msgstr "Liens associés"
+
+#: src/pyams_content/component/keynumber/portlet/zmi/templates/keynumber-preview.pt:31
+#: src/pyams_content/features/menu/portlet/navigation/zmi/templates/double-preview.pt:11
+#: src/pyams_content/features/menu/portlet/navigation/zmi/templates/simple-preview.pt:8
+msgid "Link target is not published!"
+msgstr "Le contenu ciblé n'est pas publié"
+
+#: src/pyams_content/component/keynumber/portlet/interfaces/__init__.py:32
+msgid "Portlet title"
+msgstr "Titre"
+
+#: src/pyams_content/component/keynumber/portlet/interfaces/__init__.py:35
+msgid "Teaser"
+msgstr "Accroche"
+
+#: src/pyams_content/component/keynumber/portlet/interfaces/__init__.py:36
+msgid "Short text displayed above key numbers"
+msgstr "Texte d'introduction des chiffres-clés"
+
+#: src/pyams_content/component/keynumber/interfaces/__init__.py:39
+#: src/pyams_content/component/paragraph/interfaces/milestone.py:40
+#: src/pyams_content/component/paragraph/interfaces/__init__.py:44
+#: src/pyams_content/component/paragraph/interfaces/pictogram.py:41
+#: src/pyams_content/component/association/interfaces/__init__.py:42
+#: src/pyams_content/shared/form/interfaces/__init__.py:87
+#: src/pyams_content/shared/site/interfaces/__init__.py:118
+#: src/pyams_content/features/alert/interfaces.py:54
+#: src/pyams_content/features/menu/interfaces/__init__.py:59
+msgid "Visible?"
+msgstr "Visible ?"
+
+#: src/pyams_content/component/keynumber/interfaces/__init__.py:40
+msgid "Is this key number visible in front-office?"
+msgstr "Si 'non', ce chiffre-clé ne sera pas présenté aux internautes"
+
+#: src/pyams_content/component/keynumber/interfaces/__init__.py:45
+msgid ""
+"Small text to be displayed above number (according to selected renderer)"
+msgstr ""
+"Texte court affiché au-dessus du chiffre (selon le mode de rendu sélectionné)"
+
+#: src/pyams_content/component/keynumber/interfaces/__init__.py:50
+msgid "Key number value"
+msgstr "Chiffre"
+
+#: src/pyams_content/component/keynumber/interfaces/__init__.py:54
+msgid "Displayed unit"
+msgstr "Unité affichée"
+
+#: src/pyams_content/component/keynumber/interfaces/__init__.py:58
+msgid "The way this text will be rendered depends on presentation template"
+msgstr ""
+"La présentation de cette information peut varier en fonction du mode de "
+"rendu choisi"
+
+#: src/pyams_content/component/illustration/__init__.py:177
+#: src/pyams_content/component/illustration/thesaurus.py:32
+#: src/pyams_content/component/illustration/zmi/paragraph.py:158
+#: src/pyams_content/component/illustration/zmi/__init__.py:56
+#: src/pyams_content/component/illustration/zmi/__init__.py:100
+#: src/pyams_content/component/illustration/interfaces/__init__.py:99
+msgid "Illustration"
+msgstr "Illustration"
+
+#: src/pyams_content/component/illustration/zmi/paragraph.py:60
+msgid "Illustration..."
+msgstr "Illustration"
+
+#: src/pyams_content/component/illustration/zmi/paragraph.py:73
+msgid "Add new illustration"
+msgstr "Ajout d'une illustration"
+
+#: src/pyams_content/component/illustration/zmi/paragraph.py:98
+#: src/pyams_content/component/illustration/zmi/thesaurus.py:42
+msgid "Edit illustration properties"
+msgstr "Propriétés de l'illustration"
+
+#: src/pyams_content/component/illustration/zmi/__init__.py:150
+msgid "Navigation link illustration"
+msgstr "Illustration de navigation"
+
+#: src/pyams_content/component/illustration/zmi/__init__.py:102
+msgid "Header illustration"
+msgstr "Illustration d'en-tête"
+
+#: src/pyams_content/component/illustration/interfaces/__init__.py:57
+#: src/pyams_content/reference/pictograms/interfaces/__init__.py:49
+msgid "Alternate title used to describe image content"
+msgstr ""
+"Ce texte est affiché lorsque le contenu ne peut être téléchargé ou affiché ; "
+"il est aussi utilisé par les navigateurs des personnes souffrant de "
+"déficiences visuelles. Il doit donc décrire le contenu, pour se conformer "
+"aux normes d'accessibilité."
+
+#: src/pyams_content/component/illustration/interfaces/__init__.py:69
+msgid "Name of picture's author"
+msgstr "Sous la forme \"Prénom Nom / Organisme\""
+
+#: src/pyams_content/component/illustration/interfaces/__init__.py:72
+msgid "Illustration template"
+msgstr "Mode de rendu"
+
+#: src/pyams_content/component/illustration/interfaces/__init__.py:73
+msgid "Presentation template used for illustration"
+msgstr ""
+"<span>Modèle de présentation utilisé par cette illustration.<br /"
+"><strong>ATTENTION :</strong> certains modes de rendu ne prennent pas en "
+"compte tous les types de médias !</span>"
+
+#: src/pyams_content/component/paragraph/milestone.py:140
+msgid "Selected paragraph is missing"
+msgstr "le bloc sélectionné est introuvable"
+
+#: src/pyams_content/component/paragraph/milestone.py:143
+msgid "Selected paragraph is not visible"
+msgstr "le bloc sélectionné n'est pas visible"
 
 #: src/pyams_content/component/paragraph/container.py:73
 msgid "Paragraphs"
@@ -1263,23 +665,441 @@
 msgid "Selected pictogram is missing"
 msgstr "le pictogramme sélectionné est introuvable"
 
-#: src/pyams_content/component/paragraph/milestone.py:140
-msgid "Selected paragraph is missing"
-msgstr "le bloc sélectionné est introuvable"
-
-#: src/pyams_content/component/paragraph/milestone.py:143
-msgid "Selected paragraph is not visible"
-msgstr "le bloc sélectionné n'est pas visible"
-
+#: src/pyams_content/component/paragraph/zmi/milestone.py:78
+msgid "Milestones..."
+msgstr "Chronologie"
+
+#: src/pyams_content/component/paragraph/zmi/milestone.py:91
+msgid "Add new milestone paragraph"
+msgstr "Ajout d'une chronologie"
+
+#: src/pyams_content/component/paragraph/zmi/milestone.py:118
+msgid "Edit milestone paragraph properties"
+msgstr "Propriétés de la chronologie"
+
+#: src/pyams_content/component/paragraph/zmi/milestone.py:244
+#: src/pyams_content/component/paragraph/interfaces/milestone.py:49
+msgid "Associated label"
+msgstr "Information associée"
+
+#: src/pyams_content/component/paragraph/zmi/milestone.py:256
+#: src/pyams_content/component/paragraph/interfaces/milestone.py:53
+msgid "Anchor"
+msgstr "Ancre"
+
+#: src/pyams_content/component/paragraph/zmi/milestone.py:285
+#: src/pyams_content/component/paragraph/interfaces/milestone.py:76
+msgid "Milestones"
+msgstr "Chronologie"
+
+#: src/pyams_content/component/paragraph/zmi/milestone.py:300
+msgid "Add milestone"
+msgstr "Ajouter un jalon"
+
+#: src/pyams_content/component/paragraph/zmi/milestone.py:313
+msgid "Add new milestone"
+msgstr "Ajout d'un jalon"
+
+#: src/pyams_content/component/paragraph/zmi/milestone.py:340
+msgid "Edit milestone properties"
+msgstr "Propriétés du jalon"
+
+#: src/pyams_content/component/paragraph/zmi/milestone.py:328
+msgid "Milestone was correctly added"
+msgstr "Le jalon a été ajouté."
+
+#: src/pyams_content/component/paragraph/zmi/milestone.py:271
+msgid "(missing paragraph)"
+msgstr "(paragraphe supprimé)"
+
+#: src/pyams_content/component/paragraph/zmi/keypoint.py:52
+msgid "Key points..."
+msgstr "Points clés"
+
+#: src/pyams_content/component/paragraph/zmi/keypoint.py:65
+msgid "Add new key points paragraph"
+msgstr "Ajout de points clés"
+
+#: src/pyams_content/component/paragraph/zmi/keypoint.py:92
+msgid "Edit key points paragraph properties"
+msgstr "Propriétés des points clés"
+
+#: src/pyams_content/component/paragraph/zmi/__init__.py:65
+msgid "Content block types..."
+msgstr "Types de blocs de contenu"
+
+#: src/pyams_content/component/paragraph/zmi/__init__.py:79
+msgid "Content block types"
+msgstr "Types de blocs de contenu"
+
+#: src/pyams_content/component/paragraph/zmi/__init__.py:89
+msgid ""
+"You can define which types of paragraphs are allowed in this container.\n"
+"\n"
+"Default paragraphs will be added automatically (in selected order) to any "
+"new created content.\n"
+"\n"
+"NOTICE: removing types from allowed types list will have no effect on "
+"already created contents!"
+msgstr ""
+"Vous pouvez indiquer la liste des types de blocs de contenu autorisés pour "
+"ce gabarit.\n"
+"\n"
+"Les types de blocs par défaut seront ajoutés automatiquement (dans l'ordre "
+"défini) à chaque nouveau contenu créé selon ce gabarit.\n"
+"\n"
+"REMARQUE : supprimer des types de la liste des types de blocs autorisés sera "
+"sans effet sur les contenus existants."
+
+#: src/pyams_content/component/paragraph/zmi/__init__.py:207
+#: src/pyams_content/shared/common/zmi/templates/preview-input.pt:39
+#: src/pyams_content/features/preview/zmi/__init__.py:45
+msgid "Preview"
+msgstr "Aperçu"
+
+#: src/pyams_content/component/paragraph/zmi/__init__.py:212
+#: src/pyams_content/shared/common/zmi/workflow.py:123
+#: src/pyams_content/shared/common/zmi/workflow.py:210
+#: src/pyams_content/shared/common/zmi/workflow.py:250
+#: src/pyams_content/shared/common/zmi/workflow.py:304
+#: src/pyams_content/shared/common/zmi/workflow.py:393
+#: src/pyams_content/shared/common/zmi/workflow.py:449
+#: src/pyams_content/shared/common/zmi/workflow.py:489
+#: src/pyams_content/shared/common/zmi/workflow.py:530
+#: src/pyams_content/shared/common/zmi/workflow.py:573
+#: src/pyams_content/shared/common/zmi/workflow.py:613
+#: src/pyams_content/shared/common/zmi/workflow.py:654
+#: src/pyams_content/shared/common/zmi/workflow.py:705
+#: src/pyams_content/shared/common/zmi/__init__.py:273
+#: src/pyams_content/shared/common/zmi/owner.py:73
+#: src/pyams_content/features/review/zmi/__init__.py:90
+msgid "Cancel"
+msgstr "Annuler"
+
+#: src/pyams_content/component/paragraph/zmi/__init__.py:214
+msgid "Submit"
+msgstr "Enregistrer"
+
+#: src/pyams_content/component/paragraph/zmi/__init__.py:195
+msgid "Paragraph was correctly added."
+msgstr "Le bloc a été ajouté."
+
+#: src/pyams_content/component/paragraph/zmi/video.py:54
+msgid "Video paragraph..."
+msgstr "Vidéo"
+
+#: src/pyams_content/component/paragraph/zmi/video.py:67
+msgid "Add new video paragraph"
+msgstr "Ajout d'une vidéo"
+
+#: src/pyams_content/component/paragraph/zmi/video.py:90
+#: src/pyams_content/component/video/zmi/paragraph.py:189
+msgid "Edit video properties"
+msgstr "Propriétés de la vidéo"
+
+#: src/pyams_content/component/paragraph/zmi/container.py:74
+msgid "Contents..."
+msgstr "Contenu"
+
+#: src/pyams_content/component/paragraph/zmi/container.py:196
+msgid "Set navigation anchor"
+msgstr "Ancre de navigation"
+
+#: src/pyams_content/component/paragraph/zmi/container.py:268
+msgid "Show/hide all paragraphs"
+msgstr "Afficher/masquer tous les blocs"
+
+#: src/pyams_content/component/paragraph/zmi/container.py:316
+#: src/pyams_content/component/paragraph/zmi/container.py:325
+#: src/pyams_content/component/paragraph/zmi/container.py:338
+msgid "Content blocks"
+msgstr "Blocs de contenu"
+
+#: src/pyams_content/component/paragraph/zmi/container.py:395
+msgid "Links and attachments..."
+msgstr "Récap. liens et PJ"
+
+#: src/pyams_content/component/paragraph/zmi/container.py:407
+msgid "Content blocks links and attachments"
+msgstr "Récapitulatif des liens et pièces jointes par bloc de contenu"
+
+#: src/pyams_content/component/paragraph/zmi/container.py:127
+msgid "No currently defined paragraph."
+msgstr "Aucun bloc n'est associé à ce contenu."
+
+#: src/pyams_content/component/paragraph/zmi/container.py:277
+msgid "Click to open/close all paragraphs editors"
+msgstr "Afficher/masquer tous les blocs"
+
+#: src/pyams_content/component/paragraph/zmi/container.py:290
+msgid "Click to open/close paragraph editor"
+msgstr "Afficher/masquer ce bloc"
+
+#: src/pyams_content/component/paragraph/zmi/container.py:133
+msgid "Check allowed paragraph types to be able to create new paragraphs."
+msgstr ""
+"Vérifiez le paramétrage des types de blocs de contenu autorisés pour pouvoir "
+"ajouter de nouveaux blocs."
+
+#: src/pyams_content/component/paragraph/zmi/pictogram.py:83
+msgid "Pictograms..."
+msgstr "Pictogrammes"
+
+#: src/pyams_content/component/paragraph/zmi/pictogram.py:96
+msgid "Add new pictogram paragraph"
+msgstr "Ajout de pictogrammes"
+
+#: src/pyams_content/component/paragraph/zmi/pictogram.py:123
+msgid "Edit pictogram paragraph properties"
+msgstr "Propriétés des pictogrammes"
+
+#. Default: Header
+#: src/pyams_content/component/paragraph/zmi/pictogram.py:253
+msgid "pictogram-item-header"
+msgstr "En-tête"
+
+#: src/pyams_content/component/paragraph/zmi/pictogram.py:290
 #: src/pyams_content/component/paragraph/interfaces/pictogram.py:80
-#: src/pyams_content/component/paragraph/zmi/pictogram.py:289
 msgid "Pictograms"
 msgstr "Pictogrammes"
 
+#: src/pyams_content/component/paragraph/zmi/pictogram.py:305
+#: src/pyams_content/reference/pictograms/zmi/__init__.py:59
+msgid "Add pictogram"
+msgstr "Ajouter un pictogramme"
+
+#: src/pyams_content/component/paragraph/zmi/pictogram.py:318
+#: src/pyams_content/reference/pictograms/zmi/__init__.py:71
+msgid "Add new pictogram"
+msgstr "Ajout d'un pictogramme"
+
+#: src/pyams_content/component/paragraph/zmi/pictogram.py:360
+#: src/pyams_content/reference/pictograms/zmi/__init__.py:95
+msgid "Edit pictogram properties"
+msgstr "Propriétés du pictogramme"
+
+#: src/pyams_content/component/paragraph/zmi/pictogram.py:340
+msgid "Pictogram was correctly added"
+msgstr "Le pictogramme a été ajouté."
+
+#: src/pyams_content/component/paragraph/zmi/pictogram.py:350
+#: src/pyams_content/component/paragraph/zmi/pictogram.py:388
+msgid "You must select a pictogram!"
+msgstr "Vous devez sélectionner un pictogramme !"
+
+#: src/pyams_content/component/paragraph/zmi/audio.py:54
+msgid "Audio paragraph..."
+msgstr "Bande son"
+
+#: src/pyams_content/component/paragraph/zmi/audio.py:67
+msgid "Add new audio paragraph"
+msgstr "Ajout d'une bande son"
+
+#: src/pyams_content/component/paragraph/zmi/audio.py:89
+msgid "Edit audio properties"
+msgstr "Propriétés de la bande son"
+
+#: src/pyams_content/component/paragraph/zmi/keynumber.py:55
+msgid "Key numbers..."
+msgstr "Chiffres-clés"
+
+#: src/pyams_content/component/paragraph/zmi/keynumber.py:68
+msgid "Add new key number paragraph"
+msgstr "Ajout de chiffres-clés"
+
+#: src/pyams_content/component/paragraph/zmi/keynumber.py:96
+msgid "Edit key number paragraph properties"
+msgstr "Propriétés des chiffres-clés"
+
+#: src/pyams_content/component/paragraph/zmi/frame.py:85
+msgid "Framed text..."
+msgstr "Encadré"
+
+#: src/pyams_content/component/paragraph/zmi/frame.py:99
+msgid "Add new framed text paragraph"
+msgstr "Ajout d'un encadré"
+
+#: src/pyams_content/component/paragraph/zmi/frame.py:125
+msgid "Edit framed text paragraph properties"
+msgstr "Propriétés de l'encadré"
+
+#: src/pyams_content/component/paragraph/zmi/verbatim.py:57
+msgid "Verbatim..."
+msgstr "Verbatim"
+
+#: src/pyams_content/component/paragraph/zmi/verbatim.py:70
+msgid "Add new verbatim paragraph"
+msgstr "Ajout d'un verbatim"
+
+#: src/pyams_content/component/paragraph/zmi/verbatim.py:92
+msgid "Edit verbatim paragraph properties"
+msgstr "Propriétés du verbatim"
+
+#: src/pyams_content/component/paragraph/zmi/html.py:76
+msgid "Raw HTML..."
+msgstr "Code HTML"
+
+#: src/pyams_content/component/paragraph/zmi/html.py:89
+msgid "Add new raw HTML paragraph"
+msgstr "Ajout d'un bloc de code HTML"
+
+#: src/pyams_content/component/paragraph/zmi/html.py:119
+msgid "Edit raw HTML paragraph properties"
+msgstr "Propriétés du code HTML"
+
+#: src/pyams_content/component/paragraph/zmi/html.py:159
+msgid "Rich text..."
+msgstr "Texte enrichi"
+
+#: src/pyams_content/component/paragraph/zmi/html.py:172
+msgid "Add new rich text paragraph"
+msgstr "Ajout d'un bloc de texte enrichi"
+
+#: src/pyams_content/component/paragraph/zmi/html.py:197
+msgid "Edit rich text paragraph properties"
+msgstr "Propriétés du texte enrichi"
+
+#: src/pyams_content/component/paragraph/zmi/contact.py:53
+msgid "Contact card..."
+msgstr "Fiche contact"
+
+#: src/pyams_content/component/paragraph/zmi/contact.py:66
+msgid "Add new contact card"
+msgstr "Ajout d'une fiche contact"
+
+#: src/pyams_content/component/paragraph/zmi/contact.py:89
+msgid "Edit contact card properties"
+msgstr "Propriétés de la fiche contact"
+
+#: src/pyams_content/component/paragraph/zmi/header.py:50
+msgid "Header..."
+msgstr "Chapô"
+
+#: src/pyams_content/component/paragraph/zmi/header.py:63
+msgid "Add new header paragraph"
+msgstr "Ajout d'un chapô"
+
+#: src/pyams_content/component/paragraph/zmi/header.py:90
+msgid "Edit header paragraph properties"
+msgstr "Propriétés du chapô"
+
+#: src/pyams_content/component/paragraph/interfaces/milestone.py:41
+msgid "Is this milestone visible in front-office?"
+msgstr "Si 'non', ce jalon ne sera pas présenté aux internautes"
+
+#: src/pyams_content/component/paragraph/interfaces/milestone.py:46
+msgid "Milestone title"
+msgstr "Libellé associé au jalon"
+
+#: src/pyams_content/component/paragraph/interfaces/milestone.py:50
+msgid "The way this label will be rendered depends on presentation template"
+msgstr ""
+"La présentation de cette information peut varier en fonction du mode de "
+"rendu choisi"
+
+#: src/pyams_content/component/paragraph/interfaces/milestone.py:54
+msgid "Paragraph to which this milestone should lead"
+msgstr "Bloc de contenu vers lequel ce jalon doit conduire"
+
+#: src/pyams_content/component/paragraph/interfaces/milestone.py:83
+msgid "Milestones template"
+msgstr "Mode de rendu"
+
+#: src/pyams_content/component/paragraph/interfaces/milestone.py:84
+msgid "Presentation template used for milestones"
+msgstr "Modèle de présentation utilisé par ce bloc de contenu"
+
+#: src/pyams_content/component/paragraph/interfaces/keypoint.py:33
+#: src/pyams_content/component/paragraph/interfaces/keypoint.py:40
+msgid "Key points"
+msgstr "Points clés"
+
+#: src/pyams_content/component/paragraph/interfaces/keypoint.py:41
+msgid "Enter one key point by line, without hyphen or prefix"
+msgstr ""
+"Indiquez un point clé par ligne, sans tiret. Passez à la ligne entre chaque "
+"point clé, la mise en forme sera effectuée automatiquement."
+
+#: src/pyams_content/component/paragraph/interfaces/keypoint.py:44
+msgid "Presentation template"
+msgstr "Mode de rendu"
+
+#: src/pyams_content/component/paragraph/interfaces/keypoint.py:45
+#: src/pyams_content/component/paragraph/interfaces/frame.py:44
+#: src/pyams_content/component/paragraph/interfaces/verbatim.py:53
+#: src/pyams_content/component/paragraph/interfaces/html.py:46
+#: src/pyams_content/component/paragraph/interfaces/html.py:67
+#: src/pyams_content/shared/imagemap/interfaces/__init__.py:101
+#: src/pyams_content/shared/logo/interfaces/__init__.py:82
+msgid "Presentation template used for this paragraph"
+msgstr "Mode de rendu utilisé par ce bloc de contenu"
+
+#: src/pyams_content/component/paragraph/interfaces/__init__.py:45
+msgid "Is this paragraph visible in front-office?"
+msgstr "Si 'non', ce bloc de contenu ne sera pas présenté aux internautes"
+
+#: src/pyams_content/component/paragraph/interfaces/__init__.py:49
+msgid "Anchor?"
+msgstr "Ancre ?"
+
+#: src/pyams_content/component/paragraph/interfaces/__init__.py:50
+msgid "Is this paragraph a navigation anchor?"
+msgstr ""
+"Si 'oui', ce bloc pourra recevoir une ancre de navigation au sein du contenu"
+
+#: src/pyams_content/component/paragraph/interfaces/__init__.py:54
+msgid "§ Title"
+msgstr "Titre §"
+
+#: src/pyams_content/component/paragraph/interfaces/__init__.py:88
+msgid "Allowed paragraphs"
+msgstr "Types de blocs autorisés"
+
+#: src/pyams_content/component/paragraph/interfaces/__init__.py:89
+msgid "List of paragraphs allowed for this content type"
+msgstr "Liste des types de blocs de contenu autorisés pour ce gabarit."
+
+#: src/pyams_content/component/paragraph/interfaces/__init__.py:93
+#: src/pyams_content/shared/common/zmi/types.py:173
+#: src/pyams_content/shared/common/zmi/types.py:413
+msgid "Default paragraphs"
+msgstr "Types de blocs par défaut"
+
+#: src/pyams_content/component/paragraph/interfaces/__init__.py:94
+msgid "List of paragraphs automatically added to a new content"
+msgstr "Liste des types de blocs ajoutés automatiquement aux nouveaux contenus"
+
+#: src/pyams_content/component/paragraph/interfaces/video.py:42
+msgid "Video file content"
+msgstr ""
+"Cliquez sur le bouton 'Parcourir...' pour sélectionner un nouveau contenu"
+
+#: src/pyams_content/component/paragraph/interfaces/video.py:56
+#: src/pyams_content/component/video/interfaces/__init__.py:78
+msgid "Video template"
+msgstr "Mode de rendu"
+
+#: src/pyams_content/component/paragraph/interfaces/video.py:57
+#: src/pyams_content/component/video/interfaces/__init__.py:79
+msgid "Presentation template used for this video"
+msgstr "Mode de rendu utilisé par cette vidéo"
+
 #: src/pyams_content/component/paragraph/interfaces/pictogram.py:42
 msgid "Is this pictogram visible in front-office?"
 msgstr "Si 'non', ce pictogramme ne sera pas présenté aux internautes"
 
+#: src/pyams_content/component/paragraph/interfaces/pictogram.py:46
+#: src/pyams_content/component/links/interfaces/__init__.py:43
+#: src/pyams_content/shared/common/interfaces/types.py:75
+#: src/pyams_content/features/alert/interfaces.py:79
+msgid "Pictogram"
+msgstr "Pictogramme"
+
+#: src/pyams_content/component/paragraph/interfaces/pictogram.py:47
+#: src/pyams_content/features/alert/interfaces.py:80
+msgid "Name of the pictogram to select"
+msgstr "Sélection du pictogramme à afficher"
+
 #: src/pyams_content/component/paragraph/interfaces/pictogram.py:53
 msgid "Alternate header"
 msgstr "En-tête de substitution"
@@ -1289,16 +1109,9 @@
 "Alternate pictogram label; if not specified, the pictogram header will be "
 "used"
 msgstr ""
-"EN-tête de substitution utilisé par le pictogramme; si rien n'est spécifié, "
+"En-tête de substitution utilisé par le pictogramme; si rien n'est spécifié, "
 "l'en-tête du pictogramme sélectionné sera utilisé."
 
-#: src/pyams_content/component/paragraph/interfaces/pictogram.py:58
-#: src/pyams_content/component/paragraph/zmi/pictogram.py:267
-#: src/pyams_content/component/keynumber/interfaces/__init__.py:57
-#: src/pyams_content/component/keynumber/zmi/__init__.py:179
-msgid "Associated text"
-msgstr "Texte associé"
-
 #: src/pyams_content/component/paragraph/interfaces/pictogram.py:59
 msgid "Additional text associated to this pictogram"
 msgstr "Texte complémentaire associé à ce pictogramme"
@@ -1311,10 +1124,98 @@
 msgid "Presentation template used for pictograms"
 msgstr "Modèle de présentation utilisé par ce bloc de contenu"
 
-#: src/pyams_content/component/paragraph/interfaces/header.py:33
-#: src/pyams_content/component/paragraph/interfaces/header.py:40
-msgid "Header"
-msgstr "Chapô"
+#: src/pyams_content/component/paragraph/interfaces/audio.py:34
+msgid "Audio"
+msgstr "Bande son"
+
+#: src/pyams_content/component/paragraph/interfaces/audio.py:56
+msgid "Audio template"
+msgstr "Mode de rendu"
+
+#: src/pyams_content/component/paragraph/interfaces/audio.py:57
+msgid "Presentation template used for this audio file"
+msgstr "Mode de rendu utilisé pour cette bande son"
+
+#: src/pyams_content/component/paragraph/interfaces/keynumber.py:36
+msgid "Key numbers template"
+msgstr "Mode de rendu"
+
+#: src/pyams_content/component/paragraph/interfaces/keynumber.py:37
+msgid "Presentation template used for key numbers"
+msgstr "Modèle de présentation utilisé par ce bloc de contenu"
+
+#: src/pyams_content/component/paragraph/interfaces/frame.py:33
+msgid "Framed text"
+msgstr "Encadré"
+
+#: src/pyams_content/component/paragraph/interfaces/frame.py:40
+msgid "Frame body"
+msgstr "Contenu"
+
+#: src/pyams_content/component/paragraph/interfaces/frame.py:43
+msgid "Text template"
+msgstr "Mode de rendu"
+
+#: src/pyams_content/component/paragraph/interfaces/verbatim.py:33
+msgid "Verbatim"
+msgstr "Verbatim"
+
+#: src/pyams_content/component/paragraph/interfaces/verbatim.py:40
+msgid "Quoted text"
+msgstr "Citation"
+
+#: src/pyams_content/component/paragraph/interfaces/verbatim.py:41
+msgid "Quotation marks will be added automatically by presentation template"
+msgstr "Les guillemets seront ajoutés automatiquement par le mode de rendu..."
+
+#: src/pyams_content/component/paragraph/interfaces/verbatim.py:45
+msgid "Name of the quote author"
+msgstr "Nom de l'auteur de la citation"
+
+#: src/pyams_content/component/paragraph/interfaces/verbatim.py:48
+#: src/pyams_content/component/paragraph/interfaces/contact.py:54
+msgid "In charge of"
+msgstr "Fonction"
+
+#: src/pyams_content/component/paragraph/interfaces/verbatim.py:49
+msgid "Label of author function"
+msgstr "Fonction de l'auteur"
+
+#: src/pyams_content/component/paragraph/interfaces/verbatim.py:52
+msgid "Verbatim template"
+msgstr "Mode de rendu"
+
+#: src/pyams_content/component/paragraph/interfaces/html.py:33
+msgid "Raw HTML "
+msgstr "Code HTML"
+
+#: src/pyams_content/component/paragraph/interfaces/html.py:56
+msgid "Rich text"
+msgstr "Texte enrichi"
+
+#: src/pyams_content/component/paragraph/interfaces/html.py:40
+msgid "Raw HTML code"
+msgstr "Code HTML"
+
+#: src/pyams_content/component/paragraph/interfaces/html.py:41
+msgid ""
+"This HTML code will be used 'as is', without any transformation. Use with "
+"care!!"
+msgstr ""
+"Ce code HTML sera utilisé en l'état et intégré dans les pages sans "
+"modification. À utiliser avec précaution !!!"
+
+#: src/pyams_content/component/paragraph/interfaces/html.py:45
+msgid "Raw HTML code template"
+msgstr "Mode de rendu"
+
+#: src/pyams_content/component/paragraph/interfaces/html.py:63
+msgid "Body"
+msgstr "Contenu HTML"
+
+#: src/pyams_content/component/paragraph/interfaces/html.py:66
+msgid "Body template"
+msgstr "Mode de rendu"
 
 #: src/pyams_content/component/paragraph/interfaces/contact.py:43
 msgid "Contact card"
@@ -1328,11 +1229,6 @@
 msgid "Name of the contact"
 msgstr "Nom complet du contact"
 
-#: src/pyams_content/component/paragraph/interfaces/contact.py:54
-#: src/pyams_content/component/paragraph/interfaces/verbatim.py:48
-msgid "In charge of"
-msgstr "Fonction"
-
 #: src/pyams_content/component/paragraph/interfaces/contact.py:55
 msgid "Label of contact function"
 msgstr "Fonction du contact"
@@ -1381,484 +1277,230 @@
 msgid "GPS coordinates used to locate contact"
 msgstr "Coordonnées GPS de situation du contact"
 
-#: src/pyams_content/component/paragraph/interfaces/keypoint.py:33
-#: src/pyams_content/component/paragraph/interfaces/keypoint.py:40
-msgid "Key points"
-msgstr "Points clés"
-
-#: src/pyams_content/component/paragraph/interfaces/keypoint.py:41
-msgid "Enter one key point by line, without hyphen or prefix"
-msgstr ""
-"Indiquez un point clé par ligne, sans tiret. Passez à la ligne entre chaque "
-"point clé, la mise en forme sera effectuée automatiquement."
-
-#: src/pyams_content/component/paragraph/interfaces/keypoint.py:44
-msgid "Presentation template"
-msgstr "Mode de rendu"
-
-#: src/pyams_content/component/paragraph/interfaces/keypoint.py:45
-#: src/pyams_content/component/paragraph/interfaces/html.py:46
-#: src/pyams_content/component/paragraph/interfaces/html.py:67
-#: src/pyams_content/component/paragraph/interfaces/verbatim.py:53
-#: src/pyams_content/component/paragraph/interfaces/frame.py:44
-#: src/pyams_content/shared/imagemap/interfaces/__init__.py:100
-#: src/pyams_content/shared/logo/interfaces/__init__.py:76
-msgid "Presentation template used for this paragraph"
-msgstr "Mode de rendu utilisé par ce bloc de contenu"
-
-#: src/pyams_content/component/paragraph/interfaces/video.py:42
-msgid "Video file content"
-msgstr ""
-"Cliquez sur le bouton 'Parcourir...' pour sélectionner un nouveau contenu"
-
-#: src/pyams_content/component/paragraph/interfaces/video.py:56
-#: src/pyams_content/component/video/interfaces/__init__.py:78
-msgid "Video template"
-msgstr "Mode de rendu"
-
-#: src/pyams_content/component/paragraph/interfaces/video.py:57
-#: src/pyams_content/component/video/interfaces/__init__.py:79
-msgid "Presentation template used for this video"
-msgstr "Mode de rendu utilisé par cette vidéo"
-
-#: src/pyams_content/component/paragraph/interfaces/milestone.py:76
-#: src/pyams_content/component/paragraph/zmi/milestone.py:284
-msgid "Milestones"
-msgstr "Chronologie"
-
-#: src/pyams_content/component/paragraph/interfaces/milestone.py:41
-msgid "Is this milestone visible in front-office?"
-msgstr "Si 'non', ce jalon ne sera pas présenté aux internautes"
-
-#: src/pyams_content/component/paragraph/interfaces/milestone.py:46
-msgid "Milestone title"
-msgstr "Libellé associé au jalon"
-
-#: src/pyams_content/component/paragraph/interfaces/milestone.py:49
-#: src/pyams_content/component/paragraph/zmi/milestone.py:243
-msgid "Associated label"
-msgstr "Information associée"
-
-#: src/pyams_content/component/paragraph/interfaces/milestone.py:50
-msgid "The way this label will be rendered depends on presentation template"
-msgstr ""
-"La présentation de cette information peut varier en fonction du mode de "
-"rendu choisi"
-
-#: src/pyams_content/component/paragraph/interfaces/milestone.py:53
-#: src/pyams_content/component/paragraph/zmi/milestone.py:255
-msgid "Anchor"
-msgstr "Ancre"
-
-#: src/pyams_content/component/paragraph/interfaces/milestone.py:54
-msgid "Paragraph to which this milestone should lead"
-msgstr "Bloc de contenu vers lequel ce jalon doit conduire"
-
-#: src/pyams_content/component/paragraph/interfaces/milestone.py:83
-msgid "Milestones template"
-msgstr "Mode de rendu"
-
-#: src/pyams_content/component/paragraph/interfaces/milestone.py:84
-msgid "Presentation template used for milestones"
-msgstr "Modèle de présentation utilisé par ce bloc de contenu"
-
-#: src/pyams_content/component/paragraph/interfaces/keynumber.py:29
-#: src/pyams_content/component/keynumber/__init__.py:180
-#: src/pyams_content/component/keynumber/zmi/__init__.py:198
-#: src/pyams_content/component/keynumber/portlet/zmi/__init__.py:79
-msgid "Key numbers"
-msgstr "Chiffres-clés"
-
-#: src/pyams_content/component/paragraph/interfaces/keynumber.py:36
-msgid "Key numbers template"
-msgstr "Mode de rendu"
-
-#: src/pyams_content/component/paragraph/interfaces/keynumber.py:37
-msgid "Presentation template used for key numbers"
-msgstr "Modèle de présentation utilisé par ce bloc de contenu"
-
-#: src/pyams_content/component/paragraph/interfaces/__init__.py:45
-msgid "Is this paragraph visible in front-office?"
-msgstr "Si 'non', ce bloc de contenu ne sera pas présenté aux internautes"
-
-#: src/pyams_content/component/paragraph/interfaces/__init__.py:49
-msgid "§ Title"
-msgstr "Titre §"
-
-#: src/pyams_content/component/paragraph/interfaces/__init__.py:80
-msgid "Allowed paragraphs"
-msgstr "Types de blocs autorisés"
-
-#: src/pyams_content/component/paragraph/interfaces/__init__.py:81
-msgid "List of paragraphs allowed for this content type"
-msgstr "Liste des types de blocs de contenu autorisés pour ce gabarit."
-
-#: src/pyams_content/component/paragraph/interfaces/__init__.py:85
-#: src/pyams_content/shared/common/zmi/types.py:169
-#: src/pyams_content/shared/common/zmi/types.py:380
-msgid "Default paragraphs"
-msgstr "Types de blocs par défaut"
-
-#: src/pyams_content/component/paragraph/interfaces/__init__.py:86
-msgid "List of paragraphs automatically added to a new content"
-msgstr "Liste des types de blocs ajoutés automatiquement aux nouveaux contenus"
-
-#: src/pyams_content/component/paragraph/interfaces/html.py:33
-msgid "Raw HTML "
-msgstr "Code HTML"
-
-#: src/pyams_content/component/paragraph/interfaces/html.py:56
-msgid "Rich text"
-msgstr "Texte enrichi"
-
-#: src/pyams_content/component/paragraph/interfaces/html.py:40
-msgid "Raw HTML code"
-msgstr "Code HTML"
-
-#: src/pyams_content/component/paragraph/interfaces/html.py:41
-msgid ""
-"This HTML code will be used 'as is', without any transformation. Use with "
-"care!!"
-msgstr ""
-"Ce code HTML sera utilisé en l'état et intégré dans les pages sans "
-"modification. À utiliser avec précaution !!!"
-
-#: src/pyams_content/component/paragraph/interfaces/html.py:45
-msgid "Raw HTML code template"
-msgstr "Mode de rendu"
-
-#: src/pyams_content/component/paragraph/interfaces/html.py:63
-#: src/pyams_content/component/paragraph/interfaces/audio.py:41
-msgid "Body"
-msgstr "Contenu HTML"
-
-#: src/pyams_content/component/paragraph/interfaces/html.py:66
-msgid "Body template"
-msgstr "Mode de rendu"
-
-#: src/pyams_content/component/paragraph/interfaces/verbatim.py:33
-msgid "Verbatim"
-msgstr "Verbatim"
-
-#: src/pyams_content/component/paragraph/interfaces/verbatim.py:40
-msgid "Quoted text"
-msgstr "Citation"
-
-#: src/pyams_content/component/paragraph/interfaces/verbatim.py:41
-msgid "Quotation marks will be added automatically by presentation template"
-msgstr "Les guillemets seront ajoutés automatiquement par le mode de rendu..."
-
-#: src/pyams_content/component/paragraph/interfaces/verbatim.py:45
-msgid "Name of the quote author"
-msgstr "Nom de l'auteur de la citation"
-
-#: src/pyams_content/component/paragraph/interfaces/verbatim.py:49
-msgid "Label of author function"
-msgstr "Fonction de l'auteur"
-
-#: src/pyams_content/component/paragraph/interfaces/verbatim.py:52
-msgid "Verbatim template"
-msgstr "Mode de rendu"
-
-#: src/pyams_content/component/paragraph/interfaces/frame.py:33
-msgid "Framed text"
-msgstr "Encadré"
-
-#: src/pyams_content/component/paragraph/interfaces/frame.py:40
-msgid "Frame body"
-msgstr "Contenu"
-
-#: src/pyams_content/component/paragraph/interfaces/frame.py:43
-msgid "Text template"
-msgstr "Mode de rendu"
-
-#: src/pyams_content/component/paragraph/interfaces/audio.py:34
-msgid "Audio"
-msgstr "Bande son"
-
-#: src/pyams_content/component/paragraph/interfaces/audio.py:56
-msgid "Audio template"
+#: src/pyams_content/component/paragraph/interfaces/header.py:33
+#: src/pyams_content/component/paragraph/interfaces/header.py:40
+msgid "Header"
+msgstr "Chapô"
+
+#: src/pyams_content/component/paragraph/interfaces/header.py:43
+#: src/pyams_content/features/header/interfaces/__init__.py:39
+msgid "Header template"
 msgstr "Mode de rendu"
 
-#: src/pyams_content/component/paragraph/interfaces/audio.py:57
-msgid "Presentation template used for this audio file"
-msgstr "Mode de rendu utilisé pour cette bande son"
-
-#: src/pyams_content/component/paragraph/zmi/container.py:74
-msgid "Contents..."
-msgstr "Contenu"
-
-#: src/pyams_content/component/paragraph/zmi/container.py:239
-msgid "Show/hide all paragraphs"
-msgstr "Afficher/masquer tous les blocs"
-
-#: src/pyams_content/component/paragraph/zmi/container.py:287
-#: src/pyams_content/component/paragraph/zmi/container.py:296
-#: src/pyams_content/component/paragraph/zmi/container.py:309
-msgid "Content blocks"
-msgstr "Blocs de contenu"
-
-#: src/pyams_content/component/paragraph/zmi/container.py:366
-msgid "Links and attachments..."
-msgstr "Récap. liens et PJ"
-
-#: src/pyams_content/component/paragraph/zmi/container.py:378
-msgid "Content blocks links and attachments"
-msgstr "Récapitulatif des liens et pièces jointes par bloc de contenu"
-
-#: src/pyams_content/component/paragraph/zmi/container.py:126
-msgid "No currently defined paragraph."
-msgstr "Aucun bloc n'est associé à ce contenu."
-
-#: src/pyams_content/component/paragraph/zmi/container.py:248
-msgid "Click to open/close all paragraphs editors"
-msgstr "Afficher/masquer tous les blocs"
-
-#: src/pyams_content/component/paragraph/zmi/container.py:261
-msgid "Click to open/close paragraph editor"
-msgstr "Afficher/masquer ce bloc"
-
-#: src/pyams_content/component/paragraph/zmi/container.py:132
-msgid "Check allowed paragraph types to be able to create new paragraphs."
-msgstr ""
-"Vérifiez le paramétrage des types de blocs de contenu autorisés pour pouvoir "
-"ajouter de nouveaux blocs."
-
-#: src/pyams_content/component/paragraph/zmi/pictogram.py:82
-msgid "Pictograms..."
-msgstr "Pictogrammes"
-
-#: src/pyams_content/component/paragraph/zmi/pictogram.py:95
-msgid "Add new pictogram paragraph"
-msgstr "Ajout de pictogrammes"
-
-#: src/pyams_content/component/paragraph/zmi/pictogram.py:122
-msgid "Edit pictogram paragraph properties"
-msgstr "Propriétés des pictogrammes"
-
-#. Default: Header
-#: src/pyams_content/component/paragraph/zmi/pictogram.py:252
-msgid "pictogram-item-header"
-msgstr "En-tête"
-
-#: src/pyams_content/component/paragraph/zmi/pictogram.py:339
-msgid "Pictogram was correctly added"
-msgstr "Le pictogramme a été ajouté."
-
-#: src/pyams_content/component/paragraph/zmi/pictogram.py:349
-#: src/pyams_content/component/paragraph/zmi/pictogram.py:387
-msgid "You must select a pictogram!"
-msgstr "Vous devez sélectionner un pictogramme !"
-
-#: src/pyams_content/component/paragraph/zmi/header.py:50
-msgid "Header..."
-msgstr "Chapô"
-
-#: src/pyams_content/component/paragraph/zmi/header.py:63
-msgid "Add new header paragraph"
-msgstr "Ajout d'un chapô"
-
-#: src/pyams_content/component/paragraph/zmi/header.py:90
-msgid "Edit header paragraph properties"
-msgstr "Propriétés du chapô"
-
-#: src/pyams_content/component/paragraph/zmi/contact.py:53
-msgid "Contact card..."
-msgstr "Fiche contact"
-
-#: src/pyams_content/component/paragraph/zmi/contact.py:66
-msgid "Add new contact card"
-msgstr "Ajout d'une fiche contact"
-
-#: src/pyams_content/component/paragraph/zmi/contact.py:94
-msgid "Edit contact card properties"
-msgstr "Propriétés de la fiche contact"
-
-#: src/pyams_content/component/paragraph/zmi/keypoint.py:51
-msgid "Key points..."
-msgstr "Points clés"
-
-#: src/pyams_content/component/paragraph/zmi/keypoint.py:64
-msgid "Add new key points paragraph"
-msgstr "Ajout de points clés"
-
-#: src/pyams_content/component/paragraph/zmi/keypoint.py:91
-msgid "Edit key points paragraph properties"
-msgstr "Propriétés des points clés"
-
-#: src/pyams_content/component/paragraph/zmi/video.py:53
-msgid "Video paragraph..."
-msgstr "Vidéo"
-
-#: src/pyams_content/component/paragraph/zmi/video.py:66
-msgid "Add new video paragraph"
-msgstr "Ajout d'une vidéo"
-
-#: src/pyams_content/component/paragraph/zmi/video.py:94
-#: src/pyams_content/component/video/zmi/paragraph.py:192
-msgid "Edit video properties"
-msgstr "Propriétés de la vidéo"
-
-#: src/pyams_content/component/paragraph/zmi/milestone.py:77
-msgid "Milestones..."
-msgstr "Chronologie"
-
-#: src/pyams_content/component/paragraph/zmi/milestone.py:90
-msgid "Add new milestone paragraph"
-msgstr "Ajout d'une chronologie"
-
-#: src/pyams_content/component/paragraph/zmi/milestone.py:117
-msgid "Edit milestone paragraph properties"
-msgstr "Propriétés de la chronologie"
-
-#: src/pyams_content/component/paragraph/zmi/milestone.py:299
-msgid "Add milestone"
-msgstr "Ajouter un jalon"
-
-#: src/pyams_content/component/paragraph/zmi/milestone.py:312
-msgid "Add new milestone"
-msgstr "Ajout d'un jalon"
-
-#: src/pyams_content/component/paragraph/zmi/milestone.py:339
-msgid "Edit milestone properties"
-msgstr "Propriétés du jalon"
-
-#: src/pyams_content/component/paragraph/zmi/milestone.py:327
-msgid "Milestone was correctly added"
-msgstr "Le jalon a été ajouté."
-
-#: src/pyams_content/component/paragraph/zmi/milestone.py:270
-msgid "(missing paragraph)"
-msgstr "(paragraphe supprimé)"
-
-#: src/pyams_content/component/paragraph/zmi/keynumber.py:55
-msgid "Key numbers..."
-msgstr "Chiffres-clés"
-
-#: src/pyams_content/component/paragraph/zmi/keynumber.py:68
-msgid "Add new key number paragraph"
-msgstr "Ajout de chiffres-clés"
-
-#: src/pyams_content/component/paragraph/zmi/keynumber.py:96
-msgid "Edit key number paragraph properties"
-msgstr "Propriétés des chiffres-clés"
-
-#: src/pyams_content/component/paragraph/zmi/__init__.py:65
-msgid "Content block types..."
-msgstr "Types de blocs de contenu"
-
-#: src/pyams_content/component/paragraph/zmi/__init__.py:79
-msgid "Content block types"
-msgstr "Types de blocs de contenu"
-
-#: src/pyams_content/component/paragraph/zmi/__init__.py:89
-msgid ""
-"You can define which types of paragraphs are allowed in this container.\n"
-"\n"
-"Default paragraphs will be added automatically (in selected order) to any "
-"new created content.\n"
-"\n"
-"NOTICE: removing types from allowed types list will have no effect on "
-"already created contents!"
-msgstr ""
-"Vous pouvez indiquer la liste des types de blocs de contenu autorisés pour "
-"ce gabarit.\n"
-"\n"
-"Les types de blocs par défaut seront ajoutés automatiquement (dans l'ordre "
-"défini) à chaque nouveau contenu créé selon ce gabarit.\n"
-"\n"
-"REMARQUE : supprimer des types de la liste des types de blocs autorisés sera "
-"sans effet sur les contenus existants."
-
-#: src/pyams_content/component/paragraph/zmi/__init__.py:214
-msgid "Submit"
-msgstr "Enregistrer"
-
-#: src/pyams_content/component/paragraph/zmi/__init__.py:195
-msgid "Paragraph was correctly added."
-msgstr "Le bloc a été ajouté."
-
-#: src/pyams_content/component/paragraph/zmi/html.py:76
-msgid "Raw HTML..."
-msgstr "Code HTML"
-
-#: src/pyams_content/component/paragraph/zmi/html.py:89
-msgid "Add new raw HTML paragraph"
-msgstr "Ajout d'un bloc de code HTML"
-
-#: src/pyams_content/component/paragraph/zmi/html.py:119
-msgid "Edit raw HTML paragraph properties"
-msgstr "Propriétés du code HTML"
-
-#: src/pyams_content/component/paragraph/zmi/html.py:159
-msgid "Rich text..."
-msgstr "Texte enrichi"
-
-#: src/pyams_content/component/paragraph/zmi/html.py:172
-msgid "Add new rich text paragraph"
-msgstr "Ajout d'un bloc de texte enrichi"
-
-#: src/pyams_content/component/paragraph/zmi/html.py:202
-msgid "Edit rich text paragraph properties"
-msgstr "Propriétés du texte enrichi"
-
-#: src/pyams_content/component/paragraph/zmi/verbatim.py:56
-msgid "Verbatim..."
-msgstr "Verbatim"
-
-#: src/pyams_content/component/paragraph/zmi/verbatim.py:69
-msgid "Add new verbatim paragraph"
-msgstr "Ajout d'un verbatim"
-
-#: src/pyams_content/component/paragraph/zmi/verbatim.py:96
-msgid "Edit verbatim paragraph properties"
-msgstr "Propriétés du verbatim"
-
-#: src/pyams_content/component/paragraph/zmi/frame.py:84
-msgid "Framed text..."
-msgstr "Encadré"
-
-#: src/pyams_content/component/paragraph/zmi/frame.py:98
-msgid "Add new framed text paragraph"
-msgstr "Ajout d'un encadré"
-
-#: src/pyams_content/component/paragraph/zmi/frame.py:129
-msgid "Edit framed text paragraph properties"
-msgstr "Propriétés de l'encadré"
-
-#: src/pyams_content/component/paragraph/zmi/audio.py:54
-msgid "Audio paragraph..."
-msgstr "Bande son"
-
-#: src/pyams_content/component/paragraph/zmi/audio.py:67
-msgid "Add new audio paragraph"
-msgstr "Ajout d'une bande son"
-
-#: src/pyams_content/component/paragraph/zmi/audio.py:108
-msgid "Edit audio properties"
-msgstr "Propriétés de la bande son"
-
-#: src/pyams_content/component/paragraph/zmi/audio.py:84
-#: src/pyams_content/component/paragraph/zmi/audio.py:128
-msgid "HTML content"
-msgstr "Contenu HTML"
-
-#: src/pyams_content/component/links/__init__.py:125
+#: src/pyams_content/component/paragraph/interfaces/header.py:44
+#: src/pyams_content/features/header/interfaces/__init__.py:40
+msgid "Presentation template used for this header"
+msgstr "Mode de rendu utilisé par ce chapô"
+
+#: src/pyams_content/component/theme/__init__.py:71
+#: src/pyams_content/component/theme/zmi/portlet.py:40
+#: src/pyams_content/component/theme/interfaces/__init__.py:47
+#: src/pyams_content/component/theme/interfaces/__init__.py:61
+msgid "Tags"
+msgstr "Tags"
+
+#: src/pyams_content/component/theme/__init__.py:119
+#: src/pyams_content/component/theme/zmi/portlet.py:55
+#: src/pyams_content/component/theme/interfaces/__init__.py:88
+#: src/pyams_content/component/theme/interfaces/__init__.py:102
+msgid "Themes"
+msgstr "Thèmes"
+
+#: src/pyams_content/component/theme/__init__.py:167
+#: src/pyams_content/component/theme/zmi/portlet.py:70
+#: src/pyams_content/component/theme/interfaces/__init__.py:129
+#: src/pyams_content/component/theme/interfaces/__init__.py:143
+msgid "Collections"
+msgstr "Collections"
+
+#: src/pyams_content/component/theme/__init__.py:80
+msgid "no defined tag"
+msgstr "aucun tag défini"
+
+#: src/pyams_content/component/theme/__init__.py:128
+msgid "no defined theme"
+msgstr "aucun thème défini"
+
+#: src/pyams_content/component/theme/__init__.py:176
+msgid "no defined collection"
+msgstr "aucune collection définie"
+
+#: src/pyams_content/component/theme/zmi/__init__.py:55
+#: src/pyams_content/shared/view/zmi/theme.py:56
+msgid "Tags..."
+msgstr "Tags"
+
+#: src/pyams_content/component/theme/zmi/__init__.py:66
+msgid "Content tags"
+msgstr "Tags du contenu"
+
+#: src/pyams_content/component/theme/zmi/__init__.py:99
+#: src/pyams_content/shared/view/zmi/theme.py:102
+msgid "Themes..."
+msgstr "Thèmes"
+
+#: src/pyams_content/component/theme/zmi/__init__.py:107
+msgid "Content themes"
+msgstr "Thèmes du contenu"
+
+#: src/pyams_content/component/theme/zmi/__init__.py:159
+#: src/pyams_content/shared/view/zmi/theme.py:148
+msgid "Collections..."
+msgstr "Collections"
+
+#: src/pyams_content/component/theme/zmi/__init__.py:172
+msgid "Content collections"
+msgstr "Collections associées au contenu"
+
+#: src/pyams_content/component/theme/zmi/manager.py:51
+msgid "Tags settings..."
+msgstr "Paramétrage des tags"
+
+#: src/pyams_content/component/theme/zmi/manager.py:65
+msgid "Selected tags"
+msgstr "Tags sélectionnés"
+
+#: src/pyams_content/component/theme/zmi/manager.py:101
+msgid "Themes settings..."
+msgstr "Paramétrage des thèmes"
+
+#: src/pyams_content/component/theme/zmi/manager.py:115
+msgid "Selected themes"
+msgstr "Thèmes sélectionnés"
+
+#: src/pyams_content/component/theme/zmi/manager.py:151
+msgid "Collections settings..."
+msgstr "Paramétrage des collections"
+
+#: src/pyams_content/component/theme/zmi/manager.py:165
+msgid "Selected collections"
+msgstr "Collections sélectionnées"
+
+#: src/pyams_content/component/association/container.py:91
+#: src/pyams_content/component/association/zmi/__init__.py:296
+#: src/pyams_content/component/association/interfaces/__init__.py:93
+msgid "Associations"
+msgstr "Liens et pièces jointes"
+
+#: src/pyams_content/component/association/zmi/paragraph.py:54
+#: src/pyams_content/component/association/zmi/__init__.py:96
+msgid "Associations..."
+msgstr "Liens et pièces jointes"
+
+#: src/pyams_content/component/association/zmi/paragraph.py:67
+msgid "Add new association paragraph"
+msgstr "Ajout d'un bloc  « liens et pièces jointes »"
+
+#: src/pyams_content/component/association/zmi/paragraph.py:93
+msgid "Edit association paragraph properties"
+msgstr "Propriétés du bloc « liens et pièces jointes »"
+
+#: src/pyams_content/component/association/zmi/__init__.py:198
+msgid "Public title"
+msgstr "Libellé public"
+
+#: src/pyams_content/component/association/zmi/__init__.py:216
+msgid "Inner title"
+msgstr "Contenu interne"
+
+#: src/pyams_content/component/association/zmi/__init__.py:232
+msgid "Size"
+msgstr "Taille"
+
+#: src/pyams_content/component/association/zmi/__init__.py:273
+#: src/pyams_content/component/association/zmi/__init__.py:283
+msgid "Associations list"
+msgstr "Liste des liens et pièces jointes"
+
+#: src/pyams_content/component/association/zmi/__init__.py:66
+msgid "Association was correctly added."
+msgstr "L'association a été ajoutée."
+
+#: src/pyams_content/component/association/interfaces/__init__.py:43
+#: src/pyams_content/features/menu/interfaces/__init__.py:60
+msgid "Is this item visible in front-office?"
+msgstr "Si 'non', ce lien ne sera pas présenté aux internautes"
+
+#: src/pyams_content/component/association/interfaces/__init__.py:100
+msgid "Associations template"
+msgstr "Mode de rendu"
+
+#: src/pyams_content/component/association/interfaces/__init__.py:101
+msgid "Presentation template used for associations"
+msgstr "Modèle de présentation utilisé par ce bloc de contenu"
+
+#: src/pyams_content/component/links/__init__.py:123
 msgid "Internal link"
 msgstr "Lien interne"
 
-#: src/pyams_content/component/links/__init__.py:207
+#: src/pyams_content/component/links/__init__.py:219
 msgid "External link"
 msgstr "Lien externe"
 
-#: src/pyams_content/component/links/__init__.py:260
+#: src/pyams_content/component/links/__init__.py:272
 msgid "Mailto link"
 msgstr "Lien mailto"
 
-#: src/pyams_content/component/links/__init__.py:194
+#: src/pyams_content/component/links/__init__.py:206
 msgid "target is not published"
 msgstr "le contenu ciblé n'est pas publié"
 
+#: src/pyams_content/component/links/zmi/__init__.py:60
+msgid "Internal links"
+msgstr "Liens internes"
+
+#: src/pyams_content/component/links/zmi/__init__.py:75
+msgid "Add internal link"
+msgstr "Lien interne"
+
+#: src/pyams_content/component/links/zmi/__init__.py:89
+msgid "Add new internal link"
+msgstr "Ajout d'un lien interne"
+
+#: src/pyams_content/component/links/zmi/__init__.py:120
+msgid "Edit internal link properties"
+msgstr "Propriétés du lien interne"
+
+#: src/pyams_content/component/links/zmi/__init__.py:149
+msgid "External links"
+msgstr "Liens externes"
+
+#: src/pyams_content/component/links/zmi/__init__.py:164
+msgid "Add external link"
+msgstr "Lien externe"
+
+#: src/pyams_content/component/links/zmi/__init__.py:178
+msgid "Add new external link"
+msgstr "Ajout d'un lien externe"
+
+#: src/pyams_content/component/links/zmi/__init__.py:209
+msgid "Edit external link properties"
+msgstr "Propriétés du lien externe"
+
+#: src/pyams_content/component/links/zmi/__init__.py:238
+msgid "Mailto links"
+msgstr "Liens mailto"
+
+#: src/pyams_content/component/links/zmi/__init__.py:253
+msgid "Add mailto link"
+msgstr "Lien mailto"
+
+#: src/pyams_content/component/links/zmi/__init__.py:267
+msgid "Add new mailto link"
+msgstr "Ajout d'un lien « mailto »"
+
+#: src/pyams_content/component/links/zmi/__init__.py:298
+msgid "Edit mailto link properties"
+msgstr "Propriétés du lien « mailto »"
+
+#: src/pyams_content/component/links/zmi/reverse.py:57
+msgid "Reverse links"
+msgstr "Liens amont"
+
+#: src/pyams_content/component/links/zmi/reverse.py:66
+msgid "Content's internal links"
+msgstr "Autres contenus qui pointent vers ce contenu"
+
 #: src/pyams_content/component/links/interfaces/__init__.py:36
 msgid "Link title, as shown in front-office"
 msgstr ""
@@ -1871,112 +1513,66 @@
 
 #: src/pyams_content/component/links/interfaces/__init__.py:44
 msgid "Name of the pictogram associated with this link"
-msgstr "Pictogramme à associer à ce lien"
-
-#: src/pyams_content/component/links/interfaces/__init__.py:64
-#: src/pyams_content/shared/logo/interfaces/__init__.py:50
+msgstr ""
+"Pictogramme à associer à ce lien. ATTENTION: ce pictogramme n'est affiché "
+"que par certains modes de rendu !!"
+
+#: src/pyams_content/component/links/interfaces/__init__.py:61
+#: src/pyams_content/shared/logo/interfaces/__init__.py:56
 msgid "Target URL"
 msgstr "URL cible"
 
-#: src/pyams_content/component/links/interfaces/__init__.py:65
-#: src/pyams_content/shared/logo/interfaces/__init__.py:51
+#: src/pyams_content/component/links/interfaces/__init__.py:62
+#: src/pyams_content/shared/logo/interfaces/__init__.py:57
 msgid "URL used to access external resource"
 msgstr ""
 "URL utilisée pour accéder à cette ressource externe. Doit comprendre le "
 "protocole d'accès au site, comme « http:// » ou « https:// »."
 
-#: src/pyams_content/component/links/interfaces/__init__.py:69
+#: src/pyams_content/component/links/interfaces/__init__.py:66
 msgid "Language used in this remote resource"
 msgstr ""
 "Langue utilisée par cette ressource extene ; à préciser lorsqu'il ne s'agit "
 "pas de la langue par défaut du site."
 
-#: src/pyams_content/component/links/interfaces/__init__.py:77
+#: src/pyams_content/component/links/interfaces/__init__.py:74
 msgid "Target address"
 msgstr "Adresse mail"
 
-#: src/pyams_content/component/links/interfaces/__init__.py:78
+#: src/pyams_content/component/links/interfaces/__init__.py:75
 msgid "Target email address"
 msgstr "Adresse de messagerie \"stricte\", soit uniquement \"xxx@yyy.com\""
 
-#: src/pyams_content/component/links/interfaces/__init__.py:81
+#: src/pyams_content/component/links/interfaces/__init__.py:78
 msgid "Address name"
 msgstr "Nom de messagerie"
 
-#: src/pyams_content/component/links/interfaces/__init__.py:82
+#: src/pyams_content/component/links/interfaces/__init__.py:79
 msgid "Address as displayed in address book"
 msgstr ""
 "Nom de la boîte aux lettres, tel qu'il sera affiché dans l'application de "
 "messagerie."
 
-#: src/pyams_content/component/links/zmi/__init__.py:60
-msgid "Internal links"
-msgstr "Liens internes"
-
-#: src/pyams_content/component/links/zmi/__init__.py:75
-msgid "Add internal link"
-msgstr "Lien interne"
-
-#: src/pyams_content/component/links/zmi/__init__.py:89
-msgid "Add new internal link"
-msgstr "Ajout d'un lien interne"
-
-#: src/pyams_content/component/links/zmi/__init__.py:125
-msgid "Edit internal link properties"
-msgstr "Propriétés du lien interne"
-
-#: src/pyams_content/component/links/zmi/__init__.py:159
-msgid "External links"
-msgstr "Liens externes"
-
-#: src/pyams_content/component/links/zmi/__init__.py:174
-msgid "Add external link"
-msgstr "Lien externe"
-
-#: src/pyams_content/component/links/zmi/__init__.py:188
-msgid "Add new external link"
-msgstr "Ajout d'un lien externe"
-
-#: src/pyams_content/component/links/zmi/__init__.py:224
-msgid "Edit external link properties"
-msgstr "Propriétés du lien externe"
-
-#: src/pyams_content/component/links/zmi/__init__.py:258
-msgid "Mailto links"
-msgstr "Liens mailto"
-
-#: src/pyams_content/component/links/zmi/__init__.py:273
-msgid "Add mailto link"
-msgstr "Lien mailto"
-
-#: src/pyams_content/component/links/zmi/__init__.py:287
-msgid "Add new mailto link"
-msgstr "Ajout d'un lien « mailto »"
-
-#: src/pyams_content/component/links/zmi/__init__.py:323
-msgid "Edit mailto link properties"
-msgstr "Propriétés du lien « mailto »"
-
-#: src/pyams_content/component/links/zmi/reverse.py:57
-msgid "Reverse links"
-msgstr "Liens amont"
-
-#: src/pyams_content/component/links/zmi/reverse.py:66
-msgid "Content's internal links"
-msgstr "Autres contenus qui pointent vers ce contenu"
-
 #: src/pyams_content/component/video/__init__.py:73
 #: src/pyams_content/component/video/interfaces/__init__.py:68
 msgid "External video"
 msgstr "Vidéo externe"
 
-#: src/pyams_content/component/video/interfaces/__init__.py:56
-msgid "Video provider"
-msgstr "Fournisseur"
-
-#: src/pyams_content/component/video/interfaces/__init__.py:57
-msgid "Name of external platform providing selected video"
-msgstr "Nom de la plate-forme externe fournissant la vidéo à afficher"
+#: src/pyams_content/component/video/provider/dailymotion.py:94
+msgid "Dailymotion settings"
+msgstr "Paramètres Dailymotion"
+
+#: src/pyams_content/component/video/provider/__init__.py:70
+msgid "Other provider"
+msgstr "Autre fournisseur"
+
+#: src/pyams_content/component/video/provider/__init__.py:94
+msgid "Custom video settings"
+msgstr "Paramètres spécifiques"
+
+#: src/pyams_content/component/video/provider/vimeo.py:92
+msgid "Vimeo settings"
+msgstr "Paramètres Vimeo"
 
 #: src/pyams_content/component/video/provider/interfaces.py:31
 msgid "Integration code"
@@ -2216,26 +1812,10 @@
 msgstr ""
 "Couleur utilisée pour le titre, la signature et les commandes du lecteur"
 
-#: src/pyams_content/component/video/provider/__init__.py:70
-msgid "Other provider"
-msgstr "Autre fournisseur"
-
-#: src/pyams_content/component/video/provider/__init__.py:94
-msgid "Custom video settings"
-msgstr "Paramètres spécifiques"
-
 #: src/pyams_content/component/video/provider/youtube.py:96
 msgid "Youtube settings"
 msgstr "Paramétres Youtube"
 
-#: src/pyams_content/component/video/provider/vimeo.py:92
-msgid "Vimeo settings"
-msgstr "Paramètres Vimeo"
-
-#: src/pyams_content/component/video/provider/dailymotion.py:94
-msgid "Dailymotion settings"
-msgstr "Paramètres Dailymotion"
-
 #: src/pyams_content/component/video/zmi/paragraph.py:62
 msgid "External video..."
 msgstr "Vidéo externe"
@@ -2244,565 +1824,1488 @@
 msgid "Add new external video..."
 msgstr "Ajout d'une vidéo externe"
 
-#: src/pyams_content/component/video/zmi/paragraph.py:126
+#: src/pyams_content/component/video/zmi/paragraph.py:124
 msgid "Video provider is required"
 msgstr "Le nom du fournisseur est obligatoire"
 
-#: src/pyams_content/component/video/zmi/paragraph.py:175
-#: src/pyams_content/component/video/zmi/paragraph.py:229
+#: src/pyams_content/component/video/zmi/paragraph.py:172
+#: src/pyams_content/component/video/zmi/paragraph.py:223
 msgid "Video provider settings"
 msgstr "Paramètres liés au fournisseur"
 
-#: src/pyams_content/component/video/zmi/paragraph.py:155
+#: src/pyams_content/component/video/zmi/paragraph.py:152
 msgid "Other settings"
 msgstr "Autres paramètres"
 
-#: src/pyams_content/component/illustration/__init__.py:177
-#: src/pyams_content/component/illustration/interfaces/__init__.py:99
-#: src/pyams_content/component/illustration/zmi/paragraph.py:168
-#: src/pyams_content/component/illustration/zmi/__init__.py:56
-#: src/pyams_content/component/illustration/zmi/__init__.py:100
-msgid "Illustration"
-msgstr "Illustration"
-
-#: src/pyams_content/component/illustration/interfaces/__init__.py:69
-msgid "Name of picture's author"
-msgstr "Sous la forme \"Prénom Nom / Organisme\""
-
-#: src/pyams_content/component/illustration/interfaces/__init__.py:72
-msgid "Illustration template"
-msgstr "Mode de rendu"
-
-#: src/pyams_content/component/illustration/interfaces/__init__.py:73
-msgid "Presentation template used for illustration"
+#: src/pyams_content/component/video/interfaces/__init__.py:56
+msgid "Video provider"
+msgstr "Fournisseur"
+
+#: src/pyams_content/component/video/interfaces/__init__.py:57
+msgid "Name of external platform providing selected video"
+msgstr "Nom de la plate-forme externe fournissant la vidéo à afficher"
+
+#: src/pyams_content/shared/common/__init__.py:240
+#: src/pyams_content/shared/common/zmi/properties.py:70
+#: src/pyams_content/shared/common/zmi/manager.py:96
+msgid "Properties"
+msgstr "Propriétés"
+
+#: src/pyams_content/shared/common/__init__.py:150
+#: src/pyams_content/shared/common/__init__.py:158
+#, python-format
+msgid "{date} by {principal}"
+msgstr "{date} par {principal}"
+
+#: src/pyams_content/shared/common/__init__.py:263
+#, python-format
+msgid "title length should be between 40 and 66 characters ({length} actually)"
 msgstr ""
-"<span>Modèle de présentation utilisé par cette illustration.<br /"
-"><strong>ATTENTION :</strong> certains modes de rendu ne prennent pas en "
-"compte tous les types de médias !</span>"
-
-#: src/pyams_content/component/illustration/zmi/paragraph.py:60
-msgid "Illustration..."
-msgstr "Illustration"
-
-#: src/pyams_content/component/illustration/zmi/paragraph.py:73
-msgid "Add new illustration"
-msgstr "Ajout d'une illustration"
-
-#: src/pyams_content/component/illustration/zmi/paragraph.py:103
-msgid "Edit illustration properties"
-msgstr "Propriétés de l'illustration"
-
-#: src/pyams_content/component/illustration/zmi/__init__.py:155
-msgid "Navigation link illustration"
-msgstr "Illustration de navigation"
-
-#: src/pyams_content/component/illustration/zmi/__init__.py:102
-msgid "Header illustration"
-msgstr "Illustration d'en-tête"
-
-#: src/pyams_content/component/association/container.py:88
-#: src/pyams_content/component/association/interfaces/__init__.py:90
-#: src/pyams_content/component/association/zmi/__init__.py:296
-msgid "Associations"
-msgstr "Liens et pièces jointes"
-
-#: src/pyams_content/component/association/interfaces/__init__.py:97
-msgid "Associations template"
-msgstr "Mode de rendu"
-
-#: src/pyams_content/component/association/interfaces/__init__.py:98
-msgid "Presentation template used for associations"
-msgstr "Modèle de présentation utilisé par ce bloc de contenu"
-
-#: src/pyams_content/component/association/zmi/paragraph.py:54
-#: src/pyams_content/component/association/zmi/__init__.py:96
-msgid "Associations..."
-msgstr "Liens et pièces jointes"
-
-#: src/pyams_content/component/association/zmi/paragraph.py:67
-msgid "Add new association paragraph"
-msgstr "Ajout d'un bloc  « liens et pièces jointes »"
-
-#: src/pyams_content/component/association/zmi/paragraph.py:93
-msgid "Edit association paragraph properties"
-msgstr "Propriétés du bloc « liens et pièces jointes »"
-
-#: src/pyams_content/component/association/zmi/__init__.py:198
-msgid "Public title"
-msgstr "Libellé public"
-
-#: src/pyams_content/component/association/zmi/__init__.py:216
-msgid "Inner title"
-msgstr "Contenu interne"
-
-#: src/pyams_content/component/association/zmi/__init__.py:232
-msgid "Size"
-msgstr "Taille"
-
-#: src/pyams_content/component/association/zmi/__init__.py:273
-#: src/pyams_content/component/association/zmi/__init__.py:283
-msgid "Associations list"
-msgstr "Liste des liens et pièces jointes"
-
-#: src/pyams_content/component/association/zmi/__init__.py:66
-msgid "Association was correctly added."
-msgstr "L'association a été ajoutée."
-
-#: src/pyams_content/component/keynumber/interfaces/__init__.py:40
-msgid "Is this key number visible in front-office?"
-msgstr "Si 'non', ce chiffre-clé ne sera pas présenté aux internautes"
-
-#. Default: Header
-#: src/pyams_content/component/keynumber/interfaces/__init__.py:44
-#: src/pyams_content/component/keynumber/zmi/__init__.py:146
-msgid "key-number-label"
-msgstr "En-tête"
-
-#: src/pyams_content/component/keynumber/interfaces/__init__.py:45
+"Le titre devrait être composé de 40 à 66 caractères ({length} actuellement)"
+
+#: src/pyams_content/shared/common/zmi/search.py:92
+#: src/pyams_content/root/zmi/search.py:91
+msgid "Quick search results"
+msgstr "Résultats de la recherche rapide"
+
+#: src/pyams_content/shared/common/zmi/search.py:157
+#: src/pyams_content/shared/common/zmi/search.py:190
+#: src/pyams_content/root/zmi/search.py:147
+#: src/pyams_content/root/zmi/search.py:180
+msgid "Advanced search"
+msgstr "Recherche avancée"
+
+#: src/pyams_content/shared/common/zmi/search.py:282
+#: src/pyams_content/root/zmi/search.py:260
+msgid "Advanced search results"
+msgstr "Résultats de la recherche avancée"
+
+#: src/pyams_content/shared/common/zmi/search.py:165
+#: src/pyams_content/shared/common/zmi/dashboard.py:231
+#: src/pyams_content/root/zmi/search.py:159
+msgid "Owner"
+msgstr "Propriétaire"
+
+#: src/pyams_content/shared/common/zmi/search.py:168
+#: src/pyams_content/shared/common/zmi/dashboard.py:154
+msgid "Status"
+msgstr "Statut"
+
+#: src/pyams_content/shared/common/zmi/search.py:172
+#: src/pyams_content/root/zmi/search.py:162
+msgid "Created after..."
+msgstr "Créé entre le"
+
+#: src/pyams_content/shared/common/zmi/search.py:175
+#: src/pyams_content/root/zmi/search.py:165
+msgid "Created before..."
+msgstr "et le"
+
+#: src/pyams_content/shared/common/zmi/search.py:178
+#: src/pyams_content/root/zmi/search.py:168
+msgid "Modified after..."
+msgstr "Modifié entre le"
+
+#: src/pyams_content/shared/common/zmi/search.py:181
+#: src/pyams_content/root/zmi/search.py:171
+msgid "Modified before..."
+msgstr "et le"
+
+#: src/pyams_content/shared/common/zmi/properties.py:60
+msgid "Composition"
+msgstr "Composition"
+
+#: src/pyams_content/shared/common/zmi/properties.py:83
+msgid "Content properties"
+msgstr "Propriétés élémentaires"
+
+#: src/pyams_content/shared/common/zmi/types.py:71
+msgid "Data types"
+msgstr "Types de contenus"
+
+#: src/pyams_content/shared/common/zmi/types.py:149
+msgid "Data type label"
+msgstr "Libellé du type"
+
+#: src/pyams_content/shared/common/zmi/types.py:189
+#: src/pyams_content/shared/common/zmi/types.py:429
+msgid "Default associations"
+msgstr "Liens et pièces jointes par défaut"
+
+#: src/pyams_content/shared/common/zmi/types.py:205
+msgid "Default themes"
+msgstr "Thèmes par défaut"
+
+#: src/pyams_content/shared/common/zmi/types.py:233
+msgid "Content data types"
+msgstr "Types de contenus"
+
+#: src/pyams_content/shared/common/zmi/types.py:256
+msgid "Add data type"
+msgstr "Ajouter un type"
+
+#: src/pyams_content/shared/common/zmi/types.py:268
+msgid "Add new data type"
+msgstr "Ajout d'un type de contenu"
+
+#: src/pyams_content/shared/common/zmi/types.py:311
+msgid "Data type properties"
+msgstr "Propriétés du type de contenu"
+
+#: src/pyams_content/shared/common/zmi/types.py:392
+msgid "Subtype label"
+msgstr "Libellé du sous-type"
+
+#: src/pyams_content/shared/common/zmi/types.py:473
+msgid "Add subtype"
+msgstr "Ajouter un sous-type"
+
+#: src/pyams_content/shared/common/zmi/types.py:485
+msgid "Add new subtype"
+msgstr "Ajout d'un sous-type de contenu"
+
+#: src/pyams_content/shared/common/zmi/types.py:532
+msgid "Data subtype properties"
+msgstr "Propriétés du fichier standard"
+
+#: src/pyams_content/shared/common/zmi/types.py:116
+msgid "No currently defined data type."
+msgstr "Aucun type de contenu n'est actuellement défini."
+
+#: src/pyams_content/shared/common/zmi/types.py:301
+msgid "Specified type name is already used!"
+msgstr "Le nom indiqué pour ce type de contenu est déjà utilisé !"
+
+#: src/pyams_content/shared/common/zmi/types.py:508
+msgid "Subtype was correctly added."
+msgstr "Le sous-type a été ajouté."
+
+#: src/pyams_content/shared/common/zmi/types.py:522
+msgid "Specified subtype name is already used!"
+msgstr "Le nom indiqué pour ce sous-type de contenu est déjà utilisé !"
+
+#: src/pyams_content/shared/common/zmi/types.py:161
+msgid "Click to see subtypes"
+msgstr "Montrer ou caher les sous-types"
+
+#: src/pyams_content/shared/common/zmi/workflow.py:845
+msgid "Prior checks"
+msgstr "Contrôles préalables : avez-vous ?"
+
+#: src/pyams_content/shared/common/zmi/workflow.py:124
+msgid "Request publication"
+msgstr "Demander la publication"
+
+#: src/pyams_content/shared/common/zmi/workflow.py:211
+#: src/pyams_content/workflow/__init__.py:315
+msgid "Cancel publication request"
+msgstr "Annuler la demande de publication"
+
+#: src/pyams_content/shared/common/zmi/workflow.py:251
+msgid "Refuse publication request"
+msgstr "Refuser la demande de publication"
+
+#: src/pyams_content/shared/common/zmi/workflow.py:305
+#: src/pyams_content/workflow/basic.py:196
+msgid "Publish"
+msgstr "Publier"
+
+#: src/pyams_content/shared/common/zmi/workflow.py:394
+msgid "Request retire"
+msgstr "Demander le retrait"
+
+#: src/pyams_content/shared/common/zmi/workflow.py:450
+msgid "Cancel retire request"
+msgstr "Annuler la demande de retrait"
+
+#: src/pyams_content/shared/common/zmi/workflow.py:490
+msgid "Retire"
+msgstr "Retirer"
+
+#: src/pyams_content/shared/common/zmi/workflow.py:531
+#: src/pyams_content/workflow/__init__.py:436
+msgid "Request archive"
+msgstr "Demander l'archivage"
+
+#: src/pyams_content/shared/common/zmi/workflow.py:574
+msgid "Cancel archive request"
+msgstr "Annuler la demande d'archivage"
+
+#: src/pyams_content/shared/common/zmi/workflow.py:614
+msgid "Archive"
+msgstr "Archiver"
+
+#: src/pyams_content/shared/common/zmi/workflow.py:655
+#: src/pyams_content/workflow/__init__.py:501
+#: src/pyams_content/workflow/__init__.py:513
+#: src/pyams_content/workflow/__init__.py:525
+#: src/pyams_content/workflow/__init__.py:537
+#: src/pyams_content/workflow/__init__.py:549
+#: src/pyams_content/workflow/basic.py:224
+#: src/pyams_content/workflow/basic.py:236
+msgid "Create new version"
+msgstr "Créer une nouvelle version"
+
+#: src/pyams_content/shared/common/zmi/workflow.py:706
+#: src/pyams_content/workflow/__init__.py:561
+#: src/pyams_content/workflow/basic.py:248
+msgid "Delete version"
+msgstr "Supprimer cette version"
+
+#: src/pyams_content/shared/common/zmi/workflow.py:791
+msgid "Previewed content?"
+msgstr "Prévisualisé ce contenu ?"
+
+#: src/pyams_content/shared/common/zmi/workflow.py:795
+msgid "Verified content?"
+msgstr "Audité ce contenu ?"
+
+#: src/pyams_content/shared/common/zmi/workflow.py:181
+#: src/pyams_content/shared/common/zmi/workflow.py:363
+msgid "Publication start date is required"
+msgstr "La date de début de publication est obligatoire"
+
+#: src/pyams_content/shared/common/zmi/workflow.py:274
+#: src/pyams_content/shared/common/zmi/workflow.py:420
+msgid "A comment is required"
+msgstr "Le commentaire est obligatoire"
+
+#: src/pyams_content/shared/common/zmi/workflow.py:730
+msgid "Delete content"
+msgstr "Supprimer définitivement ce contenu"
+
+#: src/pyams_content/shared/common/zmi/workflow.py:739
+msgid "Delete definitively"
+msgstr "Supprimer définitivement"
+
+#: src/pyams_content/shared/common/zmi/workflow.py:868
 msgid ""
-"Small text to be displayed above number (according to selected renderer)"
+"You must confirm that you previewed and checked this content before "
+"requesting publication!!"
+msgstr ""
+"Vous devez avoir prévisualisé et audité ce contenu avant de pouvoir le "
+"publier !!"
+
+#: src/pyams_content/shared/common/zmi/workflow.py:88
+#, python-format
+msgid "{state} | by {principal}"
+msgstr "{state} | par {principal}"
+
+#: src/pyams_content/shared/common/zmi/workflow.py:871
+msgid ""
+"You must confirm that you checked this content before requesting "
+"publication!!"
+msgstr ""
+"Vous devez avoir audité ce contenu avant de pouvoir le publier !!"
+
+#: src/pyams_content/shared/common/zmi/workflow.py:84
+#: src/pyams_content/workflow/__init__.py:648
+#: src/pyams_content/workflow/__init__.py:619
+#: src/pyams_content/workflow/basic.py:315
+#: src/pyams_content/workflow/basic.py:286
+#, python-format
+msgid "{state} {date}"
+msgstr "{state} {date}"
+
+#: src/pyams_content/shared/common/zmi/__init__.py:263
+msgid "Duplicate content..."
+msgstr "Dupliquer le contenu"
+
+#: src/pyams_content/shared/common/zmi/__init__.py:283
+msgid "Duplicate content"
+msgstr "Dupliquer ce contenu"
+
+#: src/pyams_content/shared/common/zmi/__init__.py:84
+msgid "This title can be modified afterwards"
+msgstr "Pourra être modifié ultérieurement"
+
+#: src/pyams_content/shared/common/zmi/__init__.py:274
+msgid "Duplicate this content"
+msgstr "Dupliquer ce contenu"
+
+#: src/pyams_content/shared/common/zmi/__init__.py:330
+#, python-format
+msgid "Clone created from version {source} of {oid} (in « {state} » state)"
+msgstr ""
+"Duplication de la version {source} du contenu {oid} (alors en statut "
+"« {state} »)"
+
+#: src/pyams_content/shared/common/zmi/__init__.py:375
+msgid "Created or modified in this version"
+msgstr "Créé ou modifié dans cette version"
+
+#: src/pyams_content/shared/common/zmi/summary.py:50
+msgid "Display content summary"
+msgstr "Récapitulatif pour ce contenu"
+
+#: src/pyams_content/shared/common/zmi/summary.py:74
+msgid "Identity card"
+msgstr "Carte d'identité"
+
+#: src/pyams_content/shared/common/zmi/summary.py:86
+msgid "Requested action"
+msgstr "Évolution demandée"
+
+#: src/pyams_content/shared/common/zmi/summary.py:127
+msgid "Publication and retire dates"
+msgstr "Dates de publication et de retrait planifiées"
+
+#: src/pyams_content/shared/common/zmi/summary.py:146
+msgid "Current version"
+msgstr "À propos de cette version"
+
+#: src/pyams_content/shared/common/zmi/summary.py:176
+msgid "Content history"
+msgstr "Pour mémoire"
+
+#: src/pyams_content/shared/common/zmi/summary.py:117
+msgid "Associated comment"
+msgstr "Commentaire associé"
+
+#: src/pyams_content/shared/common/zmi/summary.py:158
+#: src/pyams_content/shared/common/zmi/dashboard.py:198
+msgid "Version"
+msgstr "Version"
+
+#: src/pyams_content/shared/common/zmi/summary.py:107
+#, python-format
+msgid "{state} {date} by {principal}"
+msgstr "{state} {date} par {principal}"
+
+#: src/pyams_content/shared/common/zmi/summary.py:164
+#, python-format
+msgid "{state} since {date}, by {principal}"
+msgstr "{state} depuis {date} par {principal}"
+
+#: src/pyams_content/shared/common/zmi/manager.py:107
+msgid "Shared tool properties"
+msgstr "Propriétés de l'outil"
+
+#: src/pyams_content/shared/common/zmi/manager.py:125
+msgid "WARNING"
+msgstr "ATTENTION"
+
+#: src/pyams_content/shared/common/zmi/manager.py:127
+msgid ""
+"Workflow shouldn't be modified if this tool already contains any shared "
+"content!"
 msgstr ""
-"Texte court affiché au-dessus du chiffre (selon le mode de rendu sélectionné)"
-
-#: src/pyams_content/component/keynumber/interfaces/__init__.py:49
-#: src/pyams_content/component/keynumber/zmi/__init__.py:158
-msgid "Number"
-msgstr "Chiffre"
-
-#: src/pyams_content/component/keynumber/interfaces/__init__.py:50
-msgid "Key number value"
-msgstr "Chiffre"
-
-#. Default: Unit
-#: src/pyams_content/component/keynumber/interfaces/__init__.py:53
-#: src/pyams_content/component/keynumber/zmi/__init__.py:167
-msgid "key-number-unit"
-msgstr "Unité"
-
-#: src/pyams_content/component/keynumber/interfaces/__init__.py:54
-msgid "Displayed unit"
-msgstr "Unité affichée"
-
-#: src/pyams_content/component/keynumber/interfaces/__init__.py:58
-msgid "The way this text will be rendered depends on presentation template"
+"Le workflow ne doit pas être modifié si cet outil renferme déjà des contenus "
+"partagés !"
+
+#: src/pyams_content/shared/common/zmi/manager.py:150
+msgid "Languages"
+msgstr "Langues"
+
+#: src/pyams_content/shared/common/zmi/manager.py:162
+msgid "Content languages"
+msgstr "Langues pour la traduction de cet outil"
+
+#: src/pyams_content/shared/common/zmi/manager.py:172
+msgid ""
+"Tool languages are used to translate own tool properties, and newly created "
+"contents will propose these languages by default"
+msgstr ""
+"Les langues sont utilisées pour traduire les propriétés de l'outil.\n"
+"\n"
+"Les nouveaux contenus proposeront également ces langues par défaut."
+
+#: src/pyams_content/shared/common/zmi/manager.py:80
+msgid "Content management"
+msgstr "Gérer ce gabarit"
+
+#: src/pyams_content/shared/common/zmi/manager.py:82
+msgid "Tool management"
+msgstr "Gérer cet outil"
+
+#: src/pyams_content/shared/common/zmi/owner.py:50
+msgid "Change owner..."
+msgstr "Changer de propriétaire"
+
+#: src/pyams_content/shared/common/zmi/owner.py:83
+msgid "Change content's owner"
+msgstr "Changement de propriétaire"
+
+#: src/pyams_content/shared/common/zmi/owner.py:125
+msgid ""
+"All versions of this content which are not archived will be transferred to "
+"newly selected owner"
+msgstr ""
+"Toutes les versions non archivées de ce contenu seront transférées au "
+"nouveau propriétaire sélectionné"
+
+#: src/pyams_content/shared/common/zmi/owner.py:60
+msgid "New owner"
+msgstr "Nouveau propriétaire"
+
+#: src/pyams_content/shared/common/zmi/owner.py:61
+msgid "The selected user will become the new content's owner"
+msgstr "L'utilisateur sélectionné deviendra le nouveau propriétaire du contenu"
+
+#: src/pyams_content/shared/common/zmi/owner.py:63
+msgid "Keep previous owner as contributor"
+msgstr "L'ancien propriétaire reste contributeur"
+
+#: src/pyams_content/shared/common/zmi/owner.py:64
+msgid "If 'yes', the previous owner will still be able to modify this content"
+msgstr ""
+"Si 'oui', l'actuel propriétaire du contenu en restera contributeur et pourra "
+"donc continuer à le mettre à jour"
+
+#: src/pyams_content/shared/common/zmi/owner.py:74
+msgid "Change owner"
+msgstr "Changer le propriétaire"
+
+#: src/pyams_content/shared/common/zmi/rename.py:62
+msgid "Change URL..."
+msgstr "Changer d'URL"
+
+#: src/pyams_content/shared/common/zmi/rename.py:79
+msgid "Change item URL"
+msgstr "Modification de l'URL"
+
+#: src/pyams_content/shared/common/zmi/rename.py:86
+msgid "Item URL part"
+msgstr "URL du contenu"
+
+#: src/pyams_content/shared/common/zmi/rename.py:87
+msgid "URL part used to access this content"
+msgstr "Portion de l'URL utilisée pour accéder à ce contenu"
+
+#: src/pyams_content/shared/common/zmi/rename.py:121
+msgid "You must provide an URL for this item!"
+msgstr "Vous devez fournir une URL pour ce contenu !"
+
+#: src/pyams_content/shared/common/zmi/site.py:38
+#, python-format
+msgid ""
+"SEARCH - Between all contents published into &laquo;&nbsp;{site}&nbsp;&raquo;"
+msgstr ""
+"RECHERCHE - Tous contenus présents dans &laquo;&nbsp;{site}&nbsp;&raquo; "
+"confondus"
+
+#: src/pyams_content/shared/common/zmi/portal.py:46
+msgid "Edit default template properties"
+msgstr "Modèle de présentation par défaut"
+
+#: src/pyams_content/shared/common/zmi/portal.py:56
+msgid ""
+"**This form allows you to select shared content default template.**\n"
+"\n"
+"If you choose to use a shared template, you can only adjust settings of each "
+"portlet individually but can't change portlets list or page configuration.\n"
+"\n"
+"If you use a local template, you can define a whole custom configuration but "
+"the template definition can't be reused anywhere..."
 msgstr ""
-"La présentation de cette information peut varier en fonction du mode de "
-"rendu choisi"
-
-#: src/pyams_content/component/keynumber/zmi/__init__.py:217
-msgid "Add keynumber"
-msgstr "Ajouter un chiffre-clé"
-
-#: src/pyams_content/component/keynumber/zmi/__init__.py:230
-msgid "Add new keynumber"
-msgstr "Ajout d'un chiffre-clé"
-
-#: src/pyams_content/component/keynumber/zmi/__init__.py:259
-msgid "Edit keynumber properties"
-msgstr "Propriétés du chiffre-clé"
-
-#: src/pyams_content/component/keynumber/zmi/__init__.py:245
-msgid "Key number was correctly added"
-msgstr "Le chiffre-clé a été ajouté."
-
-#: src/pyams_content/component/keynumber/portlet/__init__.py:71
-msgid "Key Numbers"
-msgstr "Chiffres-clés"
-
-#: src/pyams_content/component/keynumber/portlet/interfaces/__init__.py:32
-msgid "Portlet title"
-msgstr "Titre"
-
-#: src/pyams_content/component/keynumber/portlet/interfaces/__init__.py:35
-msgid "Teaser"
-msgstr "Accroche"
-
-#: src/pyams_content/component/keynumber/portlet/interfaces/__init__.py:36
-msgid "Short text displayed above key numbers"
-msgstr "Texte d'introduction des chiffres-clés"
-
-#: src/pyams_content/component/keynumber/portlet/zmi/__init__.py:102
-#: src/pyams_content/component/keynumber/portlet/zmi/templates/keynumber-preview.pt:22
-msgid "Associated links"
-msgstr "Liens associés"
-
-#: src/pyams_content/shared/blog/interfaces/__init__.py:33
-msgid "Blog post"
-msgstr "Article de blog"
-
-#: src/pyams_content/shared/blog/zmi/__init__.py:52
-msgid "This blog post"
-msgstr "Cet article"
-
-#: src/pyams_content/shared/blog/zmi/__init__.py:71
-#: src/pyams_content/shared/blog/zmi/__init__.py:81
-msgid "Add blog post"
-msgstr "Ajouter un article"
-
-#: src/pyams_content/shared/blog/zmi/__init__.py:62
+"Vous pouvez modifier le modèle de présentation qui sera appliqué **par "
+"défaut** à tous les contenus de ce gabarit.\n"
+"\n"
+"Si vous choisissez d'utiliser un modèle de présentation partagé, vous "
+"pourrez ajuster les paramètres de chaque composant mais ne pourrez pas "
+"modifier la liste des composants ou leur position et la configuration de la "
+"page.\n"
+"\n"
+"Si vous choisissez d'utiliser un modèle de présentation \"local\", vous "
+"pourrez définir l'ensemble de la configuration mais le modèle de "
+"présentation ne pourra pas être réutilisé ailleurs que dans les contenus de "
+"ce gabarit."
+
+#: src/pyams_content/shared/common/zmi/portal.py:72
+msgid "Override tool default template"
+msgstr "Ne pas utiliser le modèle par défaut de ce gabarit"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:134
+msgid "Unique ID"
+msgstr "N° IN"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:181
+msgid "Status date"
+msgstr "En date du"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:213
+msgid "Status principal"
+msgstr "Intervenant"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:250
+msgid "Last modification"
+msgstr "Dernière modification"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:273
+#: src/pyams_content/root/zmi/__init__.py:110
+msgid "Dashboard"
+msgstr "Tableau de bord"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:283
+msgid "Contents dashboard"
+msgstr "Mon tableau de bord"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:329
+#: src/pyams_content/root/zmi/__init__.py:159
+#, python-format
+msgid "MANAGER - {0} content waiting for your action"
+msgstr "RESPONSABLE - {0} contenu en attente de votre intervention"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:330
+#: src/pyams_content/root/zmi/__init__.py:160
+#, python-format
+msgid "MANAGER - {0} contents waiting for your action"
+msgstr "RESPONSABLE - {0} contenus en attente de votre intervention"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:371
+#: src/pyams_content/root/zmi/__init__.py:204
+#, python-format
+msgid "CONTRIBUTOR - {0} content waiting for action"
+msgstr "CONTRIBUTEUR - {0} contenu soumis à un responsable"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:372
+#: src/pyams_content/root/zmi/__init__.py:205
+#, python-format
+msgid "CONTRIBUTOR - {0} contents waiting for action"
+msgstr "CONTRIBUTEUR - {0} contenus soumis à un responsable"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:404
+#: src/pyams_content/root/zmi/__init__.py:240
+#, python-format
+msgid "CONTRIBUTOR - {0} modified content"
+msgstr "CONTRIBUTEUR - {0} contenu modifié"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:445
+#: src/pyams_content/root/zmi/__init__.py:283
+msgid "My contents"
+msgstr "Mes contenus"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:460
+#: src/pyams_content/shared/common/zmi/templates/dashboard.pt:8
+#: src/pyams_content/root/zmi/__init__.py:298
+#: src/pyams_content/root/zmi/templates/dashboard.pt:8
+msgid "My favorites"
+msgstr "Mes favoris"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:469
+#: src/pyams_content/root/zmi/__init__.py:307
+#, python-format
+msgid "CONTRIBUTOR - {0} favorite"
+msgstr "CONTRIBUTEUR - {0} contenu favori"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:470
+#: src/pyams_content/root/zmi/__init__.py:308
+#, python-format
+msgid "CONTRIBUTOR - {0} favorites"
+msgstr "CONTRIBUTEUR - {0} contenus favoris"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:482
+#: src/pyams_content/shared/common/zmi/templates/header.pt:23
+msgid "Add/remove from favorites"
+msgstr "Ajouter/enlever des favoris"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:545
+#: src/pyams_content/root/zmi/__init__.py:346
+msgid "Your favorites"
+msgstr "Mes favoris"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:558
+#: src/pyams_content/root/zmi/__init__.py:359
+msgid "My preparations"
+msgstr "Mes préparations"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:567
+#: src/pyams_content/root/zmi/__init__.py:368
+#, python-format
+msgid "CONTRIBUTOR - {0} prepared content"
+msgstr "CONTRIBUTEUR - {0} contenu en préparation"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:568
+#: src/pyams_content/root/zmi/__init__.py:369
 #, python-format
-msgid "Blog post « {title} »"
-msgstr "Article de blog « {title} »"
-
-#: src/pyams_content/shared/blog/zmi/manager.py:60
-msgid "Blog management"
-msgstr "Gérer ce blog"
-
-#: src/pyams_content/shared/blog/zmi/manager.py:83
-#: src/pyams_content/shared/blog/zmi/manager.py:97
-msgid "Add blog manager"
-msgstr "Ajouter un blog"
-
-#: src/pyams_content/shared/blog/zmi/manager.py:96
-msgid "Blog manager"
-msgstr "Blog"
-
-#: src/pyams_content/shared/blog/zmi/manager.py:155
-#: src/pyams_content/shared/blog/zmi/manager.py:167
-#: src/pyams_content/shared/site/zmi/container.py:107
-#: src/pyams_content/shared/site/zmi/container.py:119
-msgid "Publication dates..."
-msgstr "Dates de publication"
-
-#: src/pyams_content/shared/blog/zmi/manager.py:181
-#: src/pyams_content/shared/site/zmi/container.py:133
-msgid "Update publication dates"
-msgstr "Dates de publication"
-
-#: src/pyams_content/shared/blog/zmi/manager.py:127
-#: src/pyams_content/shared/site/zmi/manager.py:156
-msgid "You must provide a short name for default server language!"
-msgstr "Vous devez fournir un nom court pour la langue par défaut du serveur !"
-
-#: src/pyams_content/shared/blog/zmi/manager.py:131
-msgid "Specified blog manager name is already used!"
-msgstr "Le nom indiqué pour ce blog existe déjà !"
-
-#: src/pyams_content/shared/blog/zmi/manager.py:135
-msgid "A blog manager is already registered with this name!!"
-msgstr "Un blog est déjà inscrit dans le registre avec ce nom !"
-
-#: src/pyams_content/shared/imagemap/paragraph.py:91
-msgid "no selected image map"
-msgstr "aucune image cliquable sélectionnée"
-
-#: src/pyams_content/shared/imagemap/paragraph.py:97
+msgid "CONTRIBUTOR - {0} prepared contents"
+msgstr "CONTRIBUTEUR - {0} contenus en préparation"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:608
+#: src/pyams_content/root/zmi/__init__.py:408
+msgid "Your prepared contents"
+msgstr "Mes contenus en préparation"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:621
+#: src/pyams_content/root/zmi/__init__.py:421
+msgid "My submissions"
+msgstr "Mes demandes"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:630
+#: src/pyams_content/root/zmi/__init__.py:430
+#, python-format
+msgid "CONTRIBUTOR - {0} submitted content"
+msgstr "CONTRIBUTEUR - {0} contenu soumis à un responsable"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:631
+#: src/pyams_content/root/zmi/__init__.py:431
+#, python-format
+msgid "CONTRIBUTOR - {0} submitted contents"
+msgstr "CONTRIBUTEUR - {0} contenus soumis à un responsable"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:671
+#: src/pyams_content/root/zmi/__init__.py:470
+msgid "Your submitted contents"
+msgstr "Mes contenus soumis à un responsable"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:684
+#: src/pyams_content/root/zmi/__init__.py:483
+msgid "My publications"
+msgstr "Mes publications"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:693
+#: src/pyams_content/root/zmi/__init__.py:492
+#, python-format
+msgid "CONTRIBUTOR - {0} published content"
+msgstr "CONTRIBUTEUR - {0} contenu publié"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:694
+#: src/pyams_content/root/zmi/__init__.py:493
+#, python-format
+msgid "CONTRIBUTOR - {0} published contents"
+msgstr "CONTRIBUTEUR - {0} contenus publiés"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:734
+#: src/pyams_content/root/zmi/__init__.py:532
+msgid "Your published contents"
+msgstr "Mes contenus publiés"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:747
+#: src/pyams_content/root/zmi/__init__.py:545
+msgid "My retired contents"
+msgstr "Mes contenus retirés"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:756
+#: src/pyams_content/root/zmi/__init__.py:554
+#, python-format
+msgid "CONTRIBUTOR - {0} retired content"
+msgstr "CONTRIBUTEUR - {0} contenu retiré"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:757
+#: src/pyams_content/root/zmi/__init__.py:555
 #, python-format
-msgid "image map '{0}' can't be found"
-msgstr "l'image cliquable '{0}' est introuvable"
-
-#: src/pyams_content/shared/imagemap/paragraph.py:105
+msgid "CONTRIBUTOR - {0} retired contents"
+msgstr "CONTRIBUTEUR - {0} contenus retirés"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:798
+#: src/pyams_content/root/zmi/__init__.py:595
+msgid "Your retired contents"
+msgstr "Mes contenus retirés"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:811
+#: src/pyams_content/root/zmi/__init__.py:608
+msgid "My archived contents"
+msgstr "Mes contenus archivés"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:820
+#: src/pyams_content/root/zmi/__init__.py:617
+#, python-format
+msgid "CONTRIBUTOR - {0} archived content"
+msgstr "CONTRIBUTEUR - {0} contenu archivé"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:821
+#: src/pyams_content/root/zmi/__init__.py:618
+#, python-format
+msgid "CONTRIBUTOR - {0} archived contents"
+msgstr "CONTRIBUTEUR - {0} contenus archivés"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:868
+#: src/pyams_content/root/zmi/__init__.py:664
+msgid "Your archived contents"
+msgstr "Mes contenus archivés"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:882
+#: src/pyams_content/root/zmi/__init__.py:678
+msgid "Other interventions"
+msgstr "Toutes les interventions"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:897
+#: src/pyams_content/root/zmi/__init__.py:693
+msgid "Last publications"
+msgstr "Dernières publications"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:906
+#: src/pyams_content/root/zmi/__init__.py:702
+#, python-format
+msgid "CONTRIBUTORS - {0} published content"
+msgstr "TOUS CONTRIBUTEURS - {0} contenu publié"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:953
+#: src/pyams_content/root/zmi/__init__.py:748
+msgid "Last published contents"
+msgstr "Derniers contenus publiés"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:966
+#: src/pyams_content/root/zmi/__init__.py:761
+msgid "Last updates"
+msgstr "Dernières modifications"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:975
+#: src/pyams_content/root/zmi/__init__.py:770
+#, python-format
+msgid "CONTRIBUTORS - {0} updated content"
+msgstr "TOUS CONTRIBUTEURS - {0} contenu modifié"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:1020
+#: src/pyams_content/root/zmi/__init__.py:814
+msgid "Last updated contents"
+msgstr "Derniers contenus modifiés"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:409
+#: src/pyams_content/root/zmi/__init__.py:245
+#, python-format
+msgid "CONTRIBUTOR - {0} modified contents"
+msgstr "CONTRIBUTEUR - {0} contenus modifiés"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:411
+#: src/pyams_content/root/zmi/__init__.py:247
+#, python-format
+msgid "CONTRIBUTOR - Last {0} modified contents"
+msgstr "CONTRIBUTEUR - Les {0} dernières modifications"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:911
+#: src/pyams_content/root/zmi/__init__.py:707
 #, python-format
-msgid "image map '{0}' is not published"
-msgstr "l'image cliquable '{0}' n'est pas publiée"
-
-#: src/pyams_content/shared/imagemap/__init__.py:154
-msgid "no area defined"
-msgstr "aucune zone définie"
-
-#: src/pyams_content/shared/imagemap/interfaces/__init__.py:35
-#: src/pyams_content/shared/imagemap/interfaces/__init__.py:88
-msgid "Image map"
-msgstr "Image cliquable"
-
-#: src/pyams_content/shared/imagemap/interfaces/__init__.py:49
-#: src/pyams_content/shared/imagemap/zmi/container.py:140
-msgid "Link target"
-msgstr "Cible du lien"
-
-#: src/pyams_content/shared/imagemap/interfaces/__init__.py:50
-msgid "Internal or external link associated with this map area"
-msgstr "Lien interne ou externe associé à cette zone"
-
-#: src/pyams_content/shared/imagemap/interfaces/__init__.py:55
-msgid "Alternate label associated with this area"
-msgstr "Libellé de substitution associé à cette zone"
-
-#: src/pyams_content/shared/imagemap/interfaces/__init__.py:58
-msgid "Map area coordinates"
-msgstr "Coordonnées"
-
-#: src/pyams_content/shared/imagemap/interfaces/__init__.py:59
-msgid "List of coordinates of image area"
-msgstr "Positionnement de la zone cliquable sur l'image"
-
-#: src/pyams_content/shared/imagemap/interfaces/__init__.py:67
-msgid "Image supporting map areas"
-msgstr "Sélection de l'image qui supportera les zones cliquables"
-
-#: src/pyams_content/shared/imagemap/interfaces/__init__.py:70
-#: src/pyams_content/shared/imagemap/zmi/container.py:65
-msgid "Image map areas"
-msgstr "Zones cliquables de l'images"
-
-#: src/pyams_content/shared/imagemap/interfaces/__init__.py:71
-msgid "List of defined map areas"
-msgstr "Liste des zones cliquables définies sur l'image"
-
-#: src/pyams_content/shared/imagemap/interfaces/__init__.py:96
-msgid "Reference to image map object"
+msgid "CONTRIBUTORS - Last {0} published contents"
+msgstr "TOUS CONTRIBUTEURS - Les {0} dernières publications"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:913
+#: src/pyams_content/root/zmi/__init__.py:709
+msgid "CONTRIBUTORS - Last published contents (in the limit of 50)"
+msgstr "TOUS CONTRIBUTEURS - Les {0} dernières publications"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:980
+#: src/pyams_content/root/zmi/__init__.py:775
+#, python-format
+msgid "CONTRIBUTORS - Last {0} updated contents"
+msgstr "TOUS CONTRIBUTEURS - Les {0} dernières modifications"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:982
+#: src/pyams_content/root/zmi/__init__.py:777
+msgid "CONTRIBUTORS - Last updated contents (in the limit of 50)"
+msgstr "TOUS CONTRIBUTEURS - Les {0} dernières modifications"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:306
+#, python-format
+msgid "SEARCH - Between all contents of type &laquo;&nbsp;{type}&nbsp;&raquo;"
+msgstr "RECHERCHE - Tous contenus &laquo;&nbsp;{type}&nbsp;&raquo; confondus"
+
+#: src/pyams_content/shared/common/zmi/dashboard.py:171
+#: src/pyams_content/shared/common/zmi/header.py:96
+msgid "Content publication start date is not passed yet"
+msgstr "La date de début de publication n'est pas encore atteinte"
+
+#: src/pyams_content/shared/common/zmi/security.py:64
+msgid "Contributors restrictions"
+msgstr "Paramètres des contributeurs"
+
+#: src/pyams_content/shared/common/zmi/security.py:73
+msgid "Content contributors restrictions"
+msgstr "Liste des contributeurs"
+
+#: src/pyams_content/shared/common/zmi/security.py:107
+msgid "Contributor name"
+msgstr "Nom du contributeur"
+
+#: src/pyams_content/shared/common/zmi/security.py:118
+#: src/pyams_content/shared/common/zmi/security.py:270
+msgid "Activated publication checks?"
+msgstr "Tunnel de publication actif ?"
+
+#: src/pyams_content/shared/common/zmi/security.py:218
+msgid "Managers restrictions"
+msgstr "Paramètres des responsables"
+
+#: src/pyams_content/shared/common/zmi/security.py:227
+msgid "Content managers restrictions"
+msgstr "Liste des responsables"
+
+#: src/pyams_content/shared/common/zmi/security.py:259
+msgid "Manager name"
+msgstr "Nom du responsable"
+
+#: src/pyams_content/shared/common/zmi/security.py:287
+msgid "Restricted"
+msgstr "Restrictions"
+
+#: src/pyams_content/shared/common/zmi/security.py:304
+msgid "Owners"
+msgstr "Propriétaires"
+
+#: src/pyams_content/shared/common/zmi/security.py:394
+msgid "Publication workflow"
+msgstr "Workflow de publication"
+
+#: src/pyams_content/shared/common/zmi/security.py:167
+#, python-format
+msgid "Edit contributor restrictions for « {0} »"
+msgstr "Gérer les paramètres d'intervention de « {0} »"
+
+#: src/pyams_content/shared/common/zmi/security.py:353
+#, python-format
+msgid "Edit manager restrictions for « {0} »"
+msgstr "Gérer les paramètres d'intervention de « {0} »"
+
+#: src/pyams_content/shared/common/zmi/security.py:400
+msgid "Apply contents restrictions"
+msgstr "Appliquer des restrictions d'accès"
+
+#: src/pyams_content/shared/common/zmi/security.py:402
+msgid ""
+"You can specify which contents this manager will be able to manage. If you "
+"specify several criteria, the manager will be able to manage contents for "
+"which at least one criteria is matching."
 msgstr ""
-"Référence interne de l'image cliquable. Vous pouvez la rechercher par des "
-"mots de son titre, ou par son numéro interne (précédé d'un '+')."
-
-#: src/pyams_content/shared/imagemap/interfaces/__init__.py:99
-msgid "Image map template"
-msgstr "Mode de rendu"
-
-#: src/pyams_content/shared/imagemap/zmi/container.py:54
-msgid "Image areas"
-msgstr "Zones de l'image"
-
-#: src/pyams_content/shared/imagemap/zmi/container.py:113
-msgid "No currently defined image."
-msgstr "Aucun image de fond n'est actuellement définie."
-
-#: src/pyams_content/shared/imagemap/zmi/container.py:115
-msgid "No currently defined area."
-msgstr "Aucune zone cliquable n'est actuellement définie."
-
-#: src/pyams_content/shared/imagemap/zmi/container.py:175
-#: src/pyams_content/root/zmi/sites.py:170
-msgid "No provided object_name argument!"
-msgstr "Argument 'object_name' non fourni !"
-
-#: src/pyams_content/shared/imagemap/zmi/container.py:194
-msgid "Given area name doesn't exist!"
-msgstr "La zone indiquée n'existe pas !"
-
-#: src/pyams_content/shared/imagemap/zmi/container.py:186
-msgid "Bad query object_name parameter value!"
-msgstr "Valeur incorrecte du paramètre object_name !"
-
-#: src/pyams_content/shared/imagemap/zmi/paragraph.py:54
-msgid "Image map..."
-msgstr "Image cliquable"
-
-#: src/pyams_content/shared/imagemap/zmi/paragraph.py:67
-msgid "Add new image map"
-msgstr "Ajout d'une image cliquable"
-
-#: src/pyams_content/shared/imagemap/zmi/paragraph.py:94
-#: src/pyams_content/shared/logo/zmi/paragraph.py:93
-msgid "Edit paragraph properties"
-msgstr "Propriétés de l'image cliquable"
-
-#: src/pyams_content/shared/imagemap/zmi/__init__.py:44
-msgid "This image map"
-msgstr "Cette image"
-
-#: src/pyams_content/shared/imagemap/zmi/__init__.py:63
-msgid "Add image map"
-msgstr "Ajouter une image"
-
-#: src/pyams_content/shared/imagemap/zmi/__init__.py:73
-msgid "Adding image map"
-msgstr "Ajout d'une image"
-
-#: src/pyams_content/shared/imagemap/zmi/__init__.py:54
+"Vous pouvez indiquer les propriétés des contenus que ce responsable sera "
+"autorisé à gérer. Si vous indiquez plusieurs critères, il pourra gérer les "
+"contenus pour lesquels au moins l'un des critères correspond."
+
+#: src/pyams_content/shared/common/zmi/header.py:85
+#, python-format
+msgid "{state} by {principal}"
+msgstr "{state} par {principal}"
+
+#: src/pyams_content/shared/common/zmi/header.py:116
 #, python-format
-msgid "Image map « {title} »"
-msgstr "Article de blog « {title} »"
-
-#: src/pyams_content/shared/imagemap/zmi/area.py:47
-msgid "Add image area"
-msgstr "Ajouter une zone"
-
-#: src/pyams_content/shared/imagemap/zmi/area.py:66
-msgid "Add new image area"
-msgstr "Ajout d'une zone cliquable"
-
-#: src/pyams_content/shared/imagemap/zmi/area.py:107
-msgid "Edit image map properties"
-msgstr "Propriétés de l'image"
-
-#: src/pyams_content/shared/imagemap/zmi/properties.py:40
-msgid "Background image"
-msgstr "Image de fond"
-
-#: src/pyams_content/shared/view/interfaces/__init__.py:32
-msgid "View"
-msgstr "Vue"
-
-#: src/pyams_content/shared/view/interfaces/__init__.py:41
-msgid "Last update date"
-msgstr "Date de dernière modification"
-
-#: src/pyams_content/shared/view/interfaces/__init__.py:42
-msgid "Current publication date"
-msgstr "Date de publication de la version actuelle"
-
-#: src/pyams_content/shared/view/interfaces/__init__.py:43
-msgid "First publication date"
-msgstr "Date de première publication"
-
-#: src/pyams_content/shared/view/interfaces/__init__.py:148
-msgid "Always include selected internal references"
-msgstr "Toujours inclure toutes les références internes"
-
-#: src/pyams_content/shared/view/interfaces/__init__.py:149
-msgid "Include selected internal references only if empty"
-msgstr "Inclure les références internes seulement lorsque la vue est vide"
-
-#: src/pyams_content/shared/view/interfaces/__init__.py:60
-msgid "Select context type?"
-msgstr "Type du contexte ?"
-
-#: src/pyams_content/shared/view/interfaces/__init__.py:61
-msgid "If 'yes', content type will be extracted from context"
+msgid "since {date}"
+msgstr "depuis {date}"
+
+#: src/pyams_content/shared/common/zmi/header.py:128
+msgid "access published version"
+msgstr "accéder à la version en ligne"
+
+#: src/pyams_content/shared/common/zmi/header.py:135
+msgid "access new version"
+msgstr "accéder à la version en préparation"
+
+#: src/pyams_content/shared/common/zmi/header.py:145
+msgid "access waiting version"
+msgstr "accéder à la version en attente"
+
+#: src/pyams_content/shared/common/zmi/header.py:156
+msgid "access retired version"
+msgstr "accéder à la version retirée"
+
+#: src/pyams_content/shared/common/zmi/header.py:166
+msgid "access archived version"
+msgstr "accéder à la version archivée"
+
+#: src/pyams_content/shared/common/zmi/templates/wf-retiring-message.pt:2
+msgid ""
+"You considerate that the currently published version should no more be "
+"publicly visible."
+msgstr ""
+"Vous considérez que la version actuellement en ligne ne doit plus être "
+"consultable."
+
+#: src/pyams_content/shared/common/zmi/templates/wf-retiring-message.pt:3
+msgid ""
+"WARNING: the content will remain visible until a manager validate the "
+"request."
+msgstr ""
+"ATTENTION : ce contenu restera visible jusqu'à ce qu'un responsable prenne "
+"en charge votre demande."
+
+#: src/pyams_content/shared/common/zmi/templates/header.pt:6
+msgid "Back to previous page"
+msgstr "Revenir à la page précédente"
+
+#: src/pyams_content/shared/common/zmi/templates/header.pt:20
+msgid "by ${owner}"
+msgstr "de ${owner}"
+
+#: src/pyams_content/shared/common/zmi/templates/wf-archive-message.pt:2
+msgid "As a manager, you considerate that this content must be archived."
+msgstr ""
+"En tant que responsable, vous considérez que ce contenu doit être archivé."
+
+#: src/pyams_content/shared/common/zmi/templates/wf-archive-message.pt:3
+#: src/pyams_content/shared/common/zmi/templates/wf-archiving-message.pt:3
+msgid ""
+"After archiving, it will be backed up but you will not be able to publish it "
+"again except by creating a new version."
+msgstr ""
+"L'archivage permet de conserver une version d'un contenu dans son état "
+"actuel ; il pourra ensuite à nouveau être publié, en créant une nouvelle "
+"version."
+
+#: src/pyams_content/shared/common/zmi/templates/check-input.pt:34
+#: src/pyams_content/shared/common/zmi/templates/preview-input.pt:34
+#: src/pyams_content/shared/common/interfaces/types.py:47
+#: src/pyams_content/shared/form/zmi/field.py:160
+#: src/pyams_content/shared/form/interfaces/__init__.py:62
+#: src/pyams_content/features/menu/zmi/__init__.py:208
+msgid "Label"
+msgstr "Libellé"
+
+#: src/pyams_content/shared/common/zmi/templates/check-input.pt:39
+#: src/pyams_content/features/checker/zmi/__init__.py:43
+msgid "Audit"
+msgstr "Audit"
+
+#: src/pyams_content/shared/common/zmi/templates/dashboard.pt:29
+#: src/pyams_content/root/zmi/templates/dashboard.pt:29
+msgid "Quick search..."
+msgstr "Recherche rapide..."
+
+#: src/pyams_content/shared/common/zmi/templates/dashboard.pt:35
+#: src/pyams_content/root/zmi/templates/dashboard.pt:35
+msgid "Advanced search..."
+msgstr "Recherche avancée..."
+
+#: src/pyams_content/shared/common/zmi/templates/dashboard.pt:49
+#: src/pyams_content/root/zmi/templates/dashboard.pt:49
+msgid "You are not actually concerned by any content."
+msgstr "Vous n'êtes actuellement concerné par aucun contenu."
+
+#: src/pyams_content/shared/common/zmi/templates/wf-publish-message.pt:2
+msgid ""
+"As a manager, you considerate that this content is complete and can be "
+"published 'as is'."
+msgstr ""
+"En tant que responsable, vous considérez que ce contenu peut être publié en "
+"l'état."
+
+#: src/pyams_content/shared/common/zmi/templates/wf-publish-message.pt:4
+msgid ""
+"This operation will make the content publicly available (except if "
+"restricted access has been set)."
+msgstr ""
+"Cette opération va rendre le contenu visible de tous, sauf si des "
+"restrictions d'accès lui ont été appliquées."
+
+#: src/pyams_content/shared/common/zmi/templates/wf-create-message.pt:2
+msgid ""
+"This new content is going to be created in 'draft' mode, so that you can "
+"complete it before publication."
+msgstr ""
+"Ce nouveau contenu va être créé en statut 'Brouillon' pour vous permettre de "
+"le préparer."
+
+#: src/pyams_content/shared/common/zmi/templates/wf-create-message.pt:4
+msgid ""
+"A unique number is also going to be assigned to it. This number will be "
+"shared by all content's versions."
+msgstr ""
+"Un numéro unique va lui être attribué ; il sera permanent, quelle que soit "
+"la version."
+
+#: src/pyams_content/shared/common/zmi/templates/wf-operator-warning.pt:1
+msgid ""
+"WARNING: this request was made by a contributor which is not the owner of "
+"this content."
 msgstr ""
-"Si 'oui', seuls des contenus du même type que le contexte seront "
-"automatiquement sélectionnés"
-
-#: src/pyams_content/shared/view/interfaces/__init__.py:65
-msgid "Other content types"
-msgstr "Autres types de contenus"
-
-#: src/pyams_content/shared/view/interfaces/__init__.py:66
-msgid "Selected content types; leave empty for all"
+"ATTENTION : cette demande est formulée par un contributeur habilité qui "
+"n'est pas le propriétaire."
+
+#: src/pyams_content/shared/common/zmi/templates/wf-clone-message.pt:2
+msgid "You considerate that the currently published must evolve."
+msgstr "Vous considérez que la version actuelle de ce contenu doit évoluer."
+
+#: src/pyams_content/shared/common/zmi/templates/wf-clone-message.pt:3
+msgid ""
+"By creating a new version, you can update it's content without impacting the "
+"currently published one."
+msgstr ""
+"En créant une nouvelle version, vous pourrez apporter des modifications sans "
+"impacter la version actuelle."
+
+#: src/pyams_content/shared/common/zmi/templates/wf-clone-message.pt:5
+msgid ""
+"When the new version will be complete, you will be able to make a new "
+"publication request to replace the currently published version (which will "
+"be archived automatically)."
+msgstr ""
+"Lorsque la nouvelle version sera prête, vous demanderez sa publication (et "
+"la version actuelle sera automatiquement archivée)."
+
+#: src/pyams_content/shared/common/zmi/templates/wf-propose-message.pt:1
+msgid ""
+"This publication request is going to be transmitted to a content manager."
+msgstr "Cette demande de publication va être soumise à un responsable."
+
+#: src/pyams_content/shared/common/zmi/templates/wf-duplicate-message.pt:2
+msgid "You are going to duplicate a whole content."
+msgstr ""
+"Vous vous apprêtez à dupliquer une version de ce contenu pour en créer un "
+"nouveau."
+
+#: src/pyams_content/shared/common/zmi/templates/wf-duplicate-message.pt:3
+msgid ""
+"The new copy is going to be created in 'draft' mode, so that you can modify "
+"it before publication."
+msgstr ""
+"Cette copie va être créée en statut 'Brouillon' pour vous permettre de la "
+"préparer."
+
+#: src/pyams_content/shared/common/zmi/templates/wf-duplicate-message.pt:5
+msgid ""
+"A new unique number is also going to be assigned to it. This number will be "
+"shared by all content's versions."
 msgstr ""
-"Autres types de contenus sélectionnés ; si l'on n'extrait pas le type du "
-"contexte et si cette sélection est vide, tous les types seront pris en charge"
-
-#: src/pyams_content/shared/view/interfaces/__init__.py:73
-msgid "Order by"
-msgstr "Ordre de tri"
-
-#: src/pyams_content/shared/view/interfaces/__init__.py:74
-msgid "Property to use to sort results"
-msgstr "Propriété utilisée pour trier les résultats"
-
-#: src/pyams_content/shared/view/interfaces/__init__.py:79
-msgid "Reversed order?"
-msgstr "Ordre inverse ?"
-
-#: src/pyams_content/shared/view/interfaces/__init__.py:80
-msgid "If 'yes', items order will be reversed"
-msgstr "Si 'oui', le tri se fera en ordre descendant"
-
-#: src/pyams_content/shared/view/interfaces/__init__.py:84
-msgid "Results count limit"
-msgstr "Limite de résultats"
-
-#: src/pyams_content/shared/view/interfaces/__init__.py:85
-msgid "Maximum number of results that the view may retrieve"
-msgstr "Nombre maximal de résultats que la vue doit renvoyer"
-
-#: src/pyams_content/shared/view/interfaces/__init__.py:158
-msgid "Internal references usage"
-msgstr "Utilisation des références internes"
-
-#: src/pyams_content/shared/view/interfaces/__init__.py:159
-msgid "Specify how selected references are included into view results"
+"Un numéro unique lui sera également attribué ; ce numéro sera conservé "
+"pendant toute la vie du contenu, quelle que soit la version."
+
+#: src/pyams_content/shared/common/zmi/templates/advanced-search.pt:128
+#: src/pyams_content/root/zmi/templates/advanced-search.pt:128
+msgid "Created between"
+msgstr "Créé entre le"
+
+#: src/pyams_content/shared/common/zmi/templates/advanced-search.pt:140
+#: src/pyams_content/shared/common/zmi/templates/advanced-search.pt:166
+#: src/pyams_content/root/zmi/templates/advanced-search.pt:140
+#: src/pyams_content/root/zmi/templates/advanced-search.pt:166
+msgid "and"
+msgstr "et le"
+
+#: src/pyams_content/shared/common/zmi/templates/advanced-search.pt:154
+#: src/pyams_content/root/zmi/templates/advanced-search.pt:154
+msgid "Modified between"
+msgstr "Modifié entre le"
+
+#: src/pyams_content/shared/common/zmi/templates/advanced-search.pt:202
+#: src/pyams_content/root/zmi/templates/advanced-search.pt:202
+msgid "Tab label"
+msgstr "Libellé de l'onglet"
+
+#: src/pyams_content/shared/common/zmi/templates/wf-refuse-propose-message.pt:2
+msgid ""
+"As a content manager, you considerate that this content can't be published "
+"'as is'."
+msgstr ""
+"En tant que responsable, vous considérez que ce contenu ne peut pas être "
+"publié en l'état."
+
+#: src/pyams_content/shared/common/zmi/templates/wf-refuse-propose-message.pt:4
+msgid ""
+"The contributor will be notified of this and will be able to update the "
+"content before doing a new publication request."
+msgstr ""
+"Le contributeur qui vous a sollicité va être notifié de votre refus ; il "
+"pourra modifier ce contenu et effectuer une nouvelle demande de publication."
+
+#: src/pyams_content/shared/common/zmi/templates/wf-cancel-archiving-message.pt:1
+msgid ""
+"After cancelling this request, the content will return to it's previous "
+"retired state."
+msgstr "En annulant cette demande, ce contenu va retourner en statut 'Retiré'."
+
+#: src/pyams_content/shared/common/zmi/templates/wf-cancel-retiring-message.pt:1
+msgid ""
+"After cancelling this request, the content will return to it's normal "
+"published state."
+msgstr "En annulant cette demande, ce contenu va retourner en statut 'Publié'."
+
+#: src/pyams_content/shared/common/zmi/templates/wf-retire-message.pt:2
+msgid ""
+"As a content manager, you considerate that this content should no longer be "
+"published."
+msgstr ""
+"En tant que responsable, vous considérez que ce contenu ne doit plus être "
+"publié."
+
+#: src/pyams_content/shared/common/zmi/templates/wf-retire-message.pt:4
+msgid ""
+"Retired content won't be visible anymore, but it can be updated and "
+"published again, or archived."
+msgstr ""
+"Après ce retrait, il ne sera plus visible des internautes. Il pourra par "
+"contre être publié à nouveau, archivé, ou modifié en créant une nouvelle "
+"version."
+
+#: src/pyams_content/shared/common/zmi/templates/wf-cancel-propose-message.pt:1
+msgid ""
+"After canceling the request, you will be able to update the content again."
+msgstr "En annulant cette demande, ce contenu pourra à nouveau être modifié."
+
+#: src/pyams_content/shared/common/zmi/templates/wf-delete-message.pt:2
+msgid ""
+"This content was never published. If you confirm deletion, it won't be "
+"possible to restore it."
+msgstr ""
+"Ce contenu n'a jamais été publié. Une fois supprimé, il ne pourra pas être "
+"récupéré."
+
+#: src/pyams_content/shared/common/zmi/templates/wf-delete-message.pt:6
+msgid ""
+"The content version is going to be definitely deleted. Will only remain the "
+"currently published version."
+msgstr ""
+"Cette version va être définitivement supprimée, pour revenir à la version "
+"précédente."
+
+#: src/pyams_content/shared/common/zmi/templates/wf-owner-warning.pt:1
+msgid ""
+"RECALL: you are not the owner of the content on which you are intervening."
 msgstr ""
-"Indique comment les références internes indiquées seront intégrées à la "
-"liste des résultats"
-
-#: src/pyams_content/shared/view/interfaces/__init__.py:164
-msgid "Exclude context?"
-msgstr "Exclure le contexte ?"
-
-#: src/pyams_content/shared/view/interfaces/__init__.py:165
-msgid "If 'yes', context will be excluded from results list"
+"ATTENTION : vous intervenez sur un contenu dont vous n'êtes pas le "
+"propriétaire."
+
+#: src/pyams_content/shared/common/zmi/templates/wf-transition-info.pt:2
+msgid "FOR YOUR INFORMATION"
+msgstr "POUR VOTRE INFORMATION"
+
+#: src/pyams_content/shared/common/zmi/templates/wf-transition-info.pt:5
+msgid "Next step"
+msgstr "Étape suivante"
+
+#: src/pyams_content/shared/common/zmi/templates/wf-transition-info.pt:7
+msgid "Previous step"
+msgstr "Étape précédente"
+
+#: src/pyams_content/shared/common/zmi/templates/wf-transition-info.pt:10
+msgid "With this comment:"
+msgstr "Avec ce commentaire :"
+
+#: src/pyams_content/shared/common/zmi/templates/wf-archiving-message.pt:2
+msgid "This content is already retired and not visible."
+msgstr "Ce contenu est déjà retiré et n'est plus visible des internautes."
+
+#: src/pyams_content/shared/common/portlet/content/__init__.py:44
+msgid "Context content"
+msgstr "Contenu partagé"
+
+#: src/pyams_content/shared/common/portlet/content/zmi/preview.pt:2
+msgid "This is where the content will be displayed!!"
+msgstr "C'est ici que seront affichés les éléments du contenu."
+
+#: src/pyams_content/shared/common/portlet/content/skin/__init__.py:36
+msgid "Default content renderer"
+msgstr "Par défaut"
+
+#: src/pyams_content/shared/common/interfaces/types.py:43
+#: src/pyams_content/shared/form/zmi/field.py:149
+msgid "Name"
+msgstr "Nom"
+
+#: src/pyams_content/shared/common/interfaces/types.py:44
+msgid "Name of this data type; must be unique between all data types"
+msgstr "Nom de ce type de donnée ; doit être unique entre tous les types"
+
+#: src/pyams_content/shared/common/interfaces/types.py:50
+msgid "Navigation label"
+msgstr "Libellé de navigation"
+
+#: src/pyams_content/shared/common/interfaces/types.py:51
+msgid "Label used for navigation entries"
+msgstr "Libellé utilisé pour les entrées de navigation"
+
+#: src/pyams_content/shared/common/interfaces/types.py:54
+msgid "Tab-folder label"
+msgstr "Libellé d'un l'onglet"
+
+#: src/pyams_content/shared/common/interfaces/types.py:55
+msgid "Label used to include into tab folder"
+msgstr "Libellé utilisé pour l'affichage du type sous la forme d'un onglet"
+
+#: src/pyams_content/shared/common/interfaces/types.py:58
+msgid "'See also' label"
+msgstr "Libellé 'À voir aussi'"
+
+#: src/pyams_content/shared/common/interfaces/types.py:59
+msgid ""
+"This label can be used when contents of this type will be displayed in a "
+"'See also' entries block"
 msgstr ""
-"Si 'oui', le contexte d'application de la vue sera automatiquement exclus de "
-"la liste des résultats"
-
-#: src/pyams_content/shared/view/interfaces/__init__.py:176
-msgid "Select context themes?"
-msgstr "Thèmes du contexte ?"
-
-#: src/pyams_content/shared/view/interfaces/__init__.py:177
-msgid "If 'yes', themes will be extracted from context"
+"Ce libellé peut être utilisé lorsque des contenus de ce type sont affichés "
+"sous la forme d'un bloc 'À voir aussi'"
+
+#: src/pyams_content/shared/common/interfaces/types.py:63
+msgid "'Single value' label"
+msgstr "Libellé 'Valeur unique'"
+
+#: src/pyams_content/shared/common/interfaces/types.py:64
+msgid "Label given to this type when a single value is displayed"
+msgstr "Libellé utilisé pour ce type lorsqu'une seule valeur est affichée"
+
+#: src/pyams_content/shared/common/interfaces/types.py:67
+msgid "'Link to list' label"
+msgstr "Libellé 'Lien vers une liste'"
+
+#: src/pyams_content/shared/common/interfaces/types.py:68
+msgid "Label used to display a link to a list of items of this type"
+msgstr ""
+"Libellé utilisé lorsque l'on crée un lien vers uns liste de contenus de ce "
+"type"
+
+#: src/pyams_content/shared/common/interfaces/types.py:71
+msgid "Next content label"
+msgstr "Libellé du contenu suivant"
+
+#: src/pyams_content/shared/common/interfaces/types.py:72
+msgid "Label used to announce next date for this type"
+msgstr ""
+"Libellé utilisé pour afficher la prochaine date d'un événement pour ce type"
+
+#: src/pyams_content/shared/common/interfaces/types.py:76
+msgid "Pictogram associated with this data type"
+msgstr "Pictogramme associé à ce type"
+
+#: src/pyams_content/shared/common/interfaces/types.py:90
+msgid "Field names"
+msgstr "Champs associés"
+
+#: src/pyams_content/shared/common/interfaces/types.py:91
+msgid "List of fields associated with this data type"
+msgstr "Liste des champs de saisie associés à ce type"
+
+#: src/pyams_content/shared/common/interfaces/types.py:125
+msgid "Data type"
+msgstr "Type du contenu"
+
+#: src/pyams_content/shared/common/interfaces/types.py:126
+msgid "Type of content data"
+msgstr "Type du contenu associé à ce gabarit"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:46
+#: src/pyams_content/root/interfaces/__init__.py:43
+msgid "Webmasters"
+msgstr "Webmestres"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:47
+msgid "Webmasters can handle all contents, including published ones"
+msgstr ""
+"Les webmestres peuvent modifier et gérer tous les contenus, y compris ceux "
+"qui sont publiés et hormis ceux qui sont archivés"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:51
+msgid "Pilots"
+msgstr "Pilotes"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:52
+msgid ""
+"Pilots can handle tool configuration, manage access rules, grant users roles "
+"and manage managers restrictions"
+msgstr ""
+"Les pilotes gèrent la configuration des outils, désignent les responsables "
+"et les contributeurs, et limitent si nécessaire l'intervention des "
+"responsables à certains contenus"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:57
+#: src/pyams_content/shared/common/interfaces/__init__.py:191
+msgid "Managers"
+msgstr "Responsables"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:58
+#: src/pyams_content/shared/common/interfaces/__init__.py:192
+msgid ""
+"Managers can handle main operations in tool's workflow, like publish or "
+"retire contents"
 msgstr ""
-"Si 'oui', les thèmes associés au contexte d'application de la vue seront "
-"automatiquement sélectionnés"
-
-#: src/pyams_content/shared/view/interfaces/__init__.py:181
-msgid "Other terms"
-msgstr "Autres thèmes"
-
-#: src/pyams_content/shared/view/zmi/theme.py:59
-msgid "View themes settings"
-msgstr "Paramétrage des thèmes de la vue"
-
-#: src/pyams_content/shared/view/zmi/__init__.py:44
-msgid "This view"
-msgstr "Cette vue"
-
-#: src/pyams_content/shared/view/zmi/__init__.py:63
-#: src/pyams_content/shared/view/zmi/__init__.py:73
-msgid "Add view"
-msgstr "Ajouter une vue"
-
-#: src/pyams_content/shared/view/zmi/__init__.py:54
-#, python-format
-msgid "View « {title} »"
-msgstr "Vue « {title} »"
-
-#: src/pyams_content/shared/view/zmi/properties.py:40
-msgid "Main view settings"
-msgstr "Paramètres de la vue"
-
-#: src/pyams_content/shared/view/zmi/reference.py:52
-msgid "References..."
-msgstr "Références"
-
-#: src/pyams_content/shared/view/zmi/reference.py:63
-msgid "View internal references settings"
-msgstr "Références internes de la vue"
-
-#: src/pyams_content/shared/view/portlet/interfaces.py:31
-msgid "Selected view"
-msgstr "Vue sélectionnée"
-
-#: src/pyams_content/shared/view/portlet/interfaces.py:32
-msgid "Reference to the view from which items are extracted"
-msgstr "Référence de la vue depuis laquelle est extraite la liste de contenus"
-
-#: src/pyams_content/shared/view/portlet/__init__.py:58
-msgid "View items"
-msgstr "Contenu d'une vue"
-
-#: src/pyams_content/shared/form/field.py:137
-msgid "Text"
-msgstr "Texte simple"
-
-#: src/pyams_content/shared/form/field.py:147
-msgid "Multi-lines text"
-msgstr "Texte multi-lignes"
-
-#: src/pyams_content/shared/form/field.py:157
-msgid "Boolean"
-msgstr "Booléen"
-
-#: src/pyams_content/shared/form/field.py:167
-msgid "Integer"
-msgstr "Nombre entier"
-
-#: src/pyams_content/shared/form/field.py:177
-msgid "Decimal"
-msgstr "Nombre décimal"
-
-#: src/pyams_content/shared/form/field.py:187
-msgid "E-mail address"
-msgstr "Adresse de messagerie"
-
-#: src/pyams_content/shared/form/field.py:197
-msgid "URI"
-msgstr "URI"
-
-#: src/pyams_content/shared/form/field.py:207
-msgid "Date"
-msgstr "Date"
-
-#: src/pyams_content/shared/form/field.py:221
-msgid "Choice"
-msgstr "Choix unique dans une liste"
-
-#: src/pyams_content/shared/form/field.py:241
-msgid "List"
-msgstr "Choix multiples dans une liste"
+"Les responsables peuvent intervenir sur les étapes importantes du workflow "
+"(comme la publication ou le retrait des contenus), dans la limite des "
+"restrictions qui leur sont imposées"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:63
+#: src/pyams_content/shared/common/interfaces/__init__.py:197
+msgid "Contributors"
+msgstr "Contributeurs"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:64
+msgid "Contributors are users which are allowed to create new contents"
+msgstr "Les contributeurs sont autorisés à créer de nouveaux contenus"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:68
+#: src/pyams_content/shared/common/interfaces/__init__.py:203
+msgid "Designers"
+msgstr "Designers"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:69
+#: src/pyams_content/shared/common/interfaces/__init__.py:204
+msgid "Designers are users which are allowed to manage presentation templates"
+msgstr "Les designers sont autorisés à configurer les modèles de présentation"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:95
+msgid "Workflow name"
+msgstr "Nom du workflow"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:96
+msgid "Name of workflow utility used to manage tool contents"
+msgstr "Nom du workflow qui gère le cycle de vie des contenus de cet outil"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:124
+msgid "Content URL"
+msgstr "URL du contenu"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:125
+msgid ""
+"URL used to access this content; this is important for SEO and should "
+"include most important words describing content; spaces and underscores will "
+"be automatically replaced by hyphens"
+msgstr ""
+"<span>Texte utilisé dans l'URL d'accès au contenu ; cette information est "
+"importante pour le référencement : il faut utiliser des mots essentiels pour "
+"décrire ce contenu.</span><br /><strong>Remarque :</strong> le texte saisi "
+"est converti automatiquement en minuscules, les espaces et traits de "
+"soulignement (« underscores ») sont remplacés automatiquement par des traits "
+"d'union, les lettres accentuées par leur équivalent sans accent, et les mots "
+"de moins de trois lettres sont supprimés."
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:130
+msgid "Version creator"
+msgstr "À l'origine de cette version"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:131
+msgid ""
+"Name of content's version creator. The creator of the first version is also "
+"it's owner."
+msgstr ""
+"Nom du créateur de cette version. Le créateur de la première version d'un "
+"contenu est aussi son propriétaire."
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:135
+msgid "First owner"
+msgstr "Premier propriétaire"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:136
+msgid "Name of content's first version owner"
+msgstr "Nom de l'utilisateur ayant créé la première version"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:140
+msgid "Version creation"
+msgstr "Date de création"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:143
+msgid "Version modifiers"
+msgstr "Intervenants"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:144
+msgid "List of principals who modified this content"
+msgstr "Liste des utilisateurs qui sont intervenus sur cette version"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:147
+msgid "Last modifier"
+msgstr "Dernier intervenant"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:148
+msgid "Last principal who modified this content"
+msgstr "Dernier utilisateur étant intervenu sur ce contenu"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:151
+msgid "Last update"
+msgstr "Dernière modification"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:155
+msgid ""
+"The content's description is 'hidden' into HTML's page headers; but it can "
+"be seen, for example, in some search engines results as content's description"
+msgstr ""
+"La description du contenu est 'masquée' dans les en-têtes des pages HTML ; "
+"mais on peut la retrouver, par exemple, dans les listes de résultats des "
+"moteurs de recherche"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:160
+msgid "Keywords"
+msgstr "Mots-clés"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:161
+msgid "They will be included into HTML pages metadata"
+msgstr "Ces mots-clés seront intégrés dans les métadonnées des pages HTML"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:164
+#: src/pyams_content/shared/site/zmi/folder.py:78
+#: src/pyams_content/shared/site/interfaces/__init__.py:67
+msgid "Notepad"
+msgstr "Bloc-notes"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:165
+#: src/pyams_content/shared/site/zmi/folder.py:79
+#: src/pyams_content/shared/site/interfaces/__init__.py:68
+msgid "Internal information to be known about this content"
+msgstr ""
+"Pour prendre note d'informations internes utiles ou importantes à propos de "
+"ce contenu ; ces notes ne seront pas publiées sur internet."
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:184
+msgid "Content owner"
+msgstr "Propriétaire"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:185
+msgid ""
+"The owner is the creator of content's first version, except if it was "
+"transferred afterwards to another owner"
+msgstr ""
+"Le propriétaire est le créateur de la première version d'un contenu, sauf "
+"lorsque cette propriété a été transférée à un autre utilisateur après coup. "
+"Les contenus archivés ne sont plus transférables."
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:198
+msgid ""
+"Contributors are users which are allowed to update this content in addition "
+"to it's owner"
+msgstr ""
+"Les contributeurs sont autorisés, en plus du propriétaire, à modifier ce "
+"contenu"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:208
+msgid "Readers"
+msgstr "Relecteurs"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:209
+msgid ""
+"Readers are users which are asked to verify and comment contents before they "
+"are published"
+msgstr ""
+"Les relecteurs sont des utilisateurs qui sont sollicités pour vérifier et "
+"commenter un contenu avant sa publication"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:214
+msgid "Guests"
+msgstr "Invités"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:215
+msgid ""
+"Guests are users which are allowed to view contents with restricted access"
+msgstr ""
+"Les invités sont autorisés à consulter des contenus dont l'accès a été "
+"restreint"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:235
+msgid "Principal ID"
+msgstr "ID utilisateur"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:274
+#: src/pyams_content/shared/common/interfaces/__init__.py:299
+msgid "Publication checks"
+msgstr "Activer le tunnel de publication"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:275
+msgid ""
+"If 'yes', this contributor will have to confirm that contents have been "
+"previewed and checked before asking for publication"
+msgstr ""
+"Si 'oui', ce contributeur devra confirmer qu'il a bien prévisualisé et "
+"audité chaque contenu avant de pouvoir effectuer une demande de publication"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:300
+msgid ""
+"If 'yes', this manager will have to confirm that contents have been "
+"previewed and checked before publishing a content"
+msgstr ""
+"Si 'oui', ce responsable devra confirmer qu'il a bien prévisualisé et audité "
+"chaque contenu avant de pouvoir effectuer une publication"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:305
+msgid "Restricted contents"
+msgstr "Accès restreints"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:306
+msgid ""
+"If 'yes', this manager will get restricted access to manage contents based "
+"on selected settings"
+msgstr ""
+"Si 'oui', ce responsable n'aura qu'un accès restreint à certains contenus en "
+"fonction de paramètres spécifiques"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:311
+msgid "Selected owners"
+msgstr "Propriétaires"
+
+#: src/pyams_content/shared/common/interfaces/__init__.py:312
+msgid "Manager will have access to contents owned by these principals"
+msgstr ""
+"Le responsable n'aura accès qu'aux contenus dont ces utilisateurs sont "
+"propriétaires"
 
 #: src/pyams_content/shared/form/__init__.py:99
 msgid "Form fields"
@@ -2820,6 +3323,102 @@
 msgid "No selected handler..."
 msgstr "Aucun gestionnaire sélectionné"
 
+#: src/pyams_content/shared/form/field.py:146
+msgid "Text"
+msgstr "Texte simple"
+
+#: src/pyams_content/shared/form/field.py:156
+msgid "Multi-lines text"
+msgstr "Texte multi-lignes"
+
+#: src/pyams_content/shared/form/field.py:166
+msgid "Boolean"
+msgstr "Booléen"
+
+#: src/pyams_content/shared/form/field.py:176
+msgid "Integer"
+msgstr "Nombre entier"
+
+#: src/pyams_content/shared/form/field.py:186
+msgid "Decimal"
+msgstr "Nombre décimal"
+
+#: src/pyams_content/shared/form/field.py:196
+msgid "E-mail address"
+msgstr "Adresse de messagerie"
+
+#: src/pyams_content/shared/form/field.py:206
+msgid "URI"
+msgstr "URI"
+
+#: src/pyams_content/shared/form/field.py:216
+msgid "Date"
+msgstr "Date"
+
+#: src/pyams_content/shared/form/field.py:230
+msgid "Choice"
+msgstr "Choix unique dans une liste"
+
+#: src/pyams_content/shared/form/field.py:250
+msgid "List"
+msgstr "Choix multiples dans une liste"
+
+#: src/pyams_content/shared/form/zmi/properties.py:41
+msgid "Main form settings"
+msgstr "Paramètres du formulaire"
+
+#: src/pyams_content/shared/form/zmi/properties.py:65
+msgid "Form handler settings"
+msgstr "Paramètres du gestionnaire"
+
+#: src/pyams_content/shared/form/zmi/__init__.py:44
+msgid "This form"
+msgstr "Ce formulaire"
+
+#: src/pyams_content/shared/form/zmi/__init__.py:63
+#: src/pyams_content/shared/form/zmi/__init__.py:74
+msgid "Add form"
+msgstr "Ajouter un formulaire"
+
+#: src/pyams_content/shared/form/zmi/__init__.py:54
+#, python-format
+msgid "Form « {title} »"
+msgstr "Formulaire « {title} »"
+
+#: src/pyams_content/shared/form/zmi/field.py:69
+msgid "Form fields..."
+msgstr "Champs de saisie"
+
+#: src/pyams_content/shared/form/zmi/field.py:171
+#: src/pyams_content/shared/form/interfaces/__init__.py:57
+msgid "Field type"
+msgstr "Type de champ"
+
+#: src/pyams_content/shared/form/zmi/field.py:204
+msgid "Form fields list"
+msgstr "Liste des champs du formulaire"
+
+#: src/pyams_content/shared/form/zmi/field.py:227
+#: src/pyams_content/shared/form/zmi/field.py:240
+msgid "Add form field"
+msgstr "Ajouter un champ"
+
+#: src/pyams_content/shared/form/zmi/field.py:278
+msgid "Edit form field properties"
+msgstr "Propriétés du champ"
+
+#: src/pyams_content/shared/form/zmi/field.py:180
+msgid "-- unknown field type --"
+msgstr "-- type de champ inconnu --"
+
+#: src/pyams_content/shared/form/zmi/field.py:115
+msgid "No currently defined form field."
+msgstr "Ce formulaire ne comporte aucun champ."
+
+#: src/pyams_content/shared/form/zmi/field.py:262
+msgid "Specified name is already used!"
+msgstr "Le nom indiqué pour ce champ est déjà utilisé !"
+
 #: src/pyams_content/shared/form/interfaces/__init__.py:35
 msgid "Form"
 msgstr "Formulaire"
@@ -2833,11 +3432,6 @@
 msgstr ""
 "Nom interne du champ ; ce nom doit être unique pour un formulaire donné"
 
-#: src/pyams_content/shared/form/interfaces/__init__.py:57
-#: src/pyams_content/shared/form/zmi/field.py:170
-msgid "Field type"
-msgstr "Type de champ"
-
 #: src/pyams_content/shared/form/interfaces/__init__.py:58
 msgid "Selected field type"
 msgstr "Type de champ proposé à l'internaute"
@@ -2971,66 +3565,6 @@
 msgid "Name of data recipient"
 msgstr "Nom du destinataire des messages"
 
-#: src/pyams_content/shared/form/zmi/field.py:68
-msgid "Form fields..."
-msgstr "Champs de saisie"
-
-#: src/pyams_content/shared/form/zmi/field.py:148
-#: src/pyams_content/shared/common/interfaces/types.py:36
-msgid "Name"
-msgstr "Nom"
-
-#: src/pyams_content/shared/form/zmi/field.py:203
-msgid "Form fields list"
-msgstr "Liste des champs du formulaire"
-
-#: src/pyams_content/shared/form/zmi/field.py:226
-#: src/pyams_content/shared/form/zmi/field.py:239
-msgid "Add form field"
-msgstr "Ajouter un champ"
-
-#: src/pyams_content/shared/form/zmi/field.py:281
-msgid "Edit form field properties"
-msgstr "Propriétés du champ"
-
-#: src/pyams_content/shared/form/zmi/field.py:179
-msgid "-- unknown field type --"
-msgstr "-- type de champ inconnu --"
-
-#: src/pyams_content/shared/form/zmi/field.py:114
-msgid "No currently defined form field."
-msgstr "Ce formulaire ne comporte aucun champ."
-
-#: src/pyams_content/shared/form/zmi/field.py:266
-msgid "Specified name is already used!"
-msgstr "Le nom indiqué pour ce champ est déjà utilisé !"
-
-#: src/pyams_content/shared/form/zmi/__init__.py:44
-msgid "This form"
-msgstr "Ce formulaire"
-
-#: src/pyams_content/shared/form/zmi/__init__.py:63
-#: src/pyams_content/shared/form/zmi/__init__.py:74
-msgid "Add form"
-msgstr "Ajouter un formulaire"
-
-#: src/pyams_content/shared/form/zmi/__init__.py:54
-#, python-format
-msgid "Form « {title} »"
-msgstr "Formulaire « {title} »"
-
-#: src/pyams_content/shared/form/zmi/properties.py:41
-msgid "Main form settings"
-msgstr "Paramètres du formulaire"
-
-#: src/pyams_content/shared/form/zmi/properties.py:70
-msgid "Form handler settings"
-msgstr "Paramètres du gestionnaire"
-
-#: src/pyams_content/shared/news/interfaces/__init__.py:29
-msgid "News topic"
-msgstr "Actualité"
-
 #: src/pyams_content/shared/news/zmi/__init__.py:44
 msgid "This news topic"
 msgstr "Cette actualité"
@@ -3045,56 +3579,673 @@
 msgid "News topic « {title} »"
 msgstr "Actualité « {title} »"
 
-#: src/pyams_content/shared/logo/paragraph.py:95
+#: src/pyams_content/shared/news/interfaces/__init__.py:29
+msgid "News topic"
+msgstr "Actualité"
+
+#: src/pyams_content/shared/view/merge.py:59
+msgid "Concatenate views items in order"
+msgstr "Concaténer les résultats de chaque vue dans l'ordre sélectionné"
+
+#: src/pyams_content/shared/view/merge.py:71
+msgid "Extract items randomly"
+msgstr "Extraire les résultats en ordre aléatoire"
+
+#: src/pyams_content/shared/view/merge.py:85
+msgid "Take items from views one by one, in views order"
+msgstr ""
+"Extraire les résultats de chaque vue, une par une (ordre des vues imposé)"
+
+#: src/pyams_content/shared/view/merge.py:98
+msgid "Take items from views one by one, in random order"
+msgstr ""
+"Extraire les résultats de chaque vue, une par une (ordre des vues aléatoire)"
+
+#: src/pyams_content/shared/view/merge.py:127
+msgid "Sort all results by creation date"
+msgstr ""
+"Trier tous les résultats sur la date de création (du plus récent au plus "
+"ancien)"
+
+#: src/pyams_content/shared/view/merge.py:136
+msgid "Sort all results by last update date"
+msgstr ""
+"Trier tous les résultats sur la date de dernière mise à jour (du plus récent "
+"au plus ancien)"
+
+#: src/pyams_content/shared/view/merge.py:145
+msgid "Sort all results by current publication date"
+msgstr ""
+"Trier tous les résultats sur la date de publication (du plus récent au plus "
+"ancien)"
+
+#: src/pyams_content/shared/view/merge.py:154
+msgid "Sort all results by first publication date"
+msgstr ""
+"Trier tous les résultats sur la date de première publication (du plus récent "
+"au plus ancien)"
+
+#: src/pyams_content/shared/view/zmi/properties.py:40
+msgid "Main view settings"
+msgstr "Paramètres de la vue"
+
+#: src/pyams_content/shared/view/zmi/__init__.py:44
+msgid "This view"
+msgstr "Cette vue"
+
+#: src/pyams_content/shared/view/zmi/__init__.py:63
+#: src/pyams_content/shared/view/zmi/__init__.py:73
+msgid "Add view"
+msgstr "Ajouter une vue"
+
+#: src/pyams_content/shared/view/zmi/__init__.py:54
+#, python-format
+msgid "View « {title} »"
+msgstr "Vue « {title} »"
+
+#: src/pyams_content/shared/view/zmi/theme.py:67
+msgid "View tags settings"
+msgstr "Paramétrage des tags de la vue"
+
+#: src/pyams_content/shared/view/zmi/theme.py:113
+msgid "View themes settings"
+msgstr "Paramétrage des thèmes de la vue"
+
+#: src/pyams_content/shared/view/zmi/theme.py:159
+msgid "View collections settings"
+msgstr "Paramétrage des collections de la vue"
+
+#: src/pyams_content/shared/view/zmi/reference.py:52
+msgid "References..."
+msgstr "Références"
+
+#: src/pyams_content/shared/view/zmi/reference.py:63
+msgid "View internal references settings"
+msgstr "Références internes de la vue"
+
+#: src/pyams_content/shared/view/portlet/__init__.py:89
+msgid "View items"
+msgstr "Contenu d'une vue"
+
+#: src/pyams_content/shared/view/portlet/interfaces.py:41
+msgid "Display context"
+msgstr "Contexte d'affichage"
+
+#: src/pyams_content/shared/view/portlet/interfaces.py:42
+msgid "Content context"
+msgstr "Contexte du contenu"
+
+#: src/pyams_content/shared/view/portlet/interfaces.py:59
+msgid "Selected views"
+msgstr "Vue(s) sélectionnée(s)"
+
+#: src/pyams_content/shared/view/portlet/interfaces.py:60
+msgid ""
+"Reference to the view(s) from which items are extracted; you can combine "
+"several views together and specify in which order they should be mixed"
+msgstr ""
+"Références des vues dont sont extraits les résultats ; vous pouvez combiner "
+"plusieurs vues ensemble en indiquant la façon dont leurs résultats seront "
+"fusionnés"
+
+#: src/pyams_content/shared/view/portlet/interfaces.py:69
+msgid "Views context"
+msgstr "Contexte des vues"
+
+#: src/pyams_content/shared/view/portlet/interfaces.py:70
+msgid ""
+"When searching for items, a view receives a \"context\" which is the object "
+"from which settings can be extracted; this context can be the \"display\" "
+"context or the \"content\" context: when the portlet is used to display the "
+"site root, a site manager or a site folder, both are identical; when the "
+"portlet is used to display a shared content, the \"content\" context is the "
+"displayed content, while the \"display\" context is the container (site "
+"root, site manager or site folder) into which content is displayed"
+msgstr ""
+"Pour extraire sa liste de résultats, chaque vue est associée à un \"contexte"
+"\", qui est l'objet dont sont extraits les critères de recherche ; ce "
+"contexte peut être le contexte \"d'affichage\" ou le contexte \"du contenu"
+"\" : lorsque ce composant est associé à la page d'accueil, à un site ou à "
+"une rubrique, ces deux contextes sont identiques ; par contre, lorsque ce "
+"composant est associé à un contenu partagé, le contexte de contenu est le "
+"contenu partagé, tandis que le contexte d'affichage est le conteneur (page "
+"d'accueil, site ou rubrique) au sein duquel le contenu est affiché."
+
+#: src/pyams_content/shared/view/portlet/interfaces.py:81
+msgid "Views merge mode"
+msgstr "Mode de fusion des vues"
+
+#: src/pyams_content/shared/view/portlet/interfaces.py:82
+msgid ""
+"If you select several views, you can select \"merge\" mode, which is the way "
+"used to merge items from several views"
+msgstr ""
+"Si vous sélectionnez plusieurs vues, vous devez indiquer la façon dont leurs "
+"résultats seront fusionnés; ce paramètre est sans effet lorsque vous ne "
+"sélectionnez qu'une seule vue, car l'ordre des résultats est alors basé "
+"uniquement sur les paramètres de la vue."
+
+#: src/pyams_content/shared/view/portlet/interfaces.py:91
+#: src/pyams_content/shared/view/interfaces/__init__.py:86
+msgid "Results count limit"
+msgstr "Limite de résultats"
+
+#: src/pyams_content/shared/view/portlet/interfaces.py:92
+msgid ""
+"Maximum number of results that the component may extract from merged views"
+msgstr ""
+"Nombre maximal de résultats que le composant doit extraire des vues "
+"fusionnées"
+
+#: src/pyams_content/shared/view/portlet/zmi/templates/view-items-list-preview.pt:14
+msgid "No result found"
+msgstr "Aucun résultat à afficher."
+
+#: src/pyams_content/shared/view/portlet/zmi/templates/view-items-list-preview.pt:15
+msgid "No selected view"
+msgstr "Aucune vue sélectionnée."
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:32
+msgid "View"
+msgstr "Vue"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:150
+msgid "Always include selected internal references"
+msgstr "Toujours inclure toutes les références internes"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:151
+msgid "Include selected internal references only if empty"
+msgstr "Inclure les références internes seulement lorsque la vue est vide"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:41
+#: src/pyams_content/interfaces/__init__.py:113
+#: src/pyams_content/features/review/interfaces.py:74
+msgid "Creation date"
+msgstr "Date de création"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:42
+msgid "Last update date"
+msgstr "Date de dernière modification"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:43
+msgid "Current publication date"
+msgstr "Date de publication de la version actuelle"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:44
+msgid "First publication date"
+msgstr "Date de première publication"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:62
+msgid "Select context type?"
+msgstr "Type du contexte ?"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:63
+msgid "If 'yes', content type will be extracted from context"
+msgstr ""
+"Si 'oui', seuls des contenus du même type que le contexte seront "
+"automatiquement sélectionnés"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:67
+msgid "Other content types"
+msgstr "Autres types de contenus"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:68
+msgid "Selected content types; leave empty for all"
+msgstr ""
+"Autres types de contenus sélectionnés ; si l'on n'extrait pas le type du "
+"contexte et si cette sélection est vide, tous les types seront pris en charge"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:75
+msgid "Order by"
+msgstr "Ordre de tri"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:76
+msgid "Property to use to sort results"
+msgstr ""
+"Propriété utilisée pour trier les résultats ; par défaut, le tri se fait en "
+"ordre inverse, donc du plus récent au plus ancien"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:81
+msgid "Reversed order?"
+msgstr "Ordre inverse ?"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:82
+msgid "If 'yes', items order will be reversed"
+msgstr ""
+"Si 'non', le tri se fera en ordre \"naturel\", donc du plus ancien au plus "
+"récent"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:87
+msgid "Maximum number of results that the view may retrieve"
+msgstr "Nombre maximal de résultats que la vue doit renvoyer"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:160
+msgid "Internal references usage"
+msgstr "Utilisation des références internes"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:161
+msgid "Specify how selected references are included into view results"
+msgstr ""
+"Indique comment les références internes indiquées seront intégrées à la "
+"liste des résultats"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:166
+msgid "Exclude context?"
+msgstr "Exclure le contexte ?"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:167
+msgid "If 'yes', context will be excluded from results list"
+msgstr ""
+"Si 'oui', le contexte d'application de la vue sera automatiquement exclus de "
+"la liste des résultats"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:178
+msgid "Select context tags?"
+msgstr "Tags du contexte ?"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:179
+msgid "If 'yes', tags will be extracted from context"
+msgstr ""
+"Si 'oui', les tags associés au contexte d'application de la vue seront "
+"automatiquement sélectionnés"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:183
+msgid "Other tags"
+msgstr "Autres tags"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:199
+msgid "Select context themes?"
+msgstr "Thèmes du contexte ?"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:200
+msgid "If 'yes', themes will be extracted from context"
+msgstr ""
+"Si 'oui', les thèmes associés au contexte d'application de la vue seront "
+"automatiquement sélectionnés"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:204
+msgid "Other themes"
+msgstr "Autres thèmes"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:220
+msgid "Select context collections?"
+msgstr "Collections du contexte ?"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:221
+msgid "If 'yes', collections will be extracted from context"
+msgstr ""
+"Si 'oui', les collections associées au contexte d'application de la vue "
+"seront automatiquement sélectionnés"
+
+#: src/pyams_content/shared/view/interfaces/__init__.py:225
+msgid "Other collections"
+msgstr "Autres collections"
+
+#: src/pyams_content/shared/imagemap/paragraph.py:99
+msgid "no selected image map"
+msgstr "aucune image cliquable sélectionnée"
+
+#: src/pyams_content/shared/imagemap/paragraph.py:105
+#, python-format
+msgid "image map '{0}' can't be found"
+msgstr "l'image cliquable '{0}' est introuvable"
+
+#: src/pyams_content/shared/imagemap/paragraph.py:113
+#, python-format
+msgid "image map '{0}' is not published"
+msgstr "l'image cliquable '{0}' n'est pas publiée"
+
+#: src/pyams_content/shared/imagemap/__init__.py:154
+msgid "no area defined"
+msgstr "aucune zone définie"
+
+#: src/pyams_content/shared/imagemap/zmi/paragraph.py:55
+msgid "Image map..."
+msgstr "Image cliquable"
+
+#: src/pyams_content/shared/imagemap/zmi/paragraph.py:68
+msgid "Add new image map"
+msgstr "Ajout d'une image cliquable"
+
+#: src/pyams_content/shared/imagemap/zmi/paragraph.py:95
+#: src/pyams_content/shared/logo/zmi/paragraph.py:94
+msgid "Edit paragraph properties"
+msgstr "Propriétés de l'image cliquable"
+
+#: src/pyams_content/shared/imagemap/zmi/properties.py:40
+msgid "Background image"
+msgstr "Image de fond"
+
+#: src/pyams_content/shared/imagemap/zmi/__init__.py:44
+msgid "This image map"
+msgstr "Cette image"
+
+#: src/pyams_content/shared/imagemap/zmi/__init__.py:63
+msgid "Add image map"
+msgstr "Ajouter une image"
+
+#: src/pyams_content/shared/imagemap/zmi/__init__.py:73
+msgid "Adding image map"
+msgstr "Ajout d'une image"
+
+#: src/pyams_content/shared/imagemap/zmi/__init__.py:54
+#, python-format
+msgid "Image map « {title} »"
+msgstr "Article de blog « {title} »"
+
+#: src/pyams_content/shared/imagemap/zmi/container.py:54
+msgid "Image areas"
+msgstr "Zones de l'image"
+
+#: src/pyams_content/shared/imagemap/zmi/container.py:65
+#: src/pyams_content/shared/imagemap/interfaces/__init__.py:71
+msgid "Image map areas"
+msgstr "Zones cliquables de l'images"
+
+#: src/pyams_content/shared/imagemap/zmi/container.py:140
+#: src/pyams_content/shared/imagemap/interfaces/__init__.py:50
+msgid "Link target"
+msgstr "Cible du lien"
+
+#: src/pyams_content/shared/imagemap/zmi/container.py:113
+msgid "No currently defined image."
+msgstr "Aucun image de fond n'est actuellement définie."
+
+#: src/pyams_content/shared/imagemap/zmi/container.py:115
+msgid "No currently defined area."
+msgstr "Aucune zone cliquable n'est actuellement définie."
+
+#: src/pyams_content/shared/imagemap/zmi/container.py:175
+#: src/pyams_content/root/zmi/sites.py:170
+msgid "No provided object_name argument!"
+msgstr "Argument 'object_name' non fourni !"
+
+#: src/pyams_content/shared/imagemap/zmi/container.py:194
+msgid "Given area name doesn't exist!"
+msgstr "La zone indiquée n'existe pas !"
+
+#: src/pyams_content/shared/imagemap/zmi/container.py:186
+msgid "Bad query object_name parameter value!"
+msgstr "Valeur incorrecte du paramètre object_name !"
+
+#: src/pyams_content/shared/imagemap/zmi/area.py:47
+msgid "Add image area"
+msgstr "Ajouter une zone"
+
+#: src/pyams_content/shared/imagemap/zmi/area.py:66
+msgid "Add new image area"
+msgstr "Ajout d'une zone cliquable"
+
+#: src/pyams_content/shared/imagemap/zmi/area.py:107
+msgid "Edit image map properties"
+msgstr "Propriétés de l'image"
+
+#: src/pyams_content/shared/imagemap/interfaces/__init__.py:36
+#: src/pyams_content/shared/imagemap/interfaces/__init__.py:89
+msgid "Image map"
+msgstr "Image cliquable"
+
+#: src/pyams_content/shared/imagemap/interfaces/__init__.py:51
+msgid "Internal or external link associated with this map area"
+msgstr "Lien interne ou externe associé à cette zone"
+
+#: src/pyams_content/shared/imagemap/interfaces/__init__.py:56
+msgid "Alternate label associated with this area"
+msgstr "Libellé de substitution associé à cette zone"
+
+#: src/pyams_content/shared/imagemap/interfaces/__init__.py:59
+msgid "Map area coordinates"
+msgstr "Coordonnées"
+
+#: src/pyams_content/shared/imagemap/interfaces/__init__.py:60
+msgid "List of coordinates of image area"
+msgstr "Positionnement de la zone cliquable sur l'image"
+
+#: src/pyams_content/shared/imagemap/interfaces/__init__.py:68
+msgid "Image supporting map areas"
+msgstr "Sélection de l'image qui supportera les zones cliquables"
+
+#: src/pyams_content/shared/imagemap/interfaces/__init__.py:72
+msgid "List of defined map areas"
+msgstr "Liste des zones cliquables définies sur l'image"
+
+#: src/pyams_content/shared/imagemap/interfaces/__init__.py:96
+#: src/pyams_content/features/alert/interfaces.py:73
+#: src/pyams_content/features/menu/interfaces/__init__.py:68
+msgid "Internal reference"
+msgstr "Référence interne"
+
+#: src/pyams_content/shared/imagemap/interfaces/__init__.py:97
+msgid "Reference to image map object"
+msgstr ""
+"Référence interne de l'image cliquable. Vous pouvez la rechercher par des "
+"mots de son titre, ou par son numéro interne (précédé d'un '+')."
+
+#: src/pyams_content/shared/imagemap/interfaces/__init__.py:100
+msgid "Image map template"
+msgstr "Mode de rendu"
+
+#: src/pyams_content/shared/site/folder.py:59
+msgid "Site folder"
+msgstr "Rubrique"
+
+#: src/pyams_content/shared/site/link.py:49
+msgid "Content link"
+msgstr "Contenu lié"
+
+#: src/pyams_content/shared/site/manager.py:68
+#: src/pyams_content/shared/site/zmi/manager.py:125
+msgid "Site manager"
+msgstr "Site"
+
+#: src/pyams_content/shared/site/zmi/folder.py:61
+msgid "Add site folder..."
+msgstr "Ajouter une rubrique"
+
+#: src/pyams_content/shared/site/zmi/folder.py:93
+msgid "Add site folder"
+msgstr "Ajout d'une rubrique"
+
+#: src/pyams_content/shared/site/zmi/folder.py:160
+msgid "Site folder management"
+msgstr "Gérer cette rubrique"
+
+#: src/pyams_content/shared/site/zmi/folder.py:188
+msgid "Site folder properties"
+msgstr "Propriétés de la rubrique"
+
+#: src/pyams_content/shared/site/zmi/folder.py:71
+#: src/pyams_content/interfaces/__init__.py:102
+msgid "Visible label used to display content"
+msgstr "Le titre présenté aux internautes"
+
+#: src/pyams_content/shared/site/zmi/folder.py:74
+#: src/pyams_content/shared/site/zmi/__init__.py:72
+#: src/pyams_content/shared/site/zmi/link.py:66
+msgid "Parent"
+msgstr "Niveau parent"
+
+#: src/pyams_content/shared/site/zmi/folder.py:75
+#: src/pyams_content/shared/site/zmi/link.py:67
+msgid "Folder's parent"
+msgstr "Niveau de rattachement de cette rubrique"
+
+#: src/pyams_content/shared/site/zmi/folder.py:153
+msgid "You must provide a folder name for default server language!"
+msgstr ""
+"Vous devez fournir un nom pour ce dossier pour la langue par défaut du "
+"serveur !"
+
+#: src/pyams_content/shared/site/zmi/__init__.py:55
+msgid "This topic"
+msgstr "Cet article"
+
+#: src/pyams_content/shared/site/zmi/__init__.py:63
+msgid "Add topic..."
+msgstr "Ajouter un article"
+
+#: src/pyams_content/shared/site/zmi/__init__.py:86
+msgid "Add topic"
+msgstr "Ajout d'un article"
+
+#: src/pyams_content/shared/site/zmi/__init__.py:73
+msgid "Topic's parent"
+msgstr "Niveau parent"
+
+#: src/pyams_content/shared/site/zmi/link.py:57
+msgid "Rent content..."
+msgstr "Lier un contenu"
+
+#: src/pyams_content/shared/site/zmi/link.py:77
+msgid "Rent existing content"
+msgstr "Lier un contenu existant"
+
+#: src/pyams_content/shared/site/zmi/link.py:135
+msgid "Edit content link properties"
+msgstr "Propriétés du lien"
+
+#: src/pyams_content/shared/site/zmi/container.py:106
+#: src/pyams_content/shared/site/zmi/container.py:118
+#: src/pyams_content/shared/blog/zmi/manager.py:155
+#: src/pyams_content/shared/blog/zmi/manager.py:167
+msgid "Publication dates..."
+msgstr "Dates de publication"
+
+#: src/pyams_content/shared/site/zmi/container.py:132
+#: src/pyams_content/shared/blog/zmi/manager.py:181
+msgid "Update publication dates"
+msgstr "Dates de publication"
+
+#: src/pyams_content/shared/site/zmi/container.py:178
+#: src/pyams_content/shared/site/zmi/container.py:188
+#: src/pyams_content/root/zmi/sites.py:68
+msgid "Site tree"
+msgstr "Arborescence du site"
+
+#: src/pyams_content/shared/site/zmi/container.py:310
+#: src/pyams_content/shared/site/zmi/container.py:156
+msgid "Visible element?"
+msgstr "Élément visible ?"
+
+#: src/pyams_content/shared/site/zmi/container.py:311
+msgid "Switch element visibility"
+msgstr "Cliquez pour rendre l'élément visible ou non"
+
+#: src/pyams_content/shared/site/zmi/container.py:372
+msgid "Folders and topics"
+msgstr "Rubriquage"
+
+#: src/pyams_content/shared/site/zmi/container.py:408
+#: src/pyams_content/root/zmi/__init__.py:825
+msgid "Content"
+msgstr "Contenu"
+
+#: src/pyams_content/shared/site/zmi/container.py:504
+msgid "Delete site item"
+msgstr "Supprimer ce contenu"
+
+#: src/pyams_content/shared/site/zmi/container.py:381
+msgid "Click to open/close all folders"
+msgstr "Afficher/masquer toutes les rubriques"
+
+#: src/pyams_content/shared/site/zmi/container.py:397
+msgid "Click to show/hide inner folders"
+msgstr "Cliquer pour afficher ou cache les sous-niveaux"
+
+#: src/pyams_content/shared/site/zmi/container.py:267
+msgid "Can't reparent object to one of it's children. Reloading..."
+msgstr ""
+"Impossible de déplacer une rubrique dans l'une de ses sous-rubriques ou "
+"contenus ! Rechargement de la page..."
+
+#: src/pyams_content/shared/site/zmi/manager.py:57
+msgid "Site management"
+msgstr "Gérer ce site"
+
+#: src/pyams_content/shared/site/zmi/manager.py:112
+#: src/pyams_content/shared/site/zmi/manager.py:126
+msgid "Add site manager"
+msgstr "Ajouter un site"
+
+#: src/pyams_content/shared/site/zmi/manager.py:156
+#: src/pyams_content/shared/blog/zmi/manager.py:127
+msgid "You must provide a short name for default server language!"
+msgstr "Vous devez fournir un nom court pour la langue par défaut du serveur !"
+
+#: src/pyams_content/shared/site/zmi/manager.py:160
+msgid "Specified site manager name is already used!"
+msgstr "Le nom indiqué pour ce site existe déjà !"
+
+#: src/pyams_content/shared/site/zmi/manager.py:164
+msgid "A site manager is already registered with this name!!"
+msgstr "Un site est déjà inscrit dans le registre avec ce nom !"
+
+#: src/pyams_content/shared/site/interfaces/__init__.py:96
+msgid "Topic"
+msgstr "Article"
+
+#: src/pyams_content/shared/site/interfaces/__init__.py:59
+msgid "Heading"
+msgstr "Chapô"
+
+#: src/pyams_content/shared/site/interfaces/__init__.py:60
+msgid "Heading displayed according to presentation template"
+msgstr ""
+"Ce chapô pourra être affiché ou non en fonction du modèle de présentation "
+"retenu"
+
+#: src/pyams_content/shared/site/interfaces/__init__.py:63
+msgid "Navigation title"
+msgstr "Titre de navigation"
+
+#: src/pyams_content/shared/site/interfaces/__init__.py:64
+msgid "Title displayed in navigation items"
+msgstr ""
+"Libellé utilisé en lieu et place du titre dans les blocs de navigation, "
+"notamment dans les pages carrefours"
+
+#: src/pyams_content/shared/site/interfaces/__init__.py:115
+msgid "Content title, as shown in front-office"
+msgstr "Titre présenté aux internautes"
+
+#: src/pyams_content/shared/site/interfaces/__init__.py:119
+msgid "If 'no', link is not visible"
+msgstr "Si 'non', le lien ne sera pas visible"
+
+#: src/pyams_content/shared/logo/paragraph.py:96
 msgid "no selected logo"
 msgstr "aucun logo sélectionné"
 
-#: src/pyams_content/shared/logo/paragraph.py:101
+#: src/pyams_content/shared/logo/paragraph.py:102
 #, python-format
 msgid "logo '{0}' can't be found"
 msgstr "le logo '{0}' est introuvable"
 
-#: src/pyams_content/shared/logo/paragraph.py:109
+#: src/pyams_content/shared/logo/paragraph.py:110
 #, python-format
 msgid "logo '{0}' is not published"
 msgstr "le logo '{0}' n'est pas publié"
 
-#: src/pyams_content/shared/logo/__init__.py:67
+#: src/pyams_content/shared/logo/__init__.py:68
 msgid "no image defined"
 msgstr "aucune image définie"
 
-#: src/pyams_content/shared/logo/__init__.py:70
+#: src/pyams_content/shared/logo/__init__.py:71
 msgid "no URL defined"
 msgstr "aucune URL définie"
 
-#: src/pyams_content/shared/logo/interfaces/__init__.py:32
-msgid "Logo"
-msgstr "Logo"
-
-#: src/pyams_content/shared/logo/interfaces/__init__.py:64
-msgid "Logos"
-msgstr "Logos"
-
-#: src/pyams_content/shared/logo/interfaces/__init__.py:71
-msgid "Logos references"
-msgstr "Logos sélectionnés"
-
-#: src/pyams_content/shared/logo/interfaces/__init__.py:72
-msgid "List of internal logos references"
-msgstr "Liste de références internes vers les logos à afficher"
-
-#: src/pyams_content/shared/logo/interfaces/__init__.py:75
-msgid "Logos template"
-msgstr "Mode de rendu"
-
-#: src/pyams_content/shared/logo/zmi/paragraph.py:54
+#: src/pyams_content/shared/logo/zmi/paragraph.py:55
 msgid "Logos..."
 msgstr "Logos"
 
-#: src/pyams_content/shared/logo/zmi/paragraph.py:67
+#: src/pyams_content/shared/logo/zmi/paragraph.py:68
 msgid "Add new logos paragraph"
 msgstr "Ajout d'une sélection de logos"
 
+#: src/pyams_content/shared/logo/zmi/properties.py:40
+msgid "Main logo settings"
+msgstr "Propriétés du logo"
+
 #: src/pyams_content/shared/logo/zmi/__init__.py:45
 msgid "This logo"
 msgstr "Ce logo"
@@ -3109,1608 +4260,103 @@
 msgid "Logo « {title} »"
 msgstr "Logo « {title} »"
 
-#: src/pyams_content/shared/logo/zmi/properties.py:40
-msgid "Main logo settings"
-msgstr "Propriétés du logo"
-
-#: src/pyams_content/shared/common/__init__.py:237
-#: src/pyams_content/shared/common/zmi/manager.py:96
-#: src/pyams_content/shared/common/zmi/properties.py:70
-msgid "Properties"
-msgstr "Propriétés"
-
-#: src/pyams_content/shared/common/__init__.py:147
-#: src/pyams_content/shared/common/__init__.py:155
-#, python-format
-msgid "{date} by {principal}"
-msgstr "{date} par {principal}"
-
-#: src/pyams_content/shared/common/__init__.py:260
-#, python-format
-msgid "title length should be between 40 and 66 characters ({length} actually)"
-msgstr ""
-"Le titre devrait être composé de 40 à 66 caractères ({length} actuellement)"
-
-#: src/pyams_content/shared/common/interfaces/types.py:37
-msgid "Name of this data type; must be unique between all data types"
-msgstr "Nom de ce type de donnée ; doit être unique entre tous les types"
-
-#: src/pyams_content/shared/common/interfaces/types.py:43
-msgid "Navigation label"
-msgstr "Libellé de navigation"
-
-#: src/pyams_content/shared/common/interfaces/types.py:44
-msgid "Label used for navigation entries"
-msgstr "Libellé utilisé pour les entrées de navigation"
-
-#: src/pyams_content/shared/common/interfaces/types.py:47
-msgid "Tab-folder label"
-msgstr "Libellé d'un l'onglet"
-
-#: src/pyams_content/shared/common/interfaces/types.py:48
-msgid "Label used to include into tab folder"
-msgstr "Libellé utilisé pour l'affichage du type sous la forme d'un onglet"
-
-#: src/pyams_content/shared/common/interfaces/types.py:51
-msgid "'See also' label"
-msgstr "Libellé 'À voir aussi'"
-
-#: src/pyams_content/shared/common/interfaces/types.py:52
-msgid ""
-"This label can be used when contents of this type will be displayed in a "
-"'See also' entries block"
-msgstr ""
-"Ce libellé peut être utilisé lorsque des contenus de ce type sont affichés "
-"sous la forme d'un bloc 'À voir aussi'"
-
-#: src/pyams_content/shared/common/interfaces/types.py:56
-msgid "'Single value' label"
-msgstr "Libellé 'Valeur unique'"
-
-#: src/pyams_content/shared/common/interfaces/types.py:57
-msgid "Label given to this type when a single value is displayed"
-msgstr "Libellé utilisé pour ce type lorsqu'une seule valeur est affichée"
-
-#: src/pyams_content/shared/common/interfaces/types.py:60
-msgid "'Link to list' label"
-msgstr "Libellé 'Lien vers une liste'"
-
-#: src/pyams_content/shared/common/interfaces/types.py:61
-msgid "Label used to display a link to a list of items of this type"
-msgstr ""
-"Libellé utilisé lorsque l'on crée un lien vers uns liste de contenus de ce "
-"type"
-
-#: src/pyams_content/shared/common/interfaces/types.py:64
-msgid "Next content label"
-msgstr "Libellé du contenu suivant"
-
-#: src/pyams_content/shared/common/interfaces/types.py:65
-msgid "Label used to announce next date for this type"
-msgstr ""
-"Libellé utilisé pour afficher la prochaine date d'un événement pour ce type"
-
-#: src/pyams_content/shared/common/interfaces/types.py:69
-msgid "Image associated to this data type"
-msgstr "Image associée à ce type"
-
-#: src/pyams_content/shared/common/interfaces/types.py:82
-msgid "Field names"
-msgstr "Champs associés"
-
-#: src/pyams_content/shared/common/interfaces/types.py:83
-msgid "List of fields associated with this data type"
-msgstr "Liste des champs de saisie associés à ce type"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:46
-#: src/pyams_content/root/interfaces/__init__.py:40
-msgid "Webmasters"
-msgstr "Webmestres"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:47
-msgid "Webmasters can handle all contents, including published ones"
-msgstr ""
-"Les webmestres peuvent modifier et gérer tous les contenus, y compris ceux "
-"qui sont publiés et hormis ceux qui sont archivés"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:51
-msgid "Pilots"
-msgstr "Pilotes"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:52
-msgid ""
-"Pilots can handle tool configuration, manage access rules, grant users roles "
-"and manage managers restrictions"
-msgstr ""
-"Les pilotes gèrent la configuration des outils, désignent les responsables "
-"et les contributeurs, et limitent si nécessaire l'intervention des "
-"responsables à certains contenus"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:57
-#: src/pyams_content/shared/common/interfaces/__init__.py:182
-msgid "Managers"
-msgstr "Responsables"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:58
-#: src/pyams_content/shared/common/interfaces/__init__.py:183
-msgid ""
-"Managers can handle main operations in tool's workflow, like publish or "
-"retire contents"
-msgstr ""
-"Les responsables peuvent intervenir sur les étapes importantes du workflow "
-"(comme la publication ou le retrait des contenus), dans la limite des "
-"restrictions qui leur sont imposées"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:63
-#: src/pyams_content/shared/common/interfaces/__init__.py:188
-msgid "Contributors"
-msgstr "Contributeurs"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:64
-msgid "Contributors are users which are allowed to create new contents"
-msgstr "Les contributeurs sont autorisés à créer de nouveaux contenus"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:90
-msgid "Workflow name"
-msgstr "Nom du workflow"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:91
-msgid "Name of workflow utility used to manage tool contents"
-msgstr "Nom du workflow qui gère le cycle de vie des contenus de cet outil"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:119
-msgid "Content URL"
-msgstr "URL du contenu"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:120
-msgid ""
-"URL used to access this content; this is important for SEO and should "
-"include most important words describing content; spaces and underscores will "
-"be automatically replaced by hyphens"
-msgstr ""
-"<span>Texte utilisé dans l'URL d'accès au contenu ; cette information est "
-"importante pour le référencement : il faut utiliser des mots essentiels pour "
-"décrire ce contenu.</span><br /><strong>Remarque :</strong> le texte saisi "
-"est converti automatiquement en minuscules, les espaces et traits de "
-"soulignement (« underscores ») sont remplacés automatiquement par des traits "
-"d'union, les lettres accentuées par leur équivalent sans accent, et les mots "
-"de moins de trois lettres sont supprimés."
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:125
-msgid "Version creator"
-msgstr "À l'origine de cette version"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:126
-msgid ""
-"Name of content's version creator. The creator of the first version is also "
-"it's owner."
-msgstr ""
-"Nom du créateur de cette version. Le créateur de la première version d'un "
-"contenu est aussi son propriétaire."
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:130
-msgid "First owner"
-msgstr "Premier propriétaire"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:131
-msgid "Name of content's first version owner"
-msgstr "Nom de l'utilisateur ayant créé la première version"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:135
-msgid "Version creation"
-msgstr "Date de création"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:138
-msgid "Version modifiers"
-msgstr "Intervenants"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:139
-msgid "List of principals who modified this content"
-msgstr "Liste des utilisateurs qui sont intervenus sur cette version"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:142
-msgid "Last modifier"
-msgstr "Dernier intervenant"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:143
-msgid "Last principal who modified this content"
-msgstr "Dernier utilisateur étant intervenu sur ce contenu"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:146
-msgid "Last update"
-msgstr "Dernière modification"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:150
-msgid ""
-"The content's description is 'hidden' into HTML's page headers; but it can "
-"be seen, for example, in some search engines results as content's description"
-msgstr ""
-"La description du contenu est 'masquée' dans les en-têtes des pages HTML ; "
-"mais on peut la retrouver, par exemple, dans les listes de résultats des "
-"moteurs de recherche"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:155
-msgid "Keywords"
-msgstr "Mots-clés"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:156
-msgid "They will be included into HTML pages metadata"
-msgstr "Ces mots-clés seront intégrés dans les métadonnées des pages HTML"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:159
-#: src/pyams_content/shared/site/interfaces/__init__.py:66
-#: src/pyams_content/shared/site/zmi/folder.py:78
-msgid "Notepad"
-msgstr "Bloc-notes"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:160
-#: src/pyams_content/shared/site/interfaces/__init__.py:67
-#: src/pyams_content/shared/site/zmi/folder.py:79
-msgid "Internal information to be known about this content"
-msgstr ""
-"Pour prendre note d'informations internes utiles ou importantes à propos de "
-"ce contenu ; ces notes ne seront pas publiées sur internet."
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:175
-msgid "Content owner"
-msgstr "Propriétaire"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:176
-msgid ""
-"The owner is the creator of content's first version, except if it was "
-"transferred afterwards to another owner"
-msgstr ""
-"Le propriétaire est le créateur de la première version d'un contenu, sauf "
-"lorsque cette propriété a été transférée à un autre utilisateur après coup. "
-"Les contenus archivés ne sont plus transférables."
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:189
-msgid ""
-"Contributors are users which are allowed to update this content in addition "
-"to it's owner"
-msgstr ""
-"Les contributeurs sont autorisés, en plus du propriétaire, à modifier ce "
-"contenu"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:194
-msgid "Readers"
-msgstr "Relecteurs"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:195
-msgid ""
-"Readers are users which are asked to verify and comment contents before they "
-"are published"
-msgstr ""
-"Les relecteurs sont des utilisateurs qui sont sollicités pour vérifier et "
-"commenter un contenu avant sa publication"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:200
-msgid "Guests"
-msgstr "Invités"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:201
-msgid ""
-"Guests are users which are allowed to view contents with restricted access"
-msgstr ""
-"Les invités sont autorisés à consulter des contenus dont l'accès a été "
-"restreint"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:221
-msgid "Principal ID"
-msgstr "ID utilisateur"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:260
-#: src/pyams_content/shared/common/interfaces/__init__.py:285
-#: src/pyams_content/shared/common/zmi/security.py:118
-#: src/pyams_content/shared/common/zmi/security.py:270
-msgid "Publication checks"
-msgstr "Activer le tunnel de publication"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:261
-msgid ""
-"If 'yes', this contributor will have to confirm that contents have been "
-"previewed and checked before asking for publication"
-msgstr ""
-"Si 'oui', ce contributeur devra confirmer qu'il a bien prévisualisé et "
-"audité chaque contenu avant de pouvoir effectuer une demande de publication"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:286
-msgid ""
-"If 'yes', this manager will have to confirm that contents have been "
-"previewed and checked before publishing a content"
-msgstr ""
-"Si 'oui', ce responsable devra confirmer qu'il a bien prévisualisé et audité "
-"chaque contenu avant de pouvoir effectuer une publication"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:291
-msgid "Restricted contents"
-msgstr "Accès restreints"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:292
-msgid ""
-"If 'yes', this manager will get restricted access to manage contents based "
-"on selected settings"
-msgstr ""
-"Si 'oui', ce responsable n'aura qu'un accès restreint à certains contenus en "
-"fonction de paramètres spécifiques"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:297
-msgid "Selected owners"
-msgstr "Propriétaires"
-
-#: src/pyams_content/shared/common/interfaces/__init__.py:298
-msgid "Manager will have access to contents owned by these principals"
-msgstr ""
-"Le responsable n'aura accès qu'aux contenus dont ces utilisateurs sont "
-"propriétaires"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:134
-msgid "Unique ID"
-msgstr "N° IN"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:154
-#: src/pyams_content/shared/common/zmi/search.py:168
-msgid "Status"
-msgstr "Statut"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:181
-msgid "Status date"
-msgstr "En date du"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:198
-#: src/pyams_content/shared/common/zmi/summary.py:158
-msgid "Version"
-msgstr "Version"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:213
-msgid "Status principal"
-msgstr "Intervenant"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:231
-#: src/pyams_content/shared/common/zmi/search.py:165
-#: src/pyams_content/root/zmi/search.py:159
-msgid "Owner"
-msgstr "Propriétaire"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:250
-msgid "Last modification"
-msgstr "Dernière modification"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:273
-#: src/pyams_content/root/zmi/__init__.py:110
-msgid "Dashboard"
-msgstr "Tableau de bord"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:283
-msgid "Contents dashboard"
-msgstr "Mon tableau de bord"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:329
-#: src/pyams_content/root/zmi/__init__.py:159
-#, python-format
-msgid "MANAGER - {0} content waiting for your action"
-msgstr "RESPONSABLE - {0} contenu en attente de votre intervention"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:330
-#: src/pyams_content/root/zmi/__init__.py:160
-#, python-format
-msgid "MANAGER - {0} contents waiting for your action"
-msgstr "RESPONSABLE - {0} contenus en attente de votre intervention"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:370
-#: src/pyams_content/root/zmi/__init__.py:203
-#, python-format
-msgid "CONTRIBUTOR - {0} content waiting for action"
-msgstr "CONTRIBUTEUR - {0} contenu soumis à un responsable"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:371
-#: src/pyams_content/root/zmi/__init__.py:204
-#, python-format
-msgid "CONTRIBUTOR - {0} contents waiting for action"
-msgstr "CONTRIBUTEUR - {0} contenus soumis à un responsable"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:402
-#: src/pyams_content/root/zmi/__init__.py:238
-#, python-format
-msgid "CONTRIBUTOR - {0} modified content"
-msgstr "CONTRIBUTEUR - {0} contenu modifié"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:443
-#: src/pyams_content/root/zmi/__init__.py:281
-msgid "My contents"
-msgstr "Mes contenus"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:458
-#: src/pyams_content/shared/common/zmi/templates/dashboard.pt:8
-#: src/pyams_content/root/zmi/__init__.py:296
-#: src/pyams_content/root/zmi/templates/dashboard.pt:8
-msgid "My favorites"
-msgstr "Mes favoris"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:467
-#: src/pyams_content/root/zmi/__init__.py:305
-#, python-format
-msgid "CONTRIBUTOR - {0} favorite"
-msgstr "CONTRIBUTEUR - {0} contenu favori"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:468
-#: src/pyams_content/root/zmi/__init__.py:306
-#, python-format
-msgid "CONTRIBUTOR - {0} favorites"
-msgstr "CONTRIBUTEUR - {0} contenus favoris"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:480
-#: src/pyams_content/shared/common/zmi/templates/header.pt:23
-msgid "Add/remove from favorites"
-msgstr "Ajouter/enlever des favoris"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:543
-#: src/pyams_content/root/zmi/__init__.py:344
-msgid "Your favorites"
-msgstr "Mes favoris"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:556
-#: src/pyams_content/root/zmi/__init__.py:357
-msgid "My preparations"
-msgstr "Mes préparations"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:565
-#: src/pyams_content/root/zmi/__init__.py:366
-#, python-format
-msgid "CONTRIBUTOR - {0} prepared content"
-msgstr "CONTRIBUTEUR - {0} contenu en préparation"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:566
-#: src/pyams_content/root/zmi/__init__.py:367
-#, python-format
-msgid "CONTRIBUTOR - {0} prepared contents"
-msgstr "CONTRIBUTEUR - {0} contenus en préparation"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:605
-#: src/pyams_content/root/zmi/__init__.py:405
-msgid "Your prepared contents"
-msgstr "Mes contenus en préparation"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:618
-#: src/pyams_content/root/zmi/__init__.py:418
-msgid "My submissions"
-msgstr "Mes demandes"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:627
-#: src/pyams_content/root/zmi/__init__.py:427
-#, python-format
-msgid "CONTRIBUTOR - {0} submitted content"
-msgstr "CONTRIBUTEUR - {0} contenu soumis à un responsable"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:628
-#: src/pyams_content/root/zmi/__init__.py:428
-#, python-format
-msgid "CONTRIBUTOR - {0} submitted contents"
-msgstr "CONTRIBUTEUR - {0} contenus soumis à un responsable"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:667
-#: src/pyams_content/root/zmi/__init__.py:466
-msgid "Your submitted contents"
-msgstr "Mes contenus soumis à un responsable"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:680
-#: src/pyams_content/root/zmi/__init__.py:479
-msgid "My publications"
-msgstr "Mes publications"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:689
-#: src/pyams_content/root/zmi/__init__.py:488
-#, python-format
-msgid "CONTRIBUTOR - {0} published content"
-msgstr "CONTRIBUTEUR - {0} contenu publié"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:690
-#: src/pyams_content/root/zmi/__init__.py:489
-#, python-format
-msgid "CONTRIBUTOR - {0} published contents"
-msgstr "CONTRIBUTEUR - {0} contenus publiés"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:729
-#: src/pyams_content/root/zmi/__init__.py:527
-msgid "Your published contents"
-msgstr "Mes contenus publiés"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:742
-#: src/pyams_content/root/zmi/__init__.py:540
-msgid "My retired contents"
-msgstr "Mes contenus retirés"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:751
-#: src/pyams_content/root/zmi/__init__.py:549
-#, python-format
-msgid "CONTRIBUTOR - {0} retired content"
-msgstr "CONTRIBUTEUR - {0} contenu retiré"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:752
-#: src/pyams_content/root/zmi/__init__.py:550
-#, python-format
-msgid "CONTRIBUTOR - {0} retired contents"
-msgstr "CONTRIBUTEUR - {0} contenus retirés"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:792
-#: src/pyams_content/root/zmi/__init__.py:589
-msgid "Your retired contents"
-msgstr "Mes contenus retirés"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:805
-#: src/pyams_content/root/zmi/__init__.py:602
-msgid "My archived contents"
-msgstr "Mes contenus archivés"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:814
-#: src/pyams_content/root/zmi/__init__.py:611
-#, python-format
-msgid "CONTRIBUTOR - {0} archived content"
-msgstr "CONTRIBUTEUR - {0} contenu archivé"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:815
-#: src/pyams_content/root/zmi/__init__.py:612
-#, python-format
-msgid "CONTRIBUTOR - {0} archived contents"
-msgstr "CONTRIBUTEUR - {0} contenus archivés"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:861
-#: src/pyams_content/root/zmi/__init__.py:657
-msgid "Your archived contents"
-msgstr "Mes contenus archivés"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:875
-#: src/pyams_content/root/zmi/__init__.py:671
-msgid "Other interventions"
-msgstr "Toutes les interventions"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:890
-#: src/pyams_content/root/zmi/__init__.py:686
-msgid "Last publications"
-msgstr "Dernières publications"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:899
-#: src/pyams_content/root/zmi/__init__.py:695
-#, python-format
-msgid "CONTRIBUTORS - {0} published content"
-msgstr "TOUS CONTRIBUTEURS - {0} contenu publié"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:945
-#: src/pyams_content/root/zmi/__init__.py:740
-msgid "Last published contents"
-msgstr "Derniers contenus publiés"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:958
-#: src/pyams_content/root/zmi/__init__.py:753
-msgid "Last updates"
-msgstr "Dernières modifications"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:967
-#: src/pyams_content/root/zmi/__init__.py:762
-#, python-format
-msgid "CONTRIBUTORS - {0} updated content"
-msgstr "TOUS CONTRIBUTEURS - {0} contenu modifié"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:1012
-#: src/pyams_content/root/zmi/__init__.py:806
-msgid "Last updated contents"
-msgstr "Derniers contenus modifiés"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:407
-#: src/pyams_content/root/zmi/__init__.py:243
-#, python-format
-msgid "CONTRIBUTOR - {0} modified contents"
-msgstr "CONTRIBUTEUR - {0} contenus modifiés"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:409
-#: src/pyams_content/root/zmi/__init__.py:245
-#, python-format
-msgid "CONTRIBUTOR - Last {0} modified contents"
-msgstr "CONTRIBUTEUR - Les {0} dernières modifications"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:904
-#: src/pyams_content/root/zmi/__init__.py:700
-#, python-format
-msgid "CONTRIBUTORS - Last {0} published contents"
-msgstr "TOUS CONTRIBUTEURS - Les {0} dernières publications"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:906
-#: src/pyams_content/root/zmi/__init__.py:702
-msgid "CONTRIBUTORS - Last published contents (in the limit of 50)"
-msgstr "TOUS CONTRIBUTEURS - Les {0} dernières publications"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:972
-#: src/pyams_content/root/zmi/__init__.py:767
-#, python-format
-msgid "CONTRIBUTORS - Last {0} updated contents"
-msgstr "TOUS CONTRIBUTEURS - Les {0} dernières modifications"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:974
-#: src/pyams_content/root/zmi/__init__.py:769
-msgid "CONTRIBUTORS - Last updated contents (in the limit of 50)"
-msgstr "TOUS CONTRIBUTEURS - Les {0} dernières modifications"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:306
-#, python-format
-msgid "SEARCH - Between all contents of type &laquo;&nbsp;{type}&nbsp;&raquo;"
-msgstr "RECHERCHE - Tous contenus &laquo;&nbsp;{type}&nbsp;&raquo; confondus"
-
-#: src/pyams_content/shared/common/zmi/dashboard.py:171
-#: src/pyams_content/shared/common/zmi/header.py:96
-msgid "Content publication start date is not passed yet"
-msgstr "La date de début de publication n'est pas encore atteinte"
-
-#: src/pyams_content/shared/common/zmi/header.py:85
-#, python-format
-msgid "{state} by {principal}"
-msgstr "{state} par {principal}"
-
-#: src/pyams_content/shared/common/zmi/header.py:116
-#, python-format
-msgid "since {date}"
-msgstr "depuis {date}"
-
-#: src/pyams_content/shared/common/zmi/header.py:128
-msgid "access published version"
-msgstr "accéder à la version en ligne"
-
-#: src/pyams_content/shared/common/zmi/header.py:135
-msgid "access new version"
-msgstr "accéder à la version en préparation"
-
-#: src/pyams_content/shared/common/zmi/header.py:145
-msgid "access waiting version"
-msgstr "accéder à la version en attente"
-
-#: src/pyams_content/shared/common/zmi/header.py:156
-msgid "access retired version"
-msgstr "accéder à la version retirée"
-
-#: src/pyams_content/shared/common/zmi/header.py:166
-msgid "access archived version"
-msgstr "accéder à la version archivée"
-
-#: src/pyams_content/shared/common/zmi/types.py:67
-msgid "Data types"
-msgstr "Types de contenus"
-
-#: src/pyams_content/shared/common/zmi/types.py:145
-msgid "Data type label"
-msgstr "Libellé du type"
-
-#: src/pyams_content/shared/common/zmi/types.py:185
-#: src/pyams_content/shared/common/zmi/types.py:396
-msgid "Default associations"
-msgstr "Liens et pièces jointes par défaut"
-
-#: src/pyams_content/shared/common/zmi/types.py:213
-msgid "Content data types"
-msgstr "Types de contenus"
-
-#: src/pyams_content/shared/common/zmi/types.py:236
-msgid "Add data type"
-msgstr "Ajouter un type"
-
-#: src/pyams_content/shared/common/zmi/types.py:248
-msgid "Add new data type"
-msgstr "Ajout d'un type de contenu"
-
-#: src/pyams_content/shared/common/zmi/types.py:285
-msgid "Data type properties"
-msgstr "Propriétés du type de contenu"
-
-#: src/pyams_content/shared/common/zmi/types.py:359
-msgid "Subtype label"
-msgstr "Libellé du sous-type"
-
-#: src/pyams_content/shared/common/zmi/types.py:440
-msgid "Add subtype"
-msgstr "Ajouter un sous-type"
-
-#: src/pyams_content/shared/common/zmi/types.py:452
-msgid "Add new subtype"
-msgstr "Ajout d'un sous-type de contenu"
-
-#: src/pyams_content/shared/common/zmi/types.py:498
-msgid "Data subtype properties"
-msgstr "Propriétés du fichier standard"
-
-#: src/pyams_content/shared/common/zmi/types.py:112
-msgid "No currently defined data type."
-msgstr "Aucun type de contenu n'est actuellement défini."
-
-#: src/pyams_content/shared/common/zmi/types.py:275
-msgid "Specified type name is already used!"
-msgstr "Le nom indiqué pour ce type de contenu est déjà utilisé !"
-
-#: src/pyams_content/shared/common/zmi/types.py:474
-msgid "Subtype was correctly added."
-msgstr "Le sous-type a été ajouté."
-
-#: src/pyams_content/shared/common/zmi/types.py:488
-msgid "Specified subtype name is already used!"
-msgstr "Le nom indiqué pour ce sous-type de contenu est déjà utilisé !"
-
-#: src/pyams_content/shared/common/zmi/types.py:157
-msgid "Click to see subtypes"
-msgstr "Montrer ou caher les sous-types"
-
-#: src/pyams_content/shared/common/zmi/site.py:38
-#, python-format
-msgid ""
-"SEARCH - Between all contents published into &laquo;&nbsp;{site}&nbsp;&raquo;"
-msgstr ""
-"RECHERCHE - Tous contenus présents dans &laquo;&nbsp;{site}&nbsp;&raquo; "
-"confondus"
-
-#: src/pyams_content/shared/common/zmi/owner.py:50
-msgid "Change owner..."
-msgstr "Changer de propriétaire"
-
-#: src/pyams_content/shared/common/zmi/owner.py:83
-msgid "Change content's owner"
-msgstr "Changement de propriétaire"
-
-#: src/pyams_content/shared/common/zmi/owner.py:125
-msgid ""
-"All versions of this content which are not archived will be transferred to "
-"newly selected owner"
-msgstr ""
-"Toutes les versions non archivées de ce contenu seront transférées au "
-"nouveau propriétaire sélectionné"
-
-#: src/pyams_content/shared/common/zmi/owner.py:60
-msgid "New owner"
-msgstr "Nouveau propriétaire"
-
-#: src/pyams_content/shared/common/zmi/owner.py:61
-msgid "The selected user will become the new content's owner"
-msgstr "L'utilisateur sélectionné deviendra le nouveau propriétaire du contenu"
-
-#: src/pyams_content/shared/common/zmi/owner.py:63
-msgid "Keep previous owner as contributor"
-msgstr "L'ancien propriétaire reste contributeur"
-
-#: src/pyams_content/shared/common/zmi/owner.py:64
-msgid "If 'yes', the previous owner will still be able to modify this content"
+#: src/pyams_content/shared/logo/interfaces/__init__.py:33
+msgid "Logo"
+msgstr "Logo"
+
+#: src/pyams_content/shared/logo/interfaces/__init__.py:70
+msgid "Logos"
+msgstr "Logos"
+
+#: src/pyams_content/shared/logo/interfaces/__init__.py:47
+msgid "Image (colored)"
+msgstr "Image (version couleur)"
+
+#: src/pyams_content/shared/logo/interfaces/__init__.py:51
+msgid "Image (monochrome)"
+msgstr "Image (version noir et blanc)"
+
+#: src/pyams_content/shared/logo/interfaces/__init__.py:52
+msgid "An alternate image which can be used by some presentation templates"
 msgstr ""
-"Si 'oui', l'actuel propriétaire du contenu en restera contributeur et pourra "
-"donc continuer à le mettre à jour"
-
-#: src/pyams_content/shared/common/zmi/owner.py:74
-msgid "Change owner"
-msgstr "Changer le propriétaire"
-
-#: src/pyams_content/shared/common/zmi/summary.py:50
-msgid "Display content summary"
-msgstr "Récapitulatif pour ce contenu"
-
-#: src/pyams_content/shared/common/zmi/summary.py:74
-msgid "Identity card"
-msgstr "Carte d'identité"
-
-#: src/pyams_content/shared/common/zmi/summary.py:86
-msgid "Requested action"
-msgstr "Évolution demandée"
-
-#: src/pyams_content/shared/common/zmi/summary.py:127
-msgid "Publication and retire dates"
-msgstr "Dates de publication et de retrait planifiées"
-
-#: src/pyams_content/shared/common/zmi/summary.py:146
-msgid "Current version"
-msgstr "À propos de cette version"
-
-#: src/pyams_content/shared/common/zmi/summary.py:176
-msgid "Content history"
-msgstr "Pour mémoire"
-
-#: src/pyams_content/shared/common/zmi/summary.py:117
-msgid "Associated comment"
-msgstr "Commentaire associé"
-
-#: src/pyams_content/shared/common/zmi/summary.py:107
-#, python-format
-msgid "{state} {date} by {principal}"
-msgstr "{state} {date} par {principal}"
-
-#: src/pyams_content/shared/common/zmi/summary.py:164
-#, python-format
-msgid "{state} since {date}, by {principal}"
-msgstr "{state} depuis {date} par {principal}"
-
-#: src/pyams_content/shared/common/zmi/__init__.py:265
-msgid "Duplicate content..."
-msgstr "Dupliquer le contenu"
-
-#: src/pyams_content/shared/common/zmi/__init__.py:285
-msgid "Duplicate content"
-msgstr "Dupliquer ce contenu"
-
-#: src/pyams_content/shared/common/zmi/__init__.py:84
-msgid "This title can be modified afterwards"
-msgstr "Pourra être modifié ultérieurement"
-
-#: src/pyams_content/shared/common/zmi/__init__.py:276
-msgid "Duplicate this content"
-msgstr "Dupliquer ce contenu"
-
-#: src/pyams_content/shared/common/zmi/__init__.py:337
-#, python-format
-msgid "Clone created from version {source} of {oid} (in « {state} » state)"
-msgstr ""
-"Duplication de la version {source} du contenu {oid} (alors en statut "
-"« {state} »)"
-
-#: src/pyams_content/shared/common/zmi/__init__.py:382
-msgid "Created or modified in this version"
-msgstr "Créé ou modifié dans cette version"
-
-#: src/pyams_content/shared/common/zmi/manager.py:107
-msgid "Shared tool properties"
-msgstr "Propriétés de l'outil"
-
-#: src/pyams_content/shared/common/zmi/manager.py:125
-msgid "WARNING"
-msgstr "ATTENTION"
-
-#: src/pyams_content/shared/common/zmi/manager.py:127
-msgid ""
-"Workflow shouldn't be modified if this tool already contains any shared "
-"content!"
-msgstr ""
-"Le workflow ne doit pas être modifié si cet outil renferme déjà des contenus "
-"partagés !"
-
-#: src/pyams_content/shared/common/zmi/manager.py:150
-msgid "Languages"
-msgstr "Langues"
-
-#: src/pyams_content/shared/common/zmi/manager.py:162
-msgid "Content languages"
-msgstr "Langues pour la traduction de cet outil"
-
-#: src/pyams_content/shared/common/zmi/manager.py:172
-msgid ""
-"Tool languages are used to translate own tool properties, and newly created "
-"contents will propose these languages by default"
-msgstr ""
-"Les langues sont utilisées pour traduire les propriétés de l'outil.\n"
-"\n"
-"Les nouveaux contenus proposeront également ces langues par défaut."
-
-#: src/pyams_content/shared/common/zmi/manager.py:80
-msgid "Content management"
-msgstr "Gérer ce gabarit"
-
-#: src/pyams_content/shared/common/zmi/manager.py:82
-msgid "Tool management"
-msgstr "Gérer l'outil partagé"
-
-#: src/pyams_content/shared/common/zmi/portal.py:46
-msgid "Edit default template properties"
-msgstr "Modèle de présentation par défaut"
-
-#: src/pyams_content/shared/common/zmi/portal.py:56
-msgid ""
-"**This form allows you to select shared content default template.**\n"
-"\n"
-"If you choose to use a shared template, you can only adjust settings of each "
-"portlet individually but can't change portlets list or page configuration.\n"
-"\n"
-"If you use a local template, you can define a whole custom configuration but "
-"the template definition can't be reused anywhere..."
-msgstr ""
-"Vous pouvez modifier le modèle de présentation qui sera appliqué **par "
-"défaut** à tous les contenus de ce gabarit.\n"
-"\n"
-"Si vous choisissez d'utiliser un modèle de présentation partagé, vous "
-"pourrez ajuster les paramètres de chaque composant mais ne pourrez pas "
-"modifier la liste des composants ou leur position et la configuration de la "
-"page.\n"
-"\n"
-"Si vous choisissez d'utiliser un modèle de présentation \"local\", vous "
-"pourrez définir l'ensemble de la configuration mais le modèle de "
-"présentation ne pourra pas être réutilisé ailleurs que dans les contenus de "
-"ce gabarit."
-
-#: src/pyams_content/shared/common/zmi/portal.py:72
-msgid "Override tool default template"
-msgstr "Ne pas utiliser le modèle par défaut de ce gabarit"
-
-#: src/pyams_content/shared/common/zmi/search.py:92
-#: src/pyams_content/root/zmi/search.py:91
-msgid "Quick search results"
-msgstr "Résultats de la recherche rapide"
-
-#: src/pyams_content/shared/common/zmi/search.py:157
-#: src/pyams_content/shared/common/zmi/search.py:190
-#: src/pyams_content/root/zmi/search.py:147
-#: src/pyams_content/root/zmi/search.py:180
-msgid "Advanced search"
-msgstr "Recherche avancée"
-
-#: src/pyams_content/shared/common/zmi/search.py:282
-#: src/pyams_content/root/zmi/search.py:260
-msgid "Advanced search results"
-msgstr "Résultats de la recherche avancée"
-
-#: src/pyams_content/shared/common/zmi/search.py:172
-#: src/pyams_content/root/zmi/search.py:162
-msgid "Created after..."
-msgstr "Créé entre le"
-
-#: src/pyams_content/shared/common/zmi/search.py:175
-#: src/pyams_content/root/zmi/search.py:165
-msgid "Created before..."
-msgstr "et le"
-
-#: src/pyams_content/shared/common/zmi/search.py:178
-#: src/pyams_content/root/zmi/search.py:168
-msgid "Modified after..."
-msgstr "Modifié entre le"
-
-#: src/pyams_content/shared/common/zmi/search.py:181
-#: src/pyams_content/root/zmi/search.py:171
-msgid "Modified before..."
-msgstr "et le"
-
-#: src/pyams_content/shared/common/zmi/properties.py:60
-msgid "Composition"
-msgstr "Composition"
-
-#: src/pyams_content/shared/common/zmi/properties.py:82
-msgid "Content properties"
-msgstr "Propriétés élémentaires"
-
-#: src/pyams_content/shared/common/zmi/security.py:64
-msgid "Contributors restrictions"
-msgstr "Paramètres des contributeurs"
-
-#: src/pyams_content/shared/common/zmi/security.py:73
-msgid "Content contributors restrictions"
-msgstr "Liste des contributeurs"
-
-#: src/pyams_content/shared/common/zmi/security.py:107
-msgid "Contributor name"
-msgstr "Nom du contributeur"
-
-#: src/pyams_content/shared/common/zmi/security.py:218
-msgid "Managers restrictions"
-msgstr "Paramètres des responsables"
-
-#: src/pyams_content/shared/common/zmi/security.py:227
-msgid "Content managers restrictions"
-msgstr "Liste des responsables"
-
-#: src/pyams_content/shared/common/zmi/security.py:259
-msgid "Manager name"
-msgstr "Nom du responsable"
-
-#: src/pyams_content/shared/common/zmi/security.py:287
-msgid "Restricted"
-msgstr "Restrictions"
-
-#: src/pyams_content/shared/common/zmi/security.py:304
-msgid "Owners"
-msgstr "Propriétaires"
-
-#: src/pyams_content/shared/common/zmi/security.py:394
-msgid "Publication workflow"
-msgstr "Workflow de publication"
-
-#: src/pyams_content/shared/common/zmi/security.py:167
-#, python-format
-msgid "Edit contributor restrictions for « {0} »"
-msgstr "Gérer les paramètres d'intervention de « {0} »"
-
-#: src/pyams_content/shared/common/zmi/security.py:353
-#, python-format
-msgid "Edit manager restrictions for « {0} »"
-msgstr "Gérer les paramètres d'intervention de « {0} »"
-
-#: src/pyams_content/shared/common/zmi/security.py:400
-msgid "Apply contents restrictions"
-msgstr "Appliquer des restrictions d'accès"
-
-#: src/pyams_content/shared/common/zmi/security.py:402
-msgid ""
-"You can specify which contents this manager will be able to manage. If you "
-"specify several criteria, the manager will be able to manage contents for "
-"which at least one criteria is matching."
-msgstr ""
-"Vous pouvez indiquer les propriétés des contenus que ce responsable sera "
-"autorisé à gérer. Si vous indiquez plusieurs critères, il pourra gérer les "
-"contenus pour lesquels au moins l'un des critères correspond."
-
-#: src/pyams_content/shared/common/zmi/workflow.py:844
-msgid "Prior checks"
-msgstr "Contrôles préalables : avez-vous ?"
-
-#: src/pyams_content/shared/common/zmi/workflow.py:123
-msgid "Request publication"
-msgstr "Demander la publication"
-
-#: src/pyams_content/shared/common/zmi/workflow.py:210
-#: src/pyams_content/workflow/__init__.py:315
-msgid "Cancel publication request"
-msgstr "Annuler la demande de publication"
-
-#: src/pyams_content/shared/common/zmi/workflow.py:250
-msgid "Refuse publication request"
-msgstr "Refuser la demande de publication"
-
-#: src/pyams_content/shared/common/zmi/workflow.py:304
-#: src/pyams_content/workflow/basic.py:196
-msgid "Publish"
-msgstr "Publier"
-
-#: src/pyams_content/shared/common/zmi/workflow.py:393
-msgid "Request retire"
-msgstr "Demander le retrait"
-
-#: src/pyams_content/shared/common/zmi/workflow.py:449
-msgid "Cancel retire request"
-msgstr "Annuler la demande de retrait"
-
-#: src/pyams_content/shared/common/zmi/workflow.py:489
-msgid "Retire"
-msgstr "Retirer"
-
-#: src/pyams_content/shared/common/zmi/workflow.py:530
-#: src/pyams_content/workflow/__init__.py:436
-msgid "Request archive"
-msgstr "Demander l'archivage"
-
-#: src/pyams_content/shared/common/zmi/workflow.py:573
-msgid "Cancel archive request"
-msgstr "Annuler la demande d'archivage"
-
-#: src/pyams_content/shared/common/zmi/workflow.py:613
-msgid "Archive"
-msgstr "Archiver"
-
-#: src/pyams_content/shared/common/zmi/workflow.py:654
-#: src/pyams_content/workflow/basic.py:224
-#: src/pyams_content/workflow/basic.py:236
-#: src/pyams_content/workflow/__init__.py:501
-#: src/pyams_content/workflow/__init__.py:513
-#: src/pyams_content/workflow/__init__.py:525
-#: src/pyams_content/workflow/__init__.py:537
-#: src/pyams_content/workflow/__init__.py:549
-msgid "Create new version"
-msgstr "Créer une nouvelle version"
-
-#: src/pyams_content/shared/common/zmi/workflow.py:705
-#: src/pyams_content/workflow/basic.py:248
-#: src/pyams_content/workflow/__init__.py:561
-msgid "Delete version"
-msgstr "Supprimer cette version"
-
-#: src/pyams_content/shared/common/zmi/workflow.py:790
-msgid "Previewed content?"
-msgstr "Prévisualisé ce contenu ?"
-
-#: src/pyams_content/shared/common/zmi/workflow.py:794
-msgid "Verified content?"
-msgstr "Audité ce contenu ?"
-
-#: src/pyams_content/shared/common/zmi/workflow.py:180
-#: src/pyams_content/shared/common/zmi/workflow.py:362
-msgid "Publication start date is required"
-msgstr "La date de début de publication est obligatoire"
-
-#: src/pyams_content/shared/common/zmi/workflow.py:273
-#: src/pyams_content/shared/common/zmi/workflow.py:419
-msgid "A comment is required"
-msgstr "Le commentaire est obligatoire"
-
-#: src/pyams_content/shared/common/zmi/workflow.py:729
-msgid "Delete content"
-msgstr "Supprimer définitivement ce contenu"
-
-#: src/pyams_content/shared/common/zmi/workflow.py:738
-msgid "Delete definitively"
-msgstr "Supprimer définitivement"
-
-#: src/pyams_content/shared/common/zmi/workflow.py:860
-msgid ""
-"You must confirm that you previewed and checked this content before "
-"requesting publication!!"
-msgstr ""
-"Vous devez avoir prévisualisé et audité ce contenu avant de pouvoir le "
-"publier !!"
-
-#: src/pyams_content/shared/common/zmi/workflow.py:87
-#, python-format
-msgid "{state} | by {principal}"
-msgstr "{state} | par {principal}"
-
-#: src/pyams_content/shared/common/zmi/workflow.py:83
-#: src/pyams_content/workflow/basic.py:315
-#: src/pyams_content/workflow/basic.py:286
-#: src/pyams_content/workflow/__init__.py:648
-#: src/pyams_content/workflow/__init__.py:619
+"Image de substitution monochrome pouvant être utilisée par certains modes de "
+"rendu"
+
+#: src/pyams_content/shared/logo/interfaces/__init__.py:77
+msgid "Logos references"
+msgstr "Logos sélectionnés"
+
+#: src/pyams_content/shared/logo/interfaces/__init__.py:78
+msgid "List of internal logos references"
+msgstr "Liste de références internes vers les logos à afficher"
+
+#: src/pyams_content/shared/logo/interfaces/__init__.py:81
+msgid "Logos template"
+msgstr "Mode de rendu"
+
+#: src/pyams_content/shared/blog/zmi/__init__.py:52
+msgid "This blog post"
+msgstr "Cet article"
+
+#: src/pyams_content/shared/blog/zmi/__init__.py:71
+#: src/pyams_content/shared/blog/zmi/__init__.py:81
+msgid "Add blog post"
+msgstr "Ajouter un article"
+
+#: src/pyams_content/shared/blog/zmi/__init__.py:62
 #, python-format
-msgid "{state} {date}"
-msgstr "{state} {date}"
-
-#: src/pyams_content/shared/common/zmi/templates/wf-archiving-message.pt:2
-msgid "This content is already retired and not visible."
-msgstr "Ce contenu est déjà retiré et n'est plus visible des internautes."
-
-#: src/pyams_content/shared/common/zmi/templates/wf-archiving-message.pt:3
-#: src/pyams_content/shared/common/zmi/templates/wf-archive-message.pt:3
-msgid ""
-"After archiving, it will be backed up but you will not be able to publish it "
-"again except by creating a new version."
-msgstr ""
-"L'archivage permet de conserver une version d'un contenu dans son état "
-"actuel ; il pourra ensuite à nouveau être publié, en créant une nouvelle "
-"version."
-
-#: src/pyams_content/shared/common/zmi/templates/wf-cancel-propose-message.pt:1
-msgid ""
-"After canceling the request, you will be able to update the content again."
-msgstr "En annulant cette demande, ce contenu pourra à nouveau être modifié."
-
-#: src/pyams_content/shared/common/zmi/templates/wf-archive-message.pt:2
-msgid "As a manager, you considerate that this content must be archived."
-msgstr ""
-"En tant que responsable, vous considérez que ce contenu doit être archivé."
-
-#: src/pyams_content/shared/common/zmi/templates/wf-create-message.pt:2
-msgid ""
-"This new content is going to be created in 'draft' mode, so that you can "
-"complete it before publication."
-msgstr ""
-"Ce nouveau contenu va être créé en statut 'Brouillon' pour vous permettre de "
-"le préparer."
-
-#: src/pyams_content/shared/common/zmi/templates/wf-create-message.pt:4
-msgid ""
-"A unique number is also going to be assigned to it. This number will be "
-"shared by all content's versions."
-msgstr ""
-"Un numéro unique va lui être attribué ; il sera permanent, quelle que soit "
-"la version."
-
-#: src/pyams_content/shared/common/zmi/templates/wf-retiring-message.pt:2
-msgid ""
-"You considerate that the currently published version should no more be "
-"publicly visible."
-msgstr ""
-"Vous considérez que la version actuellement en ligne ne doit plus être "
-"consultable."
-
-#: src/pyams_content/shared/common/zmi/templates/wf-retiring-message.pt:3
-msgid ""
-"WARNING: the content will remain visible until a manager validate the "
-"request."
-msgstr ""
-"ATTENTION : ce contenu restera visible jusqu'à ce qu'un responsable prenne "
-"en charge votre demande."
-
-#: src/pyams_content/shared/common/zmi/templates/dashboard.pt:29
-#: src/pyams_content/root/zmi/templates/dashboard.pt:29
-msgid "Quick search..."
-msgstr "Recherche rapide..."
-
-#: src/pyams_content/shared/common/zmi/templates/dashboard.pt:35
-#: src/pyams_content/root/zmi/templates/dashboard.pt:35
-msgid "Advanced search..."
-msgstr "Recherche avancée..."
-
-#: src/pyams_content/shared/common/zmi/templates/dashboard.pt:49
-#: src/pyams_content/root/zmi/templates/dashboard.pt:49
-msgid "You are not actually concerned by any content."
-msgstr "Vous n'êtes actuellement concerné par aucun contenu."
-
-#: src/pyams_content/shared/common/zmi/templates/wf-duplicate-message.pt:2
-msgid "You are going to duplicate a whole content."
-msgstr ""
-"Vous vous apprêtez à dupliquer une version de ce contenu pour en créer un "
-"nouveau."
-
-#: src/pyams_content/shared/common/zmi/templates/wf-duplicate-message.pt:3
-msgid ""
-"The new copy is going to be created in 'draft' mode, so that you can modify "
-"it before publication."
-msgstr ""
-"Cette copie va être créée en statut 'Brouillon' pour vous permettre de la "
-"préparer."
-
-#: src/pyams_content/shared/common/zmi/templates/wf-duplicate-message.pt:5
-msgid ""
-"A new unique number is also going to be assigned to it. This number will be "
-"shared by all content's versions."
-msgstr ""
-"Un numéro unique lui sera également attribué ; ce numéro sera conservé "
-"pendant toute la vie du contenu, quelle que soit la version."
-
-#: src/pyams_content/shared/common/zmi/templates/wf-cancel-retiring-message.pt:1
-msgid ""
-"After cancelling this request, the content will return to it's normal "
-"published state."
-msgstr "En annulant cette demande, ce contenu va retourner en statut 'Publié'."
-
-#: src/pyams_content/shared/common/zmi/templates/wf-owner-warning.pt:1
-msgid ""
-"RECALL: you are not the owner of the content on which you are intervening."
-msgstr ""
-"ATTENTION : vous intervenez sur un contenu dont vous n'êtes pas le "
-"propriétaire."
-
-#: src/pyams_content/shared/common/zmi/templates/wf-clone-message.pt:2
-msgid "You considerate that the currently published must evolve."
-msgstr "Vous considérez que la version actuelle de ce contenu doit évoluer."
-
-#: src/pyams_content/shared/common/zmi/templates/wf-clone-message.pt:3
-msgid ""
-"By creating a new version, you can update it's content without impacting the "
-"currently published one."
-msgstr ""
-"En créant une nouvelle version, vous pourrez apporter des modifications sans "
-"impacter la version actuelle."
-
-#: src/pyams_content/shared/common/zmi/templates/wf-clone-message.pt:5
-msgid ""
-"When the new version will be complete, you will be able to make a new "
-"publication request to replace the currently published version (which will "
-"be archived automatically)."
-msgstr ""
-"Lorsque la nouvelle version sera prête, vous demanderez sa publication (et "
-"la version actuelle sera automatiquement archivée)."
-
-#: src/pyams_content/shared/common/zmi/templates/wf-retire-message.pt:2
-msgid ""
-"As a content manager, you considerate that this content should no longer be "
-"published."
-msgstr ""
-"En tant que responsable, vous considérez que ce contenu ne doit plus être "
-"publié."
-
-#: src/pyams_content/shared/common/zmi/templates/wf-retire-message.pt:4
-msgid ""
-"Retired content won't be visible anymore, but it can be updated and "
-"published again, or archived."
-msgstr ""
-"Après ce retrait, il ne sera plus visible des internautes. Il pourra par "
-"contre être publié à nouveau, archivé, ou modifié en créant une nouvelle "
-"version."
-
-#: src/pyams_content/shared/common/zmi/templates/wf-transition-info.pt:2
-msgid "FOR YOUR INFORMATION"
-msgstr "POUR VOTRE INFORMATION"
-
-#: src/pyams_content/shared/common/zmi/templates/wf-transition-info.pt:5
-msgid "Next step"
-msgstr "Étape suivante"
-
-#: src/pyams_content/shared/common/zmi/templates/wf-transition-info.pt:7
-msgid "Previous step"
-msgstr "Étape précédente"
-
-#: src/pyams_content/shared/common/zmi/templates/wf-transition-info.pt:10
-msgid "With this comment:"
-msgstr "Avec ce commentaire :"
-
-#: src/pyams_content/shared/common/zmi/templates/advanced-search.pt:128
-#: src/pyams_content/root/zmi/templates/advanced-search.pt:128
-msgid "Created between"
-msgstr "Créé entre le"
-
-#: src/pyams_content/shared/common/zmi/templates/advanced-search.pt:140
-#: src/pyams_content/shared/common/zmi/templates/advanced-search.pt:166
-#: src/pyams_content/root/zmi/templates/advanced-search.pt:140
-#: src/pyams_content/root/zmi/templates/advanced-search.pt:166
-msgid "and"
-msgstr "et le"
-
-#: src/pyams_content/shared/common/zmi/templates/advanced-search.pt:154
-#: src/pyams_content/root/zmi/templates/advanced-search.pt:154
-msgid "Modified between"
-msgstr "Modifié entre le"
-
-#: src/pyams_content/shared/common/zmi/templates/advanced-search.pt:202
-#: src/pyams_content/root/zmi/templates/advanced-search.pt:202
-msgid "Tab label"
-msgstr "Libellé de l'onglet"
-
-#: src/pyams_content/shared/common/zmi/templates/header.pt:6
-msgid "Back to previous page"
-msgstr "Revenir à la page précédente"
-
-#: src/pyams_content/shared/common/zmi/templates/header.pt:20
-msgid "by ${owner}"
-msgstr "de ${owner}"
-
-#: src/pyams_content/shared/common/zmi/templates/wf-delete-message.pt:2
-msgid ""
-"This content was never published. If you confirm deletion, it won't be "
-"possible to restore it."
-msgstr ""
-"Ce contenu n'a jamais été publié. Une fois supprimé, il ne pourra pas être "
-"récupéré."
-
-#: src/pyams_content/shared/common/zmi/templates/wf-delete-message.pt:6
-msgid ""
-"The content version is going to be definitely deleted. Will only remain the "
-"currently published version."
-msgstr ""
-"Cette version va être définitivement supprimée, pour revenir à la version "
-"précédente."
-
-#: src/pyams_content/shared/common/zmi/templates/wf-operator-warning.pt:1
-msgid ""
-"WARNING: this request was made by a contributor which is not the owner of "
-"this content."
-msgstr ""
-"ATTENTION : cette demande est formulée par un contributeur habilité qui "
-"n'est pas le propriétaire."
-
-#: src/pyams_content/shared/common/zmi/templates/wf-publish-message.pt:2
-msgid ""
-"As a manager, you considerate that this content is complete and can be "
-"published 'as is'."
-msgstr ""
-"En tant que responsable, vous considérez que ce contenu peut être publié en "
-"l'état."
-
-#: src/pyams_content/shared/common/zmi/templates/wf-publish-message.pt:4
-msgid ""
-"This operation will make the content publicly available (except if "
-"restricted access has been set)."
-msgstr ""
-"Cette opération va rendre le contenu visible de tous, sauf si des "
-"restrictions d'accès lui ont été appliquées."
-
-#: src/pyams_content/shared/common/zmi/templates/wf-cancel-archiving-message.pt:1
-msgid ""
-"After cancelling this request, the content will return to it's previous "
-"retired state."
-msgstr "En annulant cette demande, ce contenu va retourner en statut 'Retiré'."
-
-#: src/pyams_content/shared/common/zmi/templates/wf-propose-message.pt:1
-msgid ""
-"This publication request is going to be transmitted to a content manager."
-msgstr "Cette demande de publication va être soumise à un responsable."
-
-#: src/pyams_content/shared/common/zmi/templates/wf-refuse-propose-message.pt:2
-msgid ""
-"As a content manager, you considerate that this content can't be published "
-"'as is'."
-msgstr ""
-"En tant que responsable, vous considérez que ce contenu ne peut pas être "
-"publié en l'état."
-
-#: src/pyams_content/shared/common/zmi/templates/wf-refuse-propose-message.pt:4
-msgid ""
-"The contributor will be notified of this and will be able to update the "
-"content before doing a new publication request."
-msgstr ""
-"Le contributeur qui vous a sollicité va être notifié de votre refus ; il "
-"pourra modifier ce contenu et effectuer une nouvelle demande de publication."
-
-#: src/pyams_content/shared/common/portlet/content/__init__.py:44
-msgid "Context content"
-msgstr "Contenu partagé"
-
-#: src/pyams_content/shared/common/portlet/content/skin/__init__.py:36
-msgid "Default content renderer"
-msgstr "Par défaut"
-
-#: src/pyams_content/shared/common/portlet/content/zmi/preview.pt:2
-msgid "This is where the content will be displayed!!"
-msgstr "C'est ici que seront affichés les éléments du contenu."
-
-#: src/pyams_content/shared/site/manager.py:68
-#: src/pyams_content/shared/site/zmi/manager.py:125
-msgid "Site manager"
-msgstr "Site"
-
-#: src/pyams_content/shared/site/folder.py:59
-msgid "Site folder"
-msgstr "Rubrique"
-
-#: src/pyams_content/shared/site/link.py:46
-msgid "Content link"
-msgstr "Contenu lié"
-
-#: src/pyams_content/shared/site/interfaces/__init__.py:95
-msgid "Topic"
-msgstr "Article"
-
-#: src/pyams_content/shared/site/interfaces/__init__.py:58
-msgid "Heading"
-msgstr "Chapô"
-
-#: src/pyams_content/shared/site/interfaces/__init__.py:59
-msgid "Heading displayed according to presentation template"
-msgstr ""
-"Ce chapô pourra être affiché ou non en fonction du modèle de présentation "
-"retenu"
-
-#: src/pyams_content/shared/site/interfaces/__init__.py:62
-msgid "Navigation title"
-msgstr "Titre de navigation"
-
-#: src/pyams_content/shared/site/interfaces/__init__.py:63
-msgid "Title displayed in navigation items"
-msgstr ""
-"Libellé utilisé en lieu et place du titre dans les blocs de navigation, "
-"notamment dans les pages carrefours"
-
-#: src/pyams_content/shared/site/interfaces/__init__.py:114
-msgid "Content title, as shown in front-office"
-msgstr "Titre présenté aux internautes"
-
-#: src/pyams_content/shared/site/interfaces/__init__.py:118
-msgid "If 'no', link is not visible"
-msgstr "Si 'non', le lien ne sera pas visible"
-
-#: src/pyams_content/shared/site/zmi/container.py:179
-#: src/pyams_content/shared/site/zmi/container.py:189
-#: src/pyams_content/root/zmi/sites.py:68
-msgid "Site tree"
-msgstr "Arborescence du site"
-
-#: src/pyams_content/shared/site/zmi/container.py:308
-#: src/pyams_content/shared/site/zmi/container.py:157
-msgid "Visible element?"
-msgstr "Élément visible ?"
-
-#: src/pyams_content/shared/site/zmi/container.py:309
-msgid "Switch element visibility"
-msgstr "Cliquez pour rendre l'élément visible ou non"
-
-#: src/pyams_content/shared/site/zmi/container.py:370
-msgid "Folders and topics"
-msgstr "Rubriquage"
-
-#: src/pyams_content/shared/site/zmi/container.py:406
-#: src/pyams_content/root/zmi/__init__.py:817
-msgid "Content"
-msgstr "Contenu"
-
-#: src/pyams_content/shared/site/zmi/container.py:502
-msgid "Delete site item"
-msgstr "Supprimer ce contenu"
-
-#: src/pyams_content/shared/site/zmi/container.py:648
-msgid "Change URL..."
-msgstr "Changer d'URL"
-
-#: src/pyams_content/shared/site/zmi/container.py:663
-msgid "Change item URL"
-msgstr "Modification de l'URL"
-
-#: src/pyams_content/shared/site/zmi/container.py:670
-msgid "Item URL part"
-msgstr "URL du contenu"
-
-#: src/pyams_content/shared/site/zmi/container.py:379
-msgid "Click to open/close all folders"
-msgstr "Afficher/masquer toutes les rubriques"
-
-#: src/pyams_content/shared/site/zmi/container.py:395
-msgid "Click to show/hide inner folders"
-msgstr "Cliquer pour afficher ou cache les sous-niveaux"
-
-#: src/pyams_content/shared/site/zmi/container.py:265
-msgid "Can't reparent object to one of it's children. Reloading..."
-msgstr ""
-"Impossible de déplacer une rubrique dans l'une de ses sous-rubriques ou "
-"contenus ! Rechargement de la page..."
-
-#: src/pyams_content/shared/site/zmi/__init__.py:55
-msgid "This topic"
-msgstr "Cet article"
-
-#: src/pyams_content/shared/site/zmi/__init__.py:63
-msgid "Add topic..."
-msgstr "Ajouter un article"
-
-#: src/pyams_content/shared/site/zmi/__init__.py:86
-msgid "Add topic"
-msgstr "Ajout d'un article"
-
-#: src/pyams_content/shared/site/zmi/__init__.py:72
-#: src/pyams_content/shared/site/zmi/folder.py:74
-#: src/pyams_content/shared/site/zmi/link.py:66
-msgid "Parent"
-msgstr "Niveau parent"
-
-#: src/pyams_content/shared/site/zmi/__init__.py:73
-msgid "Topic's parent"
-msgstr "Niveau parent"
-
-#: src/pyams_content/shared/site/zmi/manager.py:57
-msgid "Site management"
-msgstr "Gérer ce site"
-
-#: src/pyams_content/shared/site/zmi/manager.py:112
-#: src/pyams_content/shared/site/zmi/manager.py:126
-msgid "Add site manager"
-msgstr "Ajouter un site"
-
-#: src/pyams_content/shared/site/zmi/manager.py:160
-msgid "Specified site manager name is already used!"
-msgstr "Le nom indiqué pour ce site existe déjà !"
-
-#: src/pyams_content/shared/site/zmi/manager.py:164
-msgid "A site manager is already registered with this name!!"
-msgstr "Un site est déjà inscrit dans le registre avec ce nom !"
-
-#: src/pyams_content/shared/site/zmi/folder.py:61
-msgid "Add site folder..."
-msgstr "Ajouter une rubrique"
-
-#: src/pyams_content/shared/site/zmi/folder.py:93
-msgid "Add site folder"
-msgstr "Ajout d'une rubrique"
-
-#: src/pyams_content/shared/site/zmi/folder.py:162
-msgid "Site folder management"
-msgstr "Gérer cette rubrique"
-
-#: src/pyams_content/shared/site/zmi/folder.py:190
-msgid "Site folder properties"
-msgstr "Propriétés de la rubrique"
-
-#: src/pyams_content/shared/site/zmi/folder.py:75
-#: src/pyams_content/shared/site/zmi/link.py:67
-msgid "Folder's parent"
-msgstr "Niveau de rattachement de cette rubrique"
-
-#: src/pyams_content/shared/site/zmi/folder.py:155
-msgid "You must provide a folder name for default server language!"
-msgstr ""
-"Vous devez fournir un nom pour ce dossier pour la langue par défaut du "
-"serveur !"
-
-#: src/pyams_content/shared/site/zmi/link.py:57
-msgid "Rent content..."
-msgstr "Lier un contenu"
-
-#: src/pyams_content/shared/site/zmi/link.py:77
-msgid "Rent existing content"
-msgstr "Lier un contenu existant"
-
-#: src/pyams_content/shared/site/zmi/link.py:135
-msgid "Edit content link properties"
-msgstr "Propriétés du lien"
-
-#: src/pyams_content/root/__init__.py:67
+msgid "Blog post « {title} »"
+msgstr "Article de blog « {title} »"
+
+#: src/pyams_content/shared/blog/zmi/manager.py:60
+msgid "Blog management"
+msgstr "Gérer ce blog"
+
+#: src/pyams_content/shared/blog/zmi/manager.py:83
+#: src/pyams_content/shared/blog/zmi/manager.py:97
+msgid "Add blog manager"
+msgstr "Ajouter un blog"
+
+#: src/pyams_content/shared/blog/zmi/manager.py:96
+msgid "Blog manager"
+msgstr "Blog"
+
+#: src/pyams_content/shared/blog/zmi/manager.py:131
+msgid "Specified blog manager name is already used!"
+msgstr "Le nom indiqué pour ce blog existe déjà !"
+
+#: src/pyams_content/shared/blog/zmi/manager.py:135
+msgid "A blog manager is already registered with this name!!"
+msgstr "Un blog est déjà inscrit dans le registre avec ce nom !"
+
+#: src/pyams_content/shared/blog/interfaces/__init__.py:33
+msgid "Blog post"
+msgstr "Article de blog"
+
+#: src/pyams_content/profile/zmi/__init__.py:42
+msgid "Admin. profile"
+msgstr "Profil intervenant"
+
+#: src/pyams_content/profile/interfaces/__init__.py:33
+msgid "User favorites"
+msgstr "Favoris de l'utilisateur"
+
+#: src/pyams_content/profile/interfaces/__init__.py:34
+msgid "List of internal numbers of shared contents stored for quick access"
+msgstr "Liste des numéros internes des contenus mémorisés pour un accès rapide"
+
+#: src/pyams_content/profile/interfaces/__init__.py:37
+msgid "Default table length"
+msgstr "Longueur des tableaux"
+
+#: src/pyams_content/profile/interfaces/__init__.py:38
+msgid "Default length used for inner tables and dashboards"
+msgstr "Longueur par défaut des tableaux internes et des tableaux de bord"
+
+#: src/pyams_content/root/__init__.py:68
 msgid "Site root"
 msgstr "Racine du site"
 
-#: src/pyams_content/root/interfaces/__init__.py:36
-msgid "Site managers"
-msgstr "Administrateurs"
-
-#: src/pyams_content/root/interfaces/__init__.py:44
-msgid "Templates managers"
-msgstr "Designers"
-
-#: src/pyams_content/root/interfaces/__init__.py:48
-msgid "Operators group"
-msgstr "Groupe des opérateurs"
-
-#: src/pyams_content/root/interfaces/__init__.py:49
-msgid "Name of group containing all roles owners"
-msgstr ""
-"Tous les utilisateurs auxquels sera attribué un rôle seront placés dans ce "
-"groupe"
-
-#: src/pyams_content/root/zmi/__init__.py:78
-msgid "Home"
-msgstr "Accueil"
-
-#: src/pyams_content/root/zmi/search.py:155
-msgid "Content types"
-msgstr "Types de contenus"
-
 #: src/pyams_content/root/zmi/sites.py:78
 msgid "Blogs and shared sites"
 msgstr "Blogs et sites partagés"
@@ -4731,6 +4377,14 @@
 msgid "Given element name doesn't exist!"
 msgstr "Le nom de l'élément indiqué n'existe pas !"
 
+#: src/pyams_content/root/zmi/search.py:155
+msgid "Content types"
+msgstr "Types de contenus"
+
+#: src/pyams_content/root/zmi/__init__.py:78
+msgid "Home"
+msgstr "Accueil"
+
 #: src/pyams_content/root/zmi/templates/dashboard.pt:7
 msgid "Your contents dashboard"
 msgstr "Les contenus qui me concernent"
@@ -4739,116 +4393,29 @@
 msgid "SEARCH - Between all contents"
 msgstr "RECHERCHE - Tous contenus confondus"
 
+#: src/pyams_content/root/interfaces/__init__.py:39
+msgid "Site managers"
+msgstr "Administrateurs"
+
+#: src/pyams_content/root/interfaces/__init__.py:47
+msgid "Templates managers"
+msgstr "Designers"
+
+#: src/pyams_content/root/interfaces/__init__.py:51
+msgid "Operators group"
+msgstr "Groupe des opérateurs"
+
+#: src/pyams_content/root/interfaces/__init__.py:52
+msgid "Name of group containing all roles owners"
+msgstr ""
+"Tous les utilisateurs auxquels sera attribué un rôle seront placés dans ce "
+"groupe"
+
+#: src/pyams_content/workflow/__init__.py:70
 #: src/pyams_content/workflow/basic.py:53
-#: src/pyams_content/workflow/__init__.py:70
 msgid "Draft"
 msgstr "Brouillon"
 
-#: src/pyams_content/workflow/basic.py:54
-#: src/pyams_content/workflow/__init__.py:74
-msgid "Published"
-msgstr "Publié"
-
-#: src/pyams_content/workflow/basic.py:55
-#: src/pyams_content/workflow/__init__.py:78
-msgid "Archived"
-msgstr "Archivé"
-
-#: src/pyams_content/workflow/basic.py:56
-#: src/pyams_content/workflow/__init__.py:79
-msgid "Deleted"
-msgstr "Supprimé"
-
-#: src/pyams_content/workflow/basic.py:61
-#: src/pyams_content/workflow/__init__.py:84
-msgid "draft created"
-msgstr "brouillon créé"
-
-#: src/pyams_content/workflow/basic.py:62
-#: src/pyams_content/workflow/__init__.py:86
-msgid "published"
-msgstr "publié"
-
-#: src/pyams_content/workflow/basic.py:63
-#: src/pyams_content/workflow/__init__.py:90
-msgid "archived"
-msgstr "archivé"
-
-#: src/pyams_content/workflow/basic.py:190
-#: src/pyams_content/workflow/__init__.py:279
-msgid "Initialize"
-msgstr "Création"
-
-#: src/pyams_content/workflow/basic.py:193
-#: src/pyams_content/workflow/__init__.py:282
-msgid "Draft creation"
-msgstr "Création du brouillon"
-
-#: src/pyams_content/workflow/basic.py:204
-#: src/pyams_content/workflow/__init__.py:383
-msgid "Content published"
-msgstr "Publication"
-
-#: src/pyams_content/workflow/basic.py:206
-#: src/pyams_content/workflow/__init__.py:385
-#, python-format
-msgid "published the content « {0} »"
-msgstr "a publié le contenu « {0} »"
-
-#: src/pyams_content/workflow/basic.py:210
-#: src/pyams_content/workflow/__init__.py:463
-msgid "Archive content"
-msgstr "Archiver"
-
-#: src/pyams_content/workflow/basic.py:218
-#: src/pyams_content/workflow/__init__.py:471
-msgid "Content archived"
-msgstr "Archivage"
-
-#: src/pyams_content/workflow/basic.py:220
-#: src/pyams_content/workflow/__init__.py:473
-#, python-format
-msgid "archived content « {0} »"
-msgstr "a archivé le contenu « {0} »"
-
-#: src/pyams_content/workflow/basic.py:232
-#: src/pyams_content/workflow/basic.py:244
-#: src/pyams_content/workflow/__init__.py:509
-#: src/pyams_content/workflow/__init__.py:521
-#: src/pyams_content/workflow/__init__.py:533
-#: src/pyams_content/workflow/__init__.py:545
-#: src/pyams_content/workflow/__init__.py:557
-msgid "New version created"
-msgstr "Création d'une nouvelle version"
-
-#: src/pyams_content/workflow/basic.py:256
-#: src/pyams_content/workflow/__init__.py:569
-msgid "Version deleted"
-msgstr "Version supprimée"
-
-#: src/pyams_content/workflow/basic.py:289
-#: src/pyams_content/workflow/basic.py:311
-#: src/pyams_content/workflow/__init__.py:622
-#: src/pyams_content/workflow/__init__.py:644
-msgid "Unknown state"
-msgstr "(statut inconnu)"
-
-#: src/pyams_content/workflow/basic.py:313
-#: src/pyams_content/workflow/__init__.py:646
-msgid "publication refused"
-msgstr "publication refusée"
-
-#: src/pyams_content/workflow/basic.py:309
-#: src/pyams_content/workflow/__init__.py:642
-msgid "new version created"
-msgstr "nouvelle version en préparation"
-
-#: src/pyams_content/workflow/basic.py:160
-#: src/pyams_content/workflow/__init__.py:249
-#, python-format
-msgid "Published version {0}"
-msgstr "Version {0} publiée"
-
 #: src/pyams_content/workflow/__init__.py:71
 msgid "Proposed"
 msgstr "Publication demandée"
@@ -4861,6 +4428,11 @@
 msgid "Refused"
 msgstr "Refusé"
 
+#: src/pyams_content/workflow/__init__.py:74
+#: src/pyams_content/workflow/basic.py:54
+msgid "Published"
+msgstr "Publié"
+
 #: src/pyams_content/workflow/__init__.py:75
 msgid "Retiring"
 msgstr "Retrait demandé"
@@ -4873,10 +4445,30 @@
 msgid "Archiving"
 msgstr "Archivage demandé"
 
+#: src/pyams_content/workflow/__init__.py:78
+#: src/pyams_content/workflow/basic.py:55
+msgid "Archived"
+msgstr "Archivé"
+
+#: src/pyams_content/workflow/__init__.py:79
+#: src/pyams_content/workflow/basic.py:56
+msgid "Deleted"
+msgstr "Supprimé"
+
+#: src/pyams_content/workflow/__init__.py:84
+#: src/pyams_content/workflow/basic.py:61
+msgid "draft created"
+msgstr "brouillon créé"
+
 #: src/pyams_content/workflow/__init__.py:85
 msgid "publication requested"
 msgstr "publication demandée"
 
+#: src/pyams_content/workflow/__init__.py:86
+#: src/pyams_content/workflow/basic.py:62
+msgid "published"
+msgstr "publié"
+
 #: src/pyams_content/workflow/__init__.py:87
 msgid "retiring requested"
 msgstr "retrait demandé"
@@ -4889,6 +4481,21 @@
 msgid "archiving requested"
 msgstr "archivage demandé"
 
+#: src/pyams_content/workflow/__init__.py:90
+#: src/pyams_content/workflow/basic.py:63
+msgid "archived"
+msgstr "archivé"
+
+#: src/pyams_content/workflow/__init__.py:279
+#: src/pyams_content/workflow/basic.py:190
+msgid "Initialize"
+msgstr "Création"
+
+#: src/pyams_content/workflow/__init__.py:282
+#: src/pyams_content/workflow/basic.py:193
+msgid "Draft creation"
+msgstr "Création du brouillon"
+
 #: src/pyams_content/workflow/__init__.py:285
 #: src/pyams_content/workflow/__init__.py:300
 msgid "Propose publication"
@@ -4967,6 +4574,17 @@
 msgid "State reset to 'refused' (automatic)"
 msgstr "Retour automatique en status 'refusé'"
 
+#: src/pyams_content/workflow/__init__.py:383
+#: src/pyams_content/workflow/basic.py:204
+msgid "Content published"
+msgstr "Publication"
+
+#: src/pyams_content/workflow/__init__.py:385
+#: src/pyams_content/workflow/basic.py:206
+#, python-format
+msgid "published the content « {0} »"
+msgstr "a publié le contenu « {0} »"
+
 #: src/pyams_content/workflow/__init__.py:389
 msgid "Request retiring"
 msgstr "Demander le retrait"
@@ -5036,6 +4654,22 @@
 msgid "cancelled the archive request for content « {0} »"
 msgstr "a annulé la demande d'archivage du contenu « {0} »"
 
+#: src/pyams_content/workflow/__init__.py:463
+#: src/pyams_content/workflow/basic.py:210
+msgid "Archive content"
+msgstr "Archiver"
+
+#: src/pyams_content/workflow/__init__.py:471
+#: src/pyams_content/workflow/basic.py:218
+msgid "Content archived"
+msgstr "Archivage"
+
+#: src/pyams_content/workflow/__init__.py:473
+#: src/pyams_content/workflow/basic.py:220
+#, python-format
+msgid "archived content « {0} »"
+msgstr "a archivé le contenu « {0} »"
+
 #: src/pyams_content/workflow/__init__.py:477
 msgid "Archive published content"
 msgstr "Archivage automatique d'un contenu publié"
@@ -5054,6 +4688,44 @@
 msgid "Archive retired content"
 msgstr "Archivage automatique d'un contenu retiré"
 
+#: src/pyams_content/workflow/__init__.py:509
+#: src/pyams_content/workflow/__init__.py:521
+#: src/pyams_content/workflow/__init__.py:533
+#: src/pyams_content/workflow/__init__.py:545
+#: src/pyams_content/workflow/__init__.py:557
+#: src/pyams_content/workflow/basic.py:232
+#: src/pyams_content/workflow/basic.py:244
+msgid "New version created"
+msgstr "Création d'une nouvelle version"
+
+#: src/pyams_content/workflow/__init__.py:569
+#: src/pyams_content/workflow/basic.py:256
+msgid "Version deleted"
+msgstr "Version supprimée"
+
+#: src/pyams_content/workflow/__init__.py:622
+#: src/pyams_content/workflow/__init__.py:644
+#: src/pyams_content/workflow/basic.py:289
+#: src/pyams_content/workflow/basic.py:311
+msgid "Unknown state"
+msgstr "(statut inconnu)"
+
+#: src/pyams_content/workflow/__init__.py:646
+#: src/pyams_content/workflow/basic.py:313
+msgid "publication refused"
+msgstr "publication refusée"
+
+#: src/pyams_content/workflow/__init__.py:642
+#: src/pyams_content/workflow/basic.py:309
+msgid "new version created"
+msgstr "nouvelle version en préparation"
+
+#: src/pyams_content/workflow/__init__.py:249
+#: src/pyams_content/workflow/basic.py:160
+#, python-format
+msgid "Published version {0}"
+msgstr "Version {0} publiée"
+
 #: src/pyams_content/workflow/task.py:62
 msgid "Automatic contents withdrawal:\n"
 msgstr ""
@@ -5067,6 +4739,640 @@
 msgid "Add automatic content archiver"
 msgstr "Ajout d'une tâche d'archivage automatique"
 
+#: src/pyams_content/skin/zmi/viewlet/toplinks/__init__.py:46
+msgid "Shared sites"
+msgstr "Sites et blogs"
+
+#: src/pyams_content/skin/zmi/viewlet/toplinks/__init__.py:67
+msgid "Shared contents"
+msgstr "Gabarits"
+
+#: src/pyams_content/skin/zmi/viewlet/toplinks/__init__.py:90
+msgid "Shared tools"
+msgstr "Outils"
+
+#: src/pyams_content/skin/zmi/viewlet/toplinks/__init__.py:113
+msgid "My roles"
+msgstr "Mes rôles"
+
+#: src/pyams_content/skin/zmi/viewlet/toplinks/templates/user-addings.pt:7
+msgid "Create new content"
+msgstr "Créer un nouveau contenu"
+
+#: src/pyams_content/interfaces/__init__.py:95
+msgid "Unique key"
+msgstr "Clé unique"
+
+#: src/pyams_content/interfaces/__init__.py:96
+msgid ""
+"WARNING: this key can't be modified after creation!!! Spaces, uppercase "
+"letters ou accentuated characters will be replaced automatically."
+msgstr ""
+"ATTENTION : cette clé ne pourra plus être modifiée après sa création. Les "
+"espaces, les majuscules, les lettres accentuées et les caractères spéciaux "
+"seront remplacées automatiquement."
+
+#: src/pyams_content/interfaces/__init__.py:105
+msgid "Short name"
+msgstr "Fil d'Ariane"
+
+#: src/pyams_content/interfaces/__init__.py:106
+msgid "Short name used in breadcrumbs"
+msgstr "Libellé utilisé dans le fil d'Ariane"
+
+#: src/pyams_content/interfaces/__init__.py:117
+msgid "Modification date"
+msgstr "Dernière modification apportée"
+
+#: src/pyams_content/reference/zmi/table.py:73
+msgid "Contents"
+msgstr "Contenu"
+
+#: src/pyams_content/reference/zmi/table.py:83
+msgid "Table contents"
+msgstr "Contenu de la table"
+
+#: src/pyams_content/reference/zmi/table.py:129
+#: src/pyams_content/reference/zmi/__init__.py:69
+msgid "References tables"
+msgstr "Tables de références"
+
+#: src/pyams_content/reference/zmi/table.py:143
+msgid "Properties..."
+msgstr "Propriétés"
+
+#: src/pyams_content/reference/zmi/table.py:157
+msgid "Edit table properties"
+msgstr "Propriétés de la table"
+
+#: src/pyams_content/reference/zmi/table.py:167
+msgid "Table management"
+msgstr "Gérer cette table"
+
+#: src/pyams_content/reference/zmi/__init__.py:51
+msgid "References"
+msgstr "Tables de réf."
+
+#: src/pyams_content/reference/pictograms/zmi/__init__.py:169
+#: src/pyams_content/reference/pictograms/zmi/widget.py:55
+msgid "Default header: --"
+msgstr "En-tête par défaut : --"
+
+#: src/pyams_content/reference/pictograms/zmi/manager.py:51
+msgid "Pictograms selection..."
+msgstr "Sélection de pictogrammes"
+
+#: src/pyams_content/reference/pictograms/zmi/manager.py:63
+#: src/pyams_content/reference/pictograms/zmi/templates/manager-selection.pt:34
+#: src/pyams_content/reference/pictograms/interfaces/__init__.py:73
+msgid "Selected pictograms"
+msgstr "Pictogrammes sélectionnés"
+
+#: src/pyams_content/reference/pictograms/zmi/templates/manager-selection.pt:7
+msgid "Available pictograms"
+msgstr "Pictogrammes disponibles"
+
+#: src/pyams_content/reference/pictograms/zmi/templates/manager-selection.pt:21
+#: src/pyams_content/reference/pictograms/zmi/templates/manager-selection.pt:48
+msgid "Display pictogram properties"
+msgstr "Propriétés du pictogramme"
+
+#: src/pyams_content/reference/pictograms/zmi/templates/pictogram-header.pt:6
+msgid "Default header: ${header}"
+msgstr "En-tête par défaut : ${header}"
+
+#: src/pyams_content/reference/pictograms/interfaces/__init__.py:45
+msgid "Pictogram content"
+msgstr "Utilisez le bouton \"Parcourir\" pour modifier le contenu de l'image"
+
+#. Default: Header
+#: src/pyams_content/reference/pictograms/interfaces/__init__.py:52
+msgid "pictogram-header"
+msgstr "En-tête par défaut"
+
+#: src/pyams_content/reference/pictograms/interfaces/__init__.py:53
+msgid "Default header associated with this pictogram"
+msgstr "En-tête par défaut associé à ce pictogramme"
+
+#: src/pyams_content/reference/pictograms/interfaces/__init__.py:74
+msgid "List of selected pictograms which will be available to shared contents"
+msgstr "Liste des pictogrammes proposés dans les contenus partagés"
+
+#: src/pyams_content/features/renderer/zmi/__init__.py:70
+#: src/pyams_content/features/renderer/zmi/templates/renderer-input.pt:4
+msgid "Edit renderer properties"
+msgstr "Propriétés du mode de rendu"
+
+#: src/pyams_content/features/renderer/skin/__init__.py:67
+msgid "Hidden content"
+msgstr "Contenu non affiché"
+
+#: src/pyams_content/features/checker/interfaces.py:27
+#, python-format
+msgid " - {field}: <span class=\"text-danger\">no value</span>"
+msgstr " - {field} : <span class=\"text-danger\">non renseigné</span>"
+
+#: src/pyams_content/features/checker/interfaces.py:28
+#, python-format
+msgid " - {field} ({lang}): <span class=\"text-danger\">no value</span>"
+msgstr " - {field} ({lang}) : <span class=\"text-danger\">non renseigné</span>"
+
+#: src/pyams_content/features/checker/interfaces.py:29
+#, python-format
+msgid " - {field}: <span class=\"text-danger\">{message}</span>"
+msgstr " - {field} : <span class=\"text-danger\">{message}</span>"
+
+#: src/pyams_content/features/checker/zmi/__init__.py:58
+msgid "Content check"
+msgstr "Audit du contenu"
+
+#: src/pyams_content/features/checker/zmi/__init__.py:82
+msgid "No checker available. This content is clean!"
+msgstr "Pas de vérificateur disponible. Ce contenu est propre !"
+
+#: src/pyams_content/features/checker/zmi/__init__.py:78
+#, python-format
+msgid "{0}:"
+msgstr "{0} :"
+
+#: src/pyams_content/features/preview/zmi/__init__.py:62
+msgid "Content preview"
+msgstr "Aperçu du contenu"
+
+#: src/pyams_content/features/preview/zmi/__init__.py:67
+#, python-format
+msgid "{title} ({preview})"
+msgstr "{title} ({preview})"
+
+#: src/pyams_content/features/preview/zmi/__init__.py:68
+msgid "preview"
+msgstr "aperçu"
+
+#: src/pyams_content/features/alert/interfaces.py:40
+msgid "Success"
+msgstr "Levée d'alerte"
+
+#: src/pyams_content/features/alert/interfaces.py:41
+msgid "Information"
+msgstr "Information"
+
+#: src/pyams_content/features/alert/interfaces.py:42
+msgid "Warning"
+msgstr "Avertissement"
+
+#: src/pyams_content/features/alert/interfaces.py:43
+msgid "Danger"
+msgstr "Danger !"
+
+#: src/pyams_content/features/alert/interfaces.py:55
+msgid "Is this alert visible in front-office?"
+msgstr "Si 'non', cette alerte ne sera pas présentée aux internautes"
+
+#: src/pyams_content/features/alert/interfaces.py:59
+msgid "Alert gravity"
+msgstr "Niveau de gravité"
+
+#: src/pyams_content/features/alert/interfaces.py:60
+msgid "Alert gravity will affect rendered alert style"
+msgstr "Le niveau de gravité choisi affectera le style de rendu de l'alerte"
+
+#. Default: Heading
+#: src/pyams_content/features/alert/interfaces.py:65
+#: src/pyams_content/features/alert/zmi/container.py:157
+msgid "alert-header"
+msgstr "En-tête"
+
+#: src/pyams_content/features/alert/interfaces.py:66
+msgid "Short alert header (Alert, Important...)"
+msgstr "En-tête de l'alerte (« Alerte », « Important », « Prudence »...)"
+
+#: src/pyams_content/features/alert/interfaces.py:69
+#: src/pyams_content/features/alert/zmi/container.py:169
+msgid "Message"
+msgstr "Message"
+
+#: src/pyams_content/features/alert/interfaces.py:70
+msgid "Alert message"
+msgstr "Le message d'alerte doit être assez court et explicite"
+
+#: src/pyams_content/features/alert/interfaces.py:74
+msgid ""
+"Internal link target reference. You can search a reference using '+' "
+"followed by internal number, of by entering text matching content title."
+msgstr ""
+"Référence interne vers la cible du lien. Vous pouvez la rechercher par des "
+"mots de son titre, ou par son numéro interne (précédé d'un '+') ; le titre "
+"d'origine peut être modifié en utilisant le titre de substitution."
+
+#: src/pyams_content/features/alert/interfaces.py:86
+msgid "Display start date"
+msgstr "Date d'affichage"
+
+#: src/pyams_content/features/alert/interfaces.py:87
+msgid "First date at which alert should be displayed"
+msgstr ""
+"Première date à laquelle l'alerte sera affichée. Laissez la zone vide pour "
+"qu'elle soit affichée immédiatement."
+
+#: src/pyams_content/features/alert/interfaces.py:90
+msgid "Display end date"
+msgstr "Date de retrait"
+
+#: src/pyams_content/features/alert/interfaces.py:91
+msgid "Last date at which alert should be displayed"
+msgstr ""
+"Dernière date à laquelle l'alerte sera affichée. Laissez la zone vide pour "
+"qu'elle ne soit pas retirée."
+
+#: src/pyams_content/features/alert/interfaces.py:94
+msgid "Maximum interval"
+msgstr "Intervalle d'affichage"
+
+#: src/pyams_content/features/alert/interfaces.py:95
+msgid ""
+"Maximum interval between alert displays on a given device, given in hours; "
+"set to 0 to always display the alert"
+msgstr ""
+"Cet intervalle est donné en heures ; passé ce délai, pour un internaute "
+"donné, l'alerte apparaîtra à nouveau. Si aucun intervalle n'est indiqué, "
+"l'alerte s'affichera en permanence."
+
+#: src/pyams_content/features/alert/zmi/__init__.py:45
+msgid "Add alert"
+msgstr "Ajouter une alerte"
+
+#: src/pyams_content/features/alert/zmi/__init__.py:56
+msgid "Add new alert"
+msgstr "Ajout d'une alerte"
+
+#: src/pyams_content/features/alert/zmi/__init__.py:79
+msgid "Edit alert properties"
+msgstr "Propriétés de l'alerte"
+
+#: src/pyams_content/features/alert/zmi/container.py:55
+msgid "Alerts"
+msgstr "Alertes"
+
+#: src/pyams_content/features/alert/zmi/container.py:191
+msgid "Alert list"
+msgstr "Liste des alertes"
+
+#: src/pyams_content/features/alert/zmi/container.py:90
+msgid "No currently defined alert."
+msgstr "Aucune alerte n'est définie actuellement."
+
+#: src/pyams_content/features/menu/zmi/__init__.py:81
+msgid "Add menu..."
+msgstr "Ajouter un menu"
+
+#: src/pyams_content/features/menu/zmi/__init__.py:92
+msgid "Add new menu"
+msgstr "Ajout d'un menu"
+
+#: src/pyams_content/features/menu/zmi/__init__.py:123
+msgid "Edit menu properties"
+msgstr "Propriétés du menu"
+
+#: src/pyams_content/features/menu/zmi/__init__.py:110
+msgid "Menu was correctly added."
+msgstr "Le menu a été ajouté."
+
+#: src/pyams_content/features/menu/zmi/__init__.py:388
+msgid "Link was correctly added."
+msgstr "Le lien a été ajouté."
+
+#: src/pyams_content/features/menu/zmi/templates/menu-name-cell.pt:7
+msgid "Click to see menu items"
+msgstr "Montrer ou cacher les éléments du menu"
+
+#: src/pyams_content/features/menu/portlet/navigation/simple.py:68
+msgid "Simple navigation"
+msgstr "Navigation à un niveau"
+
+#: src/pyams_content/features/menu/portlet/navigation/double.py:68
+msgid "Double navigation"
+msgstr "Navigation à deux niveaux"
+
+#: src/pyams_content/features/menu/portlet/navigation/zmi/simple.py:69
+msgid "Navigation links"
+msgstr "Liens de navigation"
+
+#: src/pyams_content/features/menu/portlet/navigation/zmi/double.py:69
+msgid "Navigation menus"
+msgstr "Menus de navigation"
+
+#: src/pyams_content/features/menu/portlet/navigation/zmi/templates/double-preview.pt:15
+#: src/pyams_content/features/menu/portlet/navigation/zmi/templates/simple-preview.pt:12
+msgid "Link has no illustration"
+msgstr "Le lien n'a pas d'illustration"
+
+#: src/pyams_content/features/menu/portlet/navigation/interfaces/simple.py:32
+#: src/pyams_content/features/menu/portlet/navigation/interfaces/double.py:32
+msgid "Portlet main title"
+msgstr "Titre du composant"
+
+#: src/pyams_content/features/menu/portlet/navigation/interfaces/simple.py:35
+#: src/pyams_content/features/menu/portlet/navigation/interfaces/double.py:35
+msgid "Subtitle"
+msgstr "Sous-titre"
+
+#: src/pyams_content/features/menu/portlet/navigation/interfaces/simple.py:36
+#: src/pyams_content/features/menu/portlet/navigation/interfaces/double.py:36
+msgid "Portlet subtitle"
+msgstr "Sous-titre du composant"
+
+#: src/pyams_content/features/menu/interfaces/__init__.py:64
+msgid "Menu title"
+msgstr "Libellé"
+
+#: src/pyams_content/features/menu/interfaces/__init__.py:65
+msgid "Displayed menu label"
+msgstr "Libellé du menu"
+
+#: src/pyams_content/features/menu/interfaces/__init__.py:69
+msgid "Direct reference to menu target"
+msgstr ""
+"Lorsque le menu est utilisé dans l'en-tête de page, référence interne vers "
+"la cible du menu (site ou rubrique) permettant de mettre en évidence le menu "
+"actif ; un lien sera également créé vers cette référence si le menu ne "
+"contient aucun lien."
+
+#: src/pyams_content/features/footer/zmi/__init__.py:60
+msgid "Page footer"
+msgstr "Pied de pages"
+
+#: src/pyams_content/features/footer/zmi/__init__.py:78
+msgid "Edit footer settings"
+msgstr "Paramétrage des pieds de pages"
+
+#: src/pyams_content/features/footer/zmi/__init__.py:152
+msgid ""
+"WARNING: Footer properties are saved automatically when changing inherit "
+"mode!!"
+msgstr ""
+"ATTENTION : les propriétés du pied de page sont enregistrées automatiquement "
+"lorsque vous modifiez le mode d'héritage !!"
+
+#: src/pyams_content/features/footer/zmi/__init__.py:220
+msgid "Footer renderer settings"
+msgstr "Propriétés du mode de rendu"
+
+#: src/pyams_content/features/footer/zmi/__init__.py:107
+msgid "Don't inherit parent footer"
+msgstr "Ne pas hériter du pied de pages du parent"
+
+#: src/pyams_content/features/footer/skin/__init__.py:84
+msgid "Hidden footer"
+msgstr "Ne pas afficher de pied de pages"
+
+#: src/pyams_content/features/footer/interfaces/__init__.py:39
+msgid "Footer template"
+msgstr "Mode de rendu"
+
+#: src/pyams_content/features/footer/interfaces/__init__.py:40
+msgid "Presentation template used for this footer"
+msgstr "Mode de rendu utilisé par ce pied de page"
+
+#: src/pyams_content/features/review/__init__.py:181
+#, python-format
+msgid "Request comment: {comment}"
+msgstr "Commentaire joint : {comment}"
+
+#: src/pyams_content/features/review/__init__.py:211
+#, python-format
+msgid "A new comment was added on content « {0} »"
+msgstr "Un nouveau commentaire a été ajouté pour le contenu « {0} »"
+
+#: src/pyams_content/features/review/__init__.py:168
+#, python-format
+msgid "[{service_name}] A content review is requested"
+msgstr "[{service_name}] Demande de relecture"
+
+#: src/pyams_content/features/review/interfaces.py:32
+msgid "Review request"
+msgstr "Demande de relecture"
+
+#: src/pyams_content/features/review/interfaces.py:33
+msgid "Reviewer comment"
+msgstr "Commentaire"
+
+#: src/pyams_content/features/review/interfaces.py:56
+msgid "Comment writer"
+msgstr "Rédacteur"
+
+#: src/pyams_content/features/review/interfaces.py:59
+msgid "Content reviewers"
+msgstr "Relecteurs sollicités"
+
+#: src/pyams_content/features/review/interfaces.py:62
+msgid "Comment type"
+msgstr "Type de commentaire"
+
+#: src/pyams_content/features/review/interfaces.py:67
+msgid "Comment body"
+msgstr "Commentaire"
+
+#: src/pyams_content/features/review/interfaces.py:70
+msgid "Reviewer comment?"
+msgstr "Commentaire d'un relecteur ?"
+
+#: src/pyams_content/features/review/interfaces.py:86
+msgid "Reviewers list"
+msgstr "Liste des relecteurs"
+
+#: src/pyams_content/features/review/interfaces.py:87
+msgid "List of principals which reviewed the comment"
+msgstr "Liste des utilisateurs qui ont apporté des commentaires sur ce contenu"
+
+#: src/pyams_content/features/review/zmi/__init__.py:61
+msgid "Ask for review..."
+msgstr "Demander une relecture"
+
+#: src/pyams_content/features/review/zmi/__init__.py:100
+msgid "Content review request"
+msgstr "Demande de relecture"
+
+#: src/pyams_content/features/review/zmi/__init__.py:165
+msgid "Comments"
+msgstr "Commentaires"
+
+#: src/pyams_content/features/review/zmi/__init__.py:185
+msgid "Review comments"
+msgstr "Commentaires associés à cette version"
+
+#: src/pyams_content/features/review/zmi/__init__.py:71
+msgid "Sought principals"
+msgstr "Relecteurs sollicités"
+
+#: src/pyams_content/features/review/zmi/__init__.py:72
+msgid "List of principals from which a review is requested"
+msgstr ""
+"Liste des utilisateurs que vous souhaitez solliciter par mail pour relire ce "
+"contenu"
+
+#: src/pyams_content/features/review/zmi/__init__.py:75
+msgid "Comment"
+msgstr "Commentaire"
+
+#: src/pyams_content/features/review/zmi/__init__.py:76
+msgid "Comment associated with this request"
+msgstr ""
+"Ce commentaire associé à cette demande sera également transmis par mail"
+
+#: src/pyams_content/features/review/zmi/__init__.py:79
+msgid "Notify all reviewers"
+msgstr "Notifier tous les relecteurs"
+
+#: src/pyams_content/features/review/zmi/__init__.py:80
+msgid ""
+"If 'yes', selected reviewers will be notified by mail of your request, even "
+"if they were already members of the reviewers group. Otherwise, only new "
+"reviewers will be notified"
+msgstr ""
+"Si 'oui', tous les relecteurs sollicités seront notifiés par mail de votre "
+"demande, même s'ils avaient déjà été sollicités auparavant. Dans le cas "
+"contraire, seuls les nouveaux relecteurs seront notifiés."
+
+#: src/pyams_content/features/review/zmi/__init__.py:91
+msgid "Ask for content review"
+msgstr "Demander la relecture"
+
+#: src/pyams_content/features/review/zmi/__init__.py:146
+msgid "Request successful. No new notification have been sent"
+msgstr ""
+"Votre demande a été transmise. Aucune nouvelle notification n'a été envoyée."
+
+#: src/pyams_content/features/review/zmi/__init__.py:259
+msgid "Message is mandatory!"
+msgstr "Un commentaire est obligatoire !"
+
+#: src/pyams_content/features/review/zmi/__init__.py:134
+#, python-format
+msgid "Request successful. {count} new notification(s) have been sent"
+msgstr "Votre demande a été transmise. {count} notification(s) envoyée(s)."
+
+#: src/pyams_content/features/review/zmi/templates/review-comments.pt:32
+#: src/pyams_content/features/review/zmi/templates/review-comments-json.pt:15
+#: src/pyams_content/features/review/zmi/templates/review-add-comment.pt:14
+msgid "Review query from"
+msgstr "Demande de relecture de "
+
+#: src/pyams_content/features/review/zmi/templates/review-comments.pt:38
+#: src/pyams_content/features/review/zmi/templates/review-comments-json.pt:21
+#: src/pyams_content/features/review/zmi/templates/review-add-comment.pt:20
+msgid "(as reviewer)"
+msgstr "(relecteur)"
+
+#: src/pyams_content/features/review/zmi/templates/review-comments.pt:47
+#: src/pyams_content/features/review/zmi/templates/review-comments-json.pt:30
+msgid "Selected reviewers:"
+msgstr "Auprès de :"
+
+#: src/pyams_content/features/review/zmi/templates/review-comments.pt:64
+msgid "Add comment"
+msgstr "Déposer un commentaire"
+
+#: src/pyams_content/features/review/zmi/templates/review-comments.pt:67
+msgid "Add a comment..."
+msgstr "Votre commentaire..."
+
+#: src/pyams_content/features/review/zmi/templates/review-comments.pt:73
+msgid "Add this comment"
+msgstr "Ajouter ce commentaire"
+
+#: src/pyams_content/features/review/zmi/templates/review-add-comment.pt:22
+msgid "just now"
+msgstr "À l'instant !"
+
+#: src/pyams_content/features/review/zmi/templates/review-notification.pt:4
+msgid "[${service_name}] You are requested for a content review"
+msgstr "[${service_name}] Demande de relecture"
+
+#: src/pyams_content/features/review/zmi/templates/review-notification.pt:30
+msgid "Hello,"
+msgstr "Bonjour,"
+
+#: src/pyams_content/features/review/zmi/templates/review-notification.pt:31
+msgid ""
+"You have been requested by ${sender}, contributor of « ${service_name} » "
+"website, to make a review of a content."
+msgstr ""
+"Vous êtes sollicité par ${sender}, contributeur du site internet "
+"${service_name}, qui souhaite recueillir votre commentaire à propos d'un "
+"contenu."
+
+#: src/pyams_content/features/review/zmi/templates/review-notification.pt:36
+msgid "${sender} added the following message to his request:"
+msgstr "${sender} a accompagné sa demande de relecture du message suivant :"
+
+#: src/pyams_content/features/review/zmi/templates/review-notification.pt:41
+msgid ""
+"To review and comment this publication, please use the following link: "
+"${target}."
+msgstr "Pour accéder à cette contribution, cliquer ici : ${target}."
+
+#: src/pyams_content/features/review/zmi/templates/review-notification.pt:44
+msgid "After reading this content, please use the « Comments » menu entry."
+msgstr ""
+"Lorsque vous aurez pris connaissance du contenu, cliquez sur « Commentaires "
+"» dans le menu en colonne de gauche."
+
+#: src/pyams_content/features/review/zmi/templates/review-notification.pt:45
+msgid ""
+"If you don't want to reply to this request, please contact ${sender} "
+"directly by replying to this mail."
+msgstr ""
+"Si vous ne souhaitez pas donner suite à cette demande, vous pouvez répondre "
+"directement à ${sender} en lui adressant un message dans ce sens."
+
+#: src/pyams_content/features/review/zmi/templates/review-notification.pt:47
+msgid "Thank you."
+msgstr "Merci."
+
+#: src/pyams_content/features/header/zmi/__init__.py:66
+msgid "Page header"
+msgstr "En-tête de pages"
+
+#: src/pyams_content/features/header/zmi/__init__.py:84
+msgid "Edit header settings"
+msgstr "Paramétrage des en-têtes de pages"
+
+#: src/pyams_content/features/header/zmi/__init__.py:161
+msgid ""
+"WARNING: Header properties are saved automatically when changing inherit "
+"mode!!"
+msgstr ""
+"ATTENTION : les propriétés de l'en-tête sont enregistrées automatiquement "
+"lorsque vous modifiez le mode d'héritage !!"
+
+#: src/pyams_content/features/header/zmi/__init__.py:229
+msgid "Header renderer settings"
+msgstr "Propriétés du mode de rendu"
+
+#: src/pyams_content/features/header/zmi/__init__.py:113
+msgid "Don't inherit parent header"
+msgstr "Ne pas hériter de l'en-tête de pages du parent"
+
+#: src/pyams_content/features/header/skin/__init__.py:90
+msgid "Hidden header"
+msgstr "Ne pas afficher d'en-tête de pages"
+
+#~ msgid "Image associated to this data type"
+#~ msgstr "Image associée à ce type"
+
+#~ msgid "Monochrome image"
+#~ msgstr "Image monochrome"
+
+#~ msgid "Reference to the view from which items are extracted"
+#~ msgstr ""
+#~ "Référence de la vue depuis laquelle est extraite la liste de contenus"
+
+#~ msgid "HTML content"
+#~ msgstr "Contenu HTML"
+
+#~ msgid "WARNING: this key can't be modified after creation!!!"
+#~ msgstr "ATTENTION : cette clé ne pourra plus être modifiée !!!"
+
 #~ msgid "Links"
 #~ msgstr "Liens"
 
@@ -5266,9 +5572,6 @@
 #~ msgid "The content « {0} » has been archived"
 #~ msgstr "Le contenu « {0} » a été archivé"
 
-#~ msgid "Publication settings"
-#~ msgstr "Dates de publication et de retrait"
-
 #~ msgid "Add new data subtype"
 #~ msgstr "Ajout d'un sous-type"
 
--- a/src/pyams_content/locales/pyams_content.pot	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/locales/pyams_content.pot	Tue Jul 17 15:09:38 2018 +0200
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE 1.0\n"
-"POT-Creation-Date: 2018-06-23 16:27+0200\n"
+"POT-Creation-Date: 2018-07-17 14:54+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -46,790 +46,137 @@
 msgstr ""
 
 #: ./src/pyams_content/__init__.py:53
+msgid "System manager (role)"
+msgstr ""
+
+#: ./src/pyams_content/__init__.py:60
 msgid "Webmaster (role)"
 msgstr ""
 
-#: ./src/pyams_content/__init__.py:62
+#: ./src/pyams_content/__init__.py:71
 msgid "Pilot (role)"
 msgstr ""
 
-#: ./src/pyams_content/__init__.py:70
+#: ./src/pyams_content/__init__.py:81
 msgid "Manager (role)"
 msgstr ""
 
-#: ./src/pyams_content/__init__.py:77
-msgid "Owner (role)"
-msgstr ""
-
-#: ./src/pyams_content/__init__.py:82
-msgid "Contributor (role)"
-msgstr ""
-
 #: ./src/pyams_content/__init__.py:90
+msgid "Owner (role)"
+msgstr ""
+
+#: ./src/pyams_content/__init__.py:95
+msgid "Contributor (role)"
+msgstr ""
+
+#: ./src/pyams_content/__init__.py:106
 msgid "Reader (role)"
 msgstr ""
 
-#: ./src/pyams_content/__init__.py:96
+#: ./src/pyams_content/__init__.py:116
 msgid "Operator (role)"
 msgstr ""
 
-#: ./src/pyams_content/__init__.py:100
+#: ./src/pyams_content/__init__.py:121
 msgid "Guest user (role)"
 msgstr ""
 
-#: ./src/pyams_content/reference/pictograms/interfaces/__init__.py:44
-#: ./src/pyams_content/component/extfile/__init__.py:223
-#: ./src/pyams_content/component/extfile/__init__.py:238
-#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:66
-#: ./src/pyams_content/shared/logo/interfaces/__init__.py:46
-msgid "Image"
-msgstr ""
-
-#: ./src/pyams_content/reference/pictograms/interfaces/__init__.py:45
-msgid "Pictogram content"
-msgstr ""
-
-#: ./src/pyams_content/reference/pictograms/interfaces/__init__.py:48
-#: ./src/pyams_content/component/gallery/interfaces/__init__.py:54
-#: ./src/pyams_content/component/illustration/interfaces/__init__.py:56
-msgid "Accessibility title"
-msgstr ""
-
-#: ./src/pyams_content/reference/pictograms/interfaces/__init__.py:49
-#: ./src/pyams_content/component/illustration/interfaces/__init__.py:57
-msgid "Alternate title used to describe image content"
-msgstr ""
-
-#. Default: Header
-#: ./src/pyams_content/reference/pictograms/interfaces/__init__.py:52
-msgid "pictogram-header"
-msgstr ""
-
-#: ./src/pyams_content/reference/pictograms/interfaces/__init__.py:53
-msgid "Default header associated with this pictogram"
-msgstr ""
-
-#: ./src/pyams_content/reference/pictograms/interfaces/__init__.py:73
-#: ./src/pyams_content/reference/pictograms/zmi/manager.py:63
-#: ./src/pyams_content/reference/pictograms/zmi/templates/manager-selection.pt:34
-msgid "Selected pictograms"
-msgstr ""
-
-#: ./src/pyams_content/reference/pictograms/interfaces/__init__.py:74
-msgid "List of selected pictograms which will be available to shared contents"
-msgstr ""
-
-#: ./src/pyams_content/reference/pictograms/zmi/__init__.py:59
-#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:304
-msgid "Add pictogram"
-msgstr ""
-
-#: ./src/pyams_content/reference/pictograms/zmi/__init__.py:71
-#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:317
-msgid "Add new pictogram"
-msgstr ""
-
-#: ./src/pyams_content/reference/pictograms/zmi/__init__.py:95
-#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:359
-msgid "Edit pictogram properties"
-msgstr ""
-
-#: ./src/pyams_content/reference/pictograms/zmi/__init__.py:150
-#: ./src/pyams_content/interfaces/__init__.py:99
-#: ./src/pyams_content/features/menu/portlet/navigation/interfaces/simple.py:31
-#: ./src/pyams_content/features/menu/portlet/navigation/interfaces/double.py:31
-#: ./src/pyams_content/component/gallery/interfaces/__init__.py:94
-#: ./src/pyams_content/component/paragraph/interfaces/milestone.py:45
-#: ./src/pyams_content/component/paragraph/zmi/container.py:223
-#: ./src/pyams_content/component/paragraph/zmi/milestone.py:231
-#: ./src/pyams_content/component/links/zmi/reverse.py:73
-#: ./src/pyams_content/component/keynumber/portlet/interfaces/__init__.py:31
-#: ./src/pyams_content/shared/imagemap/zmi/container.py:123
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:109
-#: ./src/pyams_content/shared/common/zmi/templates/advanced-search.pt:188
-#: ./src/pyams_content/shared/site/zmi/folder.py:70
-#: ./src/pyams_content/root/zmi/templates/advanced-search.pt:188
-msgid "Title"
-msgstr ""
-
-#: ./src/pyams_content/reference/pictograms/zmi/__init__.py:169
-#: ./src/pyams_content/reference/pictograms/zmi/widget.py:55
-msgid "Default header: --"
-msgstr ""
-
-#: ./src/pyams_content/reference/pictograms/zmi/manager.py:51
-msgid "Pictograms selection..."
-msgstr ""
-
-#: ./src/pyams_content/reference/pictograms/zmi/templates/manager-selection.pt:7
-msgid "Available pictograms"
-msgstr ""
-
-#: ./src/pyams_content/reference/pictograms/zmi/templates/manager-selection.pt:21
-#: ./src/pyams_content/reference/pictograms/zmi/templates/manager-selection.pt:48
-msgid "Display pictogram properties"
-msgstr ""
-
-#: ./src/pyams_content/reference/pictograms/zmi/templates/pictogram-header.pt:6
-msgid "Default header: ${header}"
-msgstr ""
-
-#: ./src/pyams_content/reference/zmi/__init__.py:51
-msgid "References"
-msgstr ""
-
-#: ./src/pyams_content/reference/zmi/__init__.py:69
-#: ./src/pyams_content/reference/zmi/table.py:129
-msgid "References tables"
-msgstr ""
-
-#: ./src/pyams_content/reference/zmi/table.py:73
-msgid "Contents"
-msgstr ""
-
-#: ./src/pyams_content/reference/zmi/table.py:83
-msgid "Table contents"
-msgstr ""
-
-#: ./src/pyams_content/reference/zmi/table.py:143
-msgid "Properties..."
-msgstr ""
-
-#: ./src/pyams_content/reference/zmi/table.py:157
-msgid "Edit table properties"
-msgstr ""
-
-#: ./src/pyams_content/reference/zmi/table.py:167
-msgid "Table management"
-msgstr ""
-
-#: ./src/pyams_content/interfaces/__init__.py:95
-msgid "Unique key"
-msgstr ""
-
-#: ./src/pyams_content/interfaces/__init__.py:96
-msgid "WARNING: this key can't be modified after creation!!!"
-msgstr ""
-
-#: ./src/pyams_content/interfaces/__init__.py:100
-#: ./src/pyams_content/shared/site/zmi/folder.py:71
-msgid "Visible label used to display content"
-msgstr ""
-
-#: ./src/pyams_content/interfaces/__init__.py:103
-msgid "Short name"
-msgstr ""
-
-#: ./src/pyams_content/interfaces/__init__.py:104
-msgid "Short name used in breadcrumbs"
-msgstr ""
-
-#: ./src/pyams_content/interfaces/__init__.py:111
-#: ./src/pyams_content/features/review/interfaces.py:74
-#: ./src/pyams_content/shared/view/interfaces/__init__.py:40
-msgid "Creation date"
-msgstr ""
-
-#: ./src/pyams_content/interfaces/__init__.py:115
-msgid "Modification date"
-msgstr ""
-
-#: ./src/pyams_content/skin/zmi/viewlet/toplinks/__init__.py:46
-msgid "Shared sites"
-msgstr ""
-
-#: ./src/pyams_content/skin/zmi/viewlet/toplinks/__init__.py:67
-msgid "Shared contents"
-msgstr ""
-
-#: ./src/pyams_content/skin/zmi/viewlet/toplinks/__init__.py:90
-msgid "Shared tools"
-msgstr ""
-
-#: ./src/pyams_content/skin/zmi/viewlet/toplinks/__init__.py:113
-msgid "My roles"
-msgstr ""
-
-#: ./src/pyams_content/skin/zmi/viewlet/toplinks/templates/user-addings.pt:7
-msgid "Create new content"
-msgstr ""
-
-#: ./src/pyams_content/profile/interfaces/__init__.py:33
-msgid "User favorites"
-msgstr ""
-
-#: ./src/pyams_content/profile/interfaces/__init__.py:34
-msgid "List of internal numbers of shared contents stored for quick access"
-msgstr ""
-
-#: ./src/pyams_content/profile/interfaces/__init__.py:37
-msgid "Default table length"
-msgstr ""
-
-#: ./src/pyams_content/profile/interfaces/__init__.py:38
-msgid "Default length used for inner tables and dashboards"
-msgstr ""
-
-#: ./src/pyams_content/profile/zmi/__init__.py:42
-msgid "Admin. profile"
-msgstr ""
-
-#: ./src/pyams_content/features/menu/interfaces/__init__.py:58
-#: ./src/pyams_content/features/alert/interfaces.py:54
-#: ./src/pyams_content/component/paragraph/interfaces/pictogram.py:41
-#: ./src/pyams_content/component/paragraph/interfaces/milestone.py:40
-#: ./src/pyams_content/component/paragraph/interfaces/__init__.py:44
-#: ./src/pyams_content/component/association/interfaces/__init__.py:42
-#: ./src/pyams_content/component/keynumber/interfaces/__init__.py:39
-#: ./src/pyams_content/shared/form/interfaces/__init__.py:87
-#: ./src/pyams_content/shared/site/interfaces/__init__.py:117
-msgid "Visible?"
-msgstr ""
-
-#: ./src/pyams_content/features/menu/interfaces/__init__.py:59
-#: ./src/pyams_content/component/association/interfaces/__init__.py:43
-msgid "Is this item visible in front-office?"
-msgstr ""
-
-#: ./src/pyams_content/features/menu/interfaces/__init__.py:63
-msgid "Menu title"
-msgstr ""
-
-#: ./src/pyams_content/features/menu/interfaces/__init__.py:64
-msgid "Displayed menu label"
-msgstr ""
-
-#: ./src/pyams_content/features/menu/zmi/__init__.py:81
-msgid "Add menu..."
-msgstr ""
-
-#: ./src/pyams_content/features/menu/zmi/__init__.py:92
-msgid "Add new menu"
-msgstr ""
-
-#: ./src/pyams_content/features/menu/zmi/__init__.py:123
-msgid "Edit menu properties"
-msgstr ""
-
-#: ./src/pyams_content/features/menu/zmi/__init__.py:208
-#: ./src/pyams_content/shared/form/interfaces/__init__.py:62
-#: ./src/pyams_content/shared/form/zmi/field.py:159
-#: ./src/pyams_content/shared/common/interfaces/types.py:40
-#: ./src/pyams_content/shared/common/zmi/templates/preview-input.pt:34
-#: ./src/pyams_content/shared/common/zmi/templates/check-input.pt:34
-msgid "Label"
-msgstr ""
-
-#: ./src/pyams_content/features/menu/zmi/__init__.py:110
-msgid "Menu was correctly added."
-msgstr ""
-
-#: ./src/pyams_content/features/menu/zmi/__init__.py:388
-msgid "Link was correctly added."
-msgstr ""
-
-#: ./src/pyams_content/features/menu/zmi/templates/menu-name-cell.pt:7
-msgid "Click to see menu items"
-msgstr ""
-
-#: ./src/pyams_content/features/menu/portlet/navigation/simple.py:68
-msgid "Simple navigation"
-msgstr ""
-
-#: ./src/pyams_content/features/menu/portlet/navigation/double.py:68
-msgid "Double navigation"
-msgstr ""
-
-#: ./src/pyams_content/features/menu/portlet/navigation/interfaces/simple.py:32
-#: ./src/pyams_content/features/menu/portlet/navigation/interfaces/double.py:32
-msgid "Portlet main title"
-msgstr ""
-
-#: ./src/pyams_content/features/menu/portlet/navigation/interfaces/simple.py:35
-#: ./src/pyams_content/features/menu/portlet/navigation/interfaces/double.py:35
-msgid "Subtitle"
-msgstr ""
-
-#: ./src/pyams_content/features/menu/portlet/navigation/interfaces/simple.py:36
-#: ./src/pyams_content/features/menu/portlet/navigation/interfaces/double.py:36
-msgid "Portlet subtitle"
-msgstr ""
-
-#: ./src/pyams_content/features/menu/portlet/navigation/zmi/simple.py:70
-msgid "Navigation links"
-msgstr ""
-
-#: ./src/pyams_content/features/menu/portlet/navigation/zmi/double.py:70
-msgid "Navigation menus"
-msgstr ""
-
-#: ./src/pyams_content/features/menu/portlet/navigation/zmi/templates/simple-preview.pt:9
-#: ./src/pyams_content/features/menu/portlet/navigation/zmi/templates/double-preview.pt:12
-#: ./src/pyams_content/component/keynumber/portlet/zmi/templates/keynumber-preview.pt:27
-msgid "Link target is not published!"
-msgstr ""
-
-#: ./src/pyams_content/features/menu/portlet/navigation/zmi/templates/simple-preview.pt:13
-msgid "Link has no illustration"
-msgstr ""
-
-#: ./src/pyams_content/features/checker/interfaces.py:27
-#, python-format
-msgid " - {field}: <span class=\"text-danger\">no value</span>"
-msgstr ""
-
-#: ./src/pyams_content/features/checker/interfaces.py:28
-#, python-format
-msgid " - {field} ({lang}): <span class=\"text-danger\">no value</span>"
-msgstr ""
-
-#: ./src/pyams_content/features/checker/interfaces.py:29
-#, python-format
-msgid " - {field}: <span class=\"text-danger\">{message}</span>"
-msgstr ""
-
-#: ./src/pyams_content/features/checker/zmi/__init__.py:43
-#: ./src/pyams_content/shared/common/zmi/templates/check-input.pt:39
-msgid "Audit"
-msgstr ""
-
-#: ./src/pyams_content/features/checker/zmi/__init__.py:58
-msgid "Content check"
-msgstr ""
-
-#: ./src/pyams_content/features/checker/zmi/__init__.py:82
-msgid "No checker available. This content is clean!"
-msgstr ""
-
-#: ./src/pyams_content/features/checker/zmi/__init__.py:78
-#, python-format
-msgid "{0}:"
-msgstr ""
-
-#: ./src/pyams_content/features/alert/interfaces.py:40
-msgid "Success"
-msgstr ""
-
-#: ./src/pyams_content/features/alert/interfaces.py:41
-msgid "Information"
-msgstr ""
-
-#: ./src/pyams_content/features/alert/interfaces.py:42
-msgid "Warning"
-msgstr ""
-
-#: ./src/pyams_content/features/alert/interfaces.py:43
-msgid "Danger"
-msgstr ""
-
-#: ./src/pyams_content/features/alert/interfaces.py:55
-msgid "Is this alert visible in front-office?"
-msgstr ""
-
-#: ./src/pyams_content/features/alert/interfaces.py:59
-msgid "Alert gravity"
-msgstr ""
-
-#: ./src/pyams_content/features/alert/interfaces.py:60
-msgid "Alert gravity will affect rendered alert style"
-msgstr ""
-
-#. Default: Heading
-#: ./src/pyams_content/features/alert/interfaces.py:65
-#: ./src/pyams_content/features/alert/zmi/container.py:157
-msgid "alert-header"
-msgstr ""
-
-#: ./src/pyams_content/features/alert/interfaces.py:66
-msgid "Short alert header (Alert, Important...)"
-msgstr ""
-
-#: ./src/pyams_content/features/alert/interfaces.py:69
-#: ./src/pyams_content/features/alert/zmi/container.py:169
-msgid "Message"
-msgstr ""
-
-#: ./src/pyams_content/features/alert/interfaces.py:70
-msgid "Alert message"
-msgstr ""
-
-#: ./src/pyams_content/features/alert/interfaces.py:73
-#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:95
-msgid "Internal reference"
-msgstr ""
-
-#: ./src/pyams_content/features/alert/interfaces.py:74
-msgid ""
-"Internal link target reference. You can search a reference using '+' followed"
-" by internal number, of by entering text matching content title."
-msgstr ""
-
-#: ./src/pyams_content/features/alert/interfaces.py:79
-#: ./src/pyams_content/component/paragraph/interfaces/pictogram.py:46
-#: ./src/pyams_content/component/links/interfaces/__init__.py:43
-#: ./src/pyams_content/shared/common/interfaces/types.py:68
-msgid "Pictogram"
-msgstr ""
-
-#: ./src/pyams_content/features/alert/interfaces.py:80
-#: ./src/pyams_content/component/paragraph/interfaces/pictogram.py:47
-msgid "Name of the pictogram to select"
-msgstr ""
-
-#: ./src/pyams_content/features/alert/interfaces.py:86
-msgid "Display start date"
-msgstr ""
-
-#: ./src/pyams_content/features/alert/interfaces.py:87
-msgid "First date at which alert should be displayed"
-msgstr ""
-
-#: ./src/pyams_content/features/alert/interfaces.py:90
-msgid "Display end date"
-msgstr ""
-
-#: ./src/pyams_content/features/alert/interfaces.py:91
-msgid "Last date at which alert should be displayed"
-msgstr ""
-
-#: ./src/pyams_content/features/alert/interfaces.py:94
-msgid "Maximum interval"
-msgstr ""
-
-#: ./src/pyams_content/features/alert/interfaces.py:95
-msgid ""
-"Maximum interval between alert displays on a given device, given in hours; "
-"set to 0 to always display the alert"
-msgstr ""
-
-#: ./src/pyams_content/features/alert/zmi/container.py:55
-msgid "Alerts"
-msgstr ""
-
-#: ./src/pyams_content/features/alert/zmi/container.py:191
-msgid "Alert list"
-msgstr ""
-
-#: ./src/pyams_content/features/alert/zmi/container.py:90
-msgid "No currently defined alert."
-msgstr ""
-
-#: ./src/pyams_content/features/alert/zmi/__init__.py:45
-msgid "Add alert"
-msgstr ""
-
-#: ./src/pyams_content/features/alert/zmi/__init__.py:56
-msgid "Add new alert"
-msgstr ""
-
-#: ./src/pyams_content/features/alert/zmi/__init__.py:79
-msgid "Edit alert properties"
-msgstr ""
-
-#: ./src/pyams_content/features/preview/zmi/__init__.py:45
-#: ./src/pyams_content/component/paragraph/zmi/__init__.py:207
-#: ./src/pyams_content/shared/common/zmi/templates/preview-input.pt:39
-msgid "Preview"
-msgstr ""
-
-#: ./src/pyams_content/features/preview/zmi/__init__.py:62
-msgid "Content preview"
-msgstr ""
-
-#: ./src/pyams_content/features/preview/zmi/__init__.py:67
-#, python-format
-msgid "{title} ({preview})"
-msgstr ""
-
-#: ./src/pyams_content/features/preview/zmi/__init__.py:68
-msgid "preview"
-msgstr ""
-
-#: ./src/pyams_content/features/renderer/skin/__init__.py:67
-msgid "Hidden content"
-msgstr ""
-
-#: ./src/pyams_content/features/renderer/zmi/__init__.py:70
-#: ./src/pyams_content/features/renderer/zmi/templates/renderer-input.pt:4
-msgid "Edit renderer properties"
-msgstr ""
-
-#: ./src/pyams_content/features/header/interfaces/__init__.py:39
-#: ./src/pyams_content/component/paragraph/interfaces/header.py:43
-msgid "Header template"
-msgstr ""
-
-#: ./src/pyams_content/features/header/interfaces/__init__.py:40
-#: ./src/pyams_content/component/paragraph/interfaces/header.py:44
-msgid "Presentation template used for this header"
-msgstr ""
-
-#: ./src/pyams_content/features/header/skin/__init__.py:53
-msgid "Hidden header"
-msgstr ""
-
-#: ./src/pyams_content/features/header/zmi/__init__.py:66
-msgid "Page header"
-msgstr ""
-
-#: ./src/pyams_content/features/header/zmi/__init__.py:84
-msgid "Edit header settings"
-msgstr ""
-
-#: ./src/pyams_content/features/header/zmi/__init__.py:161
-msgid ""
-"WARNING: Header properties are saved automatically when changing inherit "
-"mode!!"
-msgstr ""
-
-#: ./src/pyams_content/features/header/zmi/__init__.py:229
-msgid "Header renderer settings"
-msgstr ""
-
-#: ./src/pyams_content/features/header/zmi/__init__.py:113
-msgid "Don't inherit parent header"
-msgstr ""
-
-#: ./src/pyams_content/features/footer/interfaces/__init__.py:39
-msgid "Footer template"
-msgstr ""
-
-#: ./src/pyams_content/features/footer/interfaces/__init__.py:40
-msgid "Presentation template used for this footer"
-msgstr ""
-
-#: ./src/pyams_content/features/footer/skin/__init__.py:53
-msgid "Hidden footer"
-msgstr ""
-
-#: ./src/pyams_content/features/footer/zmi/__init__.py:60
-msgid "Page footer"
-msgstr ""
-
-#: ./src/pyams_content/features/footer/zmi/__init__.py:78
-msgid "Edit footer settings"
-msgstr ""
-
-#: ./src/pyams_content/features/footer/zmi/__init__.py:152
-msgid ""
-"WARNING: Footer properties are saved automatically when changing inherit "
-"mode!!"
-msgstr ""
-
-#: ./src/pyams_content/features/footer/zmi/__init__.py:220
-msgid "Footer renderer settings"
-msgstr ""
-
-#: ./src/pyams_content/features/footer/zmi/__init__.py:107
-msgid "Don't inherit parent footer"
-msgstr ""
-
-#: ./src/pyams_content/features/review/interfaces.py:32
-msgid "Review request"
-msgstr ""
-
-#: ./src/pyams_content/features/review/interfaces.py:33
-msgid "Reviewer comment"
-msgstr ""
-
-#: ./src/pyams_content/features/review/interfaces.py:56
-msgid "Comment writer"
-msgstr ""
-
-#: ./src/pyams_content/features/review/interfaces.py:59
-msgid "Content reviewers"
-msgstr ""
-
-#: ./src/pyams_content/features/review/interfaces.py:62
-msgid "Comment type"
-msgstr ""
-
-#: ./src/pyams_content/features/review/interfaces.py:67
-msgid "Comment body"
-msgstr ""
-
-#: ./src/pyams_content/features/review/interfaces.py:70
-msgid "Reviewer comment?"
-msgstr ""
-
-#: ./src/pyams_content/features/review/interfaces.py:86
-msgid "Reviewers list"
-msgstr ""
-
-#: ./src/pyams_content/features/review/interfaces.py:87
-msgid "List of principals which reviewed the comment"
-msgstr ""
-
-#: ./src/pyams_content/features/review/__init__.py:181
-#, python-format
-msgid "Request comment: {comment}"
-msgstr ""
-
-#: ./src/pyams_content/features/review/__init__.py:211
-#, python-format
-msgid "A new comment was added on content « {0} »"
-msgstr ""
-
-#: ./src/pyams_content/features/review/__init__.py:168
-#, python-format
-msgid "[{service_name}] A content review is requested"
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/__init__.py:61
-msgid "Ask for review..."
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/__init__.py:100
-msgid "Content review request"
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/__init__.py:166
-msgid "Comments"
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/__init__.py:186
-msgid "Review comments"
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/__init__.py:71
-msgid "Sought principals"
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/__init__.py:72
-msgid "List of principals from which a review is requested"
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/__init__.py:75
-msgid "Comment"
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/__init__.py:76
-msgid "Comment associated with this request"
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/__init__.py:79
-msgid "Notify all reviewers"
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/__init__.py:80
-msgid ""
-"If 'yes', selected reviewers will be notified by mail of your request, even "
-"if they were already members of the reviewers group. Otherwise, only new "
-"reviewers will be notified"
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/__init__.py:90
-#: ./src/pyams_content/component/paragraph/zmi/__init__.py:212
-#: ./src/pyams_content/shared/common/zmi/owner.py:73
-#: ./src/pyams_content/shared/common/zmi/__init__.py:275
-#: ./src/pyams_content/shared/common/zmi/workflow.py:122
-#: ./src/pyams_content/shared/common/zmi/workflow.py:209
-#: ./src/pyams_content/shared/common/zmi/workflow.py:249
-#: ./src/pyams_content/shared/common/zmi/workflow.py:303
-#: ./src/pyams_content/shared/common/zmi/workflow.py:392
-#: ./src/pyams_content/shared/common/zmi/workflow.py:448
-#: ./src/pyams_content/shared/common/zmi/workflow.py:488
-#: ./src/pyams_content/shared/common/zmi/workflow.py:529
-#: ./src/pyams_content/shared/common/zmi/workflow.py:572
-#: ./src/pyams_content/shared/common/zmi/workflow.py:612
-#: ./src/pyams_content/shared/common/zmi/workflow.py:653
-#: ./src/pyams_content/shared/common/zmi/workflow.py:704
-msgid "Cancel"
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/__init__.py:91
-msgid "Ask for content review"
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/__init__.py:147
-msgid "Request successful. No new notification have been sent"
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/__init__.py:260
-msgid "Message is mandatory!"
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/__init__.py:135
-#, python-format
-msgid "Request successful. {count} new notification(s) have been sent"
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/templates/review-comments-json.pt:15
-#: ./src/pyams_content/features/review/zmi/templates/review-add-comment.pt:14
-#: ./src/pyams_content/features/review/zmi/templates/review-comments.pt:32
-msgid "Review query from"
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/templates/review-comments-json.pt:21
-#: ./src/pyams_content/features/review/zmi/templates/review-add-comment.pt:20
-#: ./src/pyams_content/features/review/zmi/templates/review-comments.pt:38
-msgid "(as reviewer)"
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/templates/review-comments-json.pt:30
-#: ./src/pyams_content/features/review/zmi/templates/review-comments.pt:47
-msgid "Selected reviewers:"
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/templates/review-notification.pt:4
-msgid "[${service_name}] You are requested for a content review"
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/templates/review-notification.pt:30
-msgid "Hello,"
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/templates/review-notification.pt:31
-msgid ""
-"You have been requested by ${sender}, contributor of « ${service_name} » "
-"website, to make a review of a content."
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/templates/review-notification.pt:36
-msgid "${sender} added the following message to his request:"
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/templates/review-notification.pt:41
-msgid ""
-"To review and comment this publication, please use the following link: "
-"${target}."
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/templates/review-notification.pt:44
-msgid "After reading this content, please use the « Comments » menu entry."
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/templates/review-notification.pt:45
-msgid ""
-"If you don't want to reply to this request, please contact ${sender} directly"
-" by replying to this mail."
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/templates/review-notification.pt:47
-msgid "Thank you."
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/templates/review-add-comment.pt:22
-msgid "just now"
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/templates/review-comments.pt:64
-msgid "Add comment"
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/templates/review-comments.pt:67
-msgid "Add a comment..."
-msgstr ""
-
-#: ./src/pyams_content/features/review/zmi/templates/review-comments.pt:73
-msgid "Add this comment"
-msgstr ""
-
 #: ./src/pyams_content/component/gallery/__init__.py:154
 msgid "Gallery"
 msgstr ""
 
-#: ./src/pyams_content/component/gallery/interfaces/__init__.py:130
+#: ./src/pyams_content/component/gallery/zmi/file.py:60
+#: ./src/pyams_content/component/gallery/zmi/file.py:72
+#: ./src/pyams_content/component/gallery/zmi/paragraph.py:155
+msgid "Add media(s)"
+msgstr ""
+
+#: ./src/pyams_content/component/gallery/zmi/file.py:182
+msgid "Update media properties"
+msgstr ""
+
+#: ./src/pyams_content/component/gallery/zmi/file.py:236
+msgid "Remove media..."
+msgstr ""
+
+#: ./src/pyams_content/component/gallery/zmi/file.py:146
+msgid "Show/hide media"
+msgstr ""
+
+#: ./src/pyams_content/component/gallery/zmi/file.py:203
+msgid "Audio content"
+msgstr ""
+
+#: ./src/pyams_content/component/gallery/zmi/paragraph.py:57
+msgid "Medias gallery..."
+msgstr ""
+
+#: ./src/pyams_content/component/gallery/zmi/paragraph.py:70
+msgid "Add new gallery"
+msgstr ""
+
+#: ./src/pyams_content/component/gallery/zmi/paragraph.py:92
+msgid "Edit gallery properties"
+msgstr ""
+
+#: ./src/pyams_content/component/gallery/zmi/__init__.py:63
+msgid "Update gallery properties"
+msgstr ""
+
+#: ./src/pyams_content/component/gallery/zmi/__init__.py:90
+msgid "Update gallery contents"
+msgstr ""
+
+#: ./src/pyams_content/component/gallery/zmi/interfaces.py:36
+msgid "Images or videos data"
+msgstr ""
+
+#: ./src/pyams_content/component/gallery/zmi/interfaces.py:37
+msgid "You can upload a single file or choose to upload a whole ZIP archive"
+msgstr ""
+
+#: ./src/pyams_content/component/gallery/zmi/interfaces.py:40
+#: ./src/pyams_content/component/gallery/interfaces/__init__.py:61
+#: ./src/pyams_content/component/extfile/interfaces/__init__.py:44
+#: ./src/pyams_content/component/illustration/interfaces/__init__.py:68
+#: ./src/pyams_content/component/paragraph/interfaces/video.py:52
+#: ./src/pyams_content/component/paragraph/interfaces/audio.py:52
+#: ./src/pyams_content/component/paragraph/interfaces/verbatim.py:44
+#: ./src/pyams_content/component/video/interfaces/__init__.py:52
+msgid "Author"
+msgstr ""
+
+#: ./src/pyams_content/component/gallery/zmi/interfaces.py:41
+#: ./src/pyams_content/component/gallery/interfaces/__init__.py:62
+#: ./src/pyams_content/component/extfile/interfaces/__init__.py:45
+#: ./src/pyams_content/component/paragraph/interfaces/video.py:53
+#: ./src/pyams_content/component/paragraph/interfaces/audio.py:53
+#: ./src/pyams_content/component/video/interfaces/__init__.py:53
+msgid "Name of document's author"
+msgstr ""
+
+#: ./src/pyams_content/component/gallery/zmi/interfaces.py:44
+msgid "Author comments"
+msgstr ""
+
+#: ./src/pyams_content/component/gallery/zmi/interfaces.py:45
+#: ./src/pyams_content/component/gallery/interfaces/__init__.py:66
+msgid "Comments relatives to author's rights management"
+msgstr ""
+
+#: ./src/pyams_content/component/gallery/zmi/templates/gallery-medias.pt:11
+msgid "Gallery medias"
+msgstr ""
+
+#: ./src/pyams_content/component/gallery/zmi/templates/gallery-medias.pt:17
+msgid "Download medias"
+msgstr ""
+
+#: ./src/pyams_content/component/gallery/zmi/templates/gallery-medias.pt:41
+msgid "Zoom image"
+msgstr ""
+
+#: ./src/pyams_content/component/gallery/interfaces/__init__.py:133
 msgid "Medias gallery"
 msgstr ""
 
@@ -846,58 +193,40 @@
 msgstr ""
 
 #: ./src/pyams_content/component/gallery/interfaces/__init__.py:51
+#: ./src/pyams_content/component/illustration/interfaces/__init__.py:53
 #: ./src/pyams_content/component/paragraph/interfaces/video.py:45
+#: ./src/pyams_content/component/paragraph/interfaces/audio.py:45
 #: ./src/pyams_content/component/video/interfaces/__init__.py:75
-#: ./src/pyams_content/component/illustration/interfaces/__init__.py:53
 msgid "Legend"
 msgstr ""
 
+#: ./src/pyams_content/component/gallery/interfaces/__init__.py:54
+#: ./src/pyams_content/component/illustration/interfaces/__init__.py:56
+#: ./src/pyams_content/reference/pictograms/interfaces/__init__.py:48
+msgid "Accessibility title"
+msgstr ""
+
 #: ./src/pyams_content/component/gallery/interfaces/__init__.py:55
 msgid "Alternate title used to describe media content"
 msgstr ""
 
 #: ./src/pyams_content/component/gallery/interfaces/__init__.py:58
-#: ./src/pyams_content/component/gallery/interfaces/__init__.py:98
+#: ./src/pyams_content/component/gallery/interfaces/__init__.py:101
 #: ./src/pyams_content/component/extfile/interfaces/__init__.py:40
+#: ./src/pyams_content/component/illustration/interfaces/__init__.py:64
 #: ./src/pyams_content/component/paragraph/interfaces/video.py:48
-#: ./src/pyams_content/component/paragraph/interfaces/audio.py:44
+#: ./src/pyams_content/component/paragraph/interfaces/audio.py:48
 #: ./src/pyams_content/component/links/interfaces/__init__.py:39
 #: ./src/pyams_content/component/video/interfaces/__init__.py:48
-#: ./src/pyams_content/component/illustration/interfaces/__init__.py:64
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:154
 #: ./src/pyams_content/shared/form/interfaces/__init__.py:66
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:149
 msgid "Description"
 msgstr ""
 
-#: ./src/pyams_content/component/gallery/interfaces/__init__.py:61
-#: ./src/pyams_content/component/gallery/zmi/interfaces.py:40
-#: ./src/pyams_content/component/extfile/interfaces/__init__.py:44
-#: ./src/pyams_content/component/paragraph/interfaces/video.py:52
-#: ./src/pyams_content/component/paragraph/interfaces/verbatim.py:44
-#: ./src/pyams_content/component/paragraph/interfaces/audio.py:48
-#: ./src/pyams_content/component/video/interfaces/__init__.py:52
-#: ./src/pyams_content/component/illustration/interfaces/__init__.py:68
-msgid "Author"
-msgstr ""
-
-#: ./src/pyams_content/component/gallery/interfaces/__init__.py:62
-#: ./src/pyams_content/component/gallery/zmi/interfaces.py:41
-#: ./src/pyams_content/component/extfile/interfaces/__init__.py:45
-#: ./src/pyams_content/component/paragraph/interfaces/video.py:53
-#: ./src/pyams_content/component/paragraph/interfaces/audio.py:49
-#: ./src/pyams_content/component/video/interfaces/__init__.py:53
-msgid "Name of document's author"
-msgstr ""
-
 #: ./src/pyams_content/component/gallery/interfaces/__init__.py:65
 msgid "Author's comments"
 msgstr ""
 
-#: ./src/pyams_content/component/gallery/interfaces/__init__.py:66
-#: ./src/pyams_content/component/gallery/zmi/interfaces.py:45
-msgid "Comments relatives to author's rights management"
-msgstr ""
-
 #: ./src/pyams_content/component/gallery/interfaces/__init__.py:69
 msgid "Source ID"
 msgstr ""
@@ -908,7 +237,7 @@
 
 #: ./src/pyams_content/component/gallery/interfaces/__init__.py:73
 #: ./src/pyams_content/component/extfile/interfaces/__init__.py:89
-#: ./src/pyams_content/component/paragraph/interfaces/audio.py:52
+#: ./src/pyams_content/component/paragraph/interfaces/audio.py:41
 msgid "Audio data"
 msgstr ""
 
@@ -940,120 +269,53 @@
 msgid "If 'no', this media won't be displayed in front office"
 msgstr ""
 
-#: ./src/pyams_content/component/gallery/interfaces/__init__.py:95
+#: ./src/pyams_content/component/gallery/interfaces/__init__.py:97
+#: ./src/pyams_content/component/keynumber/portlet/interfaces/__init__.py:31
+#: ./src/pyams_content/component/paragraph/zmi/milestone.py:232
+#: ./src/pyams_content/component/paragraph/zmi/container.py:252
+#: ./src/pyams_content/component/paragraph/interfaces/milestone.py:45
+#: ./src/pyams_content/component/links/zmi/reverse.py:73
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:109
+#: ./src/pyams_content/shared/common/zmi/templates/advanced-search.pt:188
+#: ./src/pyams_content/shared/view/portlet/interfaces.py:56
+#: ./src/pyams_content/shared/imagemap/zmi/container.py:123
+#: ./src/pyams_content/shared/site/zmi/folder.py:70
+#: ./src/pyams_content/root/zmi/templates/advanced-search.pt:188
+#: ./src/pyams_content/interfaces/__init__.py:101
+#: ./src/pyams_content/reference/pictograms/zmi/__init__.py:150
+#: ./src/pyams_content/features/menu/portlet/navigation/interfaces/simple.py:31
+#: ./src/pyams_content/features/menu/portlet/navigation/interfaces/double.py:31
+msgid "Title"
+msgstr ""
+
+#: ./src/pyams_content/component/gallery/interfaces/__init__.py:98
 msgid "Gallery title, as shown in front-office"
 msgstr ""
 
-#: ./src/pyams_content/component/gallery/interfaces/__init__.py:99
-msgid "Gallery description displayed by front-office template"
-msgstr ""
-
 #: ./src/pyams_content/component/gallery/interfaces/__init__.py:102
+msgid "Gallery description displayed by front-office template"
+msgstr ""
+
+#: ./src/pyams_content/component/gallery/interfaces/__init__.py:105
 msgid "Gallery template"
 msgstr ""
 
-#: ./src/pyams_content/component/gallery/interfaces/__init__.py:103
+#: ./src/pyams_content/component/gallery/interfaces/__init__.py:106
 msgid "Presentation template used for this gallery"
 msgstr ""
 
-#: ./src/pyams_content/component/gallery/zmi/interfaces.py:36
-msgid "Images or videos data"
-msgstr ""
-
-#: ./src/pyams_content/component/gallery/zmi/interfaces.py:37
-msgid "You can upload a single file or choose to upload a whole ZIP archive"
-msgstr ""
-
-#: ./src/pyams_content/component/gallery/zmi/interfaces.py:44
-msgid "Author comments"
-msgstr ""
-
-#: ./src/pyams_content/component/gallery/zmi/paragraph.py:56
-msgid "Medias gallery..."
-msgstr ""
-
-#: ./src/pyams_content/component/gallery/zmi/paragraph.py:69
-msgid "Add new gallery"
-msgstr ""
-
-#: ./src/pyams_content/component/gallery/zmi/paragraph.py:96
-msgid "Edit gallery properties"
-msgstr ""
-
-#: ./src/pyams_content/component/gallery/zmi/paragraph.py:164
-#: ./src/pyams_content/component/gallery/zmi/file.py:57
-#: ./src/pyams_content/component/gallery/zmi/file.py:69
-msgid "Add media(s)"
-msgstr ""
-
-#: ./src/pyams_content/component/gallery/zmi/__init__.py:63
-msgid "Update gallery properties"
-msgstr ""
-
-#: ./src/pyams_content/component/gallery/zmi/__init__.py:95
-msgid "Update gallery contents"
-msgstr ""
-
-#: ./src/pyams_content/component/gallery/zmi/file.py:184
-msgid "Update media properties"
-msgstr ""
-
-#: ./src/pyams_content/component/gallery/zmi/file.py:238
-msgid "Remove media..."
-msgstr ""
-
-#: ./src/pyams_content/component/gallery/zmi/file.py:148
-msgid "Show/hide media"
-msgstr ""
-
-#: ./src/pyams_content/component/gallery/zmi/file.py:211
-msgid "Audio content"
-msgstr ""
-
-#: ./src/pyams_content/component/gallery/zmi/templates/gallery-medias.pt:11
-msgid "Gallery medias"
-msgstr ""
-
-#: ./src/pyams_content/component/gallery/zmi/templates/gallery-medias.pt:17
-msgid "Download medias"
-msgstr ""
-
-#: ./src/pyams_content/component/gallery/zmi/templates/gallery-medias.pt:41
-msgid "Zoom image"
-msgstr ""
-
-#: ./src/pyams_content/component/theme/__init__.py:65
-#: ./src/pyams_content/component/theme/interfaces/__init__.py:43
-#: ./src/pyams_content/component/theme/zmi/portlet.py:40
-msgid "Themes"
-msgstr ""
-
-#: ./src/pyams_content/component/theme/__init__.py:74
-msgid "no defined theme"
-msgstr ""
-
-#: ./src/pyams_content/component/theme/zmi/__init__.py:51
-#: ./src/pyams_content/shared/view/zmi/theme.py:48
-msgid "Themes..."
-msgstr ""
-
-#: ./src/pyams_content/component/theme/zmi/__init__.py:63
-msgid "Content themes"
-msgstr ""
-
-#: ./src/pyams_content/component/theme/zmi/manager.py:45
-msgid "Themes settings..."
-msgstr ""
-
-#: ./src/pyams_content/component/theme/zmi/manager.py:59
-msgid "Selected themes"
-msgstr ""
-
 #: ./src/pyams_content/component/extfile/__init__.py:172
 #: ./src/pyams_content/component/extfile/__init__.py:176
 msgid "Standard file"
 msgstr ""
 
+#: ./src/pyams_content/component/extfile/__init__.py:223
+#: ./src/pyams_content/component/extfile/__init__.py:238
+#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:67
+#: ./src/pyams_content/reference/pictograms/interfaces/__init__.py:44
+msgid "Image"
+msgstr ""
+
 #: ./src/pyams_content/component/extfile/__init__.py:253
 #: ./src/pyams_content/component/extfile/__init__.py:257
 #: ./src/pyams_content/component/paragraph/interfaces/video.py:34
@@ -1065,10 +327,78 @@
 msgid "Audio file"
 msgstr ""
 
+#: ./src/pyams_content/component/extfile/zmi/__init__.py:74
+msgid "External files"
+msgstr ""
+
+#: ./src/pyams_content/component/extfile/zmi/__init__.py:89
+msgid "Add external file"
+msgstr ""
+
+#: ./src/pyams_content/component/extfile/zmi/__init__.py:103
+msgid "Add new external file"
+msgstr ""
+
+#: ./src/pyams_content/component/extfile/zmi/__init__.py:133
+msgid "Update file properties"
+msgstr ""
+
+#: ./src/pyams_content/component/extfile/zmi/__init__.py:161
+msgid "Images"
+msgstr ""
+
+#: ./src/pyams_content/component/extfile/zmi/__init__.py:176
+msgid "Add image"
+msgstr ""
+
+#: ./src/pyams_content/component/extfile/zmi/__init__.py:190
+msgid "Add new image"
+msgstr ""
+
+#: ./src/pyams_content/component/extfile/zmi/__init__.py:221
+msgid "Update image properties"
+msgstr ""
+
+#: ./src/pyams_content/component/extfile/zmi/__init__.py:254
+msgid "Videos"
+msgstr ""
+
+#: ./src/pyams_content/component/extfile/zmi/__init__.py:269
+msgid "Add video"
+msgstr ""
+
+#: ./src/pyams_content/component/extfile/zmi/__init__.py:283
+msgid "Add new video"
+msgstr ""
+
+#: ./src/pyams_content/component/extfile/zmi/__init__.py:307
+msgid "Update video properties"
+msgstr ""
+
+#: ./src/pyams_content/component/extfile/zmi/__init__.py:333
+msgid "Audios files"
+msgstr ""
+
+#: ./src/pyams_content/component/extfile/zmi/__init__.py:348
+msgid "Add audio file"
+msgstr ""
+
+#: ./src/pyams_content/component/extfile/zmi/__init__.py:362
+msgid "Add new audio file"
+msgstr ""
+
+#: ./src/pyams_content/component/extfile/zmi/__init__.py:386
+msgid "Update audio file properties"
+msgstr ""
+
+#: ./src/pyams_content/component/extfile/zmi/__init__.py:50
+msgid "External file type"
+msgstr ""
+
 #: ./src/pyams_content/component/extfile/interfaces/__init__.py:36
 #: ./src/pyams_content/component/links/interfaces/__init__.py:35
-#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:54
-#: ./src/pyams_content/shared/site/interfaces/__init__.py:113
+#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:55
+#: ./src/pyams_content/shared/site/interfaces/__init__.py:114
 msgid "Alternate title"
 msgstr ""
 
@@ -1078,13 +408,13 @@
 
 #: ./src/pyams_content/component/extfile/interfaces/__init__.py:41
 #: ./src/pyams_content/component/paragraph/interfaces/video.py:49
-#: ./src/pyams_content/component/paragraph/interfaces/audio.py:45
+#: ./src/pyams_content/component/paragraph/interfaces/audio.py:49
 #: ./src/pyams_content/component/video/interfaces/__init__.py:49
 msgid "File description displayed by front-office template"
 msgstr ""
 
 #: ./src/pyams_content/component/extfile/interfaces/__init__.py:48
-#: ./src/pyams_content/component/links/interfaces/__init__.py:68
+#: ./src/pyams_content/component/links/interfaces/__init__.py:65
 msgid "Language"
 msgstr ""
 
@@ -1109,7 +439,7 @@
 msgstr ""
 
 #: ./src/pyams_content/component/extfile/interfaces/__init__.py:73
-#: ./src/pyams_content/shared/logo/interfaces/__init__.py:47
+#: ./src/pyams_content/shared/logo/interfaces/__init__.py:48
 msgid "Image data"
 msgstr ""
 
@@ -1127,76 +457,170 @@
 msgstr ""
 
 #: ./src/pyams_content/component/extfile/interfaces/__init__.py:90
-#: ./src/pyams_content/component/paragraph/interfaces/audio.py:53
+#: ./src/pyams_content/component/paragraph/interfaces/audio.py:42
 msgid "Audio file content"
 msgstr ""
 
-#: ./src/pyams_content/component/extfile/zmi/__init__.py:74
-msgid "External files"
-msgstr ""
-
-#: ./src/pyams_content/component/extfile/zmi/__init__.py:89
-msgid "Add external file"
-msgstr ""
-
-#: ./src/pyams_content/component/extfile/zmi/__init__.py:103
-msgid "Add new external file"
-msgstr ""
-
-#: ./src/pyams_content/component/extfile/zmi/__init__.py:138
-msgid "Update file properties"
-msgstr ""
-
-#: ./src/pyams_content/component/extfile/zmi/__init__.py:171
-msgid "Images"
-msgstr ""
-
-#: ./src/pyams_content/component/extfile/zmi/__init__.py:186
-msgid "Add image"
-msgstr ""
-
-#: ./src/pyams_content/component/extfile/zmi/__init__.py:200
-msgid "Add new image"
-msgstr ""
-
-#: ./src/pyams_content/component/extfile/zmi/__init__.py:231
-msgid "Update image properties"
-msgstr ""
-
-#: ./src/pyams_content/component/extfile/zmi/__init__.py:264
-msgid "Videos"
-msgstr ""
-
-#: ./src/pyams_content/component/extfile/zmi/__init__.py:279
-msgid "Add video"
-msgstr ""
-
-#: ./src/pyams_content/component/extfile/zmi/__init__.py:293
-msgid "Add new video"
-msgstr ""
-
-#: ./src/pyams_content/component/extfile/zmi/__init__.py:317
-msgid "Update video properties"
-msgstr ""
-
-#: ./src/pyams_content/component/extfile/zmi/__init__.py:343
-msgid "Audios files"
-msgstr ""
-
-#: ./src/pyams_content/component/extfile/zmi/__init__.py:358
-msgid "Add audio file"
-msgstr ""
-
-#: ./src/pyams_content/component/extfile/zmi/__init__.py:372
-msgid "Add new audio file"
-msgstr ""
-
-#: ./src/pyams_content/component/extfile/zmi/__init__.py:396
-msgid "Update audio file properties"
-msgstr ""
-
-#: ./src/pyams_content/component/extfile/zmi/__init__.py:50
-msgid "External file type"
+#: ./src/pyams_content/component/keynumber/__init__.py:189
+#: ./src/pyams_content/component/keynumber/zmi/__init__.py:199
+#: ./src/pyams_content/component/keynumber/portlet/zmi/__init__.py:74
+#: ./src/pyams_content/component/paragraph/interfaces/keynumber.py:29
+msgid "Key numbers"
+msgstr ""
+
+#. Default: Header
+#: ./src/pyams_content/component/keynumber/zmi/__init__.py:147
+#: ./src/pyams_content/component/keynumber/interfaces/__init__.py:44
+msgid "key-number-label"
+msgstr ""
+
+#: ./src/pyams_content/component/keynumber/zmi/__init__.py:159
+#: ./src/pyams_content/component/keynumber/interfaces/__init__.py:49
+msgid "Number"
+msgstr ""
+
+#. Default: Unit
+#: ./src/pyams_content/component/keynumber/zmi/__init__.py:168
+#: ./src/pyams_content/component/keynumber/interfaces/__init__.py:53
+msgid "key-number-unit"
+msgstr ""
+
+#: ./src/pyams_content/component/keynumber/zmi/__init__.py:180
+#: ./src/pyams_content/component/keynumber/interfaces/__init__.py:57
+#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:268
+#: ./src/pyams_content/component/paragraph/interfaces/pictogram.py:58
+msgid "Associated text"
+msgstr ""
+
+#: ./src/pyams_content/component/keynumber/zmi/__init__.py:218
+msgid "Add keynumber"
+msgstr ""
+
+#: ./src/pyams_content/component/keynumber/zmi/__init__.py:230
+msgid "Add new keynumber"
+msgstr ""
+
+#: ./src/pyams_content/component/keynumber/zmi/__init__.py:259
+msgid "Edit keynumber properties"
+msgstr ""
+
+#: ./src/pyams_content/component/keynumber/zmi/__init__.py:245
+msgid "Key number was correctly added"
+msgstr ""
+
+#: ./src/pyams_content/component/keynumber/portlet/__init__.py:71
+msgid "Key Numbers"
+msgstr ""
+
+#: ./src/pyams_content/component/keynumber/portlet/zmi/__init__.py:97
+#: ./src/pyams_content/component/keynumber/portlet/zmi/templates/keynumber-preview.pt:26
+msgid "Associated links"
+msgstr ""
+
+#: ./src/pyams_content/component/keynumber/portlet/zmi/templates/keynumber-preview.pt:31
+#: ./src/pyams_content/features/menu/portlet/navigation/zmi/templates/double-preview.pt:11
+#: ./src/pyams_content/features/menu/portlet/navigation/zmi/templates/simple-preview.pt:8
+msgid "Link target is not published!"
+msgstr ""
+
+#: ./src/pyams_content/component/keynumber/portlet/interfaces/__init__.py:32
+msgid "Portlet title"
+msgstr ""
+
+#: ./src/pyams_content/component/keynumber/portlet/interfaces/__init__.py:35
+msgid "Teaser"
+msgstr ""
+
+#: ./src/pyams_content/component/keynumber/portlet/interfaces/__init__.py:36
+msgid "Short text displayed above key numbers"
+msgstr ""
+
+#: ./src/pyams_content/component/keynumber/interfaces/__init__.py:39
+#: ./src/pyams_content/component/paragraph/interfaces/milestone.py:40
+#: ./src/pyams_content/component/paragraph/interfaces/__init__.py:44
+#: ./src/pyams_content/component/paragraph/interfaces/pictogram.py:41
+#: ./src/pyams_content/component/association/interfaces/__init__.py:42
+#: ./src/pyams_content/shared/form/interfaces/__init__.py:87
+#: ./src/pyams_content/shared/site/interfaces/__init__.py:118
+#: ./src/pyams_content/features/alert/interfaces.py:54
+#: ./src/pyams_content/features/menu/interfaces/__init__.py:59
+msgid "Visible?"
+msgstr ""
+
+#: ./src/pyams_content/component/keynumber/interfaces/__init__.py:40
+msgid "Is this key number visible in front-office?"
+msgstr ""
+
+#: ./src/pyams_content/component/keynumber/interfaces/__init__.py:45
+msgid ""
+"Small text to be displayed above number (according to selected renderer)"
+msgstr ""
+
+#: ./src/pyams_content/component/keynumber/interfaces/__init__.py:50
+msgid "Key number value"
+msgstr ""
+
+#: ./src/pyams_content/component/keynumber/interfaces/__init__.py:54
+msgid "Displayed unit"
+msgstr ""
+
+#: ./src/pyams_content/component/keynumber/interfaces/__init__.py:58
+msgid "The way this text will be rendered depends on presentation template"
+msgstr ""
+
+#: ./src/pyams_content/component/illustration/__init__.py:177
+#: ./src/pyams_content/component/illustration/thesaurus.py:32
+#: ./src/pyams_content/component/illustration/zmi/paragraph.py:158
+#: ./src/pyams_content/component/illustration/zmi/__init__.py:56
+#: ./src/pyams_content/component/illustration/zmi/__init__.py:100
+#: ./src/pyams_content/component/illustration/interfaces/__init__.py:99
+msgid "Illustration"
+msgstr ""
+
+#: ./src/pyams_content/component/illustration/zmi/paragraph.py:60
+msgid "Illustration..."
+msgstr ""
+
+#: ./src/pyams_content/component/illustration/zmi/paragraph.py:73
+msgid "Add new illustration"
+msgstr ""
+
+#: ./src/pyams_content/component/illustration/zmi/paragraph.py:98
+#: ./src/pyams_content/component/illustration/zmi/thesaurus.py:42
+msgid "Edit illustration properties"
+msgstr ""
+
+#: ./src/pyams_content/component/illustration/zmi/__init__.py:150
+msgid "Navigation link illustration"
+msgstr ""
+
+#: ./src/pyams_content/component/illustration/zmi/__init__.py:102
+msgid "Header illustration"
+msgstr ""
+
+#: ./src/pyams_content/component/illustration/interfaces/__init__.py:57
+#: ./src/pyams_content/reference/pictograms/interfaces/__init__.py:49
+msgid "Alternate title used to describe image content"
+msgstr ""
+
+#: ./src/pyams_content/component/illustration/interfaces/__init__.py:69
+msgid "Name of picture's author"
+msgstr ""
+
+#: ./src/pyams_content/component/illustration/interfaces/__init__.py:72
+msgid "Illustration template"
+msgstr ""
+
+#: ./src/pyams_content/component/illustration/interfaces/__init__.py:73
+msgid "Presentation template used for illustration"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/milestone.py:140
+msgid "Selected paragraph is missing"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/milestone.py:143
+msgid "Selected paragraph is not visible"
 msgstr ""
 
 #: ./src/pyams_content/component/paragraph/container.py:73
@@ -1211,23 +635,423 @@
 msgid "Selected pictogram is missing"
 msgstr ""
 
-#: ./src/pyams_content/component/paragraph/milestone.py:140
-msgid "Selected paragraph is missing"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/milestone.py:143
-msgid "Selected paragraph is not visible"
-msgstr ""
-
+#: ./src/pyams_content/component/paragraph/zmi/milestone.py:78
+msgid "Milestones..."
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/milestone.py:91
+msgid "Add new milestone paragraph"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/milestone.py:118
+msgid "Edit milestone paragraph properties"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/milestone.py:244
+#: ./src/pyams_content/component/paragraph/interfaces/milestone.py:49
+msgid "Associated label"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/milestone.py:256
+#: ./src/pyams_content/component/paragraph/interfaces/milestone.py:53
+msgid "Anchor"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/milestone.py:285
+#: ./src/pyams_content/component/paragraph/interfaces/milestone.py:76
+msgid "Milestones"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/milestone.py:300
+msgid "Add milestone"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/milestone.py:313
+msgid "Add new milestone"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/milestone.py:340
+msgid "Edit milestone properties"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/milestone.py:328
+msgid "Milestone was correctly added"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/milestone.py:271
+msgid "(missing paragraph)"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/keypoint.py:52
+msgid "Key points..."
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/keypoint.py:65
+msgid "Add new key points paragraph"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/keypoint.py:92
+msgid "Edit key points paragraph properties"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/__init__.py:65
+msgid "Content block types..."
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/__init__.py:79
+msgid "Content block types"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/__init__.py:89
+msgid ""
+"You can define which types of paragraphs are allowed in this container.\n"
+"\n"
+"Default paragraphs will be added automatically (in selected order) to any new created content.\n"
+"\n"
+"NOTICE: removing types from allowed types list will have no effect on already created contents!"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/__init__.py:207
+#: ./src/pyams_content/shared/common/zmi/templates/preview-input.pt:39
+#: ./src/pyams_content/features/preview/zmi/__init__.py:45
+msgid "Preview"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/__init__.py:212
+#: ./src/pyams_content/shared/common/zmi/workflow.py:123
+#: ./src/pyams_content/shared/common/zmi/workflow.py:210
+#: ./src/pyams_content/shared/common/zmi/workflow.py:250
+#: ./src/pyams_content/shared/common/zmi/workflow.py:304
+#: ./src/pyams_content/shared/common/zmi/workflow.py:393
+#: ./src/pyams_content/shared/common/zmi/workflow.py:449
+#: ./src/pyams_content/shared/common/zmi/workflow.py:489
+#: ./src/pyams_content/shared/common/zmi/workflow.py:530
+#: ./src/pyams_content/shared/common/zmi/workflow.py:573
+#: ./src/pyams_content/shared/common/zmi/workflow.py:613
+#: ./src/pyams_content/shared/common/zmi/workflow.py:654
+#: ./src/pyams_content/shared/common/zmi/workflow.py:705
+#: ./src/pyams_content/shared/common/zmi/__init__.py:273
+#: ./src/pyams_content/shared/common/zmi/owner.py:73
+#: ./src/pyams_content/features/review/zmi/__init__.py:90
+msgid "Cancel"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/__init__.py:214
+msgid "Submit"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/__init__.py:195
+msgid "Paragraph was correctly added."
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/video.py:54
+msgid "Video paragraph..."
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/video.py:67
+msgid "Add new video paragraph"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/video.py:90
+#: ./src/pyams_content/component/video/zmi/paragraph.py:189
+msgid "Edit video properties"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/container.py:74
+msgid "Contents..."
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/container.py:196
+msgid "Set navigation anchor"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/container.py:268
+msgid "Show/hide all paragraphs"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/container.py:316
+#: ./src/pyams_content/component/paragraph/zmi/container.py:325
+#: ./src/pyams_content/component/paragraph/zmi/container.py:338
+msgid "Content blocks"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/container.py:395
+msgid "Links and attachments..."
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/container.py:407
+msgid "Content blocks links and attachments"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/container.py:127
+msgid "No currently defined paragraph."
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/container.py:277
+msgid "Click to open/close all paragraphs editors"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/container.py:290
+msgid "Click to open/close paragraph editor"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/container.py:133
+msgid "Check allowed paragraph types to be able to create new paragraphs."
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:83
+msgid "Pictograms..."
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:96
+msgid "Add new pictogram paragraph"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:123
+msgid "Edit pictogram paragraph properties"
+msgstr ""
+
+#. Default: Header
+#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:253
+msgid "pictogram-item-header"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:290
 #: ./src/pyams_content/component/paragraph/interfaces/pictogram.py:80
-#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:289
 msgid "Pictograms"
 msgstr ""
 
+#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:305
+#: ./src/pyams_content/reference/pictograms/zmi/__init__.py:59
+msgid "Add pictogram"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:318
+#: ./src/pyams_content/reference/pictograms/zmi/__init__.py:71
+msgid "Add new pictogram"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:360
+#: ./src/pyams_content/reference/pictograms/zmi/__init__.py:95
+msgid "Edit pictogram properties"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:340
+msgid "Pictogram was correctly added"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:350
+#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:388
+msgid "You must select a pictogram!"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/audio.py:54
+msgid "Audio paragraph..."
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/audio.py:67
+msgid "Add new audio paragraph"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/audio.py:89
+msgid "Edit audio properties"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/keynumber.py:55
+msgid "Key numbers..."
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/keynumber.py:68
+msgid "Add new key number paragraph"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/keynumber.py:96
+msgid "Edit key number paragraph properties"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/frame.py:85
+msgid "Framed text..."
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/frame.py:99
+msgid "Add new framed text paragraph"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/frame.py:125
+msgid "Edit framed text paragraph properties"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/verbatim.py:57
+msgid "Verbatim..."
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/verbatim.py:70
+msgid "Add new verbatim paragraph"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/verbatim.py:92
+msgid "Edit verbatim paragraph properties"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/html.py:76
+msgid "Raw HTML..."
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/html.py:89
+msgid "Add new raw HTML paragraph"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/html.py:119
+msgid "Edit raw HTML paragraph properties"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/html.py:159
+msgid "Rich text..."
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/html.py:172
+msgid "Add new rich text paragraph"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/html.py:197
+msgid "Edit rich text paragraph properties"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/contact.py:53
+msgid "Contact card..."
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/contact.py:66
+msgid "Add new contact card"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/contact.py:89
+msgid "Edit contact card properties"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/header.py:50
+msgid "Header..."
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/header.py:63
+msgid "Add new header paragraph"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/zmi/header.py:90
+msgid "Edit header paragraph properties"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/milestone.py:41
+msgid "Is this milestone visible in front-office?"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/milestone.py:46
+msgid "Milestone title"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/milestone.py:50
+msgid "The way this label will be rendered depends on presentation template"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/milestone.py:54
+msgid "Paragraph to which this milestone should lead"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/milestone.py:83
+msgid "Milestones template"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/milestone.py:84
+msgid "Presentation template used for milestones"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/keypoint.py:33
+#: ./src/pyams_content/component/paragraph/interfaces/keypoint.py:40
+msgid "Key points"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/keypoint.py:41
+msgid "Enter one key point by line, without hyphen or prefix"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/keypoint.py:44
+msgid "Presentation template"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/keypoint.py:45
+#: ./src/pyams_content/component/paragraph/interfaces/frame.py:44
+#: ./src/pyams_content/component/paragraph/interfaces/verbatim.py:53
+#: ./src/pyams_content/component/paragraph/interfaces/html.py:46
+#: ./src/pyams_content/component/paragraph/interfaces/html.py:67
+#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:101
+#: ./src/pyams_content/shared/logo/interfaces/__init__.py:82
+msgid "Presentation template used for this paragraph"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/__init__.py:45
+msgid "Is this paragraph visible in front-office?"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/__init__.py:49
+msgid "Anchor?"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/__init__.py:50
+msgid "Is this paragraph a navigation anchor?"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/__init__.py:54
+msgid "§ Title"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/__init__.py:88
+msgid "Allowed paragraphs"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/__init__.py:89
+msgid "List of paragraphs allowed for this content type"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/__init__.py:93
+#: ./src/pyams_content/shared/common/zmi/types.py:173
+#: ./src/pyams_content/shared/common/zmi/types.py:413
+msgid "Default paragraphs"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/__init__.py:94
+msgid "List of paragraphs automatically added to a new content"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/video.py:42
+msgid "Video file content"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/video.py:56
+#: ./src/pyams_content/component/video/interfaces/__init__.py:78
+msgid "Video template"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/video.py:57
+#: ./src/pyams_content/component/video/interfaces/__init__.py:79
+msgid "Presentation template used for this video"
+msgstr ""
+
 #: ./src/pyams_content/component/paragraph/interfaces/pictogram.py:42
 msgid "Is this pictogram visible in front-office?"
 msgstr ""
 
+#: ./src/pyams_content/component/paragraph/interfaces/pictogram.py:46
+#: ./src/pyams_content/component/links/interfaces/__init__.py:43
+#: ./src/pyams_content/shared/common/interfaces/types.py:75
+#: ./src/pyams_content/features/alert/interfaces.py:79
+msgid "Pictogram"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/pictogram.py:47
+#: ./src/pyams_content/features/alert/interfaces.py:80
+msgid "Name of the pictogram to select"
+msgstr ""
+
 #: ./src/pyams_content/component/paragraph/interfaces/pictogram.py:53
 msgid "Alternate header"
 msgstr ""
@@ -1238,13 +1062,6 @@
 "used"
 msgstr ""
 
-#: ./src/pyams_content/component/paragraph/interfaces/pictogram.py:58
-#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:267
-#: ./src/pyams_content/component/keynumber/interfaces/__init__.py:57
-#: ./src/pyams_content/component/keynumber/zmi/__init__.py:179
-msgid "Associated text"
-msgstr ""
-
 #: ./src/pyams_content/component/paragraph/interfaces/pictogram.py:59
 msgid "Additional text associated to this pictogram"
 msgstr ""
@@ -1257,9 +1074,95 @@
 msgid "Presentation template used for pictograms"
 msgstr ""
 
-#: ./src/pyams_content/component/paragraph/interfaces/header.py:33
-#: ./src/pyams_content/component/paragraph/interfaces/header.py:40
-msgid "Header"
+#: ./src/pyams_content/component/paragraph/interfaces/audio.py:34
+msgid "Audio"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/audio.py:56
+msgid "Audio template"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/audio.py:57
+msgid "Presentation template used for this audio file"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/keynumber.py:36
+msgid "Key numbers template"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/keynumber.py:37
+msgid "Presentation template used for key numbers"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/frame.py:33
+msgid "Framed text"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/frame.py:40
+msgid "Frame body"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/frame.py:43
+msgid "Text template"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/verbatim.py:33
+msgid "Verbatim"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/verbatim.py:40
+msgid "Quoted text"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/verbatim.py:41
+msgid "Quotation marks will be added automatically by presentation template"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/verbatim.py:45
+msgid "Name of the quote author"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/verbatim.py:48
+#: ./src/pyams_content/component/paragraph/interfaces/contact.py:54
+msgid "In charge of"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/verbatim.py:49
+msgid "Label of author function"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/verbatim.py:52
+msgid "Verbatim template"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/html.py:33
+msgid "Raw HTML "
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/html.py:56
+msgid "Rich text"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/html.py:40
+msgid "Raw HTML code"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/html.py:41
+msgid ""
+"This HTML code will be used 'as is', without any transformation. Use with "
+"care!!"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/html.py:45
+msgid "Raw HTML code template"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/html.py:63
+msgid "Body"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/html.py:66
+msgid "Body template"
 msgstr ""
 
 #: ./src/pyams_content/component/paragraph/interfaces/contact.py:43
@@ -1274,11 +1177,6 @@
 msgid "Name of the contact"
 msgstr ""
 
-#: ./src/pyams_content/component/paragraph/interfaces/contact.py:54
-#: ./src/pyams_content/component/paragraph/interfaces/verbatim.py:48
-msgid "In charge of"
-msgstr ""
-
 #: ./src/pyams_content/component/paragraph/interfaces/contact.py:55
 msgid "Label of contact function"
 msgstr ""
@@ -1327,465 +1225,230 @@
 msgid "GPS coordinates used to locate contact"
 msgstr ""
 
-#: ./src/pyams_content/component/paragraph/interfaces/keypoint.py:33
-#: ./src/pyams_content/component/paragraph/interfaces/keypoint.py:40
-msgid "Key points"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/keypoint.py:41
-msgid "Enter one key point by line, without hyphen or prefix"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/keypoint.py:44
-msgid "Presentation template"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/keypoint.py:45
-#: ./src/pyams_content/component/paragraph/interfaces/html.py:46
-#: ./src/pyams_content/component/paragraph/interfaces/html.py:67
-#: ./src/pyams_content/component/paragraph/interfaces/verbatim.py:53
-#: ./src/pyams_content/component/paragraph/interfaces/frame.py:44
-#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:100
-#: ./src/pyams_content/shared/logo/interfaces/__init__.py:76
-msgid "Presentation template used for this paragraph"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/video.py:42
-msgid "Video file content"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/video.py:56
-#: ./src/pyams_content/component/video/interfaces/__init__.py:78
-msgid "Video template"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/video.py:57
-#: ./src/pyams_content/component/video/interfaces/__init__.py:79
-msgid "Presentation template used for this video"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/milestone.py:76
-#: ./src/pyams_content/component/paragraph/zmi/milestone.py:284
-msgid "Milestones"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/milestone.py:41
-msgid "Is this milestone visible in front-office?"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/milestone.py:46
-msgid "Milestone title"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/milestone.py:49
-#: ./src/pyams_content/component/paragraph/zmi/milestone.py:243
-msgid "Associated label"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/milestone.py:50
-msgid "The way this label will be rendered depends on presentation template"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/milestone.py:53
-#: ./src/pyams_content/component/paragraph/zmi/milestone.py:255
-msgid "Anchor"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/milestone.py:54
-msgid "Paragraph to which this milestone should lead"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/milestone.py:83
-msgid "Milestones template"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/milestone.py:84
-msgid "Presentation template used for milestones"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/keynumber.py:29
-#: ./src/pyams_content/component/keynumber/__init__.py:180
-#: ./src/pyams_content/component/keynumber/zmi/__init__.py:198
-#: ./src/pyams_content/component/keynumber/portlet/zmi/__init__.py:79
-msgid "Key numbers"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/keynumber.py:36
-msgid "Key numbers template"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/keynumber.py:37
-msgid "Presentation template used for key numbers"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/__init__.py:45
-msgid "Is this paragraph visible in front-office?"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/__init__.py:49
-msgid "§ Title"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/__init__.py:80
-msgid "Allowed paragraphs"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/__init__.py:81
-msgid "List of paragraphs allowed for this content type"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/__init__.py:85
-#: ./src/pyams_content/shared/common/zmi/types.py:169
-#: ./src/pyams_content/shared/common/zmi/types.py:380
-msgid "Default paragraphs"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/__init__.py:86
-msgid "List of paragraphs automatically added to a new content"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/html.py:33
-msgid "Raw HTML "
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/html.py:56
-msgid "Rich text"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/html.py:40
-msgid "Raw HTML code"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/html.py:41
-msgid ""
-"This HTML code will be used 'as is', without any transformation. Use with "
-"care!!"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/html.py:45
-msgid "Raw HTML code template"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/html.py:63
-#: ./src/pyams_content/component/paragraph/interfaces/audio.py:41
-msgid "Body"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/html.py:66
-msgid "Body template"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/verbatim.py:33
-msgid "Verbatim"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/verbatim.py:40
-msgid "Quoted text"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/verbatim.py:41
-msgid "Quotation marks will be added automatically by presentation template"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/verbatim.py:45
-msgid "Name of the quote author"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/verbatim.py:49
-msgid "Label of author function"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/verbatim.py:52
-msgid "Verbatim template"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/frame.py:33
-msgid "Framed text"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/frame.py:40
-msgid "Frame body"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/frame.py:43
-msgid "Text template"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/audio.py:34
-msgid "Audio"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/audio.py:56
-msgid "Audio template"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/interfaces/audio.py:57
-msgid "Presentation template used for this audio file"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/container.py:74
-msgid "Contents..."
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/container.py:239
-msgid "Show/hide all paragraphs"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/container.py:287
-#: ./src/pyams_content/component/paragraph/zmi/container.py:296
-#: ./src/pyams_content/component/paragraph/zmi/container.py:309
-msgid "Content blocks"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/container.py:366
-msgid "Links and attachments..."
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/container.py:378
-msgid "Content blocks links and attachments"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/container.py:126
-msgid "No currently defined paragraph."
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/container.py:248
-msgid "Click to open/close all paragraphs editors"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/container.py:261
-msgid "Click to open/close paragraph editor"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/container.py:132
-msgid "Check allowed paragraph types to be able to create new paragraphs."
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:82
-msgid "Pictograms..."
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:95
-msgid "Add new pictogram paragraph"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:122
-msgid "Edit pictogram paragraph properties"
-msgstr ""
-
-#. Default: Header
-#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:252
-msgid "pictogram-item-header"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:339
-msgid "Pictogram was correctly added"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:349
-#: ./src/pyams_content/component/paragraph/zmi/pictogram.py:387
-msgid "You must select a pictogram!"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/header.py:50
-msgid "Header..."
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/header.py:63
-msgid "Add new header paragraph"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/header.py:90
-msgid "Edit header paragraph properties"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/contact.py:53
-msgid "Contact card..."
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/contact.py:66
-msgid "Add new contact card"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/contact.py:94
-msgid "Edit contact card properties"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/keypoint.py:51
-msgid "Key points..."
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/keypoint.py:64
-msgid "Add new key points paragraph"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/keypoint.py:91
-msgid "Edit key points paragraph properties"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/video.py:53
-msgid "Video paragraph..."
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/video.py:66
-msgid "Add new video paragraph"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/video.py:94
-#: ./src/pyams_content/component/video/zmi/paragraph.py:192
-msgid "Edit video properties"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/milestone.py:77
-msgid "Milestones..."
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/milestone.py:90
-msgid "Add new milestone paragraph"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/milestone.py:117
-msgid "Edit milestone paragraph properties"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/milestone.py:299
-msgid "Add milestone"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/milestone.py:312
-msgid "Add new milestone"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/milestone.py:339
-msgid "Edit milestone properties"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/milestone.py:327
-msgid "Milestone was correctly added"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/milestone.py:270
-msgid "(missing paragraph)"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/keynumber.py:55
-msgid "Key numbers..."
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/keynumber.py:68
-msgid "Add new key number paragraph"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/keynumber.py:96
-msgid "Edit key number paragraph properties"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/__init__.py:65
-msgid "Content block types..."
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/__init__.py:79
-msgid "Content block types"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/__init__.py:89
-msgid ""
-"You can define which types of paragraphs are allowed in this container.\n"
-"\n"
-"Default paragraphs will be added automatically (in selected order) to any new created content.\n"
-"\n"
-"NOTICE: removing types from allowed types list will have no effect on already created contents!"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/__init__.py:214
-msgid "Submit"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/__init__.py:195
-msgid "Paragraph was correctly added."
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/html.py:76
-msgid "Raw HTML..."
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/html.py:89
-msgid "Add new raw HTML paragraph"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/html.py:119
-msgid "Edit raw HTML paragraph properties"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/html.py:159
-msgid "Rich text..."
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/html.py:172
-msgid "Add new rich text paragraph"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/html.py:202
-msgid "Edit rich text paragraph properties"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/verbatim.py:56
-msgid "Verbatim..."
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/verbatim.py:69
-msgid "Add new verbatim paragraph"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/verbatim.py:96
-msgid "Edit verbatim paragraph properties"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/frame.py:84
-msgid "Framed text..."
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/frame.py:98
-msgid "Add new framed text paragraph"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/frame.py:129
-msgid "Edit framed text paragraph properties"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/audio.py:54
-msgid "Audio paragraph..."
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/audio.py:67
-msgid "Add new audio paragraph"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/audio.py:108
-msgid "Edit audio properties"
-msgstr ""
-
-#: ./src/pyams_content/component/paragraph/zmi/audio.py:84
-#: ./src/pyams_content/component/paragraph/zmi/audio.py:128
-msgid "HTML content"
-msgstr ""
-
-#: ./src/pyams_content/component/links/__init__.py:125
+#: ./src/pyams_content/component/paragraph/interfaces/header.py:33
+#: ./src/pyams_content/component/paragraph/interfaces/header.py:40
+msgid "Header"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/header.py:43
+#: ./src/pyams_content/features/header/interfaces/__init__.py:39
+msgid "Header template"
+msgstr ""
+
+#: ./src/pyams_content/component/paragraph/interfaces/header.py:44
+#: ./src/pyams_content/features/header/interfaces/__init__.py:40
+msgid "Presentation template used for this header"
+msgstr ""
+
+#: ./src/pyams_content/component/theme/__init__.py:71
+#: ./src/pyams_content/component/theme/zmi/portlet.py:40
+#: ./src/pyams_content/component/theme/interfaces/__init__.py:47
+#: ./src/pyams_content/component/theme/interfaces/__init__.py:61
+msgid "Tags"
+msgstr ""
+
+#: ./src/pyams_content/component/theme/__init__.py:119
+#: ./src/pyams_content/component/theme/zmi/portlet.py:55
+#: ./src/pyams_content/component/theme/interfaces/__init__.py:88
+#: ./src/pyams_content/component/theme/interfaces/__init__.py:102
+msgid "Themes"
+msgstr ""
+
+#: ./src/pyams_content/component/theme/__init__.py:167
+#: ./src/pyams_content/component/theme/zmi/portlet.py:70
+#: ./src/pyams_content/component/theme/interfaces/__init__.py:129
+#: ./src/pyams_content/component/theme/interfaces/__init__.py:143
+msgid "Collections"
+msgstr ""
+
+#: ./src/pyams_content/component/theme/__init__.py:80
+msgid "no defined tag"
+msgstr ""
+
+#: ./src/pyams_content/component/theme/__init__.py:128
+msgid "no defined theme"
+msgstr ""
+
+#: ./src/pyams_content/component/theme/__init__.py:176
+msgid "no defined collection"
+msgstr ""
+
+#: ./src/pyams_content/component/theme/zmi/__init__.py:55
+#: ./src/pyams_content/shared/view/zmi/theme.py:56
+msgid "Tags..."
+msgstr ""
+
+#: ./src/pyams_content/component/theme/zmi/__init__.py:66
+msgid "Content tags"
+msgstr ""
+
+#: ./src/pyams_content/component/theme/zmi/__init__.py:99
+#: ./src/pyams_content/shared/view/zmi/theme.py:102
+msgid "Themes..."
+msgstr ""
+
+#: ./src/pyams_content/component/theme/zmi/__init__.py:107
+msgid "Content themes"
+msgstr ""
+
+#: ./src/pyams_content/component/theme/zmi/__init__.py:159
+#: ./src/pyams_content/shared/view/zmi/theme.py:148
+msgid "Collections..."
+msgstr ""
+
+#: ./src/pyams_content/component/theme/zmi/__init__.py:172
+msgid "Content collections"
+msgstr ""
+
+#: ./src/pyams_content/component/theme/zmi/manager.py:51
+msgid "Tags settings..."
+msgstr ""
+
+#: ./src/pyams_content/component/theme/zmi/manager.py:65
+msgid "Selected tags"
+msgstr ""
+
+#: ./src/pyams_content/component/theme/zmi/manager.py:101
+msgid "Themes settings..."
+msgstr ""
+
+#: ./src/pyams_content/component/theme/zmi/manager.py:115
+msgid "Selected themes"
+msgstr ""
+
+#: ./src/pyams_content/component/theme/zmi/manager.py:151
+msgid "Collections settings..."
+msgstr ""
+
+#: ./src/pyams_content/component/theme/zmi/manager.py:165
+msgid "Selected collections"
+msgstr ""
+
+#: ./src/pyams_content/component/association/container.py:91
+#: ./src/pyams_content/component/association/zmi/__init__.py:296
+#: ./src/pyams_content/component/association/interfaces/__init__.py:93
+msgid "Associations"
+msgstr ""
+
+#: ./src/pyams_content/component/association/zmi/paragraph.py:54
+#: ./src/pyams_content/component/association/zmi/__init__.py:96
+msgid "Associations..."
+msgstr ""
+
+#: ./src/pyams_content/component/association/zmi/paragraph.py:67
+msgid "Add new association paragraph"
+msgstr ""
+
+#: ./src/pyams_content/component/association/zmi/paragraph.py:93
+msgid "Edit association paragraph properties"
+msgstr ""
+
+#: ./src/pyams_content/component/association/zmi/__init__.py:198
+msgid "Public title"
+msgstr ""
+
+#: ./src/pyams_content/component/association/zmi/__init__.py:216
+msgid "Inner title"
+msgstr ""
+
+#: ./src/pyams_content/component/association/zmi/__init__.py:232
+msgid "Size"
+msgstr ""
+
+#: ./src/pyams_content/component/association/zmi/__init__.py:273
+#: ./src/pyams_content/component/association/zmi/__init__.py:283
+msgid "Associations list"
+msgstr ""
+
+#: ./src/pyams_content/component/association/zmi/__init__.py:66
+msgid "Association was correctly added."
+msgstr ""
+
+#: ./src/pyams_content/component/association/interfaces/__init__.py:43
+#: ./src/pyams_content/features/menu/interfaces/__init__.py:60
+msgid "Is this item visible in front-office?"
+msgstr ""
+
+#: ./src/pyams_content/component/association/interfaces/__init__.py:100
+msgid "Associations template"
+msgstr ""
+
+#: ./src/pyams_content/component/association/interfaces/__init__.py:101
+msgid "Presentation template used for associations"
+msgstr ""
+
+#: ./src/pyams_content/component/links/__init__.py:123
 msgid "Internal link"
 msgstr ""
 
-#: ./src/pyams_content/component/links/__init__.py:207
+#: ./src/pyams_content/component/links/__init__.py:219
 msgid "External link"
 msgstr ""
 
-#: ./src/pyams_content/component/links/__init__.py:260
+#: ./src/pyams_content/component/links/__init__.py:272
 msgid "Mailto link"
 msgstr ""
 
-#: ./src/pyams_content/component/links/__init__.py:194
+#: ./src/pyams_content/component/links/__init__.py:206
 msgid "target is not published"
 msgstr ""
 
+#: ./src/pyams_content/component/links/zmi/__init__.py:60
+msgid "Internal links"
+msgstr ""
+
+#: ./src/pyams_content/component/links/zmi/__init__.py:75
+msgid "Add internal link"
+msgstr ""
+
+#: ./src/pyams_content/component/links/zmi/__init__.py:89
+msgid "Add new internal link"
+msgstr ""
+
+#: ./src/pyams_content/component/links/zmi/__init__.py:120
+msgid "Edit internal link properties"
+msgstr ""
+
+#: ./src/pyams_content/component/links/zmi/__init__.py:149
+msgid "External links"
+msgstr ""
+
+#: ./src/pyams_content/component/links/zmi/__init__.py:164
+msgid "Add external link"
+msgstr ""
+
+#: ./src/pyams_content/component/links/zmi/__init__.py:178
+msgid "Add new external link"
+msgstr ""
+
+#: ./src/pyams_content/component/links/zmi/__init__.py:209
+msgid "Edit external link properties"
+msgstr ""
+
+#: ./src/pyams_content/component/links/zmi/__init__.py:238
+msgid "Mailto links"
+msgstr ""
+
+#: ./src/pyams_content/component/links/zmi/__init__.py:253
+msgid "Add mailto link"
+msgstr ""
+
+#: ./src/pyams_content/component/links/zmi/__init__.py:267
+msgid "Add new mailto link"
+msgstr ""
+
+#: ./src/pyams_content/component/links/zmi/__init__.py:298
+msgid "Edit mailto link properties"
+msgstr ""
+
+#: ./src/pyams_content/component/links/zmi/reverse.py:57
+msgid "Reverse links"
+msgstr ""
+
+#: ./src/pyams_content/component/links/zmi/reverse.py:66
+msgid "Content's internal links"
+msgstr ""
+
 #: ./src/pyams_content/component/links/interfaces/__init__.py:36
 msgid "Link title, as shown in front-office"
 msgstr ""
@@ -1798,103 +1461,55 @@
 msgid "Name of the pictogram associated with this link"
 msgstr ""
 
-#: ./src/pyams_content/component/links/interfaces/__init__.py:64
-#: ./src/pyams_content/shared/logo/interfaces/__init__.py:50
+#: ./src/pyams_content/component/links/interfaces/__init__.py:61
+#: ./src/pyams_content/shared/logo/interfaces/__init__.py:56
 msgid "Target URL"
 msgstr ""
 
-#: ./src/pyams_content/component/links/interfaces/__init__.py:65
-#: ./src/pyams_content/shared/logo/interfaces/__init__.py:51
+#: ./src/pyams_content/component/links/interfaces/__init__.py:62
+#: ./src/pyams_content/shared/logo/interfaces/__init__.py:57
 msgid "URL used to access external resource"
 msgstr ""
 
-#: ./src/pyams_content/component/links/interfaces/__init__.py:69
+#: ./src/pyams_content/component/links/interfaces/__init__.py:66
 msgid "Language used in this remote resource"
 msgstr ""
 
-#: ./src/pyams_content/component/links/interfaces/__init__.py:77
+#: ./src/pyams_content/component/links/interfaces/__init__.py:74
 msgid "Target address"
 msgstr ""
 
+#: ./src/pyams_content/component/links/interfaces/__init__.py:75
+msgid "Target email address"
+msgstr ""
+
 #: ./src/pyams_content/component/links/interfaces/__init__.py:78
-msgid "Target email address"
-msgstr ""
-
-#: ./src/pyams_content/component/links/interfaces/__init__.py:81
 msgid "Address name"
 msgstr ""
 
-#: ./src/pyams_content/component/links/interfaces/__init__.py:82
+#: ./src/pyams_content/component/links/interfaces/__init__.py:79
 msgid "Address as displayed in address book"
 msgstr ""
 
-#: ./src/pyams_content/component/links/zmi/__init__.py:60
-msgid "Internal links"
-msgstr ""
-
-#: ./src/pyams_content/component/links/zmi/__init__.py:75
-msgid "Add internal link"
-msgstr ""
-
-#: ./src/pyams_content/component/links/zmi/__init__.py:89
-msgid "Add new internal link"
-msgstr ""
-
-#: ./src/pyams_content/component/links/zmi/__init__.py:125
-msgid "Edit internal link properties"
-msgstr ""
-
-#: ./src/pyams_content/component/links/zmi/__init__.py:159
-msgid "External links"
-msgstr ""
-
-#: ./src/pyams_content/component/links/zmi/__init__.py:174
-msgid "Add external link"
-msgstr ""
-
-#: ./src/pyams_content/component/links/zmi/__init__.py:188
-msgid "Add new external link"
-msgstr ""
-
-#: ./src/pyams_content/component/links/zmi/__init__.py:224
-msgid "Edit external link properties"
-msgstr ""
-
-#: ./src/pyams_content/component/links/zmi/__init__.py:258
-msgid "Mailto links"
-msgstr ""
-
-#: ./src/pyams_content/component/links/zmi/__init__.py:273
-msgid "Add mailto link"
-msgstr ""
-
-#: ./src/pyams_content/component/links/zmi/__init__.py:287
-msgid "Add new mailto link"
-msgstr ""
-
-#: ./src/pyams_content/component/links/zmi/__init__.py:323
-msgid "Edit mailto link properties"
-msgstr ""
-
-#: ./src/pyams_content/component/links/zmi/reverse.py:57
-msgid "Reverse links"
-msgstr ""
-
-#: ./src/pyams_content/component/links/zmi/reverse.py:66
-msgid "Content's internal links"
-msgstr ""
-
 #: ./src/pyams_content/component/video/__init__.py:73
 #: ./src/pyams_content/component/video/interfaces/__init__.py:68
 msgid "External video"
 msgstr ""
 
-#: ./src/pyams_content/component/video/interfaces/__init__.py:56
-msgid "Video provider"
-msgstr ""
-
-#: ./src/pyams_content/component/video/interfaces/__init__.py:57
-msgid "Name of external platform providing selected video"
+#: ./src/pyams_content/component/video/provider/dailymotion.py:94
+msgid "Dailymotion settings"
+msgstr ""
+
+#: ./src/pyams_content/component/video/provider/__init__.py:70
+msgid "Other provider"
+msgstr ""
+
+#: ./src/pyams_content/component/video/provider/__init__.py:94
+msgid "Custom video settings"
+msgstr ""
+
+#: ./src/pyams_content/component/video/provider/vimeo.py:92
+msgid "Vimeo settings"
 msgstr ""
 
 #: ./src/pyams_content/component/video/provider/interfaces.py:31
@@ -2113,26 +1728,10 @@
 msgid "Color used for title and signature"
 msgstr ""
 
-#: ./src/pyams_content/component/video/provider/__init__.py:70
-msgid "Other provider"
-msgstr ""
-
-#: ./src/pyams_content/component/video/provider/__init__.py:94
-msgid "Custom video settings"
-msgstr ""
-
 #: ./src/pyams_content/component/video/provider/youtube.py:96
 msgid "Youtube settings"
 msgstr ""
 
-#: ./src/pyams_content/component/video/provider/vimeo.py:92
-msgid "Vimeo settings"
-msgstr ""
-
-#: ./src/pyams_content/component/video/provider/dailymotion.py:94
-msgid "Dailymotion settings"
-msgstr ""
-
 #: ./src/pyams_content/component/video/zmi/paragraph.py:62
 msgid "External video..."
 msgstr ""
@@ -2141,546 +1740,1366 @@
 msgid "Add new external video..."
 msgstr ""
 
-#: ./src/pyams_content/component/video/zmi/paragraph.py:126
+#: ./src/pyams_content/component/video/zmi/paragraph.py:124
 msgid "Video provider is required"
 msgstr ""
 
-#: ./src/pyams_content/component/video/zmi/paragraph.py:175
-#: ./src/pyams_content/component/video/zmi/paragraph.py:229
+#: ./src/pyams_content/component/video/zmi/paragraph.py:172
+#: ./src/pyams_content/component/video/zmi/paragraph.py:223
 msgid "Video provider settings"
 msgstr ""
 
-#: ./src/pyams_content/component/video/zmi/paragraph.py:155
+#: ./src/pyams_content/component/video/zmi/paragraph.py:152
 msgid "Other settings"
 msgstr ""
 
-#: ./src/pyams_content/component/illustration/__init__.py:177
-#: ./src/pyams_content/component/illustration/interfaces/__init__.py:99
-#: ./src/pyams_content/component/illustration/zmi/paragraph.py:168
-#: ./src/pyams_content/component/illustration/zmi/__init__.py:56
-#: ./src/pyams_content/component/illustration/zmi/__init__.py:100
-msgid "Illustration"
-msgstr ""
-
-#: ./src/pyams_content/component/illustration/interfaces/__init__.py:69
-msgid "Name of picture's author"
-msgstr ""
-
-#: ./src/pyams_content/component/illustration/interfaces/__init__.py:72
-msgid "Illustration template"
-msgstr ""
-
-#: ./src/pyams_content/component/illustration/interfaces/__init__.py:73
-msgid "Presentation template used for illustration"
-msgstr ""
-
-#: ./src/pyams_content/component/illustration/zmi/paragraph.py:60
-msgid "Illustration..."
-msgstr ""
-
-#: ./src/pyams_content/component/illustration/zmi/paragraph.py:73
-msgid "Add new illustration"
-msgstr ""
-
-#: ./src/pyams_content/component/illustration/zmi/paragraph.py:103
-msgid "Edit illustration properties"
-msgstr ""
-
-#: ./src/pyams_content/component/illustration/zmi/__init__.py:155
-msgid "Navigation link illustration"
-msgstr ""
-
-#: ./src/pyams_content/component/illustration/zmi/__init__.py:102
-msgid "Header illustration"
-msgstr ""
-
-#: ./src/pyams_content/component/association/container.py:88
-#: ./src/pyams_content/component/association/interfaces/__init__.py:90
-#: ./src/pyams_content/component/association/zmi/__init__.py:296
-msgid "Associations"
-msgstr ""
-
-#: ./src/pyams_content/component/association/interfaces/__init__.py:97
-msgid "Associations template"
-msgstr ""
-
-#: ./src/pyams_content/component/association/interfaces/__init__.py:98
-msgid "Presentation template used for associations"
-msgstr ""
-
-#: ./src/pyams_content/component/association/zmi/paragraph.py:54
-#: ./src/pyams_content/component/association/zmi/__init__.py:96
-msgid "Associations..."
-msgstr ""
-
-#: ./src/pyams_content/component/association/zmi/paragraph.py:67
-msgid "Add new association paragraph"
-msgstr ""
-
-#: ./src/pyams_content/component/association/zmi/paragraph.py:93
-msgid "Edit association paragraph properties"
-msgstr ""
-
-#: ./src/pyams_content/component/association/zmi/__init__.py:198
-msgid "Public title"
-msgstr ""
-
-#: ./src/pyams_content/component/association/zmi/__init__.py:216
-msgid "Inner title"
-msgstr ""
-
-#: ./src/pyams_content/component/association/zmi/__init__.py:232
-msgid "Size"
-msgstr ""
-
-#: ./src/pyams_content/component/association/zmi/__init__.py:273
-#: ./src/pyams_content/component/association/zmi/__init__.py:283
-msgid "Associations list"
-msgstr ""
-
-#: ./src/pyams_content/component/association/zmi/__init__.py:66
-msgid "Association was correctly added."
-msgstr ""
-
-#: ./src/pyams_content/component/keynumber/interfaces/__init__.py:40
-msgid "Is this key number visible in front-office?"
-msgstr ""
-
-#. Default: Header
-#: ./src/pyams_content/component/keynumber/interfaces/__init__.py:44
-#: ./src/pyams_content/component/keynumber/zmi/__init__.py:146
-msgid "key-number-label"
-msgstr ""
-
-#: ./src/pyams_content/component/keynumber/interfaces/__init__.py:45
+#: ./src/pyams_content/component/video/interfaces/__init__.py:56
+msgid "Video provider"
+msgstr ""
+
+#: ./src/pyams_content/component/video/interfaces/__init__.py:57
+msgid "Name of external platform providing selected video"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/__init__.py:240
+#: ./src/pyams_content/shared/common/zmi/properties.py:70
+#: ./src/pyams_content/shared/common/zmi/manager.py:96
+msgid "Properties"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/__init__.py:150
+#: ./src/pyams_content/shared/common/__init__.py:158
+#, python-format
+msgid "{date} by {principal}"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/__init__.py:263
+#, python-format
+msgid "title length should be between 40 and 66 characters ({length} actually)"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/search.py:92
+#: ./src/pyams_content/root/zmi/search.py:91
+msgid "Quick search results"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/search.py:157
+#: ./src/pyams_content/shared/common/zmi/search.py:190
+#: ./src/pyams_content/root/zmi/search.py:147
+#: ./src/pyams_content/root/zmi/search.py:180
+msgid "Advanced search"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/search.py:282
+#: ./src/pyams_content/root/zmi/search.py:260
+msgid "Advanced search results"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/search.py:165
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:231
+#: ./src/pyams_content/root/zmi/search.py:159
+msgid "Owner"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/search.py:168
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:154
+msgid "Status"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/search.py:172
+#: ./src/pyams_content/root/zmi/search.py:162
+msgid "Created after..."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/search.py:175
+#: ./src/pyams_content/root/zmi/search.py:165
+msgid "Created before..."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/search.py:178
+#: ./src/pyams_content/root/zmi/search.py:168
+msgid "Modified after..."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/search.py:181
+#: ./src/pyams_content/root/zmi/search.py:171
+msgid "Modified before..."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/properties.py:60
+msgid "Composition"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/properties.py:83
+msgid "Content properties"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/types.py:71
+msgid "Data types"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/types.py:149
+msgid "Data type label"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/types.py:189
+#: ./src/pyams_content/shared/common/zmi/types.py:429
+msgid "Default associations"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/types.py:205
+msgid "Default themes"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/types.py:233
+msgid "Content data types"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/types.py:256
+msgid "Add data type"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/types.py:268
+msgid "Add new data type"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/types.py:311
+msgid "Data type properties"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/types.py:392
+msgid "Subtype label"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/types.py:473
+msgid "Add subtype"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/types.py:485
+msgid "Add new subtype"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/types.py:532
+msgid "Data subtype properties"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/types.py:116
+msgid "No currently defined data type."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/types.py:301
+msgid "Specified type name is already used!"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/types.py:508
+msgid "Subtype was correctly added."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/types.py:522
+msgid "Specified subtype name is already used!"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/types.py:161
+msgid "Click to see subtypes"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/workflow.py:845
+msgid "Prior checks"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/workflow.py:124
+msgid "Request publication"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/workflow.py:211
+#: ./src/pyams_content/workflow/__init__.py:315
+msgid "Cancel publication request"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/workflow.py:251
+msgid "Refuse publication request"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/workflow.py:305
+#: ./src/pyams_content/workflow/basic.py:196
+msgid "Publish"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/workflow.py:394
+msgid "Request retire"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/workflow.py:450
+msgid "Cancel retire request"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/workflow.py:490
+msgid "Retire"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/workflow.py:531
+#: ./src/pyams_content/workflow/__init__.py:436
+msgid "Request archive"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/workflow.py:574
+msgid "Cancel archive request"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/workflow.py:614
+msgid "Archive"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/workflow.py:655
+#: ./src/pyams_content/workflow/__init__.py:501
+#: ./src/pyams_content/workflow/__init__.py:513
+#: ./src/pyams_content/workflow/__init__.py:525
+#: ./src/pyams_content/workflow/__init__.py:537
+#: ./src/pyams_content/workflow/__init__.py:549
+#: ./src/pyams_content/workflow/basic.py:224
+#: ./src/pyams_content/workflow/basic.py:236
+msgid "Create new version"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/workflow.py:706
+#: ./src/pyams_content/workflow/__init__.py:561
+#: ./src/pyams_content/workflow/basic.py:248
+msgid "Delete version"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/workflow.py:791
+msgid "Previewed content?"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/workflow.py:795
+msgid "Verified content?"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/workflow.py:181
+#: ./src/pyams_content/shared/common/zmi/workflow.py:363
+msgid "Publication start date is required"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/workflow.py:274
+#: ./src/pyams_content/shared/common/zmi/workflow.py:420
+msgid "A comment is required"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/workflow.py:730
+msgid "Delete content"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/workflow.py:739
+msgid "Delete definitively"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/workflow.py:868
+msgid ""
+"You must confirm that you previewed and checked this content before "
+"requesting publication!!"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/workflow.py:88
+#, python-format
+msgid "{state} | by {principal}"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/workflow.py:871
 msgid ""
-"Small text to be displayed above number (according to selected renderer)"
-msgstr ""
-
-#: ./src/pyams_content/component/keynumber/interfaces/__init__.py:49
-#: ./src/pyams_content/component/keynumber/zmi/__init__.py:158
-msgid "Number"
-msgstr ""
-
-#: ./src/pyams_content/component/keynumber/interfaces/__init__.py:50
-msgid "Key number value"
-msgstr ""
-
-#. Default: Unit
-#: ./src/pyams_content/component/keynumber/interfaces/__init__.py:53
-#: ./src/pyams_content/component/keynumber/zmi/__init__.py:167
-msgid "key-number-unit"
-msgstr ""
-
-#: ./src/pyams_content/component/keynumber/interfaces/__init__.py:54
-msgid "Displayed unit"
-msgstr ""
-
-#: ./src/pyams_content/component/keynumber/interfaces/__init__.py:58
-msgid "The way this text will be rendered depends on presentation template"
-msgstr ""
-
-#: ./src/pyams_content/component/keynumber/zmi/__init__.py:217
-msgid "Add keynumber"
-msgstr ""
-
-#: ./src/pyams_content/component/keynumber/zmi/__init__.py:230
-msgid "Add new keynumber"
-msgstr ""
-
-#: ./src/pyams_content/component/keynumber/zmi/__init__.py:259
-msgid "Edit keynumber properties"
-msgstr ""
-
-#: ./src/pyams_content/component/keynumber/zmi/__init__.py:245
-msgid "Key number was correctly added"
-msgstr ""
-
-#: ./src/pyams_content/component/keynumber/portlet/__init__.py:71
-msgid "Key Numbers"
-msgstr ""
-
-#: ./src/pyams_content/component/keynumber/portlet/interfaces/__init__.py:32
-msgid "Portlet title"
-msgstr ""
-
-#: ./src/pyams_content/component/keynumber/portlet/interfaces/__init__.py:35
-msgid "Teaser"
-msgstr ""
-
-#: ./src/pyams_content/component/keynumber/portlet/interfaces/__init__.py:36
-msgid "Short text displayed above key numbers"
-msgstr ""
-
-#: ./src/pyams_content/component/keynumber/portlet/zmi/__init__.py:102
-#: ./src/pyams_content/component/keynumber/portlet/zmi/templates/keynumber-preview.pt:22
-msgid "Associated links"
-msgstr ""
-
-#: ./src/pyams_content/shared/blog/interfaces/__init__.py:33
-msgid "Blog post"
-msgstr ""
-
-#: ./src/pyams_content/shared/blog/zmi/__init__.py:52
-msgid "This blog post"
-msgstr ""
-
-#: ./src/pyams_content/shared/blog/zmi/__init__.py:71
-#: ./src/pyams_content/shared/blog/zmi/__init__.py:81
-msgid "Add blog post"
-msgstr ""
-
-#: ./src/pyams_content/shared/blog/zmi/__init__.py:62
+"You must confirm that you checked this content before requesting "
+"publication!!"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/workflow.py:84
+#: ./src/pyams_content/workflow/__init__.py:648
+#: ./src/pyams_content/workflow/__init__.py:619
+#: ./src/pyams_content/workflow/basic.py:315
+#: ./src/pyams_content/workflow/basic.py:286
+#, python-format
+msgid "{state} {date}"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/__init__.py:263
+msgid "Duplicate content..."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/__init__.py:283
+msgid "Duplicate content"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/__init__.py:84
+msgid "This title can be modified afterwards"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/__init__.py:274
+msgid "Duplicate this content"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/__init__.py:330
+#, python-format
+msgid "Clone created from version {source} of {oid} (in « {state} » state)"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/__init__.py:375
+msgid "Created or modified in this version"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/summary.py:50
+msgid "Display content summary"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/summary.py:74
+msgid "Identity card"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/summary.py:86
+msgid "Requested action"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/summary.py:127
+msgid "Publication and retire dates"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/summary.py:146
+msgid "Current version"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/summary.py:176
+msgid "Content history"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/summary.py:117
+msgid "Associated comment"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/summary.py:158
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:198
+msgid "Version"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/summary.py:107
+#, python-format
+msgid "{state} {date} by {principal}"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/summary.py:164
+#, python-format
+msgid "{state} since {date}, by {principal}"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/manager.py:107
+msgid "Shared tool properties"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/manager.py:125
+msgid "WARNING"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/manager.py:127
+msgid ""
+"Workflow shouldn't be modified if this tool already contains any shared "
+"content!"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/manager.py:150
+msgid "Languages"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/manager.py:162
+msgid "Content languages"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/manager.py:172
+msgid ""
+"Tool languages are used to translate own tool properties, and newly created "
+"contents will propose these languages by default"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/manager.py:80
+msgid "Content management"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/manager.py:82
+msgid "Tool management"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/owner.py:50
+msgid "Change owner..."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/owner.py:83
+msgid "Change content's owner"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/owner.py:125
+msgid ""
+"All versions of this content which are not archived will be transferred to "
+"newly selected owner"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/owner.py:60
+msgid "New owner"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/owner.py:61
+msgid "The selected user will become the new content's owner"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/owner.py:63
+msgid "Keep previous owner as contributor"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/owner.py:64
+msgid "If 'yes', the previous owner will still be able to modify this content"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/owner.py:74
+msgid "Change owner"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/rename.py:62
+msgid "Change URL..."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/rename.py:79
+msgid "Change item URL"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/rename.py:86
+msgid "Item URL part"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/rename.py:87
+msgid "URL part used to access this content"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/rename.py:121
+msgid "You must provide an URL for this item!"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/site.py:38
 #, python-format
-msgid "Blog post « {title} »"
-msgstr ""
-
-#: ./src/pyams_content/shared/blog/zmi/manager.py:60
-msgid "Blog management"
-msgstr ""
-
-#: ./src/pyams_content/shared/blog/zmi/manager.py:83
-#: ./src/pyams_content/shared/blog/zmi/manager.py:97
-msgid "Add blog manager"
-msgstr ""
-
-#: ./src/pyams_content/shared/blog/zmi/manager.py:96
-msgid "Blog manager"
-msgstr ""
-
-#: ./src/pyams_content/shared/blog/zmi/manager.py:155
-#: ./src/pyams_content/shared/blog/zmi/manager.py:167
-#: ./src/pyams_content/shared/site/zmi/container.py:107
-#: ./src/pyams_content/shared/site/zmi/container.py:119
-msgid "Publication dates..."
-msgstr ""
-
-#: ./src/pyams_content/shared/blog/zmi/manager.py:181
-#: ./src/pyams_content/shared/site/zmi/container.py:133
-msgid "Update publication dates"
-msgstr ""
-
-#: ./src/pyams_content/shared/blog/zmi/manager.py:127
-#: ./src/pyams_content/shared/site/zmi/manager.py:156
-msgid "You must provide a short name for default server language!"
-msgstr ""
-
-#: ./src/pyams_content/shared/blog/zmi/manager.py:131
-msgid "Specified blog manager name is already used!"
-msgstr ""
-
-#: ./src/pyams_content/shared/blog/zmi/manager.py:135
-msgid "A blog manager is already registered with this name!!"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/paragraph.py:91
-msgid "no selected image map"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/paragraph.py:97
+msgid ""
+"SEARCH - Between all contents published into &laquo;&nbsp;{site}&nbsp;&raquo;"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/portal.py:46
+msgid "Edit default template properties"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/portal.py:56
+msgid ""
+"**This form allows you to select shared content default template.**\n"
+"\n"
+"If you choose to use a shared template, you can only adjust settings of each portlet individually but can't change portlets list or page configuration.\n"
+"\n"
+"If you use a local template, you can define a whole custom configuration but the template definition can't be reused anywhere..."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/portal.py:72
+msgid "Override tool default template"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:134
+msgid "Unique ID"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:181
+msgid "Status date"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:213
+msgid "Status principal"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:250
+msgid "Last modification"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:273
+#: ./src/pyams_content/root/zmi/__init__.py:110
+msgid "Dashboard"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:283
+msgid "Contents dashboard"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:329
+#: ./src/pyams_content/root/zmi/__init__.py:159
+#, python-format
+msgid "MANAGER - {0} content waiting for your action"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:330
+#: ./src/pyams_content/root/zmi/__init__.py:160
+#, python-format
+msgid "MANAGER - {0} contents waiting for your action"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:371
+#: ./src/pyams_content/root/zmi/__init__.py:204
+#, python-format
+msgid "CONTRIBUTOR - {0} content waiting for action"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:372
+#: ./src/pyams_content/root/zmi/__init__.py:205
+#, python-format
+msgid "CONTRIBUTOR - {0} contents waiting for action"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:404
+#: ./src/pyams_content/root/zmi/__init__.py:240
+#, python-format
+msgid "CONTRIBUTOR - {0} modified content"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:445
+#: ./src/pyams_content/root/zmi/__init__.py:283
+msgid "My contents"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:460
+#: ./src/pyams_content/shared/common/zmi/templates/dashboard.pt:8
+#: ./src/pyams_content/root/zmi/__init__.py:298
+#: ./src/pyams_content/root/zmi/templates/dashboard.pt:8
+msgid "My favorites"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:469
+#: ./src/pyams_content/root/zmi/__init__.py:307
+#, python-format
+msgid "CONTRIBUTOR - {0} favorite"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:470
+#: ./src/pyams_content/root/zmi/__init__.py:308
 #, python-format
-msgid "image map '{0}' can't be found"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/paragraph.py:105
+msgid "CONTRIBUTOR - {0} favorites"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:482
+#: ./src/pyams_content/shared/common/zmi/templates/header.pt:23
+msgid "Add/remove from favorites"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:545
+#: ./src/pyams_content/root/zmi/__init__.py:346
+msgid "Your favorites"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:558
+#: ./src/pyams_content/root/zmi/__init__.py:359
+msgid "My preparations"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:567
+#: ./src/pyams_content/root/zmi/__init__.py:368
+#, python-format
+msgid "CONTRIBUTOR - {0} prepared content"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:568
+#: ./src/pyams_content/root/zmi/__init__.py:369
+#, python-format
+msgid "CONTRIBUTOR - {0} prepared contents"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:608
+#: ./src/pyams_content/root/zmi/__init__.py:408
+msgid "Your prepared contents"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:621
+#: ./src/pyams_content/root/zmi/__init__.py:421
+msgid "My submissions"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:630
+#: ./src/pyams_content/root/zmi/__init__.py:430
+#, python-format
+msgid "CONTRIBUTOR - {0} submitted content"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:631
+#: ./src/pyams_content/root/zmi/__init__.py:431
+#, python-format
+msgid "CONTRIBUTOR - {0} submitted contents"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:671
+#: ./src/pyams_content/root/zmi/__init__.py:470
+msgid "Your submitted contents"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:684
+#: ./src/pyams_content/root/zmi/__init__.py:483
+msgid "My publications"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:693
+#: ./src/pyams_content/root/zmi/__init__.py:492
+#, python-format
+msgid "CONTRIBUTOR - {0} published content"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:694
+#: ./src/pyams_content/root/zmi/__init__.py:493
+#, python-format
+msgid "CONTRIBUTOR - {0} published contents"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:734
+#: ./src/pyams_content/root/zmi/__init__.py:532
+msgid "Your published contents"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:747
+#: ./src/pyams_content/root/zmi/__init__.py:545
+msgid "My retired contents"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:756
+#: ./src/pyams_content/root/zmi/__init__.py:554
+#, python-format
+msgid "CONTRIBUTOR - {0} retired content"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:757
+#: ./src/pyams_content/root/zmi/__init__.py:555
+#, python-format
+msgid "CONTRIBUTOR - {0} retired contents"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:798
+#: ./src/pyams_content/root/zmi/__init__.py:595
+msgid "Your retired contents"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:811
+#: ./src/pyams_content/root/zmi/__init__.py:608
+msgid "My archived contents"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:820
+#: ./src/pyams_content/root/zmi/__init__.py:617
+#, python-format
+msgid "CONTRIBUTOR - {0} archived content"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:821
+#: ./src/pyams_content/root/zmi/__init__.py:618
+#, python-format
+msgid "CONTRIBUTOR - {0} archived contents"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:868
+#: ./src/pyams_content/root/zmi/__init__.py:664
+msgid "Your archived contents"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:882
+#: ./src/pyams_content/root/zmi/__init__.py:678
+msgid "Other interventions"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:897
+#: ./src/pyams_content/root/zmi/__init__.py:693
+msgid "Last publications"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:906
+#: ./src/pyams_content/root/zmi/__init__.py:702
 #, python-format
-msgid "image map '{0}' is not published"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/__init__.py:154
-msgid "no area defined"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:35
-#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:88
-msgid "Image map"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:49
-#: ./src/pyams_content/shared/imagemap/zmi/container.py:140
-msgid "Link target"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:50
-msgid "Internal or external link associated with this map area"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:55
-msgid "Alternate label associated with this area"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:58
-msgid "Map area coordinates"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:59
-msgid "List of coordinates of image area"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:67
-msgid "Image supporting map areas"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:70
-#: ./src/pyams_content/shared/imagemap/zmi/container.py:65
-msgid "Image map areas"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:71
-msgid "List of defined map areas"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:96
-msgid "Reference to image map object"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:99
-msgid "Image map template"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/zmi/container.py:54
-msgid "Image areas"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/zmi/container.py:113
-msgid "No currently defined image."
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/zmi/container.py:115
-msgid "No currently defined area."
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/zmi/container.py:175
-#: ./src/pyams_content/root/zmi/sites.py:170
-msgid "No provided object_name argument!"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/zmi/container.py:194
-msgid "Given area name doesn't exist!"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/zmi/container.py:186
-msgid "Bad query object_name parameter value!"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/zmi/paragraph.py:54
-msgid "Image map..."
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/zmi/paragraph.py:67
-msgid "Add new image map"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/zmi/paragraph.py:94
-#: ./src/pyams_content/shared/logo/zmi/paragraph.py:93
-msgid "Edit paragraph properties"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/zmi/__init__.py:44
-msgid "This image map"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/zmi/__init__.py:63
-msgid "Add image map"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/zmi/__init__.py:73
-msgid "Adding image map"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/zmi/__init__.py:54
+msgid "CONTRIBUTORS - {0} published content"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:953
+#: ./src/pyams_content/root/zmi/__init__.py:748
+msgid "Last published contents"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:966
+#: ./src/pyams_content/root/zmi/__init__.py:761
+msgid "Last updates"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:975
+#: ./src/pyams_content/root/zmi/__init__.py:770
+#, python-format
+msgid "CONTRIBUTORS - {0} updated content"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:1020
+#: ./src/pyams_content/root/zmi/__init__.py:814
+msgid "Last updated contents"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:409
+#: ./src/pyams_content/root/zmi/__init__.py:245
+#, python-format
+msgid "CONTRIBUTOR - {0} modified contents"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:411
+#: ./src/pyams_content/root/zmi/__init__.py:247
+#, python-format
+msgid "CONTRIBUTOR - Last {0} modified contents"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:911
+#: ./src/pyams_content/root/zmi/__init__.py:707
+#, python-format
+msgid "CONTRIBUTORS - Last {0} published contents"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:913
+#: ./src/pyams_content/root/zmi/__init__.py:709
+msgid "CONTRIBUTORS - Last published contents (in the limit of 50)"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:980
+#: ./src/pyams_content/root/zmi/__init__.py:775
+#, python-format
+msgid "CONTRIBUTORS - Last {0} updated contents"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:982
+#: ./src/pyams_content/root/zmi/__init__.py:777
+msgid "CONTRIBUTORS - Last updated contents (in the limit of 50)"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:306
+#, python-format
+msgid "SEARCH - Between all contents of type &laquo;&nbsp;{type}&nbsp;&raquo;"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/dashboard.py:171
+#: ./src/pyams_content/shared/common/zmi/header.py:96
+msgid "Content publication start date is not passed yet"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/security.py:64
+msgid "Contributors restrictions"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/security.py:73
+msgid "Content contributors restrictions"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/security.py:107
+msgid "Contributor name"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/security.py:118
+#: ./src/pyams_content/shared/common/zmi/security.py:270
+msgid "Activated publication checks?"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/security.py:218
+msgid "Managers restrictions"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/security.py:227
+msgid "Content managers restrictions"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/security.py:259
+msgid "Manager name"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/security.py:287
+msgid "Restricted"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/security.py:304
+msgid "Owners"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/security.py:394
+msgid "Publication workflow"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/security.py:167
+#, python-format
+msgid "Edit contributor restrictions for « {0} »"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/security.py:353
+#, python-format
+msgid "Edit manager restrictions for « {0} »"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/security.py:400
+msgid "Apply contents restrictions"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/security.py:402
+msgid ""
+"You can specify which contents this manager will be able to manage. If you "
+"specify several criteria, the manager will be able to manage contents for "
+"which at least one criteria is matching."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/header.py:85
+#, python-format
+msgid "{state} by {principal}"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/header.py:116
 #, python-format
-msgid "Image map « {title} »"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/zmi/area.py:47
-msgid "Add image area"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/zmi/area.py:66
-msgid "Add new image area"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/zmi/area.py:107
-msgid "Edit image map properties"
-msgstr ""
-
-#: ./src/pyams_content/shared/imagemap/zmi/properties.py:40
-msgid "Background image"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/interfaces/__init__.py:32
-msgid "View"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/interfaces/__init__.py:41
-msgid "Last update date"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/interfaces/__init__.py:42
-msgid "Current publication date"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/interfaces/__init__.py:43
-msgid "First publication date"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/interfaces/__init__.py:148
-msgid "Always include selected internal references"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/interfaces/__init__.py:149
-msgid "Include selected internal references only if empty"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/interfaces/__init__.py:60
-msgid "Select context type?"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/interfaces/__init__.py:61
-msgid "If 'yes', content type will be extracted from context"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/interfaces/__init__.py:65
-msgid "Other content types"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/interfaces/__init__.py:66
-msgid "Selected content types; leave empty for all"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/interfaces/__init__.py:73
-msgid "Order by"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/interfaces/__init__.py:74
-msgid "Property to use to sort results"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/interfaces/__init__.py:79
-msgid "Reversed order?"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/interfaces/__init__.py:80
-msgid "If 'yes', items order will be reversed"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/interfaces/__init__.py:84
-msgid "Results count limit"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/interfaces/__init__.py:85
-msgid "Maximum number of results that the view may retrieve"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/interfaces/__init__.py:158
-msgid "Internal references usage"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/interfaces/__init__.py:159
-msgid "Specify how selected references are included into view results"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/interfaces/__init__.py:164
-msgid "Exclude context?"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/interfaces/__init__.py:165
-msgid "If 'yes', context will be excluded from results list"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/interfaces/__init__.py:176
-msgid "Select context themes?"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/interfaces/__init__.py:177
-msgid "If 'yes', themes will be extracted from context"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/interfaces/__init__.py:181
-msgid "Other terms"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/zmi/theme.py:59
-msgid "View themes settings"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/zmi/__init__.py:44
-msgid "This view"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/zmi/__init__.py:63
-#: ./src/pyams_content/shared/view/zmi/__init__.py:73
-msgid "Add view"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/zmi/__init__.py:54
-#, python-format
-msgid "View « {title} »"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/zmi/properties.py:40
-msgid "Main view settings"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/zmi/reference.py:52
-msgid "References..."
-msgstr ""
-
-#: ./src/pyams_content/shared/view/zmi/reference.py:63
-msgid "View internal references settings"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/portlet/interfaces.py:31
-msgid "Selected view"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/portlet/interfaces.py:32
-msgid "Reference to the view from which items are extracted"
-msgstr ""
-
-#: ./src/pyams_content/shared/view/portlet/__init__.py:58
-msgid "View items"
-msgstr ""
-
-#: ./src/pyams_content/shared/form/field.py:137
-msgid "Text"
-msgstr ""
-
-#: ./src/pyams_content/shared/form/field.py:147
-msgid "Multi-lines text"
-msgstr ""
-
-#: ./src/pyams_content/shared/form/field.py:157
-msgid "Boolean"
-msgstr ""
-
-#: ./src/pyams_content/shared/form/field.py:167
-msgid "Integer"
-msgstr ""
-
-#: ./src/pyams_content/shared/form/field.py:177
-msgid "Decimal"
-msgstr ""
-
-#: ./src/pyams_content/shared/form/field.py:187
-msgid "E-mail address"
-msgstr ""
-
-#: ./src/pyams_content/shared/form/field.py:197
-msgid "URI"
-msgstr ""
-
-#: ./src/pyams_content/shared/form/field.py:207
-msgid "Date"
-msgstr ""
-
-#: ./src/pyams_content/shared/form/field.py:221
-msgid "Choice"
-msgstr ""
-
-#: ./src/pyams_content/shared/form/field.py:241
-msgid "List"
+msgid "since {date}"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/header.py:128
+msgid "access published version"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/header.py:135
+msgid "access new version"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/header.py:145
+msgid "access waiting version"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/header.py:156
+msgid "access retired version"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/header.py:166
+msgid "access archived version"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-retiring-message.pt:2
+msgid ""
+"You considerate that the currently published version should no more be "
+"publicly visible."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-retiring-message.pt:3
+msgid ""
+"WARNING: the content will remain visible until a manager validate the "
+"request."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/header.pt:6
+msgid "Back to previous page"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/header.pt:20
+msgid "by ${owner}"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-archive-message.pt:2
+msgid "As a manager, you considerate that this content must be archived."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-archive-message.pt:3
+#: ./src/pyams_content/shared/common/zmi/templates/wf-archiving-message.pt:3
+msgid ""
+"After archiving, it will be backed up but you will not be able to publish it "
+"again except by creating a new version."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/check-input.pt:34
+#: ./src/pyams_content/shared/common/zmi/templates/preview-input.pt:34
+#: ./src/pyams_content/shared/common/interfaces/types.py:47
+#: ./src/pyams_content/shared/form/zmi/field.py:160
+#: ./src/pyams_content/shared/form/interfaces/__init__.py:62
+#: ./src/pyams_content/features/menu/zmi/__init__.py:208
+msgid "Label"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/check-input.pt:39
+#: ./src/pyams_content/features/checker/zmi/__init__.py:43
+msgid "Audit"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/dashboard.pt:29
+#: ./src/pyams_content/root/zmi/templates/dashboard.pt:29
+msgid "Quick search..."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/dashboard.pt:35
+#: ./src/pyams_content/root/zmi/templates/dashboard.pt:35
+msgid "Advanced search..."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/dashboard.pt:49
+#: ./src/pyams_content/root/zmi/templates/dashboard.pt:49
+msgid "You are not actually concerned by any content."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-publish-message.pt:2
+msgid ""
+"As a manager, you considerate that this content is complete and can be "
+"published 'as is'."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-publish-message.pt:4
+msgid ""
+"This operation will make the content publicly available (except if restricted"
+" access has been set)."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-create-message.pt:2
+msgid ""
+"This new content is going to be created in 'draft' mode, so that you can "
+"complete it before publication."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-create-message.pt:4
+msgid ""
+"A unique number is also going to be assigned to it. This number will be "
+"shared by all content's versions."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-operator-warning.pt:1
+msgid ""
+"WARNING: this request was made by a contributor which is not the owner of "
+"this content."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-clone-message.pt:2
+msgid "You considerate that the currently published must evolve."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-clone-message.pt:3
+msgid ""
+"By creating a new version, you can update it's content without impacting the "
+"currently published one."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-clone-message.pt:5
+msgid ""
+"When the new version will be complete, you will be able to make a new "
+"publication request to replace the currently published version (which will be"
+" archived automatically)."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-propose-message.pt:1
+msgid ""
+"This publication request is going to be transmitted to a content manager."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-duplicate-message.pt:2
+msgid "You are going to duplicate a whole content."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-duplicate-message.pt:3
+msgid ""
+"The new copy is going to be created in 'draft' mode, so that you can modify "
+"it before publication."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-duplicate-message.pt:5
+msgid ""
+"A new unique number is also going to be assigned to it. This number will be "
+"shared by all content's versions."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/advanced-search.pt:128
+#: ./src/pyams_content/root/zmi/templates/advanced-search.pt:128
+msgid "Created between"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/advanced-search.pt:140
+#: ./src/pyams_content/shared/common/zmi/templates/advanced-search.pt:166
+#: ./src/pyams_content/root/zmi/templates/advanced-search.pt:140
+#: ./src/pyams_content/root/zmi/templates/advanced-search.pt:166
+msgid "and"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/advanced-search.pt:154
+#: ./src/pyams_content/root/zmi/templates/advanced-search.pt:154
+msgid "Modified between"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/advanced-search.pt:202
+#: ./src/pyams_content/root/zmi/templates/advanced-search.pt:202
+msgid "Tab label"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-refuse-propose-message.pt:2
+msgid ""
+"As a content manager, you considerate that this content can't be published "
+"'as is'."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-refuse-propose-message.pt:4
+msgid ""
+"The contributor will be notified of this and will be able to update the "
+"content before doing a new publication request."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-cancel-archiving-message.pt:1
+msgid ""
+"After cancelling this request, the content will return to it's previous "
+"retired state."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-cancel-retiring-message.pt:1
+msgid ""
+"After cancelling this request, the content will return to it's normal "
+"published state."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-retire-message.pt:2
+msgid ""
+"As a content manager, you considerate that this content should no longer be "
+"published."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-retire-message.pt:4
+msgid ""
+"Retired content won't be visible anymore, but it can be updated and published"
+" again, or archived."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-cancel-propose-message.pt:1
+msgid ""
+"After canceling the request, you will be able to update the content again."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-delete-message.pt:2
+msgid ""
+"This content was never published. If you confirm deletion, it won't be "
+"possible to restore it."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-delete-message.pt:6
+msgid ""
+"The content version is going to be definitely deleted. Will only remain the "
+"currently published version."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-owner-warning.pt:1
+msgid ""
+"RECALL: you are not the owner of the content on which you are intervening."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-transition-info.pt:2
+msgid "FOR YOUR INFORMATION"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-transition-info.pt:5
+msgid "Next step"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-transition-info.pt:7
+msgid "Previous step"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-transition-info.pt:10
+msgid "With this comment:"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/zmi/templates/wf-archiving-message.pt:2
+msgid "This content is already retired and not visible."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/portlet/content/__init__.py:44
+msgid "Context content"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/portlet/content/zmi/preview.pt:2
+msgid "This is where the content will be displayed!!"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/portlet/content/skin/__init__.py:36
+msgid "Default content renderer"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/types.py:43
+#: ./src/pyams_content/shared/form/zmi/field.py:149
+msgid "Name"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/types.py:44
+msgid "Name of this data type; must be unique between all data types"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/types.py:50
+msgid "Navigation label"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/types.py:51
+msgid "Label used for navigation entries"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/types.py:54
+msgid "Tab-folder label"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/types.py:55
+msgid "Label used to include into tab folder"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/types.py:58
+msgid "'See also' label"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/types.py:59
+msgid ""
+"This label can be used when contents of this type will be displayed in a 'See"
+" also' entries block"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/types.py:63
+msgid "'Single value' label"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/types.py:64
+msgid "Label given to this type when a single value is displayed"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/types.py:67
+msgid "'Link to list' label"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/types.py:68
+msgid "Label used to display a link to a list of items of this type"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/types.py:71
+msgid "Next content label"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/types.py:72
+msgid "Label used to announce next date for this type"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/types.py:76
+msgid "Pictogram associated with this data type"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/types.py:90
+msgid "Field names"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/types.py:91
+msgid "List of fields associated with this data type"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/types.py:125
+msgid "Data type"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/types.py:126
+msgid "Type of content data"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:46
+#: ./src/pyams_content/root/interfaces/__init__.py:43
+msgid "Webmasters"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:47
+msgid "Webmasters can handle all contents, including published ones"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:51
+msgid "Pilots"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:52
+msgid ""
+"Pilots can handle tool configuration, manage access rules, grant users roles "
+"and manage managers restrictions"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:57
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:191
+msgid "Managers"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:58
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:192
+msgid ""
+"Managers can handle main operations in tool's workflow, like publish or "
+"retire contents"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:63
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:197
+msgid "Contributors"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:64
+msgid "Contributors are users which are allowed to create new contents"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:68
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:203
+msgid "Designers"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:69
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:204
+msgid "Designers are users which are allowed to manage presentation templates"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:95
+msgid "Workflow name"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:96
+msgid "Name of workflow utility used to manage tool contents"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:124
+msgid "Content URL"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:125
+msgid ""
+"URL used to access this content; this is important for SEO and should include"
+" most important words describing content; spaces and underscores will be "
+"automatically replaced by hyphens"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:130
+msgid "Version creator"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:131
+msgid ""
+"Name of content's version creator. The creator of the first version is also "
+"it's owner."
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:135
+msgid "First owner"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:136
+msgid "Name of content's first version owner"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:140
+msgid "Version creation"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:143
+msgid "Version modifiers"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:144
+msgid "List of principals who modified this content"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:147
+msgid "Last modifier"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:148
+msgid "Last principal who modified this content"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:151
+msgid "Last update"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:155
+msgid ""
+"The content's description is 'hidden' into HTML's page headers; but it can be"
+" seen, for example, in some search engines results as content's description"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:160
+msgid "Keywords"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:161
+msgid "They will be included into HTML pages metadata"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:164
+#: ./src/pyams_content/shared/site/zmi/folder.py:78
+#: ./src/pyams_content/shared/site/interfaces/__init__.py:67
+msgid "Notepad"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:165
+#: ./src/pyams_content/shared/site/zmi/folder.py:79
+#: ./src/pyams_content/shared/site/interfaces/__init__.py:68
+msgid "Internal information to be known about this content"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:184
+msgid "Content owner"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:185
+msgid ""
+"The owner is the creator of content's first version, except if it was "
+"transferred afterwards to another owner"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:198
+msgid ""
+"Contributors are users which are allowed to update this content in addition "
+"to it's owner"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:208
+msgid "Readers"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:209
+msgid ""
+"Readers are users which are asked to verify and comment contents before they "
+"are published"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:214
+msgid "Guests"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:215
+msgid ""
+"Guests are users which are allowed to view contents with restricted access"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:235
+msgid "Principal ID"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:274
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:299
+msgid "Publication checks"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:275
+msgid ""
+"If 'yes', this contributor will have to confirm that contents have been "
+"previewed and checked before asking for publication"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:300
+msgid ""
+"If 'yes', this manager will have to confirm that contents have been previewed"
+" and checked before publishing a content"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:305
+msgid "Restricted contents"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:306
+msgid ""
+"If 'yes', this manager will get restricted access to manage contents based on"
+" selected settings"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:311
+msgid "Selected owners"
+msgstr ""
+
+#: ./src/pyams_content/shared/common/interfaces/__init__.py:312
+msgid "Manager will have access to contents owned by these principals"
 msgstr ""
 
 #: ./src/pyams_content/shared/form/__init__.py:99
@@ -2699,6 +3118,102 @@
 msgid "No selected handler..."
 msgstr ""
 
+#: ./src/pyams_content/shared/form/field.py:146
+msgid "Text"
+msgstr ""
+
+#: ./src/pyams_content/shared/form/field.py:156
+msgid "Multi-lines text"
+msgstr ""
+
+#: ./src/pyams_content/shared/form/field.py:166
+msgid "Boolean"
+msgstr ""
+
+#: ./src/pyams_content/shared/form/field.py:176
+msgid "Integer"
+msgstr ""
+
+#: ./src/pyams_content/shared/form/field.py:186
+msgid "Decimal"
+msgstr ""
+
+#: ./src/pyams_content/shared/form/field.py:196
+msgid "E-mail address"
+msgstr ""
+
+#: ./src/pyams_content/shared/form/field.py:206
+msgid "URI"
+msgstr ""
+
+#: ./src/pyams_content/shared/form/field.py:216
+msgid "Date"
+msgstr ""
+
+#: ./src/pyams_content/shared/form/field.py:230
+msgid "Choice"
+msgstr ""
+
+#: ./src/pyams_content/shared/form/field.py:250
+msgid "List"
+msgstr ""
+
+#: ./src/pyams_content/shared/form/zmi/properties.py:41
+msgid "Main form settings"
+msgstr ""
+
+#: ./src/pyams_content/shared/form/zmi/properties.py:65
+msgid "Form handler settings"
+msgstr ""
+
+#: ./src/pyams_content/shared/form/zmi/__init__.py:44
+msgid "This form"
+msgstr ""
+
+#: ./src/pyams_content/shared/form/zmi/__init__.py:63
+#: ./src/pyams_content/shared/form/zmi/__init__.py:74
+msgid "Add form"
+msgstr ""
+
+#: ./src/pyams_content/shared/form/zmi/__init__.py:54
+#, python-format
+msgid "Form « {title} »"
+msgstr ""
+
+#: ./src/pyams_content/shared/form/zmi/field.py:69
+msgid "Form fields..."
+msgstr ""
+
+#: ./src/pyams_content/shared/form/zmi/field.py:171
+#: ./src/pyams_content/shared/form/interfaces/__init__.py:57
+msgid "Field type"
+msgstr ""
+
+#: ./src/pyams_content/shared/form/zmi/field.py:204
+msgid "Form fields list"
+msgstr ""
+
+#: ./src/pyams_content/shared/form/zmi/field.py:227
+#: ./src/pyams_content/shared/form/zmi/field.py:240
+msgid "Add form field"
+msgstr ""
+
+#: ./src/pyams_content/shared/form/zmi/field.py:278
+msgid "Edit form field properties"
+msgstr ""
+
+#: ./src/pyams_content/shared/form/zmi/field.py:180
+msgid "-- unknown field type --"
+msgstr ""
+
+#: ./src/pyams_content/shared/form/zmi/field.py:115
+msgid "No currently defined form field."
+msgstr ""
+
+#: ./src/pyams_content/shared/form/zmi/field.py:262
+msgid "Specified name is already used!"
+msgstr ""
+
 #: ./src/pyams_content/shared/form/interfaces/__init__.py:35
 msgid "Form"
 msgstr ""
@@ -2711,11 +3226,6 @@
 msgid "Field internal name; must be unique for a given form"
 msgstr ""
 
-#: ./src/pyams_content/shared/form/interfaces/__init__.py:57
-#: ./src/pyams_content/shared/form/zmi/field.py:170
-msgid "Field type"
-msgstr ""
-
 #: ./src/pyams_content/shared/form/interfaces/__init__.py:58
 msgid "Selected field type"
 msgstr ""
@@ -2836,66 +3346,6 @@
 msgid "Name of data recipient"
 msgstr ""
 
-#: ./src/pyams_content/shared/form/zmi/field.py:68
-msgid "Form fields..."
-msgstr ""
-
-#: ./src/pyams_content/shared/form/zmi/field.py:148
-#: ./src/pyams_content/shared/common/interfaces/types.py:36
-msgid "Name"
-msgstr ""
-
-#: ./src/pyams_content/shared/form/zmi/field.py:203
-msgid "Form fields list"
-msgstr ""
-
-#: ./src/pyams_content/shared/form/zmi/field.py:226
-#: ./src/pyams_content/shared/form/zmi/field.py:239
-msgid "Add form field"
-msgstr ""
-
-#: ./src/pyams_content/shared/form/zmi/field.py:281
-msgid "Edit form field properties"
-msgstr ""
-
-#: ./src/pyams_content/shared/form/zmi/field.py:179
-msgid "-- unknown field type --"
-msgstr ""
-
-#: ./src/pyams_content/shared/form/zmi/field.py:114
-msgid "No currently defined form field."
-msgstr ""
-
-#: ./src/pyams_content/shared/form/zmi/field.py:266
-msgid "Specified name is already used!"
-msgstr ""
-
-#: ./src/pyams_content/shared/form/zmi/__init__.py:44
-msgid "This form"
-msgstr ""
-
-#: ./src/pyams_content/shared/form/zmi/__init__.py:63
-#: ./src/pyams_content/shared/form/zmi/__init__.py:74
-msgid "Add form"
-msgstr ""
-
-#: ./src/pyams_content/shared/form/zmi/__init__.py:54
-#, python-format
-msgid "Form « {title} »"
-msgstr ""
-
-#: ./src/pyams_content/shared/form/zmi/properties.py:41
-msgid "Main form settings"
-msgstr ""
-
-#: ./src/pyams_content/shared/form/zmi/properties.py:70
-msgid "Form handler settings"
-msgstr ""
-
-#: ./src/pyams_content/shared/news/interfaces/__init__.py:29
-msgid "News topic"
-msgstr ""
-
 #: ./src/pyams_content/shared/news/zmi/__init__.py:44
 msgid "This news topic"
 msgstr ""
@@ -2910,56 +3360,618 @@
 msgid "News topic « {title} »"
 msgstr ""
 
-#: ./src/pyams_content/shared/logo/paragraph.py:95
+#: ./src/pyams_content/shared/news/interfaces/__init__.py:29
+msgid "News topic"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/merge.py:59
+msgid "Concatenate views items in order"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/merge.py:71
+msgid "Extract items randomly"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/merge.py:85
+msgid "Take items from views one by one, in views order"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/merge.py:98
+msgid "Take items from views one by one, in random order"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/merge.py:127
+msgid "Sort all results by creation date"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/merge.py:136
+msgid "Sort all results by last update date"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/merge.py:145
+msgid "Sort all results by current publication date"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/merge.py:154
+msgid "Sort all results by first publication date"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/zmi/properties.py:40
+msgid "Main view settings"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/zmi/__init__.py:44
+msgid "This view"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/zmi/__init__.py:63
+#: ./src/pyams_content/shared/view/zmi/__init__.py:73
+msgid "Add view"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/zmi/__init__.py:54
+#, python-format
+msgid "View « {title} »"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/zmi/theme.py:67
+msgid "View tags settings"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/zmi/theme.py:113
+msgid "View themes settings"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/zmi/theme.py:159
+msgid "View collections settings"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/zmi/reference.py:52
+msgid "References..."
+msgstr ""
+
+#: ./src/pyams_content/shared/view/zmi/reference.py:63
+msgid "View internal references settings"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/portlet/__init__.py:89
+msgid "View items"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/portlet/interfaces.py:41
+msgid "Display context"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/portlet/interfaces.py:42
+msgid "Content context"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/portlet/interfaces.py:59
+msgid "Selected views"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/portlet/interfaces.py:60
+msgid ""
+"Reference to the view(s) from which items are extracted; you can combine "
+"several views together and specify in which order they should be mixed"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/portlet/interfaces.py:69
+msgid "Views context"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/portlet/interfaces.py:70
+msgid ""
+"When searching for items, a view receives a \"context\" which is the object "
+"from which settings can be extracted; this context can be the \"display\" "
+"context or the \"content\" context: when the portlet is used to display the "
+"site root, a site manager or a site folder, both are identical; when the "
+"portlet is used to display a shared content, the \"content\" context is the "
+"displayed content, while the \"display\" context is the container (site root,"
+" site manager or site folder) into which content is displayed"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/portlet/interfaces.py:81
+msgid "Views merge mode"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/portlet/interfaces.py:82
+msgid ""
+"If you select several views, you can select \"merge\" mode, which is the way "
+"used to merge items from several views"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/portlet/interfaces.py:91
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:86
+msgid "Results count limit"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/portlet/interfaces.py:92
+msgid ""
+"Maximum number of results that the component may extract from merged views"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/portlet/zmi/templates/view-items-list-preview.pt:14
+msgid "No result found"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/portlet/zmi/templates/view-items-list-preview.pt:15
+msgid "No selected view"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:32
+msgid "View"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:150
+msgid "Always include selected internal references"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:151
+msgid "Include selected internal references only if empty"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:41
+#: ./src/pyams_content/interfaces/__init__.py:113
+#: ./src/pyams_content/features/review/interfaces.py:74
+msgid "Creation date"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:42
+msgid "Last update date"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:43
+msgid "Current publication date"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:44
+msgid "First publication date"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:62
+msgid "Select context type?"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:63
+msgid "If 'yes', content type will be extracted from context"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:67
+msgid "Other content types"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:68
+msgid "Selected content types; leave empty for all"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:75
+msgid "Order by"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:76
+msgid "Property to use to sort results"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:81
+msgid "Reversed order?"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:82
+msgid "If 'yes', items order will be reversed"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:87
+msgid "Maximum number of results that the view may retrieve"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:160
+msgid "Internal references usage"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:161
+msgid "Specify how selected references are included into view results"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:166
+msgid "Exclude context?"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:167
+msgid "If 'yes', context will be excluded from results list"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:178
+msgid "Select context tags?"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:179
+msgid "If 'yes', tags will be extracted from context"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:183
+msgid "Other tags"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:199
+msgid "Select context themes?"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:200
+msgid "If 'yes', themes will be extracted from context"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:204
+msgid "Other themes"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:220
+msgid "Select context collections?"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:221
+msgid "If 'yes', collections will be extracted from context"
+msgstr ""
+
+#: ./src/pyams_content/shared/view/interfaces/__init__.py:225
+msgid "Other collections"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/paragraph.py:99
+msgid "no selected image map"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/paragraph.py:105
+#, python-format
+msgid "image map '{0}' can't be found"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/paragraph.py:113
+#, python-format
+msgid "image map '{0}' is not published"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/__init__.py:154
+msgid "no area defined"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/zmi/paragraph.py:55
+msgid "Image map..."
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/zmi/paragraph.py:68
+msgid "Add new image map"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/zmi/paragraph.py:95
+#: ./src/pyams_content/shared/logo/zmi/paragraph.py:94
+msgid "Edit paragraph properties"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/zmi/properties.py:40
+msgid "Background image"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/zmi/__init__.py:44
+msgid "This image map"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/zmi/__init__.py:63
+msgid "Add image map"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/zmi/__init__.py:73
+msgid "Adding image map"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/zmi/__init__.py:54
+#, python-format
+msgid "Image map « {title} »"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/zmi/container.py:54
+msgid "Image areas"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/zmi/container.py:65
+#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:71
+msgid "Image map areas"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/zmi/container.py:140
+#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:50
+msgid "Link target"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/zmi/container.py:113
+msgid "No currently defined image."
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/zmi/container.py:115
+msgid "No currently defined area."
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/zmi/container.py:175
+#: ./src/pyams_content/root/zmi/sites.py:170
+msgid "No provided object_name argument!"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/zmi/container.py:194
+msgid "Given area name doesn't exist!"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/zmi/container.py:186
+msgid "Bad query object_name parameter value!"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/zmi/area.py:47
+msgid "Add image area"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/zmi/area.py:66
+msgid "Add new image area"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/zmi/area.py:107
+msgid "Edit image map properties"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:36
+#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:89
+msgid "Image map"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:51
+msgid "Internal or external link associated with this map area"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:56
+msgid "Alternate label associated with this area"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:59
+msgid "Map area coordinates"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:60
+msgid "List of coordinates of image area"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:68
+msgid "Image supporting map areas"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:72
+msgid "List of defined map areas"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:96
+#: ./src/pyams_content/features/alert/interfaces.py:73
+#: ./src/pyams_content/features/menu/interfaces/__init__.py:68
+msgid "Internal reference"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:97
+msgid "Reference to image map object"
+msgstr ""
+
+#: ./src/pyams_content/shared/imagemap/interfaces/__init__.py:100
+msgid "Image map template"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/folder.py:59
+msgid "Site folder"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/link.py:49
+msgid "Content link"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/manager.py:68
+#: ./src/pyams_content/shared/site/zmi/manager.py:125
+msgid "Site manager"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/folder.py:61
+msgid "Add site folder..."
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/folder.py:93
+msgid "Add site folder"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/folder.py:160
+msgid "Site folder management"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/folder.py:188
+msgid "Site folder properties"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/folder.py:71
+#: ./src/pyams_content/interfaces/__init__.py:102
+msgid "Visible label used to display content"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/folder.py:74
+#: ./src/pyams_content/shared/site/zmi/__init__.py:72
+#: ./src/pyams_content/shared/site/zmi/link.py:66
+msgid "Parent"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/folder.py:75
+#: ./src/pyams_content/shared/site/zmi/link.py:67
+msgid "Folder's parent"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/folder.py:153
+msgid "You must provide a folder name for default server language!"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/__init__.py:55
+msgid "This topic"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/__init__.py:63
+msgid "Add topic..."
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/__init__.py:86
+msgid "Add topic"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/__init__.py:73
+msgid "Topic's parent"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/link.py:57
+msgid "Rent content..."
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/link.py:77
+msgid "Rent existing content"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/link.py:135
+msgid "Edit content link properties"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/container.py:106
+#: ./src/pyams_content/shared/site/zmi/container.py:118
+#: ./src/pyams_content/shared/blog/zmi/manager.py:155
+#: ./src/pyams_content/shared/blog/zmi/manager.py:167
+msgid "Publication dates..."
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/container.py:132
+#: ./src/pyams_content/shared/blog/zmi/manager.py:181
+msgid "Update publication dates"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/container.py:178
+#: ./src/pyams_content/shared/site/zmi/container.py:188
+#: ./src/pyams_content/root/zmi/sites.py:68
+msgid "Site tree"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/container.py:310
+#: ./src/pyams_content/shared/site/zmi/container.py:156
+msgid "Visible element?"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/container.py:311
+msgid "Switch element visibility"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/container.py:372
+msgid "Folders and topics"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/container.py:408
+#: ./src/pyams_content/root/zmi/__init__.py:825
+msgid "Content"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/container.py:504
+msgid "Delete site item"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/container.py:381
+msgid "Click to open/close all folders"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/container.py:397
+msgid "Click to show/hide inner folders"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/container.py:267
+msgid "Can't reparent object to one of it's children. Reloading..."
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/manager.py:57
+msgid "Site management"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/manager.py:112
+#: ./src/pyams_content/shared/site/zmi/manager.py:126
+msgid "Add site manager"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/manager.py:156
+#: ./src/pyams_content/shared/blog/zmi/manager.py:127
+msgid "You must provide a short name for default server language!"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/manager.py:160
+msgid "Specified site manager name is already used!"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/zmi/manager.py:164
+msgid "A site manager is already registered with this name!!"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/interfaces/__init__.py:96
+msgid "Topic"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/interfaces/__init__.py:59
+msgid "Heading"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/interfaces/__init__.py:60
+msgid "Heading displayed according to presentation template"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/interfaces/__init__.py:63
+msgid "Navigation title"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/interfaces/__init__.py:64
+msgid "Title displayed in navigation items"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/interfaces/__init__.py:115
+msgid "Content title, as shown in front-office"
+msgstr ""
+
+#: ./src/pyams_content/shared/site/interfaces/__init__.py:119
+msgid "If 'no', link is not visible"
+msgstr ""
+
+#: ./src/pyams_content/shared/logo/paragraph.py:96
 msgid "no selected logo"
 msgstr ""
 
-#: ./src/pyams_content/shared/logo/paragraph.py:101
+#: ./src/pyams_content/shared/logo/paragraph.py:102
 #, python-format
 msgid "logo '{0}' can't be found"
 msgstr ""
 
-#: ./src/pyams_content/shared/logo/paragraph.py:109
+#: ./src/pyams_content/shared/logo/paragraph.py:110
 #, python-format
 msgid "logo '{0}' is not published"
 msgstr ""
 
-#: ./src/pyams_content/shared/logo/__init__.py:67
+#: ./src/pyams_content/shared/logo/__init__.py:68
 msgid "no image defined"
 msgstr ""
 
-#: ./src/pyams_content/shared/logo/__init__.py:70
+#: ./src/pyams_content/shared/logo/__init__.py:71
 msgid "no URL defined"
 msgstr ""
 
-#: ./src/pyams_content/shared/logo/interfaces/__init__.py:32
-msgid "Logo"
-msgstr ""
-
-#: ./src/pyams_content/shared/logo/interfaces/__init__.py:64
-msgid "Logos"
-msgstr ""
-
-#: ./src/pyams_content/shared/logo/interfaces/__init__.py:71
-msgid "Logos references"
-msgstr ""
-
-#: ./src/pyams_content/shared/logo/interfaces/__init__.py:72
-msgid "List of internal logos references"
-msgstr ""
-
-#: ./src/pyams_content/shared/logo/interfaces/__init__.py:75
-msgid "Logos template"
-msgstr ""
-
-#: ./src/pyams_content/shared/logo/zmi/paragraph.py:54
+#: ./src/pyams_content/shared/logo/zmi/paragraph.py:55
 msgid "Logos..."
 msgstr ""
 
-#: ./src/pyams_content/shared/logo/zmi/paragraph.py:67
+#: ./src/pyams_content/shared/logo/zmi/paragraph.py:68
 msgid "Add new logos paragraph"
 msgstr ""
 
+#: ./src/pyams_content/shared/logo/zmi/properties.py:40
+msgid "Main logo settings"
+msgstr ""
+
 #: ./src/pyams_content/shared/logo/zmi/__init__.py:45
 msgid "This logo"
 msgstr ""
@@ -2974,1478 +3986,101 @@
 msgid "Logo « {title} »"
 msgstr ""
 
-#: ./src/pyams_content/shared/logo/zmi/properties.py:40
-msgid "Main logo settings"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/__init__.py:237
-#: ./src/pyams_content/shared/common/zmi/manager.py:96
-#: ./src/pyams_content/shared/common/zmi/properties.py:70
-msgid "Properties"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/__init__.py:147
-#: ./src/pyams_content/shared/common/__init__.py:155
-#, python-format
-msgid "{date} by {principal}"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/__init__.py:260
-#, python-format
-msgid "title length should be between 40 and 66 characters ({length} actually)"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/types.py:37
-msgid "Name of this data type; must be unique between all data types"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/types.py:43
-msgid "Navigation label"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/types.py:44
-msgid "Label used for navigation entries"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/types.py:47
-msgid "Tab-folder label"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/types.py:48
-msgid "Label used to include into tab folder"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/types.py:51
-msgid "'See also' label"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/types.py:52
-msgid ""
-"This label can be used when contents of this type will be displayed in a 'See"
-" also' entries block"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/types.py:56
-msgid "'Single value' label"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/types.py:57
-msgid "Label given to this type when a single value is displayed"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/types.py:60
-msgid "'Link to list' label"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/types.py:61
-msgid "Label used to display a link to a list of items of this type"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/types.py:64
-msgid "Next content label"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/types.py:65
-msgid "Label used to announce next date for this type"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/types.py:69
-msgid "Image associated to this data type"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/types.py:82
-msgid "Field names"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/types.py:83
-msgid "List of fields associated with this data type"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:46
-#: ./src/pyams_content/root/interfaces/__init__.py:40
-msgid "Webmasters"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:47
-msgid "Webmasters can handle all contents, including published ones"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:51
-msgid "Pilots"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:52
-msgid ""
-"Pilots can handle tool configuration, manage access rules, grant users roles "
-"and manage managers restrictions"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:57
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:182
-msgid "Managers"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:58
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:183
-msgid ""
-"Managers can handle main operations in tool's workflow, like publish or "
-"retire contents"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:63
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:188
-msgid "Contributors"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:64
-msgid "Contributors are users which are allowed to create new contents"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:90
-msgid "Workflow name"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:91
-msgid "Name of workflow utility used to manage tool contents"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:119
-msgid "Content URL"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:120
-msgid ""
-"URL used to access this content; this is important for SEO and should include"
-" most important words describing content; spaces and underscores will be "
-"automatically replaced by hyphens"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:125
-msgid "Version creator"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:126
-msgid ""
-"Name of content's version creator. The creator of the first version is also "
-"it's owner."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:130
-msgid "First owner"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:131
-msgid "Name of content's first version owner"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:135
-msgid "Version creation"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:138
-msgid "Version modifiers"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:139
-msgid "List of principals who modified this content"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:142
-msgid "Last modifier"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:143
-msgid "Last principal who modified this content"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:146
-msgid "Last update"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:150
-msgid ""
-"The content's description is 'hidden' into HTML's page headers; but it can be"
-" seen, for example, in some search engines results as content's description"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:155
-msgid "Keywords"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:156
-msgid "They will be included into HTML pages metadata"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:159
-#: ./src/pyams_content/shared/site/interfaces/__init__.py:66
-#: ./src/pyams_content/shared/site/zmi/folder.py:78
-msgid "Notepad"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:160
-#: ./src/pyams_content/shared/site/interfaces/__init__.py:67
-#: ./src/pyams_content/shared/site/zmi/folder.py:79
-msgid "Internal information to be known about this content"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:175
-msgid "Content owner"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:176
-msgid ""
-"The owner is the creator of content's first version, except if it was "
-"transferred afterwards to another owner"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:189
-msgid ""
-"Contributors are users which are allowed to update this content in addition "
-"to it's owner"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:194
-msgid "Readers"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:195
-msgid ""
-"Readers are users which are asked to verify and comment contents before they "
-"are published"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:200
-msgid "Guests"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:201
-msgid ""
-"Guests are users which are allowed to view contents with restricted access"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:221
-msgid "Principal ID"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:260
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:285
-#: ./src/pyams_content/shared/common/zmi/security.py:118
-#: ./src/pyams_content/shared/common/zmi/security.py:270
-msgid "Publication checks"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:261
-msgid ""
-"If 'yes', this contributor will have to confirm that contents have been "
-"previewed and checked before asking for publication"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:286
-msgid ""
-"If 'yes', this manager will have to confirm that contents have been previewed"
-" and checked before publishing a content"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:291
-msgid "Restricted contents"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:292
-msgid ""
-"If 'yes', this manager will get restricted access to manage contents based on"
-" selected settings"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:297
-msgid "Selected owners"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/interfaces/__init__.py:298
-msgid "Manager will have access to contents owned by these principals"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:134
-msgid "Unique ID"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:154
-#: ./src/pyams_content/shared/common/zmi/search.py:168
-msgid "Status"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:181
-msgid "Status date"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:198
-#: ./src/pyams_content/shared/common/zmi/summary.py:158
-msgid "Version"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:213
-msgid "Status principal"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:231
-#: ./src/pyams_content/shared/common/zmi/search.py:165
-#: ./src/pyams_content/root/zmi/search.py:159
-msgid "Owner"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:250
-msgid "Last modification"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:273
-#: ./src/pyams_content/root/zmi/__init__.py:110
-msgid "Dashboard"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:283
-msgid "Contents dashboard"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:329
-#: ./src/pyams_content/root/zmi/__init__.py:159
-#, python-format
-msgid "MANAGER - {0} content waiting for your action"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:330
-#: ./src/pyams_content/root/zmi/__init__.py:160
-#, python-format
-msgid "MANAGER - {0} contents waiting for your action"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:370
-#: ./src/pyams_content/root/zmi/__init__.py:203
-#, python-format
-msgid "CONTRIBUTOR - {0} content waiting for action"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:371
-#: ./src/pyams_content/root/zmi/__init__.py:204
-#, python-format
-msgid "CONTRIBUTOR - {0} contents waiting for action"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:402
-#: ./src/pyams_content/root/zmi/__init__.py:238
-#, python-format
-msgid "CONTRIBUTOR - {0} modified content"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:443
-#: ./src/pyams_content/root/zmi/__init__.py:281
-msgid "My contents"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:458
-#: ./src/pyams_content/shared/common/zmi/templates/dashboard.pt:8
-#: ./src/pyams_content/root/zmi/__init__.py:296
-#: ./src/pyams_content/root/zmi/templates/dashboard.pt:8
-msgid "My favorites"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:467
-#: ./src/pyams_content/root/zmi/__init__.py:305
-#, python-format
-msgid "CONTRIBUTOR - {0} favorite"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:468
-#: ./src/pyams_content/root/zmi/__init__.py:306
-#, python-format
-msgid "CONTRIBUTOR - {0} favorites"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:480
-#: ./src/pyams_content/shared/common/zmi/templates/header.pt:23
-msgid "Add/remove from favorites"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:543
-#: ./src/pyams_content/root/zmi/__init__.py:344
-msgid "Your favorites"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:556
-#: ./src/pyams_content/root/zmi/__init__.py:357
-msgid "My preparations"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:565
-#: ./src/pyams_content/root/zmi/__init__.py:366
-#, python-format
-msgid "CONTRIBUTOR - {0} prepared content"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:566
-#: ./src/pyams_content/root/zmi/__init__.py:367
-#, python-format
-msgid "CONTRIBUTOR - {0} prepared contents"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:605
-#: ./src/pyams_content/root/zmi/__init__.py:405
-msgid "Your prepared contents"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:618
-#: ./src/pyams_content/root/zmi/__init__.py:418
-msgid "My submissions"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:627
-#: ./src/pyams_content/root/zmi/__init__.py:427
-#, python-format
-msgid "CONTRIBUTOR - {0} submitted content"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:628
-#: ./src/pyams_content/root/zmi/__init__.py:428
-#, python-format
-msgid "CONTRIBUTOR - {0} submitted contents"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:667
-#: ./src/pyams_content/root/zmi/__init__.py:466
-msgid "Your submitted contents"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:680
-#: ./src/pyams_content/root/zmi/__init__.py:479
-msgid "My publications"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:689
-#: ./src/pyams_content/root/zmi/__init__.py:488
-#, python-format
-msgid "CONTRIBUTOR - {0} published content"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:690
-#: ./src/pyams_content/root/zmi/__init__.py:489
-#, python-format
-msgid "CONTRIBUTOR - {0} published contents"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:729
-#: ./src/pyams_content/root/zmi/__init__.py:527
-msgid "Your published contents"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:742
-#: ./src/pyams_content/root/zmi/__init__.py:540
-msgid "My retired contents"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:751
-#: ./src/pyams_content/root/zmi/__init__.py:549
-#, python-format
-msgid "CONTRIBUTOR - {0} retired content"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:752
-#: ./src/pyams_content/root/zmi/__init__.py:550
-#, python-format
-msgid "CONTRIBUTOR - {0} retired contents"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:792
-#: ./src/pyams_content/root/zmi/__init__.py:589
-msgid "Your retired contents"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:805
-#: ./src/pyams_content/root/zmi/__init__.py:602
-msgid "My archived contents"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:814
-#: ./src/pyams_content/root/zmi/__init__.py:611
-#, python-format
-msgid "CONTRIBUTOR - {0} archived content"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:815
-#: ./src/pyams_content/root/zmi/__init__.py:612
-#, python-format
-msgid "CONTRIBUTOR - {0} archived contents"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:861
-#: ./src/pyams_content/root/zmi/__init__.py:657
-msgid "Your archived contents"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:875
-#: ./src/pyams_content/root/zmi/__init__.py:671
-msgid "Other interventions"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:890
-#: ./src/pyams_content/root/zmi/__init__.py:686
-msgid "Last publications"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:899
-#: ./src/pyams_content/root/zmi/__init__.py:695
-#, python-format
-msgid "CONTRIBUTORS - {0} published content"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:945
-#: ./src/pyams_content/root/zmi/__init__.py:740
-msgid "Last published contents"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:958
-#: ./src/pyams_content/root/zmi/__init__.py:753
-msgid "Last updates"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:967
-#: ./src/pyams_content/root/zmi/__init__.py:762
-#, python-format
-msgid "CONTRIBUTORS - {0} updated content"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:1012
-#: ./src/pyams_content/root/zmi/__init__.py:806
-msgid "Last updated contents"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:407
-#: ./src/pyams_content/root/zmi/__init__.py:243
-#, python-format
-msgid "CONTRIBUTOR - {0} modified contents"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:409
-#: ./src/pyams_content/root/zmi/__init__.py:245
-#, python-format
-msgid "CONTRIBUTOR - Last {0} modified contents"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:904
-#: ./src/pyams_content/root/zmi/__init__.py:700
-#, python-format
-msgid "CONTRIBUTORS - Last {0} published contents"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:906
-#: ./src/pyams_content/root/zmi/__init__.py:702
-msgid "CONTRIBUTORS - Last published contents (in the limit of 50)"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:972
-#: ./src/pyams_content/root/zmi/__init__.py:767
-#, python-format
-msgid "CONTRIBUTORS - Last {0} updated contents"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:974
-#: ./src/pyams_content/root/zmi/__init__.py:769
-msgid "CONTRIBUTORS - Last updated contents (in the limit of 50)"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:306
-#, python-format
-msgid "SEARCH - Between all contents of type &laquo;&nbsp;{type}&nbsp;&raquo;"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/dashboard.py:171
-#: ./src/pyams_content/shared/common/zmi/header.py:96
-msgid "Content publication start date is not passed yet"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/header.py:85
-#, python-format
-msgid "{state} by {principal}"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/header.py:116
-#, python-format
-msgid "since {date}"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/header.py:128
-msgid "access published version"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/header.py:135
-msgid "access new version"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/header.py:145
-msgid "access waiting version"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/header.py:156
-msgid "access retired version"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/header.py:166
-msgid "access archived version"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/types.py:67
-msgid "Data types"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/types.py:145
-msgid "Data type label"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/types.py:185
-#: ./src/pyams_content/shared/common/zmi/types.py:396
-msgid "Default associations"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/types.py:213
-msgid "Content data types"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/types.py:236
-msgid "Add data type"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/types.py:248
-msgid "Add new data type"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/types.py:285
-msgid "Data type properties"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/types.py:359
-msgid "Subtype label"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/types.py:440
-msgid "Add subtype"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/types.py:452
-msgid "Add new subtype"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/types.py:498
-msgid "Data subtype properties"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/types.py:112
-msgid "No currently defined data type."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/types.py:275
-msgid "Specified type name is already used!"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/types.py:474
-msgid "Subtype was correctly added."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/types.py:488
-msgid "Specified subtype name is already used!"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/types.py:157
-msgid "Click to see subtypes"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/site.py:38
+#: ./src/pyams_content/shared/logo/interfaces/__init__.py:33
+msgid "Logo"
+msgstr ""
+
+#: ./src/pyams_content/shared/logo/interfaces/__init__.py:70
+msgid "Logos"
+msgstr ""
+
+#: ./src/pyams_content/shared/logo/interfaces/__init__.py:47
+msgid "Image (colored)"
+msgstr ""
+
+#: ./src/pyams_content/shared/logo/interfaces/__init__.py:51
+msgid "Image (monochrome)"
+msgstr ""
+
+#: ./src/pyams_content/shared/logo/interfaces/__init__.py:52
+msgid "An alternate image which can be used by some presentation templates"
+msgstr ""
+
+#: ./src/pyams_content/shared/logo/interfaces/__init__.py:77
+msgid "Logos references"
+msgstr ""
+
+#: ./src/pyams_content/shared/logo/interfaces/__init__.py:78
+msgid "List of internal logos references"
+msgstr ""
+
+#: ./src/pyams_content/shared/logo/interfaces/__init__.py:81
+msgid "Logos template"
+msgstr ""
+
+#: ./src/pyams_content/shared/blog/zmi/__init__.py:52
+msgid "This blog post"
+msgstr ""
+
+#: ./src/pyams_content/shared/blog/zmi/__init__.py:71
+#: ./src/pyams_content/shared/blog/zmi/__init__.py:81
+msgid "Add blog post"
+msgstr ""
+
+#: ./src/pyams_content/shared/blog/zmi/__init__.py:62
 #, python-format
-msgid ""
-"SEARCH - Between all contents published into &laquo;&nbsp;{site}&nbsp;&raquo;"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/owner.py:50
-msgid "Change owner..."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/owner.py:83
-msgid "Change content's owner"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/owner.py:125
-msgid ""
-"All versions of this content which are not archived will be transferred to "
-"newly selected owner"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/owner.py:60
-msgid "New owner"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/owner.py:61
-msgid "The selected user will become the new content's owner"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/owner.py:63
-msgid "Keep previous owner as contributor"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/owner.py:64
-msgid "If 'yes', the previous owner will still be able to modify this content"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/owner.py:74
-msgid "Change owner"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/summary.py:50
-msgid "Display content summary"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/summary.py:74
-msgid "Identity card"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/summary.py:86
-msgid "Requested action"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/summary.py:127
-msgid "Publication and retire dates"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/summary.py:146
-msgid "Current version"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/summary.py:176
-msgid "Content history"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/summary.py:117
-msgid "Associated comment"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/summary.py:107
-#, python-format
-msgid "{state} {date} by {principal}"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/summary.py:164
-#, python-format
-msgid "{state} since {date}, by {principal}"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/__init__.py:265
-msgid "Duplicate content..."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/__init__.py:285
-msgid "Duplicate content"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/__init__.py:84
-msgid "This title can be modified afterwards"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/__init__.py:276
-msgid "Duplicate this content"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/__init__.py:337
-#, python-format
-msgid "Clone created from version {source} of {oid} (in « {state} » state)"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/__init__.py:382
-msgid "Created or modified in this version"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/manager.py:107
-msgid "Shared tool properties"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/manager.py:125
-msgid "WARNING"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/manager.py:127
-msgid ""
-"Workflow shouldn't be modified if this tool already contains any shared "
-"content!"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/manager.py:150
-msgid "Languages"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/manager.py:162
-msgid "Content languages"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/manager.py:172
-msgid ""
-"Tool languages are used to translate own tool properties, and newly created "
-"contents will propose these languages by default"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/manager.py:80
-msgid "Content management"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/manager.py:82
-msgid "Tool management"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/portal.py:46
-msgid "Edit default template properties"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/portal.py:56
-msgid ""
-"**This form allows you to select shared content default template.**\n"
-"\n"
-"If you choose to use a shared template, you can only adjust settings of each portlet individually but can't change portlets list or page configuration.\n"
-"\n"
-"If you use a local template, you can define a whole custom configuration but the template definition can't be reused anywhere..."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/portal.py:72
-msgid "Override tool default template"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/search.py:92
-#: ./src/pyams_content/root/zmi/search.py:91
-msgid "Quick search results"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/search.py:157
-#: ./src/pyams_content/shared/common/zmi/search.py:190
-#: ./src/pyams_content/root/zmi/search.py:147
-#: ./src/pyams_content/root/zmi/search.py:180
-msgid "Advanced search"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/search.py:282
-#: ./src/pyams_content/root/zmi/search.py:260
-msgid "Advanced search results"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/search.py:172
-#: ./src/pyams_content/root/zmi/search.py:162
-msgid "Created after..."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/search.py:175
-#: ./src/pyams_content/root/zmi/search.py:165
-msgid "Created before..."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/search.py:178
-#: ./src/pyams_content/root/zmi/search.py:168
-msgid "Modified after..."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/search.py:181
-#: ./src/pyams_content/root/zmi/search.py:171
-msgid "Modified before..."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/properties.py:60
-msgid "Composition"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/properties.py:82
-msgid "Content properties"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/security.py:64
-msgid "Contributors restrictions"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/security.py:73
-msgid "Content contributors restrictions"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/security.py:107
-msgid "Contributor name"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/security.py:218
-msgid "Managers restrictions"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/security.py:227
-msgid "Content managers restrictions"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/security.py:259
-msgid "Manager name"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/security.py:287
-msgid "Restricted"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/security.py:304
-msgid "Owners"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/security.py:394
-msgid "Publication workflow"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/security.py:167
-#, python-format
-msgid "Edit contributor restrictions for « {0} »"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/security.py:353
-#, python-format
-msgid "Edit manager restrictions for « {0} »"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/security.py:400
-msgid "Apply contents restrictions"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/security.py:402
-msgid ""
-"You can specify which contents this manager will be able to manage. If you "
-"specify several criteria, the manager will be able to manage contents for "
-"which at least one criteria is matching."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/workflow.py:844
-msgid "Prior checks"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/workflow.py:123
-msgid "Request publication"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/workflow.py:210
-#: ./src/pyams_content/workflow/__init__.py:315
-msgid "Cancel publication request"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/workflow.py:250
-msgid "Refuse publication request"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/workflow.py:304
-#: ./src/pyams_content/workflow/basic.py:196
-msgid "Publish"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/workflow.py:393
-msgid "Request retire"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/workflow.py:449
-msgid "Cancel retire request"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/workflow.py:489
-msgid "Retire"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/workflow.py:530
-#: ./src/pyams_content/workflow/__init__.py:436
-msgid "Request archive"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/workflow.py:573
-msgid "Cancel archive request"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/workflow.py:613
-msgid "Archive"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/workflow.py:654
-#: ./src/pyams_content/workflow/basic.py:224
-#: ./src/pyams_content/workflow/basic.py:236
-#: ./src/pyams_content/workflow/__init__.py:501
-#: ./src/pyams_content/workflow/__init__.py:513
-#: ./src/pyams_content/workflow/__init__.py:525
-#: ./src/pyams_content/workflow/__init__.py:537
-#: ./src/pyams_content/workflow/__init__.py:549
-msgid "Create new version"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/workflow.py:705
-#: ./src/pyams_content/workflow/basic.py:248
-#: ./src/pyams_content/workflow/__init__.py:561
-msgid "Delete version"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/workflow.py:790
-msgid "Previewed content?"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/workflow.py:794
-msgid "Verified content?"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/workflow.py:180
-#: ./src/pyams_content/shared/common/zmi/workflow.py:362
-msgid "Publication start date is required"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/workflow.py:273
-#: ./src/pyams_content/shared/common/zmi/workflow.py:419
-msgid "A comment is required"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/workflow.py:729
-msgid "Delete content"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/workflow.py:738
-msgid "Delete definitively"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/workflow.py:860
-msgid ""
-"You must confirm that you previewed and checked this content before "
-"requesting publication!!"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/workflow.py:87
-#, python-format
-msgid "{state} | by {principal}"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/workflow.py:83
-#: ./src/pyams_content/workflow/basic.py:315
-#: ./src/pyams_content/workflow/basic.py:286
-#: ./src/pyams_content/workflow/__init__.py:648
-#: ./src/pyams_content/workflow/__init__.py:619
-#, python-format
-msgid "{state} {date}"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-archiving-message.pt:2
-msgid "This content is already retired and not visible."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-archiving-message.pt:3
-#: ./src/pyams_content/shared/common/zmi/templates/wf-archive-message.pt:3
-msgid ""
-"After archiving, it will be backed up but you will not be able to publish it "
-"again except by creating a new version."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-cancel-propose-message.pt:1
-msgid ""
-"After canceling the request, you will be able to update the content again."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-archive-message.pt:2
-msgid "As a manager, you considerate that this content must be archived."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-create-message.pt:2
-msgid ""
-"This new content is going to be created in 'draft' mode, so that you can "
-"complete it before publication."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-create-message.pt:4
-msgid ""
-"A unique number is also going to be assigned to it. This number will be "
-"shared by all content's versions."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-retiring-message.pt:2
-msgid ""
-"You considerate that the currently published version should no more be "
-"publicly visible."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-retiring-message.pt:3
-msgid ""
-"WARNING: the content will remain visible until a manager validate the "
-"request."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/dashboard.pt:29
-#: ./src/pyams_content/root/zmi/templates/dashboard.pt:29
-msgid "Quick search..."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/dashboard.pt:35
-#: ./src/pyams_content/root/zmi/templates/dashboard.pt:35
-msgid "Advanced search..."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/dashboard.pt:49
-#: ./src/pyams_content/root/zmi/templates/dashboard.pt:49
-msgid "You are not actually concerned by any content."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-duplicate-message.pt:2
-msgid "You are going to duplicate a whole content."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-duplicate-message.pt:3
-msgid ""
-"The new copy is going to be created in 'draft' mode, so that you can modify "
-"it before publication."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-duplicate-message.pt:5
-msgid ""
-"A new unique number is also going to be assigned to it. This number will be "
-"shared by all content's versions."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-cancel-retiring-message.pt:1
-msgid ""
-"After cancelling this request, the content will return to it's normal "
-"published state."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-owner-warning.pt:1
-msgid ""
-"RECALL: you are not the owner of the content on which you are intervening."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-clone-message.pt:2
-msgid "You considerate that the currently published must evolve."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-clone-message.pt:3
-msgid ""
-"By creating a new version, you can update it's content without impacting the "
-"currently published one."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-clone-message.pt:5
-msgid ""
-"When the new version will be complete, you will be able to make a new "
-"publication request to replace the currently published version (which will be"
-" archived automatically)."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-retire-message.pt:2
-msgid ""
-"As a content manager, you considerate that this content should no longer be "
-"published."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-retire-message.pt:4
-msgid ""
-"Retired content won't be visible anymore, but it can be updated and published"
-" again, or archived."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-transition-info.pt:2
-msgid "FOR YOUR INFORMATION"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-transition-info.pt:5
-msgid "Next step"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-transition-info.pt:7
-msgid "Previous step"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-transition-info.pt:10
-msgid "With this comment:"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/advanced-search.pt:128
-#: ./src/pyams_content/root/zmi/templates/advanced-search.pt:128
-msgid "Created between"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/advanced-search.pt:140
-#: ./src/pyams_content/shared/common/zmi/templates/advanced-search.pt:166
-#: ./src/pyams_content/root/zmi/templates/advanced-search.pt:140
-#: ./src/pyams_content/root/zmi/templates/advanced-search.pt:166
-msgid "and"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/advanced-search.pt:154
-#: ./src/pyams_content/root/zmi/templates/advanced-search.pt:154
-msgid "Modified between"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/advanced-search.pt:202
-#: ./src/pyams_content/root/zmi/templates/advanced-search.pt:202
-msgid "Tab label"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/header.pt:6
-msgid "Back to previous page"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/header.pt:20
-msgid "by ${owner}"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-delete-message.pt:2
-msgid ""
-"This content was never published. If you confirm deletion, it won't be "
-"possible to restore it."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-delete-message.pt:6
-msgid ""
-"The content version is going to be definitely deleted. Will only remain the "
-"currently published version."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-operator-warning.pt:1
-msgid ""
-"WARNING: this request was made by a contributor which is not the owner of "
-"this content."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-publish-message.pt:2
-msgid ""
-"As a manager, you considerate that this content is complete and can be "
-"published 'as is'."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-publish-message.pt:4
-msgid ""
-"This operation will make the content publicly available (except if restricted"
-" access has been set)."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-cancel-archiving-message.pt:1
-msgid ""
-"After cancelling this request, the content will return to it's previous "
-"retired state."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-propose-message.pt:1
-msgid ""
-"This publication request is going to be transmitted to a content manager."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-refuse-propose-message.pt:2
-msgid ""
-"As a content manager, you considerate that this content can't be published "
-"'as is'."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/zmi/templates/wf-refuse-propose-message.pt:4
-msgid ""
-"The contributor will be notified of this and will be able to update the "
-"content before doing a new publication request."
-msgstr ""
-
-#: ./src/pyams_content/shared/common/portlet/content/__init__.py:44
-msgid "Context content"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/portlet/content/skin/__init__.py:36
-msgid "Default content renderer"
-msgstr ""
-
-#: ./src/pyams_content/shared/common/portlet/content/zmi/preview.pt:2
-msgid "This is where the content will be displayed!!"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/manager.py:68
-#: ./src/pyams_content/shared/site/zmi/manager.py:125
-msgid "Site manager"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/folder.py:59
-msgid "Site folder"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/link.py:46
-msgid "Content link"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/interfaces/__init__.py:95
-msgid "Topic"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/interfaces/__init__.py:58
-msgid "Heading"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/interfaces/__init__.py:59
-msgid "Heading displayed according to presentation template"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/interfaces/__init__.py:62
-msgid "Navigation title"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/interfaces/__init__.py:63
-msgid "Title displayed in navigation items"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/interfaces/__init__.py:114
-msgid "Content title, as shown in front-office"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/interfaces/__init__.py:118
-msgid "If 'no', link is not visible"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/container.py:179
-#: ./src/pyams_content/shared/site/zmi/container.py:189
-#: ./src/pyams_content/root/zmi/sites.py:68
-msgid "Site tree"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/container.py:308
-#: ./src/pyams_content/shared/site/zmi/container.py:157
-msgid "Visible element?"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/container.py:309
-msgid "Switch element visibility"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/container.py:370
-msgid "Folders and topics"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/container.py:406
-#: ./src/pyams_content/root/zmi/__init__.py:817
-msgid "Content"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/container.py:502
-msgid "Delete site item"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/container.py:648
-msgid "Change URL..."
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/container.py:663
-msgid "Change item URL"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/container.py:670
-msgid "Item URL part"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/container.py:379
-msgid "Click to open/close all folders"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/container.py:395
-msgid "Click to show/hide inner folders"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/container.py:265
-msgid "Can't reparent object to one of it's children. Reloading..."
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/__init__.py:55
-msgid "This topic"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/__init__.py:63
-msgid "Add topic..."
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/__init__.py:86
-msgid "Add topic"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/__init__.py:72
-#: ./src/pyams_content/shared/site/zmi/folder.py:74
-#: ./src/pyams_content/shared/site/zmi/link.py:66
-msgid "Parent"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/__init__.py:73
-msgid "Topic's parent"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/manager.py:57
-msgid "Site management"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/manager.py:112
-#: ./src/pyams_content/shared/site/zmi/manager.py:126
-msgid "Add site manager"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/manager.py:160
-msgid "Specified site manager name is already used!"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/manager.py:164
-msgid "A site manager is already registered with this name!!"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/folder.py:61
-msgid "Add site folder..."
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/folder.py:93
-msgid "Add site folder"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/folder.py:162
-msgid "Site folder management"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/folder.py:190
-msgid "Site folder properties"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/folder.py:75
-#: ./src/pyams_content/shared/site/zmi/link.py:67
-msgid "Folder's parent"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/folder.py:155
-msgid "You must provide a folder name for default server language!"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/link.py:57
-msgid "Rent content..."
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/link.py:77
-msgid "Rent existing content"
-msgstr ""
-
-#: ./src/pyams_content/shared/site/zmi/link.py:135
-msgid "Edit content link properties"
-msgstr ""
-
-#: ./src/pyams_content/root/__init__.py:67
+msgid "Blog post « {title} »"
+msgstr ""
+
+#: ./src/pyams_content/shared/blog/zmi/manager.py:60
+msgid "Blog management"
+msgstr ""
+
+#: ./src/pyams_content/shared/blog/zmi/manager.py:83
+#: ./src/pyams_content/shared/blog/zmi/manager.py:97
+msgid "Add blog manager"
+msgstr ""
+
+#: ./src/pyams_content/shared/blog/zmi/manager.py:96
+msgid "Blog manager"
+msgstr ""
+
+#: ./src/pyams_content/shared/blog/zmi/manager.py:131
+msgid "Specified blog manager name is already used!"
+msgstr ""
+
+#: ./src/pyams_content/shared/blog/zmi/manager.py:135
+msgid "A blog manager is already registered with this name!!"
+msgstr ""
+
+#: ./src/pyams_content/shared/blog/interfaces/__init__.py:33
+msgid "Blog post"
+msgstr ""
+
+#: ./src/pyams_content/profile/zmi/__init__.py:42
+msgid "Admin. profile"
+msgstr ""
+
+#: ./src/pyams_content/profile/interfaces/__init__.py:33
+msgid "User favorites"
+msgstr ""
+
+#: ./src/pyams_content/profile/interfaces/__init__.py:34
+msgid "List of internal numbers of shared contents stored for quick access"
+msgstr ""
+
+#: ./src/pyams_content/profile/interfaces/__init__.py:37
+msgid "Default table length"
+msgstr ""
+
+#: ./src/pyams_content/profile/interfaces/__init__.py:38
+msgid "Default length used for inner tables and dashboards"
+msgstr ""
+
+#: ./src/pyams_content/root/__init__.py:68
 msgid "Site root"
 msgstr ""
 
-#: ./src/pyams_content/root/interfaces/__init__.py:36
-msgid "Site managers"
-msgstr ""
-
-#: ./src/pyams_content/root/interfaces/__init__.py:44
-msgid "Templates managers"
-msgstr ""
-
-#: ./src/pyams_content/root/interfaces/__init__.py:48
-msgid "Operators group"
-msgstr ""
-
-#: ./src/pyams_content/root/interfaces/__init__.py:49
-msgid "Name of group containing all roles owners"
-msgstr ""
-
-#: ./src/pyams_content/root/zmi/__init__.py:78
-msgid "Home"
-msgstr ""
-
-#: ./src/pyams_content/root/zmi/search.py:155
-msgid "Content types"
-msgstr ""
-
 #: ./src/pyams_content/root/zmi/sites.py:78
 msgid "Blogs and shared sites"
 msgstr ""
@@ -4466,6 +4101,14 @@
 msgid "Given element name doesn't exist!"
 msgstr ""
 
+#: ./src/pyams_content/root/zmi/search.py:155
+msgid "Content types"
+msgstr ""
+
+#: ./src/pyams_content/root/zmi/__init__.py:78
+msgid "Home"
+msgstr ""
+
 #: ./src/pyams_content/root/zmi/templates/dashboard.pt:7
 msgid "Your contents dashboard"
 msgstr ""
@@ -4474,116 +4117,27 @@
 msgid "SEARCH - Between all contents"
 msgstr ""
 
+#: ./src/pyams_content/root/interfaces/__init__.py:39
+msgid "Site managers"
+msgstr ""
+
+#: ./src/pyams_content/root/interfaces/__init__.py:47
+msgid "Templates managers"
+msgstr ""
+
+#: ./src/pyams_content/root/interfaces/__init__.py:51
+msgid "Operators group"
+msgstr ""
+
+#: ./src/pyams_content/root/interfaces/__init__.py:52
+msgid "Name of group containing all roles owners"
+msgstr ""
+
+#: ./src/pyams_content/workflow/__init__.py:70
 #: ./src/pyams_content/workflow/basic.py:53
-#: ./src/pyams_content/workflow/__init__.py:70
 msgid "Draft"
 msgstr ""
 
-#: ./src/pyams_content/workflow/basic.py:54
-#: ./src/pyams_content/workflow/__init__.py:74
-msgid "Published"
-msgstr ""
-
-#: ./src/pyams_content/workflow/basic.py:55
-#: ./src/pyams_content/workflow/__init__.py:78
-msgid "Archived"
-msgstr ""
-
-#: ./src/pyams_content/workflow/basic.py:56
-#: ./src/pyams_content/workflow/__init__.py:79
-msgid "Deleted"
-msgstr ""
-
-#: ./src/pyams_content/workflow/basic.py:61
-#: ./src/pyams_content/workflow/__init__.py:84
-msgid "draft created"
-msgstr ""
-
-#: ./src/pyams_content/workflow/basic.py:62
-#: ./src/pyams_content/workflow/__init__.py:86
-msgid "published"
-msgstr ""
-
-#: ./src/pyams_content/workflow/basic.py:63
-#: ./src/pyams_content/workflow/__init__.py:90
-msgid "archived"
-msgstr ""
-
-#: ./src/pyams_content/workflow/basic.py:190
-#: ./src/pyams_content/workflow/__init__.py:279
-msgid "Initialize"
-msgstr ""
-
-#: ./src/pyams_content/workflow/basic.py:193
-#: ./src/pyams_content/workflow/__init__.py:282
-msgid "Draft creation"
-msgstr ""
-
-#: ./src/pyams_content/workflow/basic.py:204
-#: ./src/pyams_content/workflow/__init__.py:383
-msgid "Content published"
-msgstr ""
-
-#: ./src/pyams_content/workflow/basic.py:206
-#: ./src/pyams_content/workflow/__init__.py:385
-#, python-format
-msgid "published the content « {0} »"
-msgstr ""
-
-#: ./src/pyams_content/workflow/basic.py:210
-#: ./src/pyams_content/workflow/__init__.py:463
-msgid "Archive content"
-msgstr ""
-
-#: ./src/pyams_content/workflow/basic.py:218
-#: ./src/pyams_content/workflow/__init__.py:471
-msgid "Content archived"
-msgstr ""
-
-#: ./src/pyams_content/workflow/basic.py:220
-#: ./src/pyams_content/workflow/__init__.py:473
-#, python-format
-msgid "archived content « {0} »"
-msgstr ""
-
-#: ./src/pyams_content/workflow/basic.py:232
-#: ./src/pyams_content/workflow/basic.py:244
-#: ./src/pyams_content/workflow/__init__.py:509
-#: ./src/pyams_content/workflow/__init__.py:521
-#: ./src/pyams_content/workflow/__init__.py:533
-#: ./src/pyams_content/workflow/__init__.py:545
-#: ./src/pyams_content/workflow/__init__.py:557
-msgid "New version created"
-msgstr ""
-
-#: ./src/pyams_content/workflow/basic.py:256
-#: ./src/pyams_content/workflow/__init__.py:569
-msgid "Version deleted"
-msgstr ""
-
-#: ./src/pyams_content/workflow/basic.py:289
-#: ./src/pyams_content/workflow/basic.py:311
-#: ./src/pyams_content/workflow/__init__.py:622
-#: ./src/pyams_content/workflow/__init__.py:644
-msgid "Unknown state"
-msgstr ""
-
-#: ./src/pyams_content/workflow/basic.py:313
-#: ./src/pyams_content/workflow/__init__.py:646
-msgid "publication refused"
-msgstr ""
-
-#: ./src/pyams_content/workflow/basic.py:309
-#: ./src/pyams_content/workflow/__init__.py:642
-msgid "new version created"
-msgstr ""
-
-#: ./src/pyams_content/workflow/basic.py:160
-#: ./src/pyams_content/workflow/__init__.py:249
-#, python-format
-msgid "Published version {0}"
-msgstr ""
-
 #: ./src/pyams_content/workflow/__init__.py:71
 msgid "Proposed"
 msgstr ""
@@ -4596,6 +4150,11 @@
 msgid "Refused"
 msgstr ""
 
+#: ./src/pyams_content/workflow/__init__.py:74
+#: ./src/pyams_content/workflow/basic.py:54
+msgid "Published"
+msgstr ""
+
 #: ./src/pyams_content/workflow/__init__.py:75
 msgid "Retiring"
 msgstr ""
@@ -4608,10 +4167,30 @@
 msgid "Archiving"
 msgstr ""
 
+#: ./src/pyams_content/workflow/__init__.py:78
+#: ./src/pyams_content/workflow/basic.py:55
+msgid "Archived"
+msgstr ""
+
+#: ./src/pyams_content/workflow/__init__.py:79
+#: ./src/pyams_content/workflow/basic.py:56
+msgid "Deleted"
+msgstr ""
+
+#: ./src/pyams_content/workflow/__init__.py:84
+#: ./src/pyams_content/workflow/basic.py:61
+msgid "draft created"
+msgstr ""
+
 #: ./src/pyams_content/workflow/__init__.py:85
 msgid "publication requested"
 msgstr ""
 
+#: ./src/pyams_content/workflow/__init__.py:86
+#: ./src/pyams_content/workflow/basic.py:62
+msgid "published"
+msgstr ""
+
 #: ./src/pyams_content/workflow/__init__.py:87
 msgid "retiring requested"
 msgstr ""
@@ -4624,6 +4203,21 @@
 msgid "archiving requested"
 msgstr ""
 
+#: ./src/pyams_content/workflow/__init__.py:90
+#: ./src/pyams_content/workflow/basic.py:63
+msgid "archived"
+msgstr ""
+
+#: ./src/pyams_content/workflow/__init__.py:279
+#: ./src/pyams_content/workflow/basic.py:190
+msgid "Initialize"
+msgstr ""
+
+#: ./src/pyams_content/workflow/__init__.py:282
+#: ./src/pyams_content/workflow/basic.py:193
+msgid "Draft creation"
+msgstr ""
+
 #: ./src/pyams_content/workflow/__init__.py:285
 #: ./src/pyams_content/workflow/__init__.py:300
 msgid "Propose publication"
@@ -4700,6 +4294,17 @@
 msgid "State reset to 'refused' (automatic)"
 msgstr ""
 
+#: ./src/pyams_content/workflow/__init__.py:383
+#: ./src/pyams_content/workflow/basic.py:204
+msgid "Content published"
+msgstr ""
+
+#: ./src/pyams_content/workflow/__init__.py:385
+#: ./src/pyams_content/workflow/basic.py:206
+#, python-format
+msgid "published the content « {0} »"
+msgstr ""
+
 #: ./src/pyams_content/workflow/__init__.py:389
 msgid "Request retiring"
 msgstr ""
@@ -4769,6 +4374,22 @@
 msgid "cancelled the archive request for content « {0} »"
 msgstr ""
 
+#: ./src/pyams_content/workflow/__init__.py:463
+#: ./src/pyams_content/workflow/basic.py:210
+msgid "Archive content"
+msgstr ""
+
+#: ./src/pyams_content/workflow/__init__.py:471
+#: ./src/pyams_content/workflow/basic.py:218
+msgid "Content archived"
+msgstr ""
+
+#: ./src/pyams_content/workflow/__init__.py:473
+#: ./src/pyams_content/workflow/basic.py:220
+#, python-format
+msgid "archived content « {0} »"
+msgstr ""
+
 #: ./src/pyams_content/workflow/__init__.py:477
 msgid "Archive published content"
 msgstr ""
@@ -4787,6 +4408,44 @@
 msgid "Archive retired content"
 msgstr ""
 
+#: ./src/pyams_content/workflow/__init__.py:509
+#: ./src/pyams_content/workflow/__init__.py:521
+#: ./src/pyams_content/workflow/__init__.py:533
+#: ./src/pyams_content/workflow/__init__.py:545
+#: ./src/pyams_content/workflow/__init__.py:557
+#: ./src/pyams_content/workflow/basic.py:232
+#: ./src/pyams_content/workflow/basic.py:244
+msgid "New version created"
+msgstr ""
+
+#: ./src/pyams_content/workflow/__init__.py:569
+#: ./src/pyams_content/workflow/basic.py:256
+msgid "Version deleted"
+msgstr ""
+
+#: ./src/pyams_content/workflow/__init__.py:622
+#: ./src/pyams_content/workflow/__init__.py:644
+#: ./src/pyams_content/workflow/basic.py:289
+#: ./src/pyams_content/workflow/basic.py:311
+msgid "Unknown state"
+msgstr ""
+
+#: ./src/pyams_content/workflow/__init__.py:646
+#: ./src/pyams_content/workflow/basic.py:313
+msgid "publication refused"
+msgstr ""
+
+#: ./src/pyams_content/workflow/__init__.py:642
+#: ./src/pyams_content/workflow/basic.py:309
+msgid "new version created"
+msgstr ""
+
+#: ./src/pyams_content/workflow/__init__.py:249
+#: ./src/pyams_content/workflow/basic.py:160
+#, python-format
+msgid "Published version {0}"
+msgstr ""
+
 #: ./src/pyams_content/workflow/task.py:62
 msgid "Automatic contents withdrawal:\n"
 msgstr ""
@@ -4798,3 +4457,586 @@
 #: ./src/pyams_content/workflow/zmi/task.py:55
 msgid "Add automatic content archiver"
 msgstr ""
+
+#: ./src/pyams_content/skin/zmi/viewlet/toplinks/__init__.py:46
+msgid "Shared sites"
+msgstr ""
+
+#: ./src/pyams_content/skin/zmi/viewlet/toplinks/__init__.py:67
+msgid "Shared contents"
+msgstr ""
+
+#: ./src/pyams_content/skin/zmi/viewlet/toplinks/__init__.py:90
+msgid "Shared tools"
+msgstr ""
+
+#: ./src/pyams_content/skin/zmi/viewlet/toplinks/__init__.py:113
+msgid "My roles"
+msgstr ""
+
+#: ./src/pyams_content/skin/zmi/viewlet/toplinks/templates/user-addings.pt:7
+msgid "Create new content"
+msgstr ""
+
+#: ./src/pyams_content/interfaces/__init__.py:95
+msgid "Unique key"
+msgstr ""
+
+#: ./src/pyams_content/interfaces/__init__.py:96
+msgid ""
+"WARNING: this key can't be modified after creation!!! Spaces, uppercase "
+"letters ou accentuated characters will be replaced automatically."
+msgstr ""
+
+#: ./src/pyams_content/interfaces/__init__.py:105
+msgid "Short name"
+msgstr ""
+
+#: ./src/pyams_content/interfaces/__init__.py:106
+msgid "Short name used in breadcrumbs"
+msgstr ""
+
+#: ./src/pyams_content/interfaces/__init__.py:117
+msgid "Modification date"
+msgstr ""
+
+#: ./src/pyams_content/reference/zmi/table.py:73
+msgid "Contents"
+msgstr ""
+
+#: ./src/pyams_content/reference/zmi/table.py:83
+msgid "Table contents"
+msgstr ""
+
+#: ./src/pyams_content/reference/zmi/table.py:129
+#: ./src/pyams_content/reference/zmi/__init__.py:69
+msgid "References tables"
+msgstr ""
+
+#: ./src/pyams_content/reference/zmi/table.py:143
+msgid "Properties..."
+msgstr ""
+
+#: ./src/pyams_content/reference/zmi/table.py:157
+msgid "Edit table properties"
+msgstr ""
+
+#: ./src/pyams_content/reference/zmi/table.py:167
+msgid "Table management"
+msgstr ""
+
+#: ./src/pyams_content/reference/zmi/__init__.py:51
+msgid "References"
+msgstr ""
+
+#: ./src/pyams_content/reference/pictograms/zmi/__init__.py:169
+#: ./src/pyams_content/reference/pictograms/zmi/widget.py:55
+msgid "Default header: --"
+msgstr ""
+
+#: ./src/pyams_content/reference/pictograms/zmi/manager.py:51
+msgid "Pictograms selection..."
+msgstr ""
+
+#: ./src/pyams_content/reference/pictograms/zmi/manager.py:63
+#: ./src/pyams_content/reference/pictograms/zmi/templates/manager-selection.pt:34
+#: ./src/pyams_content/reference/pictograms/interfaces/__init__.py:73
+msgid "Selected pictograms"
+msgstr ""
+
+#: ./src/pyams_content/reference/pictograms/zmi/templates/manager-selection.pt:7
+msgid "Available pictograms"
+msgstr ""
+
+#: ./src/pyams_content/reference/pictograms/zmi/templates/manager-selection.pt:21
+#: ./src/pyams_content/reference/pictograms/zmi/templates/manager-selection.pt:48
+msgid "Display pictogram properties"
+msgstr ""
+
+#: ./src/pyams_content/reference/pictograms/zmi/templates/pictogram-header.pt:6
+msgid "Default header: ${header}"
+msgstr ""
+
+#: ./src/pyams_content/reference/pictograms/interfaces/__init__.py:45
+msgid "Pictogram content"
+msgstr ""
+
+#. Default: Header
+#: ./src/pyams_content/reference/pictograms/interfaces/__init__.py:52
+msgid "pictogram-header"
+msgstr ""
+
+#: ./src/pyams_content/reference/pictograms/interfaces/__init__.py:53
+msgid "Default header associated with this pictogram"
+msgstr ""
+
+#: ./src/pyams_content/reference/pictograms/interfaces/__init__.py:74
+msgid "List of selected pictograms which will be available to shared contents"
+msgstr ""
+
+#: ./src/pyams_content/features/renderer/zmi/__init__.py:70
+#: ./src/pyams_content/features/renderer/zmi/templates/renderer-input.pt:4
+msgid "Edit renderer properties"
+msgstr ""
+
+#: ./src/pyams_content/features/renderer/skin/__init__.py:67
+msgid "Hidden content"
+msgstr ""
+
+#: ./src/pyams_content/features/checker/interfaces.py:27
+#, python-format
+msgid " - {field}: <span class=\"text-danger\">no value</span>"
+msgstr ""
+
+#: ./src/pyams_content/features/checker/interfaces.py:28
+#, python-format
+msgid " - {field} ({lang}): <span class=\"text-danger\">no value</span>"
+msgstr ""
+
+#: ./src/pyams_content/features/checker/interfaces.py:29
+#, python-format
+msgid " - {field}: <span class=\"text-danger\">{message}</span>"
+msgstr ""
+
+#: ./src/pyams_content/features/checker/zmi/__init__.py:58
+msgid "Content check"
+msgstr ""
+
+#: ./src/pyams_content/features/checker/zmi/__init__.py:82
+msgid "No checker available. This content is clean!"
+msgstr ""
+
+#: ./src/pyams_content/features/checker/zmi/__init__.py:78
+#, python-format
+msgid "{0}:"
+msgstr ""
+
+#: ./src/pyams_content/features/preview/zmi/__init__.py:62
+msgid "Content preview"
+msgstr ""
+
+#: ./src/pyams_content/features/preview/zmi/__init__.py:67
+#, python-format
+msgid "{title} ({preview})"
+msgstr ""
+
+#: ./src/pyams_content/features/preview/zmi/__init__.py:68
+msgid "preview"
+msgstr ""
+
+#: ./src/pyams_content/features/alert/interfaces.py:40
+msgid "Success"
+msgstr ""
+
+#: ./src/pyams_content/features/alert/interfaces.py:41
+msgid "Information"
+msgstr ""
+
+#: ./src/pyams_content/features/alert/interfaces.py:42
+msgid "Warning"
+msgstr ""
+
+#: ./src/pyams_content/features/alert/interfaces.py:43
+msgid "Danger"
+msgstr ""
+
+#: ./src/pyams_content/features/alert/interfaces.py:55
+msgid "Is this alert visible in front-office?"
+msgstr ""
+
+#: ./src/pyams_content/features/alert/interfaces.py:59
+msgid "Alert gravity"
+msgstr ""
+
+#: ./src/pyams_content/features/alert/interfaces.py:60
+msgid "Alert gravity will affect rendered alert style"
+msgstr ""
+
+#. Default: Heading
+#: ./src/pyams_content/features/alert/interfaces.py:65
+#: ./src/pyams_content/features/alert/zmi/container.py:157
+msgid "alert-header"
+msgstr ""
+
+#: ./src/pyams_content/features/alert/interfaces.py:66
+msgid "Short alert header (Alert, Important...)"
+msgstr ""
+
+#: ./src/pyams_content/features/alert/interfaces.py:69
+#: ./src/pyams_content/features/alert/zmi/container.py:169
+msgid "Message"
+msgstr ""
+
+#: ./src/pyams_content/features/alert/interfaces.py:70
+msgid "Alert message"
+msgstr ""
+
+#: ./src/pyams_content/features/alert/interfaces.py:74
+msgid ""
+"Internal link target reference. You can search a reference using '+' followed"
+" by internal number, of by entering text matching content title."
+msgstr ""
+
+#: ./src/pyams_content/features/alert/interfaces.py:86
+msgid "Display start date"
+msgstr ""
+
+#: ./src/pyams_content/features/alert/interfaces.py:87
+msgid "First date at which alert should be displayed"
+msgstr ""
+
+#: ./src/pyams_content/features/alert/interfaces.py:90
+msgid "Display end date"
+msgstr ""
+
+#: ./src/pyams_content/features/alert/interfaces.py:91
+msgid "Last date at which alert should be displayed"
+msgstr ""
+
+#: ./src/pyams_content/features/alert/interfaces.py:94
+msgid "Maximum interval"
+msgstr ""
+
+#: ./src/pyams_content/features/alert/interfaces.py:95
+msgid ""
+"Maximum interval between alert displays on a given device, given in hours; "
+"set to 0 to always display the alert"
+msgstr ""
+
+#: ./src/pyams_content/features/alert/zmi/__init__.py:45
+msgid "Add alert"
+msgstr ""
+
+#: ./src/pyams_content/features/alert/zmi/__init__.py:56
+msgid "Add new alert"
+msgstr ""
+
+#: ./src/pyams_content/features/alert/zmi/__init__.py:79
+msgid "Edit alert properties"
+msgstr ""
+
+#: ./src/pyams_content/features/alert/zmi/container.py:55
+msgid "Alerts"
+msgstr ""
+
+#: ./src/pyams_content/features/alert/zmi/container.py:191
+msgid "Alert list"
+msgstr ""
+
+#: ./src/pyams_content/features/alert/zmi/container.py:90
+msgid "No currently defined alert."
+msgstr ""
+
+#: ./src/pyams_content/features/menu/zmi/__init__.py:81
+msgid "Add menu..."
+msgstr ""
+
+#: ./src/pyams_content/features/menu/zmi/__init__.py:92
+msgid "Add new menu"
+msgstr ""
+
+#: ./src/pyams_content/features/menu/zmi/__init__.py:123
+msgid "Edit menu properties"
+msgstr ""
+
+#: ./src/pyams_content/features/menu/zmi/__init__.py:110
+msgid "Menu was correctly added."
+msgstr ""
+
+#: ./src/pyams_content/features/menu/zmi/__init__.py:388
+msgid "Link was correctly added."
+msgstr ""
+
+#: ./src/pyams_content/features/menu/zmi/templates/menu-name-cell.pt:7
+msgid "Click to see menu items"
+msgstr ""
+
+#: ./src/pyams_content/features/menu/portlet/navigation/simple.py:68
+msgid "Simple navigation"
+msgstr ""
+
+#: ./src/pyams_content/features/menu/portlet/navigation/double.py:68
+msgid "Double navigation"
+msgstr ""
+
+#: ./src/pyams_content/features/menu/portlet/navigation/zmi/simple.py:69
+msgid "Navigation links"
+msgstr ""
+
+#: ./src/pyams_content/features/menu/portlet/navigation/zmi/double.py:69
+msgid "Navigation menus"
+msgstr ""
+
+#: ./src/pyams_content/features/menu/portlet/navigation/zmi/templates/double-preview.pt:15
+#: ./src/pyams_content/features/menu/portlet/navigation/zmi/templates/simple-preview.pt:12
+msgid "Link has no illustration"
+msgstr ""
+
+#: ./src/pyams_content/features/menu/portlet/navigation/interfaces/simple.py:32
+#: ./src/pyams_content/features/menu/portlet/navigation/interfaces/double.py:32
+msgid "Portlet main title"
+msgstr ""
+
+#: ./src/pyams_content/features/menu/portlet/navigation/interfaces/simple.py:35
+#: ./src/pyams_content/features/menu/portlet/navigation/interfaces/double.py:35
+msgid "Subtitle"
+msgstr ""
+
+#: ./src/pyams_content/features/menu/portlet/navigation/interfaces/simple.py:36
+#: ./src/pyams_content/features/menu/portlet/navigation/interfaces/double.py:36
+msgid "Portlet subtitle"
+msgstr ""
+
+#: ./src/pyams_content/features/menu/interfaces/__init__.py:64
+msgid "Menu title"
+msgstr ""
+
+#: ./src/pyams_content/features/menu/interfaces/__init__.py:65
+msgid "Displayed menu label"
+msgstr ""
+
+#: ./src/pyams_content/features/menu/interfaces/__init__.py:69
+msgid "Direct reference to menu target"
+msgstr ""
+
+#: ./src/pyams_content/features/footer/zmi/__init__.py:60
+msgid "Page footer"
+msgstr ""
+
+#: ./src/pyams_content/features/footer/zmi/__init__.py:78
+msgid "Edit footer settings"
+msgstr ""
+
+#: ./src/pyams_content/features/footer/zmi/__init__.py:152
+msgid ""
+"WARNING: Footer properties are saved automatically when changing inherit "
+"mode!!"
+msgstr ""
+
+#: ./src/pyams_content/features/footer/zmi/__init__.py:220
+msgid "Footer renderer settings"
+msgstr ""
+
+#: ./src/pyams_content/features/footer/zmi/__init__.py:107
+msgid "Don't inherit parent footer"
+msgstr ""
+
+#: ./src/pyams_content/features/footer/skin/__init__.py:84
+msgid "Hidden footer"
+msgstr ""
+
+#: ./src/pyams_content/features/footer/interfaces/__init__.py:39
+msgid "Footer template"
+msgstr ""
+
+#: ./src/pyams_content/features/footer/interfaces/__init__.py:40
+msgid "Presentation template used for this footer"
+msgstr ""
+
+#: ./src/pyams_content/features/review/__init__.py:181
+#, python-format
+msgid "Request comment: {comment}"
+msgstr ""
+
+#: ./src/pyams_content/features/review/__init__.py:211
+#, python-format
+msgid "A new comment was added on content « {0} »"
+msgstr ""
+
+#: ./src/pyams_content/features/review/__init__.py:168
+#, python-format
+msgid "[{service_name}] A content review is requested"
+msgstr ""
+
+#: ./src/pyams_content/features/review/interfaces.py:32
+msgid "Review request"
+msgstr ""
+
+#: ./src/pyams_content/features/review/interfaces.py:33
+msgid "Reviewer comment"
+msgstr ""
+
+#: ./src/pyams_content/features/review/interfaces.py:56
+msgid "Comment writer"
+msgstr ""
+
+#: ./src/pyams_content/features/review/interfaces.py:59
+msgid "Content reviewers"
+msgstr ""
+
+#: ./src/pyams_content/features/review/interfaces.py:62
+msgid "Comment type"
+msgstr ""
+
+#: ./src/pyams_content/features/review/interfaces.py:67
+msgid "Comment body"
+msgstr ""
+
+#: ./src/pyams_content/features/review/interfaces.py:70
+msgid "Reviewer comment?"
+msgstr ""
+
+#: ./src/pyams_content/features/review/interfaces.py:86
+msgid "Reviewers list"
+msgstr ""
+
+#: ./src/pyams_content/features/review/interfaces.py:87
+msgid "List of principals which reviewed the comment"
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/__init__.py:61
+msgid "Ask for review..."
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/__init__.py:100
+msgid "Content review request"
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/__init__.py:165
+msgid "Comments"
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/__init__.py:185
+msgid "Review comments"
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/__init__.py:71
+msgid "Sought principals"
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/__init__.py:72
+msgid "List of principals from which a review is requested"
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/__init__.py:75
+msgid "Comment"
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/__init__.py:76
+msgid "Comment associated with this request"
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/__init__.py:79
+msgid "Notify all reviewers"
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/__init__.py:80
+msgid ""
+"If 'yes', selected reviewers will be notified by mail of your request, even "
+"if they were already members of the reviewers group. Otherwise, only new "
+"reviewers will be notified"
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/__init__.py:91
+msgid "Ask for content review"
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/__init__.py:146
+msgid "Request successful. No new notification have been sent"
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/__init__.py:259
+msgid "Message is mandatory!"
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/__init__.py:134
+#, python-format
+msgid "Request successful. {count} new notification(s) have been sent"
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/templates/review-comments.pt:32
+#: ./src/pyams_content/features/review/zmi/templates/review-comments-json.pt:15
+#: ./src/pyams_content/features/review/zmi/templates/review-add-comment.pt:14
+msgid "Review query from"
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/templates/review-comments.pt:38
+#: ./src/pyams_content/features/review/zmi/templates/review-comments-json.pt:21
+#: ./src/pyams_content/features/review/zmi/templates/review-add-comment.pt:20
+msgid "(as reviewer)"
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/templates/review-comments.pt:47
+#: ./src/pyams_content/features/review/zmi/templates/review-comments-json.pt:30
+msgid "Selected reviewers:"
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/templates/review-comments.pt:64
+msgid "Add comment"
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/templates/review-comments.pt:67
+msgid "Add a comment..."
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/templates/review-comments.pt:73
+msgid "Add this comment"
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/templates/review-add-comment.pt:22
+msgid "just now"
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/templates/review-notification.pt:4
+msgid "[${service_name}] You are requested for a content review"
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/templates/review-notification.pt:30
+msgid "Hello,"
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/templates/review-notification.pt:31
+msgid ""
+"You have been requested by ${sender}, contributor of « ${service_name} » "
+"website, to make a review of a content."
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/templates/review-notification.pt:36
+msgid "${sender} added the following message to his request:"
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/templates/review-notification.pt:41
+msgid ""
+"To review and comment this publication, please use the following link: "
+"${target}."
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/templates/review-notification.pt:44
+msgid "After reading this content, please use the « Comments » menu entry."
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/templates/review-notification.pt:45
+msgid ""
+"If you don't want to reply to this request, please contact ${sender} directly"
+" by replying to this mail."
+msgstr ""
+
+#: ./src/pyams_content/features/review/zmi/templates/review-notification.pt:47
+msgid "Thank you."
+msgstr ""
+
+#: ./src/pyams_content/features/header/zmi/__init__.py:66
+msgid "Page header"
+msgstr ""
+
+#: ./src/pyams_content/features/header/zmi/__init__.py:84
+msgid "Edit header settings"
+msgstr ""
+
+#: ./src/pyams_content/features/header/zmi/__init__.py:161
+msgid ""
+"WARNING: Header properties are saved automatically when changing inherit "
+"mode!!"
+msgstr ""
+
+#: ./src/pyams_content/features/header/zmi/__init__.py:229
+msgid "Header renderer settings"
+msgstr ""
+
+#: ./src/pyams_content/features/header/zmi/__init__.py:113
+msgid "Don't inherit parent header"
+msgstr ""
+
+#: ./src/pyams_content/features/header/skin/__init__.py:90
+msgid "Hidden header"
+msgstr ""
--- a/src/pyams_content/reference/pictograms/manager.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/reference/pictograms/manager.py	Tue Jul 17 15:09:38 2018 +0200
@@ -66,4 +66,5 @@
                 terms = [SimpleTerm(v.__name__,
                                     title=II18n(v).query_attribute('title', request=request))
                          for v in table.values()]
+            terms = sorted(terms, key=lambda x: x.title)
         super(SelectedPictogramsVocabulary, self).__init__(terms)
--- a/src/pyams_content/reference/pictograms/zmi/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/reference/pictograms/zmi/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -139,7 +139,7 @@
     def getValue(self, obj):
         image = II18n(obj).query_attribute('image', request=self.request)
         if image:
-            return render_image(image, 32, 32, timestamp=True)
+            return render_image(image, 32, 32, self.request, timestamp=True)
         return '--'
 
 
--- a/src/pyams_content/reference/pictograms/zmi/templates/manager-selection.pt	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/reference/pictograms/zmi/templates/manager-selection.pt	Tue Jul 17 15:09:38 2018 +0200
@@ -1,8 +1,8 @@
 <div class="pictograms-manager" i18n:domain="pyams_content"
 	 data-ams-plugins="pyams_content"
 	 data-ams-plugin-pyams_content-async="false"
-	 tal:attributes="data-ams-plugin-pyams_content-src extension:resource_path('pyams_content.skin:pyams_content');
-					 data-ams-plugin-pyams_content-css extension:resource_path('pyams_content.skin:pyams_content_css');">
+	 tal:attributes="data-ams-plugin-pyams_content-src tales:resource_path('pyams_content.skin:pyams_content');
+					 data-ams-plugin-pyams_content-css tales:resource_path('pyams_content.skin:pyams_content_css');">
 	<fieldset class="bordered margin-x-20 col-md-5">
 		<legend class="inner" i18n:translate="">Available pictograms</legend>
 		<div class="droppable sortable height-min-100 pictograms available-pictograms viewport-y viewport-500"
@@ -15,7 +15,7 @@
 					   tal:attributes="value pictogram.__name__" />
 				<div class="pull-right margin-right-5">
 					<a data-toggle="modal"
-					   tal:attributes="data-ams-url extension:absolute_url(pictogram, 'properties.html')">
+					   tal:attributes="data-ams-url tales:absolute_url(pictogram, 'properties.html')">
 						<i class="fa fa-fw fa-search hint opaque baseline"
 						   data-ams-hint-gravity="se" data-ams-hint-offset="3"
 						   title="Display pictogram properties" i18n:attributes="title"></i>
@@ -24,7 +24,7 @@
 				<div class="width-50 text-center pull-left margin-right-10">
 					<tal:var define="img i18n:pictogram.image"
 							 condition="img"
-							 content="structure extension:thumbnail(img, 48, 48)" />
+							 content="structure tales:thumbnail(img, 48, 48)" />
 				</div>
 				<span tal:content="i18n:pictogram.title">Title</span>
 			</div>
@@ -42,7 +42,7 @@
 					   tal:attributes="value pictogram.__name__" />
 				<div class="pull-right margin-right-5">
 					<a data-toggle="modal"
-					   tal:attributes="data-ams-url extension:absolute_url(pictogram, 'properties.html')">
+					   tal:attributes="data-ams-url tales:absolute_url(pictogram, 'properties.html')">
 						<i class="fa fa-fw fa-search hint opaque baseline"
 						   data-ams-hint-gravity="se" data-ams-hint-offset="3"
 						   title="Display pictogram properties" i18n:attributes="title"></i>
@@ -51,7 +51,7 @@
 				<div class="width-50 text-center pull-left margin-right-10">
 					<tal:var define="img i18n:pictogram.image"
 							 condition="img"
-							 content="structure extension:thumbnail(img, 48, 48)" />
+							 content="structure tales:thumbnail(img, 48, 48)" />
 				</div>
 				<span tal:content="i18n:pictogram.title">Title</span>
 			</div>
--- a/src/pyams_content/reference/pictograms/zmi/templates/pictogram-header.pt	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/reference/pictograms/zmi/templates/pictogram-header.pt	Tue Jul 17 15:09:38 2018 +0200
@@ -1,7 +1,7 @@
 <div class="padding-5" i18n:domain="pyams_content">
 	<tal:var define="image i18n:context.image"
 			 condition="image"
-			 content="structure extension:thumbnail(image, 32, 32)" />
+			 content="structure tales:thumbnail(image, 32, 32)" />
 	<span class="padding-left-5" tal:define="header i18n:context.header"
 		  i18n:translate="">Default header:
 		<strong i18n:name="header" tal:content="header or '--'" />
--- a/src/pyams_content/root/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/root/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -18,7 +18,8 @@
 # import standard library
 
 # import interfaces
-from pyams_content.component.illustration import IIllustrationTarget
+from pyams_content.component.illustration.interfaces import IIllustrationTarget
+from pyams_content.component.theme.interfaces import ITagsManagerTarget
 from pyams_content.features.alert.interfaces import IAlertTarget
 from pyams_content.features.footer.interfaces import IFooterTarget
 from pyams_content.features.header.interfaces import IHeaderTarget
@@ -27,8 +28,8 @@
 from pyams_content.root.interfaces import ISiteRootRoles, ISiteRootConfiguration, ISiteRoot, \
     ISiteRootToolsConfiguration, ISiteRootBackOfficeConfiguration
 from pyams_form.interfaces.form import IFormContextPermissionChecker
-from pyams_portal.interfaces import IPortalContext
-from pyams_security.interfaces import IDefaultProtectionPolicy, IGrantedRoleEvent, ISecurityManager
+from pyams_portal.interfaces import IPortalContext, DESIGNER_ROLE
+from pyams_security.interfaces import IDefaultProtectionPolicy, IGrantedRoleEvent, ISecurityManager, SYSTEM_ADMIN_ROLE
 from pyams_skin.interfaces.configuration import IConfiguration, IBackOfficeConfiguration
 from pyams_utils.interfaces import MANAGE_SYSTEM_PERMISSION
 from pyams_utils.interfaces.site import ISiteRootFactory
@@ -50,19 +51,19 @@
 from pyams_content import _
 
 
-@implementer(IDefaultProtectionPolicy, ISiteRoot, ISiteRootRoles, IPortalContext,
+@implementer(IDefaultProtectionPolicy, ISiteRoot, ISiteRootRoles, IPortalContext, ITagsManagerTarget,
              IIllustrationTarget, IHeaderTarget, IFooterTarget, IAlertTarget, IPreviewTarget)
 class SiteRoot(ProtectedObject, BaseSiteRoot, UserSkinnableContent):
     """Main site root"""
 
-    __roles__ = ('system.Manager', WEBMASTER_ROLE, OPERATOR_ROLE, 'pyams.TemplatesManager')
+    __roles__ = (SYSTEM_ADMIN_ROLE, WEBMASTER_ROLE, OPERATOR_ROLE, DESIGNER_ROLE)
 
     roles_interface = ISiteRootRoles
 
     managers = RolePrincipalsFieldProperty(ISiteRootRoles['managers'])
     webmasters = RolePrincipalsFieldProperty(ISiteRootRoles['webmasters'])
     operators = RolePrincipalsFieldProperty(ISiteRootRoles['operators'])
-    templates_managers = RolePrincipalsFieldProperty(ISiteRootRoles['templates_managers'])
+    designers = RolePrincipalsFieldProperty(ISiteRootRoles['designers'])
 
     content_name = _("Site root")
 
@@ -91,7 +92,7 @@
 def handle_granted_role(event):
     """Add principals to operators group when a role is granted"""
     role_id = event.role_id
-    if (role_id == 'pyams.Operator') or (not role_id.startswith('pyams.')):
+    if (role_id == OPERATOR_ROLE) or (not role_id.startswith('pyams.')):
         return
     root = get_parent(event.object, ISiteRoot)
     if not root.operators:
--- a/src/pyams_content/root/interfaces/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/root/interfaces/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -16,6 +16,9 @@
 # import standard library
 
 # import interfaces
+from pyams_content.interfaces import WEBMASTER_ROLE, OPERATOR_ROLE
+from pyams_portal.interfaces import DESIGNER_ROLE
+from pyams_security.interfaces import SYSTEM_ADMIN_ROLE
 from pyams_skin.interfaces.configuration import IConfiguration, IBackOfficeConfiguration
 from pyams_utils.interfaces.site import ISiteRoot as ISiteRootBase
 
@@ -34,20 +37,20 @@
     """Main site roles"""
 
     managers = PrincipalsSet(title=_("Site managers"),
-                             role_id='system.Manager',
+                             role_id=SYSTEM_ADMIN_ROLE,
                              required=False)
 
     webmasters = PrincipalsSet(title=_("Webmasters"),
-                               role_id='pyams.Webmaster',
+                               role_id=WEBMASTER_ROLE,
                                required=False)
 
-    templates_managers = PrincipalsSet(title=_("Templates managers"),
-                                       role_id='pyams.TemplatesManager',
-                                       required=False)
+    designers = PrincipalsSet(title=_("Templates managers"),
+                              role_id=DESIGNER_ROLE,
+                              required=False)
 
     operators = Principal(title=_("Operators group"),
                           description=_("Name of group containing all roles owners"),
-                          role_id='pyams.Operator',
+                          role_id=OPERATOR_ROLE,
                           required=False)
 
 
--- a/src/pyams_content/root/zmi/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/root/zmi/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -51,7 +51,7 @@
 from pyams_skin.viewlet.menu import MenuItem
 from pyams_template.template import template_config
 from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter, ContextRequestAdapter
-from pyams_utils.list import unique
+from pyams_utils.list import unique_iter
 from pyams_utils.registry import get_utility, get_all_utilities_registered_for
 from pyams_viewlet.manager import viewletmanager_config
 from pyams_viewlet.viewlet import viewlet_config
@@ -172,13 +172,14 @@
         for tool in get_all_utilities_registered_for(IBaseSharedTool):
             workflow = IWorkflow(tool)
             query = Eq(catalog['parents'], intids.register(tool)) & \
+                    Any(catalog['content_type'], CONTENT_TYPES.keys()) & \
                     Any(catalog['workflow_state'], workflow.waiting_states)
             params = params | query if params else query
-        return filter(self.check_access,
-                      unique(map(lambda x: sorted(IWorkflowVersions(x).get_versions(IWorkflowState(x).state),
-                                                  key=lambda y: IZopeDublinCore(y).modified, reverse=True)[0],
-                                 CatalogResultSet(CatalogQuery(catalog).query(params,
-                                                                              sort_index='modified_date')))))
+        yield from filter(self.check_access,
+                          unique_iter(map(lambda x: sorted(IWorkflowVersions(x).get_versions(IWorkflowState(x).state),
+                                                           key=lambda y: IZopeDublinCore(y).modified, reverse=True)[0],
+                                      CatalogResultSet(CatalogQuery(catalog).query(params,
+                                                                                   sort_index='modified_date')))))
 
     def check_access(self, content):
         if self.request.has_permission(MANAGE_SITE_ROOT_PERMISSION, context=content):
@@ -218,13 +219,14 @@
         for tool in get_all_utilities_registered_for(IBaseSharedTool):
             workflow = IWorkflow(tool)
             query = Eq(catalog['parents'], intids.register(tool)) & \
+                    Any(catalog['content_type'], CONTENT_TYPES.keys()) & \
                     Any(catalog['workflow_state'], workflow.waiting_states) & \
                     Eq(catalog['workflow_principal'], self.request.principal.id)
             params = params | query if params else query
-        return unique(map(lambda x: sorted(IWorkflowVersions(x).get_versions(IWorkflowState(x).state),
-                                           key=lambda y: IZopeDublinCore(y).modified, reverse=True)[0],
-                          CatalogResultSet(CatalogQuery(catalog).query(params,
-                                                                       sort_index='modified_date'))))
+        yield from unique_iter(map(lambda x: sorted(IWorkflowVersions(x).get_versions(IWorkflowState(x).state),
+                                                    key=lambda y: IZopeDublinCore(y).modified, reverse=True)[0],
+                                   CatalogResultSet(CatalogQuery(catalog).query(params,
+                                                                                sort_index='modified_date'))))
 
 
 #
@@ -260,11 +262,11 @@
                         Or(Eq(catalog['role:owner'], self.request.principal.id),
                            Eq(catalog['role:contributor'], self.request.principal.id)))
             params = params | query if params else query
-        return unique(map(lambda x: IWorkflowVersions(x).get_last_versions()[0],
-                          CatalogResultSet(CatalogQuery(catalog).query(params,
-                                                                       limit=50,
-                                                                       sort_index='modified_date',
-                                                                       reverse=True))))
+        yield from unique_iter(map(lambda x: IWorkflowVersions(x).get_last_versions()[0],
+                                   CatalogResultSet(CatalogQuery(catalog).query(params,
+                                                                                limit=50,
+                                                                                sort_index='modified_date',
+                                                                                reverse=True))))
 
 
 #
@@ -321,10 +323,10 @@
                         Any(catalog['content_type'], CONTENT_TYPES.keys()),
                         Any(catalog['oid'], profile.favorites or ()))
             params = params | query if params else query
-        return unique(map(lambda x: IWorkflowVersions(x).get_last_versions()[0],
-                      CatalogResultSet(CatalogQuery(catalog).query(params,
-                                                                   sort_index='modified_date',
-                                                                   reverse=True))))
+        yield from unique_iter(map(lambda x: IWorkflowVersions(x).get_last_versions()[0],
+                                   CatalogResultSet(CatalogQuery(catalog).query(params,
+                                                                                sort_index='modified_date',
+                                                                                reverse=True))))
 
 
 @pagelet_config(name='my-favorites.html', context=ISiteRoot, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
@@ -379,13 +381,14 @@
         for tool in get_all_utilities_registered_for(IBaseSharedTool):
             workflow = IWorkflow(tool)
             query = And(Eq(catalog['parents'], intids.register(tool)),
+                        Any(catalog['content_type'], CONTENT_TYPES.keys()) & \
                         Or(Eq(catalog['role:owner'], self.request.principal.id),
                            Eq(catalog['role:contributor'], self.request.principal.id)),
                         Eq(catalog['workflow_state'], workflow.initial_state))
             params = params | query if params else query
-        return unique(CatalogResultSet(CatalogQuery(catalog).query(params,
-                                                                   sort_index='modified_date',
-                                                                   reverse=True)))
+        yield from unique_iter(CatalogResultSet(CatalogQuery(catalog).query(params,
+                                                                            sort_index='modified_date',
+                                                                            reverse=True)))
 
 
 @pagelet_config(name='my-preparations.html', context=ISiteRoot, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
@@ -440,13 +443,14 @@
         for tool in get_all_utilities_registered_for(IBaseSharedTool):
             workflow = IWorkflow(tool)
             query = And(Eq(catalog['parents'], intids.register(tool)),
+                        Any(catalog['content_type'], CONTENT_TYPES.keys()) & \
                         Or(Eq(catalog['role:owner'], self.request.principal.id),
                            Eq(catalog['role:contributor'], self.request.principal.id)),
                         Any(catalog['workflow_state'], workflow.waiting_states))
             params = params | query if params else query
-        return unique(CatalogResultSet(CatalogQuery(catalog).query(params,
-                                                                   sort_index='modified_date',
-                                                                   reverse=True)))
+        yield from unique_iter(CatalogResultSet(CatalogQuery(catalog).query(params,
+                                                                            sort_index='modified_date',
+                                                                            reverse=True)))
 
 
 @pagelet_config(name='my-submissions.html', context=ISiteRoot, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
@@ -501,13 +505,14 @@
         for tool in get_all_utilities_registered_for(IBaseSharedTool):
             workflow = IWorkflow(tool)
             query = And(Eq(catalog['parents'], intids.register(tool)),
+                        Any(catalog['content_type'], CONTENT_TYPES.keys()) & \
                         Or(Eq(catalog['role:owner'], self.request.principal.id),
                            Eq(catalog['role:contributor'], self.request.principal.id)),
                         Any(catalog['workflow_state'], workflow.published_states))
             params = params | query if params else query
-        return unique(CatalogResultSet(CatalogQuery(catalog).query(params,
-                                                                   sort_index='modified_date',
-                                                                   reverse=True)))
+        yield from unique_iter(CatalogResultSet(CatalogQuery(catalog).query(params,
+                                                                            sort_index='modified_date',
+                                                                            reverse=True)))
 
 
 @pagelet_config(name='my-publications.html', context=ISiteRoot, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
@@ -562,13 +567,14 @@
         for tool in get_all_utilities_registered_for(IBaseSharedTool):
             workflow = IWorkflow(tool)
             query = And(Eq(catalog['parents'], intids.register(tool)),
+                        Any(catalog['content_type'], CONTENT_TYPES.keys()) & \
                         Or(Eq(catalog['role:owner'], self.request.principal.id),
                            Eq(catalog['role:contributor'], self.request.principal.id)),
                         Any(catalog['workflow_state'], workflow.retired_states))
             params = params | query if params else query
-        return unique(CatalogResultSet(CatalogQuery(catalog).query(params,
-                                                                   sort_index='modified_date',
-                                                                   reverse=True)))
+        yield from unique_iter(CatalogResultSet(CatalogQuery(catalog).query(params,
+                                                                            sort_index='modified_date',
+                                                                            reverse=True)))
 
 
 @pagelet_config(name='my-retired-contents.html', context=ISiteRoot, layer=IPyAMSLayer,
@@ -625,18 +631,19 @@
         for tool in get_all_utilities_registered_for(IBaseSharedTool):
             workflow = IWorkflow(tool)
             query = And(Eq(catalog['parents'], intids.register(tool)),
+                        Any(catalog['content_type'], CONTENT_TYPES.keys()) & \
                         Or(Eq(catalog['role:owner'], principal_id),
                            Eq(catalog['role:contributor'], principal_id)),
                         Any(catalog['workflow_state'], workflow.archived_states))
             params = params | query if params else query
-        return unique(map(lambda x: sorted((version for version in
-                                            IWorkflowVersions(x).get_versions(IWorkflow(x).archived_states)
-                                            if principal_id in (version.owner | version.contributors)),
-                                           key=lambda x: IWorkflowState(x).version_id,
-                                           reverse=True)[0],
-                          CatalogResultSet(CatalogQuery(catalog).query(params,
-                                                                       sort_index='modified_date',
-                                                                       reverse=True))))
+        yield from unique_iter(map(lambda x: sorted((version for version in
+                                                     IWorkflowVersions(x).get_versions(IWorkflow(x).archived_states)
+                                                     if principal_id in (version.owner | version.contributors)),
+                                                    key=lambda x: IWorkflowState(x).version_id,
+                                                    reverse=True)[0],
+                                   CatalogResultSet(CatalogQuery(catalog).query(params,
+                                                                                sort_index='modified_date',
+                                                                                reverse=True))))
 
 
 @pagelet_config(name='my-archived-contents.html', context=ISiteRoot, layer=IPyAMSLayer,
@@ -714,12 +721,13 @@
         for tool in get_all_utilities_registered_for(IBaseSharedTool):
             workflow = IWorkflow(tool)
             query = And(Eq(catalog['parents'], intids.register(tool)),
+                        Any(catalog['content_type'], CONTENT_TYPES.keys()) & \
                         Any(catalog['workflow_state'], workflow.published_states))
             params = params | query if params else query
-        return unique(CatalogResultSet(CatalogQuery(catalog).query(params,
-                                                                   limit=50,
-                                                                   sort_index='modified_date',
-                                                                   reverse=True)))
+        yield from unique_iter(CatalogResultSet(CatalogQuery(catalog).query(params,
+                                                                            limit=50,
+                                                                            sort_index='modified_date',
+                                                                            reverse=True)))
 
 
 @pagelet_config(name='all-publications.html', context=ISiteRoot, layer=IPyAMSLayer,
@@ -782,10 +790,10 @@
             query = Eq(catalog['parents'], intids.register(tool)) & \
                     Any(catalog['content_type'], CONTENT_TYPES.keys())
             params = params | query if params else query
-        return unique(CatalogResultSet(CatalogQuery(catalog).query(params,
-                                                                   limit=50,
-                                                                   sort_index='modified_date',
-                                                                   reverse=True)))
+        yield from unique_iter(CatalogResultSet(CatalogQuery(catalog).query(params,
+                                                                            limit=50,
+                                                                            sort_index='modified_date',
+                                                                            reverse=True)))
 
 
 @pagelet_config(name='all-updates.html', context=ISiteRoot, layer=IPyAMSLayer,
--- a/src/pyams_content/root/zmi/templates/advanced-search.pt	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/root/zmi/templates/advanced-search.pt	Tue Jul 17 15:09:38 2018 +0200
@@ -22,7 +22,7 @@
 							  accept view.accept;
 							  autocomplete view.autocomplete;
 							  class view.css_class;
-							  data-ams-data extension:object_data(view);
+							  data-ams-data tales:object_data(view);
 							  data-ams-form-handler view.get_ajax_handler() | nothing;
 							  data-ams-form-options view.get_form_options() | nothing;
 							  data-ams-form-submit-target view.form_target | nothing;
@@ -75,7 +75,7 @@
 								<div class="col-md-9">
 									<label class="input"
 										   tal:attributes="class widget.widget_css_class | default;
-														   data-ams-data extension:object_data(widget);
+														   data-ams-data tales:object_data(widget);
 														   data-ams-form-validator view.get_widget_callback(widget.field.getName())">
 										<input tal:replace="structure widget.render()" />
 									</label>
@@ -96,7 +96,7 @@
 									<div class="col-md-4">
 										<label class="input"
 											   tal:attributes="class widget.widget_css_class | default;
-															   data-ams-data extension:object_data(widget);
+															   data-ams-data tales:object_data(widget);
 															   data-ams-form-validator view.get_widget_callback(widget.field.getName())">
 											<input tal:replace="structure widget.render()" />
 										</label>
@@ -116,7 +116,7 @@
 									<div class="col-md-3">
 										<label class="input"
 											   tal:attributes="class widget.widget_css_class | default;
-															   data-ams-data extension:object_data(widget);
+															   data-ams-data tales:object_data(widget);
 															   data-ams-form-validator view.get_widget_callback(widget.field.getName())">
 											<input tal:replace="structure widget.render()" />
 										</label>
@@ -131,7 +131,7 @@
 									<label class="input"
 											tal:define="widget view.widgets['created_after']"
 										   tal:attributes="class widget.widget_css_class | default;
-														   data-ams-data extension:object_data(widget);
+														   data-ams-data tales:object_data(widget);
 														   data-ams-form-validator view.get_widget_callback(widget.field.getName())">
 										<input tal:replace="structure widget.render()" />
 									</label>
@@ -143,7 +143,7 @@
 									<label class="input"
 											tal:define="widget view.widgets['created_before']"
 										   tal:attributes="class widget.widget_css_class | default;
-														   data-ams-data extension:object_data(widget);
+														   data-ams-data tales:object_data(widget);
 														   data-ams-form-validator view.get_widget_callback(widget.field.getName())">
 										<input tal:replace="structure widget.render()" />
 									</label>
@@ -157,7 +157,7 @@
 									<label class="input"
 											tal:define="widget view.widgets['modified_after']"
 										   tal:attributes="class widget.widget_css_class | default;
-														   data-ams-data extension:object_data(widget);
+														   data-ams-data tales:object_data(widget);
 														   data-ams-form-validator view.get_widget_callback(widget.field.getName())">
 										<input tal:replace="structure widget.render()" />
 									</label>
@@ -169,7 +169,7 @@
 									<label class="input"
 											tal:define="widget view.widgets['modified_before']"
 										   tal:attributes="class widget.widget_css_class | default;
-														   data-ams-data extension:object_data(widget);
+														   data-ams-data tales:object_data(widget);
 														   data-ams-form-validator view.get_widget_callback(widget.field.getName())">
 										<input tal:replace="structure widget.render()" />
 									</label>
--- a/src/pyams_content/shared/blog/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/blog/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -18,7 +18,7 @@
 # import interfaces
 from pyams_content.component.illustration import IIllustrationTarget, ILinkIllustrationTarget
 from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget
-from pyams_content.component.theme.interfaces import IThemesTarget
+from pyams_content.component.theme.interfaces import ITagsTarget, IThemesTarget
 from pyams_content.features.preview.interfaces import IPreviewTarget
 from pyams_content.features.review.interfaces import IReviewTarget
 from pyams_content.shared.blog.interfaces import IWfBlogPost, BLOG_CONTENT_TYPE, BLOG_CONTENT_NAME, IBlogPost, \
@@ -31,7 +31,7 @@
 from zope.interface import implementer, provider
 
 
-@implementer(IWfBlogPost, IParagraphContainerTarget, IThemesTarget, IIllustrationTarget,
+@implementer(IWfBlogPost, IParagraphContainerTarget, ITagsTarget, IThemesTarget, IIllustrationTarget,
              ILinkIllustrationTarget, IPreviewTarget, IReviewTarget)
 class WfBlogPost(WfSharedContent):
     """Base blog post"""
--- a/src/pyams_content/shared/common/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/common/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -17,12 +17,14 @@
 
 # import interfaces
 from hypatia.interfaces import ICatalog
-from pyams_content.interfaces import IBaseContentInfo
+from pyams_content.interfaces import IBaseContentInfo, OWNER_ROLE, MANAGER_ROLE, CONTRIBUTOR_ROLE, READER_ROLE, \
+    GUEST_ROLE
 from pyams_content.features.checker.interfaces import IContentChecker, MISSING_VALUE, MISSING_LANG_VALUE, ERROR_VALUE
 from pyams_content.features.review.interfaces import IReviewComments
 from pyams_content.shared.common.interfaces import IWfSharedContent, IWfSharedContentRoles, ISharedContent, \
     IBaseSharedTool, ISharedSite, IWfSharedContentFactory
 from pyams_i18n.interfaces import II18nManager, II18n
+from pyams_portal.interfaces import DESIGNER_ROLE
 from pyams_security.interfaces import IDefaultProtectionPolicy
 from pyams_sequence.interfaces import ISequentialIdTarget, ISequentialIdInfo
 from pyams_utils.interfaces import VIEW_PERMISSION
@@ -113,12 +115,13 @@
 class WfSharedContent(ProtectedObject, Persistent, Contained, I18nManagerMixin):
     """Shared data content class"""
 
-    __roles__ = ('pyams.Owner', 'pyams.Manager', 'pyams.Contributors', 'pyams.Reader', 'pyams.Guest')
+    __roles__ = (OWNER_ROLE, MANAGER_ROLE, CONTRIBUTOR_ROLE, DESIGNER_ROLE, READER_ROLE, GUEST_ROLE)
     roles_interface = IWfSharedContentRoles
 
     owner = RolePrincipalsFieldProperty(IWfSharedContentRoles['owner'])
     managers = RolePrincipalsFieldProperty(IWfSharedContentRoles['managers'])
     contributors = RolePrincipalsFieldProperty(IWfSharedContentRoles['contributors'])
+    designers = RolePrincipalsFieldProperty(IWfSharedContentRoles['designers'])
     readers = RolePrincipalsFieldProperty(IWfSharedContentRoles['readers'])
     guests = RolePrincipalsFieldProperty(IWfSharedContentRoles['guests'])
 
--- a/src/pyams_content/shared/common/interfaces/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/common/interfaces/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -18,7 +18,7 @@
 # import interfaces
 from pyams_content.interfaces import IBaseContent, MANAGE_CONTENT_PERMISSION, OWNER_ROLE, MANAGER_ROLE, \
     READER_ROLE, GUEST_ROLE, WEBMASTER_ROLE, PILOT_ROLE, CONTRIBUTOR_ROLE
-from pyams_portal.interfaces import IPortalContext
+from pyams_portal.interfaces import IPortalContext, DESIGNER_ROLE
 from pyams_workflow.interfaces import IWorkflowManagedContent
 from zope.container.interfaces import IContainer
 
@@ -65,6 +65,11 @@
                                  role_id=CONTRIBUTOR_ROLE,
                                  required=False)
 
+    designers = PrincipalsSet(title=_("Designers"),
+                              description=_("Designers are users which are allowed to manage presentation templates"),
+                              role_id=DESIGNER_ROLE,
+                              required=False)
+
 
 class ISharedSite(IBaseContent, IDeletableElement):
     """Shared site interface"""
@@ -161,7 +166,11 @@
                    required=False)
 
 
-class IWfSharedContentPortalContext(IWfSharedContent, IPortalContext):
+class IBaseContentPortalContext(IPortalContext):
+    """Content portal context interface"""
+
+
+class IWfSharedContentPortalContext(IWfSharedContent, IBaseContentPortalContext):
     """Shared content with portal support"""
 
 
@@ -188,9 +197,14 @@
     contributors = PrincipalsSet(title=_("Contributors"),
                                  description=_("Contributors are users which are allowed to update this content in "
                                                "addition to it's owner"),
-                                 role_id='pyams.Contributor',
+                                 role_id=CONTRIBUTOR_ROLE,
                                  required=False)
 
+    designers = PrincipalsSet(title=_("Designers"),
+                              description=_("Designers are users which are allowed to manage presentation templates"),
+                              role_id=DESIGNER_ROLE,
+                              required=False)
+
     readers = PrincipalsSet(title=_("Readers"),
                             description=_("Readers are users which are asked to verify and comment contents before "
                                           "they are published"),
--- a/src/pyams_content/shared/common/interfaces/types.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/common/interfaces/types.py	Tue Jul 17 15:09:38 2018 +0200
@@ -16,13 +16,14 @@
 # import standard library
 
 # import interfaces
-from pyams_content.shared.common.interfaces import ISharedTool
+from pyams_content.reference.pictograms.interfaces import PICTOGRAM_VOCABULARY
+from pyams_content.shared.common.interfaces import ISharedTool, IWfSharedContent, IBaseContentPortalContext
 from pyams_portal.interfaces import IPortalContext
 from zope.container.interfaces import IContainer
 from zope.location.interfaces import ILocation
 
 # import packages
-from pyams_i18n.schema import I18nTextLineField, I18nThumbnailImageField
+from pyams_i18n.schema import I18nTextLineField
 from zope.container.constraints import contains
 from zope.interface import Attribute
 from zope.schema import TextLine, List, Choice
@@ -30,6 +31,12 @@
 from pyams_content import _
 
 
+ALL_DATA_TYPES_VOCABULARY = 'PyAMS all data types'
+DATA_TYPES_VOCABULARY = 'PyAMS data types'
+DATA_SUBTYPES_VOCABULARY = 'PyAMS data subtypes'
+DATA_TYPE_FIELDS_VOCABULARY = 'PyAMS types interface fields'
+
+
 class IBaseDataType(ILocation):
     """Data interface for data-types and sub-types"""
 
@@ -65,9 +72,10 @@
                                    description=_("Label used to announce next date for this type"),
                                    required=False)
 
-    pictogram = I18nThumbnailImageField(title=_("Pictogram"),
-                                        description=_("Image associated to this data type"),
-                                        required=False)
+    pictogram = Choice(title=_("Pictogram"),
+                       description=_("Pictogram associated with this data type"),
+                       vocabulary=PICTOGRAM_VOCABULARY,
+                       required=False)
 
 
 class ISubType(IBaseDataType):
@@ -81,7 +89,7 @@
 
     field_names = List(title=_("Field names"),
                        description=_("List of fields associated with this data type"),
-                       value_type=Choice(vocabulary='PyAMS types interface fields'))
+                       value_type=Choice(vocabulary=DATA_TYPE_FIELDS_VOCABULARY))
 
 
 #
@@ -105,3 +113,23 @@
 
 class ITypedSharedToolPortalContext(ITypedSharedTool, IPortalContext):
     """Typed shared tool with portal context"""
+
+
+#
+# Typed content interfaces
+#
+
+class IWfTypedSharedContent(IWfSharedContent):
+    """Typed shared content"""
+
+    data_type = Choice(title=_("Data type"),
+                       description=_("Type of content data"),
+                       required=True,
+                       vocabulary=DATA_TYPES_VOCABULARY)
+
+    def get_data_type(self):
+        """Get associated data type"""
+
+
+class IWfTypedSharedContentPortalContext(IWfTypedSharedContent, IBaseContentPortalContext):
+    """Shared content with portal support"""
--- a/src/pyams_content/shared/common/manager.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/common/manager.py	Tue Jul 17 15:09:38 2018 +0200
@@ -19,6 +19,7 @@
 from pyams_content.interfaces import WEBMASTER_ROLE, PILOT_ROLE, MANAGER_ROLE, CONTRIBUTOR_ROLE
 from pyams_content.shared.common.interfaces import ISharedToolContainer, IBaseSharedTool, ISharedTool, ISharedToolRoles, \
     ISharedContentFactory
+from pyams_portal.interfaces import DESIGNER_ROLE
 from pyams_security.interfaces import IDefaultProtectionPolicy
 from pyams_workflow.interfaces import IWorkflow
 from zope.annotation.interfaces import IAttributeAnnotatable
@@ -46,7 +47,7 @@
 class BaseSharedTool(ProtectedObject, I18nManagerMixin):
     """Base shared tool class"""
 
-    __roles__ = (WEBMASTER_ROLE, PILOT_ROLE, MANAGER_ROLE, CONTRIBUTOR_ROLE)
+    __roles__ = (WEBMASTER_ROLE, PILOT_ROLE, MANAGER_ROLE, DESIGNER_ROLE, CONTRIBUTOR_ROLE)
 
     roles_interface = ISharedToolRoles
 
@@ -54,6 +55,7 @@
     pilots = RolePrincipalsFieldProperty(ISharedToolRoles['pilots'])
     managers = RolePrincipalsFieldProperty(ISharedToolRoles['managers'])
     contributors = RolePrincipalsFieldProperty(ISharedToolRoles['contributors'])
+    designers = RolePrincipalsFieldProperty(ISharedToolRoles['designers'])
 
     title = FieldProperty(IBaseSharedTool['title'])
     short_name = FieldProperty(IBaseSharedTool['short_name'])
--- a/src/pyams_content/shared/common/portal.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/common/portal.py	Tue Jul 17 15:09:38 2018 +0200
@@ -16,7 +16,7 @@
 # import standard library
 
 # import interfaces
-from pyams_content.shared.common.interfaces import IBaseSharedTool, IWfSharedContentPortalContext
+from pyams_content.shared.common.interfaces import IBaseSharedTool, IBaseContentPortalContext
 from pyams_portal.interfaces import IPortalPage, PORTAL_PAGE_KEY
 
 # import packages
@@ -37,7 +37,7 @@
         return get_parent(self, IBaseSharedTool, allow_context=False)
 
 
-@adapter_config(context=IWfSharedContentPortalContext, provides=IPortalPage)
+@adapter_config(context=IBaseContentPortalContext, provides=IPortalPage)
 def shared_content_portal_page_adapter(context):
     """Shared content portal page adapter"""
     return get_annotation_adapter(context, PORTAL_PAGE_KEY, SharedContentPortalPage)
--- a/src/pyams_content/shared/common/skin/oid.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/common/skin/oid.py	Tue Jul 17 15:09:38 2018 +0200
@@ -23,7 +23,7 @@
 from zope.traversing.interfaces import ITraversable
 
 # import packages
-from pyams_sequence.utility import get_reference_target
+from pyams_sequence.reference import get_reference_target
 from pyams_utils.adapter import adapter_config, ContextRequestAdapter
 from pyams_utils.registry import get_utility
 from pyramid.exceptions import NotFound
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_content/shared/common/skin/opengraph.py	Tue Jul 17 15:09:38 2018 +0200
@@ -0,0 +1,97 @@
+#
+# Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_content.component.illustration import IIllustration, IIllustrationTarget
+from pyams_content.component.theme.interfaces import ITagsInfo
+from pyams_content.shared.common.interfaces import IWfSharedContent
+from pyams_i18n.interfaces import II18n, INegotiator, II18nManager
+from pyams_file.interfaces import IThumbnails
+from pyams_skin.interfaces.configuration import IConfiguration
+from pyams_skin.interfaces.metas import IHTMLContentMetas
+from pyams_skin.layer import IPyAMSUserLayer
+from pyams_workflow.interfaces import IWorkflowPublicationInfo
+from zope.dublincore.interfaces import IZopeDublinCore
+
+# import packages
+from pyams_skin.metas import PropertyMeta
+from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter
+from pyams_utils.registry import get_utility
+from pyams_utils.traversing import get_parent
+from pyams_utils.url import canonical_url, absolute_url
+from zope.interface import Interface
+
+
+@adapter_config(name='opengraph', context=(IWfSharedContent, IPyAMSUserLayer, Interface), provides=IHTMLContentMetas)
+class OpengraphSharedContentMetasAdapter(ContextRequestViewAdapter):
+    """Opengraph shared content metas adapter"""
+
+    order = 15
+
+    def get_metas(self):
+        context = self.context
+        i18n = II18n(context)
+        request = self.request
+        negotiator = get_utility(INegotiator)
+        lang = negotiator.server_language
+        # main properties
+        yield PropertyMeta('og:title', i18n.query_attribute('title', lang=lang, request=request))
+        yield PropertyMeta('og:description', i18n.query_attribute('description', lang=lang, request=request) or '')
+        yield PropertyMeta('og:type', 'article')
+        # workflow informations
+        dc = IZopeDublinCore(context, None)
+        if (dc is not None) and dc.modified:
+            yield PropertyMeta('article:modified_time', dc.modified.isoformat())
+        pub_info = IWorkflowPublicationInfo(context, None)
+        if pub_info is not None:
+            if pub_info.first_publication_date:
+                yield PropertyMeta('article:published_time', pub_info.first_publication_date.isoformat())
+            if pub_info.publication_expiration_date:
+                yield PropertyMeta('article:expiration_time', pub_info.publication_expiration_date.isoformat())
+        # tags
+        tags = ITagsInfo(context, None)
+        if tags is not None:
+            for tag in tags.tags or ():
+                yield PropertyMeta('article:tag', tag.label)
+        # URL and site name
+        yield PropertyMeta('og:url', canonical_url(context, request))
+        configuration = IConfiguration(request.root)
+        yield PropertyMeta('og:site_name', configuration.title)
+        # illustration properties
+        registry = request.registry
+        illustration = None
+        target = context
+        while target is not None:
+            illustration = registry.queryAdapter(target, IIllustration, name='link')
+            if (illustration is None) or (not illustration.has_data()):
+                illustration = registry.queryAdapter(target, IIllustration)
+            if (illustration is not None) and illustration.has_data():
+                break
+            target = get_parent(target, IIllustrationTarget, allow_context=False)
+        if (target is not None) and (illustration is not None):
+            data = II18n(illustration).query_attribute('data', lang=lang, request=request)
+            thumbnail = IThumbnails(data).get_thumbnail('800x600')
+            yield PropertyMeta('og:image:url', absolute_url(thumbnail, self.request))
+            yield PropertyMeta('og:image:type', thumbnail.content_type)
+            image_size = thumbnail.image_size
+            yield PropertyMeta('og:image:width', image_size[0])
+            yield PropertyMeta('og:image:height', image_size[1])
+            yield PropertyMeta('og:image:alt', II18n(illustration).query_attribute('alt_title', lang=lang, request=request))
+        # locales properties
+        yield PropertyMeta('of:locale', lang)
+        for lang in II18nManager(context).languages or ():
+            yield PropertyMeta('of:locale:alternate', lang)
--- a/src/pyams_content/shared/common/types.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/common/types.py	Tue Jul 17 15:09:38 2018 +0200
@@ -19,21 +19,26 @@
 from pyams_content.component.extfile.interfaces import IExtFileContainerTarget
 from pyams_content.component.links.interfaces import ILinkContainerTarget
 from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget
+from pyams_content.component.theme.interfaces import IThemesTarget, IThemesInfo
 from pyams_content.interfaces import MANAGE_TOOL_PERMISSION
 from pyams_content.shared.common.interfaces.types import IDataType, ISubType, IBaseDataType, ITypedSharedTool, \
-    ITypedDataManager, DATA_MANAGER_ANNOTATION_KEY
+    ITypedDataManager, DATA_MANAGER_ANNOTATION_KEY, DATA_TYPES_VOCABULARY, DATA_TYPE_FIELDS_VOCABULARY, \
+    IWfTypedSharedContent, DATA_SUBTYPES_VOCABULARY
 from pyams_form.interfaces.form import IFormContextPermissionChecker
+from pyams_i18n.interfaces import II18n
+from zope.lifecycleevent.interfaces import IObjectAddedEvent
 from zope.location.interfaces import ISublocations
 from zope.traversing.interfaces import ITraversable
 
 # import packages
 from persistent import Persistent
+from pyams_content.shared.common import WfSharedContent
 from pyams_content.shared.common.manager import SharedTool
-from pyams_i18n.property import I18nFileProperty
 from pyams_utils.adapter import adapter_config, ContextAdapter, get_annotation_adapter
 from pyams_utils.request import check_request
 from pyams_utils.traversing import get_parent
 from pyams_utils.vocabulary import vocabulary_config
+from pyramid.events import subscriber
 from zope.container.contained import Contained
 from zope.container.ordered import OrderedContainer
 from zope.interface import implementer
@@ -52,7 +57,7 @@
     single_label = FieldProperty(IBaseDataType['single_label'])
     seeall_label = FieldProperty(IBaseDataType['seeall_label'])
     next_label = FieldProperty(IBaseDataType['next_label'])
-    pictogram = I18nFileProperty(IBaseDataType['pictogram'])
+    pictogram = FieldProperty(IBaseDataType['pictogram'])
 
 
 @implementer(ISubType, IParagraphContainerTarget, IExtFileContainerTarget, ILinkContainerTarget)
@@ -60,7 +65,7 @@
     """Data sub-type persistent class"""
 
 
-@implementer(IDataType, IParagraphContainerTarget, IExtFileContainerTarget, ILinkContainerTarget)
+@implementer(IDataType, IParagraphContainerTarget, IExtFileContainerTarget, ILinkContainerTarget, IThemesTarget)
 class DataType(BaseDataType, OrderedContainer):
     """Data type persistent class"""
 
@@ -108,16 +113,83 @@
         return ITypedDataManager(self.context).values()
 
 
-@vocabulary_config(name='PyAMS types interface fields')
-class TypedSharedToolDataTypesFields(SimpleVocabulary):
-    """Typed shared tool data types fields vocabulary"""
+#
+# Typed shared content
+#
+
+@implementer(IWfTypedSharedContent)
+class WfTypedSharedContent(WfSharedContent):
+    """Typed shared content"""
+
+    data_type = FieldProperty(IWfTypedSharedContent['data_type'])
+
+    def get_data_type(self):
+        if not self.data_type:
+            return None
+        tool = get_parent(self, ITypedSharedTool)
+        if tool is not None:
+            manager = ITypedDataManager(tool)
+            return manager.get(self.data_type)
+
+
+@subscriber(IObjectAddedEvent, context_selector=IWfTypedSharedContent)
+def handle_added_typed_shared_content(event):
+    """Automatically assign themes for newly created contents"""
+    content = event.object
+    if not IThemesTarget.providedBy(content):
+        return
+    data_type = content.get_data_type()
+    if data_type is not None:
+        IThemesInfo(content).themes = IThemesInfo(data_type).themes
+
+
+#
+# Data types vocabularies
+#
+
+@vocabulary_config(name=DATA_TYPES_VOCABULARY)
+class TypedSharedToolDataTypesVocabulary(SimpleVocabulary):
+    """Typed shared tool data types vocabulary"""
 
     def __init__(self, context):
         terms = []
         parent = get_parent(context, ITypedSharedTool)
         if parent is not None:
             request = check_request()
+            manager = ITypedDataManager(parent)
+            terms = [SimpleTerm(datatype.__name__,
+                                title=II18n(datatype).query_attribute('label', request=request))
+                     for datatype in manager.values()]
+        super(TypedSharedToolDataTypesVocabulary, self).__init__(terms)
+
+
+@vocabulary_config(name=DATA_SUBTYPES_VOCABULARY)
+class TypedSharedToolDataSubtypesVocabulary(SimpleVocabulary):
+    """Typed shared tool data subtypes vocabulary"""
+
+    def __init__(self, context):
+        terms = []
+        if IWfTypedSharedContent.providedBy(context):
+            parent = get_parent(context, ITypedSharedTool)
+            if parent is not None:
+                request = check_request()
+                datatype = ITypedDataManager(parent).get(context.data_type)
+                terms = [SimpleTerm(subtype.__name__,
+                                    title=II18n(subtype).query_attribute('label', request=request))
+                         for subtype in datatype.values()]
+        super(TypedSharedToolDataSubtypesVocabulary, self).__init__(terms)
+
+
+@vocabulary_config(name=DATA_TYPE_FIELDS_VOCABULARY)
+class TypedSharedToolDataTypesFieldsVocabulary(SimpleVocabulary):
+    """Typed shared tool data types fields vocabulary"""
+
+    def __init__(self, context):
+        terms = []
+        parent = get_parent(context, ITypedSharedTool)
+        if (parent is not None) and parent.shared_content_types_fields:
+            request = check_request()
             translate = request.localizer.translate
             terms = [SimpleTerm(name, title=translate(field.title))
                      for name, field in getFieldsInOrder(parent.shared_content_types_fields)]
-        super(TypedSharedToolDataTypesFields, self).__init__(terms)
+        super(TypedSharedToolDataTypesFieldsVocabulary, self).__init__(terms)
--- a/src/pyams_content/shared/common/zmi/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/common/zmi/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -82,8 +82,6 @@
         super(SharedContentAddForm, self).updateWidgets(prefix)
         if 'title' in self.widgets:
             self.widgets['title'].description = _("This title can be modified afterwards")
-        if 'notepad' in self.widgets:
-            self.widgets['notepad'].widget_css_class = 'textarea'
 
     def create(self, data):
         return self.context.shared_content_factory.content_class()
@@ -290,11 +288,6 @@
 
     edit_permission = CREATE_CONTENT_PERMISSION
 
-    def updateWidgets(self, prefix=None):
-        super(WfSharedContentDuplicateForm, self).updateWidgets(prefix)
-        if 'comment' in self.widgets:
-            self.widgets['comment'].widget_css_class = 'textarea'
-
     def updateActions(self):
         super(WfSharedContentDuplicateForm, self).updateActions()
         if 'duplicate' in self.actions:
--- a/src/pyams_content/shared/common/zmi/dashboard.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/common/zmi/dashboard.py	Tue Jul 17 15:09:38 2018 +0200
@@ -52,7 +52,7 @@
 from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter
 from pyams_utils.date import format_datetime, SH_DATETIME_FORMAT
 from pyams_utils.fanstatic import get_resource_path
-from pyams_utils.list import unique
+from pyams_utils.list import unique_iter
 from pyams_utils.property import cached_property
 from pyams_utils.registry import get_utility
 from pyams_utils.timezone import tztime
@@ -340,12 +340,13 @@
         catalog = get_utility(ICatalog)
         workflow = get_utility(IWorkflow, name=self.context.shared_content_workflow)
         params = Eq(catalog['parents'], intids.register(self.context)) & \
+                 Any(catalog['content_type'], CONTENT_TYPES.keys()) & \
                  Any(catalog['workflow_state'], workflow.waiting_states)
-        return filter(self.check_access,
-                      unique(map(lambda x: sorted(IWorkflowVersions(x).get_versions(IWorkflowState(x).state),
-                                                  key=lambda y: IZopeDublinCore(y).modified, reverse=True)[0],
-                                 CatalogResultSet(CatalogQuery(catalog).query(params,
-                                                                              sort_index='modified_date')))))
+        yield from filter(self.check_access,
+                          unique_iter(map(lambda x: sorted(IWorkflowVersions(x).get_versions(IWorkflowState(x).state),
+                                                           key=lambda y: IZopeDublinCore(y).modified, reverse=True)[0],
+                                          CatalogResultSet(CatalogQuery(catalog).query(params,
+                                                                                       sort_index='modified_date')))))
 
     def check_access(self, content):
         if self.request.has_permission(MANAGE_SITE_ROOT_PERMISSION, context=content):
@@ -383,12 +384,13 @@
         catalog = get_utility(ICatalog)
         workflow = get_utility(IWorkflow, name=self.context.shared_content_workflow)
         params = Eq(catalog['parents'], intids.register(self.context)) & \
+                 Any(catalog['content_type'], CONTENT_TYPES.keys()) & \
                  Any(catalog['workflow_state'], workflow.waiting_states) & \
                  Eq(catalog['workflow_principal'], self.request.principal.id)
-        return unique(map(lambda x: sorted(IWorkflowVersions(x).get_versions(IWorkflowState(x).state),
-                                           key=lambda y: IZopeDublinCore(y).modified, reverse=True)[0],
-                          CatalogResultSet(CatalogQuery(catalog).query(params,
-                                                                       sort_index='modified_date'))))
+        yield from unique_iter(map(lambda x: sorted(IWorkflowVersions(x).get_versions(IWorkflowState(x).state),
+                                                    key=lambda y: IZopeDublinCore(y).modified, reverse=True)[0],
+                                   CatalogResultSet(CatalogQuery(catalog).query(params,
+                                                                                sort_index='modified_date'))))
 
 
 #
@@ -421,12 +423,12 @@
                      Any(catalog['content_type'], CONTENT_TYPES.keys()),
                      Or(Eq(catalog['role:owner'], self.request.principal.id),
                         Eq(catalog['role:contributor'], self.request.principal.id)))
-        return unique(map(lambda x: sorted(IWorkflowVersions(x).get_versions(IWorkflowState(x).state),
-                                           key=lambda y: IZopeDublinCore(y).modified, reverse=True)[0],
-                          CatalogResultSet(CatalogQuery(catalog).query(params,
-                                                                       limit=50,
-                                                                       sort_index='modified_date',
-                                                                       reverse=True))))
+        yield from unique_iter(map(lambda x: sorted(IWorkflowVersions(x).get_versions(IWorkflowState(x).state),
+                                                    key=lambda y: IZopeDublinCore(y).modified, reverse=True)[0],
+                                   CatalogResultSet(CatalogQuery(catalog).query(params,
+                                                                                limit=50,
+                                                                                sort_index='modified_date',
+                                                                                reverse=True))))
 
 
 #
@@ -516,10 +518,10 @@
         params = And(Eq(catalog['parents'], intids.register(self.context)),
                      Any(catalog['content_type'], CONTENT_TYPES.keys()),
                      Any(catalog['oid'], profile.favorites or ()))
-        return unique(map(lambda x: IWorkflowVersions(x).get_last_versions()[0],
-                      CatalogResultSet(CatalogQuery(catalog).query(params,
-                                                                   sort_index='modified_date',
-                                                                   reverse=True))))
+        yield from unique_iter(map(lambda x: IWorkflowVersions(x).get_last_versions()[0],
+                                   CatalogResultSet(CatalogQuery(catalog).query(params,
+                                                                                sort_index='modified_date',
+                                                                                reverse=True))))
 
 
 @pagelet_config(name='my-favorites.html', context=IBaseSharedTool, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
@@ -576,12 +578,13 @@
         catalog = get_utility(ICatalog)
         workflow = get_utility(IWorkflow, name=self.context.shared_content_workflow)
         params = And(Eq(catalog['parents'], intids.register(self.context)),
+                     Any(catalog['content_type'], CONTENT_TYPES.keys()) & \
                      Or(Eq(catalog['role:owner'], self.request.principal.id),
                         Eq(catalog['role:contributor'], self.request.principal.id)),
                      Eq(catalog['workflow_state'], workflow.initial_state))
-        return unique(CatalogResultSet(CatalogQuery(catalog).query(params,
-                                                                   sort_index='modified_date',
-                                                                   reverse=True)))
+        yield from unique_iter(CatalogResultSet(CatalogQuery(catalog).query(params,
+                                                                            sort_index='modified_date',
+                                                                            reverse=True)))
 
 
 @pagelet_config(name='my-preparations.html', context=IBaseSharedTool, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
@@ -638,12 +641,13 @@
         catalog = get_utility(ICatalog)
         workflow = get_utility(IWorkflow, name=self.context.shared_content_workflow)
         params = And(Eq(catalog['parents'], intids.register(self.context)),
+                     Any(catalog['content_type'], CONTENT_TYPES.keys()) & \
                      Or(Eq(catalog['role:owner'], self.request.principal.id),
                         Eq(catalog['role:contributor'], self.request.principal.id)),
                      Any(catalog['workflow_state'], workflow.waiting_states))
-        return unique(CatalogResultSet(CatalogQuery(catalog).query(params,
-                                                                   sort_index='modified_date',
-                                                                   reverse=True)))
+        yield from unique_iter(CatalogResultSet(CatalogQuery(catalog).query(params,
+                                                                            sort_index='modified_date',
+                                                                            reverse=True)))
 
 
 @pagelet_config(name='my-submissions.html', context=IBaseSharedTool, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
@@ -700,12 +704,13 @@
         catalog = get_utility(ICatalog)
         workflow = get_utility(IWorkflow, name=self.context.shared_content_workflow)
         params = And(Eq(catalog['parents'], intids.register(self.context)),
+                     Any(catalog['content_type'], CONTENT_TYPES.keys()) & \
                      Or(Eq(catalog['role:owner'], self.request.principal.id),
                         Eq(catalog['role:contributor'], self.request.principal.id)),
                      Any(catalog['workflow_state'], workflow.published_states))
-        return unique(CatalogResultSet(CatalogQuery(catalog).query(params,
-                                                                   sort_index='modified_date',
-                                                                   reverse=True)))
+        yield from unique_iter(CatalogResultSet(CatalogQuery(catalog).query(params,
+                                                                            sort_index='modified_date',
+                                                                            reverse=True)))
 
 
 @pagelet_config(name='my-publications.html', context=IBaseSharedTool, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
@@ -762,12 +767,13 @@
         catalog = get_utility(ICatalog)
         workflow = get_utility(IWorkflow, name=self.context.shared_content_workflow)
         params = And(Eq(catalog['parents'], intids.register(self.context)),
+                     Any(catalog['content_type'], CONTENT_TYPES.keys()) & \
                      Or(Eq(catalog['role:owner'], self.request.principal.id),
                         Eq(catalog['role:contributor'], self.request.principal.id)),
                      Any(catalog['workflow_state'], workflow.retired_states))
-        return unique(CatalogResultSet(CatalogQuery(catalog).query(params,
-                                                                   sort_index='modified_date',
-                                                                   reverse=True)))
+        yield from unique_iter(CatalogResultSet(CatalogQuery(catalog).query(params,
+                                                                            sort_index='modified_date',
+                                                                            reverse=True)))
 
 
 @pagelet_config(name='my-retired-contents.html', context=IBaseSharedTool, layer=IPyAMSLayer,
@@ -826,17 +832,18 @@
         principal_id = self.request.principal.id
         workflow = get_utility(IWorkflow, name=self.context.shared_content_workflow)
         params = And(Eq(catalog['parents'], intids.register(self.context)),
+                     Any(catalog['content_type'], CONTENT_TYPES.keys()) & \
                      Or(Eq(catalog['role:owner'], principal_id),
                         Eq(catalog['role:contributor'], principal_id)),
                      Any(catalog['workflow_state'], workflow.archived_states))
-        return unique(map(lambda x: sorted((version for version in
-                                            IWorkflowVersions(x).get_versions(workflow.archived_states)
-                                            if principal_id in (version.owner | version.contributors)),
-                                           key=lambda x: IWorkflowState(x).version_id,
-                                           reverse=True)[0],
-                          CatalogResultSet(CatalogQuery(catalog).query(params,
-                                                                       sort_index='modified_date',
-                                                                       reverse=True))))
+        yield from unique_iter(map(lambda x: sorted((version for version in
+                                                     IWorkflowVersions(x).get_versions(workflow.archived_states)
+                                                     if principal_id in (version.owner | version.contributors)),
+                                                    key=lambda x: IWorkflowState(x).version_id,
+                                                    reverse=True)[0],
+                                   CatalogResultSet(CatalogQuery(catalog).query(params,
+                                                                                sort_index='modified_date',
+                                                                                reverse=True))))
 
 
 @pagelet_config(name='my-archived-contents.html', context=IBaseSharedTool, layer=IPyAMSLayer,
@@ -916,11 +923,12 @@
         catalog = get_utility(ICatalog)
         workflow = get_utility(IWorkflow, name=self.context.shared_content_workflow)
         params = And(Eq(catalog['parents'], intids.register(self.context)),
+                     Any(catalog['content_type'], CONTENT_TYPES.keys()) & \
                      Any(catalog['workflow_state'], workflow.published_states))
-        return unique(CatalogResultSet(CatalogQuery(catalog).query(params,
-                                                                   limit=50,
-                                                                   sort_index='modified_date',
-                                                                   reverse=True)))
+        yield from unique_iter(CatalogResultSet(CatalogQuery(catalog).query(params,
+                                                                            limit=50,
+                                                                            sort_index='modified_date',
+                                                                            reverse=True)))
 
 
 @pagelet_config(name='all-publications.html', context=IBaseSharedTool, layer=IPyAMSLayer,
@@ -984,10 +992,10 @@
         catalog = get_utility(ICatalog)
         params = Eq(catalog['parents'], intids.register(self.context)) & \
                  Any(catalog['content_type'], CONTENT_TYPES.keys())
-        return unique(CatalogResultSet(CatalogQuery(catalog).query(params,
-                                                                   limit=50,
-                                                                   sort_index='modified_date',
-                                                                   reverse=True)))
+        yield from unique_iter(CatalogResultSet(CatalogQuery(catalog).query(params,
+                                                                            limit=50,
+                                                                            sort_index='modified_date',
+                                                                            reverse=True)))
 
 
 @pagelet_config(name='all-updates.html', context=IBaseSharedTool, layer=IPyAMSLayer,
--- a/src/pyams_content/shared/common/zmi/manager.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/common/zmi/manager.py	Tue Jul 17 15:09:38 2018 +0200
@@ -120,7 +120,7 @@
 class SharedToolPropertiesHelpAdapter(FormHelp):
     """Shared tool properties help adapter"""
 
-    permission = MANAGE_TOOL_PERMISSION
+    permission = MANAGE_SYSTEM_PERMISSION
 
     header = _("WARNING")
     status = 'danger'
--- a/src/pyams_content/shared/common/zmi/portal.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/common/zmi/portal.py	Tue Jul 17 15:09:38 2018 +0200
@@ -20,6 +20,7 @@
 from pyams_content.shared.common.interfaces import IWfSharedContentPortalContext, ISharedToolPortalContext, ISharedTool
 from pyams_content.shared.common.interfaces.types import ITypedSharedToolPortalContext
 from pyams_form.interfaces.form import IFormHelp
+from pyams_portal.interfaces import MANAGE_TEMPLATE_PERMISSION
 from pyams_skin.layer import IPyAMSLayer
 from pyams_zmi.layer import IAdminLayer
 
@@ -27,7 +28,6 @@
 from pyams_form.form import ajax_config
 from pyams_form.help import FormHelp
 from pyams_pagelet.pagelet import pagelet_config
-from pyams_portal import MANAGE_TEMPLATE_PERMISSION
 from pyams_portal.zmi.page import PortalContextTemplatePropertiesEditForm
 from pyams_utils.adapter import adapter_config
 
--- a/src/pyams_content/shared/common/zmi/properties.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/common/zmi/properties.py	Tue Jul 17 15:09:38 2018 +0200
@@ -74,7 +74,8 @@
 
 @pagelet_config(name='properties.html', context=IWfSharedContent, layer=IPyAMSLayer,
                 permission=MANAGE_CONTENT_PERMISSION)
-@ajax_config(name='properties.json', context=IWfSharedContent, layer=IPyAMSLayer, permission=MANAGE_CONTENT_PERMISSION)
+@ajax_config(name='properties.json', context=IWfSharedContent, layer=IPyAMSLayer,
+             permission=MANAGE_CONTENT_PERMISSION)
 @implementer(IPropertiesEditForm, IWidgetForm, IInnerPage)
 class SharedContentPropertiesEditForm(AdminEditForm):
     """Shared content properties edit form"""
@@ -89,10 +90,6 @@
         super(SharedContentPropertiesEditForm, self).updateWidgets(prefix)
         if 'short_name' in self.widgets:
             self.widgets['short_name'].set_mode(HIDDEN_MODE)
-        if 'description' in self.widgets:
-            self.widgets['description'].widget_css_class = 'textarea'
-        if 'notepad' in self.widgets:
-            self.widgets['notepad'].widget_css_class = 'textarea'
 
     def get_ajax_output(self, changes):
         updated = changes.get(IBaseContent, ())
--- a/src/pyams_content/shared/common/zmi/rename.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/common/zmi/rename.py	Tue Jul 17 15:09:38 2018 +0200
@@ -84,11 +84,12 @@
     def updateWidgets(self, prefix=None):
         super(SiteContainerRenameForm, self).updateWidgets(prefix)
         self.widgets['__name__'].label = _("Item URL part")
+        self.widgets['__name__'].description = _("URL part used to access this content")
 
     def update_content(self, content, data):
         data = data.get(self, data)
         old_name = content.__name__
-        new_name = data['__name__'] = translate_string(content.__name__, spaces='-', keep_chars='-')
+        new_name = data['__name__'] = translate_string(data['__name__'], spaces='-', keep_chars='-')
         changes = super(SiteContainerRenameForm, self).update_content(content, data)
         if changes:
             # revert rename to adjust container properties
--- a/src/pyams_content/shared/common/zmi/security.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/common/zmi/security.py	Tue Jul 17 15:09:38 2018 +0200
@@ -115,7 +115,7 @@
 class SharedToolContributorsRestrictionsChecksColumn(I18nColumn, GetAttrColumn):
     """Shared tool contributor enabled publication checks column"""
 
-    _header = _("Publication checks")
+    _header = _("Activated publication checks?")
     weight = 20
     cssClasses = {'td': 'center'}
 
@@ -267,7 +267,7 @@
 class SharedToolManagerRestrictionsChecksColumn(I18nColumn, GetAttrColumn):
     """Shared tool manager enabled publication checks column"""
 
-    _header = _("Publication checks")
+    _header = _("Activated publication checks?")
     weight = 40
     cssClasses = {'td': 'center'}
 
--- a/src/pyams_content/shared/common/zmi/templates/advanced-search.pt	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/common/zmi/templates/advanced-search.pt	Tue Jul 17 15:09:38 2018 +0200
@@ -22,7 +22,7 @@
 							  accept view.accept;
 							  autocomplete view.autocomplete;
 							  class view.css_class;
-							  data-ams-data extension:object_data(view);
+							  data-ams-data tales:object_data(view);
 							  data-ams-form-handler view.get_ajax_handler() | nothing;
 							  data-ams-form-options view.get_form_options() | nothing;
 							  data-ams-form-submit-target view.form_target | nothing;
@@ -75,7 +75,7 @@
 								<div class="col-md-9">
 									<label class="input"
 										   tal:attributes="class widget.widget_css_class | default;
-														   data-ams-data extension:object_data(widget);
+														   data-ams-data tales:object_data(widget);
 														   data-ams-form-validator view.get_widget_callback(widget.field.getName())">
 										<input tal:replace="structure widget.render()" />
 									</label>
@@ -96,7 +96,7 @@
 									<div class="col-md-4">
 										<label class="input"
 											   tal:attributes="class widget.widget_css_class | default;
-															   data-ams-data extension:object_data(widget);
+															   data-ams-data tales:object_data(widget);
 															   data-ams-form-validator view.get_widget_callback(widget.field.getName())">
 											<input tal:replace="structure widget.render()" />
 										</label>
@@ -116,7 +116,7 @@
 									<div class="col-md-4">
 										<label class="input"
 											   tal:attributes="class widget.widget_css_class | default;
-															   data-ams-data extension:object_data(widget);
+															   data-ams-data tales:object_data(widget);
 															   data-ams-form-validator view.get_widget_callback(widget.field.getName())">
 											<input tal:replace="structure widget.render()" />
 										</label>
@@ -131,7 +131,7 @@
 									<label class="input"
 											tal:define="widget view.widgets['created_after']"
 										   tal:attributes="class widget.widget_css_class | default;
-														   data-ams-data extension:object_data(widget);
+														   data-ams-data tales:object_data(widget);
 														   data-ams-form-validator view.get_widget_callback(widget.field.getName())">
 										<input tal:replace="structure widget.render()" />
 									</label>
@@ -143,7 +143,7 @@
 									<label class="input"
 											tal:define="widget view.widgets['created_before']"
 										   tal:attributes="class widget.widget_css_class | default;
-														   data-ams-data extension:object_data(widget);
+														   data-ams-data tales:object_data(widget);
 														   data-ams-form-validator view.get_widget_callback(widget.field.getName())">
 										<input tal:replace="structure widget.render()" />
 									</label>
@@ -157,7 +157,7 @@
 									<label class="input"
 											tal:define="widget view.widgets['modified_after']"
 										   tal:attributes="class widget.widget_css_class | default;
-														   data-ams-data extension:object_data(widget);
+														   data-ams-data tales:object_data(widget);
 														   data-ams-form-validator view.get_widget_callback(widget.field.getName())">
 										<input tal:replace="structure widget.render()" />
 									</label>
@@ -169,7 +169,7 @@
 									<label class="input"
 											tal:define="widget view.widgets['modified_before']"
 										   tal:attributes="class widget.widget_css_class | default;
-														   data-ams-data extension:object_data(widget);
+														   data-ams-data tales:object_data(widget);
 														   data-ams-form-validator view.get_widget_callback(widget.field.getName())">
 										<input tal:replace="structure widget.render()" />
 									</label>
--- a/src/pyams_content/shared/common/zmi/templates/check-input.pt	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/common/zmi/templates/check-input.pt	Tue Jul 17 15:09:38 2018 +0200
@@ -30,7 +30,7 @@
 								accesskey view/accesskey;
 								onselect view/onselect;
 								checked python: checked and 'checked' or None;
-								data-ams-data extension:object_data(view);" />
+								data-ams-data tales:object_data(view);" />
 		<i></i><span tal:replace="item/label" i18n:translate="">Label</span>
 	</label>
 	<button class="btn btn-xs col-md-2" i18n:domain="pyams_content"
--- a/src/pyams_content/shared/common/zmi/templates/header.pt	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/common/zmi/templates/header.pt	Tue Jul 17 15:09:38 2018 +0200
@@ -1,5 +1,5 @@
 <tal:block i18n:domain="pyams_content"
-		   define="config extension:back_configuration">
+		   define="config tales:back_configuration">
 	<tal:if condition="config.display_shared_tool_title">
 		<h1 class="page-title margin-bottom-5" tal:define="back_url view.back_url">
 			<a class="font-xs hint" data-ams-target="#content"
@@ -22,7 +22,7 @@
 		   data-ams-click-handler="PyAMS_content.profile.switchFavorite"
 		   data-ams-hint-gravity="w" title="Add/remove from favorites" i18n:attributes="title"
 		   tal:attributes="class 'fa fa-star{0} txt-color-blue hint opaque align-middle padding-left-10 padding-bottom-5'.format('' if view.favorite_content else '-o');
-						   data-ams-plugin-pyams_content-src extension:resource_path('pyams_content.skin:pyams_content');
+						   data-ams-plugin-pyams_content-src tales:resource_path('pyams_content.skin:pyams_content');
 						   data-sequence-oid view.hex_oid;"></i><br />
 		<span class="content-version" tal:content="string:V${view.version_id}">Version</span> =
 		<span class="content-state" tal:content="structure view.state">state</span> |
--- a/src/pyams_content/shared/common/zmi/templates/preview-input.pt	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/common/zmi/templates/preview-input.pt	Tue Jul 17 15:09:38 2018 +0200
@@ -30,7 +30,7 @@
 								accesskey view/accesskey;
 								onselect view/onselect;
 								checked python: checked and 'checked' or None;
-								data-ams-data extension:object_data(view);" />
+								data-ams-data tales:object_data(view);" />
 		<i></i><span tal:replace="item/label" i18n:translate="">Label</span>
 	</label>
 	<button class="btn btn-xs col-md-2" i18n:domain="pyams_content"
--- a/src/pyams_content/shared/common/zmi/types.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/common/zmi/types.py	Tue Jul 17 15:09:38 2018 +0200
@@ -17,9 +17,9 @@
 import json
 
 # import interfaces
-from pyams_content.interfaces import MANAGE_TOOL_PERMISSION
+from pyams_content.interfaces import MANAGE_TOOL_PERMISSION, MANAGE_CONTENT_PERMISSION
 from pyams_content.shared.common.interfaces.types import ITypedSharedTool, ITypedDataManager, \
-    IBaseDataType, IDataType, ISubType
+    IBaseDataType, IDataType, ISubType, IWfTypedSharedContent
 from pyams_content.skin import pyams_content
 from pyams_i18n.interfaces import II18n
 from pyams_skin.interfaces.container import ITableElementName
@@ -32,9 +32,13 @@
 from z3c.table.interfaces import IValues, IColumn
 
 # import packages
+from pyams_content.reference.pictograms.zmi.widget import PictogramSelectFieldWidget
 from pyams_content.shared.common.types import DataType, SubType
+from pyams_content.shared.common.zmi import SharedContentAddForm
+from pyams_content.shared.common.zmi.properties import SharedContentPropertiesEditForm
 from pyams_form.form import AJAXAddForm, ajax_config
 from pyams_form.security import ProtectedFormObjectMixin
+from pyams_i18n.widget import I18nSEOTextLineFieldWidget
 from pyams_pagelet.pagelet import pagelet_config
 from pyams_skin.container import delete_container_element
 from pyams_skin.event import get_json_table_refresh_event
@@ -60,7 +64,7 @@
 
 
 @viewlet_config(name='data-types.menu', context=ITypedSharedTool, layer=IAdminLayer,
-                manager=IPropertiesMenu, permission=MANAGE_TOOL_PERMISSION, weight=10)
+                manager=IPropertiesMenu, permission=MANAGE_TOOL_PERMISSION, weight=5)
 class TypedSharedToolTypesMenu(MenuItem):
     """Typed shared tool types menu"""
 
@@ -190,6 +194,22 @@
     permission = MANAGE_TOOL_PERMISSION
 
 
+@adapter_config(name='themes', context=(ITypedSharedTool, IPyAMSLayer, TypedSharedToolTypesTable),
+                provides=IColumn)
+class TypedSharedToolTypesThemesColumn(ActionColumn):
+    """Typed shared tool types themes column"""
+
+    weight = 120
+
+    icon_class = 'fa fa-fw fa-tags'
+    icon_hint = _("Default themes")
+
+    url = 'themes-dialog.html'
+    modal_target = True
+
+    permission = MANAGE_TOOL_PERMISSION
+
+
 @adapter_config(name='trash', context=(ITypedSharedTool, IPyAMSLayer, TypedSharedToolTypesTable),
                 provides=IColumn)
 class TypedSharedToolTypesTrashColumn(TrashColumn):
@@ -250,7 +270,13 @@
     label_css_class = 'control-label col-md-4'
     input_css_class = 'col-md-8'
 
-    fields = field.Fields(IDataType).omit('__parent__', '__name__')
+    @property
+    def fields(self):
+        fields = field.Fields(IDataType).omit('__parent__', '__name__')
+        fields['pictogram'].widgetFactory = PictogramSelectFieldWidget
+        if not self.context.shared_content_types_fields:
+            fields = fields.omit('field_names')
+        return fields
 
     edit_permission = MANAGE_TOOL_PERMISSION
 
@@ -287,7 +313,14 @@
     label_css_class = 'control-label col-md-4'
     input_css_class = 'col-md-8'
 
-    fields = field.Fields(IDataType).omit('__parent__', '__name__')
+    @property
+    def fields(self):
+        fields = field.Fields(IDataType).omit('__parent__', '__name__')
+        fields['pictogram'].widgetFactory = PictogramSelectFieldWidget
+        tool = get_parent(self.context, ITypedSharedTool)
+        if not tool.shared_content_types_fields:
+            fields = fields.omit('field_names')
+        return fields
 
     edit_permission = MANAGE_TOOL_PERMISSION
 
@@ -455,6 +488,7 @@
     input_css_class = 'col-md-8'
 
     fields = field.Fields(ISubType).omit('__parent__', '__name__')
+    fields['pictogram'].widgetFactory = PictogramSelectFieldWidget
 
     edit_permission = MANAGE_TOOL_PERMISSION
 
@@ -501,6 +535,7 @@
     input_css_class = 'col-md-8'
 
     fields = field.Fields(ISubType).omit('__parent__', '__name__')
+    fields['pictogram'].widgetFactory = PictogramSelectFieldWidget
 
     edit_permission = MANAGE_TOOL_PERMISSION
 
@@ -521,3 +556,25 @@
             }
         else:
             return super(self.__class__, self).get_ajax_output(changes)
+
+
+#
+# Typed shared content views
+#
+
+class TypedSharedContentAddForm(SharedContentAddForm):
+    """Typed shared content add form"""
+
+    fields = field.Fields(IWfTypedSharedContent).select('title', 'data_type', 'notepad')
+
+
+@pagelet_config(name='properties.html', context=IWfTypedSharedContent, layer=IPyAMSLayer,
+                permission=MANAGE_CONTENT_PERMISSION)
+@ajax_config(name='properties.json', context=IWfTypedSharedContent, layer=IPyAMSLayer,
+             permission=MANAGE_CONTENT_PERMISSION)
+class TypedSharedContentProperteisEditForm(SharedContentPropertiesEditForm):
+    """Typed shared content properties edit form"""
+
+    fields = field.Fields(IWfTypedSharedContent).select('title', 'short_name', 'content_url',
+                                                        'data_type', 'description', 'notepad')
+    fields['title'].widgetFactory = I18nSEOTextLineFieldWidget
--- a/src/pyams_content/shared/common/zmi/workflow.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/common/zmi/workflow.py	Tue Jul 17 15:09:38 2018 +0200
@@ -9,6 +9,7 @@
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE.
 #
+from pyams_content.features.preview.interfaces import IPreviewTarget
 
 __docformat__ = 'restructuredtext'
 
@@ -44,7 +45,7 @@
 from pyams_utils.traversing import get_parent
 from pyams_utils.url import absolute_url
 from pyams_viewlet.viewlet import viewlet_config, Viewlet
-from pyams_workflow.zmi.transition import WorkflowContentTransitionForm, WorkflowContentTransitionAJAXForm
+from pyams_workflow.zmi.transition import WorkflowContentTransitionForm
 from pyams_zmi.form import InnerAdminAddForm
 from pyramid.events import subscriber
 from z3c.form import field, button
@@ -126,7 +127,7 @@
 @pagelet_config(name='wf-propose.html', context=IWfSharedContent, layer=IPyAMSLayer,
                 permission=MANAGE_CONTENT_PERMISSION)
 @ajax_config(name='wf-propose.json', context=IWfSharedContent, layer=IPyAMSLayer,
-             permission=MANAGE_CONTENT_PERMISSION, base=WorkflowContentTransitionAJAXForm)
+             permission=MANAGE_CONTENT_PERMISSION, base=AJAXAddForm)
 class PublicationRequestForm(WorkflowContentTransitionForm):
     """Shared content publication request form"""
 
@@ -213,7 +214,7 @@
 @pagelet_config(name='wf-cancel-propose.html', context=IWfSharedContent, layer=IPyAMSLayer,
                 permission=MANAGE_CONTENT_PERMISSION)
 @ajax_config(name='wf-cancel-propose.json', context=IWfSharedContent, layer=IPyAMSLayer,
-             permission=MANAGE_CONTENT_PERMISSION, base=WorkflowContentTransitionAJAXForm)
+             permission=MANAGE_CONTENT_PERMISSION, base=AJAXAddForm)
 class PublicationRequestCancelForm(WorkflowContentTransitionForm):
     """Shared content publication request cancel form"""
 
@@ -253,7 +254,7 @@
 @pagelet_config(name='wf-refuse.html', context=IWfSharedContent, layer=IPyAMSLayer,
                 permission=PUBLISH_CONTENT_PERMISSION)
 @ajax_config(name='wf-refuse.json', context=IWfSharedContent, layer=IPyAMSLayer,
-             permission=PUBLISH_CONTENT_PERMISSION, base=WorkflowContentTransitionAJAXForm)
+             permission=PUBLISH_CONTENT_PERMISSION, base=AJAXAddForm)
 class PublicationRequestRefuseForm(WorkflowContentTransitionForm):
     """Shared content publication request refuse form"""
 
@@ -307,7 +308,7 @@
 @pagelet_config(name='wf-publish.html', context=IWfSharedContent, layer=IPyAMSLayer,
                 permission=PUBLISH_CONTENT_PERMISSION)
 @ajax_config(name='wf-publish.json', context=IWfSharedContent, layer=IPyAMSLayer,
-             permission=PUBLISH_CONTENT_PERMISSION, base=WorkflowContentTransitionAJAXForm)
+             permission=PUBLISH_CONTENT_PERMISSION, base=AJAXAddForm)
 class PublicationForm(WorkflowContentTransitionForm):
     """Shared content publication form"""
 
@@ -396,7 +397,7 @@
 @pagelet_config(name='wf-retiring.html', context=IWfSharedContent, layer=IPyAMSLayer,
                 permission=MANAGE_CONTENT_PERMISSION)
 @ajax_config(name='wf-retiring.json', context=IWfSharedContent, layer=IPyAMSLayer,
-             permission=MANAGE_CONTENT_PERMISSION, base=WorkflowContentTransitionAJAXForm)
+             permission=MANAGE_CONTENT_PERMISSION, base=AJAXAddForm)
 class PublicationRetireRequestForm(WorkflowContentTransitionForm):
     """Shared content publication request refuse form"""
 
@@ -452,7 +453,7 @@
 @pagelet_config(name='wf-cancel-retiring.html', context=IWfSharedContent, layer=IPyAMSLayer,
                 permission=MANAGE_CONTENT_PERMISSION)
 @ajax_config(name='wf-cancel-retiring.json', context=IWfSharedContent, layer=IPyAMSLayer,
-             permission=MANAGE_CONTENT_PERMISSION, base=WorkflowContentTransitionAJAXForm)
+             permission=MANAGE_CONTENT_PERMISSION, base=AJAXAddForm)
 class PublicationRetireCancelForm(WorkflowContentTransitionForm):
     """Shared content publication retire request cancel form"""
 
@@ -492,7 +493,7 @@
 @pagelet_config(name='wf-retire.html', context=IWfSharedContent, layer=IPyAMSLayer,
                 permission=PUBLISH_CONTENT_PERMISSION)
 @ajax_config(name='wf-retire.json', context=IWfSharedContent, layer=IPyAMSLayer,
-             permission=PUBLISH_CONTENT_PERMISSION, base=WorkflowContentTransitionAJAXForm)
+             permission=PUBLISH_CONTENT_PERMISSION, base=AJAXAddForm)
 class PublicationRetireForm(WorkflowContentTransitionForm):
     """Shared content publication retire form"""
 
@@ -533,7 +534,7 @@
 @pagelet_config(name='wf-archiving.html', context=IWfSharedContent, layer=IPyAMSLayer,
                 permission=MANAGE_CONTENT_PERMISSION)
 @ajax_config(name='wf-archiving.json', context=IWfSharedContent, layer=IPyAMSLayer,
-             permission=MANAGE_CONTENT_PERMISSION, base=WorkflowContentTransitionAJAXForm)
+             permission=MANAGE_CONTENT_PERMISSION, base=AJAXAddForm)
 class PublicationArchiveRequestForm(WorkflowContentTransitionForm):
     """Shared content publication request archive form"""
 
@@ -576,7 +577,7 @@
 @pagelet_config(name='wf-cancel-archiving.html', context=IWfSharedContent, layer=IPyAMSLayer,
                 permission=MANAGE_CONTENT_PERMISSION)
 @ajax_config(name='wf-cancel-archiving.json', context=IWfSharedContent, layer=IPyAMSLayer,
-             permission=MANAGE_CONTENT_PERMISSION, base=WorkflowContentTransitionAJAXForm)
+             permission=MANAGE_CONTENT_PERMISSION, base=AJAXAddForm)
 class PublicationArchiveCancelForm(WorkflowContentTransitionForm):
     """Shared content publication archive request cancel form"""
 
@@ -616,7 +617,7 @@
 @pagelet_config(name='wf-archive.html', context=IWfSharedContent, layer=IPyAMSLayer,
                 permission=PUBLISH_CONTENT_PERMISSION)
 @ajax_config(name='wf-archive.json', context=IWfSharedContent, layer=IPyAMSLayer,
-             permission=PUBLISH_CONTENT_PERMISSION, base=WorkflowContentTransitionAJAXForm)
+             permission=PUBLISH_CONTENT_PERMISSION, base=AJAXAddForm)
 class PublicationArchiveForm(WorkflowContentTransitionForm):
     """Shared content publication archive form"""
 
@@ -708,7 +709,7 @@
 @pagelet_config(name='wf-delete.html', context=IWfSharedContent, layer=IPyAMSLayer,
                 permission=MANAGE_CONTENT_PERMISSION)
 @ajax_config(name='wf-delete.json', context=IWfSharedContent, layer=IPyAMSLayer,
-             permission=MANAGE_CONTENT_PERMISSION, base=WorkflowContentTransitionAJAXForm)
+             permission=MANAGE_CONTENT_PERMISSION, base=AJAXAddForm)
 class SharedContentDeleteForm(WorkflowContentTransitionForm):
     """Shared content delete form"""
 
@@ -847,15 +848,25 @@
     label_css_class = 'control-label col-md-4'
     input_css_class = 'col-md-8'
 
-    fields = field.Fields(IContributorChecks)
-    fields['preview'].widgetFactory = PreviewFieldWidget
-    fields['check'].widgetFactory = CheckFieldWidget
+    @property
+    def fields(self):
+        fields = field.Fields(IContributorChecks)
+        if not IPreviewTarget.providedBy(self.context):
+            fields = fields.omit('preview')
+        else:
+            fields['preview'].widgetFactory = PreviewFieldWidget
+        fields['check'].widgetFactory = CheckFieldWidget
+        return fields
 
 
 @subscriber(IDataExtractedEvent, form_selector=ContributorChecksForm)
 def handle_contributor_checks_data_extraction(event):
     """Handle extraction of contributor checks"""
     data = event.data
-    if not (data.get('preview') and data.get('check')):
-        event.form.widgets.errors += (Invalid(_("You must confirm that you previewed and checked this content before " 
-                                                "requesting publication!!")), )
+    can_preview = IPreviewTarget.providedBy(event.form.context)
+    if can_preview and (not (data.get('preview') and data.get('check'))):
+        event.form.widgets.errors += (Invalid(_("You must confirm that you previewed and checked this content before "
+                                                "requesting publication!!")),)
+    elif (not can_preview) and not data.get('check'):
+        event.form.widgets.errors += (Invalid(_("You must confirm that you checked this content before "
+                                                "requesting publication!!")),)
--- a/src/pyams_content/shared/form/field.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/form/field.py	Tue Jul 17 15:09:38 2018 +0200
@@ -17,8 +17,9 @@
 from collections import OrderedDict
 
 # import interfaces
-from pyams_content.shared.form.interfaces import IFormFieldFactory, IFormField, IFormFieldContainer, \
+from pyams_content.shared.form.interfaces import IWfForm, IFormFieldFactory, IFormField, IFormFieldContainer, \
     IFormFieldContainerTarget, FORM_FIELD_CONTAINER_KEY
+from pyams_form.interfaces.form import IFormContextPermissionChecker
 from pyams_i18n.interfaces import II18n
 from zope.location.interfaces import ISublocations
 from zope.traversing.interfaces import ITraversable
@@ -29,6 +30,7 @@
 from pyams_utils.registry import utility_config, get_global_registry
 from pyams_utils.request import check_request
 from pyams_utils.schema import MailAddressField
+from pyams_utils.traversing import get_parent
 from pyams_utils.vocabulary import vocabulary_config
 from zope.container.contained import Contained
 from zope.container.ordered import OrderedContainer
@@ -55,6 +57,13 @@
     visible = FieldProperty(IFormField['visible'])
 
 
+@adapter_config(context=IFormField, provides=IFormContextPermissionChecker)
+def form_field_permission_checker(context):
+    """Form field permission checker"""
+    form = get_parent(context, IWfForm)
+    return IFormContextPermissionChecker(form)
+
+
 @implementer(IFormFieldContainer)
 class FormFieldContainer(OrderedContainer):
     """Form fields container persistent class"""
--- a/src/pyams_content/shared/form/zmi/field.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/form/zmi/field.py	Tue Jul 17 15:09:38 2018 +0200
@@ -46,6 +46,7 @@
 from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter
 from pyams_utils.fanstatic import get_resource_path
 from pyams_utils.traversing import get_parent
+from pyams_utils.unicode import translate_string
 from pyams_utils.url import absolute_url
 from pyams_viewlet.viewlet import viewlet_config
 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm
@@ -242,11 +243,6 @@
     fields = field.Fields(IFormField).omit('__parent__', '__name__', 'visible')
     edit_permission = MANAGE_CONTENT_PERMISSION
 
-    def updateWidgets(self, prefix=None):
-        super(FormFieldAddForm, self).updateWidgets(prefix)
-        if 'description' in self.widgets:
-            self.widgets['description'].widget_css_class = 'textarea'
-
     def create(self, data):
         return FormField()
 
@@ -261,9 +257,10 @@
 def handle_new_form_field_data_extraction(event):
     """Handle new form field form data extraction"""
     container = IFormFieldContainer(event.form.context)
-    name = event.data.get('name')
+    name = translate_string(event.data.get('name'), spaces='_', keep_chars='_')
     if name in container:
         event.form.widgets.errors += (Invalid(_("Specified name is already used!")),)
+    event.data['name'] = name
 
 
 @pagelet_config(name='properties.html', context=IFormField, layer=IPyAMSLayer, permission=MANAGE_CONTENT_PERMISSION)
@@ -288,8 +285,6 @@
         super(FormFieldPropertiesEditForm, self).updateWidgets(prefix)
         if 'name' in self.widgets:
             self.widgets['name'].mode = DISPLAY_MODE
-        if 'description' in self.widgets:
-            self.widgets['description'].widget_css_class = 'textarea'
 
     def get_ajax_output(self, changes):
         output = super(self.__class__, self).get_ajax_output(changes)
--- a/src/pyams_content/shared/form/zmi/properties.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/form/zmi/properties.py	Tue Jul 17 15:09:38 2018 +0200
@@ -44,11 +44,6 @@
     fields = field.Fields(IWfForm).select('user_title', 'header', 'handler', 'auth_only', 'use_captcha', 'submit_label')
     weight = 1
 
-    def updateWidgets(self, prefix=None):
-        super(FormPropertiesEditForm, self).updateWidgets(prefix)
-        if 'header' in self.widgets:
-            self.widgets['header'].widget_css_class = 'textarea'
-
     def get_ajax_output(self, changes):
         if 'handler' in changes.get(IWfForm, ()):
             return {
--- a/src/pyams_content/shared/form/zmi/render.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/form/zmi/render.py	Tue Jul 17 15:09:38 2018 +0200
@@ -55,8 +55,6 @@
             field = IFormFieldContainer(self.context).get(widget.field.__name__)
             if field is not None:
                 widget.placeholder = field.placeholder
-                if field.field_type == 'text':
-                    widget.widget_css_class = 'textarea'
 
 
 @adapter_config(context=(IFormFieldContainerTarget, IPyAMSLayer, FormFieldContainerDisplayForm),
--- a/src/pyams_content/shared/imagemap/interfaces/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/imagemap/interfaces/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -18,12 +18,13 @@
 # import interfaces
 from pyams_content.component.paragraph.interfaces import IBaseParagraph
 from pyams_content.shared.common.interfaces import ISharedTool, IWfSharedContent, ISharedContent
+from pyams_sequence.interfaces import IInternalReference
 from zope.annotation.interfaces import IAttributeAnnotatable
 
 # import packages
 from pyams_content.shared.imagemap.schema import MapArea
 from pyams_i18n.schema import I18nTextLineField, I18nImageField
-from pyams_sequence.schema import InternalReference
+from pyams_sequence.schema import InternalReferenceField
 from pyams_utils.schema import PersistentDict
 from zope.interface import Interface
 from zope.schema import Object, Choice
@@ -89,17 +90,14 @@
 IMAGEMAP_PARAGRAPH_RENDERERS = 'PyAMS.paragraph.imagemap.renderers'
 
 
-class IImageMapParagraph(IBaseParagraph):
+class IImageMapParagraph(IBaseParagraph, IInternalReference):
     """Image map paragraph"""
 
-    reference = InternalReference(title=_("Internal reference"),
-                                  description=_("Reference to image map object"),
-                                  content_type=IMAGEMAP_CONTENT_TYPE)
+    reference = InternalReferenceField(title=_("Internal reference"),
+                                       description=_("Reference to image map object"),
+                                       content_type=IMAGEMAP_CONTENT_TYPE)
 
     renderer = Choice(title=_("Image map template"),
                       description=_("Presentation template used for this paragraph"),
                       vocabulary=IMAGEMAP_PARAGRAPH_RENDERERS,
                       default='default')
-
-    def get_target(self, state=None):
-        """Get reference target"""
--- a/src/pyams_content/shared/imagemap/paragraph.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/imagemap/paragraph.py	Tue Jul 17 15:09:38 2018 +0200
@@ -26,12 +26,13 @@
 # import packages
 from pyams_content.component.paragraph import BaseParagraph, BaseParagraphContentChecker, BaseParagraphFactory
 from pyams_content.features.renderer import RenderersVocabulary
-from pyams_sequence.utility import get_reference_target
+from pyams_sequence.reference import get_reference_target
 from pyams_utils.adapter import adapter_config
 from pyams_utils.factory import factory_config
 from pyams_utils.registry import utility_config, get_utility
 from pyams_utils.traversing import get_parent
 from pyams_utils.vocabulary import vocabulary_config
+from pyams_utils.zodb import volatile_property
 from zope.interface import implementer
 from zope.schema.fieldproperty import FieldProperty
 
@@ -49,8 +50,15 @@
     reference = FieldProperty(IImageMapParagraph['reference'])
     renderer = FieldProperty(IImageMapParagraph['renderer'])
 
+    @volatile_property
+    def target(self):
+        return get_reference_target(self.reference)
+
     def get_target(self, state=None):
-        return get_reference_target(self.reference, state)
+        if not state:
+            return self.target
+        else:
+            return get_reference_target(self.reference, state)
 
 
 @utility_config(name=IMAGEMAP_PARAGRAPH_TYPE, provides=IParagraphFactory)
--- a/src/pyams_content/shared/imagemap/zmi/paragraph.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/imagemap/zmi/paragraph.py	Tue Jul 17 15:09:38 2018 +0200
@@ -16,7 +16,8 @@
 # import standard library
 
 # import interfaces
-from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphContainer
+from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphContainer, \
+    PARAGRAPH_HIDDEN_FIELDS
 from pyams_content.component.paragraph.zmi.interfaces import IParagraphInnerEditor, IParagraphContainerView
 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
 from pyams_content.shared.common.interfaces import IWfSharedContent
@@ -67,7 +68,7 @@
     legend = _("Add new image map")
     icon_css_class = 'fa fa-fw fa-location-arrow'
 
-    fields = field.Fields(IImageMapParagraph).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(IImageMapParagraph).omit(*PARAGRAPH_HIDDEN_FIELDS)
     edit_permission = MANAGE_CONTENT_PERMISSION
 
     def create(self, data):
@@ -94,7 +95,7 @@
     legend = _("Edit paragraph properties")
     icon_css_class = 'fa fa-fw fa-location-arrow'
 
-    fields = field.Fields(IImageMapParagraph).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(IImageMapParagraph).omit(*PARAGRAPH_HIDDEN_FIELDS)
     fields['renderer'].widgetFactory = RendererFieldWidget
 
     edit_permission = MANAGE_CONTENT_PERMISSION
--- a/src/pyams_content/shared/imagemap/zmi/templates/imagemap-preview.pt	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/imagemap/zmi/templates/imagemap-preview.pt	Tue Jul 17 15:09:38 2018 +0200
@@ -3,6 +3,6 @@
 	<div class="col-md-9">
 		<img tal:define="map context.get_target();
 						 image i18n:map.image;"
-			 tal:attributes="src extension:absolute_url(image, '++thumb++600x480')" />
+			 tal:attributes="src tales:absolute_url(image, '++thumb++600x480')" />
 	</div>
 </div>
--- a/src/pyams_content/shared/imagemap/zmi/templates/widget-input.pt	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/imagemap/zmi/templates/widget-input.pt	Tue Jul 17 15:09:38 2018 +0200
@@ -1,5 +1,5 @@
 <label data-ams-plugins="pyams_content"
-	   tal:attributes="data-ams-plugin-pyams_content-src extension:resource_path('pyams_content.skin:pyams_content')">
+	   tal:attributes="data-ams-plugin-pyams_content-src tales:resource_path('pyams_content.skin:pyams_content')">
 	<input type="hidden"
 		   tal:attributes="id view/id;
 						   name view/name;
--- a/src/pyams_content/shared/logo/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/logo/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -39,6 +39,7 @@
     content_name = LOGO_CONTENT_NAME
 
     image = FileProperty(IWfLogo['image'])
+    monochrome_image = FileProperty(IWfLogo['monochrome_image'])
     url = FieldProperty(IWfLogo['url'])
 
 register_content_type(WfLogo)
@@ -47,7 +48,7 @@
 @provider(IWfLogoFactory)
 @implementer(ILogo)
 class Logo(SharedContent):
-    """WOrkflow managed logo persistent class"""
+    """Workflow managed logo persistent class"""
 
 
 @adapter_config(context=IWfLogoFactory, provides=IWfSharedContentFactory)
--- a/src/pyams_content/shared/logo/interfaces/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/logo/interfaces/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -18,10 +18,11 @@
 # import interfaces
 from pyams_content.component.paragraph import IBaseParagraph
 from pyams_content.shared.common.interfaces import ISharedTool, IWfSharedContent, ISharedContent
+from pyams_sequence.interfaces import IInternalReferencesList
 
 # import packages
 from pyams_file.schema import ImageField
-from pyams_sequence.schema import InternalReferencesList
+from pyams_sequence.schema import InternalReferencesListField
 from zope.interface import Interface
 from zope.schema import URI, Choice
 
@@ -43,10 +44,15 @@
 class IWfLogo(IWfSharedContent):
     """Logo interface"""
 
-    image = ImageField(title=_("Image"),
+    image = ImageField(title=_("Image (colored)"),
                        description=_("Image data"),
                        required=True)
 
+    monochrome_image = ImageField(title=_("Image (monochrome)"),
+                                  description=_("An alternate image which can be used by some "
+                                                "presentation templates"),
+                                  required=False)
+
     url = URI(title=_("Target URL"),
               description=_("URL used to access external resource"),
               required=False)
@@ -65,17 +71,14 @@
 LOGOS_PARAGRAPH_RENDERERS = 'PyAMS.shared.logos.renderers'
 
 
-class ILogosParagraph(IBaseParagraph):
+class ILogosParagraph(IBaseParagraph, IInternalReferencesList):
     """Logos paragraph"""
 
-    references = InternalReferencesList(title=_("Logos references"),
-                                        description=_("List of internal logos references"),
-                                        content_type=LOGO_CONTENT_TYPE)
+    references = InternalReferencesListField(title=_("Logos references"),
+                                             description=_("List of internal logos references"),
+                                             content_type=LOGO_CONTENT_TYPE)
 
     renderer = Choice(title=_("Logos template"),
                       description=_("Presentation template used for this paragraph"),
                       vocabulary=LOGOS_PARAGRAPH_RENDERERS,
                       default='default')
-
-    def get_targets(self, state=None):
-        """Get references targets"""
--- a/src/pyams_content/shared/logo/paragraph.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/logo/paragraph.py	Tue Jul 17 15:09:38 2018 +0200
@@ -9,6 +9,7 @@
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE.
 #
+from pyams_utils.zodb import volatile_property
 
 __docformat__ = 'restructuredtext'
 
@@ -26,7 +27,7 @@
 # import packages
 from pyams_content.component.paragraph import BaseParagraph, IParagraphFactory, BaseParagraphFactory, \
     BaseParagraphContentChecker
-from pyams_sequence.utility import get_reference_target
+from pyams_sequence.reference import get_reference_target
 from pyams_utils.adapter import adapter_config
 from pyams_utils.registry import utility_config, get_utility
 from pyams_utils.request import check_request
--- a/src/pyams_content/shared/logo/zmi/paragraph.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/logo/zmi/paragraph.py	Tue Jul 17 15:09:38 2018 +0200
@@ -16,7 +16,8 @@
 # import standard library
 
 # import interfaces
-from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphContainer
+from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphContainer, \
+    PARAGRAPH_HIDDEN_FIELDS
 from pyams_content.component.paragraph.zmi.interfaces import IParagraphInnerEditor
 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
 from pyams_content.shared.common import IWfSharedContent
@@ -67,7 +68,7 @@
     legend = _("Add new logos paragraph")
     icon_css_class = 'fa fa-fw fa-th-large'
 
-    fields = field.Fields(ILogosParagraph).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(ILogosParagraph).omit(*PARAGRAPH_HIDDEN_FIELDS)
     edit_permission = MANAGE_CONTENT_PERMISSION
 
     def create(self, data):
@@ -93,7 +94,7 @@
     legend = _("Edit paragraph properties")
     icon_css_class = 'fa fa-fw fa-th-large'
 
-    fields = field.Fields(ILogosParagraph).omit('__parent__', '__name__', 'visible')
+    fields = field.Fields(ILogosParagraph).omit(*PARAGRAPH_HIDDEN_FIELDS)
     fields['renderer'].widgetFactory = RendererFieldWidget
 
     edit_permission = MANAGE_CONTENT_PERMISSION
--- a/src/pyams_content/shared/logo/zmi/properties.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/logo/zmi/properties.py	Tue Jul 17 15:09:38 2018 +0200
@@ -40,11 +40,11 @@
     legend = _("Main logo settings")
     fieldset_class = 'bordered no-x-margin margin-y-10'
 
-    fields = field.Fields(IWfLogo).select('image', 'url')
+    fields = field.Fields(IWfLogo).select('image', 'monochrome_image', 'url')
     weight = 1
 
     def get_ajax_output(self, changes):
-        if 'image' in changes.get(IWfLogo, ()):
+        if changes:
             return {
                 'status': 'reload',
                 'message': self.request.localizer.translate(self.successMessage)
--- a/src/pyams_content/shared/news/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/news/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -18,20 +18,21 @@
 # import interfaces
 from pyams_content.component.illustration import IIllustrationTarget, ILinkIllustrationTarget
 from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget
-from pyams_content.component.theme.interfaces import IThemesTarget
+from pyams_content.component.theme.interfaces import ITagsTarget, IThemesTarget
 from pyams_content.features.preview.interfaces import IPreviewTarget
 from pyams_content.features.review.interfaces import IReviewTarget
+from pyams_content.shared.common.interfaces import IWfSharedContentFactory
 from pyams_content.shared.news.interfaces import INewsEvent, IWfNewsEvent, NEWS_CONTENT_TYPE, NEWS_CONTENT_NAME, \
     IWfNewsEventFactory
 
 # import packages
-from pyams_content.shared.common import SharedContent, WfSharedContent, register_content_type, IWfSharedContentFactory
+from pyams_content.shared.common import SharedContent, WfSharedContent, register_content_type
 from pyams_utils.adapter import adapter_config
 from zope.interface import implementer, provider
 
 
-@implementer(IWfNewsEvent, IIllustrationTarget, ILinkIllustrationTarget, IParagraphContainerTarget, IThemesTarget,
-             IPreviewTarget, IReviewTarget)
+@implementer(IWfNewsEvent, IIllustrationTarget, ILinkIllustrationTarget, IParagraphContainerTarget,
+             ITagsTarget, IThemesTarget, IPreviewTarget, IReviewTarget)
 class WfNewsEvent(WfSharedContent):
     """Base news event"""
 
--- a/src/pyams_content/shared/site/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/site/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -18,7 +18,7 @@
 # import interfaces
 from pyams_content.component.illustration import IIllustrationTarget, ILinkIllustrationTarget
 from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget
-from pyams_content.component.theme.interfaces import IThemesTarget
+from pyams_content.component.theme.interfaces import ITagsTarget, IThemesTarget
 from pyams_content.features.preview.interfaces import IPreviewTarget
 from pyams_content.features.review.interfaces import IReviewTarget
 from pyams_content.shared.site.interfaces import ITopic, IWfTopic, TOPIC_CONTENT_NAME, \
@@ -32,7 +32,7 @@
 
 
 @implementer(IWfTopic, IIllustrationTarget, ILinkIllustrationTarget, IParagraphContainerTarget,
-             IThemesTarget, IPreviewTarget, IReviewTarget)
+             ITagsTarget, IThemesTarget, IPreviewTarget, IReviewTarget)
 class WfTopic(WfSharedContent):
     """Base topic"""
 
--- a/src/pyams_content/shared/site/interfaces/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/site/interfaces/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -19,6 +19,7 @@
 from pyams_content.interfaces import IBaseContent
 from pyams_sequence.interfaces import ISequentialIdTarget, IInternalReference
 from pyams_workflow.interfaces import IWorkflowPublicationSupport
+from zope.annotation.interfaces import IAttributeAnnotatable
 from zope.container.interfaces import IContainer, IContained
 
 # import packages
@@ -107,7 +108,7 @@
     """Workflow managed topic interface"""
 
 
-class IContentLink(ISiteElement, IInternalReference):
+class IContentLink(ISiteElement, IInternalReference, IAttributeAnnotatable):
     """Rented content interface"""
 
     alt_title = I18nTextLineField(title=_("Alternate title"),
@@ -118,6 +119,3 @@
                    description=_("If 'no', link is not visible"),
                    required=True,
                    default=True)
-
-    def get_target(self):
-        """Get reference target"""
--- a/src/pyams_content/shared/site/link.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/site/link.py	Tue Jul 17 15:09:38 2018 +0200
@@ -17,13 +17,16 @@
 
 # import interfaces
 from pyams_content.shared.site.interfaces import IContentLink
+from pyams_utils.interfaces.url import IRelativeURL
 from pyams_workflow.interfaces import IWorkflow, IWorkflowVersion, IWorkflowVersions, IWorkflowPublicationInfo, \
     IWorkflowState
 
 # import packages
 from persistent import Persistent
-from pyams_sequence.utility import get_reference_target
+from pyams_sequence.reference import get_reference_target
+from pyams_skin.layer import IPyAMSUserLayer
 from pyams_utils.adapter import adapter_config
+from pyams_utils.zodb import volatile_property
 from zope.container.contained import Contained
 from zope.interface import implementer
 from zope.schema.fieldproperty import FieldProperty
@@ -48,7 +51,8 @@
     def is_deletable(self):
         return True
 
-    def get_target(self):
+    @volatile_property
+    def target(self):
         target = get_reference_target(self.reference)
         if IWorkflowVersion.providedBy(target):
             workflow = IWorkflow(target, None)
@@ -60,6 +64,9 @@
                     target = versions[-1]
         return target
 
+    def get_target(self, state=None):
+        return self.target
+
 
 @adapter_config(context=IContentLink, provides=IWorkflow)
 def content_link_workflow_info(context):
@@ -83,3 +90,11 @@
     target = context.get_target()
     if target is not None:
         return IWorkflowPublicationInfo(target, None)
+
+
+@adapter_config(context=(IContentLink, IPyAMSUserLayer), provides=IRelativeURL)
+def content_link_relative_url(context):
+    """Content link relative URL"""
+    target = context.get_target()
+    if target is not None:
+        return IRelativeURL(target, None)
--- a/src/pyams_content/shared/site/zmi/container.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/site/zmi/container.py	Tue Jul 17 15:09:38 2018 +0200
@@ -203,7 +203,10 @@
         permission = self.permission
         if self.can_sort and ((not permission) or self.request.has_permission(permission, self.context)):
             classes.append('table-dnd')
-        return {'table': ' '.join(classes)}
+        return {
+            'table': ' '.join(classes),
+            'tr.selected': lambda item, col, row: 'current' if item is self.context else ''
+        }
 
     @property
     def data_attributes(self):
--- a/src/pyams_content/shared/site/zmi/folder.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/site/zmi/folder.py	Tue Jul 17 15:09:38 2018 +0200
@@ -102,8 +102,6 @@
         super(SiteFolderAddForm, self).updateWidgets(prefix)
         if 'parent' in self.widgets:
             self.widgets['parent'].permission = MANAGE_SITE_PERMISSION
-        if 'notepad' in self.widgets:
-            self.widgets['notepad'].widget_css_class = 'textarea'
 
     def create(self, data):
         registry = self.request.registry
@@ -192,13 +190,6 @@
     fields = field.Fields(ISiteFolder).select('title', 'short_name', 'heading', 'navigation_title', 'notepad') + \
              field.Fields(IBaseSharedTool).select('shared_content_workflow')
 
-    def updateWidgets(self, prefix=None):
-        super(SiteFolderPropertiesEditForm, self).updateWidgets(prefix)
-        if 'heading' in self.widgets:
-            self.widgets['heading'].widget_css_class = 'textarea'
-        if 'notepad' in self.widgets:
-            self.widgets['notepad'].widget_css_class = 'textarea'
-
 
 @view_config(name='properties.json', context=ISiteFolder, request_type=IPyAMSLayer,
              permission=MANAGE_TOOL_PERMISSION, renderer='json', xhr=True)
--- a/src/pyams_content/shared/site/zmi/link.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/site/zmi/link.py	Tue Jul 17 15:09:38 2018 +0200
@@ -9,6 +9,7 @@
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE.
 #
+from pyams_skin.event import get_json_table_row_refresh_event
 
 __docformat__ = 'restructuredtext'
 
@@ -21,7 +22,6 @@
 from pyams_content.shared.site.interfaces import ISiteContainer, IContentLink
 from pyams_content.skin.zmi.interfaces import ISiteTreeTable
 from pyams_i18n.interfaces import II18n
-from pyams_sequence.interfaces import IInternalReference
 from pyams_skin.interfaces.container import ITableElementName
 from pyams_skin.interfaces.viewlet import IToolbarAddingMenu
 from pyams_skin.layer import IPyAMSLayer
@@ -31,7 +31,7 @@
 
 # import packages
 from pyams_content.shared.site.link import ContentLink
-from pyams_content.shared.site.zmi.container import SiteContainerTreeTable, SiteContainerTreeNameColumn
+from pyams_content.shared.site.zmi.container import SiteContainerTreeTable
 from pyams_content.shared.site.zmi.widget import SiteManagerFoldersSelectorFieldWidget
 from pyams_form.form import AJAXAddForm, ajax_config
 from pyams_pagelet.pagelet import pagelet_config
@@ -140,7 +140,7 @@
     def get_ajax_output(self, changes):
         output = super(self.__class__, self).get_ajax_output(changes)
         intids = get_utility(IIntIds)
-        if 'reference' in changes.get(IInternalReference, ()):
+        if changes:
             table = SiteContainerTreeTable(self.context.__parent__, self.request)
             table.update()
             row = table.setUpRow(self.context)
@@ -152,16 +152,4 @@
                     'row': table.renderRow(row)
                 }
             })
-        elif 'alt_title' in changes.get(IContentLink, ()):
-            adapter = ContentLinkTableElementName(self.context, self.request, None)
-            column = SiteContainerTreeNameColumn(self.context, self.request, None)
-            output.setdefault('events', []).append({
-                'event': 'myams.refresh',
-                'options': {
-                    'handler': 'MyAMS.skin.refreshRowCell',
-                    'object_id': '{0}::{1}'.format(SiteContainerTreeTable.id, intids.queryId(self.context)),
-                    'col_name': 'name',
-                    'cell': column.renderCell(self.context, name=adapter.name)
-                }
-            })
         return output
--- a/src/pyams_content/shared/site/zmi/widget/templates/folders-input.pt	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/site/zmi/widget/templates/folders-input.pt	Tue Jul 17 15:09:38 2018 +0200
@@ -1,6 +1,6 @@
 <div i18n:domain="pyams_content"
 	 data-ams-plugins="pyams_content"
-	 tal:attributes="data-ams-plugin-pyams_content-src extension:resource_path('pyams_content.skin:pyams_content')">
+	 tal:attributes="data-ams-plugin-pyams_content-src tales:resource_path('pyams_content.skin:pyams_content')">
 	<input type="hidden"
 			tal:attributes="id view/id;
 							name view/name;
--- a/src/pyams_content/shared/view/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/view/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -18,6 +18,7 @@
 logger = logging.getLogger("PyAMS (content)")
 
 from datetime import datetime
+from itertools import tee
 
 # import interfaces
 from hypatia.interfaces import ICatalog
@@ -36,7 +37,7 @@
 from pyams_catalog.query import CatalogResultSet, or_
 from pyams_content.shared.common import WfSharedContent, register_content_type, SharedContent, IWfSharedContentFactory
 from pyams_utils.adapter import adapter_config, ContextAdapter
-from pyams_utils.list import unique
+from pyams_utils.list import unique_iter
 from pyams_utils.registry import get_utility, get_global_registry
 from pyams_utils.timezone import tztime
 from pyams_workflow.interfaces import IWorkflow
@@ -52,6 +53,8 @@
 VIEW_CACHE_KEY = 'view_{view}'
 VIEW_CONTEXT_CACHE_KEY = 'view_{view}.context_{context}'
 
+_MARKER = object()
+
 
 @implementer(IWfView, IPreviewTarget, IReviewTarget)
 class WfView(WfSharedContent):
@@ -86,24 +89,35 @@
             content_types |= set(self.selected_content_types)
         return list(content_types)
 
-    def get_results(self, context):
-        views_cache = get_cache(VIEWS_CACHE_REGION, VIEWS_CACHE_NAME)
-        if self.is_using_context:
-            cache_key = VIEW_CONTEXT_CACHE_KEY.format(view=ICacheKeyValue(self),
-                                                      context=ICacheKeyValue(context))
-        else:
-            cache_key = VIEW_CACHE_KEY.format(ICacheKeyValue(self))
-        try:
-            results = views_cache.get_value(cache_key)
-        except KeyError:
+    def get_results(self, context, sort_index=None, reverse=None, limit=None, ignore_cache=False):
+        results = _MARKER
+        if not ignore_cache:
+            # check for cache
+            views_cache = get_cache(VIEWS_CACHE_REGION, VIEWS_CACHE_NAME)
+            if self.is_using_context:
+                cache_key = VIEW_CONTEXT_CACHE_KEY.format(view=ICacheKeyValue(self),
+                                                          context=ICacheKeyValue(context))
+            else:
+                cache_key = VIEW_CACHE_KEY.format(view=ICacheKeyValue(self))
+            try:
+                results = views_cache.get_value(cache_key)
+            except KeyError:
+                pass
+        # Execute query
+        if results is _MARKER:
             registry = get_current_registry()
             adapter = registry.queryAdapter(self, IViewQuery, name='es')
             if adapter is None:
                 adapter = registry.getAdapter(self, IViewQuery)
-            results = adapter.get_results(context, self.limit)
+            results = adapter.get_results(context,
+                                          sort_index or self.order_by,
+                                          reverse if reverse is not None else self.reversed_order,
+                                          limit or self.limit)
             intids = get_utility(IIntIds)
-            views_cache.set_value(cache_key, [intids.queryId(item) for item in results])
-            logger.debug("Storing view items to cache key {0}".format(cache_key))
+            cache, results = tee(results)
+            if not ignore_cache:
+                views_cache.set_value(cache_key, [intids.queryId(item) for item in cache])
+                logger.debug("Storing view items to cache key {0}".format(cache_key))
         else:
             results = CatalogResultSet(results)
             logger.debug("Retrieving view items from cache key {0}".format(cache_key))
@@ -152,19 +166,19 @@
                 params &= new_params
         return params
 
-    def get_results(self, context, limit=None):
+    def get_results(self, context, sort_index, reverse, limit):
         view = self.context
         catalog = get_utility(ICatalog)
         registry = get_current_registry()
         params = self.get_params(context)
         items = CatalogResultSet(CatalogQuery(catalog).query(params,
-                                                             sort_index=view.order_by,
-                                                             reverse=view.reversed_order,
+                                                             sort_index=sort_index,
+                                                             reverse=reverse,
                                                              limit=limit))
         for name, adapter in sorted(registry.getAdapters((view,), IViewQueryFilterExtension),
                                     key=lambda x: x[1].weight):
             items = adapter.filter(context, items)
-        return unique(items)
+        return unique_iter(items)
 
 
 @subscriber(IObjectModifiedEvent, context_selector=IWfView)
--- a/src/pyams_content/shared/view/interfaces/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/view/interfaces/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -37,13 +37,15 @@
 PUBLICATION_DATE_ORDER = 'publication_date'
 FIRSTPUBLICATION_DATE_ORDER = 'first_publication_date'
 
-VIEW_ORDER = {CREATION_DATE_ORDER: _("Creation date"),
-              UPDATE_DATE_ORDER: _("Last update date"),
-              PUBLICATION_DATE_ORDER: _("Current publication date"),
-              FIRSTPUBLICATION_DATE_ORDER: _("First publication date")}
+VIEW_ORDERS = (
+    {'id': CREATION_DATE_ORDER, 'title': _("Creation date")},
+    {'id': UPDATE_DATE_ORDER,'title': _("Last update date")},
+    {'id': PUBLICATION_DATE_ORDER, 'title': _("Current publication date")},
+    {'id': FIRSTPUBLICATION_DATE_ORDER, 'title': _("First publication date")}
+)
 
-VIEW_ORDER_VOCABULARY = SimpleVocabulary([SimpleTerm(v, title=t)
-                                          for v, t in VIEW_ORDER.items()])
+VIEW_ORDER_VOCABULARY = SimpleVocabulary([SimpleTerm(item['id'], title=item['title'])
+                                          for item in VIEW_ORDERS])
 
 
 class IViewsManager(ISharedTool):
@@ -87,7 +89,7 @@
 
     is_using_context = Attribute("Check if view is using context settings")
 
-    def get_results(self, context):
+    def get_results(self, context, sort_index=None, reverse=True, limit=None, ignore_cache=False):
         """Get results of catalog query"""
 
 
@@ -108,7 +110,7 @@
 class IViewQuery(Interface):
     """View query interface"""
 
-    def get_results(self, context, limit=None):
+    def get_results(self, context, sort_index, reverse, limit):
         """Get results of catalog query"""
 
 
@@ -167,18 +169,39 @@
                            default=True)
 
 
+VIEW_TAGS_SETTINGS_KEY = 'pyams_content.view.tags'
+
+
+class IViewTagsSettings(IViewSettings):
+    """View tags settings"""
+
+    select_context_tags = Bool(title=_("Select context tags?"),
+                               description=_("If 'yes', tags will be extracted from context"),
+                               required=False,
+                               default=False)
+
+    tags = ThesaurusTermsListField(title=_("Other tags"),
+                                   required=False)
+
+    def get_tags(self, context):
+        """Get all tags for given context"""
+
+    def get_tags_index(self, context):
+        """Get all tags index values for given context"""
+
+
 VIEW_THEMES_SETTINGS_KEY = 'pyams_content.view.themes'
 
 
 class IViewThemesSettings(IViewSettings):
-    """View themess ettings"""
+    """View themes settings"""
 
     select_context_themes = Bool(title=_("Select context themes?"),
                                  description=_("If 'yes', themes will be extracted from context"),
-                                 required=True,
+                                 required=False,
                                  default=False)
 
-    themes = ThesaurusTermsListField(title=_("Other terms"),
+    themes = ThesaurusTermsListField(title=_("Other themes"),
                                      required=False)
 
     def get_themes(self, context):
@@ -186,3 +209,37 @@
 
     def get_themes_index(self, context):
         """Get all themes index values for given context"""
+
+
+VIEW_COLLECTIONS_SETTINGS_KEY = 'pyams_content.view.collections'
+
+
+class IViewCollectionsSettings(IViewSettings):
+    """View collections settings"""
+
+    select_context_collections = Bool(title=_("Select context collections?"),
+                                      description=_("If 'yes', collections will be extracted from context"),
+                                      required=False,
+                                      default=False)
+
+    collections = ThesaurusTermsListField(title=_("Other collections"),
+                                          required=False)
+
+    def get_collections(self, context):
+        """Get all collections for given context"""
+
+    def get_collections_index(self, context):
+        """Get all collections index values for given context"""
+
+
+VIEWS_MERGERS_VOCABULARY = 'pyams_content.views.mergers'
+
+
+class IViewsMerger(Interface):
+    """Interface used to define views mergers
+
+    Mergers are used to merge results of several views.
+    """
+
+    def get_results(self, views, context, ignore_cache=False):
+        """Merge results of several views together"""
--- a/src/pyams_content/shared/view/manager.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/view/manager.py	Tue Jul 17 15:09:38 2018 +0200
@@ -16,7 +16,7 @@
 # import standard library
 
 # import interfaces
-from pyams_content.component.theme.interfaces import IThemesManagerTarget
+from pyams_content.component.theme.interfaces import IThemesManagerTarget, ICollectionsManagerTarget
 from pyams_content.shared.common.interfaces import ISharedContentFactory
 from pyams_content.shared.view.interfaces import IViewsManager, VIEW_CONTENT_TYPE, IViewsManagerFactory
 from zope.annotation.interfaces import IAttributeAnnotatable
@@ -33,7 +33,7 @@
 from zope.interface import implementer
 
 
-@implementer(IViewsManager, IThemesManagerTarget, IAttributeAnnotatable)
+@implementer(IViewsManager, IThemesManagerTarget, ICollectionsManagerTarget, IAttributeAnnotatable)
 class ViewsManager(SharedTool):
     """Views manager class"""
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_content/shared/view/merge.py	Tue Jul 17 15:09:38 2018 +0200
@@ -0,0 +1,156 @@
+#
+# Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+from heapq import merge
+from random import shuffle
+from itertools import chain, zip_longest
+
+# import interfaces
+from pyams_content.shared.view.interfaces import VIEWS_MERGERS_VOCABULARY, IViewsMerger, CREATION_DATE_ORDER, \
+    UPDATE_DATE_ORDER, PUBLICATION_DATE_ORDER, FIRSTPUBLICATION_DATE_ORDER
+from pyams_workflow.interfaces import IWorkflowPublicationInfo
+from zope.dublincore.interfaces import IZopeDublinCore
+
+# import packages
+from pyams_utils.registry import utility_config
+from pyams_utils.request import check_request
+from pyams_utils.vocabulary import vocabulary_config
+from zope.componentvocabulary.vocabulary import UtilityVocabulary, UtilityTerm
+
+from pyams_content import _
+
+
+@vocabulary_config(name=VIEWS_MERGERS_VOCABULARY)
+class ViewsMergersVocabulary(UtilityVocabulary):
+    """Views mergers vocabulary"""
+
+    interface = IViewsMerger
+    nameOnly = True
+
+    def __init__(self, context, **kw):
+        request = check_request()
+        registry = request.registry
+        translate = request.localizer.translate
+        utils = [(name, translate(util.label))
+                 for (name, util) in registry.getUtilitiesFor(self.interface)]
+        self._terms = dict((title, UtilityTerm(name, title)) for name, title in utils)
+
+
+CONCAT_VIEWS_MERGE_MODE = 'concat'
+
+
+@utility_config(name=CONCAT_VIEWS_MERGE_MODE, provides=IViewsMerger)
+class ViewsConcatenateMergeMode(object):
+    """Views concatenate merge mode"""
+
+    label = _("Concatenate views items in order")
+
+    @classmethod
+    def get_results(cls, views, context, ignore_cache=False):
+        results = (view.get_results(context, ignore_cache=ignore_cache) for view in views)
+        yield from chain(*results)
+
+
+@utility_config(name='random', provides=IViewsMerger)
+class ViewsRandomMergeMode(object):
+    """Views random merge mode"""
+
+    label = _("Extract items randomly")
+
+    @classmethod
+    def get_results(cls, views, context, ignore_cache=False):
+        results = (view.get_results(context, ignore_cache=ignore_cache) for view in views)
+        results = list(chain(*results))
+        shuffle(results)
+        yield from iter(results)
+
+
+@utility_config(name='zip', provides=IViewsMerger)
+class ViewsZipMergeMode(object):
+    """Views zip merge mode"""
+
+    label = _("Take items from views one by one, in views order")
+
+    @classmethod
+    def get_results(cls, views, context, ignore_cache=False):
+        results = (view.get_results(context, ignore_cache=ignore_cache) for view in views)
+        for array in zip_longest(*results):
+            yield from filter(lambda x: x is not None, array)
+
+
+@utility_config(name='zip_random', provides=IViewsMerger)
+class ViewsRandomZipMergeMode(object):
+    """Views random zip merge mode"""
+
+    label = _("Take items from views one by one, in random order")
+
+    @classmethod
+    def get_results(cls, views, context, ignore_cache=False):
+        results = [view.get_results(context, ignore_cache=ignore_cache) for view in views]
+        shuffle(results)
+        for array in zip_longest(*results):
+            yield from filter(lambda x: x is not None, array)
+
+
+class SortedMergeMode(object):
+    """Sorted merge mode base class"""
+
+    sort_index = None
+    sort_key = None
+
+    @classmethod
+    def get_results(cls, views, context, ignore_cache=False):
+        results = (sorted(view.get_results(context,
+                                           ignore_cache=ignore_cache),
+                          key=cls.sort_key, reverse=True)
+                   for view in views)
+        yield from merge(*results, key=cls.sort_key, reverse=True)
+
+
+@utility_config(name='{0}.sort'.format(CREATION_DATE_ORDER), provides=IViewsMerger)
+class CreationDateSortedMergeMode(SortedMergeMode):
+    """Merge pre-sorted views by creation date"""
+
+    label = _("Sort all results by creation date")
+    sort_index = CREATION_DATE_ORDER
+    sort_key = lambda x: IZopeDublinCore(x).created
+
+
+@utility_config(name='{0}.sort'.format(UPDATE_DATE_ORDER), provides=IViewsMerger)
+class UpdateDateSortedMergeMode(SortedMergeMode):
+    """Merge pre-sorted views by last update date"""
+
+    label = _("Sort all results by last update date")
+    sort_index = UPDATE_DATE_ORDER
+    sort_key = lambda x: IZopeDublinCore(x).modified
+
+
+@utility_config(name='{0}.sort'.format(PUBLICATION_DATE_ORDER), provides=IViewsMerger)
+class PublicationDateSortedMergeMode(SortedMergeMode):
+    """Merge pre-sorted views by publication date"""
+
+    label = _("Sort all results by current publication date")
+    sort_index = PUBLICATION_DATE_ORDER
+    sort_key = lambda x: IWorkflowPublicationInfo(x).publication_date
+
+
+@utility_config(name='{0}.sort'.format(FIRSTPUBLICATION_DATE_ORDER), provides=IViewsMerger)
+class FirstPublicationDateSortedMergeMode(SortedMergeMode):
+    """Merge pre-sorted views by first publication date"""
+
+    label = _("Sort all results by first publication date")
+    sort_index = FIRSTPUBLICATION_DATE_ORDER
+    sort_key = lambda x: IWorkflowPublicationInfo(x).first_publication_date
--- a/src/pyams_content/shared/view/portlet/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/view/portlet/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -14,16 +14,23 @@
 
 
 # import standard library
+from itertools import islice
 
 # import interfaces
-from pyams_content.shared.view.portlet.interfaces import IViewItemsPortletSettings
+from pyams_content.shared.view.interfaces import IViewsMerger, IViewsManager
+from pyams_content.shared.view.portlet.interfaces import IViewItemsPortletSettings, VIEW_DISPLAY_CONTEXT
+from pyams_portal.interfaces import PREVIEW_MODE
 from pyams_utils.interfaces import VIEW_PERMISSION
+from pyams_utils.interfaces.url import DISPLAY_CONTEXT
+from pyams_workflow.interfaces import IWorkflow
 
 # import packages
-from pyams_content.workflow import PUBLISHED_STATES
 from pyams_portal.portlet import PortletSettings, portlet_config, Portlet
-from pyams_sequence.utility import get_sequence_target
+from pyams_sequence.reference import get_sequence_target
 from pyams_utils.factory import factory_config
+from pyams_utils.list import unique_iter
+from pyams_utils.registry import get_utility
+from pyams_utils.request import check_request
 from zope.interface import implementer
 from zope.schema.fieldproperty import FieldProperty
 
@@ -38,16 +45,40 @@
 class ViewItemsPortletSettings(PortletSettings):
     """View items portlet settings"""
 
-    view = FieldProperty(IViewItemsPortletSettings['view'])
+    title = FieldProperty(IViewItemsPortletSettings['title'])
+    views = FieldProperty(IViewItemsPortletSettings['views'])
+    views_context = FieldProperty(IViewItemsPortletSettings['views_context'])
+    views_merge_mode = FieldProperty(IViewItemsPortletSettings['views_merge_mode'])
+    limit = FieldProperty(IViewItemsPortletSettings['limit'])
+
+    def get_views(self):
+        views_manager = get_utility(IViewsManager)
+        workflow = IWorkflow(views_manager)
+        for oid in self.views or ():
+            view = get_sequence_target(oid, state=workflow.published_states)
+            if view is not None:
+                yield view
 
-    def get_view(self):
-        if self.view is not None:
-            return get_sequence_target(self.view, state=PUBLISHED_STATES)
+    def get_merger(self, request=None):
+        if request is None:
+            request = check_request()
+        return request.registry.queryUtility(IViewsMerger, name=self.views_merge_mode)
 
-    def get_items(self, context):
-        view = self.get_view()
-        if view is not None:
-            return view.get_results(context)
+    def get_items(self, request=None, ignore_cache=False):
+        if request is None:
+            request = check_request()
+        if self.views_context == VIEW_DISPLAY_CONTEXT:
+            context = request.annotations.get(DISPLAY_CONTEXT, request.root)
+        else:
+            context = request.context
+        if not ignore_cache:
+            ignore_cache = request.annotations.get(PREVIEW_MODE, False)
+        merger = self.get_merger(request)
+        if merger is not None:
+            yield from islice(unique_iter(merger.get_results(self.get_views(),
+                                                             context,
+                                                             ignore_cache=ignore_cache)),
+                              self.limit)
 
 
 @portlet_config(permission=VIEW_PERMISSION)
--- a/src/pyams_content/shared/view/portlet/interfaces.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/view/portlet/interfaces.py	Tue Jul 17 15:09:38 2018 +0200
@@ -16,19 +16,81 @@
 # import standard library
 
 # import interfaces
+from pyams_content.shared.view.interfaces import VIEWS_MERGERS_VOCABULARY
 from pyams_portal.interfaces import IPortletSettings
 
 # import packages
 from pyams_content.shared.view import WfView
-from pyams_sequence.schema import InternalReference
+from pyams_content.shared.view.merge import CONCAT_VIEWS_MERGE_MODE
+from pyams_i18n.schema import I18nTextLineField
+from pyams_sequence.schema import InternalReferencesListField
+from zope.schema import Choice, Int
+from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm
 
 from pyams_content import _
 
 
+#
+# Views display contexts
+#
+
+VIEW_DISPLAY_CONTEXT = 'display'
+VIEW_CONTENT_CONTEXT = 'content'
+
+VIEW_CONTEXTS = (
+    {'id': VIEW_DISPLAY_CONTEXT, 'title': _("Display context")},
+    {'id': VIEW_CONTENT_CONTEXT, 'title': _("Content context")}
+)
+
+VIEW_CONTEXT_VOCABULARY = SimpleVocabulary([SimpleTerm(item['id'], title=item['title'])
+                                            for item in VIEW_CONTEXTS])
+
+
+#
+# Views merge modes
+#
+
 class IViewItemsPortletSettings(IPortletSettings):
     """View items portlet settings interface"""
 
-    view = InternalReference(title=_("Selected view"),
-                             description=_("Reference to the view from which items are extracted"),
-                             content_type=WfView.content_type,
-                             required=True)
+    title = I18nTextLineField(title=_("Title"),
+                              required=False)
+
+    views = InternalReferencesListField(title=_("Selected views"),
+                                        description=_("Reference to the view(s) from which items are extracted; "
+                                                      "you can combine several views together and specify in which "
+                                                      "order they should be mixed"),
+                                        content_type=WfView.content_type,
+                                        required=True)
+
+    def get_views(self):
+        """Get iterator over selected views"""
+
+    views_context = Choice(title=_("Views context"),
+                           description=_("When searching for items, a view receives a \"context\" which is the object "
+                                         "from which settings can be extracted; this context can be the \"display\" "
+                                         "context or the \"content\" context: when the portlet is used to display the "
+                                         "site root, a site manager or a site folder, both are identical; when the "
+                                         "portlet is used to display a shared content, the \"content\" context is the "
+                                         "displayed content, while the \"display\" context is the container (site "
+                                         "root, site manager or site folder) into which content is displayed"),
+                           vocabulary=VIEW_CONTEXT_VOCABULARY,
+                           default=VIEW_DISPLAY_CONTEXT,
+                           required=True)
+
+    views_merge_mode = Choice(title=_("Views merge mode"),
+                              description=_("If you select several views, you can select \"merge\" mode, which is "
+                                            "the way used to merge items from several views"),
+                              vocabulary=VIEWS_MERGERS_VOCABULARY,
+                              default=CONCAT_VIEWS_MERGE_MODE,
+                              required=True)
+
+    def get_merger(self):
+        """Get selected views merger utility"""
+
+    limit = Int(title=_("Results count limit"),
+                description=_("Maximum number of results that the component may extract from merged views"),
+                required=False)
+
+    def get_items(self):
+        """Get iterator over items returned by selected views, using selected merger"""
--- a/src/pyams_content/shared/view/portlet/zmi/__init__.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/view/portlet/zmi/__init__.py	Tue Jul 17 15:09:38 2018 +0200
@@ -48,4 +48,4 @@
 @adapter_config(context=(Interface, IPyAMSLayer, Interface, IViewItemsPortletSettings), provides=IPortletPreviewer)
 @template_config(template='templates/view-items-list-preview.pt', layer=IPyAMSLayer)
 class ViewItemsPortletPreviewer(PortletPreviewer):
-    """Image portlet previewer"""
+    """View items portlet previewer"""
--- a/src/pyams_content/shared/view/portlet/zmi/templates/view-items-list-preview.pt	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/view/portlet/zmi/templates/view-items-list-preview.pt	Tue Jul 17 15:09:38 2018 +0200
@@ -1,12 +1,17 @@
-<tal:var define="settings view.settings">
-	<tal:var define="items settings.get_items(context)">
-		<tal:if condition="items">
-			<div tal:repeat="item items">
-				<tal:var content="i18n:item.title" />
-			</div>
-		</tal:if>
-		<tal:if condition="not:items" i18n:translate="">
-			No result found
-		</tal:if>
-	</tal:var>
-</tal:var>
+<div class="padding-x-5"
+	 tal:define="settings view.settings; global count 0;" i18n:domain="pyams_content">
+	<strong tal:define="title i18n:settings.title"
+			tal:condition="title">
+		<tal:var content="title" /><br />
+	</strong>
+	<ul>
+		<li tal:repeat="item settings.get_items(request, ignore_cache=True)">
+			<tal:var content="i18n:item.title" />
+			<tal:var define="global count count+1" />
+		</li>
+	</ul>
+	<tal:if condition="not:count">
+		<tal:if condition="settings.views" i18n:translate="">No result found</tal:if>
+		<tal:if condition="not:settings.views" i18n:translate="">No selected view</tal:if>
+	</tal:if>
+</div>
--- a/src/pyams_content/shared/view/reference.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/view/reference.py	Tue Jul 17 15:09:38 2018 +0200
@@ -9,7 +9,6 @@
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE.
 #
-from pyams_sequence.interfaces import ISequentialIdInfo
 
 __docformat__ = 'restructuredtext'
 
@@ -21,6 +20,7 @@
 from hypatia.interfaces import ICatalog
 from pyams_content.shared.view.interfaces import IWfView, IViewSettings, IViewInternalReferencesSettings, \
     IViewQueryParamsExtension, IViewQueryFilterExtension, VIEW_REFERENCES_SETTINGS_KEY, ALWAYS_REFERENCE_MODE
+from pyams_sequence.interfaces import ISequentialIdInfo
 
 # import packages
 from hypatia.catalog import CatalogQuery
@@ -62,13 +62,15 @@
     weight = 50
 
     def get_params(self, context):
-        catalog = get_utility(ICatalog)
         settings = IViewInternalReferencesSettings(self.context)
         params = None
         # check themes
         if settings.exclude_context:
-            oid = ISequentialIdInfo(context).hex_oid
-            params = and_(params, NotEq(catalog['oid'], oid))
+            sequence = ISequentialIdInfo(context, None)
+            if sequence is not None:
+                oid = sequence.hex_oid
+                catalog = get_utility(ICatalog)
+                params = and_(params, NotEq(catalog['oid'], oid))
         return params
 
 
--- a/src/pyams_content/shared/view/theme.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/view/theme.py	Tue Jul 17 15:09:38 2018 +0200
@@ -9,6 +9,7 @@
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE.
 #
+from pyams_content.component.theme import ICollectionsInfo
 
 __docformat__ = 'restructuredtext'
 
@@ -17,9 +18,10 @@
 
 # import interfaces
 from hypatia.interfaces import ICatalog
-from pyams_content.component.theme.interfaces import IThemesInfo
+from pyams_content.component.theme.interfaces import ITagsInfo, IThemesInfo
 from pyams_content.shared.view.interfaces import IWfView, IViewSettings, IViewThemesSettings, \
-    IViewQueryParamsExtension, VIEW_THEMES_SETTINGS_KEY
+    IViewQueryParamsExtension, VIEW_THEMES_SETTINGS_KEY, IViewTagsSettings, VIEW_TAGS_SETTINGS_KEY, \
+    IViewCollectionsSettings, VIEW_COLLECTIONS_SETTINGS_KEY
 from zope.intid.interfaces import IIntIds
 
 # import packages
@@ -33,6 +35,65 @@
 from zope.schema.fieldproperty import FieldProperty
 
 
+#
+# Tags management
+#
+
+@implementer(IViewTagsSettings)
+class ViewTagsSettings(Persistent, Contained):
+    """View tags settings"""
+
+    select_context_tags = FieldProperty(IViewTagsSettings['select_context_tags'])
+    tags = FieldProperty(IViewTagsSettings['tags'])
+
+    @property
+    def is_using_context(self):
+        return self.select_context_tags
+
+    def get_tags(self, context):
+        tags = set()
+        if self.select_context_tags:
+            tags_info = ITagsInfo(context, None)
+            if tags_info is not None:
+                tags |= set(tags_info.tags or ())
+        if self.tags:
+            tags |= set(self.tags)
+        return tags
+
+    def get_tags_index(self, context):
+        intids = get_utility(IIntIds)
+        return [intids.register(term) for term in self.get_tags(context)]
+
+
+@adapter_config(context=IWfView, provides=IViewTagsSettings)
+@adapter_config(name='tags', context=IWfView, provides=IViewSettings)
+def view_tags_settings_factory(view):
+    """View tags settings factory"""
+    return get_annotation_adapter(view, VIEW_TAGS_SETTINGS_KEY, ViewTagsSettings,
+                                  name='++view:tags++')
+
+
+@adapter_config(name='tags', context=IWfView, provides=IViewQueryParamsExtension)
+class ViewTagsQueryParamsExtension(ContextAdapter):
+    """View tags query params extension"""
+
+    weight = 50
+
+    def get_params(self, context):
+        catalog = get_utility(ICatalog)
+        settings = IViewTagsSettings(self.context)
+        params = None
+        # check tags
+        tags = settings.get_tags_index(context)
+        if tags:
+            params = and_(params, Any(catalog['tags'], tags))
+        return params
+
+
+#
+# Themes management
+#
+
 @implementer(IViewThemesSettings)
 class ViewThemesSettings(Persistent, Contained):
     """View themes settings"""
@@ -71,7 +132,7 @@
 class ViewThemesQueryParamsExtension(ContextAdapter):
     """View themes query params extension"""
 
-    weight = 50
+    weight = 52
 
     def get_params(self, context):
         catalog = get_utility(ICatalog)
@@ -82,3 +143,58 @@
         if themes:
             params = and_(params, Any(catalog['themes'], themes))
         return params
+
+
+#
+# Collections management
+#
+
+@implementer(IViewCollectionsSettings)
+class ViewCollectionsSettings(Persistent, Contained):
+    """View collections settings"""
+
+    select_context_collections = FieldProperty(IViewCollectionsSettings['select_context_collections'])
+    collections = FieldProperty(IViewCollectionsSettings['collections'])
+
+    @property
+    def is_using_context(self):
+        return self.select_context_collections
+
+    def get_collections(self, context):
+        collections = set()
+        if self.select_context_collections:
+            collections_info = ICollectionsInfo(context, None)
+            if collections_info is not None:
+                collections |= set(collections_info.collections or ())
+        if self.collections:
+            collections |= set(self.collections)
+        return collections
+
+    def get_collections_index(self, context):
+        intids = get_utility(IIntIds)
+        return [intids.register(term) for term in self.get_collections(context)]
+
+
+@adapter_config(context=IWfView, provides=IViewCollectionsSettings)
+@adapter_config(name='collections', context=IWfView, provides=IViewSettings)
+def view_collections_settings_factory(view):
+    """View collections settings factory"""
+    return get_annotation_adapter(view, VIEW_COLLECTIONS_SETTINGS_KEY, ViewCollectionsSettings,
+                                  name='++view:collections++')
+
+
+@adapter_config(name='collections', context=IWfView, provides=IViewQueryParamsExtension)
+class ViewCollectionsQueryParamsExtension(ContextAdapter):
+    """View collections query params extension"""
+
+    weight = 54
+
+    def get_params(self, context):
+        catalog = get_utility(ICatalog)
+        settings = IViewCollectionsSettings(self.context)
+        params = None
+        # check collections
+        collections = settings.get_collections_index(context)
+        if collections:
+            params = and_(params, Any(catalog['collections'], collections))
+        return params
--- a/src/pyams_content/shared/view/zmi/theme.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/shared/view/zmi/theme.py	Tue Jul 17 15:09:38 2018 +0200
@@ -17,7 +17,8 @@
 
 # import interfaces
 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
-from pyams_content.shared.view.interfaces import IWfView, IViewThemesSettings, IViewsManager
+from pyams_content.shared.view.interfaces import IWfView, IViewThemesSettings, IViewsManager, IViewTagsSettings, \
+    IViewCollectionsSettings
 from pyams_form.interfaces.form import IWidgetForm, IUncheckedEditFormButtons
 from pyams_skin.interfaces import IInnerPage
 from pyams_skin.layer import IPyAMSLayer
@@ -28,20 +29,73 @@
 from z3c.form.interfaces import INPUT_MODE
 
 # import packages
+from pyams_content.component.theme import ITagsManager
 from pyams_form.form import ajax_config
 from pyams_pagelet.pagelet import pagelet_config
 from pyams_skin.viewlet.menu import MenuItem
+from pyams_thesaurus.zmi.widget import ThesaurusTermsTreeFieldWidget
 from pyams_utils.registry import get_utility
 from pyams_viewlet.viewlet import viewlet_config
 from pyams_zmi.form import AdminEditForm
 from z3c.form import field, button
+from z3c.form.browser.checkbox import SingleCheckBoxFieldWidget
 from zope.interface import implementer, Interface
 
 from pyams_content import _
 
 
+#
+# Tags management
+#
+
+@viewlet_config(name='tags.menu', context=IWfView, layer=IAdminLayer,
+                manager=IPropertiesMenu, permission=VIEW_SYSTEM_PERMISSION, weight=350)
+class ViewTagsMenu(MenuItem):
+    """View tags menu"""
+
+    label = _("Tags...")
+    icon_class = 'fa-tag'
+    url = '#tags.html'
+
+
+@pagelet_config(name='tags.html', context=IWfView, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
+@ajax_config(name='tags.json', context=IWfView, layer=IPyAMSLayer, permission=MANAGE_CONTENT_PERMISSION)
+@implementer(IWidgetForm, IInnerPage)
+class ViewTagsEditForm(AdminEditForm):
+    """View tags settings edit form"""
+
+    legend = _("View tags settings")
+    label_css_class = 'control-label col-md-1'
+    input_css_class = 'col-md-11'
+
+    fields = field.Fields(IViewTagsSettings)
+    fields['select_context_tags'].widgetFactory = SingleCheckBoxFieldWidget
+    fields['tags'].widgetFactory = ThesaurusTermsTreeFieldWidget
+
+    @property
+    def buttons(self):
+        if self.mode == INPUT_MODE:
+            return button.Buttons(IUncheckedEditFormButtons)
+        else:
+            return button.Buttons(Interface)
+
+    def updateWidgets(self, prefix=None):
+        super(ViewTagsEditForm, self).updateWidgets(prefix)
+        if 'tags' in self.widgets:
+            manager = ITagsManager(self.request.root)
+            widget = self.widgets['tags']
+            widget.label_css_class = 'control-label col-md-2'
+            widget.input_css_class = 'col-md-12'
+            widget.thesaurus_name = manager.thesaurus_name
+            widget.extract_name = manager.extract_name
+
+
+#
+# Themes management
+#
+
 @viewlet_config(name='themes.menu', context=IWfView, layer=IAdminLayer,
-                manager=IPropertiesMenu, permission=VIEW_SYSTEM_PERMISSION, weight=350)
+                manager=IPropertiesMenu, permission=VIEW_SYSTEM_PERMISSION, weight=352)
 class ViewThemesMenu(MenuItem):
     """View themes menu"""
 
@@ -57,8 +111,12 @@
     """View themes settings edit form"""
 
     legend = _("View themes settings")
+    label_css_class = 'control-label col-md-1'
+    input_css_class = 'col-md-11'
 
     fields = field.Fields(IViewThemesSettings)
+    fields['select_context_themes'].widgetFactory = SingleCheckBoxFieldWidget
+    fields['themes'].widgetFactory = ThesaurusTermsTreeFieldWidget
 
     @property
     def buttons(self):
@@ -70,5 +128,55 @@
     def updateWidgets(self, prefix=None):
         super(ViewThemesEditForm, self).updateWidgets(prefix)
         if 'themes' in self.widgets:
-            manager = get_utility(IViewsManager)
-            self.widgets['themes'].thesaurus_name = IThesaurusContextManager(manager).thesaurus_name
+            manager = IThesaurusContextManager(get_utility(IViewsManager))
+            widget = self.widgets['themes']
+            widget.label_css_class = 'control-label col-md-2'
+            widget.input_css_class = 'col-md-12'
+            widget.thesaurus_name = manager.thesaurus_name
+            widget.extract_name = manager.extract_name
+
+
+#
+# Collections management
+#
+
+@viewlet_config(name='collections.menu', context=IWfView, layer=IAdminLayer,
+                manager=IPropertiesMenu, permission=VIEW_SYSTEM_PERMISSION, weight=354)
+class ViewCollectionsMenu(MenuItem):
+    """View collections menu"""
+
+    label = _("Collections...")
+    icon_class = 'fa-book'
+    url = '#collections.html'
+
+
+@pagelet_config(name='collections.html', context=IWfView, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
+@ajax_config(name='collections.json', context=IWfView, layer=IPyAMSLayer, permission=MANAGE_CONTENT_PERMISSION)
+@implementer(IWidgetForm, IInnerPage)
+class ViewCollectionsEditForm(AdminEditForm):
+    """View collections settings edit form"""
+
+    legend = _("View collections settings")
+    label_css_class = 'control-label col-md-1'
+    input_css_class = 'col-md-11'
+
+    fields = field.Fields(IViewCollectionsSettings)
+    fields['select_context_collections'].widgetFactory = SingleCheckBoxFieldWidget
+    fields['collections'].widgetFactory = ThesaurusTermsTreeFieldWidget
+
+    @property
+    def buttons(self):
+        if self.mode == INPUT_MODE:
+            return button.Buttons(IUncheckedEditFormButtons)
+        else:
+            return button.Buttons(Interface)
+
+    def updateWidgets(self, prefix=None):
+        super(ViewCollectionsEditForm, self).updateWidgets(prefix)
+        if 'collections' in self.widgets:
+            manager = IThesaurusContextManager(get_utility(IViewsManager))
+            widget = self.widgets['collections']
+            widget.label_css_class = 'control-label col-md-2'
+            widget.input_css_class = 'col-md-12'
+            widget.thesaurus_name = manager.thesaurus_name
+            widget.extract_name = manager.extract_name
--- a/src/pyams_content/site.py	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/site.py	Tue Jul 17 15:09:38 2018 +0200
@@ -19,6 +19,7 @@
 # import interfaces
 from hypatia.interfaces import ICatalog
 from pyams_content.shared.common.interfaces import IWfSharedContent
+from pyams_content.shared.site.interfaces import IContentLink
 from zope.intid.interfaces import IIntIds
 
 # import packages
@@ -38,6 +39,9 @@
             for document in find_objects_providing(application, IWfSharedContent):
                 print("Indexing: {0!r}".format(document))
                 catalog.reindex_doc(intids.register(document), document)
+            for document in find_objects_providing(application, IContentLink):
+                print("Indexing: {0!r}".format(document))
+                catalog.reindex_doc(intids.register(document), document)
         finally:
             set_local_registry(None)
         transaction.commit()
--- a/src/pyams_content/skin/resources/js/pyams_content.js	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/skin/resources/js/pyams_content.js	Tue Jul 17 15:09:38 2018 +0200
@@ -350,6 +350,24 @@
 					MyAMS.initContent(marker);
 				}
 				MyAMS.helpers.sort(toolbar, 'weight');
+			},
+
+			switchAnchor: function() {
+				return function () {
+					var source = $(this);
+					var element = source.parents('tr').first();
+					var container = element.parents('table');
+					MyAMS.ajax.post(container.data('ams-location') + '/' +
+									container.data('ams-anchor-switcher'),
+						{object_name: element.data('ams-element-name')},
+						function (result, status) {
+							if (result.anchor) {
+								$('i', source).attr('class', 'fa fa-fw fa-anchor');
+							} else {
+								$('i', source).attr('class', 'fa fa-fw fa-anchor txt-color-silver opacity-50');
+							}
+						});
+				}
 			}
 		},
 
@@ -384,9 +402,9 @@
 		themes: {
 
 			initExtracts: function(element) {
-				var thesaurus = $('select[name="form.widgets.thesaurus_name:list"]', element);
+				var thesaurus = $('select[name="manager_themes.widgets.thesaurus_name:list"]', element);
 				var thesaurus_name = thesaurus.val();
-				var extract = $('select[name="form.widgets.extract_name:list"]', element);
+				var extract = $('select[name="manager_themes.widgets.extract_name:list"]', element);
 				var extract_name = extract.val();
 				if (thesaurus_name) {
 					MyAMS.jsonrpc.post('getExtracts',
@@ -402,24 +420,27 @@
 											});
 									   });
 				}
-				extract.attr('data-ams-events-handlers', '{"select2-open": "PyAMS_content.themes.getExtracts"}');
 			},
 
 			getExtracts: function(event) {
 				var select = $(event.currentTarget);
 				var form = select.parents('form');
-				var thesaurus_name = $('select[name="form.widgets.thesaurus_name:list"]', form).val();
-				if (thesaurus_name) {
+				var thesaurus_name = $('select[name="manager_themes.widgets.thesaurus_name:list"]', form).val();
+				var extract = $('select[name="manager_themes.widgets.extract_name:list"]', form);
+				var plugin = extract.data('select2');
+				if (thesaurus_name && (thesaurus_name !== '--NOVALUE--')) {
 					MyAMS.jsonrpc.post('getExtracts',
 									   {thesaurus_name: thesaurus_name},
 									   {url: '/api/thesaurus/json'},
 									   function(data) {
-											var extract = $('select[name="form.widgets.extract_name:list"]', form);
-											var plugin = extract.data('select2');
 											plugin.results.empty();
 											plugin.opts.populateResults.call(plugin, plugin.results, data.result,
 																			 {term: ''});
 									   });
+				} else {
+					extract.select2('data', null);
+					plugin.results.empty();
+					plugin.opts.populateResults.call(plugin, plugin.results, [], {term: ''});
 				}
 			}
 		},
--- a/src/pyams_content/skin/resources/js/pyams_content.min.js	Mon Jun 25 17:26:50 2018 +0200
+++ b/src/pyams_content/skin/resources/js/pyams_content.min.js	Tue Jul 17 15:09:38 2018 +0200
@@ -1,1 +1,1 @@
-!function(o,t){"use strict";var l=t.MyAMS,a={widget:{treeview:{selectFolder:function(t,e){o(t.target).siblings('input[type="hidden"]').val(e.id)},unselectFolder:function(t,e){o(t.target).siblings('input[type="hidden"]').val(null)}}},TinyMCE:{initEditor:function(t){return tinyMCE.addI18n("fr",{"Link list":"Liste de liens","Toggle h3 header":"En-tête H3","Toggle h4 header":"En-tête H4","Insert internal link":"Insérer un lien interne","Link title":"Texte à afficher","Internal number":"N° interne"}),tinymce.PluginManager.add("internal_links",function(e,t){e.addButton("internal_links",{icon:"cloud-check",tooltip:"Insert internal link",image:"/--static--/pyams_content/img/internal-link.png",onclick:function(){e.windowManager.open({title:"Insert internal link",body:[{type:"textbox",name:"oid",label:"Internal number"},{type:"textbox",name:"title",label:"Link title",value:e.selection.getContent()}],onsubmit:function(t){e.insertContent('<a href="oid://'+t.data.oid+'">'+t.data.title+"</a>")}})}})}),tinyMCE.PluginManager.add("headers",function(i,t){["h3","h4"].forEach(function(a){i.addButton("header-"+a,{tooltip:"Toggle "+a+" header",text:a.toUpperCase(),onClick:function(){i.execCommand("mceToggleFormat",!1,a)},onPostRender:function(){var e=this,t=function(){i.formatter.formatChanged(a,function(t){e.active(t)})};i.formatter?t():i.on("init",t)}})})}),t.image_list=a.TinyMCE.getImagesList,t.link_list=a.TinyMCE.getLinksList,t.style_formats=[{title:"Inline",items:[{title:"Bold",icon:"bold",format:"bold"},{title:"Italic",icon:"italic",format:"italic"},{title:"Underline",icon:"underline",format:"underline"},{title:"Strikethrough",icon:"strikethrough",format:"strikethrough"},{title:"Superscript",icon:"superscript",format:"superscript"},{title:"Subscript",icon:"subscript",format:"subscript"},{title:"Code",icon:"code",format:"code"}]},{title:"Blocks",items:[{title:"Paragraph",format:"p"},{title:"Blockquote",format:"blockquote"},{title:"Div",format:"div"},{title:"Pre",format:"pre"}]},{title:"Alignment",items:[{title:"Left",icon:"alignleft",format:"alignleft"},{title:"Center",icon:"aligncenter",format:"aligncenter"},{title:"Right",icon:"alignright",format:"alignright"},{title:"Justify",icon:"alignjustify",format:"alignjustify"}]}],t.plugins+=" internal_links headers",t.toolbar1&&(t.toolbar1="undo redo | header-h3 header-h4 styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent"),t.toolbar2&&(t.toolbar2="forecolor backcolor | charmap internal_links link | fullscreen preview print | code"),t},getImagesList:function(t){var e=o(document.activeElement).parents("form");if(e.exists()){var a=e.attr("data-ams-form-handler")||e.attr("action"),i=a.substr(0,a.lastIndexOf("/")+1);return l.ajax.post(i+"get-images-list.json",{},t)}},getLinksList:function(t){var e=o(document.activeElement).parents("form");if(e.exists()){var a=e.attr("data-ams-form-handler")||e.attr("action"),i=a.substr(0,a.lastIndexOf("/")+1);return l.ajax.post(i+"get-links-list.json",{},t)}}},galleries:{updateMediaTitle:function(t){o('img[id="'+t.media_id+'"]').attr("original-title",t.title)},switchMediaVisibility:function(t){return function(){var a=o(this),t=a.parents(".media"),e=t.parents(".gallery");l.ajax.post(e.data("ams-location")+"/set-media-visibility.json",{object_name:t.data("ams-element-name")},function(t,e){t.visible?(o("i",a).attr("class","fa fa-fw fa-eye"),a.parents(".btn-group").siblings("a.fancyimg").removeClass("not-visible")):(o("i",a).attr("class","fa fa-fw fa-eye-slash text-danger"),a.parents(".btn-group").siblings("a.fancyimg").addClass("not-visible"))})}},setOrder:function(t,e){if(!e||!e.item.hasClass("already-dropped")){var a=e.item.parents(".gallery"),i=o(".media",a).listattr("data-ams-element-name");l.ajax.post(a.data("ams-location")+"/set-medias-order.json",{medias:JSON.stringify(i)})}},removeMedia:function(t){return function(){var n=o(this);l.skin.bigBox({title:l.i18n.WARNING,content:'<i class="text-danger fa fa-2x fa-bell shake animated"></i>&nbsp; '+l.i18n.DELETE_WARNING,buttons:l.i18n.BTN_OK_CANCEL},function(t){if(t===l.i18n.BTN_OK){var e=n.parents(".gallery").data("ams-location"),a=n.parents(".media"),i=a.data("ams-element-name");l.ajax.post(e+"/delete-element.json",{object_name:i},function(t,e){a.remove()})}})}},afterFancyboxLoad:function(t,e){t.element.hasClass("not-visible")&&t.inner.prepend('<div class="hidden-mask"></div>')}},paragraphs:{preReload:function(){a.paragraphs.switched=o("i.switch.fa-minus-square-o","#paragraphs_list").parents("tr").listattr("id")},postReload:function(){o(a.paragraphs.switched).each(function(){o("i.switch.fa-plus-square-o",'[id="'+this+'"]').parents("div").first().click()}),delete a.paragraphs.switched},refreshParagraph:function(t){var e=o('tr[id="'+t.object_id+'"]');o("span.title",e).html(t.title||" - - - - - - - -")},switchEditor:function(t){var e=o(this),a=o("i.switch",e),i=e.parents("td"),n=o(".editor",i),s=e.parents("tr");if(a.hasClass("fa-plus-square-o")){var r=s.parents("table");n.html('<h1 class="loading"><i class="fa fa-2x fa-gear fa-spin"></i></h1>'),l.ajax.post(r.data("ams-location")+"/get-paragraph-editor.json",{object_name:s.data("ams-element-name")},function(t){n.html(t),t&&(l.initContent(n),a.removeClass("fa-plus-square-o").addClass("fa-minus-square-o"),s.data("ams-disabled-handlers",!0),l.skin.scrollTo(n,{offset:n.height()-s.height()}))})}else l.skin.cleanContainer(n),n.empty(),a.removeClass("fa-minus-square-o").addClass("fa-plus-square-o"),s.removeData("ams-disabled-handlers")},switchLastEditor:function(t){var e=o('table[id="'+t+'"]'),a=o("tr:last",e);o('[data-ams-click-handler="PyAMS_content.paragraphs.switchEditor"]',a).click()},switchAllEditors:function(t){var e=o(this),n=o("i",e),s=e.parents("table");n.hasClass("fa-plus-square-o")?(n.removeClass("fa-plus-square-o").addClass("fa-cog fa-spin"),l.ajax.post(s.data("ams-location")+"/get-paragraphs-editors.json",{},function(t){for(var e in t)if(t.hasOwnProperty(e)){var a=o('tr[data-ams-element-name="'+e+'"]',s),i=o(".editor",a);i.is(":empty")&&i.html(t[e]),o(".fa-plus-square-o",a).removeClass("fa-plus-square-o").addClass("fa-minus-square-o"),a.data("ams-disabled-handlers",!0)}o("i.fa-plus-square-o",o("tbody",s)).exists()||n.removeClass("fa-cog fa-spin").addClass("fa-minus-square-o"),l.initContent(s)})):(o(".editor",s).each(function(){l.skin.cleanContainer(o(this)),o(this).empty()}),o(".fa-minus-square-o",s).removeClass("fa-minus-square-o").addClass("fa-plus-square-o"),o("tr",s).removeData("ams-disabled-handlers"))},updateToolbar:function(t){var e=o('tr[id="'+t.object_id+'"]'),a=o(".title-toolbar",e);a.replaceWith(t.toolbar_tag),a=o(".title-toolbar",e),l.initContent(a)},updateMarkers:function(t){var e=o('tr[id="'+t.object_id+'"]'),a=o(".title-toolbar",e),i=o("DIV.action."+t.marker_type,a);i.exists()?i.replaceWith(t.marker_tag):o(t.marker_tag).appendTo(a),t.marker_tag&&(i=o("DIV.action."+t.marker_type,a),l.initContent(i)),l.helpers.sort(a,"weight")}},pictograms:{initManagerSelection:function(){var t=o(this),e=o('input[type="hidden"]',o(".selected-pictograms",t)).listattr("value");return{selected:JSON.stringify(e)}},switchPictogram:function(){var t=o(this),e=t.parents(".pictograms"),a=e.parents(".pictograms-manager");e.hasClass("available-pictograms")?o(".selected-pictograms",a).append(t):o(".available-pictograms",a).append(t)}},themes:{initExtracts:function(t){var e=o('select[name="form.widgets.thesaurus_name:list"]',t).val(),a=o('select[name="form.widgets.extract_name:list"]',t),i=a.val();e&&l.jsonrpc.post("getExtracts",{thesaurus_name:e},{url:"/api/thesaurus/json"},function(t){a.empty(),o(t.result).each(function(){o("<option></option>").attr("value",this.id).attr("selected",this.id===i).text(this.text).appendTo(a)})}),a.attr("data-ams-events-handlers",'{"select2-open": "PyAMS_content.themes.getExtracts"}')},getExtracts:function(t){var a=o(t.currentTarget).parents("form"),e=o('select[name="form.widgets.thesaurus_name:list"]',a).val();e&&l.jsonrpc.post("getExtracts",{thesaurus_name:e},{url:"/api/thesaurus/json"},function(t){var e=o('select[name="form.widgets.extract_name:list"]',a).data("select2");e.results.empty(),e.opts.populateResults.call(e,e.results,t.result,{term:""})})}},fields:{refreshField:function(t){var e=o('table[id="form_fields_list"]'),a=o('tr[data-ams-element-name="'+t.object_name+'"]',e);o("td:nth-child(4)",a).html(t.title)}},imgmap:{init:function(){var t=o(this);l.ajax.check(o.fn.canvasAreaDraw,"/--static--/pyams_content/js/jquery-canvasAreaDraw"+l.devext+".js",function(){t.canvasAreaDraw({imageUrl:t.data("ams-image-url")})})},initPreview:function(){var t=o(this);l.ajax.check(o.fn.mapster,"/--static--/pyams_content/js/jquery-imagemapster-1.2.10"+l.devext+".js",function(){t.mapster({fillColor:"ff0000",fillOpacity:.35,selected:!0,highlight:!0,staticState:!0})})}},site:{switchVisibility:function(){return function(){var i=o(this),t=i.parents("tr").first();l.ajax.post(t.data("ams-location")+"/switch-content-visibility.json",{object_name:t.data("ams-element-name")},function(t,e){var a="fa-eye";t.visible||(a+="-slash"),t.published||(a+=" text-danger"),o("i",i).attr("class","fa fa-fw "+a)})}}},review:{timer:null,timer_duration:{general:3e4,chat:5e3},initComments:function(t){var e=o(".chat-body",t);e.animate({scrollTop:e[0].scrollHeight},1e3),clearInterval(a.review.timer),a.review.timer=setInterval(a.review.updateComments,a.review.timer_duration.chat),l.skin.registerCleanCallback(a.review.cleanCommentsCallback)},cleanCommentsCallback:function(){clearInterval(a.review.timer),a.review.timer=setInterval(a.review.updateComments,a.review.timer_duration.general)},updateComments:function(){var e,a=o(".badge",'nav a[href="#review-comments.html"]'),i=o(".chat-body",".widget-body");e=i.exists()?o(".message",i).length:parseInt(a.text()),l.ajax.post("get-last-review-comments.json",{count:e},function(t){i.exists()&&a.removeClass("bg-color-danger").addClass("bg-color-info"),e!==t.count&&(a.text(t.count).removeClass("hidden"),i.exists()&&(o(".messages",i).append(t.content),i.animate({scrollTop:i[0].scrollHeight},1e3)),i.exists()||a.removeClass("bg-color-info").addClass("bg-color-danger").animate({padding:"3px 12px 2px","margin-right":"9px"},"slow",function(){o(this).animate({padding:"3px 6px 2px","margin-right":"15px"},"slow")}))})},initCommentData:function(t){var e=o(".chat-body",".widget-body");return{count:o(".message",e).length}},addCommentAction:function(){return function(){o('textarea[name="comment"]').focus()}},addCommentCallback:function(t){var e=o(this),a=e.parents(".widget-body");o(".messages",a).append(t.content),o('textarea[name="comment"]',e).val("");var i=o(".chat-body",a);i.animate({scrollTop:i[0].scrollHeight},1e3),o(".badge",'nav a[href="#review-comments.html"]').text(t.count).removeClass("hidden")}},header:{submitEditForm:function(){var t=o(this).parents("form").first();l.form.submit(t,{form_data:{autosubmit:!0}})}},footer:{submitEditForm:function(){var t=o(this).parents("form").first();l.form.submit(t,{form_data:{autosubmit:!0}})}},profile:{switchFavorite:function(){var a=o(this),t=a.data("sequence-oid");l.ajax.post("switch-user-favorite.json",{oid:t},function(t,e){t.favorite?a.removeClass("fa-star-o").addClass("fa-star"):a.removeClass("fa-star").addClass("fa-star-o")})}}};o(".badge",'nav a[href="#review-comments.html"]').exists()&&(a.review.timer=setInterval(a.review.updateComments,a.review.timer_duration.general)),t.PyAMS_content=a}(jQuery,this);
+!function(t,e){"use strict";var a=e.MyAMS,i={widget:{treeview:{selectFolder:function(e,a){t(e.target).siblings('input[type="hidden"]').val(a.id)},unselectFolder:function(e,a){t(e.target).siblings('input[type="hidden"]').val(null)}}},TinyMCE:{initEditor:function(t){return tinyMCE.addI18n("fr",{"Link list":"Liste de liens","Toggle h3 header":"En-tête H3","Toggle h4 header":"En-tête H4","Insert internal link":"Insérer un lien interne","Link title":"Texte à afficher","Internal number":"N° interne"}),tinymce.PluginManager.add("internal_links",function(t,e){t.addButton("internal_links",{icon:"cloud-check",tooltip:"Insert internal link",image:"/--static--/pyams_content/img/internal-link.png",onclick:function(){t.windowManager.open({title:"Insert internal link",body:[{type:"textbox",name:"oid",label:"Internal number"},{type:"textbox",name:"title",label:"Link title",value:t.selection.getContent()}],onsubmit:function(e){t.insertContent('<a href="oid://'+e.data.oid+'">'+e.data.title+"</a>")}})}})}),tinyMCE.PluginManager.add("headers",function(t,e){["h3","h4"].forEach(function(e){t.addButton("header-"+e,{tooltip:"Toggle "+e+" header",text:e.toUpperCase(),onClick:function(){t.execCommand("mceToggleFormat",!1,e)},onPostRender:function(){var a=this,i=function(){t.formatter.formatChanged(e,function(t){a.active(t)})};t.formatter?i():t.on("init",i)}})})}),t.image_list=i.TinyMCE.getImagesList,t.link_list=i.TinyMCE.getLinksList,t.style_formats=[{title:"Inline",items:[{title:"Bold",icon:"bold",format:"bold"},{title:"Italic",icon:"italic",format:"italic"},{title:"Underline",icon:"underline",format:"underline"},{title:"Strikethrough",icon:"strikethrough",format:"strikethrough"},{title:"Superscript",icon:"superscript",format:"superscript"},{title:"Subscript",icon:"subscript",format:"subscript"},{title:"Code",icon:"code",format:"code"}]},{title:"Blocks",items:[{title:"Paragraph",format:"p"},{title:"Blockquote",format:"blockquote"},{title:"Div",format:"div"},{title:"Pre",format:"pre"}]},{title:"Alignment",items:[{title:"Left",icon:"alignleft",format:"alignleft"},{title:"Center",icon:"aligncenter",format:"aligncenter"},{title:"Right",icon:"alignright",format:"alignright"},{title:"Justify",icon:"alignjustify",format:"alignjustify"}]}],t.plugins+=" internal_links headers",t.toolbar1&&(t.toolbar1="undo redo | header-h3 header-h4 styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent"),t.toolbar2&&(t.toolbar2="forecolor backcolor | charmap internal_links link | fullscreen preview print | code"),t},getImagesList:function(e){var i=t(document.activeElement).parents("form");if(i.exists()){var n=i.attr("data-ams-form-handler")||i.attr("action"),s=n.substr(0,n.lastIndexOf("/")+1);return a.ajax.post(s+"get-images-list.json",{},e)}},getLinksList:function(e){var i=t(document.activeElement).parents("form");if(i.exists()){var n=i.attr("data-ams-form-handler")||i.attr("action"),s=n.substr(0,n.lastIndexOf("/")+1);return a.ajax.post(s+"get-links-list.json",{},e)}}},galleries:{updateMediaTitle:function(e){t('img[id="'+e.media_id+'"]').attr("original-title",e.title)},switchMediaVisibility:function(e){return function(){var e=t(this),i=e.parents(".media"),n=i.parents(".gallery");a.ajax.post(n.data("ams-location")+"/set-media-visibility.json",{object_name:i.data("ams-element-name")},function(a,i){a.visible?(t("i",e).attr("class","fa fa-fw fa-eye"),e.parents(".btn-group").siblings("a.fancyimg").removeClass("not-visible")):(t("i",e).attr("class","fa fa-fw fa-eye-slash text-danger"),e.parents(".btn-group").siblings("a.fancyimg").addClass("not-visible"))})}},setOrder:function(e,i){if(!i||!i.item.hasClass("already-dropped")){var n=i.item.parents(".gallery"),s=t(".media",n).listattr("data-ams-element-name");a.ajax.post(n.data("ams-location")+"/set-medias-order.json",{medias:JSON.stringify(s)})}},removeMedia:function(e){return function(){var e=t(this);a.skin.bigBox({title:a.i18n.WARNING,content:'<i class="text-danger fa fa-2x fa-bell shake animated"></i>&nbsp; '+a.i18n.DELETE_WARNING,buttons:a.i18n.BTN_OK_CANCEL},function(t){if(t===a.i18n.BTN_OK){var i=e.parents(".gallery").data("ams-location"),n=e.parents(".media"),s=n.data("ams-element-name");a.ajax.post(i+"/delete-element.json",{object_name:s},function(t,e){n.remove()})}})}},afterFancyboxLoad:function(t,e){t.element.hasClass("not-visible")&&t.inner.prepend('<div class="hidden-mask"></div>')}},paragraphs:{preReload:function(){i.paragraphs.switched=t("i.switch.fa-minus-square-o","#paragraphs_list").parents("tr").listattr("id")},postReload:function(){t(i.paragraphs.switched).each(function(){t("i.switch.fa-plus-square-o",'[id="'+this+'"]').parents("div").first().click()}),delete i.paragraphs.switched},refreshParagraph:function(e){var a=t('tr[id="'+e.object_id+'"]');t("span.title",a).html(e.title||" - - - - - - - -")},switchEditor:function(e){var i=t(this),n=t("i.switch",i),s=i.parents("td"),r=t(".editor",s),o=i.parents("tr");if(n.hasClass("fa-plus-square-o")){var l=o.parents("table");r.html('<h1 class="loading"><i class="fa fa-2x fa-gear fa-spin"></i></h1>'),a.ajax.post(l.data("ams-location")+"/get-paragraph-editor.json",{object_name:o.data("ams-element-name")},function(t){r.html(t),t&&(a.initContent(r),n.removeClass("fa-plus-square-o").addClass("fa-minus-square-o"),o.data("ams-disabled-handlers",!0),a.skin.scrollTo(r,{offset:r.height()-o.height()}))})}else a.skin.cleanContainer(r),r.empty(),n.removeClass("fa-minus-square-o").addClass("fa-plus-square-o"),o.removeData("ams-disabled-handlers")},switchLastEditor:function(e){var a=t('table[id="'+e+'"]'),i=t("tr:last",a);t('[data-ams-click-handler="PyAMS_content.paragraphs.switchEditor"]',i).click()},switchAllEditors:function(e){var i=t(this),n=t("i",i),s=i.parents("table");n.hasClass("fa-plus-square-o")?(n.removeClass("fa-plus-square-o").addClass("fa-cog fa-spin"),a.ajax.post(s.data("ams-location")+"/get-paragraphs-editors.json",{},function(e){for(var i in e)if(e.hasOwnProperty(i)){var r=t('tr[data-ams-element-name="'+i+'"]',s),o=t(".editor",r);o.is(":empty")&&o.html(e[i]),t(".fa-plus-square-o",r).removeClass("fa-plus-square-o").addClass("fa-minus-square-o"),r.data("ams-disabled-handlers",!0)}t("i.fa-plus-square-o",t("tbody",s)).exists()||n.removeClass("fa-cog fa-spin").addClass("fa-minus-square-o"),a.initContent(s)})):(t(".editor",s).each(function(){a.skin.cleanContainer(t(this)),t(this).empty()}),t(".fa-minus-square-o",s).removeClass("fa-minus-square-o").addClass("fa-plus-square-o"),t("tr",s).removeData("ams-disabled-handlers"))},updateToolbar:function(e){var i=t('tr[id="'+e.object_id+'"]'),n=t(".title-toolbar",i);n.replaceWith(e.toolbar_tag),n=t(".title-toolbar",i),a.initContent(n)},updateMarkers:function(e){var i=t('tr[id="'+e.object_id+'"]'),n=t(".title-toolbar",i),s=t("DIV.action."+e.marker_type,n);s.exists()?s.replaceWith(e.marker_tag):t(e.marker_tag).appendTo(n),e.marker_tag&&(s=t("DIV.action."+e.marker_type,n),a.initContent(s)),a.helpers.sort(n,"weight")},switchAnchor:function(){return function(){var e=t(this),i=e.parents("tr").first(),n=i.parents("table");a.ajax.post(n.data("ams-location")+"/"+n.data("ams-anchor-switcher"),{object_name:i.data("ams-element-name")},function(a,i){a.anchor?t("i",e).attr("class","fa fa-fw fa-anchor"):t("i",e).attr("class","fa fa-fw fa-anchor txt-color-silver opacity-50")})}}},pictograms:{initManagerSelection:function(){var e=t(this),a=t('input[type="hidden"]',t(".selected-pictograms",e)).listattr("value");return{selected:JSON.stringify(a)}},switchPictogram:function(){var e=t(this),a=e.parents(".pictograms"),i=a.parents(".pictograms-manager");a.hasClass("available-pictograms")?t(".selected-pictograms",i).append(e):t(".available-pictograms",i).append(e)}},themes:{initExtracts:function(e){var i=t('select[name="manager_themes.widgets.thesaurus_name:list"]',e).val(),n=t('select[name="manager_themes.widgets.extract_name:list"]',e),s=n.val();i&&a.jsonrpc.post("getExtracts",{thesaurus_name:i},{url:"/api/thesaurus/json"},function(e){n.empty(),t(e.result).each(function(){t("<option></option>").attr("value",this.id).attr("selected",this.id===s).text(this.text).appendTo(n)})})},getExtracts:function(e){var i=t(e.currentTarget).parents("form"),n=t('select[name="manager_themes.widgets.thesaurus_name:list"]',i).val(),s=t('select[name="manager_themes.widgets.extract_name:list"]',i),r=s.data("select2");n&&"--NOVALUE--"!==n?a.jsonrpc.post("getExtracts",{thesaurus_name:n},{url:"/api/thesaurus/json"},function(t){r.results.empty(),r.opts.populateResults.call(r,r.results,t.result,{term:""})}):(s.select2("data",null),r.results.empty(),r.opts.populateResults.call(r,r.results,[],{term:""}))}},fields:{refreshField:function(e){var a=t('table[id="form_fields_list"]'),i=t('tr[data-ams-element-name="'+e.object_name+'"]',a);t("td:nth-child(4)",i).html(e.title)}},imgmap:{init:function(){var e=t(this);a.ajax.check(t.fn.canvasAreaDraw,"/--static--/pyams_content/js/jquery-canvasAreaDraw"+a.devext+".js",function(){e.canvasAreaDraw({imageUrl:e.data("ams-image-url")})})},initPreview:function(){var e=t(this);a.ajax.check(t.fn.mapster,"/--static--/pyams_content/js/jquery-imagemapster-1.2.10"+a.devext+".js",function(){e.mapster({fillColor:"ff0000",fillOpacity:.35,selected:!0,highlight:!0,staticState:!0})})}},site:{switchVisibility:function(){return function(){var e=t(this),i=e.parents("tr").first();a.ajax.post(i.data("ams-location")+"/switch-content-visibility.json",{object_name:i.data("ams-element-name")},function(a,i){var n="fa-eye";a.visible||(n+="-slash"),a.published||(n+=" text-danger"),t("i",e).attr("class","fa fa-fw "+n)})}}},review:{timer:null,timer_duration:{general:3e4,chat:5e3},initComments:function(e){var n=t(".chat-body",e);n.animate({scrollTop:n[0].scrollHeight},1e3),clearInterval(i.review.timer),i.review.timer=setInterval(i.review.updateComments,i.review.timer_duration.chat),a.skin.registerCleanCallback(i.review.cleanCommentsCallback)},cleanCommentsCallback:function(){clearInterval(i.review.timer),i.review.timer=setInterval(i.review.updateComments,i.review.timer_duration.general)},updateComments:function(){var e,i=t(".badge",'nav a[href="#review-comments.html"]'),n=t(".chat-body",".widget-body");e=n.exists()?t(".message",n).length:parseInt(i.text()),a.ajax.post("get-last-review-comments.json",{count:e},function(a){n.exists()&&i.removeClass("bg-color-danger").addClass("bg-color-info"),e!==a.count&&(i.text(a.count).removeClass("hidden"),n.exists()&&(t(".messages",n).append(a.content),n.animate({scrollTop:n[0].scrollHeight},1e3)),n.exists()||i.removeClass("bg-color-info").addClass("bg-color-danger").animate({padding:"3px 12px 2px","margin-right":"9px"},"slow",function(){t(this).animate({padding:"3px 6px 2px","margin-right":"15px"},"slow")}))})},initCommentData:function(e){var a=t(".chat-body",".widget-body");return{count:t(".message",a).length}},addCommentAction:function(){return function(){t('textarea[name="comment"]').focus()}},addCommentCallback:function(e){var a=t(this),i=a.parents(".widget-body");t(".messages",i).append(e.content),t('textarea[name="comment"]',a).val("");var n=t(".chat-body",i);n.animate({scrollTop:n[0].scrollHeight},1e3),t(".badge",'nav a[href="#review-comments.html"]').text(e.count).removeClass("hidden")}},header:{submitEditForm:function(){var e=t(this).parents("form").first();a.form.submit(e,{form_data:{autosubmit:!0}})}},footer:{submitEditForm:function(){var e=t(this).parents("form").first();a.form.submit(e,{form_data:{autosubmit:!0}})}},profile:{switchFavorite:function(){var e=t(this),i=e.data("sequence-oid");a.ajax.post("switch-user-favorite.json",{oid:i},function(t,a){t.favorite?e.removeClass("fa-star-o").addClass("fa-star"):e.removeClass("fa-star").addClass("fa-star-o")})}}};t(".badge",'nav a[href="#review-comments.html"]').exists()&&(i.review.timer=setInterval(i.review.updateComments,i.review.timer_duration.general)),e.PyAMS_content=i}(jQuery,this);